@genkit-ai/dotprompt
Version:
Genkit AI framework `.prompt` file format and management library.
117 lines • 3.96 kB
JavaScript
import {
__async
} from "./chunk-DFMI36TU.mjs";
import { GenkitError } from "@genkit-ai/core";
import { logger } from "@genkit-ai/core/logging";
import { lookupAction } from "@genkit-ai/core/registry";
import { existsSync, readdir, readFileSync } from "fs";
import { basename, join, resolve } from "path";
import { Dotprompt } from "./prompt.js";
import { definePartial } from "./template.js";
function registryDefinitionKey(name, variant, ns) {
return `${ns ? `${ns}/` : ""}${name}${variant ? `.${variant}` : ""}`;
}
function registryLookupKey(name, variant, ns) {
return `/prompt/${registryDefinitionKey(name, variant, ns)}`;
}
function lookupPrompt(name, variant, dir = "./prompts") {
return __async(this, null, function* () {
let registryPrompt = (yield lookupAction(registryLookupKey(name, variant))) || (yield lookupAction(registryLookupKey(name, variant, "dotprompt")));
if (registryPrompt) {
return Dotprompt.fromAction(registryPrompt);
} else {
return maybeLoadPrompt(dir, name, variant);
}
});
}
function maybeLoadPrompt(dir, name, variant) {
return __async(this, null, function* () {
const expectedFileName = `${name}${variant ? `.${variant}` : ""}.prompt`;
const promptFolder = resolve(dir);
const promptExists = existsSync(join(promptFolder, expectedFileName));
if (promptExists) {
return loadPrompt(promptFolder, expectedFileName);
} else {
throw new GenkitError({
source: "dotprompt",
status: "NOT_FOUND",
message: `Could not find '${expectedFileName}' in the prompts folder.`
});
}
});
}
function loadPromptFolder(dir = "./prompts") {
return __async(this, null, function* () {
const promptsPath = resolve(dir);
return new Promise((resolve2, reject) => {
if (existsSync(promptsPath)) {
readdir(
promptsPath,
{
withFileTypes: true,
recursive: true
},
(err, dirEnts) => {
if (err) {
reject(err);
} else {
dirEnts.forEach((dirEnt) => __async(this, null, function* () {
if (dirEnt.isFile() && dirEnt.name.endsWith(".prompt")) {
if (dirEnt.name.startsWith("_")) {
console.log(dirEnt.name);
const partialName = dirEnt.name.substring(
1,
dirEnt.name.length - 7
);
definePartial(
partialName,
readFileSync(join(dirEnt.path, dirEnt.name), {
encoding: "utf8"
})
);
logger.debug(
`Registered Dotprompt partial "${partialName}" from "${join(dirEnt.path, dirEnt.name)}"`
);
} else {
let prefix = "";
if (promptsPath !== dirEnt.path) {
prefix = dirEnt.path.replace(`${promptsPath}/`, "").replace(/\//g, "-");
}
loadPrompt(dirEnt.path, dirEnt.name, prefix);
}
}
}));
resolve2();
}
}
);
} else {
resolve2();
}
});
});
}
function loadPrompt(path, filename, prefix = "") {
let name = `${prefix ? `${prefix}-` : ""}${basename(filename, ".prompt")}`;
let variant = null;
if (name.includes(".")) {
const parts = name.split(".");
name = parts[0];
variant = parts[1];
}
const source = readFileSync(join(path, filename), "utf8");
const prompt = Dotprompt.parse(name, source);
if (variant) {
prompt.variant = variant;
}
prompt.define({ ns: `dotprompt` });
return prompt;
}
export {
loadPrompt,
loadPromptFolder,
lookupPrompt,
registryDefinitionKey,
registryLookupKey
};
//# sourceMappingURL=registry.mjs.map