From d29fbf6eb78deb642c7db9a48df10c6115b54b32 Mon Sep 17 00:00:00 2001 From: Matt Rossman <22670878+mattrossman@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:07:33 -0400 Subject: [PATCH] =?UTF-8?q?feat(assistant):=20upgrade=20AI=20SDK=20v5=20?= =?UTF-8?q?=E2=86=92=20v6=20(#43931)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Upgrades `ai` from v5 to v6 and all related packages. **Package bumps:** - `ai`: `5.0.52` → `^6.0.116` - `@ai-sdk/openai`: `2.0.32` → `^3.0.41` - `@ai-sdk/react`: `2.0.52` → `^3.0.118` - `@ai-sdk/provider`: `^2.0.0` → `^3.0.8` - `@ai-sdk/provider-utils`: `^3.0.0` → `^4.0.19` - `@ai-sdk/amazon-bedrock`: `^3.0.0` → `^4.0.81` - `@ai-sdk/mcp`: N/A → `^1.0.25` - `openai`: bumped to `^4.104.0` - `braintrust`: `3.0.x` → `^3.4.0` **Breaking change migrations:** - `generateObject` removed in v6 — migrated 5 API routes to `generateText` with `Output.object({ schema })`, returning `result.output` - `convertToModelMessages` is now async — added `await` - MCP import path changed: `experimental_createMCPClient` from `ai` → `createMCPClient` from `@ai-sdk/mcp` - `openai()` defaults to Responses API — added `store: false` to provider options for ZDR org compatibility **Streaming fix:** Added `Content-Encoding: none` header to `pipeUIMessageStreamToResponse` calls. Without it, proxy middleware buffers the entire SSE response before flushing, causing the full reply to appear at once. **Zero Data Retention fix:** In recent AI SDK versions, `openai()` default to Responses API instead of the legacy chat completions API. This produces a 404 from OpenAI with message `"Items are not persisted for Zero Data Retention organizations. Remove this item from your input and try again."` The Responses API is OpenAI's [recommended endpoint](https://developers.openai.com/api/docs/guides/migrate-to-responses). This PR adds `store: false` as mentioned in https://github.com/vercel/ai/issues/10060 to avoid incompatible persistence attempts. **References:** - https://ai-sdk.dev/docs/migration-guides/migration-guide-6-0 - https://ai-sdk.dev/docs/troubleshooting/streaming-not-working-when-proxied - https://github.com/vercel/ai/issues/10060 Closes AI-514 Related AI-509 --- .../lib/ai/generate-assistant-response.ts | 2 +- apps/studio/lib/ai/model.utils.ts | 1 + apps/studio/lib/ai/supabase-mcp.ts | 2 +- apps/studio/lib/api/rate.test.ts | 5 +- apps/studio/package.json | 17 +- apps/studio/pages/api/ai/feedback/classify.ts | 12 +- apps/studio/pages/api/ai/feedback/rate.ts | 10 +- apps/studio/pages/api/ai/onboarding/design.ts | 2 +- apps/studio/pages/api/ai/sql/cron-v2.ts | 8 +- apps/studio/pages/api/ai/sql/filter-v1.ts | 8 +- apps/studio/pages/api/ai/sql/generate-v4.ts | 1 + apps/studio/pages/api/ai/sql/title-v2.ts | 8 +- pnpm-lock.yaml | 221 ++++++++++++------ 13 files changed, 193 insertions(+), 104 deletions(-) diff --git a/apps/studio/lib/ai/generate-assistant-response.ts b/apps/studio/lib/ai/generate-assistant-response.ts index d56256eadbe..0a740b37acc 100644 --- a/apps/studio/lib/ai/generate-assistant-response.ts +++ b/apps/studio/lib/ai/generate-assistant-response.ts @@ -137,7 +137,7 @@ export async function generateAssistantResponse({ }, ] : []), - ...convertToModelMessages(messages), + ...(await convertToModelMessages(messages)), ] const streamTextFn = shouldTrace ? tracedStreamText : ai.streamText diff --git a/apps/studio/lib/ai/model.utils.ts b/apps/studio/lib/ai/model.utils.ts index 4fdf7736377..54fc126d775 100644 --- a/apps/studio/lib/ai/model.utils.ts +++ b/apps/studio/lib/ai/model.utils.ts @@ -55,6 +55,7 @@ export const PROVIDERS: ProviderRegistry = { providerOptions: { openai: { reasoningEffort: 'minimal', + store: false, }, }, }, diff --git a/apps/studio/lib/ai/supabase-mcp.ts b/apps/studio/lib/ai/supabase-mcp.ts index 6ab34dc27db..4c22a24681d 100644 --- a/apps/studio/lib/ai/supabase-mcp.ts +++ b/apps/studio/lib/ai/supabase-mcp.ts @@ -1,7 +1,7 @@ import { createSupabaseMcpServer } from '@supabase/mcp-server-supabase' import { createSupabaseApiPlatform } from '@supabase/mcp-server-supabase/platform/api' import { StreamTransport } from '@supabase/mcp-utils' -import { experimental_createMCPClient as createMCPClient } from 'ai' +import { createMCPClient } from '@ai-sdk/mcp' import { API_URL } from 'lib/constants' diff --git a/apps/studio/lib/api/rate.test.ts b/apps/studio/lib/api/rate.test.ts index 499cfd5d0c3..e9d758aad92 100644 --- a/apps/studio/lib/api/rate.test.ts +++ b/apps/studio/lib/api/rate.test.ts @@ -57,11 +57,12 @@ test('rate calls the tool sanitizer', async () => { })) vi.mock('ai', () => ({ - generateObject: vi.fn().mockResolvedValue({ - object: { + generateText: vi.fn().mockResolvedValue({ + output: { category: 'sql_generation', }, }), + Output: { object: vi.fn() }, })) vi.mock('components/ui/AIAssistantPanel/Message.utils', () => ({ diff --git a/apps/studio/package.json b/apps/studio/package.json index 36d3624cf1f..b070359dfee 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -28,11 +28,12 @@ "scorers:deploy": "IS_BRAINTRUST_PUSH=true braintrust push evals/scorer-online.ts" }, "dependencies": { - "@ai-sdk/amazon-bedrock": "^3.0.0", - "@ai-sdk/openai": "2.0.32", - "@ai-sdk/provider": "^2.0.0", - "@ai-sdk/provider-utils": "^3.0.0", - "@ai-sdk/react": "2.0.52", + "@ai-sdk/amazon-bedrock": "^4.0.81", + "@ai-sdk/mcp": "^1.0.25", + "@ai-sdk/openai": "^3.0.41", + "@ai-sdk/provider": "^3.0.8", + "@ai-sdk/provider-utils": "^4.0.19", + "@ai-sdk/react": "^3.0.118", "@aws-sdk/credential-providers": "^3.830.0", "@dagrejs/dagre": "^1.0.4", "@dnd-kit/core": "^6.1.0", @@ -74,7 +75,7 @@ "@vercel/functions": "^2.1.0", "@vitejs/plugin-react": "^4.3.4", "@zip.js/zip.js": "^2.7.29", - "ai": "5.0.52", + "ai": "^6.0.116", "ai-commands": "workspace:*", "awesome-debounce-promise": "^2.1.0", "common": "workspace:*", @@ -106,7 +107,7 @@ "next": "~16.1.7", "next-themes": "^0.3.0", "nuqs": "2.7.1", - "openai": "^4.75.1", + "openai": "^4.104.0", "openapi-fetch": "0.12.4", "papaparse": "^5.3.1", "path-to-regexp": "^8.0.0", @@ -185,7 +186,7 @@ "@vitest/ui": "^3.2.0", "api-types": "workspace:*", "autoevals": "^0.0.132", - "braintrust": "^3.0.0", + "braintrust": "^3.4.0", "common": "workspace:*", "config": "workspace:*", "date-fns": "^2.30.0", diff --git a/apps/studio/pages/api/ai/feedback/classify.ts b/apps/studio/pages/api/ai/feedback/classify.ts index bc673a9aa25..d4427b12d7d 100644 --- a/apps/studio/pages/api/ai/feedback/classify.ts +++ b/apps/studio/pages/api/ai/feedback/classify.ts @@ -1,4 +1,4 @@ -import { generateObject } from 'ai' +import { generateText, Output } from 'ai' import { getModel } from 'lib/ai/model' import apiWrapper from 'lib/api/apiWrapper' import { NextApiRequest, NextApiResponse } from 'next' @@ -41,11 +41,13 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse) { return res.status(500).json({ error: modelError.message }) } - const { object } = await generateObject({ + const { output } = await generateText({ model, providerOptions, - schema: z.object({ - feedback_category: z.enum(['support', 'feedback', 'unknown']), + output: Output.object({ + schema: z.object({ + feedback_category: z.enum(['support', 'feedback', 'unknown']), + }), }), temperature: 0, prompt: ` @@ -97,7 +99,7 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse) { `, }) - return res.json({ feedback_category: object.feedback_category }) + return res.json({ feedback_category: output.feedback_category }) } catch (error) { if (error instanceof Error) { console.error(`Classifying this feedback failed`) diff --git a/apps/studio/pages/api/ai/feedback/rate.ts b/apps/studio/pages/api/ai/feedback/rate.ts index 641f11d469e..18a80e1476a 100644 --- a/apps/studio/pages/api/ai/feedback/rate.ts +++ b/apps/studio/pages/api/ai/feedback/rate.ts @@ -1,4 +1,4 @@ -import { generateObject } from 'ai' +import { generateText, Output } from 'ai' import { currentLogger } from 'braintrust' import { IS_PLATFORM } from 'common' import { rateMessageResponseSchema } from 'components/ui/AIAssistantPanel/Message.utils' @@ -110,10 +110,10 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse) { return res.status(500).json({ error: modelError.message }) } - const { object } = await generateObject({ + const { output } = await generateText({ model, providerOptions, - schema: rateMessageResponseSchema, + output: Output.object({ schema: rateMessageResponseSchema }), prompt: ` Your job is to look at a Supabase Assistant conversation, which the user has given feedback on, and classify it. @@ -148,7 +148,7 @@ Instructions: }) logger?.updateSpan({ id: spanId, - metadata: { feedbackCategory: object.category }, + metadata: { feedbackCategory: output.category }, }) } catch (error) { console.error('Failed to log feedback to Braintrust:', error) @@ -156,7 +156,7 @@ Instructions: } return res.json({ - category: object.category, + category: output.category, }) } catch (error) { if (error instanceof Error) { diff --git a/apps/studio/pages/api/ai/onboarding/design.ts b/apps/studio/pages/api/ai/onboarding/design.ts index 9e12fb09939..465e9aae53c 100644 --- a/apps/studio/pages/api/ai/onboarding/design.ts +++ b/apps/studio/pages/api/ai/onboarding/design.ts @@ -102,5 +102,5 @@ async function handlePost(req: NextApiRequest, res: NextApiResponse) { tools: getTools(), }) - result.pipeUIMessageStreamToResponse(res) + result.pipeUIMessageStreamToResponse(res, { headers: { 'Content-Encoding': 'none' } }) } diff --git a/apps/studio/pages/api/ai/sql/cron-v2.ts b/apps/studio/pages/api/ai/sql/cron-v2.ts index d9344c9a43f..14e435d6171 100644 --- a/apps/studio/pages/api/ai/sql/cron-v2.ts +++ b/apps/studio/pages/api/ai/sql/cron-v2.ts @@ -1,4 +1,4 @@ -import { generateObject } from 'ai' +import { generateText, Output } from 'ai' import { source } from 'common-tags' import { getModel } from 'lib/ai/model' import apiWrapper from 'lib/api/apiWrapper' @@ -46,10 +46,10 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse) { return res.status(500).json({ error: modelError.message }) } - const result = await generateObject({ + const result = await generateText({ model, providerOptions, - schema: cronSchema, + output: Output.object({ schema: cronSchema }), prompt: source` You are a cron syntax expert. Your purpose is to convert natural language time descriptions into valid cron expressions for pg_cron. @@ -88,7 +88,7 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse) { `, }) - return res.json(result.object.cron_expression) + return res.json(result.output.cron_expression) } catch (error) { if (error instanceof Error) { console.error(`AI cron generation failed: ${error.message}`) diff --git a/apps/studio/pages/api/ai/sql/filter-v1.ts b/apps/studio/pages/api/ai/sql/filter-v1.ts index 1f296714c40..fd0ecb294b3 100644 --- a/apps/studio/pages/api/ai/sql/filter-v1.ts +++ b/apps/studio/pages/api/ai/sql/filter-v1.ts @@ -1,4 +1,4 @@ -import { generateObject } from 'ai' +import { generateText, Output } from 'ai' import { source } from 'common-tags' import { getModel } from 'lib/ai/model' import apiWrapper from 'lib/api/apiWrapper' @@ -62,10 +62,10 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse) { options: property.options, })) - const result = await generateObject({ + const result = await generateText({ model, providerOptions, - schema: filterGroupSchema, + output: Output.object({ schema: filterGroupSchema }), prompt: source` You are an expert Postgres filter builder. Convert the user's request into structured filters. @@ -84,7 +84,7 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse) { `, }) - const generatedFilters = result.object + const generatedFilters = result.output if (!validateFilterGroup(generatedFilters, normalizedFilterProperties)) { return res.status(400).json({ diff --git a/apps/studio/pages/api/ai/sql/generate-v4.ts b/apps/studio/pages/api/ai/sql/generate-v4.ts index 27b5e08f592..c8a349421e8 100644 --- a/apps/studio/pages/api/ai/sql/generate-v4.ts +++ b/apps/studio/pages/api/ai/sql/generate-v4.ts @@ -206,6 +206,7 @@ async function handlePost(req: NextApiRequest, res: NextApiResponse, claims?: Jw result.pipeUIMessageStreamToResponse(res, { sendReasoning: true, + headers: { 'Content-Encoding': 'none' }, onError: (error) => { if (error == null) { return 'unknown error' diff --git a/apps/studio/pages/api/ai/sql/title-v2.ts b/apps/studio/pages/api/ai/sql/title-v2.ts index 3c3a3cd6848..f415eeb1da7 100644 --- a/apps/studio/pages/api/ai/sql/title-v2.ts +++ b/apps/studio/pages/api/ai/sql/title-v2.ts @@ -1,4 +1,4 @@ -import { generateObject } from 'ai' +import { generateText, Output } from 'ai' import { source } from 'common-tags' import { getModel } from 'lib/ai/model' import apiWrapper from 'lib/api/apiWrapper' @@ -51,10 +51,10 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse) { return res.status(500).json({ error: modelError.message }) } - const result = await generateObject({ + const result = await generateText({ model, providerOptions, - schema: titleSchema, + output: Output.object({ schema: titleSchema }), prompt: source` Generate a short title and summarized description for this Postgres SQL snippet: @@ -64,7 +64,7 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse) { `, }) - return res.json(result.object) + return res.json(result.output) } catch (error) { if (error instanceof Error) { console.error(`AI title generation failed: ${error.message}`) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc3f6b1da7b..11428831975 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -757,20 +757,23 @@ importers: apps/studio: dependencies: '@ai-sdk/amazon-bedrock': - specifier: ^3.0.0 - version: 3.0.0(zod@3.25.76) + specifier: ^4.0.81 + version: 4.0.81(zod@3.25.76) + '@ai-sdk/mcp': + specifier: ^1.0.25 + version: 1.0.25(zod@3.25.76) '@ai-sdk/openai': - specifier: 2.0.32 - version: 2.0.32(zod@3.25.76) + specifier: ^3.0.41 + version: 3.0.41(zod@3.25.76) '@ai-sdk/provider': - specifier: ^2.0.0 - version: 2.0.0 + specifier: ^3.0.8 + version: 3.0.8 '@ai-sdk/provider-utils': - specifier: ^3.0.0 - version: 3.0.0(zod@3.25.76) + specifier: ^4.0.19 + version: 4.0.19(zod@3.25.76) '@ai-sdk/react': - specifier: 2.0.52 - version: 2.0.52(react@18.3.1)(zod@3.25.76) + specifier: ^3.0.118 + version: 3.0.118(react@18.3.1)(zod@3.25.76) '@aws-sdk/credential-providers': specifier: ^3.830.0 version: 3.830.0 @@ -895,8 +898,8 @@ importers: specifier: ^2.7.29 version: 2.7.30 ai: - specifier: 5.0.52 - version: 5.0.52(zod@3.25.76) + specifier: ^6.0.116 + version: 6.0.116(zod@3.25.76) ai-commands: specifier: workspace:* version: link:../../packages/ai-commands @@ -991,7 +994,7 @@ importers: specifier: 2.7.1 version: 2.7.1(@tanstack/react-router@1.158.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@16.1.7(@babel/core@7.29.0(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) openai: - specifier: ^4.75.1 + specifier: ^4.104.0 version: 4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.76) openapi-fetch: specifier: 0.12.4 @@ -1223,8 +1226,8 @@ importers: specifier: ^0.0.132 version: 0.0.132(ws@8.18.3) braintrust: - specifier: ^3.0.0 - version: 3.0.0(@aws-sdk/credential-provider-web-identity@3.830.0)(supports-color@8.1.1)(zod@3.25.76) + specifier: ^3.4.0 + version: 3.4.0(@aws-sdk/credential-provider-web-identity@3.830.0)(supports-color@8.1.1)(zod@3.25.76) date-fns: specifier: ^2.30.0 version: 2.30.0 @@ -2808,17 +2811,17 @@ packages: '@adobe/css-tools@4.4.0': resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} - '@ai-sdk/amazon-bedrock@3.0.0': - resolution: {integrity: sha512-OxNmyYRf7pY8NK69dAqpoewKtUhY/HUbpa6TDhp9zcgVmQJmhky8Q7HDetdiqopb2Pe3NB/f1nZVI73nin3qng==} + '@ai-sdk/amazon-bedrock@4.0.81': + resolution: {integrity: sha512-SP3LIpFt/JlK0sGs6E5jvjySvQqu/nqA942PehIGk3PZPJ5SMPsUNg+PYTs84PTUYEg8rr4XqkQOTNFq12zo2w==} engines: {node: '>=18'} peerDependencies: - zod: ^3.25.76 || ^4 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@2.0.0': - resolution: {integrity: sha512-uyyaO4KhxoIKZztREqLPh+6/K3ZJx/rp72JKoUEL9/kC+vfQTThUfPnY/bUryUpcnawx8IY/tSoYNOi/8PCv7w==} + '@ai-sdk/anthropic@3.0.62': + resolution: {integrity: sha512-CkShXR8tmNO7QQnvpKbSMe2Vr1zUUcpqlp69iR+DYrbHm+tDJO9u6zZsjEHjcoRU9/e9z++p0W6NiuLC3aZ4Bg==} engines: {node: '>=18'} peerDependencies: - zod: ^3.25.76 || ^4 + zod: ^3.25.76 || ^4.1.8 '@ai-sdk/gateway@1.0.29': resolution: {integrity: sha512-o9LtmBiG2WAgs3GAmL79F8idan/UupxHG8Tyr2gP4aUSOzflM0bsvfzozBp8x6WatQnOx+Pio7YNw45Y6I16iw==} @@ -2826,17 +2829,29 @@ packages: peerDependencies: zod: ^3.25.76 || ^4 + '@ai-sdk/gateway@3.0.66': + resolution: {integrity: sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/mcp@1.0.25': + resolution: {integrity: sha512-vMlXUPGHGDE2vzLcPR8sw7Dhz2OBjtPU5lB+lIuC1hNQo4REuUC08P0e96/hzBKf4oQYJ8Zo6uP8AG2qThyFbg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/openai@2.0.2': resolution: {integrity: sha512-D4zYz2uR90aooKQvX1XnS00Z7PkbrcY+snUvPfm5bCabTG7bzLrVtD56nJ5bSaZG8lmuOMfXpyiEEArYLyWPpw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4 - '@ai-sdk/openai@2.0.32': - resolution: {integrity: sha512-p7giSkCs66Q1qYO/NPYI41CrSg65mcm8R2uAdF86+Y1D1/q4mUrWMyf5UTOJ0bx/z4jIPiNgGDCg2Kabi5zrKQ==} + '@ai-sdk/openai@3.0.41': + resolution: {integrity: sha512-IZ42A+FO+vuEQCVNqlnAPYQnnUpUfdJIwn1BEDOBywiEHa23fw7PahxVtlX9zm3/zMvTW4JKPzWyvAgDu+SQ2A==} engines: {node: '>=18'} peerDependencies: - zod: ^3.25.76 || ^4 + zod: ^3.25.76 || ^4.1.8 '@ai-sdk/provider-utils@3.0.0': resolution: {integrity: sha512-BoQZtGcBxkeSH1zK+SRYNDtJPIPpacTeiMZqnG4Rv6xXjEwM0FH4MGs9c+PlhyEWmQCzjRM2HAotEydFhD4dYw==} @@ -2850,6 +2865,18 @@ packages: peerDependencies: zod: ^3.25.76 || ^4 + '@ai-sdk/provider-utils@4.0.19': + resolution: {integrity: sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@4.0.20': + resolution: {integrity: sha512-gpUIj9uDhIGbuo9afKEgQ074BWmhvK4THJAAeBjRnroTy2yQYo6rbtGD7pQDMZM8ouXPYmT/SCdkWVJ0KcpX8A==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider@1.1.3': resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} engines: {node: '>=18'} @@ -2858,15 +2885,15 @@ packages: resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} - '@ai-sdk/react@2.0.52': - resolution: {integrity: sha512-4/i40pykN4gTGH264+k1g4tMGdw4xN7vZ1qESFCIm/lhS/8YiJPYheBOk9c349hytOT1sGxp3UNPcOWzWS0H2A==} + '@ai-sdk/provider@3.0.8': + resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} + engines: {node: '>=18'} + + '@ai-sdk/react@3.0.118': + resolution: {integrity: sha512-fBAix8Jftxse6/2YJnOFkwW1/O6EQK4DK68M9DlFmZGAzBmsaHXEPVS77sVIlkaOWCy11bE7434NAVXRY+3OsQ==} engines: {node: '>=18'} peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.25.76 || ^4 - peerDependenciesMeta: - zod: - optional: true + react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} @@ -2889,6 +2916,9 @@ packages: '@apm-js-collab/code-transformer@0.8.2': resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==} + '@apm-js-collab/code-transformer@0.9.0': + resolution: {integrity: sha512-cfHtufVUBKJz6se/tQBJqizgoot5AOxhVy5B9Cuo493p6b7hXKBEIi6tcZEbr4XwN1VnV9JZOu52MMTCOCSBMw==} + '@apm-js-collab/tracing-hooks@0.3.1': resolution: {integrity: sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==} @@ -8321,6 +8351,9 @@ packages: '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@stitches/core@1.2.8': resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} @@ -9291,6 +9324,10 @@ packages: resolution: {integrity: sha512-OTe0KE37F5Y2eTys6eMnfopC+P4qr2ooXUTFyFPTplYSPwowmFk/HLD1FXtbKLjqsIH0SgekcJWad+C5uX4nkg==} engines: {node: '>=16'} + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + engines: {node: '>= 20'} + '@vitejs/plugin-react@4.3.4': resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} engines: {node: ^14.18.0 || >=16.0.0} @@ -9619,6 +9656,12 @@ packages: peerDependencies: zod: ^3.25.76 || ^4 + ai@6.0.116: + resolution: {integrity: sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -10021,8 +10064,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - braintrust@3.0.0: - resolution: {integrity: sha512-mhpflunGgPhZC8wJxP6GPPcrFNIDgO0E77Gy/hkxSlIUaLpszfxLgQAIESccdbjH+x+PHUDiJiMIgDxNpagVHg==} + braintrust@3.4.0: + resolution: {integrity: sha512-LsyvraUPcW+EAiUd7N5iMePrHk4n0LJ3/S4DiBljj2pLsDSavic987RPStS9L6cJG6qXc6BKCwKaLQf/1JaPuQ==} hasBin: true peerDependencies: zod: ^3.25.34 || ^4.0 @@ -10987,6 +11030,9 @@ packages: sqlite3: optional: true + dc-browser@1.0.3: + resolution: {integrity: sha512-B2PJFzWouEPzc+jLo+yTgUXaVz0eZjVsfKX9CnUDzezsluxOKOjllBpw0EJJ1KNJGnNzKpZ4dDYtd+jVp0KRNA==} + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -11827,10 +11873,6 @@ packages: resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==} engines: {node: '>=14.18'} - eventsource-parser@3.0.3: - resolution: {integrity: sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==} - engines: {node: '>=20.0.0'} - eventsource-parser@3.0.6: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} @@ -18173,11 +18215,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - use-sync-external-store@1.5.0: - resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: @@ -18831,20 +18868,20 @@ snapshots: '@adobe/css-tools@4.4.0': {} - '@ai-sdk/amazon-bedrock@3.0.0(zod@3.25.76)': + '@ai-sdk/amazon-bedrock@4.0.81(zod@3.25.76)': dependencies: - '@ai-sdk/anthropic': 2.0.0(zod@3.25.76) - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.0(zod@3.25.76) + '@ai-sdk/anthropic': 3.0.62(zod@3.25.76) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.20(zod@3.25.76) '@smithy/eventstream-codec': 4.0.4 '@smithy/util-utf8': 4.0.0 aws4fetch: 1.0.20 zod: 3.25.76 - '@ai-sdk/anthropic@2.0.0(zod@3.25.76)': + '@ai-sdk/anthropic@3.0.62(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.0(zod@3.25.76) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.20(zod@3.25.76) zod: 3.25.76 '@ai-sdk/gateway@1.0.29(zod@3.25.76)': @@ -18853,30 +18890,58 @@ snapshots: '@ai-sdk/provider-utils': 3.0.9(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/gateway@3.0.66(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + '@vercel/oidc': 3.1.0 + zod: 3.25.76 + + '@ai-sdk/mcp@1.0.25(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + pkce-challenge: 5.0.0 + zod: 3.25.76 + '@ai-sdk/openai@2.0.2(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.0(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/openai@2.0.32(zod@3.25.76)': + '@ai-sdk/openai@3.0.41(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.9(zod@3.25.76) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) zod: 3.25.76 '@ai-sdk/provider-utils@3.0.0(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 - '@standard-schema/spec': 1.0.0 - eventsource-parser: 3.0.3 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 zod: 3.25.76 zod-to-json-schema: 3.24.5(zod@3.25.76) '@ai-sdk/provider-utils@3.0.9(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 - '@standard-schema/spec': 1.0.0 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + '@ai-sdk/provider-utils@4.0.19(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + '@ai-sdk/provider-utils@4.0.20(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 3.25.76 @@ -18888,15 +18953,19 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@2.0.52(react@18.3.1)(zod@3.25.76)': + '@ai-sdk/provider@3.0.8': dependencies: - '@ai-sdk/provider-utils': 3.0.9(zod@3.25.76) - ai: 5.0.52(zod@3.25.76) + json-schema: 0.4.0 + + '@ai-sdk/react@3.0.118(react@18.3.1)(zod@3.25.76)': + dependencies: + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + ai: 6.0.116(zod@3.25.76) react: 18.3.1 swr: 2.2.5(react@18.3.1) throttleit: 2.1.0 - optionalDependencies: - zod: 3.25.76 + transitivePeerDependencies: + - zod '@alloc/quick-lru@5.2.0': {} @@ -18921,6 +18990,8 @@ snapshots: '@apm-js-collab/code-transformer@0.8.2': {} + '@apm-js-collab/code-transformer@0.9.0': {} + '@apm-js-collab/tracing-hooks@0.3.1(supports-color@8.1.1)': dependencies: '@apm-js-collab/code-transformer': 0.8.2 @@ -25735,6 +25806,8 @@ snapshots: '@standard-schema/spec@1.0.0': {} + '@standard-schema/spec@1.1.0': {} + '@stitches/core@1.2.8': {} '@stripe/react-stripe-js@3.7.0(@stripe/stripe-js@7.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -26929,6 +27002,8 @@ snapshots: satori: 0.10.9 yoga-wasm-web: 0.3.3 + '@vercel/oidc@3.1.0': {} + '@vitejs/plugin-react@4.3.4(supports-color@8.1.1)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@babel/core': 7.29.0(supports-color@8.1.1) @@ -27382,6 +27457,14 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 3.25.76 + ai@6.0.116(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 3.0.66(zod@3.25.76) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 @@ -27842,9 +27925,10 @@ snapshots: dependencies: fill-range: 7.1.1 - braintrust@3.0.0(@aws-sdk/credential-provider-web-identity@3.830.0)(supports-color@8.1.1)(zod@3.25.76): + braintrust@3.4.0(@aws-sdk/credential-provider-web-identity@3.830.0)(supports-color@8.1.1)(zod@3.25.76): dependencies: '@ai-sdk/provider': 1.1.3 + '@apm-js-collab/code-transformer': 0.9.0 '@next/env': 14.2.35 '@vercel/functions': 1.6.0(@aws-sdk/credential-provider-web-identity@3.830.0) ajv: 8.18.0 @@ -27854,6 +27938,7 @@ snapshots: cli-progress: 3.12.0 cli-table3: 0.6.5 cors: 2.8.5 + dc-browser: 1.0.3 dotenv: 16.5.0 esbuild: 0.25.2 eventsource-parser: 1.1.2 @@ -27861,14 +27946,16 @@ snapshots: graceful-fs: 4.2.11 http-errors: 2.0.1 minimatch: 9.0.7 + module-details-from-path: 1.0.4 mustache: 4.2.0 pluralize: 8.0.0 simple-git: 3.32.3(supports-color@8.1.1) source-map: 0.7.6 termi-link: 1.1.0 + unplugin: 2.3.10 uuid: 9.0.1 zod: 3.25.76 - zod-to-json-schema: 3.25.0(zod@3.25.76) + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - '@aws-sdk/credential-provider-web-identity' - supports-color @@ -28969,6 +29056,8 @@ snapshots: '@electric-sql/pglite': 0.2.15 drizzle-orm: 0.44.7(@electric-sql/pglite@0.2.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(pg@8.16.3) + dc-browser@1.0.3: {} + de-indent@1.0.2: {} debounce-promise@3.1.2: {} @@ -29801,8 +29890,6 @@ snapshots: eventsource-parser@1.1.2: {} - eventsource-parser@3.0.3: {} - eventsource-parser@3.0.6: {} eventsource@3.0.7: @@ -36978,7 +37065,7 @@ snapshots: dependencies: client-only: 0.0.1 react: 18.3.1 - use-sync-external-store: 1.5.0(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) symbol-tree@3.2.4: {} @@ -37764,10 +37851,6 @@ snapshots: dependencies: react: 18.3.1 - use-sync-external-store@1.5.0(react@18.3.1): - dependencies: - react: 18.3.1 - use-sync-external-store@1.6.0(react@18.3.1): dependencies: react: 18.3.1