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}