Adds a `modelProvider` field to `promptVariants`, currently just set to "openai/ChatCompletion" for all variants for now. Adds a `modelProviders/` directory where we can define and store pluggable model providers. Currently just OpenAI. Not everything is pluggable yet -- notably the code to actually generate completions hasn't been migrated to this setup yet. Does a lot of work to get the types working. Prompts are now defined with a function `definePrompt(modelProvider, config)` instead of `prompt = config`. Added a script to migrate old prompt definitions. This is still partial work, but the diff is large enough that I want to get it in. I don't think anything is broken but I haven't tested thoroughly.
38 lines
1009 B
TypeScript
38 lines
1009 B
TypeScript
import crypto from "crypto";
|
|
import { type JsonValue } from "type-fest";
|
|
import { type ParsedConstructFn } from "./parseConstructFn";
|
|
|
|
function sortKeys(obj: JsonValue): JsonValue {
|
|
if (typeof obj !== "object" || obj === null) {
|
|
// Not an object or array, return as is
|
|
return obj;
|
|
}
|
|
|
|
if (Array.isArray(obj)) {
|
|
return obj.map(sortKeys);
|
|
}
|
|
|
|
// Get keys and sort them
|
|
const keys = Object.keys(obj).sort();
|
|
const sortedObj = {};
|
|
|
|
for (const key of keys) {
|
|
// @ts-expect-error not worth fixing types
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
sortedObj[key] = sortKeys(obj[key]);
|
|
}
|
|
|
|
return sortedObj;
|
|
}
|
|
|
|
export default function hashPrompt(prompt: ParsedConstructFn<any>): string {
|
|
// Sort object keys recursively
|
|
const sortedObj = sortKeys(prompt as unknown as JsonValue);
|
|
|
|
// Convert to JSON and hash it
|
|
const str = JSON.stringify(sortedObj);
|
|
const hash = crypto.createHash("sha256");
|
|
hash.update(str);
|
|
return hash.digest("hex");
|
|
}
|