001/* 002 * SPDX-License-Identifier: Apache-2.0 003 * 004 * Copyright 2025-2026 The Enola <https://enola.dev> Authors 005 * 006 * Licensed under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * https://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package dev.enola.ai.dotprompt; 019 020import static dev.enola.common.template.handlebars.HandlebarsMediaType.HANDLEBARS; 021 022import dev.enola.common.io.iri.URIs; 023import dev.enola.common.io.object.jackson.YamlObjectReaderWriter; 024import dev.enola.common.io.resource.MarkdownResource; 025import dev.enola.common.io.resource.ResourceProvider; 026import dev.enola.common.template.TemplateProvider; 027import dev.enola.common.template.handlebars.HandlebarsTemplateProvider; 028 029import java.io.IOException; 030import java.net.URI; 031 032public class DotPromptLoader { 033 034 private final ResourceProvider resourceProvider; 035 private final TemplateProvider templateProvider; 036 private final String defaultModel; 037 038 public DotPromptLoader(ResourceProvider resourceProvider, URI defaultModel) { 039 this.resourceProvider = resourceProvider; 040 this.templateProvider = new HandlebarsTemplateProvider(); 041 this.defaultModel = defaultModel.toString(); 042 } 043 044 public DotPrompt load(URI uri) throws IOException { 045 var resource = resourceProvider.getNonNull(uri); 046 var md = new MarkdownResource(resource, HANDLEBARS); 047 048 var reader = new YamlObjectReaderWriter(); 049 var dotPrompt = reader.read(md.frontMatter(), DotPrompt.class); 050 dotPrompt.id = uri; 051 052 var templateResource = md.markdown(); 053 dotPrompt.prompt = templateResource.charSource().read(); 054 dotPrompt.template = templateProvider.get(templateResource); 055 056 if (dotPrompt.name == null) 057 dotPrompt.name = URIs.getFilenameWithoutExtension(uri, ".prompt.md", ".prompt"); 058 // TODO Handle dotPrompt.variant ... 059 if (dotPrompt.model == null) dotPrompt.model = defaultModel; 060 061 // TODO Share code with AgentsLoader! 062 063 // TODO https://github.com/google/dotprompt/issues/307 Translate Picoschema to JSON Schema 064 065 // TODO Validate dotPrompt.input.schema & dotPrompt.input.schema with a JSON Schema 066 // Validator 067 068 // TODO Set I&O schemas into (to be added) properties on LoadedDotPrompt (but for what?) 069 070 // TODO Support https://google.github.io/dotprompt/reference/template/#dotprompt-helpers 071 072 return dotPrompt; 073 } 074}