UNPKG

@gensx/vercel-ai

Version:
206 lines (199 loc) 7.63 kB
'use strict'; /** * Check out the docs at https://www.gensx.com/docs * Find us on Github https://github.com/gensx-inc/gensx * Find us on Discord https://discord.gg/F5BSU8Kc */ var core = require('@gensx/core'); var ai = require('ai'); var tools = require('./tools.cjs'); function _interopNamespaceDefault(e) { var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n.default = e; return Object.freeze(n); } var ai__namespace = /*#__PURE__*/_interopNamespaceDefault(ai); /* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ // Helper function to wrap tools in GSX components function wrapTools(tools) { if (!tools) return undefined; return Object.entries(tools).reduce((acc, [name, tool]) => { if (!tool.execute) return acc; const wrappedTool = { ...tool, execute: (args, options) => { const ToolComponent = core.Component(`tool.${name}`, async (toolArgs) => { if (!tool.execute) throw new Error(`Tool ${name} has no execute function`); return await tool.execute(toolArgs, options); }); return ToolComponent(args); }, }; return { ...acc, [name]: wrappedTool, }; }, {}); } // Export the original functions with proper typing const streamText = core.Component("StreamText", new Proxy(ai__namespace.streamText, { apply: (target, thisArg, args) => { const [first, ...rest] = args; const wrappedTools = wrapTools(first.tools); return Reflect.apply(target, thisArg, [ { ...first, model: wrapVercelAIModel(first.model), tools: wrappedTools, }, ...rest, ]); }, }), { __streamingResultKey: "textStream", }); const streamObject = core.Component("StreamObject", new Proxy(ai__namespace.streamObject, { apply: (target, thisArg, args) => { const [first, ...rest] = args; return Reflect.apply(target, thisArg, [ { ...first, model: wrapVercelAIModel(first.model), }, ...rest, ]); }, })); const generateObject = core.Component("GenerateObject", new Proxy(ai__namespace.generateObject, { apply: (target, thisArg, args) => { const [first, ...rest] = args; return Reflect.apply(target, thisArg, [ { ...first, model: wrapVercelAIModel(first.model), }, ...rest, ]); }, })); const generateText = core.Component("GenerateText", new Proxy(ai__namespace.generateText, { apply: (target, thisArg, args) => { const [first, ...rest] = args; const wrappedTools = wrapTools(first.tools); return Reflect.apply(target, thisArg, [ { ...first, model: wrapVercelAIModel(first.model), tools: wrappedTools, }, ...rest, ]); }, })); const embed = core.Component("embed", ai__namespace.embed); const embedMany = core.Component("embedMany", ai__namespace.embedMany); const generateImage = core.Component("generateImage", ai__namespace.experimental_generateImage); const wrapVercelAIModel = (languageModel, componentOpts) => { assertIsLanguageModel(languageModel); const componentName = componentOpts?.name ?? languageModel.provider; return new Proxy(languageModel, { get(target, propKey, receiver) { const originalValue = Reflect.get(target, propKey, receiver); if (typeof originalValue === "function") { // eslint-disable-next-line @typescript-eslint/no-explicit-any if (originalValue.__gensxComponent) { return originalValue; } // let aggregator: ((chunks: any[]) => unknown) | undefined; let __streamingResultKey; if (propKey === "doStream") { __streamingResultKey = "stream"; // aggregator = // componentOpts?.aggregator ?? // (( // chunks: { // type: "text-delta" | "tool-call" | "finish" | "something-else"; // textDelta: string; // usage: unknown; // finishReason: unknown; // }[], // ) => { // return chunks.reduce((aggregated, chunk) => { // console.log("aggregating chunk", chunk); // if (chunk.type === "text-delta") { // return { // ...aggregated, // }; // } else if (chunk.type === "tool-call") { // return { // ...aggregated, // ...chunk, // }; // } else if (chunk.type === "finish") { // return { // ...aggregated, // usage: chunk.usage, // finishReason: chunk.finishReason, // }; // } else { // return aggregated; // } // }, {}); // }); } return core.Component(componentName, originalValue.bind(target), { ...componentOpts, // aggregator, __streamingResultKey, idPropsKeys: ["inputFormat", "prompt", "responseFormat", "seed"], }); } else if ( // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition originalValue != null && !Array.isArray(originalValue) && !(originalValue instanceof Date) && typeof originalValue === "object") { return core.wrap(originalValue, { prefix: [componentName, propKey.toString()].join("."), }); } else { return originalValue; } }, }); }; function assertIsLanguageModel(languageModel) { if (!("doStream" in languageModel) || typeof languageModel.doStream !== "function" || !("doGenerate" in languageModel) || typeof languageModel.doGenerate !== "function") { throw new Error(`Invalid model. Is this a LanguageModelV2 instance?`); } } exports.asToolSet = tools.asToolSet; exports.embed = embed; exports.embedMany = embedMany; exports.generateImage = generateImage; exports.generateObject = generateObject; exports.generateText = generateText; exports.streamObject = streamObject; exports.streamText = streamText; exports.wrapVercelAIModel = wrapVercelAIModel; //# sourceMappingURL=index.cjs.map