diff --git a/examples/ai-sdk/bin/weather-experimental-active-tools.ts b/examples/ai-sdk/bin/weather-experimental-active-tools.ts new file mode 100644 index 0000000..2b7fa0c --- /dev/null +++ b/examples/ai-sdk/bin/weather-experimental-active-tools.ts @@ -0,0 +1,27 @@ +import 'dotenv/config' + +import { createAISDKTools } from '@agentic/ai-sdk' +import { WeatherClient } from '@agentic/weather' +import { createOpenAI } from '@ai-sdk/openai' +import { generateText } from 'ai' + +async function main() { + const weather = new WeatherClient() + const openai = createOpenAI({ compatibility: 'strict' }) + + const result = await generateText({ + model: openai('gpt-4o-mini'), + tools: createAISDKTools(weather), + experimental_activeTools: Array.from(weather.functions).map( + (fn) => fn.spec.name + ), + toolChoice: 'required', + temperature: 0, + system: 'You are a helpful assistant. Be as concise as possible.', + prompt: 'What is the weather in San Francisco?' + }) + + console.log(result.toolResults[0]) +} + +await main() diff --git a/examples/ai-sdk/package.json b/examples/ai-sdk/package.json index 014b3db..061e8d9 100644 --- a/examples/ai-sdk/package.json +++ b/examples/ai-sdk/package.json @@ -10,9 +10,9 @@ "dependencies": { "@agentic/ai-sdk": "workspace:*", "@agentic/weather": "workspace:*", - "@ai-sdk/openai": "^1.1.13", - "ai": "^4.1.42", - "openai": "^4.85.2", + "@ai-sdk/openai": "^1.2.5", + "ai": "^4.1.61", + "openai": "^4.87.3", "zod": "^3.24.2" }, "devDependencies": { diff --git a/packages/ai-sdk/package.json b/packages/ai-sdk/package.json index 58281a8..f269b20 100644 --- a/packages/ai-sdk/package.json +++ b/packages/ai-sdk/package.json @@ -39,7 +39,7 @@ }, "devDependencies": { "@agentic/tsconfig": "workspace:*", - "ai": "^4.1.47" + "ai": "^4.1.61" }, "publishConfig": { "access": "public" diff --git a/packages/ai-sdk/src/ai-sdk.ts b/packages/ai-sdk/src/ai-sdk.ts index a9436fc..e117c36 100644 --- a/packages/ai-sdk/src/ai-sdk.ts +++ b/packages/ai-sdk/src/ai-sdk.ts @@ -19,3 +19,24 @@ export function createAISDKTools(...aiFunctionLikeTools: AIFunctionLike[]) { ]) ) } + +/** + * Converts a set of Agentic stdlib AI functions to an object compatible with + * the Vercel AI SDK's `experimental_activeTools` parameter. + */ +export function createAISDKExperimentalActiveTools( + ...aiFunctionLikeTools: AIFunctionLike[] +) { + const fns = new AIFunctionSet(aiFunctionLikeTools) + + return Object.fromEntries( + fns.map((fn) => [ + fn.spec.name, + tool({ + description: fn.spec.description, + parameters: fn.inputSchema, + execute: fn.impl + }) + ]) + ) +} diff --git a/packages/jigsawstack/package.json b/packages/jigsawstack/package.json index 3bc827b..17c5335 100644 --- a/packages/jigsawstack/package.json +++ b/packages/jigsawstack/package.json @@ -37,8 +37,8 @@ "devDependencies": { "@agentic/core": "workspace:*", "@agentic/tsconfig": "workspace:*", - "@ai-sdk/openai": "^1.1.13", - "ai": "^4.1.42" + "@ai-sdk/openai": "^1.2.5", + "ai": "^4.1.61" }, "publishConfig": { "access": "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f3f490..0417eed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,14 +78,14 @@ importers: specifier: workspace:* version: link:../../packages/weather '@ai-sdk/openai': - specifier: ^1.1.13 - version: 1.1.13(zod@3.24.2) + specifier: ^1.2.5 + version: 1.2.5(zod@3.24.2) ai: - specifier: ^4.1.42 - version: 4.1.42(react@18.3.1)(zod@3.24.2) + specifier: ^4.1.61 + version: 4.1.61(react@18.3.1)(zod@3.24.2) openai: - specifier: ^4.85.2 - version: 4.85.2(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) + specifier: ^4.87.3 + version: 4.87.3(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -245,8 +245,8 @@ importers: specifier: workspace:* version: link:../tsconfig ai: - specifier: ^4.1.47 - version: 4.1.47(react@18.3.1)(zod@3.24.2) + specifier: ^4.1.61 + version: 4.1.61(react@18.3.1)(zod@3.24.2) packages/apollo: dependencies: @@ -562,11 +562,11 @@ importers: specifier: workspace:* version: link:../tsconfig '@ai-sdk/openai': - specifier: ^1.1.13 - version: 1.1.13(zod@3.24.2) + specifier: ^1.2.5 + version: 1.2.5(zod@3.24.2) ai: - specifier: ^4.1.42 - version: 4.1.42(react@18.3.1)(zod@3.24.2) + specifier: ^4.1.61 + version: 4.1.61(react@18.3.1)(zod@3.24.2) packages/jina: dependencies: @@ -1162,14 +1162,14 @@ importers: packages: - '@ai-sdk/openai@1.1.13': - resolution: {integrity: sha512-IdChK1pJTW3NQis02PG/hHTG0gZSyQIMOLPt7f7ES56C0xH2yaKOU1Tp2aib7pZzWGwDlzTOW2h5TtAB8+V6CQ==} + '@ai-sdk/openai@1.2.5': + resolution: {integrity: sha512-COK7LzspgQQh5Yq070xfDdVMvp8WX592rXRaMaYNNqu1xpzahxDcM24aF9xgKYWuYH0UMoOw4UmWGwGxr6ygIg==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 - '@ai-sdk/provider-utils@2.1.10': - resolution: {integrity: sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q==} + '@ai-sdk/provider-utils@2.1.13': + resolution: {integrity: sha512-kLjqsfOdONr6DGcGEntFYM1niXz1H05vyZNf9OAzK+KKKc64izyP4/q/9HX7W4+6g8hm6BnmKxu8vkr6FSOqDg==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -1177,25 +1177,12 @@ packages: zod: optional: true - '@ai-sdk/provider-utils@2.1.9': - resolution: {integrity: sha512-NerKjTuuUUs6glJGaentaXEBH52jRM0pR+cRCzc7aWke/K5jYBD6Frv1JYBpcxS7gnnCqSQZR9woiyS+6jrdjw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.0.0 - peerDependenciesMeta: - zod: - optional: true - - '@ai-sdk/provider@1.0.8': - resolution: {integrity: sha512-f9jSYwKMdXvm44Dmab1vUBnfCDSFfI5rOtvV1W9oKB7WYHR5dGvCC6x68Mk3NUfrdmNoMVHGoh6JT9HCVMlMow==} + '@ai-sdk/provider@1.0.11': + resolution: {integrity: sha512-CPyImHGiT3svyfmvPvAFTianZzWFtm0qK82XjwlQIA1C3IQ2iku/PMQXi7aFyrX0TyMh3VTkJPB03tjU2VXVrw==} engines: {node: '>=18'} - '@ai-sdk/provider@1.0.9': - resolution: {integrity: sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA==} - engines: {node: '>=18'} - - '@ai-sdk/react@1.1.17': - resolution: {integrity: sha512-NAuEflFvjw1uh1AOmpyi7rBF4xasWsiWUb86JQ8ScjDGxoGDYEdBnaHOxUpooLna0dGNbSPkvDMnVRhoLKoxPQ==} + '@ai-sdk/react@1.1.23': + resolution: {integrity: sha512-R+PG9ya0GLs6orzt+1MxmjrWFuZM0gVs+l8ihBr1u+42wwkVeojY4CAtQjW4nrfGTVbdJYkl5y+r/VKfjr42aQ==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -1206,29 +1193,8 @@ packages: zod: optional: true - '@ai-sdk/react@1.1.19': - resolution: {integrity: sha512-zqSOWmJxpB45ZrwZ04+Q7Uo3xeGM0tva2eUYz2T4gv9Yk6MQAfOBA6+scsKg8CyIuUy4M4/C4pCY3eWQf7sfQg==} - engines: {node: '>=18'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.0.0 - peerDependenciesMeta: - react: - optional: true - zod: - optional: true - - '@ai-sdk/ui-utils@1.1.15': - resolution: {integrity: sha512-NsV/3CMmjc4m53snzRdtZM6teTQUXIKi8u0Kf7GBruSzaMSuZ4DWaAAlUshhR3p2FpZgtsogW+vYG1/rXsGu+Q==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.0.0 - peerDependenciesMeta: - zod: - optional: true - - '@ai-sdk/ui-utils@1.1.16': - resolution: {integrity: sha512-jfblR2yZVISmNK2zyNzJZFtkgX57WDAUQXcmn3XUBJyo8LFsADu+/vYMn5AOyBi9qJT0RBk11PEtIxIqvByw3Q==} + '@ai-sdk/ui-utils@1.1.19': + resolution: {integrity: sha512-rDHy2uxlPMt3jjS9L6mBrsfhEInZ5BVoWevmD13fsAt2s/XWy2OwwKmgmUQkdLlY4mn/eyeYAfDGK8+5CbOAgg==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -2496,20 +2462,8 @@ packages: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} - ai@4.1.42: - resolution: {integrity: sha512-frwlnev2ur3pMjGcPamgyVyr4pXbhabt3VUyZrILM9V1gC7jcG1+BP3Vjp54Im0szSZCADHoebtvA7zXTYiEHw==} - engines: {node: '>=18'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.0.0 - peerDependenciesMeta: - react: - optional: true - zod: - optional: true - - ai@4.1.47: - resolution: {integrity: sha512-9UZ8Mkv1HlprCJfQ0Kq+rgKbfkrkDtJjslr1WOHBRzvC70jDJJYp8r0Qq4vlF7zs9VBkGyy8Rhm5zQJJIUjvgw==} + ai@4.1.61: + resolution: {integrity: sha512-Y9SAyGJEeW23F6C7PSHZXYNEvbH2cqJm0rVW2AoeFaXFT13ttx8rAqs8wz2w466C1UB329yl5PXayFcHqofSEA==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -4185,11 +4139,6 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanoid@3.3.9: resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4318,18 +4267,6 @@ packages: peerDependencies: zod: ^3.23.8 - openai@4.85.2: - resolution: {integrity: sha512-ZQg3Q+K4A6M9dLFh5W36paZkZBQO+VbxMNJ1gUSyHsGiEWuXahdn02ermqNV68LhWQxdJQaWUFRAYpW/suTPWQ==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - openai@4.87.3: resolution: {integrity: sha512-d2D54fzMuBYTxMW8wcNmhT1rYKcTfMJ8t+4KjH2KtvYenygITiGBgHoIrzHwnDQWW+C5oCA+ikIR2jgPCFqcKQ==} hasBin: true @@ -4958,8 +4895,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - swr@2.3.2: - resolution: {integrity: sha512-RosxFpiabojs75IwQ316DGoDRmOqtiAj0tg8wCcbEu4CiLZBs/a9QNtHV7TUfDXmmlgqij/NqzKq/eLelyv9xA==} + swr@2.3.3: + resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -5495,70 +5432,39 @@ packages: snapshots: - '@ai-sdk/openai@1.1.13(zod@3.24.2)': + '@ai-sdk/openai@1.2.5(zod@3.24.2)': dependencies: - '@ai-sdk/provider': 1.0.8 - '@ai-sdk/provider-utils': 2.1.9(zod@3.24.2) + '@ai-sdk/provider': 1.0.11 + '@ai-sdk/provider-utils': 2.1.13(zod@3.24.2) zod: 3.24.2 - '@ai-sdk/provider-utils@2.1.10(zod@3.24.2)': + '@ai-sdk/provider-utils@2.1.13(zod@3.24.2)': dependencies: - '@ai-sdk/provider': 1.0.9 + '@ai-sdk/provider': 1.0.11 eventsource-parser: 3.0.0 - nanoid: 3.3.8 + nanoid: 3.3.9 secure-json-parse: 2.7.0 optionalDependencies: zod: 3.24.2 - '@ai-sdk/provider-utils@2.1.9(zod@3.24.2)': - dependencies: - '@ai-sdk/provider': 1.0.8 - eventsource-parser: 3.0.0 - nanoid: 3.3.8 - secure-json-parse: 2.7.0 - optionalDependencies: - zod: 3.24.2 - - '@ai-sdk/provider@1.0.8': + '@ai-sdk/provider@1.0.11': dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@1.0.9': + '@ai-sdk/react@1.1.23(react@18.3.1)(zod@3.24.2)': dependencies: - json-schema: 0.4.0 - - '@ai-sdk/react@1.1.17(react@18.3.1)(zod@3.24.2)': - dependencies: - '@ai-sdk/provider-utils': 2.1.9(zod@3.24.2) - '@ai-sdk/ui-utils': 1.1.15(zod@3.24.2) - swr: 2.3.2(react@18.3.1) + '@ai-sdk/provider-utils': 2.1.13(zod@3.24.2) + '@ai-sdk/ui-utils': 1.1.19(zod@3.24.2) + swr: 2.3.3(react@18.3.1) throttleit: 2.1.0 optionalDependencies: react: 18.3.1 zod: 3.24.2 - '@ai-sdk/react@1.1.19(react@18.3.1)(zod@3.24.2)': + '@ai-sdk/ui-utils@1.1.19(zod@3.24.2)': dependencies: - '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) - '@ai-sdk/ui-utils': 1.1.16(zod@3.24.2) - swr: 2.3.2(react@18.3.1) - throttleit: 2.1.0 - optionalDependencies: - react: 18.3.1 - zod: 3.24.2 - - '@ai-sdk/ui-utils@1.1.15(zod@3.24.2)': - dependencies: - '@ai-sdk/provider': 1.0.8 - '@ai-sdk/provider-utils': 2.1.9(zod@3.24.2) - zod-to-json-schema: 3.24.1(zod@3.24.2) - optionalDependencies: - zod: 3.24.2 - - '@ai-sdk/ui-utils@1.1.16(zod@3.24.2)': - dependencies: - '@ai-sdk/provider': 1.0.9 - '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) + '@ai-sdk/provider': 1.0.11 + '@ai-sdk/provider-utils': 2.1.13(zod@3.24.2) zod-to-json-schema: 3.24.3(zod@3.24.2) optionalDependencies: zod: 3.24.2 @@ -6903,25 +6809,14 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ai@4.1.42(react@18.3.1)(zod@3.24.2): + ai@4.1.61(react@18.3.1)(zod@3.24.2): dependencies: - '@ai-sdk/provider': 1.0.8 - '@ai-sdk/provider-utils': 2.1.9(zod@3.24.2) - '@ai-sdk/react': 1.1.17(react@18.3.1)(zod@3.24.2) - '@ai-sdk/ui-utils': 1.1.15(zod@3.24.2) - '@opentelemetry/api': 1.9.0 - jsondiffpatch: 0.6.0 - optionalDependencies: - react: 18.3.1 - zod: 3.24.2 - - ai@4.1.47(react@18.3.1)(zod@3.24.2): - dependencies: - '@ai-sdk/provider': 1.0.9 - '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) - '@ai-sdk/react': 1.1.19(react@18.3.1)(zod@3.24.2) - '@ai-sdk/ui-utils': 1.1.16(zod@3.24.2) + '@ai-sdk/provider': 1.0.11 + '@ai-sdk/provider-utils': 2.1.13(zod@3.24.2) + '@ai-sdk/react': 1.1.23(react@18.3.1)(zod@3.24.2) + '@ai-sdk/ui-utils': 1.1.19(zod@3.24.2) '@opentelemetry/api': 1.9.0 + eventsource-parser: 3.0.0 jsondiffpatch: 0.6.0 optionalDependencies: react: 18.3.1 @@ -8772,8 +8667,6 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.8: {} - nanoid@3.3.9: {} natural-compare@1.4.0: {} @@ -8907,21 +8800,6 @@ snapshots: dependencies: zod: 3.24.2 - openai@4.85.2(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2): - dependencies: - '@types/node': 18.19.80 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - optionalDependencies: - ws: 8.18.0 - zod: 3.24.2 - transitivePeerDependencies: - - encoding - openai@4.87.3(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2): dependencies: '@types/node': 18.19.80 @@ -9599,7 +9477,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swr@2.3.2(react@18.3.1): + swr@2.3.3(react@18.3.1): dependencies: dequal: 2.0.3 react: 18.3.1