diff --git a/app/api/chat/route.ts b/app/api/chat/route.ts index ba03ff7..9afacb7 100644 --- a/app/api/chat/route.ts +++ b/app/api/chat/route.ts @@ -1,17 +1,9 @@ -import { google } from "@ai-sdk/google"; -import { openai } from "@ai-sdk/openai"; +import { bedrock } from '@ai-sdk/amazon-bedrock'; + import { streamText } from "ai"; import { z } from "zod"; -import { readFileSync } from 'fs'; -import { resolve } from 'path'; - -// Allow streaming responses up to 30 seconds -export const maxDuration = 30; // Read the XML guide from file - -const guide = readFileSync(resolve('./app/api/chat/xml_guide.md'), 'utf8'); - export async function POST(req: Request) { const body = await req.json(); @@ -40,18 +32,10 @@ Core capabilities: - Structure complex systems into clear, organized visual components Note that: -- Always validate XML string integrity before output. - Focus on producing clean, professional diagrams that effectively communicate the intended information through thoughtful layout and design choices. - When artistic drawings are requested, creatively compose them using standard diagram shapes and connectors while maintaining visual clarity. - **Don't** write out the XML string. Just return the XML string in the tool call. - If user asks you to replicate a diagram based on an image, remember to match the diagram style and layout as closely as possible. Especially, pay attention to the lines and shapes, for example, if the lines are straight or curved, and if the shapes are rounded or square. - - - -Here are the guide of XML format for draw.io: -"""md -${guide} -""" `; const lastMessage = messages[messages.length - 1]; @@ -66,11 +50,14 @@ ${lastMessage.content} """`; let enhancedMessages = [{ role: "system", content: systemMessage }, ...messages]; enhancedMessages = [...enhancedMessages.slice(0, -1), { ...lastMessage, content: formattedContent }]; - console.log("Enhanced messages:", enhancedMessages); + // console.log("Enhanced messages:", enhancedMessages); + const result = streamText({ - // model: google("gemini-2.0-flash"), - // model: openai("chatgpt-4o-latest"), - model: openai("gpt-4o"), + // model: google("gemini-2.5-pro-exp-03-25"), + // model: google("gemini-2.0-flash-001"), + // model: openrouter("google/gemini-2.0-flash-exp:free"), + model: bedrock('anthropic.claude-3-5-sonnet-20241022-v2:0'), + // model: openai("gpt-4o"), toolCallStreaming: true, messages: enhancedMessages, tools: { @@ -93,6 +80,5 @@ ${lastMessage.content} }, temperature: 0, }); - return result.toDataStreamResponse(); } diff --git a/components/chat-message-display.tsx b/components/chat-message-display.tsx index 8762f94..a3a7a38 100644 --- a/components/chat-message-display.tsx +++ b/components/chat-message-display.tsx @@ -42,6 +42,7 @@ export function ChatMessageDisplay({ { const currentXml = toolInvocation.args?.xml || ""; + console.log("toolInvocation", toolInvocation); // Increment the step counter // Determine whether to show details based on a simple threshold @@ -54,7 +55,6 @@ export function ChatMessageDisplay({ convertedXml ); onDisplayChart(replacedXML); - // if convertedXml changed } } @@ -69,7 +69,12 @@ export function ChatMessageDisplay({
Tool: display_diagram
- onDisplayChart + Args:{" "} + {JSON.stringify( + toolInvocation.args, + null, + 2 + )}
diff --git a/components/chat-panel.tsx b/components/chat-panel.tsx index 3a807c9..96c23f3 100644 --- a/components/chat-panel.tsx +++ b/components/chat-panel.tsx @@ -14,12 +14,14 @@ import { useChat } from "@ai-sdk/react"; import { ChatInput } from "@/components/chat-input"; import { ChatMessageDisplay } from "./chat-message-display"; import { useDiagram } from "@/contexts/diagram-context"; +import { replaceNodes } from "@/lib/utils"; export default function ChatPanel() { const { loadDiagram: onDisplayChart, handleExport: onExport, resolverRef, + chartXML, clearDiagram, } = useDiagram(); @@ -61,7 +63,7 @@ export default function ChatPanel() { if (toolCall.toolName === "display_diagram") { const { xml } = toolCall.args as { xml: string }; // do nothing because we will handle this streamingly in the ChatMessageDisplay component - // onDisplayChart(xml); + onDisplayChart(replaceNodes(chartXML, xml)); return "Successfully displayed the flowchart."; } }, diff --git a/package-lock.json b/package-lock.json index e919e6a..45c926d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,15 +8,17 @@ "name": "next-ai-draw-io", "version": "0.1.0", "dependencies": { - "@ai-sdk/google": "^1.1.25", + "@ai-sdk/amazon-bedrock": "^2.2.4", + "@ai-sdk/google": "^1.2.5", "@ai-sdk/openai": "^1.2.5", + "@openrouter/ai-sdk-provider": "^0.4.5", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-scroll-area": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", "@vercel/analytics": "^1.5.0", "@xmldom/xmldom": "^0.9.8", - "ai": "^4.1.62", + "ai": "^4.2.11", "base-64": "^1.0.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -41,14 +43,17 @@ "typescript": "^5" } }, - "node_modules/@ai-sdk/google": { - "version": "1.1.25", - "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-1.1.25.tgz", - "integrity": "sha512-4eIssVphgVmAAsrDqWbH+YH0LXgHpXXY7ye7yuxK+fobpDifZ7LLLEwsbjtg9mfjwSUJ4dSyI/L5mlZ1eQqu0A==", + "node_modules/@ai-sdk/amazon-bedrock": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@ai-sdk/amazon-bedrock/-/amazon-bedrock-2.2.4.tgz", + "integrity": "sha512-KaHSwtEVG3CpxZr1wFoJlXQksRni7v9z5IGOju4pGQ2MNfwV6Zq1mmHl8wb2M3w4bb6GC+VpafubkeIRnI+Hrw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.0.11", - "@ai-sdk/provider-utils": "2.1.13" + "@ai-sdk/provider": "1.1.0", + "@ai-sdk/provider-utils": "2.2.3", + "@smithy/eventstream-codec": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "aws4fetch": "^1.0.20" }, "engines": { "node": ">=18" @@ -57,6 +62,80 @@ "zod": "^3.0.0" } }, + "node_modules/@ai-sdk/amazon-bedrock/node_modules/@ai-sdk/provider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.0.tgz", + "integrity": "sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/amazon-bedrock/node_modules/@ai-sdk/provider-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.3.tgz", + "integrity": "sha512-o3fWTzkxzI5Af7U7y794MZkYNEsxbjLam2nxyoUZSScqkacb7vZ3EYHLh21+xCcSSzEC161C7pZAGHtC0hTUMw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.0", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@ai-sdk/google": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-1.2.5.tgz", + "integrity": "sha512-ykSPjYDmaDg7Qblo6Ea6n6O01NpyehZJE0j3+HCYBtUXKXP2RZWesr7XlceIfFBKHd0sumovRtX4ozHrb+1+sw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.0", + "@ai-sdk/provider-utils": "2.2.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + } + }, + "node_modules/@ai-sdk/google/node_modules/@ai-sdk/provider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.0.tgz", + "integrity": "sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/google/node_modules/@ai-sdk/provider-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.3.tgz", + "integrity": "sha512-o3fWTzkxzI5Af7U7y794MZkYNEsxbjLam2nxyoUZSScqkacb7vZ3EYHLh21+xCcSSzEC161C7pZAGHtC0hTUMw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.0", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, "node_modules/@ai-sdk/openai": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.2.5.tgz", @@ -109,13 +188,13 @@ } }, "node_modules/@ai-sdk/react": { - "version": "1.1.23", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.1.23.tgz", - "integrity": "sha512-R+PG9ya0GLs6orzt+1MxmjrWFuZM0gVs+l8ihBr1u+42wwkVeojY4CAtQjW4nrfGTVbdJYkl5y+r/VKfjr42aQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.5.tgz", + "integrity": "sha512-0jOop3S2WkDOdO4X5I+5fTGqZlNX8/h1T1eYokpkR9xh8Vmrxqw8SsovqGvrddTsZykH8uXRsvI+G4FTyy894A==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider-utils": "2.1.13", - "@ai-sdk/ui-utils": "1.1.19", + "@ai-sdk/provider-utils": "2.2.3", + "@ai-sdk/ui-utils": "1.2.4", "swr": "^2.2.5", "throttleit": "2.1.0" }, @@ -124,37 +203,87 @@ }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", - "zod": "^3.0.0" + "zod": "^3.23.8" }, "peerDependenciesMeta": { - "react": { - "optional": true - }, "zod": { "optional": true } } }, - "node_modules/@ai-sdk/ui-utils": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.1.19.tgz", - "integrity": "sha512-rDHy2uxlPMt3jjS9L6mBrsfhEInZ5BVoWevmD13fsAt2s/XWy2OwwKmgmUQkdLlY4mn/eyeYAfDGK8+5CbOAgg==", + "node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.0.tgz", + "integrity": "sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.0.11", - "@ai-sdk/provider-utils": "2.1.13", + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.3.tgz", + "integrity": "sha512-o3fWTzkxzI5Af7U7y794MZkYNEsxbjLam2nxyoUZSScqkacb7vZ3EYHLh21+xCcSSzEC161C7pZAGHtC0hTUMw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.0", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@ai-sdk/ui-utils": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.4.tgz", + "integrity": "sha512-wLTxEZrKZRyBmlVZv8nGXgLBg5tASlqXwbuhoDu0MhZa467ZFREEnosH/OC/novyEHTQXko2zC606xoVbMrUcA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.0", + "@ai-sdk/provider-utils": "2.2.3", "zod-to-json-schema": "^3.24.1" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.23.8" + } + }, + "node_modules/@ai-sdk/ui-utils/node_modules/@ai-sdk/provider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.0.tgz", + "integrity": "sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/ui-utils/node_modules/@ai-sdk/provider-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.3.tgz", + "integrity": "sha512-o3fWTzkxzI5Af7U7y794MZkYNEsxbjLam2nxyoUZSScqkacb7vZ3EYHLh21+xCcSSzEC161C7pZAGHtC0hTUMw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.0", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" } }, "node_modules/@alloc/quick-lru": { @@ -181,6 +310,82 @@ "lru-cache": "^10.4.3" } }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.775.0.tgz", + "integrity": "sha512-ZoGKwa4C9fC9Av6bdfqcW6Ix5ot05F/S4VxWR2nHuMv7hzfmAjTOcUiWT7UR4hM/U0whf84VhDtXN/DWAk52KA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@csstools/color-helpers": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", @@ -389,6 +594,57 @@ "node": ">= 10" } }, + "node_modules/@openrouter/ai-sdk-provider": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-0.4.5.tgz", + "integrity": "sha512-gbCOcSjNhyWlLHyYZX2rIFnpJi3C2RXNyyzJj+d6pMRfTS/mdvEEOsU66KxK9H8Qju2i9YRLOn/FdQT26K7bIQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.0.9", + "@ai-sdk/provider-utils": "2.1.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + } + }, + "node_modules/@openrouter/ai-sdk-provider/node_modules/@ai-sdk/provider": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.9.tgz", + "integrity": "sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@openrouter/ai-sdk-provider/node_modules/@ai-sdk/provider-utils": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.10.tgz", + "integrity": "sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.0.9", + "eventsource-parser": "^3.0.0", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, "node_modules/@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", @@ -916,6 +1172,83 @@ "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", "license": "MIT" }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.2.tgz", + "integrity": "sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.2.0", + "@smithy/util-hex-encoding": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.2.0.tgz", + "integrity": "sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "license": "Apache-2.0" @@ -1280,17 +1613,16 @@ } }, "node_modules/ai": { - "version": "4.1.62", - "resolved": "https://registry.npmjs.org/ai/-/ai-4.1.62.tgz", - "integrity": "sha512-+cEyxjOUUA4IxaPiPhmGSQHVrwFplDLqFADzmK0lRnLgacmtI4j1jWuT0HeqAHM3pVtKPYubbQNDuY1djc934A==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/ai/-/ai-4.2.11.tgz", + "integrity": "sha512-XvYFz+I2MNpkNeso/cEvm2q22cuU7B3EdUxGyhpa94gHbb3HEk73d42+UPJqweSBmoXA52mZ9qvb6jt3P4TITQ==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.0.11", - "@ai-sdk/provider-utils": "2.1.13", - "@ai-sdk/react": "1.1.23", - "@ai-sdk/ui-utils": "1.1.19", + "@ai-sdk/provider": "1.1.0", + "@ai-sdk/provider-utils": "2.2.3", + "@ai-sdk/react": "1.2.5", + "@ai-sdk/ui-utils": "1.2.4", "@opentelemetry/api": "1.9.0", - "eventsource-parser": "^3.0.0", "jsondiffpatch": "0.6.0" }, "engines": { @@ -1298,17 +1630,43 @@ }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", - "zod": "^3.0.0" + "zod": "^3.23.8" }, "peerDependenciesMeta": { "react": { "optional": true - }, - "zod": { - "optional": true } } }, + "node_modules/ai/node_modules/@ai-sdk/provider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.0.tgz", + "integrity": "sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ai/node_modules/@ai-sdk/provider-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.3.tgz", + "integrity": "sha512-o3fWTzkxzI5Af7U7y794MZkYNEsxbjLam2nxyoUZSScqkacb7vZ3EYHLh21+xCcSSzEC161C7pZAGHtC0hTUMw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.0", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, "node_modules/aria-hidden": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", @@ -1327,6 +1685,12 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, + "node_modules/aws4fetch": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/aws4fetch/-/aws4fetch-1.0.20.tgz", + "integrity": "sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==", + "license": "MIT" + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -4160,9 +4524,9 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", - "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4298,9 +4662,9 @@ } }, "node_modules/zod-to-json-schema": { - "version": "3.24.4", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.4.tgz", - "integrity": "sha512-0uNlcvgabyrni9Ag8Vghj21drk7+7tp7VTwwR7KxxXXc/3pbXz2PHlDgj3cICahgF1kHm4dExBFj7BXrZJXzig==", + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", "license": "ISC", "peerDependencies": { "zod": "^3.24.1" diff --git a/package.json b/package.json index daf6625..c6c33bf 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,17 @@ "lint": "next lint" }, "dependencies": { - "@ai-sdk/google": "^1.1.25", + "@ai-sdk/amazon-bedrock": "^2.2.4", + "@ai-sdk/google": "^1.2.5", "@ai-sdk/openai": "^1.2.5", + "@openrouter/ai-sdk-provider": "^0.4.5", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-scroll-area": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", "@vercel/analytics": "^1.5.0", "@xmldom/xmldom": "^0.9.8", - "ai": "^4.1.62", + "ai": "^4.2.11", "base-64": "^1.0.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1",