osr-mono/packages/osr-code-bot/zod_schema.js
2025-02-19 09:40:56 +01:00

215 lines
19 KiB
JavaScript

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.schemas = exports.types = exports.listOpenAIModelsAsStrings = exports.fetchOpenAIModels = exports.listOpenRouterModelsAsStrings = exports.fetchOpenRouterModels = exports.OptionsSchema = exports.SplitType = exports.EType = exports.EMode = exports.RouterTypeSchema = exports.E_Filters = exports.PREFERENCES_DEFAULT = exports.HOME = exports.get_var = void 0;
const zod_1 = require("zod");
const path = __importStar(require("path"));
const chalk_1 = __importDefault(require("chalk"));
const env = __importStar(require("env-var"));
const write_1 = require("@plastichub/fs/write");
const osr_commons_1 = require("@plastichub/osr-commons");
const osr_commons_2 = require("@plastichub/osr-commons");
const primitives_1 = require("@plastichub/core/primitives");
const constants_1 = require("./constants");
const get_var = (key = '') => env.get(key).asString() || env.get(key.replace(/-/g, '_')).asString() || env.get(key.replace(/_/g, '-')).asString();
exports.get_var = get_var;
const HOME = (sub = '') => path.join(process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'] || '', sub);
exports.HOME = HOME;
const PREFERENCES_DEFAULT = (key = 'KBOT_PREFERENCES') => (0, exports.get_var)(key) || path.join((0, exports.HOME)(`.${constants_1.API_PREFIX}`), constants_1.PREFERENCES_FILE_NAME);
exports.PREFERENCES_DEFAULT = PREFERENCES_DEFAULT;
const filters_1 = require("./filters");
const models_1 = require("./models");
const tools_1 = require("./tools");
exports.E_Filters = zod_1.z.enum(Object.keys(filters_1.Filters));
exports.RouterTypeSchema = zod_1.z.enum(['openrouter', 'openai', 'deepseek', 'huggingface', 'ollama', 'fireworks', 'gemini', 'xai']);
exports.EMode = {
COMPLETION: 'completion',
TOOLS: 'tools',
ASSISTANT: 'assistant',
CUSTOM: 'custom'
};
exports.EType = zod_1.z.enum([
exports.EMode.COMPLETION,
exports.EMode.TOOLS,
exports.EMode.ASSISTANT,
exports.EMode.CUSTOM
]);
// https://rjsf-team.github.io/react-jsonschema-form/docs/usage/widgets#file-widgets
/*
langchain/CharacterTextSplitter,
langchain/LatexTextSplitter,
langchain/MarkdownTextSplitter,
langchain/RecursiveCharacterTextSplitter,
langchain/TokenTextSplitter
*/
exports.SplitType = zod_1.z.enum([
'none',
'langchain/CharacterTextSplitter',
'langchain/LatexTextSplitter',
'langchain/MarkdownTextSplitter',
'langchain/RecursiveCharacterTextSplitter',
'langchain/TokenTextSplitter'
]).describe('Type of text splitter to use');
let schemaMap;
const OptionsSchema = (opts) => {
schemaMap = osr_commons_2.ZodMetaMap.create();
schemaMap.add('path', zod_1.z.string()
.min(1)
.default('.')
.describe('Target directory'), { 'ui:widget': 'file' })
.add('prompt', zod_1.z.string()
.describe('The prompt. Supports file paths and environment variables.')
.default('./prompt.md'))
.add('output', zod_1.z.string()
.optional()
.describe('Optional output path for modified files (Tool mode only)'))
.add('dst', zod_1.z.string()
.optional()
.describe('Optional destination path for the result, will substitute ${MODEL_NAME} and ${ROUTER} in the path. Optional, used for "completion" mode'))
.add('each', zod_1.z.string()
.optional()
.describe('Iterate over items, supported: GLOB | Path to JSON File | array of strings (comma separated). To test different models, use --each="gpt-3.5-turbo,gpt-4o", the actual string will exposed as variable `ITEM`, eg: --dst="${ITEM}-output.md"'))
.add('disable', zod_1.z.array(zod_1.z.string())
.default([])
.describe(`Disable tools categories, eg: --disable=${tools_1.defaultTemplate.tools.join(',')}`))
.add('disableTools', zod_1.z.array(zod_1.z.string())
.optional()
.default([])
.describe('List of specific tools to disable'))
.add('tools', zod_1.z.union([
zod_1.z.array(zod_1.z.string()),
zod_1.z.string()
]).optional()
.default(tools_1.defaultTemplate.tools)
.describe(`List of tools to use. Can be built-in tool names or paths to custom tool files. Default: ${tools_1.defaultTemplate.tools.join(',')}`)
.transform((val) => Array.isArray(val) ? val : val.split(',')))
.add('include', zod_1.z.array(zod_1.z.string())
.optional()
.describe('Comma separated glob patterns or paths, eg --include=src/*.tsx,src/*.ts --include=package.json'))
.add('api_key', zod_1.z.string()
.optional()
.describe('Explicit API key to use'))
.add('model', zod_1.z.string()
.optional()
.describe(`AI model to use for processing. Available models:\n${(0, models_1.models_dist)().join('\n')}`))
.add('router', zod_1.z.string()
.default('openrouter')
.describe('Router to use: openai, openrouter or deepseek'))
.add('mode', exports.EType
.default(exports.EMode.TOOLS)
.describe(`Chat completion mode:\n\t completion, tools, assistant.
${chalk_1.default.green.bold('completion')}: no support for tools, please use --dst parameter to save the output.
${chalk_1.default.green.bold('tools')}: allows for tools to be used, eg 'save to ./output.md'. Not all models support this mode.
${chalk_1.default.green.bold('assistant')}: : allows documents (PDF, DOCX, ...) to be added but dont support tools. Use --dst to save the output. Supported files :
${chalk_1.default.green.bold('custom')}: custom mode
`))
.add('logLevel', zod_1.z.number()
.default(2)
.describe('Logging level for the application'))
.add('profile', zod_1.z.string()
.optional()
.describe('Path to profile for variables. Supports environment variables.'))
.add('baseURL', zod_1.z.string()
.optional()
.describe('Base URL for the API, set via --router or directly'))
.add('config', zod_1.z.string()
.optional()
.describe('Path to JSON configuration file (API keys). Supports environment variables.'))
.add('dump', zod_1.z.string()
.optional()
.describe('Create a script'))
.add('preferences', zod_1.z.string()
.default((0, exports.PREFERENCES_DEFAULT)())
.describe('Path to preferences file, eg: location, your email address, gender, etc. Supports environment variables.'))
.add('logs', zod_1.z.string()
.default(constants_1.LOGGING_DIRECTORY)
.describe('Logging directory'))
.add('env', zod_1.z.string()
.default('default')
.describe('Environment (in profile)'))
// If "split" was relevant, re-add here:
// .add('split', SplitType.default('none').describe('Type of text splitter to use'))
.add('variables', zod_1.z.record(zod_1.z.string(), zod_1.z.string())
.optional()
.default({}))
.add('filters', zod_1.z.union([
zod_1.z.string(),
zod_1.z.array(exports.E_Filters),
zod_1.z.array(zod_1.z.string()),
zod_1.z.array(zod_1.z.function())
])
.optional()
.default('')
.describe(`List of filters to apply to the output.
Used only in completion mode and a given output file specified with --dst.
It unwraps by default any code or data in Markdown.
Choices:\n\t${Object.keys(filters_1.Filters)}\n`)
.transform((val) => {
const filters = (0, primitives_1.isString)(val) ? val.split(',') : val;
return filters.map((f) => filters_1.Filters[f]).filter(Boolean);
}))
.add('dry', zod_1.z.union([
zod_1.z.boolean(),
zod_1.z.string().transform((val) => val.toLowerCase() === 'true')
])
.optional()
.default(false)
.describe('Dry run - only write out parameters without making API calls'));
return schemaMap.root()
.passthrough()
.describe('IKBotOptions');
};
exports.OptionsSchema = OptionsSchema;
var openrouter_1 = require("./models/openrouter");
Object.defineProperty(exports, "fetchOpenRouterModels", { enumerable: true, get: function () { return openrouter_1.fetchOpenRouterModels; } });
Object.defineProperty(exports, "listOpenRouterModelsAsStrings", { enumerable: true, get: function () { return openrouter_1.listModelsAsStrings; } });
var openai_1 = require("./models/openai");
Object.defineProperty(exports, "fetchOpenAIModels", { enumerable: true, get: function () { return openai_1.fetchOpenAIModels; } });
Object.defineProperty(exports, "listOpenAIModelsAsStrings", { enumerable: true, get: function () { return openai_1.listModelsAsStrings; } });
const types = () => {
(0, osr_commons_2.generate_interfaces)([(0, exports.OptionsSchema)()], 'src/zod_types.ts');
(0, osr_commons_2.generate_interfaces)([(0, exports.OptionsSchema)()], path.resolve((0, osr_commons_1.resolve)('${OSR-ROOT}/osr-mono/packages/osr-ai-tools/src/types_kbot.ts')));
(0, exports.schemas)();
};
exports.types = types;
const schemas = () => {
(0, osr_commons_2.write)([(0, exports.OptionsSchema)()], 'schema.json', 'kbot', {});
(0, write_1.sync)('schema_ui.json', schemaMap.getUISchema());
};
exports.schemas = schemas;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kX3NjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNyYy96b2Rfc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZCQUF1QjtBQUN2QiwyQ0FBNEI7QUFDNUIsa0RBQXlCO0FBQ3pCLDZDQUE4QjtBQUM5QixnREFBc0Q7QUFDdEQseURBQWlEO0FBQ2pELHlEQUFnRjtBQUNoRiw0REFBc0Q7QUFFdEQsMkNBQWtGO0FBRTNFLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBYSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtBQUFsSixRQUFBLE9BQU8sV0FBMkk7QUFDeEosTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUEvRyxRQUFBLElBQUksUUFBMkc7QUFDckgsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE1BQWMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUEsZUFBTyxFQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSxZQUFJLEVB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