feat: add ai sdk experimental_activeTools example

pull/693/head
Travis Fischer 2025-03-14 21:13:40 +08:00
rodzic da4c28b159
commit 2b05c9771f
6 zmienionych plików z 101 dodań i 175 usunięć

Wyświetl plik

@ -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()

Wyświetl plik

@ -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": {

Wyświetl plik

@ -39,7 +39,7 @@
},
"devDependencies": {
"@agentic/tsconfig": "workspace:*",
"ai": "^4.1.47"
"ai": "^4.1.61"
},
"publishConfig": {
"access": "public"

Wyświetl plik

@ -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
})
])
)
}

Wyświetl plik

@ -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"

Wyświetl plik

@ -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