kbot:structured output - spieglein spieglein :)

This commit is contained in:
lovebird 2025-04-01 14:35:30 +02:00
parent 174b4c3cc2
commit 393591e28e
14 changed files with 306 additions and 48 deletions

View File

@ -9,7 +9,7 @@
"request": "launch",
"name": "create",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -32,7 +32,7 @@
"request": "launch",
"name": "modify",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -54,7 +54,7 @@
"request": "launch",
"name": "git",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -77,7 +77,7 @@
"request": "launch",
"name": "templates:solidworks",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -100,7 +100,7 @@
"request": "launch",
"name": "prompt:docker",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -125,7 +125,7 @@
"request": "launch",
"name": "iterator",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -154,7 +154,7 @@
"request": "launch",
"name": "search:google",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -177,7 +177,7 @@
"request": "launch",
"name": "search:serpapi",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -199,7 +199,7 @@
"request": "launch",
"name": "interact",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -224,7 +224,7 @@
"request": "launch",
"name": "web",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -247,7 +247,7 @@
"request": "launch",
"name": "deepseek",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -269,7 +269,7 @@
"request": "launch",
"name": "tools:email",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -291,7 +291,7 @@
"request": "launch",
"name": "tools:terminal:astro",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -313,7 +313,7 @@
"request": "launch",
"name": "types",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -333,7 +333,7 @@
"request": "launch",
"name": "tools:search",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -357,7 +357,7 @@
"request": "launch",
"name": "assistant:code",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -383,7 +383,7 @@
"request": "launch",
"name": "assistant:pdf",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -409,7 +409,7 @@
"request": "launch",
"name": "assistant:md",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -431,12 +431,39 @@
"outputCapture": "std",
"console": "integratedTerminal"
},
{
"type": "node",
"request": "launch",
"name": "response-format",
"skipFiles": [],
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
"cwd": "${workspaceFolder}",
"args": [
"'return a list of african countries'",
"--disable='npm,terminal,interact,git,search'",
"--router2=openai",
"--format=./tests/response-format/countries.json",
"--model=openai/gpt-4o",
"--mode=completion",
"--filters=JSONParse",
"--dst=./tests/response-format/africa-countries.json",
],
"resolveSourceMapLocations": [
"${workspaceFolder}/**",
"!**/node_modules/**"
],
"outputCapture": "std",
"console": "integratedTerminal"
},
{
"type": "node",
"request": "launch",
"name": "each:glob",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -462,7 +489,7 @@
"request": "launch",
"name": "each:array",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -494,7 +521,7 @@
"request": "launch",
"name": "salamand",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -527,7 +554,7 @@
"request": "launch",
"name": "tools:test",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -556,7 +583,7 @@
"request": "launch",
"name": "images:jpg-svg",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -582,7 +609,7 @@
"request": "launch",
"name": "images:jpg-svg-overlay",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],
@ -609,7 +636,7 @@
"request": "launch",
"name": "hono",
"skipFiles": [],
"program": "${workspaceFolder}\\main.js",
"program": "${workspaceFolder}\\dist-in\\main.js",
"outFiles": [
"${workspaceFolder}/**/*.js"
],

View File

@ -38,9 +38,10 @@ export const runCompletion = async (client, params, options) => {
const completion = await client.chat.completions.create({
model: options.model,
messages: params.messages,
response_format: options.format,
});
let result = completion.choices[0].message.content;
result = await onCompletion(result, options);
return result;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLWNvbXBsZXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvcnVuLWNvbXBsZXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDaEQsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUE7QUFDakMsT0FBTyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFJM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFHM0MsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxTQUFjLEVBQUUsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDekUsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQW1CLElBQUksRUFBRSxDQUFDLENBQUE7SUFDaEUsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQy9CLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQ3ZELEdBQUcsSUFBSTtZQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJO1lBQ3JDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtTQUN2QixDQUFDLENBQUMsQ0FBQTtRQUNILEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsT0FBTyxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7WUFDeEIsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDLENBQUMsQ0FBQTtRQUNILE1BQU0sT0FBTyxHQUFXLE1BQU0sQ0FBQyxNQUFNLENBQVcsQ0FBQztRQUNqRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBQ0QsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3JCLGtCQUFrQjtJQUNsQixPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsTUFBYyxFQUFFLE1BQVcsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDckYsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1FBQzFDLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3RELEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFBO0lBQ2xELE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDNUMsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUEifQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLWNvbXBsZXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvcnVuLWNvbXBsZXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDaEQsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUE7QUFDakMsT0FBTyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFJM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFHM0MsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxTQUFjLEVBQUUsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDekUsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQW1CLElBQUksRUFBRSxDQUFDLENBQUE7SUFDaEUsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQy9CLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQ3ZELEdBQUcsSUFBSTtZQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJO1lBQ3JDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtTQUN2QixDQUFDLENBQUMsQ0FBQTtRQUNILEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsT0FBTyxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7WUFDeEIsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDLENBQUMsQ0FBQTtRQUNILE1BQU0sT0FBTyxHQUFXLE1BQU0sQ0FBQyxNQUFNLENBQVcsQ0FBQztRQUNqRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBQ0QsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3JCLGtCQUFrQjtJQUNsQixPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsTUFBYyxFQUFFLE1BQVcsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDckYsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1FBQzFDLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3RELEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDekIsZUFBZSxFQUFFLE9BQU8sQ0FBQyxNQUFhO0tBQ3ZDLENBQUMsQ0FBQTtJQUNGLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQTtJQUNsRCxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzVDLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyxDQUFBIn0=

File diff suppressed because one or more lines are too long

View File

@ -427,6 +427,6 @@ export interface IKBotOptions {
filters?: (string | ("JSON" | "JSONUnescape" | "JSONPretty" | "AlphaSort" | "code" | "JSONParse" | "trim")[] | string[] | ((...args_0: unknown[]) => unknown)[]);
/** Dry run - only write out parameters without making API calls */
dry?: (boolean | string);
/** Zod schema for structured outputs */
format?: any;
/** Zod schema for structured outputs. Can be a Zod schema, a JSON schema string, or a path to a JSON file. */
format?: (string | undefined) | undefined;
}

View File

@ -20,6 +20,7 @@
"emojilib": "4.0.1",
"env-var": "7.5.0",
"glob": "11.0.1",
"json-schema-to-zod": "2.6.0",
"marked": "14.1.4",
"marked-terminal": "7.2.1",
"mime-types": "2.1.35",
@ -4342,6 +4343,15 @@
"dev": true,
"license": "MIT"
},
"node_modules/json-schema-to-zod": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/json-schema-to-zod/-/json-schema-to-zod-2.6.0.tgz",
"integrity": "sha512-6sFZqOzHZeON8g2ZW5HJ114Hb/FffNCjWh8dgulJaKFkUqKCEWZAzF4+g07SQpfBZF7HXemwedtdLypZzmnVpQ==",
"license": "ISC",
"bin": {
"json-schema-to-zod": "dist/cjs/cli.js"
}
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",

View File

@ -39,6 +39,7 @@
"emojilib": "4.0.1",
"env-var": "7.5.0",
"glob": "11.0.1",
"json-schema-to-zod": "2.6.0",
"marked": "14.1.4",
"marked-terminal": "7.2.1",
"mime-types": "2.1.35",

View File

@ -188,8 +188,8 @@
"description": "Dry run - only write out parameters without making API calls"
},
"format": {
"default": null,
"description": "Zod schema for structured outputs"
"type": "string",
"description": "Zod schema for structured outputs. Can be a Zod schema, a JSON schema string, or a path to a JSON file."
}
},
"additionalProperties": true,

View File

@ -127,8 +127,7 @@
"ui:placeholder": false
},
"format": {
"ui:description": "Zod schema for structured outputs",
"ui:title": "Format",
"ui:placeholder": null
"ui:description": "Zod schema for structured outputs. Can be a Zod schema, a JSON schema string, or a path to a JSON file.",
"ui:title": "Format"
}
}

View File

@ -11,7 +11,7 @@ import { logger } from '../index.js'
import { dumpAsScript } from '../utils/script.js'
import { applyFilters, Filter } from '../filters.js'
import { variables } from '../variables.js'
import { ResponseFormatJSONSchema } from 'openai/resources/shared.js'
export const onCompletion = async (result: any = "", options: IKBotTask) => {
result = applyFilters(result, options.filters as Filter[] || [])
@ -44,6 +44,7 @@ export const runCompletion = async (client: OpenAI, params: any, options: IKBotT
const completion = await client.chat.completions.create({
model: options.model,
messages: params.messages,
response_format: options.format as any,
})
let result = completion.choices[0].message.content
result = await onCompletion(result, options)

View File

@ -5,6 +5,7 @@ import env from 'env-var'
import { generate_interfaces, ZodMetaMap, resolve, write } from '@polymech/commons'
import { sync as exists } from '@polymech/fs/exists'
import { sync as writeFS } from '@polymech/fs/write'
import { sync as readFS } from '@polymech/fs/read'
import { isArray, isFunction, isString } from '@polymech/core/primitives'
import { zodResponseFormat } from "openai/helpers/zod"
@ -13,7 +14,7 @@ import { API_PREFIX, LOGGING_DIRECTORY, PREFERENCES_FILE_NAME } from './constant
export const get_var = (key: string = '') => env.get(key).asString() || env.get(key.replace(/-/g, '_')).asString() || env.get(key.replace(/_/g, '-')).asString()
export const HOME = (sub = '') => path.join(process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'] || '', sub)
export const PREFERENCES_DEFAULT = (key: string = 'KBOT_PREFERENCES') => get_var(key) || path.join(HOME(`.${API_PREFIX}`), PREFERENCES_FILE_NAME)
import { jsonSchemaToZod } from "json-schema-to-zod"
import { Filters } from './filters.js'
import { models_dist } from './models/index.js'
import { defaultTemplate } from './tools.js'
@ -227,11 +228,11 @@ export const OptionsSchema = (opts?: any): any => {
It unwraps by default any code or data in Markdown.
Choices:\n\t${Object.keys(Filters)}\n`)
.transform((val) => {
if(isArray(val) && val.length && isFunction(val[0])){
if (isArray(val) && val.length && isFunction(val[0])) {
return val
}
let filters = isString(val) ? val.split(',') : val
filters = filters.map((f: any) => Filters[f]).filter(Boolean)
filters = filters.map((f: any) => Filters[f]).filter(Boolean)
return filters
})
)
@ -247,11 +248,27 @@ export const OptionsSchema = (opts?: any): any => {
)
.add(
'format',
z.any()
z.string().optional().transform((val) => {
try {
let schema;
// Check if the string is a file path
if (exists(val) && val.endsWith('.json')) {
const content = readFS(val);
schema = JSON.parse(content.toString());
} else {
schema = JSON.parse(val);
}
const zodSchemaStr = jsonSchemaToZod(schema);
// Evaluate the string to get the actual Zod schema
const zodSchema = eval(`(${zodSchemaStr})`);
return zodResponseFormat(zodSchema, "format");
} catch (e) {
console.error(`Error parsing format: ${e}`)
return null;
}
})
.optional()
.default(null)
.describe('Zod schema for structured outputs')
.transform((val) => val ? zodResponseFormat(val, "format") : null)
.describe('Zod schema for structured outputs. Can be a Zod schema, a JSON schema string, or a path to a JSON file.')
);
return schemaMap.root()
.passthrough()

View File

@ -427,6 +427,6 @@ export interface IKBotOptions {
filters?: (string | ("JSON" | "JSONUnescape" | "JSONPretty" | "AlphaSort" | "code" | "JSONParse" | "trim")[] | string[] | ((...args_0: unknown[]) => unknown)[]);
/** Dry run - only write out parameters without making API calls */
dry?: (boolean | string);
/** Zod schema for structured outputs */
format?: any;
/** Zod schema for structured outputs. Can be a Zod schema, a JSON schema string, or a path to a JSON file. */
format?: (string | undefined) | undefined;
}

View File

@ -0,0 +1,84 @@
{
"cities": [
{
"name": "Lagos",
"country": "Nigeria",
"population": 14779000
},
{
"name": "Cairo",
"country": "Egypt",
"population": 20484965
},
{
"name": "Kinshasa",
"country": "Democratic Republic of the Congo",
"population": 15075000
},
{
"name": "Johannesburg",
"country": "South Africa",
"population": 9574417
},
{
"name": "Nairobi",
"country": "Kenya",
"population": 5545000
},
{
"name": "Luanda",
"country": "Angola",
"population": 8200000
},
{
"name": "Addis Ababa",
"country": "Ethiopia",
"population": 4942826
},
{
"name": "Khartoum",
"country": "Sudan",
"population": 6400000
},
{
"name": "Dar es Salaam",
"country": "Tanzania",
"population": 6936403
},
{
"name": "Accra",
"country": "Ghana",
"population": 4540000
},
{
"name": "Algiers",
"country": "Algeria",
"population": 3415811
},
{
"name": "Casablanca",
"country": "Morocco",
"population": 3500000
},
{
"name": "Abidjan",
"country": "Ivory Coast",
"population": 5040000
},
{
"name": "Dakar",
"country": "Senegal",
"population": 3483664
},
{
"name": "Tunis",
"country": "Tunisia",
"population": 2750330
},
{
"name": "Douala",
"country": "Cameroon",
"population": 4050687
}
]
}

View File

@ -0,0 +1,66 @@
# African Countries List
Here is a comprehensive list of African countries in alphabetical order:
1. Algeria
2. Angola
3. Benin
4. Botswana
5. Burkina Faso
6. Burundi
7. Cameroon
8. Cape Verde
9. Central African Republic
10. Chad
11. Comoros
12. Congo
13. Democratic Republic of the Congo
14. Djibouti
15. Egypt
16. Equatorial Guinea
17. Eritrea
18. Ethiopia
19. Gabon
20. Gambia
21. Ghana
22. Guinea
23. Guinea-Bissau
24. Ivory Coast
25. Kenya
26. Lesotho
27. Liberia
28. Libya
29. Madagascar
30. Malawi
31. Mali
32. Mauritania
33. Mauritius
34. Morocco
35. Mozambique
36. Namibia
37. Niger
38. Nigeria
39. Rwanda
40. Sao Tome and Principe
41. Senegal
42. Seychelles
43. Sierra Leone
44. Somalia
45. South Africa
46. South Sudan
47. Sudan
48. Swaziland (Eswatini)
49. Tanzania
50. Togo
51. Tunisia
52. Uganda
53. Zambia
54. Zimbabwe
Source: [United Nations - Member States](https://www.un.org/en/about-us/member-states)
---
Prompt: 'return a list of african countries'
Kind regards,
Guenter

View File

@ -0,0 +1,31 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://example.com/cities.schema.json",
"title": "Cities Wrapper",
"description": "An object containing a list of cities (without coordinates).",
"type": "object",
"properties": {
"cities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "City name."
},
"country": {
"type": "string",
"description": "Country where the city is located."
},
"population": {
"type": "integer",
"description": "Total population of the city."
}
},
"required": ["name", "country"]
}
}
},
"required": ["cities"]
}