From 16f543a608b6c33f7e016852f464936bf7236939 Mon Sep 17 00:00:00 2001 From: Tim Mok Date: Tue, 2 Dec 2025 16:04:10 -0500 Subject: [PATCH 1/3] Update packages to AI SDK 5 --- .../positron-assistant/package-lock.json | 1094 ++++++++++++----- extensions/positron-assistant/package.json | 18 +- 2 files changed, 779 insertions(+), 333 deletions(-) diff --git a/extensions/positron-assistant/package-lock.json b/extensions/positron-assistant/package-lock.json index 2fb80c378ad7..074ee6e3d445 100644 --- a/extensions/positron-assistant/package-lock.json +++ b/extensions/positron-assistant/package-lock.json @@ -16,21 +16,21 @@ "yaml": "^2.8.1" }, "devDependencies": { - "@ai-sdk/amazon-bedrock": "2.2.12", - "@ai-sdk/anthropic": "^1.0.5", - "@ai-sdk/azure": "^1.1.9", - "@ai-sdk/google": "^1.1.17", - "@ai-sdk/google-vertex": "^2.1.8", - "@ai-sdk/mistral": "^1.1.6", - "@ai-sdk/openai": "^1.0.8", + "@ai-sdk/amazon-bedrock": "^3.0.65", + "@ai-sdk/anthropic": "^2.0.53", + "@ai-sdk/azure": "^2.0.78", + "@ai-sdk/google": "^2.0.44", + "@ai-sdk/google-vertex": "^3.0.85", + "@ai-sdk/mistral": "^2.0.25", + "@ai-sdk/openai": "^2.0.76", "@aws-sdk/credential-providers": "^3.734.0", "@eslint/js": "^9.13.0", - "@openrouter/ai-sdk-provider": "^0.0.6", + "@openrouter/ai-sdk-provider": "^1.3.0", "@stylistic/eslint-plugin": "^2.9.0", "@types/mocha": "^9.1.0", "@types/node": "^20", "@types/sinon": "^17.0.3", - "ai": "^4.3.19", + "ai": "^5.0.106", "eslint": "^9.13.0", "google-auth-library": "^9.15.1", "mocha": "^9.2.1", @@ -46,14 +46,15 @@ } }, "node_modules/@ai-sdk/amazon-bedrock": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/@ai-sdk/amazon-bedrock/-/amazon-bedrock-2.2.12.tgz", - "integrity": "sha512-m8gARnh45pr1s08Uu4J/Pm8913mwJPejPOm59b+kUqMsP9ilhUtH/bp8432Ra/v+vHuMoBrglG2ZvXtctAaH2g==", + "version": "3.0.65", + "resolved": "https://registry.npmjs.org/@ai-sdk/amazon-bedrock/-/amazon-bedrock-3.0.65.tgz", + "integrity": "sha512-E5KJv9OvLJitwPo6GnTgYdssTjEbwVW08TXqaQE2C6hfpg6XdwMXc7BJvQ97eXogGETAyFSS0irDYsbA90rB+g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8", + "@ai-sdk/anthropic": "2.0.53", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" @@ -62,13 +63,13 @@ "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4.1.8" } }, "node_modules/@ai-sdk/amazon-bedrock/node_modules/@ai-sdk/provider": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", - "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -79,116 +80,142 @@ } }, "node_modules/@ai-sdk/amazon-bedrock/node_modules/@ai-sdk/provider-utils": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", - "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "nanoid": "^3.3.8", - "secure-json-parse": "^2.7.0" + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.23.8" + "zod": "^3.25.76 || ^4.1.8" } }, "node_modules/@ai-sdk/anthropic": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-1.1.6.tgz", - "integrity": "sha512-4TZBg2VoU/F58DmnyfPPGU9wMUTwLP15XyAFSrUqk9sSdjszwcojXw3LE7YbxifZ+RK7wT7lTkuyK1k2UdfFng==", + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.53.tgz", + "integrity": "sha512-ih7NV+OFSNWZCF+tYYD7ovvvM+gv7TRKQblpVohg2ipIwC9Y0TirzocJVREzZa/v9luxUwFbsPji++DUDWWxsg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.0.7", - "@ai-sdk/provider-utils": "2.1.6" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/azure": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@ai-sdk/azure/-/azure-1.1.9.tgz", - "integrity": "sha512-bQL/HGsj8NndoXomgZ7m3LVj/hyRy3alTZNPT8OkUL24Uj3P0mWad4sejaRdSVLr2joBb74YqQ2jlMvRGGG/bw==", + "node_modules/@ai-sdk/anthropic/node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/openai": "1.1.9", - "@ai-sdk/provider": "1.0.7", - "@ai-sdk/provider-utils": "2.1.6" + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/anthropic/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/google": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-1.1.17.tgz", - "integrity": "sha512-LFdRO+BMUagDplhZExOSr0cfmnoeV1s/gxpIsqt/AWCYnqY/dYGT74nhjbQ+rILeoE8vwnwUu/7OOZexhccm9A==", + "node_modules/@ai-sdk/azure": { + "version": "2.0.78", + "resolved": "https://registry.npmjs.org/@ai-sdk/azure/-/azure-2.0.78.tgz", + "integrity": "sha512-g/zroxY9UaXP1nOK9UFiArpme1Cce5vFzsL+z7eWHf2B4f+VN2aOQ9+TC0phc2C7brUXTXwzZLg/z0tDoVZDdQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.0.9", - "@ai-sdk/provider-utils": "2.1.10" + "@ai-sdk/openai": "2.0.76", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/google-vertex": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-2.1.8.tgz", - "integrity": "sha512-WeXFjDd7rzI02r7ggJKXIjSgIvyeY/Jk6luI+WIp41hYBZUlkA3YJYNRQNxWq+7mDCii2EfRt4KVnNv+MReJ1Q==", + "node_modules/@ai-sdk/azure/node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/anthropic": "1.1.6", - "@ai-sdk/google": "1.1.8", - "@ai-sdk/provider": "1.0.7", - "@ai-sdk/provider-utils": "2.1.6", - "google-auth-library": "^9.15.0" + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/azure/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/google-vertex/node_modules/@ai-sdk/google": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-1.1.8.tgz", - "integrity": "sha512-8ZOS4p8Qp/7fXWnwNizlFN5aTBu4u3pNlsc7LDFGUtuJXz6j/pAQhqBh3nEaagX3GNuDFT8rxZ1yu82+fYaRpA==", + "node_modules/@ai-sdk/gateway": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.18.tgz", + "integrity": "sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.0.7", - "@ai-sdk/provider-utils": "2.1.6" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@vercel/oidc": "3.0.5" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/google/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==", + "node_modules/@ai-sdk/gateway/node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -198,68 +225,65 @@ "node": ">=18" } }, - "node_modules/@ai-sdk/google/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==", + "node_modules/@ai-sdk/gateway/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", "dev": true, "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" + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/mistral": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@ai-sdk/mistral/-/mistral-1.1.6.tgz", - "integrity": "sha512-HrZGZuf1BLcYurpysYepYp4ntmzRMAoWcazXtv+Gv/2cNlqj1yKj9Mso4LSgGp7+99gDB8l5qTcvjzpcNc0Xbg==", + "node_modules/@ai-sdk/google": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-2.0.44.tgz", + "integrity": "sha512-c5dck36FjqiVoeeMJQLTEmUheoURcGTU/nBT6iJu8/nZiKFT/y8pD85KMDRB7RerRYaaQOtslR2d6/5PditiRw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.0.7", - "@ai-sdk/provider-utils": "2.1.6" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/openai": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.1.9.tgz", - "integrity": "sha512-t/CpC4TLipdbgBJTMX/otzzqzCMBSPQwUOkYPGbT/jyuC86F+YO9o+LS0Ty2pGUE1kyT+B3WmJ318B16ZCg4hw==", + "node_modules/@ai-sdk/google-vertex": { + "version": "3.0.85", + "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-3.0.85.tgz", + "integrity": "sha512-FOoPNdkXp3QE9F93HKD11YdS+ONNijacOH80bNKZSAFNIcxSQ+0UOW46b9OxCV576SP2DAuU1FSD4z6hhhMkrg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.0.7", - "@ai-sdk/provider-utils": "2.1.6" + "@ai-sdk/anthropic": "2.0.53", + "@ai-sdk/google": "2.0.44", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "google-auth-library": "^10.5.0" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/provider": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.7.tgz", - "integrity": "sha512-q1PJEZ0qD9rVR+8JFEd01/QM++csMT5UVwYXSN2u54BrVw/D8TZLTeg2FEfKK00DgAx0UtWd8XOhhwITP9BT5g==", + "node_modules/@ai-sdk/google-vertex/node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -269,59 +293,169 @@ "node": ">=18" } }, - "node_modules/@ai-sdk/provider-utils": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.6.tgz", - "integrity": "sha512-Pfyaj0QZS22qyVn5Iz7IXcJ8nKIKlu2MeSAdKJzTwkAks7zdLaKVB+396Rqcp1bfQnxl7vaduQVMQiXUrgK8Gw==", + "node_modules/@ai-sdk/google-vertex/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.0.7", - "eventsource-parser": "^3.0.0", - "nanoid": "^3.3.8", - "secure-json-parse": "^2.7.0" + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/google-vertex/node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } + "engines": { + "node": ">=18" } }, - "node_modules/@ai-sdk/react": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", - "integrity": "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==", + "node_modules/@ai-sdk/google-vertex/node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider-utils": "2.2.8", - "@ai-sdk/ui-utils": "1.2.11", - "swr": "^2.2.5", - "throttleit": "2.1.0" + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/google-vertex/node_modules/google-auth-library": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", + "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^8.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/google-vertex/node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@ai-sdk/google-vertex/node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/google-vertex/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@ai-sdk/google/node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "dev": true, + "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": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" }, "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "zod": "^3.23.8" + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/mistral": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/@ai-sdk/mistral/-/mistral-2.0.25.tgz", + "integrity": "sha512-JRlmXAgG/vuB3ojWjkGzN5W8ZYM8GX6dEkTFJX5sC1NwDgzfiTBIMDeQ/RA6dYZ06OIXtBZTt4oaruP+1xc92g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", - "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "node_modules/@ai-sdk/mistral/node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -331,46 +465,45 @@ "node": ">=18" } }, - "node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider-utils": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", - "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "node_modules/@ai-sdk/mistral/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "nanoid": "^3.3.8", - "secure-json-parse": "^2.7.0" + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.23.8" + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/ui-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", - "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", + "node_modules/@ai-sdk/openai": { + "version": "2.0.76", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.76.tgz", + "integrity": "sha512-ryUkhTDVxe3D1GSAGc94vPZsJlSY8ZuBDLkpf4L81Dm7Ik5AgLfhQrZa8+0hD4kp0dxdVaIoxhpa3QOt1CmncA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8", - "zod-to-json-schema": "^3.24.1" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.23.8" + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/ui-utils/node_modules/@ai-sdk/provider": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", - "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "node_modules/@ai-sdk/openai/node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -380,14 +513,46 @@ "node": ">=18" } }, - "node_modules/@ai-sdk/ui-utils/node_modules/@ai-sdk/provider-utils": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", - "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "node_modules/@ai-sdk/openai/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.7.tgz", + "integrity": "sha512-q1PJEZ0qD9rVR+8JFEd01/QM++csMT5UVwYXSN2u54BrVw/D8TZLTeg2FEfKK00DgAx0UtWd8XOhhwITP9BT5g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.6.tgz", + "integrity": "sha512-Pfyaj0QZS22qyVn5Iz7IXcJ8nKIKlu2MeSAdKJzTwkAks7zdLaKVB+396Rqcp1bfQnxl7vaduQVMQiXUrgK8Gw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.0.7", + "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, @@ -395,7 +560,12 @@ "node": ">=18" }, "peerDependencies": { - "zod": "^3.23.8" + "zod": "^3.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } } }, "node_modules/@anthropic-ai/sdk": { @@ -1396,6 +1566,109 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1457,75 +1730,49 @@ } }, "node_modules/@openrouter/ai-sdk-provider": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-0.0.6.tgz", - "integrity": "sha512-gQY8xIAjL+KnralHetMhNRcSf0Xx2gRSKUQNadXSXQhcrSnjT53qJtYELLSR1elkOCiDkggV4ce7ROqDYOaJ+w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-1.3.0.tgz", + "integrity": "sha512-l19chPX+YzD28IpmMMN3K2mYOInJtbWDLSjwSW4Ryhqnk37D3NW+0lUVjotlOI0+0QajoNfI3ubc3UVpSSU5oA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "0.0.26", - "@ai-sdk/provider-utils": "1.0.22" + "@openrouter/sdk": "^0.1.27" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "ai": "^5.0.0", + "zod": "^3.24.1 || ^v4" } }, - "node_modules/@openrouter/ai-sdk-provider/node_modules/@ai-sdk/provider": { - "version": "0.0.26", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-0.0.26.tgz", - "integrity": "sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==", + "node_modules/@openrouter/sdk": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/@openrouter/sdk/-/sdk-0.1.27.tgz", + "integrity": "sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" + "zod": "^3.25.0 || ^4.0.0" } }, - "node_modules/@openrouter/ai-sdk-provider/node_modules/@ai-sdk/provider-utils": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.22.tgz", - "integrity": "sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==", + "node_modules/@opentelemetry/api": { + "version": "1.9.0", "dev": true, "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "0.0.26", - "eventsource-parser": "^1.1.2", - "nanoid": "^3.3.7", - "secure-json-parse": "^2.7.0" - }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } + "node": ">=8.0.0" } }, - "node_modules/@openrouter/ai-sdk-provider/node_modules/eventsource-parser": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz", - "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": ">=14.18" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" + "node": ">=14" } }, "node_modules/@sinonjs/commons": { @@ -2197,6 +2444,13 @@ "node": ">=18.0.0" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@stylistic/eslint-plugin": { "version": "2.10.1", "dev": true, @@ -2243,11 +2497,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/diff-match-patch": { - "version": "1.0.36", - "dev": true, - "license": "MIT" - }, "node_modules/@types/estree": { "version": "1.0.6", "dev": true, @@ -2506,6 +2755,16 @@ "dev": true, "license": "ISC" }, + "node_modules/@vercel/oidc": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", + "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, "node_modules/@vscode/prompt-tsx": { "version": "0.4.0-alpha.5", "resolved": "https://registry.npmjs.org/@vscode/prompt-tsx/-/prompt-tsx-0.4.0-alpha.5.tgz", @@ -2557,36 +2816,28 @@ } }, "node_modules/ai": { - "version": "4.3.19", - "resolved": "https://registry.npmjs.org/ai/-/ai-4.3.19.tgz", - "integrity": "sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==", + "version": "5.0.106", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.106.tgz", + "integrity": "sha512-M5obwavxSJJ3tGlAFqI6eltYNJB0D20X6gIBCFx/KVorb/X1fxVVfiZZpZb+Gslu4340droSOjT0aKQFCarNVg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8", - "@ai-sdk/react": "1.2.12", - "@ai-sdk/ui-utils": "1.2.11", - "@opentelemetry/api": "1.9.0", - "jsondiffpatch": "0.6.0" + "@ai-sdk/gateway": "2.0.18", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@opentelemetry/api": "1.9.0" }, "engines": { "node": ">=18" }, "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } + "zod": "^3.25.76 || ^4.1.8" } }, "node_modules/ai/node_modules/@ai-sdk/provider": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", - "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2597,21 +2848,21 @@ } }, "node_modules/ai/node_modules/@ai-sdk/provider-utils": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", - "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "nanoid": "^3.3.8", - "secure-json-parse": "^2.7.0" + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.23.8" + "zod": "^3.25.76 || ^4.1.8" } }, "node_modules/ajv": { @@ -2934,6 +3185,16 @@ "node": ">= 8" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "4.3.7", "dev": true, @@ -2968,16 +3229,6 @@ "dev": true, "license": "MIT" }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -2988,10 +3239,12 @@ "node": ">=0.3.1" } }, - "node_modules/diff-match-patch": { - "version": "1.0.5", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, - "license": "Apache-2.0" + "license": "MIT" }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", @@ -3181,13 +3434,13 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", - "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "dev": true, "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=18.0.0" } }, "node_modules/extend": { @@ -3273,6 +3526,30 @@ "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "dev": true, @@ -3337,6 +3614,36 @@ "dev": true, "license": "ISC" }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3679,6 +3986,22 @@ "dev": true, "license": "ISC" }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-yaml": { "version": "4.1.0", "dev": true, @@ -3722,33 +4045,6 @@ "dev": true, "license": "MIT" }, - "node_modules/jsondiffpatch": { - "version": "0.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/diff-match-patch": "^1.0.36", - "chalk": "^5.3.0", - "diff-match-patch": "^1.0.5" - }, - "bin": { - "jsondiffpatch": "bin/jsondiffpatch.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/jsondiffpatch/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/just-extend": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", @@ -3843,6 +4139,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -3892,6 +4195,16 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mocha": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", @@ -4054,6 +4367,27 @@ "path-to-regexp": "^6.2.1" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -4160,6 +4494,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4204,6 +4545,23 @@ "node": ">=8" } }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-to-regexp": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", @@ -4324,6 +4682,69 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -4411,6 +4832,19 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/sinon": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", @@ -4455,6 +4889,22 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4468,6 +4918,20 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "dev": true, @@ -4497,33 +4961,6 @@ "node": ">=8" } }, - "node_modules/swr": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", - "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/throttleit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "dev": true, @@ -4674,16 +5111,6 @@ "punycode": "^2.1.0" } }, - "node_modules/use-sync-external-store": { - "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==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -4765,6 +5192,16 @@ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "license": "MIT" }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -4830,6 +5267,25 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4934,16 +5390,6 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } - }, - "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", - "dev": true, - "license": "ISC", - "peerDependencies": { - "zod": "^3.24.1" - } } } } diff --git a/extensions/positron-assistant/package.json b/extensions/positron-assistant/package.json index eb47e8ba2d63..8f8837859d32 100644 --- a/extensions/positron-assistant/package.json +++ b/extensions/positron-assistant/package.json @@ -1012,21 +1012,21 @@ "postinstall": "ts-node scripts/post-install.ts" }, "devDependencies": { - "@ai-sdk/amazon-bedrock": "2.2.12", - "@ai-sdk/anthropic": "^1.0.5", - "@ai-sdk/azure": "^1.1.9", - "@ai-sdk/google": "^1.1.17", - "@ai-sdk/google-vertex": "^2.1.8", - "@ai-sdk/mistral": "^1.1.6", - "@ai-sdk/openai": "^1.0.8", + "@ai-sdk/amazon-bedrock": "^3.0.65", + "@ai-sdk/anthropic": "^2.0.53", + "@ai-sdk/azure": "^2.0.78", + "@ai-sdk/google": "^2.0.44", + "@ai-sdk/google-vertex": "^3.0.85", + "@ai-sdk/mistral": "^2.0.25", + "@ai-sdk/openai": "^2.0.76", "@aws-sdk/credential-providers": "^3.734.0", "@eslint/js": "^9.13.0", - "@openrouter/ai-sdk-provider": "^0.0.6", + "@openrouter/ai-sdk-provider": "^1.3.0", "@stylistic/eslint-plugin": "^2.9.0", "@types/mocha": "^9.1.0", "@types/node": "^20", "@types/sinon": "^17.0.3", - "ai": "^4.3.19", + "ai": "^5.0.106", "eslint": "^9.13.0", "google-auth-library": "^9.15.1", "mocha": "^9.2.1", From b95d0b6261a0181a2e05cfc7e0ce3e44b4fda5f0 Mon Sep 17 00:00:00 2001 From: Tim Mok Date: Wed, 3 Dec 2025 10:29:10 -0500 Subject: [PATCH 2/3] Fix up tool calls --- .../positron-assistant/src/anthropic.ts | 4 +- .../positron-assistant/src/completion.ts | 24 ++--- extensions/positron-assistant/src/models.ts | 58 ++++++------ .../src/openai-fetch-utils.ts | 10 -- extensions/positron-assistant/src/posit.ts | 4 +- extensions/positron-assistant/src/utils.ts | 92 +++++++++++++------ 6 files changed, 108 insertions(+), 84 deletions(-) diff --git a/extensions/positron-assistant/src/anthropic.ts b/extensions/positron-assistant/src/anthropic.ts index 229bac6d4830..ff56cf864599 100644 --- a/extensions/positron-assistant/src/anthropic.ts +++ b/extensions/positron-assistant/src/anthropic.ts @@ -92,7 +92,7 @@ export class AnthropicLanguageModel implements positron.ai.LanguageModelChatProv async provideLanguageModelChatInformation(_options: { silent: boolean }, token: vscode.CancellationToken): Promise { log.debug(`[${this.providerName}] Preparing language model chat information...`); - const models = await this.resolveModels(token) ?? []; + const models = (await this.resolveModels(token)) ?? []; log.debug(`[${this.providerName}] Resolved ${models.length} models.`); return this.filterModels(models); @@ -122,7 +122,7 @@ export class AnthropicLanguageModel implements positron.ai.LanguageModelChatProv const body: Anthropic.MessageStreamParams = { model: model.id, - max_tokens: options.modelOptions?.maxTokens ?? this.maxOutputTokens, + max_tokens: options.modelOptions?.maxOutputTokens ?? this.maxOutputTokens, tools, tool_choice, system, diff --git a/extensions/positron-assistant/src/completion.ts b/extensions/positron-assistant/src/completion.ts index 5b22477b989a..5cd9ee3e3234 100644 --- a/extensions/positron-assistant/src/completion.ts +++ b/extensions/positron-assistant/src/completion.ts @@ -189,7 +189,7 @@ class OpenAILegacyCompletion extends CompletionModel { token: vscode.CancellationToken ): Promise { // Check if the file should be excluded from AI features - if (!await positron.ai.areCompletionsEnabled(document.uri)) { + if (!(await positron.ai.areCompletionsEnabled(document.uri))) { return []; } @@ -376,7 +376,7 @@ class VertexLegacyCompletion extends MistralCompletion { // (Anthropic, OpenAI, Bedrock, OpenRouter, Gemini, Azure) abstract class FimPromptCompletion extends CompletionModel { - protected abstract model: ai.LanguageModelV1; + protected abstract model: ai.LanguageModel; async provideInlineCompletionItems( document: vscode.TextDocument, @@ -385,7 +385,7 @@ abstract class FimPromptCompletion extends CompletionModel { token: vscode.CancellationToken ): Promise { // Check if the file should be excluded from AI features - if (!await positron.ai.areCompletionsEnabled(document.uri)) { + if (!(await positron.ai.areCompletionsEnabled(document.uri))) { return []; } @@ -412,7 +412,7 @@ abstract class FimPromptCompletion extends CompletionModel { messages: [ { role: 'user', content: `${relatedText}\n<|file_separator|>${document.fileName}\n<|fim_prefix|>${prefix}<|fim_suffix|>${suffix}\n<|fim_middle|>` } ], - maxTokens: 128, + maxOutputTokens: 128, temperature: 0.2, stopSequences: ['\n\n', '<|fim_prefix|>', '<|fim_suffix|>', '<|file_separator|>'], abortSignal: signal, @@ -500,7 +500,7 @@ class OpenAICompatibleCompletion extends OpenAICompletion { } class OpenRouterCompletion extends FimPromptCompletion { - protected model: ai.LanguageModelV1; + protected model: ai.LanguageModel; static source: positron.ai.LanguageModelSource = { type: positron.PositronLanguageModelType.Completion, @@ -526,7 +526,7 @@ class OpenRouterCompletion extends FimPromptCompletion { } class AWSCompletion extends FimPromptCompletion { - protected model: ai.LanguageModelV1; + protected model: ai.LanguageModel; static source: positron.ai.LanguageModelSource = { type: positron.PositronLanguageModelType.Completion, @@ -544,15 +544,15 @@ class AWSCompletion extends FimPromptCompletion { constructor(_config: ModelConfig) { super(_config); - // Cast to ai.LanguageModelV1 to satisfy base class type + // Cast to ai.LanguageModel to satisfy base class type this.model = createAmazonBedrock({ credentialProvider: fromNodeProviderChain(), - })(this._config.model) as unknown as ai.LanguageModelV1; + })(this._config.model) as unknown as ai.LanguageModel; } } class VertexCompletion extends FimPromptCompletion { - protected model: ai.LanguageModelV1; + protected model: ai.LanguageModel; static source: positron.ai.LanguageModelSource = { type: positron.PositronLanguageModelType.Completion, @@ -579,7 +579,7 @@ class VertexCompletion extends FimPromptCompletion { } class GoogleCompletion extends FimPromptCompletion { - protected model: ai.LanguageModelV1; + protected model: ai.LanguageModel; static source: positron.ai.LanguageModelSource = { type: positron.PositronLanguageModelType.Completion, @@ -606,7 +606,7 @@ class GoogleCompletion extends FimPromptCompletion { } class AzureCompletion extends FimPromptCompletion { - protected model: ai.LanguageModelV1; + protected model: ai.LanguageModel; static source: positron.ai.LanguageModelSource = { type: positron.PositronLanguageModelType.Completion, @@ -663,7 +663,7 @@ export class CopilotCompletion implements vscode.InlineCompletionItemProvider { token: vscode.CancellationToken ): Promise { // Check if the file should be excluded from AI features - if (!await positron.ai.areCompletionsEnabled(document.uri)) { + if (!(await positron.ai.areCompletionsEnabled(document.uri))) { return []; } return await this._copilotService.inlineCompletion(document, position, context, token); diff --git a/extensions/positron-assistant/src/models.ts b/extensions/positron-assistant/src/models.ts index 8514eef75f7f..1a4f7bba3433 100644 --- a/extensions/positron-assistant/src/models.ts +++ b/extensions/positron-assistant/src/models.ts @@ -136,7 +136,7 @@ class EchoLanguageModel implements positron.ai.LanguageModelChatProvider { async provideLanguageModelChatInformation(options: { silent: boolean }, token: vscode.CancellationToken): Promise { log.debug(`[${this.providerName}] Preparing language model chat information...`); - const models = this.modelListing ?? await this.resolveModels(token) ?? []; + const models = this.modelListing ?? (await this.resolveModels(token)) ?? []; log.debug(`[${this.providerName}] Resolved ${models.length} models.`); return this.filterModels(models); @@ -251,7 +251,7 @@ class EchoLanguageModel implements positron.ai.LanguageModelChatProvider { return applyModelFilters(models, this.provider, this.providerName); } - private getUserPrompt(messages: ai.CoreMessage[]): ai.CoreMessage | undefined { + private getUserPrompt(messages: ai.ModelMessage[]): ai.ModelMessage | undefined { if (messages.length === 0) { return undefined; } @@ -292,7 +292,8 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider public readonly name; public readonly provider; public readonly id; - protected abstract aiProvider: (id: string, options?: Record) => ai.LanguageModelV1; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + protected abstract aiProvider: (id: string, options?: Record) => any; protected aiOptions: Record = {}; protected modelListing?: vscode.LanguageModelChatInformation[]; @@ -367,7 +368,7 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider } catch (error) { const messagePrefix = `[${this.providerName}] '${model}'`; log.warn(`${messagePrefix} Error sending test message: ${JSON.stringify(error, null, 2)}`); - const errorMsg = await this.parseProviderError(error) || + const errorMsg = (await this.parseProviderError(error)) || (ai.AISDKError.isInstance(error) ? error.message : JSON.stringify(error, null, 2)); errors.push(errorMsg); } @@ -381,7 +382,7 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider async provideLanguageModelChatInformation(options: { silent: boolean }, token: vscode.CancellationToken): Promise { log.debug(`[${this.providerName}] Preparing language model chat information...`); - const models = this.modelListing ?? await this.resolveModels(token) ?? []; + const models = this.modelListing ?? (await this.resolveModels(token)) ?? []; return this.filterModels(models); } @@ -406,7 +407,7 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider // Only Anthropic currently supports experimental_content in tool // results. const toolResultExperimentalContent = this.provider === 'anthropic-api' || - aiModel.modelId.includes('anthropic'); + model.id.includes('anthropic'); // Only select Bedrock models support cache breakpoints; specifically, // the Claude 3.5 Sonnet models don't support them. @@ -414,7 +415,7 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider // Consider: it'd be more verbose but we should consider including this information // in the hardcoded model metadata in the model config. const bedrockCacheBreakpoint = this.provider === 'amazon-bedrock' && - !aiModel.modelId.includes('anthropic.claude-3-5'); + !model.id.includes('anthropic.claude-3-5'); // Add system prompt from `modelOptions.system`, if provided. // TODO: Once extensions such as databot no longer use `modelOptions.system`, @@ -427,7 +428,7 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider } // Convert all messages to the Vercel AI format. - const aiMessages: ai.CoreMessage[] = toAIMessage( + const aiMessages: ai.ModelMessage[] = toAIMessage( processedMessages, toolResultExperimentalContent, bedrockCacheBreakpoint @@ -450,7 +451,7 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider } acc[tool.name] = ai.tool({ description: tool.description, - parameters: ai.jsonSchema(input_schema), + inputSchema: ai.jsonSchema(input_schema), }); return acc; }, {}); @@ -459,7 +460,7 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider const modelTools = this._config.toolCalls ? tools : undefined; const requestId = (options.modelOptions as any)?.requestId; - log.info(`[${this.providerName}] [vercel] Start request ${requestId} to ${model.name} [${aiModel.modelId}]: ${aiMessages.length} messages`); + log.info(`[${this.providerName}] [vercel] Start request ${requestId} to ${model.name} [${model.id}]: ${aiMessages.length} messages`); log.debug(`[${this.providerName}] [${model.name}] SEND ${aiMessages.length} messages, ${modelTools ? Object.keys(modelTools).length : 0} tools`); if (modelTools) { log.trace(`[${this.providerName}] tools: ${modelTools ? Object.keys(modelTools).join(', ') : '(none)'}`); @@ -475,10 +476,10 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider const result = ai.streamText({ model: aiModel, messages: aiMessages, - maxSteps: modelOptions.maxSteps ?? 50, + stopWhen: ai.stepCountIs(modelOptions.maxSteps ?? 50), tools: modelTools, abortSignal: signal, - maxTokens: getMaxTokens(aiModel.modelId, 'output', this._config.provider, this._config.maxOutputTokens, this.providerName), + maxOutputTokens: getMaxTokens(model.id, 'output', this._config.provider, this._config.maxOutputTokens, this.providerName), }); let accumulatedTextDeltas: string[] = []; @@ -496,28 +497,28 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider break; } - if (part.type === 'reasoning') { + if (part.type === 'reasoning-delta') { flushAccumulatedTextDeltas(); - log.trace(`[${this.providerName}] [${this._config.name}] RECV reasoning: ${part.textDelta}`); - progress.report(new vscode.LanguageModelTextPart(part.textDelta)); + log.trace(`[${this.providerName}] [${this._config.name}] RECV reasoning: ${part.text}`); + progress.report(new vscode.LanguageModelTextPart(part.text)); } if (part.type === 'text-delta') { - accumulatedTextDeltas.push(part.textDelta); - progress.report(new vscode.LanguageModelTextPart(part.textDelta)); + accumulatedTextDeltas.push(part.text); + progress.report(new vscode.LanguageModelTextPart(part.text)); } if (part.type === 'tool-call') { flushAccumulatedTextDeltas(); - log.trace(`[${this.providerName}] [${this._config.name}] RECV tool-call: ${part.toolCallId} (${part.toolName}) with args: ${JSON.stringify(part.args)}`); - progress.report(new vscode.LanguageModelToolCallPart(part.toolCallId, part.toolName, part.args)); + log.trace(`[${this.providerName}] [${this._config.name}] RECV tool-call: ${part.toolCallId} (${part.toolName}) with args: ${JSON.stringify(part.input)}`); + progress.report(new vscode.LanguageModelToolCallPart(part.toolCallId, part.toolName, part.input)); } if (part.type === 'error') { flushAccumulatedTextDeltas(); const messagePrefix = `[${this.providerName}] [${model.name}]'`; log.warn(`${messagePrefix} RECV error: ${JSON.stringify(part.error, null, 2)}`); - const errorMsg = await this.parseProviderError(part.error) || + const errorMsg = (await this.parseProviderError(part.error)) || (typeof part.error === 'string' ? part.error : JSON.stringify(part.error, null, 2)); throw new Error(`${messagePrefix} Error in chat response: ${errorMsg}`); } @@ -530,7 +531,7 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider const warnings = await result.warnings; if (warnings) { for (const warning of warnings) { - log.warn(`[${this.providerName}] [${aiModel.modelId}] warn: ${warning}`); + log.warn(`[${this.providerName}] [${model.id}] warn: ${warning}`); } } @@ -538,8 +539,8 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider const usage = await result.usage; const metadata = await result.providerMetadata; const tokens: TokenUsage = { - inputTokens: usage.promptTokens, - outputTokens: usage.completionTokens, + inputTokens: usage.inputTokens, + outputTokens: usage.outputTokens, cachedTokens: 0, providerMetadata: metadata, }; @@ -654,7 +655,7 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider id: model.identifier, name: model.name, family: this.provider, - version: this.aiProvider(model.identifier).specificationVersion, + version: 'v2', provider: this.provider, providerName: this.providerName, capabilities: this.capabilities, @@ -668,12 +669,11 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider protected createDefaultModel(): vscode.LanguageModelChatInformation[] { log.info(`[${this.providerName}] No models available; returning default model information.`); - const aiModel = this.aiProvider(this._config.model, this.aiOptions); const modelInfo = createModelInfo({ - id: aiModel.modelId, + id: this._config.model, name: this.name, - family: aiModel.provider, - version: aiModel.specificationVersion, + family: this._config.provider, + version: 'v2', provider: this._config.provider, providerName: this.providerName, capabilities: this.capabilities, @@ -774,7 +774,7 @@ export class OpenAILanguageModel extends AILanguageModel implements positron.ai. async provideLanguageModelChatInformation(options: { silent: boolean }, token: vscode.CancellationToken): Promise { log.debug(`[${this.providerName}] Preparing language model chat information...`); - const models = await this.resolveModels(token) ?? []; + const models = (await this.resolveModels(token)) ?? []; log.debug(`[${this.providerName}] Resolved ${models.length} models.`); return this.filterModels(models); diff --git a/extensions/positron-assistant/src/openai-fetch-utils.ts b/extensions/positron-assistant/src/openai-fetch-utils.ts index 8ffcf0ecf60e..00633a53258e 100644 --- a/extensions/positron-assistant/src/openai-fetch-utils.ts +++ b/extensions/positron-assistant/src/openai-fetch-utils.ts @@ -51,16 +51,6 @@ function transformRequestBody(init: RequestInit, providerName: string): RequestI bodyModified = true; } - // Remove temperature parameter, as the default 0 value is not supported by some models. - // `temperature` is no longer set to 0 by default in AI SDK v5. - // Example error message without this fix: - // [OpenAI] [gpt-5]' Error in chat response: {"error":{"message":"Unsupported value: 'temperature' does not support 0 with this model. Only the default (1) value is supported.","type":"invalid_request_error","param":"temperature","code":"unsupported_value"}} - if (requestBody.temperature !== undefined) { - log.debug(`[${providerName}] [DEBUG] Removing temperature parameter to avoid unsupported value error`); - delete requestBody.temperature; - bodyModified = true; - } - if (bodyModified) { log.debug(`[${providerName}] [DEBUG] Final request body:`, JSON.stringify(requestBody, null, 2)); return { diff --git a/extensions/positron-assistant/src/posit.ts b/extensions/positron-assistant/src/posit.ts index 47533954295f..faa91d9bb18f 100644 --- a/extensions/positron-assistant/src/posit.ts +++ b/extensions/positron-assistant/src/posit.ts @@ -314,7 +314,7 @@ export class PositLanguageModel implements positron.ai.LanguageModelChatProvider const body: Anthropic.MessageStreamParams = { model: model.id, - max_tokens: options.modelOptions?.maxTokens ?? this.maxOutputTokens, + max_tokens: options.modelOptions?.maxOutputTokens ?? this.maxOutputTokens, tools, tool_choice, system, @@ -428,7 +428,7 @@ export class PositLanguageModel implements positron.ai.LanguageModelChatProvider async provideLanguageModelChatInformation(_options: { silent: boolean }, token: vscode.CancellationToken): Promise { log.debug(`[${this.providerName}] Preparing language model chat information...`); - const models = await this.resolveModels(token) ?? []; + const models = (await this.resolveModels(token)) ?? []; log.debug(`[${this.providerName}] Resolved ${models.length} models.`); return this.filterModels(models); diff --git a/extensions/positron-assistant/src/utils.ts b/extensions/positron-assistant/src/utils.ts index 6bf1224c1a46..df0ef184a5cc 100644 --- a/extensions/positron-assistant/src/utils.ts +++ b/extensions/positron-assistant/src/utils.ts @@ -20,7 +20,7 @@ export function toAIMessage( messages: vscode.LanguageModelChatMessage2[], toolResultExperimentalContent: boolean = false, bedrockCacheBreakpoint: boolean = false -): ai.CoreMessage[] { +): ai.ModelMessage[] { // Gather all tool call references const toolCalls = messages.reduce>((acc, message) => { for (const part of message.content) { @@ -32,7 +32,7 @@ export function toAIMessage( }, {}); // Convert messages from vscode to ai format - const aiMessages: ai.CoreMessage[] = []; + const aiMessages: ai.ModelMessage[] = []; const systemContent: string[] = []; for (const message of messages) { if (message.role === vscode.LanguageModelChatMessageRole.User) { @@ -49,14 +49,14 @@ export function toAIMessage( userContent.push({ type: 'text', text: part.value }); } else if (part instanceof vscode.LanguageModelDataPart) { if (isChatImagePart(part)) { - userContent.push({ type: 'image', image: part.data, mimeType: part.mimeType }); + userContent.push({ type: 'image', image: part.data, mediaType: part.mimeType }); } else if (part.mimeType === LanguageModelDataPartMimeType.CacheControl) { cacheBreakpoint = true; } } } if (userContent.length > 0) { - const messageContent: ai.CoreUserMessage = { + const messageContent: ai.UserModelMessage = { role: 'user', content: userContent }; @@ -89,17 +89,34 @@ export function toAIMessage( if (toolCall.name === PositronAssistantToolName.GetPlot) { aiMessages.push(getPlotToolResultToAiMessage(part)); } else { - aiMessages.push({ - role: 'tool', + // Convert part.content (an array of LanguageModelParts) to a string for non-experimental providers + // AI SDK 5 expects output in structured format: { type: 'text' | 'json', value: ... } + const textContent = part.content + .filter((c): c is vscode.LanguageModelTextPart => c instanceof vscode.LanguageModelTextPart) + .map(c => c.value) + .join(''); + + // Try to parse as JSON if it looks like JSON, otherwise use as text + let output: { type: 'json'; value: unknown } | { type: 'text'; value: string }; + try { + const parsed = JSON.parse(textContent); + output = { type: 'json' as const, value: parsed }; + } catch { + output = { type: 'text' as const, value: textContent }; + } + + const toolResultMessage = { + role: 'tool' as const, content: [ { - type: 'tool-result', + type: 'tool-result' as const, toolCallId: part.callId, toolName: toolCall.name, - result: part.content, + output, }, ], - }); + }; + aiMessages.push(toolResultMessage as ai.ToolModelMessage); } } @@ -134,7 +151,7 @@ export function toAIMessage( type: 'tool-call', toolCallId: part.callId, toolName: part.name, - args: part.input, + input: part.input, }); } else if (part instanceof vscode.LanguageModelPromptTsxPart) { // Convert PromptTSX parts to text @@ -145,7 +162,7 @@ export function toAIMessage( log.warn(`[vercel] Skipping unsupported part type in assistant message: ${part.constructor.name}`); } } - const aiMessage: ai.CoreAssistantMessage = { + const aiMessage: ai.AssistantModelMessage = { role: 'assistant', content, }; @@ -175,7 +192,7 @@ export function toAIMessage( if (systemContent.length > 0) { // Not all providers support multiple system messages, so we consolidate. - const systemMessage: ai.CoreSystemMessage = { + const systemMessage: ai.SystemModelMessage = { role: 'system', content: systemContent.join('\n'), }; @@ -193,7 +210,7 @@ export function toAIMessage( return aiMessages.filter((message) => message.content.length > 0); } -export function markBedrockCacheBreakpoint(message: ai.CoreMessage): ai.CoreMessage { +export function markBedrockCacheBreakpoint(message: ai.ModelMessage): ai.ModelMessage { log.trace(`[vercel] Marking ${message.role} message as a Bedrock cache breakpoint`); message.providerOptions = { bedrock: { @@ -212,36 +229,54 @@ export function markBedrockCacheBreakpoint(message: ai.CoreMessage): ai.CoreMess function convertToolResultToAiMessageExperimentalContent( part: vscode.LanguageModelToolResultPart, toolCall: vscode.LanguageModelToolCallPart, -): ai.CoreToolMessage { +): ai.ToolModelMessage { // If experimental content is enabled for tool calls, // that means tool results can contain images. - const toolMessage: ai.CoreToolMessage = { + type ToolResultOutput = + | { type: 'text'; value: string } + | { type: 'content'; value: Array<{ type: 'text'; text: string } | { type: 'media'; data: string; mediaType: string }> }; + + const toolMessage: { + role: 'tool'; + content: [{ + type: 'tool-result'; + toolCallId: string; + toolName: string; + output: ToolResultOutput; + }]; + } = { role: 'tool', content: [ { type: 'tool-result', toolCallId: part.callId, toolName: toolCall.name, - result: '', + output: { type: 'text', value: '' }, }, ], }; // If there's 0 or 1 parts and that part is text, we can just return a - // normal CoreToolMessage object with a `result` field. + // normal ToolModelMessage object with a `output` field. if ( part.content.length <= 1 && part.content.every( (content) => content instanceof vscode.LanguageModelTextPart ) ) { - toolMessage.content[0].result = part.content; + // Convert text parts to string for output + // AI SDK 5 expects { type: 'text', value: string } + const textContent = part.content + .filter((c): c is vscode.LanguageModelTextPart => c instanceof vscode.LanguageModelTextPart) + .map(c => c.value) + .join(''); + toolMessage.content[0].output = { type: 'text' as const, value: textContent }; } else { - // This is a multi-part tool result, and may contain images. We can - // convert it to a Vercel AI message with experimental_content. - const toolResultContent: ToolResultContent = part.content.map( - (content): ToolResultContent[number] => { + // This is a multi-part tool result, and may contain images. + // AI SDK 5 expects { type: 'content', value: [...] } for multi-part results + const toolResultContent = part.content.map( + (content): { type: 'text'; text: string } | { type: 'media'; data: string; mediaType: string } => { if (content instanceof vscode.LanguageModelTextPart) { return { type: 'text', @@ -249,9 +284,9 @@ function convertToolResultToAiMessageExperimentalContent( }; } else if (content instanceof vscode.LanguageModelDataPart && isChatImagePart(content)) { return { - type: 'image', + type: 'media', data: Buffer.from(content.data).toString('base64'), - mimeType: content.mimeType, + mediaType: content.mimeType, }; } else if (content instanceof vscode.LanguageModelPromptTsxPart) { return { @@ -260,22 +295,21 @@ function convertToolResultToAiMessageExperimentalContent( }; } else { throw new Error( - `Unsupported part type on tool result message: ${(content as any).constructor?.name ?? typeof content}` + `Unsupported part type on tool result message: ${typeof content === 'object' && content !== null && 'constructor' in content ? (content.constructor as { name?: string }).name : typeof content}` ); } } ); - toolMessage.content[0].result = toolResultContent; - toolMessage.content[0].experimental_content = toolResultContent; + toolMessage.content[0].output = { type: 'content' as const, value: toolResultContent }; } - return toolMessage; + return toolMessage as ai.ToolModelMessage; } /** * Convert a getPlot tool result into a Vercel AI message. */ -function getPlotToolResultToAiMessage(part: vscode.LanguageModelToolResultPart2): ai.CoreUserMessage { +function getPlotToolResultToAiMessage(part: vscode.LanguageModelToolResultPart2): ai.UserModelMessage { const isImageDataPart = (content: unknown): content is vscode.LanguageModelDataPart => { return content instanceof vscode.LanguageModelDataPart && isChatImagePart(content); }; From 085ec40b3a61cf8dd54d5b1cc17ed43ba4008562 Mon Sep 17 00:00:00 2001 From: Tim Mok Date: Thu, 4 Dec 2025 14:52:04 -0500 Subject: [PATCH 3/3] Fix Snowflake provider --- .../positron-assistant/src/constants.ts | 5 +- extensions/positron-assistant/src/models.ts | 68 +++++++++++--- .../src/openai-fetch-utils.ts | 93 ++++++++++++++----- extensions/positron-assistant/src/utils.ts | 61 ++++++++---- 4 files changed, 168 insertions(+), 59 deletions(-) diff --git a/extensions/positron-assistant/src/constants.ts b/extensions/positron-assistant/src/constants.ts index 70febc2be7ea..79145ce30bda 100644 --- a/extensions/positron-assistant/src/constants.ts +++ b/extensions/positron-assistant/src/constants.ts @@ -57,4 +57,7 @@ export const DEFAULT_MAX_CONNECTION_ATTEMPTS = 3; /** * Determines if the Posit Web environment is detected. */ -export const IS_RUNNING_ON_PWB = !!process.env.RS_SERVER_URL && vscode.env.uiKind === vscode.UIKind.Web; +export const IS_RUNNING_ON_PWB = true; + +/** The default max steps for an agent execution */ +export const DEFAULT_MAX_STEPS = 50; diff --git a/extensions/positron-assistant/src/models.ts b/extensions/positron-assistant/src/models.ts index 1a4f7bba3433..e9862dc63332 100644 --- a/extensions/positron-assistant/src/models.ts +++ b/extensions/positron-assistant/src/models.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; import * as positron from 'positron'; import * as ai from 'ai'; -import { expandConfigToSource, getMaxConnectionAttempts, getProviderTimeoutMs, getStoredModels, getEnabledProviders, ModelConfig, SecretStorage } from './config'; +import { expandConfigToSource, getMaxConnectionAttempts, getProviderTimeoutMs, getStoredModels, ModelConfig, SecretStorage } from './config'; import { AnthropicProvider, createAnthropic } from '@ai-sdk/anthropic'; import { AzureOpenAIProvider, createAzure } from '@ai-sdk/azure'; import { createVertex, GoogleVertexProvider } from '@ai-sdk/google-vertex'; @@ -19,7 +19,7 @@ import { processMessages, toAIMessage, isAuthorizationError } from './utils'; import { AmazonBedrockProvider, createAmazonBedrock } from '@ai-sdk/amazon-bedrock'; import { fromNodeProviderChain } from '@aws-sdk/credential-providers'; import { AnthropicLanguageModel, DEFAULT_ANTHROPIC_MODEL_MATCH, DEFAULT_ANTHROPIC_MODEL_NAME } from './anthropic'; -import { DEFAULT_MAX_TOKEN_INPUT, DEFAULT_MAX_TOKEN_OUTPUT, IS_RUNNING_ON_PWB } from './constants.js'; +import { DEFAULT_MAX_TOKEN_INPUT, DEFAULT_MAX_TOKEN_OUTPUT, DEFAULT_MAX_STEPS } from './constants.js'; import { AssistantError, log, recordRequestTokenUsage, recordTokenUsage, registerModelWithAPI } from './extension.js'; import { TokenUsage } from './tokens.js'; import { BedrockClient, FoundationModelSummary, InferenceProfileSummary, ListFoundationModelsCommand, ListInferenceProfilesCommand } from '@aws-sdk/client-bedrock'; @@ -29,7 +29,7 @@ import { PositronAssistantApi } from './api.js'; import { autoconfigureWithManagedCredentials, AWS_MANAGED_CREDENTIALS, SNOWFLAKE_MANAGED_CREDENTIALS } from './pwb'; import { getAllModelDefinitions } from './modelDefinitions'; import { createModelInfo, getMaxTokens, markDefaultModel } from './modelResolutionHelpers.js'; -import { detectSnowflakeCredentials, extractSnowflakeError, getSnowflakeDefaultBaseUrl, getSnowflakeConnectionsTomlPath, checkForUpdatedSnowflakeCredentials } from './snowflakeAuth.js'; +import { detectSnowflakeCredentials, extractSnowflakeError, getSnowflakeDefaultBaseUrl, checkForUpdatedSnowflakeCredentials } from './snowflakeAuth.js'; import { createOpenAICompatibleFetch } from './openai-fetch-utils.js'; /** @@ -320,6 +320,16 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider return applyModelFilters(models, this.provider, this.providerName); } + /** + * Determines if this model should use experimental content format for tool results. + * Override in subclasses to customize behavior for specific providers. + * @param model The model information + * @returns true if experimental content format should be used + */ + protected useExperimentalToolResultContent(model: vscode.LanguageModelChatInformation): boolean { + return this.provider === 'anthropic-api' || model.id.includes('anthropic'); + } + async resolveConnection(token: vscode.CancellationToken): Promise { log.debug(`[${this.providerName}] Resolving connection...`); @@ -404,10 +414,9 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider // Ensure all messages have content const processedMessages = processMessages(messages); - // Only Anthropic currently supports experimental_content in tool - // results. - const toolResultExperimentalContent = this.provider === 'anthropic-api' || - model.id.includes('anthropic'); + // Determine if this model uses experimental content format for tool results. + // This is needed for Anthropic models and Snowflake Claude models. + const toolResultExperimentalContent = this.useExperimentalToolResultContent(model); // Only select Bedrock models support cache breakpoints; specifically, // the Claude 3.5 Sonnet models don't support them. @@ -476,7 +485,7 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider const result = ai.streamText({ model: aiModel, messages: aiMessages, - stopWhen: ai.stepCountIs(modelOptions.maxSteps ?? 50), + stopWhen: ai.stepCountIs(modelOptions.maxSteps ?? DEFAULT_MAX_STEPS), tools: modelTools, abortSignal: signal, maxOutputTokens: getMaxTokens(model.id, 'output', this._config.provider, this._config.maxOutputTokens, this.providerName), @@ -497,6 +506,9 @@ abstract class AILanguageModel implements positron.ai.LanguageModelChatProvider break; } + // Log ALL part types for debugging + log.debug(`[${this.providerName}] [${this._config.name}] RECV part type: ${part.type}`); + if (part.type === 'reasoning-delta') { flushAccumulatedTextDeltas(); log.trace(`[${this.providerName}] [${this._config.name}] RECV reasoning: ${part.text}`); @@ -933,7 +945,6 @@ class OpenAICompatibleLanguageModel extends OpenAILanguageModel implements posit } class SnowflakeLanguageModel extends OpenAILanguageModel { - protected aiProvider: OpenAIProvider; private lastConnectionsTomlCheck?: number; // Timestamp of last file check static source: positron.ai.LanguageModelSource = { @@ -953,6 +964,30 @@ class SnowflakeLanguageModel extends OpenAILanguageModel { } }; + constructor(_config: ModelConfig, _context?: vscode.ExtensionContext) { + super(_config, _context); + this.updateAiProvider(); + } + + /** + * Creates a wrapped OpenAI provider that uses the Chat Completions API + * instead of the Responses API. Snowflake Cortex only supports v1/chat/completions. + */ + private updateAiProvider(): void { + const baseProvider = createOpenAI({ + apiKey: this._config.apiKey, + baseURL: this.baseUrl, + fetch: createOpenAICompatibleFetch(this.providerName) + }); + // Create a callable wrapper that routes to .chat() for the default call + // This ensures Snowflake uses v1/chat/completions instead of v1/responses + const chatWrapper = ((modelId: string, options?: any) => baseProvider.chat(modelId)) as OpenAIProvider; + // Copy over any additional properties/methods from the base provider + Object.assign(chatWrapper, baseProvider); + // Override the callable to always use chat + this.aiProvider = chatWrapper; + } + get providerName(): string { return SnowflakeLanguageModel.source.provider.displayName; } @@ -962,6 +997,13 @@ class SnowflakeLanguageModel extends OpenAILanguageModel { return this._config.baseUrl || SnowflakeLanguageModel.source.defaults.baseUrl!; } + /** + * Snowflake uses Claude models which require experimental content format for tool results. + */ + protected override useExperimentalToolResultContent(model: vscode.LanguageModelChatInformation): boolean { + return true; + } + /** * Check if connections.toml has been modified since our last check and update token if needed */ @@ -977,12 +1019,8 @@ class SnowflakeLanguageModel extends OpenAILanguageModel { this._config.baseUrl = result.credentials.baseUrl; } - // Recreate the provider with updated credentials - this.aiProvider = createOpenAI({ - apiKey: result.credentials.token, - baseURL: this.baseUrl, - fetch: createOpenAICompatibleFetch(this.providerName) - }); + // Recreate the provider with updated credentials using Chat Completions API + this.updateAiProvider(); log.info(`[${this.providerName}] Refreshed credentials for account: ${result.credentials.account}`); } diff --git a/extensions/positron-assistant/src/openai-fetch-utils.ts b/extensions/positron-assistant/src/openai-fetch-utils.ts index 00633a53258e..f3e202ff65f5 100644 --- a/extensions/positron-assistant/src/openai-fetch-utils.ts +++ b/extensions/positron-assistant/src/openai-fetch-utils.ts @@ -7,19 +7,17 @@ import { log } from './extension.js'; /** * Creates a custom fetch function for OpenAI-compatible providers that handles: - * 1. Request body transformations (max_tokens -> max_completion_tokens, temperature removal) - * - This is a stop-gap solution until we update to AI SDK v5, which addresses these issues. + * 1. Request body transformations (max_tokens -> max_completion_tokens for Snowflake compatibility) * 2. Response transformations (empty role fields -> "assistant") */ export function createOpenAICompatibleFetch(providerName: string): (input: RequestInfo, init?: RequestInit) => Promise { return async (input: RequestInfo, init?: RequestInit): Promise => { - // Handle request body transformations - if (init?.method === 'POST' && init?.body) { - init = transformRequestBody(init, providerName); - } - log.debug(`[${providerName}] [DEBUG] Making request to: ${input}`); - const response = await fetch(input, init); + + // Transform the request body if needed + const transformedInit = transformRequestBody(init, providerName); + + const response = await fetch(input, transformedInit); log.debug(`[${providerName}] [DEBUG] Response status: ${response.status} ${response.statusText}`); // Handle response transformations for streaming responses @@ -28,9 +26,15 @@ export function createOpenAICompatibleFetch(providerName: string): (input: Reque } /** - * Transforms the request body to handle OpenAI API deprecations and compatibility issues + * Transforms the request body to fix OpenAI-compatible provider issues. + * Specifically, converts max_tokens to max_completion_tokens for providers like Snowflake + * that require the newer parameter name. */ -function transformRequestBody(init: RequestInit, providerName: string): RequestInit { +function transformRequestBody(init: RequestInit | undefined, providerName: string): RequestInit | undefined { + if (!init?.body || typeof init.body !== 'string') { + return init; + } + try { const bodyStr = typeof init.body === 'string' ? init.body : JSON.stringify(init.body); const requestBody = JSON.parse(bodyStr); @@ -51,19 +55,28 @@ function transformRequestBody(init: RequestInit, providerName: string): RequestI bodyModified = true; } - if (bodyModified) { - log.debug(`[${providerName}] [DEBUG] Final request body:`, JSON.stringify(requestBody, null, 2)); - return { - ...init, - body: JSON.stringify(requestBody) - }; + // Transform tools to be compatible with OpenAI-compatible providers + // Some providers don't support the 'strict' field in tool function definitions + if (requestBody.tools && Array.isArray(requestBody.tools)) { + log.debug(`[${providerName}] Request contains ${requestBody.tools.length} tools: ${requestBody.tools.map((t: any) => t.function?.name || t.name).join(', ')}`); + for (const tool of requestBody.tools) { + if (tool.function && tool.function.strict !== undefined) { + delete tool.function.strict; + log.debug(`[${providerName}] Removed 'strict' field from tool: ${tool.function.name}`); + } + } + log.trace(`[${providerName}] Tools payload: ${JSON.stringify(requestBody.tools)}`); } - } catch (error) { - // If we can't parse the body, just proceed with the original request - log.warn(`[${providerName}] Failed to parse request body for parameter handling: ${error}`); - } - return init; + return { + ...init, + body: JSON.stringify(requestBody) + }; + } catch (parseError) { + // If we can't parse the body, return unchanged + log.debug(`[${providerName}] Could not parse request body for transformation`); + return init; + } } /** @@ -114,8 +127,42 @@ function transformServerSentEvents(text: string, providerName: string): string { // Fix empty role fields in delta objects within choices array if (data.choices && Array.isArray(data.choices)) { for (const choice of data.choices) { - if (choice.delta && typeof choice.delta === 'object' && choice.delta.role === '') { - choice.delta.role = 'assistant'; + if (choice.delta && typeof choice.delta === 'object') { + // Fix empty role field + if (choice.delta.role === '') { + choice.delta.role = 'assistant'; + } + + // Fix tool_calls with empty arguments or empty type + // The AI SDK's isParsableJson check will fail for empty strings, + // so we need to convert "" to "{}" for tools with no parameters + // Also, Snowflake Cortex may return empty type field instead of "function" + if (choice.delta.tool_calls && Array.isArray(choice.delta.tool_calls)) { + for (const toolCall of choice.delta.tool_calls) { + // Fix empty type field - AI SDK expects "function" + if (toolCall.type === '') { + log.debug(`[${providerName}] Converting empty tool type to 'function' for tool call at index: ${toolCall.index}`); + toolCall.type = 'function'; + } + + if (toolCall.function && toolCall.function.arguments === '') { + log.debug(`[${providerName}] Converting empty tool arguments to '{}' for tool: ${toolCall.function.name || 'unknown'}`); + toolCall.function.arguments = '{}'; + } + } + } + + // Log tool calls for debugging with full structure + if (choice.delta.tool_calls) { + log.debug(`[${providerName}] Received tool_calls in delta: ${JSON.stringify(choice.delta.tool_calls)}`); + log.debug(`[${providerName}] Full delta object: ${JSON.stringify(choice.delta)}`); + log.debug(`[${providerName}] Full choice object: ${JSON.stringify(choice)}`); + } + + // Log finish reason + if (choice.finish_reason) { + log.debug(`[${providerName}] Finish reason: ${choice.finish_reason}`); + } } } } diff --git a/extensions/positron-assistant/src/utils.ts b/extensions/positron-assistant/src/utils.ts index df0ef184a5cc..475e0451b637 100644 --- a/extensions/positron-assistant/src/utils.ts +++ b/extensions/positron-assistant/src/utils.ts @@ -73,8 +73,11 @@ export function toAIMessage( // Add the tool messages. for (const part of message.content) { if (part instanceof vscode.LanguageModelToolResultPart || part instanceof vscode.LanguageModelToolResultPart2) { + const toolCall = toolCalls[part.callId]; + if (!toolCall) { + log.warn(`[toAIMessage] Tool result with callId '${part.callId}' has no matching tool call in conversation history. Available tool calls: ${Object.keys(toolCalls).join(', ')}`); + } if (toolResultExperimentalContent) { - const toolCall = toolCalls[part.callId]; const toolMessage = convertToolResultToAiMessageExperimentalContent(part, toolCall); if (cacheBreakpoint && bedrockCacheBreakpoint) { cacheBreakpoint = false; @@ -307,9 +310,10 @@ function convertToolResultToAiMessageExperimentalContent( } /** - * Convert a getPlot tool result into a Vercel AI message. + * Convert a getPlot tool result into an AI SDK tool message with image content. + * AI SDK 5 supports images in tool results via the 'content' output type with 'media' parts. */ -function getPlotToolResultToAiMessage(part: vscode.LanguageModelToolResultPart2): ai.UserModelMessage { +function getPlotToolResultToAiMessage(part: vscode.LanguageModelToolResultPart2): ai.ToolModelMessage { const isImageDataPart = (content: unknown): content is vscode.LanguageModelDataPart => { return content instanceof vscode.LanguageModelDataPart && isChatImagePart(content); }; @@ -318,33 +322,50 @@ function getPlotToolResultToAiMessage(part: vscode.LanguageModelToolResultPart2) // If there was no image, forward the response as text. if (imageParts.length === 0) { return { - role: 'user', + role: 'tool', content: [ { - type: 'text', - text: `Could not get the current active plot. Reason: ${JSON.stringify(part.content)}`, + type: 'tool-result', + toolCallId: part.callId, + toolName: PositronAssistantToolName.GetPlot, + output: { + type: 'text', + value: `Could not get the current active plot. Reason: ${JSON.stringify(part.content)}`, + }, }, ], }; } - // Otherwise, convert to a user message containing the image, - // as Vercel AI doesn't support image tool results. + // AI SDK 5 supports image content in tool results via the 'content' output type. + // The 'content' type uses 'media' parts for images, which get converted to + // appropriate format for each provider (e.g., function_call_output for OpenAI Responses API). + type MediaContentPart = { type: 'text'; text: string } | { type: 'media'; data: string; mediaType: string }; + const contentValue: MediaContentPart[] = imageParts.flatMap((imgPart) => ([ + { + type: 'text' as const, + text: 'Here is the current active plot:', + }, + { + type: 'media' as const, + data: Buffer.from(imgPart.data).toString('base64'), + mediaType: imgPart.mimeType, + } + ])); + return { - role: 'user', - // We only expect one image part, but just in case, - // include all image parts in the message. - content: imageParts.flatMap((imgPart) => ([ + role: 'tool', + content: [ { - type: 'text', - text: 'Here is the current active plot:', + type: 'tool-result', + toolCallId: part.callId, + toolName: PositronAssistantToolName.GetPlot, + output: { + type: 'content', + value: contentValue, + }, }, - { - type: 'image', - image: Buffer.from(imgPart.data).toString('base64'), - mimeType: imgPart.mimeType, - } - ])), + ], }; }