{"_id":"@convex-dev/ai-sdk-provider","_rev":"8-29efa079bfc0c9c151d445170a0f6018","name":"@convex-dev/ai-sdk-provider","dist-tags":{"alpha":"0.2.0-alpha.1","latest":"0.2.1"},"versions":{"0.0.1-alpha.0":{"name":"@convex-dev/ai-sdk-provider","version":"0.0.1-alpha.0","license":"Apache-2.0","_id":"@convex-dev/ai-sdk-provider@0.0.1-alpha.0","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/convex-backend#readme","bugs":{"url":"https://github.com/get-convex/convex-backend/issues"},"dist":{"shasum":"e0ba3eb2518b2c22ab2262c19ea99187950b2c22","tarball":"https://registry.npmjs.org/@convex-dev/ai-sdk-provider/-/ai-sdk-provider-0.0.1-alpha.0.tgz","fileCount":14,"integrity":"sha512-dTr+reCut+CcgvmUS9TTOkglz92h6sDWV2ID1NaVtm64jvXu4/7xYOoqvUWuFlI8Ub6SH61H6uCyr7rEFfnG4A==","signatures":[{"sig":"MEYCIQD0hC1kwnMsuwireynsJQBHM/wuGG1jZb8Uwoyk6BCixQIhAMBRsrWezPg5kmOeZdKOs+RPBWBD9LovsPUk7kfjywzP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21185},"main":"./dist/commonjs/index.js","tshy":{"exclude":["src/**/*.test.ts"],"exports":{".":"./src/index.ts","./package.json":"./package.json"},"dialects":["esm","commonjs"],"selfLink":false},"type":"module","_from":"file:convex-dev-ai-sdk-provider-0.0.1-alpha.0.tgz","types":"./dist/commonjs/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./package.json":"./package.json"},"scripts":{"test":"vitest run --typecheck","build":"tshy","test:types":"tsc --noEmit"},"_npmUser":{"name":"andycai-convex","email":"andy@convex.dev"},"_resolved":"/private/var/folders/q5/1bm2ltsj7gj4xhcdypprcdxm0000gp/T/c7c74062dda38004e62205d58acb3591/convex-dev-ai-sdk-provider-0.0.1-alpha.0.tgz","_integrity":"sha512-dTr+reCut+CcgvmUS9TTOkglz92h6sDWV2ID1NaVtm64jvXu4/7xYOoqvUWuFlI8Ub6SH61H6uCyr7rEFfnG4A==","repository":{"url":"git+https://github.com/get-convex/convex-backend.git","type":"git","directory":"npm-packages/@convex-dev/ai-sdk-provider"},"_npmVersion":"10.9.7","description":"AI SDK provider for the Convex AI gateway","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@ai-sdk/openai-compatible":"3.0.14"},"_hasShrinkwrap":false,"devDependencies":{"ai":"7.0.34","tshy":"^3.0.0","convex":"1.44.0","vitest":"^4.1.0","typescript":"~5.0.3","@types/node":"^18.17.0"},"peerDependencies":{"ai":"^7.0.0","convex":"^1.44.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-sdk-provider_0.0.1-alpha.0_1787182721192_0.7614668219843022","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@convex-dev/ai-sdk-provider","version":"0.1.0","license":"Apache-2.0","_id":"@convex-dev/ai-sdk-provider@0.1.0","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"dist":{"shasum":"2c0e299d35b629e283314605565ceba295e37471","tarball":"https://registry.npmjs.org/@convex-dev/ai-sdk-provider/-/ai-sdk-provider-0.1.0.tgz","fileCount":14,"integrity":"sha512-X40JsIsX3kaWQryAq6dO1K+bYP4HiLALQPIgmWeHoxI9FqbC/A3pJGJtjrbJPlhZLITM1CuVj4Yg5lmV3UdlVg==","signatures":[{"sig":"MEUCIQDmZLQGpH9hG2qMfFexvvYbPV1p62q2CytWYZ/yk5S8iwIgVZT41/OIeHllwyB02KBY9wT78d5x7TzC5jqz5OpagfI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21177},"main":"./dist/commonjs/index.js","tshy":{"exclude":["src/**/*.test.ts"],"exports":{".":"./src/index.ts","./package.json":"./package.json"},"dialects":["esm","commonjs"],"selfLink":false},"type":"module","types":"./dist/commonjs/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./package.json":"./package.json"},"scripts":{"test":"vitest run --typecheck","build":"tshy","test:types":"tsc --noEmit"},"_npmUser":{"name":"andycai-convex","email":"andy@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/convex-backend.git","type":"git","directory":"npm-packages/@convex-dev/ai-sdk-provider"},"description":"AI SDK provider for the Convex AI gateway","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@ai-sdk/openai-compatible":"3.0.14"},"_hasShrinkwrap":false,"devDependencies":{"ai":"7.0.34","tshy":"^3.0.0","convex":"1.45.0","vitest":"^4.1.0","typescript":"~5.0.3","@types/node":"^18.17.0"},"peerDependencies":{"ai":"^7.0.0","convex":"^1.44.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-sdk-provider_0.1.0_1787357033183_0.18481785066856538","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-alpha.0":{"name":"@convex-dev/ai-sdk-provider","version":"0.2.0-alpha.0","license":"Apache-2.0","_id":"@convex-dev/ai-sdk-provider@0.2.0-alpha.0","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"dist":{"shasum":"4a821ff2523dd8ad8f34ff64c8d186a2c7e87fc6","tarball":"https://registry.npmjs.org/@convex-dev/ai-sdk-provider/-/ai-sdk-provider-0.2.0-alpha.0.tgz","fileCount":14,"integrity":"sha512-oWTCbFeAr8KKMq86lidnAArKNc5qqd4vV1p3uFIDeZHqpozaj+iwvYrL3apiv2KRsF9r+/Ar+u9Y0hJhWMTBtw==","signatures":[{"sig":"MEYCIQCpcBnFnxgxio2hGJ2gPosU5rFtfsYTYawJ+RI5dTdikwIhAIoWxa2uhMGBt+TmV9AA1ebgkeCHT/Sjrr4iQke5XaNJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36736},"main":"./dist/commonjs/index.js","tshy":{"exclude":["src/**/*.test.ts"],"exports":{".":"./src/index.ts","./package.json":"./package.json"},"dialects":["esm","commonjs"],"selfLink":false},"type":"module","types":"./dist/commonjs/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./package.json":"./package.json"},"scripts":{"test":"vitest run --typecheck","build":"tshy","test:types":"tsc --noEmit","publish-package":"node src/scripts/publish.mjs"},"_npmUser":{"name":"andycai-convex","email":"andy@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/convex-backend.git","type":"git","directory":"npm-packages/@convex-dev/ai-sdk-provider"},"description":"AI SDK provider for the Convex AI gateway","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@ai-sdk/openai":"4.0.45","@ai-sdk/anthropic":"4.0.40","@ai-sdk/openai-compatible":"3.0.14"},"_hasShrinkwrap":false,"devDependencies":{"ai":"7.0.34","tshy":"^3.0.0","convex":"1.45.0","vitest":"^4.1.0","typescript":"~5.0.3","@types/node":"^18.17.0"},"peerDependencies":{"ai":"^7.0.0","convex":"^1.45.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-sdk-provider_0.2.0-alpha.0_1787978739315_0.9479950363745062","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-alpha.1":{"name":"@convex-dev/ai-sdk-provider","version":"0.2.0-alpha.1","license":"Apache-2.0","_id":"@convex-dev/ai-sdk-provider@0.2.0-alpha.1","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"dist":{"shasum":"1a6116c47460d0965120440a49fe811294550758","tarball":"https://registry.npmjs.org/@convex-dev/ai-sdk-provider/-/ai-sdk-provider-0.2.0-alpha.1.tgz","fileCount":14,"integrity":"sha512-OkX67jqcSL/1PcMYTYxejHorREYZ0isDa/HUsevamuuJU2wHQkWntDh/win+yxdzqWylyTjZOBGsQ3z23xm0Ag==","signatures":[{"sig":"MEUCIQCFuRWbjnDHMeorSS9eMJgOWjHRHhMfnSV6AuCdocCBkgIgHDGHGNaN6pSCyQpxZ6fYmxKTr1e7RRd2ll7g1Hc5Qbk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42104},"main":"./dist/commonjs/index.js","tshy":{"exclude":["src/**/*.test.ts"],"exports":{".":"./src/index.ts","./package.json":"./package.json"},"dialects":["esm","commonjs"],"selfLink":false},"type":"module","types":"./dist/commonjs/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./package.json":"./package.json"},"scripts":{"test":"vitest run --typecheck","build":"tshy","test:types":"tsc --noEmit","publish-package":"node src/scripts/publish.mjs"},"_npmUser":{"name":"andycai-convex","email":"andy@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/convex-backend.git","type":"git","directory":"npm-packages/@convex-dev/ai-sdk-provider"},"description":"AI SDK provider for the Convex AI gateway","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@ai-sdk/openai":"4.0.45","@ai-sdk/anthropic":"4.0.40","@ai-sdk/openai-compatible":"3.0.14"},"_hasShrinkwrap":false,"devDependencies":{"ai":"7.0.34","tshy":"^3.0.0","convex":"1.45.0","vitest":"^4.1.0","typescript":"~5.0.3","@types/node":"^18.17.0"},"peerDependencies":{"ai":"^7.0.0","convex":"^1.45.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-sdk-provider_0.2.0-alpha.1_1788562709437_0.7287766523164307","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@convex-dev/ai-sdk-provider","version":"0.2.0","license":"Apache-2.0","_id":"@convex-dev/ai-sdk-provider@0.2.0","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"ayushdewanconvex","email":"ayush@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"dist":{"shasum":"e92efd1cd4ca574bc015619016a56ee122d41966","tarball":"https://registry.npmjs.org/@convex-dev/ai-sdk-provider/-/ai-sdk-provider-0.2.0.tgz","fileCount":41,"integrity":"sha512-aohj86ZEN+aya8Gl/e9+e36l+x6OwoFcCqPv3xd0d3N783BVvNgRF7q1fDsdpHVLdPVBlak22uvMry+o4kQ5hQ==","signatures":[{"sig":"MEUCIFsqFJuKI7KjbZ/XGb9K76r0j2F2X3xqNHVqtPI3YC7jAiEAyItna4uYycDkMcPaTLhIrrNuK2nev9Cy0ndzyps6L6A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCxNN0PMhjjtcmXICRgwOLcuJQI5pLbV1gAQIvDt4cp3wIhANywcPrp+jgpSomVtmE/WwhuWgGsUQvx4hUR/aj59tqr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":126623},"main":"./dist/commonjs/index.js","tshy":{"exclude":["src/**/*.test.ts"],"exports":{".":"./src/index.ts","./package.json":"./package.json"},"dialects":["esm","commonjs"],"selfLink":false},"type":"module","types":"./dist/commonjs/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./package.json":"./package.json"},"scripts":{"test":"vitest run --typecheck","build":"tshy","test:types":"tsc --noEmit","publish-package":"node src/scripts/publish.mjs"},"_npmUser":{"name":"andycai-convex","email":"andy@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/convex-backend.git","type":"git","directory":"npm-packages/@convex-dev/ai-sdk-provider"},"description":"AI SDK provider for the Convex AI gateway","directories":{},"_nodeVersion":"22.22.2","dependencies":{"zod":"^4.3.6","@ai-sdk/openai":"4.0.45","@ai-sdk/anthropic":"4.0.40","@ai-sdk/openai-compatible":"3.0.14"},"_hasShrinkwrap":false,"devDependencies":{"ai":"7.0.105","tshy":"^3.0.0","convex":"1.46.0","vitest":"^4.1.0","typescript":"~5.0.3","@types/node":"^18.17.0"},"peerDependencies":{"ai":"^7.0.105","convex":"^1.45.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-sdk-provider_0.2.0_1790011739907_0.7298730333990464","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"_id":"@convex-dev/ai-sdk-provider@0.2.1","dist":{"shasum":"54f2ecc082628289769596579955ef498032e8f6","tarball":"https://registry.npmjs.org/@convex-dev/ai-sdk-provider/-/ai-sdk-provider-0.2.1.tgz","fileCount":41,"integrity":"sha512-w8Ps0a4E6+w+J7tBCM84CIEb0zmJD9yiGM1QTFo9zm/USpREmFDEgzdQKV8rPicfu6EvJoYR0RumZWBj9X14iw==","signatures":[{"sig":"MEUCICFx9k6+6gvYMlmgVfbe7oDI5mFlb5ufgnvytxzFaZghAiEAlluWrz7nCucRVleF5fUFx5h9+Yf/X6pwzpnD2qusFLY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDMbY5FTU6Rj0jJfUeW3aXvLgEZcFLiBwqHbdXkLNCxIwIhAOHaL9lUUFd3gnCLISnOPBJgNg/t5dU0t62k/Wuzr/sn"}],"unpackedSize":127358},"main":"./dist/commonjs/index.js","name":"@convex-dev/ai-sdk-provider","tshy":{"exclude":["src/**/*.test.ts"],"exports":{".":"./src/index.ts","./package.json":"./package.json"},"dialects":["esm","commonjs"],"selfLink":false},"type":"module","types":"./dist/commonjs/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./package.json":"./package.json"},"license":"Apache-2.0","scripts":{"test":"vitest run --typecheck","build":"tshy","test:types":"tsc --noEmit","publish-package":"node src/scripts/publish.mjs"},"version":"0.2.1","_npmUser":{"name":"andycai-convex","email":"andy@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/convex-backend.git","type":"git","directory":"npm-packages/@convex-dev/ai-sdk-provider"},"description":"AI SDK provider for the Convex AI gateway","directories":{},"maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"ayushdewanconvex","email":"ayush@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"_nodeVersion":"22.22.2","dependencies":{"zod":"^4.3.6","@ai-sdk/openai":"4.0.45","@ai-sdk/anthropic":"4.0.40","@ai-sdk/openai-compatible":"3.0.14"},"_hasShrinkwrap":false,"devDependencies":{"ai":"7.0.105","tshy":"^3.0.0","convex":"1.46.0","vitest":"^4.1.0","typescript":"~5.0.3","@types/node":"^18.17.0"},"peerDependencies":{"ai":"^7.0.105","convex":"^1.45.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai-sdk-provider_0.2.1_1790018820004_0.9821011788766758"}}},"time":{"created":"2026-08-19T23:38:41.143Z","modified":"2026-09-21T19:27:00.292Z","0.0.1-alpha.0":"2026-08-19T23:38:41.330Z","0.1.0":"2026-08-22T00:03:53.403Z","0.2.0-alpha.0":"2026-08-29T04:45:39.450Z","0.2.0-alpha.1":"2026-09-04T22:58:29.575Z","0.2.0":"2026-09-21T17:29:00.177Z","0.2.1":"2026-09-21T19:27:00.126Z"},"license":"Apache-2.0","repository":{"url":"git+https://github.com/get-convex/convex-backend.git","type":"git","directory":"npm-packages/@convex-dev/ai-sdk-provider"},"description":"AI SDK provider for the Convex AI gateway","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"ayushdewanconvex","email":"ayush@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"readme":"# `@convex-dev/ai-sdk-provider`\n\nUse the Convex AI gateway with the AI SDK from a Convex action.\n\n```ts\n\"use node\";\n\nimport { convexGateway } from \"@convex-dev/ai-sdk-provider\";\nimport { embedMany, generateText } from \"ai\";\nimport { action } from \"./_generated/server\";\nimport { v } from \"convex/values\";\n\nexport const chat = action({\n  args: { prompt: v.string() },\n  handler: async (_ctx, { prompt }) => {\n    const { text } = await generateText({\n      model: convexGateway(\"anthropic/claude-sonnet-4.5\"),\n      prompt,\n    });\n    return text;\n  },\n});\n\nexport const embed = action({\n  args: { values: v.array(v.string()) },\n  handler: async (_ctx, { values }) => {\n    const { embeddings } = await embedMany({\n      model: convexGateway.embeddingModel(\"openai/text-embedding-3-small\"),\n      values,\n    });\n    return embeddings;\n  },\n});\n```\n\nEmbedding batches larger than the gateway's 512-input limit are split into\nmultiple requests by the AI SDK.\n\n## Choose a model interface\n\nFor text generation, start with `convexGateway(model)`. It works across model\nproviders and is the recommended default. Use an endpoint-specific model only\nwhen you need features unique to Anthropic Messages or OpenAI Responses:\n\n```ts\nconvexGateway.messages(\"anthropic/claude-sonnet-4.5\");\nconvexGateway.responses(\"openai/gpt-5\");\n```\n\n## Structured decisions\n\nUse provider version 0.2.1 or later for correct validation of Jev's rounded\nscores and probabilities.\n\n[Jev](https://docs.typesafe.ai/introduction) evaluates `choice`, `score`, and\n`boolean` questions about the context you provide in `state`. Call AI SDK's\nexperimental `evaluate` from an action:\n\n```ts\nimport { experimental_evaluate as evaluate } from \"ai\";\nimport { convexGateway } from \"@convex-dev/ai-sdk-provider\";\n\nconst decision = await evaluate({\n  model: convexGateway.evaluationModel(\"typesafe/jev-1.13\"),\n  state: { ticket: \"Customer cannot sign in\" },\n  questions: {\n    priority: {\n      type: \"choice\",\n      instructions: \"Choose the response priority\",\n      criteria: {\n        urgent: \"Respond now\",\n        normal: \"Respond today\",\n      },\n    },\n    needsReview: {\n      type: \"boolean\",\n      instructions: \"Does a human need to review this?\",\n    },\n  },\n});\n\nconsole.log(decision.answers.priority.choice);\nconsole.log(decision.answers.needsReview.probability);\n```\n\nThis requires AI SDK 7.0.105 or later. The evaluation interface and\n`/alpha/decisions` endpoint are experimental. Authentication is handled\nautomatically. Pass `abortSignal` to `evaluate` to cancel a request. Dollar cost\nis available in `decision.providerMetadata?.convexGateway?.cost`. The original\ngateway response, including provider-specific fields such as `confidence`, is\navailable in `decision.response.body`.\n\n`getServiceToken(\"ai-gateway\")` supplies a short-lived deployment JWT. The\naction runtime caches and refreshes the credential as needed, so\n`convexGateway(...)` is recommended to call it repeatedly.\n\nRequires Convex 1.45 or later, AI SDK 7.0.105 or later, and Node.js 22 or later.\n\n## Generate images\n\nImage generation is in alpha. The request and response format may change.\n\n```ts\nimport { generateImage } from \"ai\";\nimport { convexGateway } from \"@convex-dev/ai-sdk-provider\";\n\nconst { images } = await generateImage({\n  model: convexGateway.imageModel(\"openai/gpt-image-1\"),\n  prompt: \"A mountain lake at sunrise\",\n});\n```\n\n## Generate videos\n\nVideo generation is in alpha. APIs may change, and completion callbacks are best\neffort. Save async operation handles to check status and retrieve results.\n\n```ts\nimport { experimental_generateVideo as generateVideo } from \"ai\";\nimport { convexGateway } from \"@convex-dev/ai-sdk-provider\";\n\nconst { video, providerMetadata } = await generateVideo({\n  model: convexGateway.videoModel(\"google/veo-3.1\"),\n  prompt: \"A camera pan across a mountain lake\",\n  duration: 8,\n  aspectRatio: \"16:9\",\n  resolution: \"1280x720\",\n});\n\nconst bytes = video.uint8Array;\nconst cost = providerMetadata?.convexGateway?.cost;\n```\n\nThe call waits for generation and download, with a ten-minute default timeout\nand a 64 MiB limit per video. Store the returned bytes in Convex file storage.\nThe AI SDK splits `n > 1` into separate requests. Cancelling a request does not\ncancel the upstream job and can still incur a charge.\n\nAn image in the prompt becomes the first frame. Use `frameImages` for explicit\nframes, `inputReferences` for image/audio/video references, and `generateAudio`\nfor audio. `fps` returns an unsupported-option warning.\n\n`providerOptions.convexGateway` accepts `resolution` (such as `720p`),\n`generate_audio`, `frame_images`, and `input_references`. Standard SDK options\ntake precedence. Supported values depend on the\n[OpenRouter model](https://openrouter.ai/docs/guides/overview/multimodal/video-generation).\n\n## Async videos\n\nWith AI SDK 7.0.83, use `experimental_startVideo` to submit a job without\nwaiting for the video. See the\n[async availability requirements](https://docs.convex.dev/ai-gateway/images-and-videos#async-videos)\nbefore using these routes.\n\nCreate an application job first. Use its ID as `requestId` in the callback URL\nso the receiver can find the job and its saved secret.\n\n```ts\nimport { experimental_startVideo as startVideo } from \"ai\";\nimport { convexGateway } from \"@convex-dev/ai-sdk-provider\";\n\nasync function startJob(requestId: string) {\n  const modelId = \"google/veo-3.1\";\n  const started = await startVideo({\n    model: convexGateway.videoModel(modelId),\n    prompt: \"A camera pan across a mountain lake\",\n    duration: 8,\n    webhookUrl: `${process.env.CONVEX_SITE_URL}/video-complete?requestId=${requestId}`,\n    maxRetries: 0,\n  });\n\n  return {\n    modelId,\n    operation: started.operation,\n    inferenceId: started.providerMetadata?.convexGateway?.inferenceId,\n    webhookSecret: started.providerMetadata?.convexGateway?.webhookSecret,\n  };\n}\n```\n\nSave the returned job in private application storage before the action returns.\nAutomatic submission retries are disabled because a lost response can still mean\na paid job was accepted. Callback URLs must use the deployment's own HTTPS\n`<deployment>.convex.site` origin; redirects are rejected. If `CONVEX_SITE_URL`\nuses a custom domain, use the deployment's default `convex.site` origin in the\nexample instead.\n\n### Receive a callback\n\nLoad the saved job and verify the raw request body before updating application\nstate:\n\n```ts\nimport { verifyVideoWebhook } from \"@convex-dev/ai-sdk-provider\";\n\nconst event = await verifyVideoWebhook({\n  body: await request.text(),\n  signature: request.headers.get(\"x-convex-video-signature\"),\n  secret: savedJob.webhookSecret,\n});\n\nif (event.id !== savedJob.inferenceId) {\n  return new Response(\"Wrong job\", { status: 400 });\n}\n```\n\nDeduplicate `(event.id, event.status)` in the same mutation that saves the\nevent. For `completed`, schedule an action to download the video. Record\n`failed`, `cancelled`, or `expired` as terminal failures. Return 204 after\nsaving the event; return a non-2xx response if the job's secret has not been\nsaved yet.\n\n### Retrieve the video\n\nIn a later action, use the saved operation to check status and download:\n\n```ts\nconst model = convexGateway.videoModel(savedJob.modelId);\nconst status = await model.getStatus({ operation: savedJob.operation });\n\nif (status.status === \"completed\") {\n  const result = await model.download({ operation: savedJob.operation });\n  const video = result.videos[0];\n  const cost = result.providerMetadata?.convexGateway?.cost;\n}\n```\n\n`getStatus` returns `pending`, `completed`, or `error`. When the status is\n`error`, the `error` field contains the error message. Store the downloaded\nvideo in application storage, since each `download` call fetches it again.\nOperations expire after seven days; upstream video retention may be shorter.\n\nOmit `webhookUrl` to use status checks alone. If a completion callback is\nmissed, use the saved operation to check the job and retrieve its result.\nApplications that need automatic recovery can periodically check unfinished\njobs.\n","readmeFilename":""}