diff --git a/.changeset/chatty-seas-pump.md b/.changeset/chatty-seas-pump.md new file mode 100644 index 00000000..144bf4d1 --- /dev/null +++ b/.changeset/chatty-seas-pump.md @@ -0,0 +1,5 @@ +--- +'@srcbook/api': patch +--- + +Migrate to Vercel AI SDK v4.2. diff --git a/packages/api/ai/config.mts b/packages/api/ai/config.mts index 7a27ec30..e89c2e0f 100644 --- a/packages/api/ai/config.mts +++ b/packages/api/ai/config.mts @@ -70,5 +70,8 @@ export async function getModel(): Promise { baseURL: aiBaseUrl, }); return openaiCompatible(model); + + default: + throw new Error(`Unsupported AI provider: ${aiProvider}`); } } diff --git a/packages/api/ai/generate.mts b/packages/api/ai/generate.mts index 13245e14..7bd3749d 100644 --- a/packages/api/ai/generate.mts +++ b/packages/api/ai/generate.mts @@ -138,7 +138,8 @@ ${query} return prompt; }; -type NoToolsGenerateTextResult = GenerateTextResult<{}>; +// this might throw a compiler error, but that's fine: it's correct in Vercel AI SDK v4.x +type NoToolsGenerateTextResult = GenerateTextResult<{}, {}>; /* * Given a user request, which is free form text describing their intent, * generate a srcbook using an LLM. @@ -281,6 +282,7 @@ export async function streamEditApp( } }, onFinish: () => { + // eslint-disable-next-line turbo/no-undeclared-env-vars if (process.env.SRCBOOK_DISABLE_ANALYTICS !== 'true') { logAppGeneration({ appId, diff --git a/packages/api/package.json b/packages/api/package.json index f1c25925..cdf807f3 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -27,7 +27,7 @@ "@ai-sdk/openai": "catalog:", "@ai-sdk/provider": "^1.0.1", "@srcbook/shared": "workspace:^", - "ai": "^3.4.33", + "ai": "^4.2.0", "archiver": "^7.0.1", "better-sqlite3": "^11.3.0", "cors": "^2.8.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 47419cec..271163fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -67,8 +67,8 @@ importers: specifier: workspace:^ version: link:../shared ai: - specifier: ^3.4.33 - version: 3.4.33(openai@4.52.3)(react@18.3.1)(sswr@2.1.0(svelte@4.2.18))(svelte@4.2.18)(vue@3.4.31(typescript@5.6.2))(zod@3.23.8) + specifier: ^4.2.0 + version: 4.3.5(react@18.3.1)(zod@3.23.8) archiver: specifier: ^7.0.1 version: 7.0.1 @@ -526,15 +526,6 @@ packages: zod: optional: true - '@ai-sdk/provider-utils@1.0.22': - resolution: {integrity: sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.0.0 - peerDependenciesMeta: - zod: - optional: true - '@ai-sdk/provider-utils@2.0.1': resolution: {integrity: sha512-TNg7rPhRtETB2Z9F0JpOvpGii9Fs8EWM8nYy1jEkvSXkrPJ6b/9zVnDdaJsmLFDyrMbOsPJlkblYtmYEQou36w==} engines: {node: '>=18'} @@ -553,12 +544,14 @@ packages: zod: optional: true - '@ai-sdk/provider@0.0.23': - resolution: {integrity: sha512-oAc49O5+xypVrKM7EUU5P/Y4DUL4JZUWVxhejoAVOTOl3WZUEWsMbP3QZR+TrimQIsS0WR/n9UuF6U0jPdp0tQ==} + '@ai-sdk/provider-utils@2.2.6': + resolution: {integrity: sha512-sUlZ7Gnq84DCGWMQRIK8XVbkzIBnvPR1diV4v6JwPgpn5armnLI/j+rqn62MpLrU5ZCQZlDKl/Lw6ed3ulYqaA==} engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 - '@ai-sdk/provider@0.0.26': - resolution: {integrity: sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==} + '@ai-sdk/provider@0.0.23': + resolution: {integrity: sha512-oAc49O5+xypVrKM7EUU5P/Y4DUL4JZUWVxhejoAVOTOl3WZUEWsMbP3QZR+TrimQIsS0WR/n9UuF6U0jPdp0tQ==} engines: {node: '>=18'} '@ai-sdk/provider@1.0.0': @@ -569,6 +562,10 @@ packages: resolution: {integrity: sha512-mV+3iNDkzUsZ0pR2jG0sVzU6xtQY5DtSCBy3JFycLp6PwjyLw/iodfL3MwdmMCRJWgs3dadcHejRnMvF9nGTBg==} engines: {node: '>=18'} + '@ai-sdk/provider@1.1.2': + resolution: {integrity: sha512-ITdgNilJZwLKR7X5TnUr1BsQW6UTX5yFp0h66Nfx8XjBYkWD9W3yugr50GOz3CnE9m/U/Cd5OyEbTMI0rgi6ZQ==} + engines: {node: '>=18'} + '@ai-sdk/react@0.0.55': resolution: {integrity: sha512-9fUUEEEoH01M6ZhvyZ/2v0DI6tiYnSldBg6RaKoy+qx2tSeKvOpFNZhT/iOvQ7oqAyyp0Ocg5Rj7L/jcLXSMxw==} engines: {node: '>=18'} @@ -581,15 +578,13 @@ packages: zod: optional: true - '@ai-sdk/react@0.0.70': - resolution: {integrity: sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==} + '@ai-sdk/react@1.2.8': + resolution: {integrity: sha512-S2FzCSi4uTF0JuSN6zYMXyiAWVAzi/Hho8ISYgHpGZiICYLNCP2si4DuXQOsnWef3IXzQPLVoE11C63lILZIkw==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.0.0 + zod: ^3.23.8 peerDependenciesMeta: - react: - optional: true zod: optional: true @@ -602,15 +597,6 @@ packages: solid-js: optional: true - '@ai-sdk/solid@0.0.54': - resolution: {integrity: sha512-96KWTVK+opdFeRubqrgaJXoNiDP89gNxFRWUp0PJOotZW816AbhUf4EnDjBjXTLjXL1n0h8tGSE9sZsRkj9wQQ==} - engines: {node: '>=18'} - peerDependencies: - solid-js: ^1.7.7 - peerDependenciesMeta: - solid-js: - optional: true - '@ai-sdk/svelte@0.0.46': resolution: {integrity: sha512-cokqS91vQkpqiRgf8xKwOONFb/RwkIbRg9jYVRb+z5NR9OsWXKMEfoCAf8+VgURfVbp8nqA+ddRXvtgYCwqQjQ==} engines: {node: '>=18'} @@ -620,15 +606,6 @@ packages: svelte: optional: true - '@ai-sdk/svelte@0.0.57': - resolution: {integrity: sha512-SyF9ItIR9ALP9yDNAD+2/5Vl1IT6kchgyDH8xkmhysfJI6WrvJbtO1wdQ0nylvPLcsPoYu+cAlz1krU4lFHcYw==} - engines: {node: '>=18'} - peerDependencies: - svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - svelte: - optional: true - '@ai-sdk/ui-utils@0.0.41': resolution: {integrity: sha512-I0trJKWxVG8hXeG0MvKqLG54fZjdeGjXvcVZocaSnWMBhl9lpTQxrqAR6ZsQMFDXs5DbvXoKtQs488qu2Bzaiw==} engines: {node: '>=18'} @@ -638,14 +615,11 @@ packages: zod: optional: true - '@ai-sdk/ui-utils@0.0.50': - resolution: {integrity: sha512-Z5QYJVW+5XpSaJ4jYCCAVG7zIAuKOOdikhgpksneNmKvx61ACFaf98pmOd+xnjahl0pIlc/QIe6O4yVaJ1sEaw==} + '@ai-sdk/ui-utils@1.2.7': + resolution: {integrity: sha512-OVRxa4SDj0wVsMZ8tGr/whT89oqNtNoXBKmqWC2BRv5ZG6azL2LYZ5ZK35u3lb4l1IE7cWGsLlmq0py0ttsL7A==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 - peerDependenciesMeta: - zod: - optional: true + zod: ^3.23.8 '@ai-sdk/vue@0.0.46': resolution: {integrity: sha512-H366ydskPbZP8uRs4sm3SAi97P3JVTRI5Q8xYTI6uTaY4UFBA6aOWdDxniYZNa67ebemfe11m7ksX4wHW6Wl8g==} @@ -656,15 +630,6 @@ packages: vue: optional: true - '@ai-sdk/vue@0.0.59': - resolution: {integrity: sha512-+ofYlnqdc8c4F6tM0IKF0+7NagZRAiqBJpGDJ+6EYhDW8FHLUP/JFBgu32SjxSxC6IKFZxEnl68ZoP/Z38EMlw==} - engines: {node: '>=18'} - peerDependencies: - vue: ^3.3.4 - peerDependenciesMeta: - vue: - optional: true - '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -2518,26 +2483,15 @@ packages: zod: optional: true - ai@3.4.33: - resolution: {integrity: sha512-plBlrVZKwPoRTmM8+D1sJac9Bq8eaa2jiZlHLZIWekKWI1yMWYZvCCEezY9ASPwRhULYDJB2VhKOBUUeg3S5JQ==} + ai@4.3.5: + resolution: {integrity: sha512-hxJ+6YCdGOK1MVPGITmz1if+LXR/aW72w8TI8kiV+3R7lpK1hfpApR8EjqN2ag6cWa0R7OEI3gb/srWkQ3hT2Q==} engines: {node: '>=18'} peerDependencies: - openai: ^4.42.0 react: ^18 || ^19 || ^19.0.0-rc - sswr: ^2.1.0 - svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 - zod: ^3.0.0 + zod: ^3.23.8 peerDependenciesMeta: - openai: - optional: true react: optional: true - sswr: - optional: true - svelte: - optional: true - zod: - optional: true ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -4362,6 +4316,11 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -5653,10 +5612,10 @@ packages: peerDependencies: zod: ^3.23.3 - zod-to-json-schema@3.23.5: - resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} + zod-to-json-schema@3.24.5: + resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} peerDependencies: - zod: ^3.23.3 + zod: ^3.24.1 zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -5696,15 +5655,6 @@ snapshots: optionalDependencies: zod: 3.23.8 - '@ai-sdk/provider-utils@1.0.22(zod@3.23.8)': - dependencies: - '@ai-sdk/provider': 0.0.26 - eventsource-parser: 1.1.2 - nanoid: 3.3.7 - secure-json-parse: 2.7.0 - optionalDependencies: - zod: 3.23.8 - '@ai-sdk/provider-utils@2.0.1(zod@3.23.8)': dependencies: '@ai-sdk/provider': 1.0.0 @@ -5723,11 +5673,14 @@ snapshots: optionalDependencies: zod: 3.23.8 - '@ai-sdk/provider@0.0.23': + '@ai-sdk/provider-utils@2.2.6(zod@3.23.8)': dependencies: - json-schema: 0.4.0 + '@ai-sdk/provider': 1.1.2 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.23.8 - '@ai-sdk/provider@0.0.26': + '@ai-sdk/provider@0.0.23': dependencies: json-schema: 0.4.0 @@ -5739,6 +5692,10 @@ snapshots: dependencies: json-schema: 0.4.0 + '@ai-sdk/provider@1.1.2': + dependencies: + json-schema: 0.4.0 + '@ai-sdk/react@0.0.55(react@18.3.1)(zod@3.23.8)': dependencies: '@ai-sdk/provider-utils': 1.0.18(zod@3.23.8) @@ -5748,14 +5705,14 @@ snapshots: react: 18.3.1 zod: 3.23.8 - '@ai-sdk/react@0.0.70(react@18.3.1)(zod@3.23.8)': + '@ai-sdk/react@1.2.8(react@18.3.1)(zod@3.23.8)': dependencies: - '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) - '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + '@ai-sdk/provider-utils': 2.2.6(zod@3.23.8) + '@ai-sdk/ui-utils': 1.2.7(zod@3.23.8) + react: 18.3.1 swr: 2.2.5(react@18.3.1) throttleit: 2.1.0 optionalDependencies: - react: 18.3.1 zod: 3.23.8 '@ai-sdk/solid@0.0.44(zod@3.23.8)': @@ -5765,13 +5722,6 @@ snapshots: transitivePeerDependencies: - zod - '@ai-sdk/solid@0.0.54(zod@3.23.8)': - dependencies: - '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) - '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) - transitivePeerDependencies: - - zod - '@ai-sdk/svelte@0.0.46(svelte@4.2.18)(zod@3.23.8)': dependencies: '@ai-sdk/provider-utils': 1.0.18(zod@3.23.8) @@ -5782,16 +5732,6 @@ snapshots: transitivePeerDependencies: - zod - '@ai-sdk/svelte@0.0.57(svelte@4.2.18)(zod@3.23.8)': - dependencies: - '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) - '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) - sswr: 2.1.0(svelte@4.2.18) - optionalDependencies: - svelte: 4.2.18 - transitivePeerDependencies: - - zod - '@ai-sdk/ui-utils@0.0.41(zod@3.23.8)': dependencies: '@ai-sdk/provider': 0.0.23 @@ -5802,15 +5742,12 @@ snapshots: optionalDependencies: zod: 3.23.8 - '@ai-sdk/ui-utils@0.0.50(zod@3.23.8)': + '@ai-sdk/ui-utils@1.2.7(zod@3.23.8)': dependencies: - '@ai-sdk/provider': 0.0.26 - '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) - json-schema: 0.4.0 - secure-json-parse: 2.7.0 - zod-to-json-schema: 3.23.5(zod@3.23.8) - optionalDependencies: + '@ai-sdk/provider': 1.1.2 + '@ai-sdk/provider-utils': 2.2.6(zod@3.23.8) zod: 3.23.8 + zod-to-json-schema: 3.24.5(zod@3.23.8) '@ai-sdk/vue@0.0.46(vue@3.4.31(typescript@5.6.2))(zod@3.23.8)': dependencies: @@ -5822,16 +5759,6 @@ snapshots: transitivePeerDependencies: - zod - '@ai-sdk/vue@0.0.59(vue@3.4.31(typescript@5.6.2))(zod@3.23.8)': - dependencies: - '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) - '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) - swrv: 1.0.4(vue@3.4.31(typescript@5.6.2)) - optionalDependencies: - vue: 3.4.31(typescript@5.6.2) - transitivePeerDependencies: - - zod - '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -7747,30 +7674,17 @@ snapshots: - solid-js - vue - ai@3.4.33(openai@4.52.3)(react@18.3.1)(sswr@2.1.0(svelte@4.2.18))(svelte@4.2.18)(vue@3.4.31(typescript@5.6.2))(zod@3.23.8): + ai@4.3.5(react@18.3.1)(zod@3.23.8): dependencies: - '@ai-sdk/provider': 0.0.26 - '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) - '@ai-sdk/react': 0.0.70(react@18.3.1)(zod@3.23.8) - '@ai-sdk/solid': 0.0.54(zod@3.23.8) - '@ai-sdk/svelte': 0.0.57(svelte@4.2.18)(zod@3.23.8) - '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) - '@ai-sdk/vue': 0.0.59(vue@3.4.31(typescript@5.6.2))(zod@3.23.8) + '@ai-sdk/provider': 1.1.2 + '@ai-sdk/provider-utils': 2.2.6(zod@3.23.8) + '@ai-sdk/react': 1.2.8(react@18.3.1)(zod@3.23.8) + '@ai-sdk/ui-utils': 1.2.7(zod@3.23.8) '@opentelemetry/api': 1.9.0 - eventsource-parser: 1.1.2 - json-schema: 0.4.0 jsondiffpatch: 0.6.0 - secure-json-parse: 2.7.0 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod: 3.23.8 optionalDependencies: - openai: 4.52.3 react: 18.3.1 - sswr: 2.1.0(svelte@4.2.18) - svelte: 4.2.18 - zod: 3.23.8 - transitivePeerDependencies: - - solid-js - - vue ajv@6.12.6: dependencies: @@ -9774,6 +9688,8 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 + nanoid@3.3.11: {} + nanoid@3.3.6: {} nanoid@3.3.7: {} @@ -11132,7 +11048,7 @@ snapshots: dependencies: zod: 3.23.8 - zod-to-json-schema@3.23.5(zod@3.23.8): + zod-to-json-schema@3.24.5(zod@3.23.8): dependencies: zod: 3.23.8