{"_id":"@odla-ai/ai","_rev":"37-789f2c94096da0e40dd73c1955a2ddec","name":"@odla-ai/ai","dist-tags":{"latest":"0.17.7"},"versions":{"0.1.0":{"name":"@odla-ai/ai","version":"0.1.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.1.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"dist":{"shasum":"1a5ee1771b5f69010fc9e7fed4464d14d0ba54f8","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.1.0.tgz","fileCount":17,"integrity":"sha512-lRvEccGezThWxVHhwZXS8eC851RNsiVhznv2lR8wnzaszNZnKVz3QNWWC6Mllk83lPUxYFmf/rilTdeivciAbQ==","signatures":[{"sig":"MEQCIG+zRiTt6mTgd+3FP+JXtUt/p4+3I2AqDrS5n9wHGidXAiAFpfMJcVOxqJNHnoEqlwxvvjn51DUwTiNINVAoqvw88Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":574728},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d0607e1167abe8c39650dce0ea70179387542194","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness. The place every odla app reaches for when it needs AI. Isomorphic: Node 20+, Cl","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^3.0.0","typescript":"^5.7.2","@odla-ai/db":"^0.2.1","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":"^0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.0_1783103013180_0.9500889940613011","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@odla-ai/ai","version":"0.1.1","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.1.1","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"dist":{"shasum":"b9e6f551f4d3d85f60cc8c7d4b11a70f3efe652a","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.1.1.tgz","fileCount":17,"integrity":"sha512-xaCC1qS8Ax6djVBXGxHsY4ItNVIDN+eI686yzOlcUDSQixEvUtLFj+qGmpQg7pUXvazwkELwrr+i3qAuKlGhAA==","signatures":[{"sig":"MEUCIGKMv1IBkLawoFAwljFpymmfG7qjPc/n1+MDbyMYvzAvAiEAnnxiNES+/uR8yAQ4XmVgvyx16ovcIhPxJNixpMBWqwg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":581816},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"39d12f55cb5ac3441673c926f88081c9a16f2d80","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness. The place every odla app reaches for when it needs AI. Isomorphic: Node 20+, Cl","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^3.0.0","typescript":"^5.7.2","@odla-ai/db":"^0.2.1","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":"^0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.1_1783106023765_0.28996187229865455","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@odla-ai/ai","version":"0.1.2","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.1.2","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"dist":{"shasum":"8c8768880823533a1408ef37c0157bff947b3ff9","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.1.2.tgz","fileCount":17,"integrity":"sha512-NVzdAUY4+tYNvihi0cv2CEFI2FE9Dh3yiTgCPo7rfR1qTGNcIN0bzbkNwZjRkkZdtv7ZsjwefMcK+MkY22aXeA==","signatures":[{"sig":"MEQCIHqSStGz4wG/OFfsrmJ4Mkh4g41IhYALESX4fu/Su3lpAiBgziqCdFw9a/Kax3+PaTYol5+aLcSh+5uN4V09ccI1Cg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":581816},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"26fb2a923a6ac454542eb86a36f65cff4642be00","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness. The place every odla app reaches for when it needs AI. Isomorphic: Node 20+, Cl","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^3.0.0","typescript":"^6.0.3","@odla-ai/db":"^0.2.1","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":"^0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.2_1783111167316_0.32866250137391684","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@odla-ai/ai","version":"0.1.4","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.1.4","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"dist":{"shasum":"3beecc34580682400bd3f9483dc2170557d39398","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.1.4.tgz","fileCount":17,"integrity":"sha512-6gw3xKCNwHxKUxwY0g/l3GFxRt2+6y2tBD6WV9Etf7+7pffLktAFE1u5bCTmoCOsEWDEthu+U2k+azHgWMwLhQ==","signatures":[{"sig":"MEUCIBHV3Xvl2OlbiVGyRLGdcBE+NeqzckzoO25PqO8n5WGHAiEA5NH7hWwM1ltgHg0Xe0zEcHbsnAP+lfcl40swhfbOgy8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":589257},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"355032a5006f08a0e664a7256c2ffdb811754440","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness. The place every odla app reaches for when it needs AI. Isomorphic: Node 20+, Cl","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"^0.2.1","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":"^0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.4_1783190125304_0.47322303917172737","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@odla-ai/ai","version":"0.2.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.2.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"dist":{"shasum":"73c142f2d9e6cb758a437d1d833a41086ac8ceb5","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.2.0.tgz","fileCount":17,"integrity":"sha512-t7MPbBZlwvNOS+M4kK5zcmppz4QAIGMRSE1XMNKcZsyFEF/bVEw0GCFfbF35GVsxaRynoueTM61ywFd/LZ1Ghg==","signatures":[{"sig":"MEUCIQD3WwETVQ4LjA30RYqQGKe2G2cvsNdQSaT3LtFkCsyoEgIgYuSqcYSytHIgcqlewyb2RYsZPNaYViey5wKadCJLajg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":615512},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"bcedf1ae2ce229efa07823d9313cc49a8cc29b0a","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness. The place every odla app reaches for when it needs AI. Isomorphic: Node 20+, Cl","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"^0.2.1","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":"^0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.2.0_1783200605733_0.250634131260113","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@odla-ai/ai","version":"0.2.1","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.2.1","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"dist":{"shasum":"c688742673cfa69f3a02645ae518f9e7e8b259e1","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.2.1.tgz","fileCount":17,"integrity":"sha512-iaH5GE1rhJJrxfCDeraRPQ+IELP4J1fZOJMQHaJgK67Wr6h8d1mP1/hzA9SNpuucWHOS/jUIGgkaFuGRD2wA9w==","signatures":[{"sig":"MEUCIHXPmNEMJ+xYYHNYBgIhi98SU9lpU5tNNnnLifIiGun6AiEA0P1/zjv50VZyoOlK5b12e39grGS050Kb86q2z0qHPVk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":615521},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"a5a1b2b5571ecee045ebe9effdcd2d9a2d606a1f","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness. The place every odla app reaches for when it needs AI. Isomorphic: Node 20+, Cl","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0 <0.6.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.2.1_1783205327787_0.32363686713039175","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@odla-ai/ai","version":"0.2.2","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.2.2","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"dist":{"shasum":"7c45c2af1fbcd66f8d975212efa1eec99c0ea11c","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.2.2.tgz","fileCount":20,"integrity":"sha512-ViIJYYjNG0fxxVt8YcQqHnj08CQO4NUqIIe4YpSe+oWnMySjj5KW1mN4kOWDpBTZ+1UqKiJo63rjT1GqjPRRpA==","signatures":[{"sig":"MEYCIQCA0qIXMKRYLIiveuGouDgUIft6wdFrlFm6RrK6jEOEjAIhAP5bOm9FGKs/diJDhnRoZPjhvPa6tCDMW4ANu5piKj+I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":623144},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d28d64caafa145e5b47377ab60aca233d2dd9d3d","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness. The place every odla app reaches for when it needs AI. Isomorphic: Node 20+, Cl","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0 <0.6.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.2.2_1783221822237_0.6570262250263874","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@odla-ai/ai","version":"0.3.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.3.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"0a08c529468d36df9fb0008a5069c395b0248b57","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.3.0.tgz","fileCount":22,"integrity":"sha512-YV3QcWNw9CFBBND04EZAh1srcZt/hBch6EDS6iSIi38y6qCIbI4rKU2fA0AVnFLlHycWTc6K7aSfY0nW+xDwqw==","signatures":[{"sig":"MEUCIQD1Ev0Pxz1zjId091a9Vt0y/XLO5rZUcJRyScBuHjo1IAIgQfcvSkaY99Tk3wsM4faLLHQ/cUmszFqFGe7DqTxsG50=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":795998},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"25655934e6ca0ab7220dd6cca06faa92fc524b63","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run gen:llms && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.16.0","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0 <0.7.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.3.0_1783705509293_0.21791166372550186","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@odla-ai/ai","version":"0.3.1","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.3.1","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"1f9f7e883e2ca35fbb2f204632f5b6e67e53287f","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.3.1.tgz","fileCount":22,"integrity":"sha512-6UHVW6a3H4Ly2afFLEeKyTj16OYOlU0LY44ECbebj8R/Pnwm/YISMlVlaUmdXkAEjet/BzJ2EqoDbHy1VzPOrw==","signatures":[{"sig":"MEUCIQDiTAio1b0Z6N0Cw2LslsUvP+rhLwvOnJonJfAIdw/7CwIgV5z/mcV/z7jJAJh9CAjlnFn20Wm75EZ/AgE48tNW+C0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":796183},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"5b6b6265aa320e910400bb301aa5d5768698d18a","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run gen:llms && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.16.0","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0 <0.7.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.3.1_1783721053878_0.06108711664826161","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@odla-ai/ai","version":"0.3.2","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.3.2","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"b597663264b4bc864beb58da7343c80ff20434bd","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.3.2.tgz","fileCount":22,"integrity":"sha512-dLX9tvThAvbGmY7tT7l2ZUdlLXq0cBitPZzTsLm1C2nS0Q6KuJKFvtJQBBo/6VBELbyI0YCrhd/Rj/ew4xMk0g==","signatures":[{"sig":"MEYCIQC/yV8uwsVejaPlL8KcdFmIPD9BtpXERe48qCHRkJemBwIhAOLqkkxF93eMoZTQRx284KpgsP3I9/CpN06pVfu7s95s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":800412},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"007933e122c6c72dff4a7d670462c24532273841","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run gen:llms && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.16.0","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0 <0.7.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.3.2_1783733015045_0.6126749885042304","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@odla-ai/ai","version":"0.3.3","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.3.3","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"871c74cf02952d2d350bc232db99f19ebcd5259f","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.3.3.tgz","fileCount":22,"integrity":"sha512-q1JhUShXZqEiuz10/XnHDtbK6S0JtddULmHRUmOsHSlzrn4cUe+fdWvdEbfETEqI170eWgEnb+viEWPn2VucGQ==","signatures":[{"sig":"MEQCIE9JmGy2iXKSmJAY1YDeZd79DTffshmD275m3z7+iQ78AiAmiZi/Xx3p+g8KlUQ95v+jePyKUqQ7WMuiTrFW/MHdwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":805078},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"8062b2c41e127fecd3ae154e0cfa4cc704edddcf","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","gen:llms":"tsx -e \"import('./src/index.ts').then(m => process.stdout.write(m.generateLlmsTxt()))\" > llms.txt","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run gen:llms && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.16.0","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0 <0.7.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.3.3_1783740864724_0.6963812475390392","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@odla-ai/ai","version":"0.4.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.4.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"8e4143b645d265fee5ef46499981d34cd3cb3280","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.4.0.tgz","fileCount":21,"integrity":"sha512-Z2Q/kMPGZRAPWwyFtnQSgjOjhpZV0zI0JFtyl5wjZDMxcCK09c/EozjuE1RLk3UsT2WPEMr4UscsxWusp7JrnA==","signatures":[{"sig":"MEUCIQCLOTClPFbvKXa/bBOo4Azwr4cnSnzk84HgCKcCjkIf+wIgTsGsjv7b7IzSLCgsX0TTi//xlsK+Di8rEAEsGwqwPCc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":756328},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"1bca268f65a091cbfa7d04fd9f8e3393a8aa47a3","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0 <0.7.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.4.0_1783872540695_0.9977351745121825","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@odla-ai/ai","version":"0.5.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.5.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"cfeee649c768d5d7f32b4b15e315c0a9a778d2ca","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.5.0.tgz","fileCount":21,"integrity":"sha512-wgyz1belWNlAeSZ23hrqEWOMUXk6F2uREgJjBkGlHa/rScsCZrL+B40RK16vMxJqvKv5eqs/43VvBKMs53kv1Q==","signatures":[{"sig":"MEUCIGoUcGCPksoZVDpe7wC/mxYrE+doD0FdEQxr/0evK5qIAiEAkNgbQBZNvWNi2M9a/YNr4eyMQk+weA1/QoOQ4UuyW18=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":886343},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"b3c5f03410373286de183a587e91c6dd7c4447df","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.16.0","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0 <0.7.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.5.0_1784205418334_0.7243758247738163","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@odla-ai/ai","version":"0.6.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.6.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"51d3adb517cf4b0a53f92d40c47fbc0e3fd363cd","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.6.0.tgz","fileCount":21,"integrity":"sha512-ZI6rXoVciRalwHFRljQxRzhDdjE+5dJ3NzXGWNtz4/SBzNYJkIkVCC+LTUNKec818WmmFQDU/K7GqHbwEN37Lw==","signatures":[{"sig":"MEUCIQDiVF94y4aSm27kk18l1EqBRHIsaG2MCFJA+kQzQntEqAIgcBeRldbzWgqGa65cedqBFap95fZBXNs8WyBfzwyM9zk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":888998},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"9ef23b78c5718c893b432cb52bddca7399befe7b","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.6.0_1784612651442_0.5907446919851758","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@odla-ai/ai","version":"0.7.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.7.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"d1efd3f7ff4b269fb8b5f563b31cb92621af4199","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.7.0.tgz","fileCount":21,"integrity":"sha512-QgQbkQhu1GZa+5LoRlI3APLv42scMK5nP2gm+67gMHCuP0c7KlSEPfdkrMdSLMj6x0USVpwW6Z/VGvGbqoIzxQ==","signatures":[{"sig":"MEQCIACrjo88c5zCvMx17qUoNBGMJEBs0Bb2idhqPp7J1VnjAiB05jiHri1RqvAJxNEVZxlLB1Itlj3piKxrYzNuVyL6wA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":900496},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"0df97a9ed2a54f396b57401b44411ec063419076","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.7.0_1785192803332_0.3281617520887794","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@odla-ai/ai","version":"0.8.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.8.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"105115a600b05b1e37a5c0c208fb54e3cd8d2065","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.8.0.tgz","fileCount":21,"integrity":"sha512-aRu1TOFf+jtoCDgGa7WvJU6a0y5X8j0e2WkuMrWsYpsoS8ugiJt9jlpUCPDv+3SGYnU6E0PxZilOmBMecqkN1g==","signatures":[{"sig":"MEYCIQC3AG0fJ9tIQpWsbitKX6Y4hDbfi37/lY2jM6cjAcWCtQIhAPaeLWodv5C9jsQuqUCGbuVFxsHa2YB++0GCf6K9htiy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":903074},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"81b462a7822d7654b5971b1a8e56a5014cf240f0","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.8.0_1785351989647_0.7013478916085136","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@odla-ai/ai","version":"0.9.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.9.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"7bf9a58e7d0fd42e74817c5b9ddb9b907547f993","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.9.0.tgz","fileCount":21,"integrity":"sha512-5sTJSXDTyvWlGj0vKvckyWunyox1+1iGBmMWHoOaJFHWEoy/MMCAa7Z1D3ARxXB7E+VhW7lQpnCXGmkfJjbD+Q==","signatures":[{"sig":"MEYCIQDXNvdAr/pa5TA7ihELE6wXW1Aj9fYSqmnsFInAzfrfJwIhAMnbTyqwjCVQ32fx5a2VSjdXePfTxJeXMylO+aZUOnI0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":938072},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"9349eb48b0fed47829f2ba41c42881f63163f1b3","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.9.0_1785599035211_0.48787381420396003","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@odla-ai/ai","version":"0.10.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.10.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"53458ab7886f9719cea9f6252c2074800ba0dcee","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.10.0.tgz","fileCount":33,"integrity":"sha512-e42TaJsQLy+/Rgfaje9Db4nal4SzSfTmSmH82gAipxtM2e/9TvxXvyKvSx6Jq+iqVMmhjH4f4pcgNttBfbfQPQ==","signatures":[{"sig":"MEUCIQDJWgBT5AUDiVAwMiu8G+lz/wheT+z/ZLiPE5gn7iHlVQIgQxM8+AxYRhIwj+Uxq6uspwfcbK8/YgbviSFAL/Hp9x8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1014723},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"c7b9d1d63e3f5c7b4ebfdf2d545075bcc025b3c6","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.10.0_1785604571208_0.6059097505293227","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@odla-ai/ai","version":"0.10.1","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.10.1","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"db611ee3fea1999aad9ff20a813e682a96b8561b","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.10.1.tgz","fileCount":33,"integrity":"sha512-J8wbxpIA5BoDjqqQyI2vK7O8Who3ITS/fMnMsbBA44yLoc7E3YwCPr6Y3S+nk/NBDLd89RU6FXronsVkJnuRFw==","signatures":[{"sig":"MEYCIQCJQcrND3FQ/gqWRFwPivDdb8jgVhxvBFe17WhbiKKqhwIhAI7TUKILOtUW0nPGBq3xRPQ1pazi9ajLASinD4DbhBc4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1054611},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"076ef9559fd47590ee7da5f7d039f1cf65af04c5","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.10.1_1785612590332_0.24621388145150136","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@odla-ai/ai","version":"0.11.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.11.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"c9eeaa035c49cdd2c60fb8ea8a5357182b197ea3","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.11.0.tgz","fileCount":35,"integrity":"sha512-xRIkmd2QPSclu/cELfRiGFaleU90L9upkCBEXXPx72PJd9QPpfCmoL9LuzuPLMRoyaCVvel917q5pIWerPS5yw==","signatures":[{"sig":"MEYCIQD6kNObYIsXVToVKBNw50zb2Ot3wRvmiGZjtOeUw54/SgIhAJi6+d0YMM7Vjyk3lBJ0tdNtp+VZwYWJDGZHkDidv29C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1244679},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"83bf4ba73d094746c1c9f27046c5ee26d40214f5","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.11.0_1785617088156_0.16745686761231116","host":"s3://npm-registry-packages-npm-production"}},"0.11.1":{"name":"@odla-ai/ai","version":"0.11.1","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.11.1","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"1fec83870cbb37ada3e1909321d25fdc6f800578","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.11.1.tgz","fileCount":35,"integrity":"sha512-ghJzSWA+i5Ka9kYpTTwVD4e7YDceKK1E0BKMSWXoQ2ieV1lmaB8fWJD88TGoqF7qq4cDB+HZhCqhr3osgp6heg==","signatures":[{"sig":"MEYCIQCWBxAi3aRGn/zyy8Z8moVJsi9jGKB5HD8Yh8EdSIR5WgIhANFRcqGIE4pwknf/ie1pr6qoqdx2CZU2lRhDAA4vbSjt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1247760},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"368c5a541400cdcdb4bb6f8790a0c5c8095275b0","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.11.1_1785692794623_0.9232876786418291","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@odla-ai/ai","version":"0.12.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.12.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"6376f65b4c2703430863bf1cefc3d9991e91cc02","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.12.0.tgz","fileCount":35,"integrity":"sha512-J4lgAFXGEykrmi+R4WNlGF7Lj0h2OZ6GlXcNJydvbgHgldBcoW3fbjE687wx5jlIW72HqCgVXyiawmFPzAKWhg==","signatures":[{"sig":"MEUCIFUVJYJvIMzzcofimUzOH8YpyUU1pLJKrNVu8dLKIGB5AiEArC7aKrhW2xvGoIN6xazzjT4AckoSULV6VEL+WJ8mYdU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1333069},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"48c553ff92d8cfab83b482ca370ebed4a2db9ca4","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.12.0_1785708580958_0.870762068574018","host":"s3://npm-registry-packages-npm-production"}},"0.12.1":{"name":"@odla-ai/ai","version":"0.12.1","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.12.1","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"4a042f611241def39f49d81df837473f9acafa30","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.12.1.tgz","fileCount":35,"integrity":"sha512-6y+bjg898SMQ9jnABukKkmK+dlaecfTY+YgJX4hL9eUOR0Qlbicdg82X1Kf9HEYX5HfP+HMfoUM6x74pMcTbaQ==","signatures":[{"sig":"MEYCIQCs3kCizwizz7afb4eORezm5RRjpoF9Xp03nkHEG49k9gIhANQ3GuYeuAoUeg+GBTOYcisB4kcAJKo5dVftWW8HApqW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1343499},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"258f03dcad3793f1ec44b7626c3ca3552cee462a","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.12.1_1785803609126_0.5980316821766885","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@odla-ai/ai","version":"0.13.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.13.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"a245c713332b0da1e8fa9168ebdfcc43093edb03","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.13.0.tgz","fileCount":35,"integrity":"sha512-GLa+VptHALVq/2b7S7Jk0W1lmHX3vkwW0009ExAMhMAQDQOgIqCDMZTcQMgeXcXXMxBzaNfG36vop2vttQ1I4g==","signatures":[{"sig":"MEUCIA62tjAsF1EQJF6QAf7gDfS1cTN2HMmzpM/VQP0mLz7yAiEAnyHDZB61HSfPZrmC4F/BsPlNxF0dW0bvNX4CZAVYBRg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1381009},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"ab321d0cb1624ca9c03811839daba623df21baff","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.13.0_1785905817629_0.7218804166148463","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@odla-ai/ai","version":"0.14.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.14.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"44680f6b0a5f04020a248fdd1ef5b40307ed7f75","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.14.0.tgz","fileCount":35,"integrity":"sha512-N8UudtSnwbBSEN8uzxt83mRIxdNvBZqJUxll63YwmfUqj1XIpIR6EQvvoEn3sZji+IB+/7sGN43n0PbNN0Qe9A==","signatures":[{"sig":"MEUCIQCryqtAtBOIkrSolEmU7MBY213bJQ23om0wmbaW1SdjrQIgfvWlUElJoCujTnTe5jecJUEylyPXhE4JlPRThcgN5p0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1422251},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"cfd24fe366c39f3f32ae6920b8ad4a47ecfb4402","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.14.0_1786061961842_0.4256364866910245","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@odla-ai/ai","version":"0.15.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.15.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"d83d5642dda9468fca3d20a9ab0f3f6e75f3bf3d","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.15.0.tgz","fileCount":35,"integrity":"sha512-fncAxc95/oi1JCYdfL/PHVeVVckL0xDoEmjI3sMJwEc4T5nFwJK331sErhzgFyyoJxcj74Lp39FOKCD6EXZ2Lg==","signatures":[{"sig":"MEUCIQC3torzCPziygU3NzfJzb8x7sVtqTRjhcGXerVYz4989wIgfTOpzO8cMtHnZT88y7Ig4sDU++YxoC9FpotZzRyjjj8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1425428},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"0453cfad973b3a6e6cbb2ccccb226f7b46ed5641","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.15.0_1786493792157_0.7199953647249613","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@odla-ai/ai","version":"0.16.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.16.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"a2574979faba2b42305518112aab64632b922730","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.16.0.tgz","fileCount":35,"integrity":"sha512-08N0hutUSDSYf+ZcpBX0Gj5Zvj9OD4jok68T/6M4TzcUxF8sJgpbOK4zehCHUrkxJOOLI57xpcmMMBNbgMUpRg==","signatures":[{"sig":"MEYCIQCu1BYAL5ecJCDfNrYNdksE/tMaqG4sJgP/yg5bXD3MUAIhANLzlkooltCQdOE5l7hjENj1T6TNuVR8FVPpMVSA8DZK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1438652},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"48b496b2a50f85273443cedda4324ee740ad8b99","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.16.0_1786729927081_0.8490110871791592","host":"s3://npm-registry-packages-npm-production"}},"0.16.1":{"name":"@odla-ai/ai","version":"0.16.1","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.16.1","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"2b7ed4fcd9091225f1a725739e3aac6025128495","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.16.1.tgz","fileCount":35,"integrity":"sha512-+wO5IcDXjHYZpX7HlO/NKaWxZn5hqJ0JfJWjghYZglEf8bZnxOPsK/HIYN02yf/BphrHUF8zXFUa4alvpQ0BbQ==","signatures":[{"sig":"MEUCIQCZ23ioWKNmZ7RNHFSWRbdCgRw4WRu7nzVzeS8srw7MZwIgB/KLcFFR8FkvOPuBJvxou/1H+hVRoU0Gn+zVxy5hDOw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1440166},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"d15ccbe1352ee0e42d5247050eca744a55d4aef6","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.16.1_1786927945589_0.8642844135295169","host":"s3://npm-registry-packages-npm-production"}},"0.16.2":{"name":"@odla-ai/ai","version":"0.16.2","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.16.2","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"a3f0fda6341e46430f9bc60b5ef5b46eb59b904f","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.16.2.tgz","fileCount":35,"integrity":"sha512-kmVSDu/a6dJ6W8Iim6L4PG0EV/LXXIALWTpY2b7jukev44c6fm9Zj/h+dyOIMw9JipSi/aRDeCQosr0pc9NP+A==","signatures":[{"sig":"MEYCIQDmET1pvs/Ior1qvoM8cqH8Au98kmK3mdbdLoGQ6vTlvgIhALdFwic8JHHI63uPCGr2Ylz76xTjYOY+e0+c5IpdW8By","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1440172},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"f2f1652ba56d1b024e131e3ff368a00bafe32461","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.16.2_1787176148914_0.8974317363798663","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@odla-ai/ai","version":"0.17.0","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.17.0","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"be8f1a4a798c69a67e0c1824ff71be04c0df6549","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.17.0.tgz","fileCount":35,"integrity":"sha512-bSuaDvMogYSGxkXKwYzA2qeGfMt/K7WQrg5P4aGduv5RlHaESs9o25kleL+bRoN9jdp+M4Jy9TnxJPEV3q22yQ==","signatures":[{"sig":"MEQCIAESybTjJZqv9yZADugiPwoeAG6Wdych3/e+Vdtz2B8EAiAfIGGdda5pm+UPZXNik9ZrIj4rYx4Yov4SDxw8kyu5Jg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1441944},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"9591a71e4e6b93df227f9b5b9100c3ac9d0a93d9","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.17.0_1787264732589_0.9024761735984876","host":"s3://npm-registry-packages-npm-production"}},"0.17.1":{"name":"@odla-ai/ai","version":"0.17.1","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.17.1","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"7a63f03b0a218caf64d5e9e3fc70960ad61c42fb","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.17.1.tgz","fileCount":35,"integrity":"sha512-8125qzLu+wel1qXFi1DAzmh1SdOtT3ptLYrcSetm0TLDuYo++/UCK14U7zEyktnoQo14JKN1P8N9RKVjgwocbg==","signatures":[{"sig":"MEQCIAQI1GxWjoJbDnnSoMv6GLOyQbQfW3pS4HYIbnXXqDQMAiAU0ZM3NgFcxc6k6WqBaiGNuDOvhtRCjzNPh7syV5eXTA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1445868},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"afb6e8dd3d167f2548f1ca7948556c4752a36199","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.17.1_1787702664739_0.8901802188422445","host":"s3://npm-registry-packages-npm-production"}},"0.17.2":{"name":"@odla-ai/ai","version":"0.17.2","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.17.2","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"bf6d42922ebe438839353dabde93287ce257ab7e","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.17.2.tgz","fileCount":35,"integrity":"sha512-+l9qbFHWiTugMG+tg3jwYVuRVj5pK9734mYUcU7IIjVbwtHL9IuHUxejS3SURLsdao6T7lbd96AQkamMCZevbg==","signatures":[{"sig":"MEYCIQCiKarUsLvvvCMF2XGzbaL65dMWxVx/0jFEG76wt5ksJAIhAJ1xfvkdnBlhpVCX9ZYX83H461J1cwqxbZsdJrxMeXNN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1448884},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"30c5a77e8230457f9e54b2cafbd1491665e761ec","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.17.2_1787716061403_0.7746461891269099","host":"s3://npm-registry-packages-npm-production"}},"0.17.3":{"name":"@odla-ai/ai","version":"0.17.3","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.17.3","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"37988521965cb2bc00b68788efbb16520a914f09","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.17.3.tgz","fileCount":35,"integrity":"sha512-p/+5p8HhJgMdu+7ga7HsFiAYp/np8zVNEjaHny/8BKWHtmhZMJvaUwA0YKgcELsRusZWlcXNvxr1Ihcz1bYe5Q==","signatures":[{"sig":"MEUCIGS3Kw3CbheZKg0Yo6Uj2hG+JahDuEEzE0exymjsYVi7AiEAwB00PKURB5BHBW1jKCWj9qRQIQPUPnup9kviqpprzKw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1463387},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"77d0adea9ef07c56ec7f30bf688499f5288089d2","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.17.3_1788074081177_0.5358294676054058","host":"s3://npm-registry-packages-npm-production"}},"0.17.4":{"name":"@odla-ai/ai","version":"0.17.4","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.17.4","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"c4b4ecde9551ce9e94256537b3123b4e55a22ceb","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.17.4.tgz","fileCount":35,"integrity":"sha512-HRoR/Ys6HySDiVp3NmhH9TQgbfYXrErn3g49TqZBgJKhpyBXJqJW44LxJTGCZfbu16jzusUR73et0wmb/7GNsg==","signatures":[{"sig":"MEYCIQC3QVksGzVkj2kLJRHvVZHnq5MeHbacXG/+GLr5xyFhaQIhALcuQYJovAxyFfN6LZ8Wn0PJE2wF8ldOQT8P2WLUuT99","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1481402},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"22e017b1ff60edfc57a059abbbb62e4b917bf4da","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.17.4_1788111910966_0.7649957348690288","host":"s3://npm-registry-packages-npm-production"}},"0.17.5":{"name":"@odla-ai/ai","version":"0.17.5","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.17.5","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"6ac418d6ff7eb626d347782f73b77e9cc47e8e3d","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.17.5.tgz","fileCount":35,"integrity":"sha512-ANzePwbdj92Xy1LwMDyqZH0Hk7yqanaLI0carQMonFs6j7RTGFY1FOhbkmrvYLPP78xWQiIeza1dtWdq/xULSg==","signatures":[{"sig":"MEUCIQC9HkpRqRH2UjrRvnul0G41j5/P8+zKXH+Iaot7gtKNkgIgQ6XP0DyzA5FSwWC2XKko0/OFggdBB8q54bcyvQmuQi8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1496849},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"cb2462eb745fc309db9f314faa1dddaf8758e720","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17188eca-9359-4d87-b3c7-d4bd9434b420"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.17.5_1788128192378_0.11523823908463604","host":"s3://npm-registry-packages-npm-production"}},"0.17.6":{"name":"@odla-ai/ai","version":"0.17.6","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"license":"MIT","_id":"@odla-ai/ai@0.17.6","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"homepage":"https://odla.ai/docs/packages/ai","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"dist":{"shasum":"0785f1db59151663bec230c38aff80f24ceb87c9","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.17.6.tgz","fileCount":35,"integrity":"sha512-nTyUlZ4WUcQz8PTkHg7zbZOg1YCAKZnUwvB/hg4SxanBx34sfnfKI4op5qLvSmP2o4C+EoiCQWMuVTgAz+QG9Q==","signatures":[{"sig":"MEUCIQD19Wl9Ck3NlC4jAE4V4xkby+8uSQvKAWLInwF5aSb9JwIgcljQDR6/aw11crm3mz5GBMABQuVzsz13Z1vPDW9oXek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1505509},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"gitHead":"daa8648f66d41e2ed13608f3d13f6f18815eb79f","scripts":{"test":"vitest run","build":"tsup","clean":"rm -rf dist","smoke":"tsx scripts/smoke.ts","typecheck":"tsc --noEmit","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e3de1788-2db8-43b1-9922-b47877638710"}},"repository":{"url":"git+https://github.com/cory/odla-ai.git","type":"git","directory":"packages/ai"},"_npmVersion":"11.6.2","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"openai":"^6.0.0","@google/genai":"^1.0.0","@anthropic-ai/sdk":"^0.70.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^4.1.9","typescript":"^6.0.3","@odla-ai/db":"*","@types/node":"^22.10.0","@opentelemetry/sdk-trace-base":"2.9.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ai_0.17.6_1788385261420_0.9176037118444309","host":"s3://npm-registry-packages-npm-production"}},"0.17.7":{"name":"@odla-ai/ai","version":"0.17.7","description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","license":"MIT","homepage":"https://odla.ai/docs/packages/ai","repository":{"type":"git","url":"git+https://github.com/cory/odla-ai.git","directory":"packages/ai"},"type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pricing":{"types":"./dist/pricing.d.ts","import":"./dist/pricing.js","require":"./dist/pricing.cjs"}},"sideEffects":false,"engines":{"node":">=20"},"publishConfig":{"access":"public","provenance":false},"keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"scripts":{"build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test":"vitest run","smoke":"tsx scripts/smoke.ts","check:publish":"tsx scripts/check-publish-safety.ts","prepublishOnly":"npm run build && npm run check:publish","smoke:responses":"tsx scripts/smoke-responses.ts"},"dependencies":{"@opentelemetry/api":"^1.9.1","@anthropic-ai/sdk":"^0.70.0","@google/genai":"^1.0.0","openai":"^6.0.0"},"peerDependencies":{"@odla-ai/db":">=0.2.0"},"peerDependenciesMeta":{"@odla-ai/db":{"optional":true}},"devDependencies":{"@odla-ai/db":"*","@opentelemetry/sdk-trace-base":"2.9.0","@types/node":"^22.10.0","tsup":"^8.3.0","tsx":"^4.19.0","typescript":"^6.0.3","vitest":"^4.1.9"},"gitHead":"7b526c09c668c50fc268ad33fcf423061507948e","_id":"@odla-ai/ai@0.17.7","bugs":{"url":"https://github.com/cory/odla-ai/issues"},"_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-K51QtnfPv6CU67SXIbOYZYMPbea53PE8SYoRmHEEEiII0spaxRgvzX4i/jk6xiPjETcGyJxH1TRLy+P9LIJXzQ==","shasum":"186c70a146b3ea58a0e80795fdb01eab32bdfa79","tarball":"https://registry.npmjs.org/@odla-ai/ai/-/ai-0.17.7.tgz","fileCount":35,"unpackedSize":1511562,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIF6Xw5ls+7b6WMllqqnEmaiiOGClNaNuB15sc7pu1cchAiEAvoHr0ppFVy9wSDyYZc2eb/wl6B/C5Bos0WaVXtaClm4="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e3de1788-2db8-43b1-9922-b47877638710"}},"directories":{},"maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai_0.17.7_1788589760975_0.3367534971067454"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-03T18:23:33.004Z","modified":"2026-09-05T06:29:21.351Z","0.1.0":"2026-07-03T18:23:33.370Z","0.1.1":"2026-07-03T19:13:43.906Z","0.1.2":"2026-07-03T20:39:27.468Z","0.1.4":"2026-07-04T18:35:25.482Z","0.2.0":"2026-07-04T21:30:05.893Z","0.2.1":"2026-07-04T22:48:47.962Z","0.2.2":"2026-07-05T03:23:42.408Z","0.3.0":"2026-07-10T17:45:09.459Z","0.3.1":"2026-07-10T22:04:14.040Z","0.3.2":"2026-07-11T01:23:35.207Z","0.3.3":"2026-07-11T03:34:24.934Z","0.4.0":"2026-07-12T16:09:00.871Z","0.5.0":"2026-07-16T12:36:58.558Z","0.6.0":"2026-07-21T05:44:11.613Z","0.7.0":"2026-07-27T22:53:23.541Z","0.8.0":"2026-07-29T19:06:29.872Z","0.9.0":"2026-08-01T15:43:55.343Z","0.10.0":"2026-08-01T17:16:11.356Z","0.10.1":"2026-08-01T19:29:50.494Z","0.11.0":"2026-08-01T20:44:48.303Z","0.11.1":"2026-08-02T17:46:34.848Z","0.12.0":"2026-08-02T22:09:41.204Z","0.12.1":"2026-08-04T00:33:29.347Z","0.13.0":"2026-08-05T04:56:57.781Z","0.14.0":"2026-08-07T00:19:22.054Z","0.15.0":"2026-08-12T00:16:32.327Z","0.16.0":"2026-08-14T17:52:07.212Z","0.16.1":"2026-08-17T00:52:25.739Z","0.16.2":"2026-08-19T21:49:09.059Z","0.17.0":"2026-08-20T22:25:32.796Z","0.17.1":"2026-08-26T00:04:24.895Z","0.17.2":"2026-08-26T03:47:41.578Z","0.17.3":"2026-08-30T07:14:41.319Z","0.17.4":"2026-08-30T17:45:11.117Z","0.17.5":"2026-08-30T22:16:32.584Z","0.17.6":"2026-09-02T21:41:01.602Z","0.17.7":"2026-09-05T06:29:21.197Z"},"bugs":{"url":"https://github.com/cory/odla-ai/issues"},"license":"MIT","homepage":"https://odla.ai/docs/packages/ai","keywords":["odla","odla-ai","ai","llm","claude","anthropic","openai","gpt","google","gemini","agent","inference","multimodal","tool-use"],"repository":{"type":"git","url":"git+https://github.com/cory/odla-ai.git","directory":"packages/ai"},"description":"One general-purpose interface for AI inference across Anthropic (Claude), OpenAI, and Google (Gemini) — text, image, and audio — plus a tool-use agent engine and eval harness for Node 20+ and Cloudflare Workers.","maintainers":[{"name":"coryondrejka","email":"cory.ondrejka@gmail.com"}],"readme":"# @odla-ai/ai\n\n> ⚠️ **Early access — pre-1.0.** Agents work from bounded runbooks; humans\n> approve credentials, production changes, releases, and merges. APIs and exact\n> package availability can change. Review the documented guarantees and\n> limitations; this software is MIT-licensed and provided without warranty.\n\nOne general-purpose interface for AI inference across **Anthropic (Claude)**,\n**OpenAI (GPT)**, and **Google (Gemini)** — text, image, and audio — plus a\ntool-use **agent engine** and an **eval harness**. It's the place every odla app\nreaches for when it needs AI.\n\n- **Library surface.** Import it in-process and bring your own keys; this\n  package exports no generic hosted gateway. Separately, odla's System AI\n  broker uses the same facade server-side for bounded o11y/security purposes\n  and returns purpose grants rather than provider credentials.\n- **One canonical shape.** Anthropic-flavored content blocks, forced tool calls\n  with object inputs, a normalized streaming event vocabulary, cache-aware usage,\n  and a closed error taxonomy — the same regardless of which provider answers.\n- **Capability-checked.** Every request is validated against the model before\n  dispatch, so \"audio to Claude\" fails fast with a clear error instead of an\n  opaque provider 400.\n- **Server runtimes.** Node 20+ and Cloudflare Workers. Provider adapters are\n  runtime-lazy, but all three provider SDKs are package dependencies. Do not put\n  long-lived provider keys in browser code; use your own authenticated proxy.\n\n```bash\nnpm install @odla-ai/ai\n```\n\n> **Ask the runbooks first.** odla's operational procedures live in a database,\n> not in this file: `npx @odla-ai/cli runbook ask \"<question>\"` returns the current\n> steps, and unlike anything written here it cannot be out of date. Use it before\n> searching the web or working from memory. This README and the JSDoc in the\n> shipped `.d.ts` are the version-matched **API** reference; a runbook is the\n> **procedure**. Most tasks need an answer from both.\n\n## Quick start\n\n```ts\nimport { init } from \"@odla-ai/ai\";\n\nconst ai = init({\n  keys: {\n    anthropic: process.env.ANTHROPIC_API_KEY,\n    openai: process.env.OPENAI_API_KEY,\n    google: process.env.GOOGLE_API_KEY,\n  },\n  defaultModel: \"claude-opus-4-8\",\n});\n\n// One call, any provider — pick the model, the provider is resolved for you.\nconst res = await ai.chat({\n  model: \"gpt-5\",\n  messages: [{ role: \"user\", content: \"Say hello in one word.\" }],\n  maxTokens: 64,\n});\nconsole.log(res.content); // [{ type: \"text\", text: \"Hello\" }]\n```\n\n### Automatic observability\n\nEvery provider request made by `chat`, `stream`, `extract`, or `search` creates\none OpenTelemetry CLIENT span when the host has configured an OTel tracer\nprovider. The span includes provider/model/operation, all four token classes,\ncatalog-priced cost (or an explicit `unpriced` marker), provider latency, and\nstreaming time to first token. With no tracer provider, the OTel API is a no-op.\n\nUse low-cardinality metadata to attribute a call to an app or feature:\n\n```ts\nawait ai.chat({\n  model: \"gpt-5\",\n  messages,\n  maxTokens: 512,\n  telemetry: {\n    operation: \"support.answer\",\n    attributes: { \"odla.app\": \"support\", \"deployment.environment\": \"prod\" },\n  },\n});\n```\n\nStatic defaults belong on `init({ telemetry: ... })`. Set `telemetry: false`\non `init` or on one request to suppress automatic spans. Telemetry metadata is\nconsumed by the facade and is never sent in a provider-native request.\n\n### Capacity control\n\n`init()` can share a FIFO capacity scheduler across callers. Pools are keyed by\nthe SHA-256 fingerprint of the active provider key plus the provider-native\nmodel id, so aliases share capacity while credentials remain isolated. The\ndefault 20% headroom makes configured TPM/RPM/TPD limits 80% effective;\nestimated tokens advance the next-start clock, and only positive actual-token\nexcess advances it again.\n\n```ts\nconst ai = init({\n  keys: { openai: process.env.OPENAI_API_KEY },\n  capacity: {\n    limits: ({ model }) => model === \"gpt-5-nano\"\n      ? { tokensPerMinute: 180_000_000, requestsPerMinute: 30_000,\n          tokensPerDay: 15_000_000_000, maxParallelRequests: 64 }\n      : undefined,\n  },\n});\n```\n\nRequests beyond the pacing or parallel ceiling wait FIFO. `deadline` includes\nqueue time and `signal` cancels a queued request.\n\n### Streaming\n\n```ts\nfor await (const ev of ai.stream({ model: \"gemini-2.5-flash\", messages: [...], maxTokens: 512 })) {\n  if (ev.type === \"content_block_delta\" && ev.delta.type === \"text_delta\") {\n    process.stdout.write(ev.delta.text);\n  }\n}\n```\n\nThe provider event union (`message_start → content_block_start →\ncontent_block_delta → content_block_stop → message_delta → message_stop`, plus\n`error`) is identical across providers. Platform-hosted SSE adds a final\n`receipt` event containing usage, cost, queue wait, TTFT, and total latency.\n\n### Structured extraction (forced tool call)\n\n```ts\nconst { value } = await ai.extract<{ sentiment: \"positive\" | \"negative\" | \"neutral\" }>({\n  model: \"claude-haiku-4-5\",\n  user: \"Classify: 'I love this!'\",\n  tool: {\n    name: \"classify\",\n    parameters: {\n      type: \"object\",\n      properties: { sentiment: { type: \"string\", enum: [\"positive\", \"negative\", \"neutral\"] } },\n      required: [\"sentiment\"],\n    },\n  },\n});\n// value.sentiment === \"positive\" (parsed and validated before it is returned)\n```\n\n`extract` and local agent tools validate provider arguments before returning or\nexecuting them. The dependency-free validator supports the common tool-schema\nsubset: local `$ref`/`$defs`, `type`, `enum`, `const`, composition, object\nproperties/required/additional properties, arrays, and string/number constraints.\nUnknown or unsupported schema keywords outside that documented subset fail\nclosed. `extract()` throws `ToolInputError`; local agent tools return an error\n`tool_result` and their handlers do not execute.\n\n### Web search\n\n```ts\nconst { text, citations } = await ai.search({ model: \"claude-sonnet-5\", user: \"Who won the 2026 World Cup?\" });\n```\n\n`citations` is the normalized source list, parsed from Anthropic's\n`web_search_tool_result` blocks and inline text citations, OpenAI's\n`url_citation` annotations, and Gemini's `groundingMetadata`. A citation\ncarrying `citedText` or a `startIndex`/`endIndex` span was attributed to a\nspecific claim; one carrying only a `url` was merely consulted, which is much\nweaker evidence that the answer came from there. It is `[]` when the provider\nreported nothing — a grounded-*looking* answer is not the same as a sourced one.\n\nTwo caveats worth knowing before you compare providers: Gemini reports\n`vertexaisearch.cloud.google.com/grounding-api-redirect/…` links rather than\npublisher URLs, so hosts only line up after you resolve those redirects; and\nstreamed responses carry no citations, because the event set has no citation\nevent yet.\n\n## Multimodal: text, image, audio\n\nContent blocks carry the modality. Image is broadly supported; **audio is\naccepted by OpenAI and Google, but not Anthropic** — sending an `audio` block to\na Claude model throws a `CapabilityError` before any network call.\n\n```ts\n// Image (works on Claude, GPT, Gemini)\nawait ai.chat({\n  model: \"gpt-4o\",\n  messages: [{ role: \"user\", content: [\n    { type: \"image\", source: { type: \"base64\", mediaType: \"image/png\", data: pngB64 } },\n    { type: \"text\", text: \"What's in this image?\" },\n  ] }],\n  maxTokens: 128,\n});\n\n// Audio (OpenAI: gpt-audio; Google: gemini-2.5-*)\nawait ai.chat({\n  model: \"gpt-audio\",\n  messages: [{ role: \"user\", content: [\n    { type: \"audio\", source: { type: \"base64\", mediaType: \"audio/wav\", data: wavB64 } },\n    { type: \"text\", text: \"Transcribe this.\" },\n  ] }],\n  maxTokens: 256,\n});\n```\n\n## Agents: build, run, and test\n\nA **persona** is a role as config-as-data: a model, a system prompt, its tools,\nand reasoning knobs. `runAgent` drives the tool-use loop (model turn → run tool\nhandlers → feed results back → repeat) until the model stops or a step limit hits.\n\n```ts\nimport { init, runAgent, type Persona, type ToolDef } from \"@odla-ai/ai\";\n\nconst ai = init({ keys: { anthropic: process.env.ANTHROPIC_API_KEY } });\n\nconst add: ToolDef = {\n  name: \"add\",\n  description: \"Add two integers.\",\n  inputSchema: { type: \"object\", properties: { a: { type: \"number\" }, b: { type: \"number\" } }, required: [\"a\", \"b\"] },\n  handler: (input) => ({ content: String((input.a as number) + (input.b as number)) }),\n};\n\nconst calculator: Persona = {\n  name: \"calculator\",\n  model: \"claude-opus-4-8\",\n  system: \"Use the add tool for arithmetic, then state the result.\",\n  tools: [add],\n  maxSteps: 4,\n};\n\nconst run = await runAgent(ai, calculator, { input: \"What is 21 + 21?\" });\nconsole.log(run.finalText);   // \"…42\"\nconsole.log(run.toolCalls);   // [{ toolUse, output }]\nconsole.log(run.usage);       // accumulated across turns\n```\n\nProvider calls and tool handlers receive a combined cancellation signal. Runs\ncan also stop before additional effects when a run-wide budget is exhausted:\n\n```ts\nconst run = await runAgent(ai, calculator, {\n  input: \"Reconcile these records\",\n  signal: request.signal,\n  deadline: Date.now() + 30_000,\n  budget: { maxInputTokens: 20_000, maxOutputTokens: 4_000, maxToolCalls: 8 },\n});\n```\n\nToken limits are post-turn ceilings because provider input usage is known only\nafter a response. `maxInputTokens` and `maxTotalTokens` therefore cannot\ntokenizer-bound the first prompt; they stop later turns and tool effects once\nreported usage reaches the ceiling. `maxOutputTokens` and the remaining total\nbudget cap each request's `maxTokens` before dispatch. Limits must be integers\n(`maxToolCalls` may be zero; token limits must be positive). When a limit blocks\ntools, the loop records a matching error `tool_result` for every requested tool\nbefore persisting memory, so retries never inherit an unmatched effect request.\n`stoppedReason` is `\"budget_exhausted\"` when a limit prevents further work.\n\nTools can declare taint constraints (`outputTaint` / `acceptsTaint`) for a\nlightweight CaMeL-style prompt-injection gate, and personas can carry a pluggable\n`MemoryScope`.\n\n### Skills\n\nA **skill** is a named bundle of tools + instructions. Attach skills to a persona\nand their tools are merged into the model's tool list and their instructions into\nthe system prompt — the primitive for \"add a skill and call it as tools.\"\n\n```ts\nimport { entityCrudSkill, runAgent } from \"@odla-ai/ai\";\nimport { init as odlaInit } from \"@odla-ai/db\";\n\nconst db = odlaInit({ appId, adminToken: appKey, endpoint: ODLA_URL });\n\n// Turn an odla-db entity into list/create/update/delete tools that change data.\nconst todos = entityCrudSkill({\n  db,\n  entity: \"todos\",\n  fields: { text: { type: \"string\" }, done: { type: \"boolean\" } },\n  required: [\"text\"],\n});\n\nconst assistant = { name: \"todo-bot\", model: \"claude-opus-4-8\", skills: [todos] };\nconst run = await runAgent(ai, assistant, { input: \"Add 'buy milk' and show my open todos.\" });\n// the agent calls create_todo then list_todos, writing/reading via odla-db\n```\n\n`entityCrudSkill` generates `list_<plural>`, `create_<singular>`, `update_<singular>`\n(partial — pass only the fields that change, e.g. toggle `done`), and\n`delete_<singular>` tools whose handlers call `db.transact`/`db.query`. Or hand-roll\na `Skill` = `{ name, instructions?, tools: ToolDef[] }` for anything else.\n\n### Evals\n\n```ts\nimport { evaluate, exactMatch, llmJudge } from \"@odla-ai/ai\";\n\nconst report = await evaluate({\n  inference: ai,\n  model: \"claude-opus-4-8\",\n  system: \"Answer with only the number.\",\n  grader: exactMatch(),\n  cases: [\n    { input: \"What is 2+2?\", expected: \"4\" },\n    { input: \"What is 10-3?\", expected: \"7\" },\n  ],\n});\nconsole.log(`${report.passed}/${report.total} passed`);\n```\n\nGraders: `exactMatch`, `includes`, `structuredMatch`, and `llmJudge` (which\ndogfoods the inference core to grade open-ended output against a rubric). Pass a\n`persona` instead of a `model` to evaluate a full agent.\n\n### Harness: configuration as data, and proof it was sent\n\nA `Persona` carries live tool handlers, so it can be written in TypeScript but\nnot in YAML, a database row, or a run record. A `HarnessSpec` is the same\nconfiguration as plain JSON; a `ToolsetRegistry` holds the code, and `toPersona`\njoins them.\n\n```ts\nimport { toPersona, resolveHarness, verifyEcho } from \"@odla-ai/ai\";\n\nconst harness = { id: \"fast\", model: \"gpt-5.5\", effort: \"low\", toolset: \"search\" };\n\n// Can this model run this configuration, exactly as written?\nconst res = resolveHarness(harness);\nif (!res.ok) return skip(res.code); // \"effort_unsupported\", \"temperature_ignored\", …\n\nconst run = await runAgent(ai, toPersona(harness, { search: [searchTool] }), { input: q });\n\n// Did the adapter actually send what was asked for?\nconst drift = verifyEcho(harness, res.spec, run.response.echo!);\nif (drift.length) throw new Error(drift[0].detail);\n```\n\n`resolveHarness` answers rather than throws, so a caller enumerating many\nmodel × setting combinations can mark the illegal ones skipped instead of\nwrapping every one in `try`/`catch`. It has no \"resolved with adjustments\"\nresult: a harness runs as specified or it does not run.\n\n`response.echo` reports what the adapter *actually built* — native model id,\nthe reasoning knob really sent, whether thinking was on, whether temperature\nsurvived. Comparing it to the request (`verifyEcho`) is what catches a silent\nsubstitution introduced below your code, which upfront validation cannot see.\nOne it still surfaces today: reasoning-tier models on Chat Completions drop\n`temperature`. That is correct behavior, and it still makes a run\nnon-comparable to one that ran on the model's default.\n\n### Per-step trace\n\n`AgentRun.usage` says what a run cost in total; `AgentRun.trace` says where it\nwent — one `StepRecord` per model turn, carrying that turn's usage, `costUsd`\n(absent when the model's pricing is unknown, never zero), `durationMs`,\n`stopReason`, the tool calls it triggered, and its `echo`.\n\n```ts\nconst run = await runAgent(ai, persona, { input: q });\n\nfor (const step of run.trace) {\n  console.log(step.index, step.durationMs, step.costUsd, step.toolCalls.length);\n}\n\n// A mid-run substitution a final-turn echo cannot see:\nconst lostReasoning = run.trace.filter((s) => s.echo?.thinkingActive === false);\n```\n\nPass `now` on the run input to inject a clock; it defaults to `Date.now`.\n\n### Which OpenAI endpoint a model uses\n\nOpenAI models are called on Chat Completions by default and on `/v1/responses`\nwhen the model needs it. That routing exists for one reason: Chat Completions\nrefuses function tools whenever reasoning is in play on the gpt-5.6 generation,\nso the adapter used to disable reasoning to keep tools working. `/v1/responses`\ncarries both, so those models go there instead and keep their reasoning. It also\naccepts `temperature` alongside an effort level, and its reasoning vocabulary\ncovers the full `low`→`max` ladder rather than collapsing the top rungs.\n\nSet `api: \"chat\" | \"responses\"` on a `ModelSpec` to pin the endpoint; omit it to\nlet the adapter choose. Every built-in catalog model stays on Chat Completions —\nmodels move by explicit declaration, not by a wholesale switch.\n\n## Keys & roles\n\nKeys are **BYO** — a static per-provider map and/or a dynamic `resolveKey`\n(multi-tenant / per-call). A provider with no resolvable key is simply\nunavailable: requesting one of its models throws a `ConfigError`.\n\n```ts\nconst ai = init({\n  resolveKey: (provider) => lookupTenantKey(currentTenant, provider),\n});\n```\n\n\"Roles\" are personas (above) — config-as-data, not RBAC.\n\n## Storage, memory & BYO keys via odla-db\n\nodla-ai follows odla-db's model: it's a self-contained npm package whose README\nand exported TypeScript declarations/JSDoc describe the installed API, and it\nintegrates with `@odla-ai/db` for durable storage — **without taking a runtime\ndependency on it**. You install `@odla-ai/db`, build a client, and inject it;\nodla-ai talks to it through a structural interface. The rendered public\nreference is at <https://odla.ai/docs/packages/ai>.\n\nThe agent handshake (an agent never takes a platform secret):\n\n```ts\nimport { requestToken, init as odlaInit } from \"@odla-ai/db\";\nimport { provisionAgentApp, odlaDbKeyResolver, OdlaDbMemory, persistRun, runAgent, init } from \"@odla-ai/ai\";\n\nconst ODLA_PLATFORM = \"https://odla.ai\";\nconst ODLA_DB_URL = \"https://db.odla.ai\";\n\n// 1. Device authorization — the matching account signs in, reviews, and\n//    approves the exact code; the agent receives a revocable platform token.\nconst { token } = await requestToken({\n  endpoint: ODLA_PLATFORM,\n  email: process.env.ODLA_USER_EMAIL!, // identity hint, not a password or token\n  onCode: ({ userCode, verificationUriComplete }) => console.log(verificationUriComplete ?? userCode),\n});\n\n// 2. Provision: create app, mint an app key, push the agent schema, and store the\n//    user's BYO provider keys as odla-db secrets (encrypted at rest).\nconst { appId, appKey } = await provisionAgentApp({\n  endpoint: ODLA_PLATFORM,\n  token,                                   // operator/dev token — needed to WRITE secrets\n  providerKeys: { openai: OPENAI_KEY, anthropic: ANTHROPIC_KEY },\n});\n\n// 3. Runtime: read keys from secrets with the app key, persist memory + run traces.\nconst db = odlaInit({ appId, adminToken: appKey, endpoint: ODLA_DB_URL });\nconst ai = init({ resolveKey: odlaDbKeyResolver(db) });   // keys come from odla-db secrets\n\nconst persona = { name: \"assistant\", model: \"gpt-5\", memory: new OdlaDbMemory({ db, sessionId: \"user-42\" }) };\nconst run = await runAgent(ai, persona, { input: \"Pick up where we left off.\" });\nawait persistRun(run, { db, sessionId: \"user-42\" });\n```\n\n**BYO keys as secrets** — the write/read split mirrors odla-db: storing a secret\nis a *privileged* action (operator or `odla_dev_` token, via `provisionAgentApp` /\n`putSecret`); reading it at request time uses the ordinary **read-only** app key\n(`odlaDbKeyResolver` → `db.secrets.get`). Keys are AES-GCM-encrypted at rest and\nnever returned to browser clients. `OdlaDbMemory` persists conversation turns and\n`persistRun` writes run traces, both as natural-key upserts (idempotent on retry).\n\n### Platform apps (odla.ai)\n\nFor apps registered on odla, **hosted AI is the normal path**. Admins choose a\npriced model allowlist and guardrails; each app chooses one of those models.\nThe app uses its existing backend key, while provider credentials stay in the\nplatform vault. Legacy and explicitly selected BYOK configs remain supported.\n\n```ts\nimport { initFromPlatform } from \"@odla-ai/ai\";\nimport { init as odlaInit } from \"@odla-ai/db\";\n\nconst db = odlaInit({ appId: TENANT, adminToken: env.ODLA_API_KEY, endpoint: \"https://db.odla.ai\" });\nconst { ai, provider, model, revision } = await initFromPlatform({\n  platform: \"https://odla.ai\",\n  appId: APP_ID,          // the registry app id, not the tenant\n  env: \"prod\",\n  appKey: env.ODLA_API_KEY,\n  db,                     // needed only if this app is configured for BYOK\n});\n```\n\nThe anonymous `public-config` projection carries the mode, attested config and\npolicy revisions, default model, and only the approved model catalog. It is\ncached for about 60 seconds, so model changes need no redeploy. Hosted calls go\nto the Registry broker, which reserves quota before provider I/O, applies\nserver-side output/deadline bounds, prices normalized token usage, and records a\n90-day metadata ledger by app/environment/model/status. Prompts are not stored\nin that ledger. Non-streaming idempotent retries use a separate response receipt\nbounded to 512 KiB; streaming responses are not replayed.\n\nHosted inference sends the request's prompts, messages, tool definitions/results,\nand attachments to the selected third-party model provider. Do not send data\nthat the app is not authorized to disclose to that provider. `providerExtras`\nis rejected in hosted mode so app code cannot route around platform policy.\n\nBYOK still reads the configured provider key from `db.secrets` and filters the\nfacade to that provider. **Never put provider keys in a Worker var.**\n\n### 0.3 migration notes\n\n- Tool/extraction JSON Schemas now fail closed. `extract()` throws\n  `ToolInputError`; `runAgent()` records an error `tool_result` and does not run\n  a local handler when its arguments do not validate.\n- Platform calls cannot cross the provider selected in Studio.\n- `CancelledError` (`cancelled`) and `DeadlineExceededError`\n  (`deadline_exceeded`) distinguish caller limits from provider failures.\n- Invalid run budgets now throw `ConfigError`; budget stops persist paired tool\n  results and may therefore add one final user/tool-result turn to memory.\n\n## Models & capabilities\n\nThe catalog maps a canonical model id → provider, native id, and capabilities.\nThe built-in `DEFAULT_CATALOG` covers current Anthropic, OpenAI, and Google\nmodels; extend or override it via `buildCatalog` / `init({ catalog })`.\n\n| | image in | audio in | tools | thinking | effort | web search | structured |\n|---|---|---|---|---|---|---|---|\n| Claude (opus/sonnet/fable) | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |\n| Claude Haiku | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ |\n| GPT-5 line | ✅ | ❌ | ✅ | — | ✅ | — | ✅ |\n| GPT-4o | ✅ | ❌ | ✅ | — | ❌ | — | ✅ |\n| gpt-audio | ❌ | ✅ | ✅ | — | ❌ | — | ✅ |\n| Gemini 2.5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |\n\n> **Model ids drift.** The catalog is data — verify ids against each provider's\n> current docs (the `claude-api` skill for Anthropic; `/v1/models` for OpenAI;\n> Google GenAI docs for Gemini) rather than trusting them from memory.\n\n## Pricing\n\nEvery catalog entry carries USD-per-MTok `pricing`, so a call's cost is a\nlookup plus arithmetic:\n\n```ts\nimport { priceCall, modelPricing } from \"@odla-ai/ai/pricing\";\n\nconst usd = priceCall(\"claude-opus-4-8\", res.usage); // number | undefined\n```\n\n`priceCall` returns `undefined` — never `0` — for a model with no known\npricing, so missing catalog data can't masquerade as a free call. Cache-read\nand cache-write tokens are billed at their own rates when the model declares\nthem, falling back to the input rate otherwise.\n\nImport from **`@odla-ai/ai/pricing`** rather than the package root when you only\nneed to price calls: the subpath pulls in the catalog and nothing else — no\nclient, no adapters, and none of the three provider SDKs. That keeps cost\naccounting (e.g. `@odla-ai/o11y`) small enough to sit in a Worker bundle, and\nmeans there is one price list rather than a second one that drifts.\n\n## Errors\n\nEvery error is an `OdlaAIError` subclass carrying a stable `code` — branch on\n`err.code`, not message text: `ConfigError`, `AuthError`, `RateLimitError`,\n`CapabilityError`, `ContextWindowError`, `InvalidRequestError`, `ToolInputError`,\n`CancelledError`, `DeadlineExceededError`, `ProviderError`.\n\n`OdlaAIError.usage` is present only when a provider response was already\nreceived and a later forced-tool or schema check failed. It is a frozen,\nsanitized token-usage record so accounting can charge a failed structured\nresponse accurately; it may be absent for transport, authentication, timeout,\nor preflight failures. `toShape()` and streaming `OracleErrorShape` deliberately\nomit it.\n\n## Develop\n\n```bash\nnpm run typecheck   # tsc --noEmit (strict)\nnpm test            # vitest — offline, mock-provider based\nnpm run build       # tsup → dual ESM + CJS + d.ts\nnpm run smoke       # live check against real providers (needs .dev.vars)\n```\n\nFor the live smoke, copy `.dev.vars.example` → `.dev.vars` and fill in whatever\nkeys you have; providers without a key are skipped.\n","readmeFilename":"README.md"}