{"_id":"@aeye/openrouter","_rev":"15-343a65580cc1d9c20e4fc51b432b9277","name":"@aeye/openrouter","dist-tags":{"latest":"0.4.1"},"versions":{"0.1.0":{"name":"@aeye/openrouter","version":"0.1.0","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"MIT","_id":"@aeye/openrouter@0.1.0","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"77d1232a3bf156473fea24e22ac5254122655557","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.1.0.tgz","fileCount":26,"integrity":"sha512-KgTXnanSCp5g4dvjK1MAlqStgSHeLzGLHgeg2gCPeW27acBam/ZI85Tljx86o+nTbh8O/gHbt6yNOkloCWTXTQ==","signatures":[{"sig":"MEQCIGiF7Nb6zxSAyEYjrdbUMz7KoEqld2HYySsm6AoPGVgbAiAdgYMUfnzgWpM8jmhZoo/zIoQtTSU3Kxsqno3OIq5uLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80873},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"7e1a90cc8ba4f871aaa577977959317604a10b08","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.1.0","@aeye/core":"^0.1.0","@aeye/openai":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.1.0_1763393631846_0.620011992456232","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aeye/openrouter","version":"0.1.1","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.1.1","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"207044f2ea3cf5c6282733097fc00645d85eb930","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.1.1.tgz","fileCount":26,"integrity":"sha512-9YiTuB3w3i4oL/v/3J5UCMoIvP8YW0mYELhGl/SvYd+pQwtk+yuS+XHd2f7G/45Cir50YzQvMaQElkZDUAyHaA==","signatures":[{"sig":"MEQCIHbl5x/F99T0ZIBCRC9S0yYmK0qJ+vO63Q37Dm3GCeAzAiAqvkvE87DUKepvyQbrtX47w0WisDnO6NcdjIvkFZ6fPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80881},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"2515fffb0b757b7460c813024d78f3481ba58d10","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.1.0","@aeye/core":"^0.1.0","@aeye/openai":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.1.1_1763671243205_0.9753156031440298","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aeye/openrouter","version":"0.1.2","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.1.2","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"d306d657fac1c38e95feb1c4e2209df7d3812083","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.1.2.tgz","fileCount":26,"integrity":"sha512-oHV4frlgNUCtX/PfJWLU36iKnmt0D8bwbURSgUGpaIITvFjpDnzFuAT0I7SyYOiE+YyCKPsUZb17S9lJRvHG/w==","signatures":[{"sig":"MEUCIQD1+wiZfnjtKZGXErVVdcXKBJAzmBHT37l720UBUUSnXwIgN2a3Adk3FQ1zLWb9Ufk+b9AsmWhV6QGpFoMlyHotcBo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80881},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"069e295508f3c3aec4374a23c81402b23d7bae9d","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.1.0","@aeye/core":"^0.1.0","@aeye/openai":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.1.2_1763673089095_0.7442324727674363","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aeye/openrouter","version":"0.2.0","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.2.0","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"621a06e8a59eec525bbf3a6e3696e3cd1da1b1a9","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.2.0.tgz","fileCount":26,"integrity":"sha512-IoiAoqnUjMOM2LA0Q2pKOhJaJdHmX3casQNJj1g2gC02d8cHdHaUx6Sk6vJTSDNE2UAMDwjJeByXgcf3DEU2SQ==","signatures":[{"sig":"MEQCIDJIcIKUo/I8dENGfpufBH1TB1xNdwCm/WQGj8tdm/DZAiAJUrecBtVUfB3Icc/HOSxBXUvpou5S44TSCC/fXdatUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81066},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"25679e42025ba167faec33e98d702939cc22f2c0","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.1.0","@aeye/core":"^0.1.0","@aeye/openai":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.2.0_1764260298287_0.7313536559107638","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aeye/openrouter","version":"0.3.0","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.3.0","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"63427ab72cf036e740bd109abbef1192a16432b4","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.3.0.tgz","fileCount":26,"integrity":"sha512-Kkc4mO6unGf9Qu9tl7gByw9ePIL/hqN/HsSVlFRoupuUWm58Sooe+vB7hN7Cw5FDr5isfR8O+2TTy9igD5n1gQ==","signatures":[{"sig":"MEUCIQDEs7Bu+DfUm3/GkYpWCwIFgPYu6XSIA9GT4Q5/qf/wYwIgAsMkKVG5aGmthOzzJRb3sYnovye4ysOrheP/+1BHWrY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81009},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"fe6afb5adb096a8de1dfc9a115bba1d48193612d","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.3.0","@aeye/core":"^0.3.0","@aeye/openai":"^0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.3.0_1764993453114_0.983536924397419","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@aeye/openrouter","version":"0.3.1","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.3.1","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"5c9e16c004f0e8bfcd59fad58f06fe365ef9eaa7","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.3.1.tgz","fileCount":26,"integrity":"sha512-Cw6D1751fl7VIMMyuVSjbA5Ye2Q8E2DvnLvJN1KJe2OyIUsFfuS1mPhj7sDG9PLXK6fj9WlXMC6TwgxK8wFUaw==","signatures":[{"sig":"MEUCIQDePCF3uZA9mHXT72nGy31oLsH8rgHCxfKuQLMiyYSC8QIgRgFKP1JNxxgAj0tCXpH9maR/tMg9iUNMMjzrFF/T7zw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81001},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"cabd7c1d28f8048b51cb89b40efa8d07cead332d","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.3.1","@aeye/core":"^0.3.1","@aeye/openai":"^0.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.3.1_1765363625629_0.19521346551157315","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@aeye/openrouter","version":"0.3.2","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.3.2","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"2b06025aee2bca801bbcaa7f6b55b2d7fc205f04","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.3.2.tgz","fileCount":26,"integrity":"sha512-rSQFB7+9rHNnzdwViokhQYv9RbDe7D9l5to2JNJIjCLAOyx5Tb63ZfHuAWH0tObTwK5ruCFxFytimACn0rQfow==","signatures":[{"sig":"MEUCIBNfGYp8yR9C98Zo58zUhuuSir3tkAiempSjmd3LaF/3AiEAhiDw9dRt24xjHAhBiPBuW+xEr2hv3mWKIQGXFxEnrks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81001},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"ae51c2a8249a968b210a64efc7c8bedb35fad70b","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.3.2","@aeye/core":"^0.3.2","@aeye/openai":"^0.3.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.3.2_1766336266029_0.7343661735303486","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@aeye/openrouter","version":"0.3.4","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.3.4","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"b8a5608db37981e4be1548b22f2f6d87364da9be","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.3.4.tgz","fileCount":26,"integrity":"sha512-RtQo0HdvciAhjFmQzFhZeMGK1EIY3CCTgdua6dB5G89q51atYxe/dPqwPx0eE22g+D6sC5gkSfYvJhg9HkybNw==","signatures":[{"sig":"MEUCIHmLzQHSDeCBRnnAhweaGg3/vxbT8y3gmf1U0kPrMFnhAiEAw5NgHj+MtqjkwnWfMfJLAQPpOMEPY83XoV5ZX25UPkI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81001},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"3f4fe5f9da6cad0851958297b5dd34b2c795d6d2","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.3.4","@aeye/core":"^0.3.4","@aeye/openai":"^0.3.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.3.4_1770754893102_0.6929198871203497","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@aeye/openrouter","version":"0.3.5","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.3.5","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"3c07cdb5f4896e3130eae2565aab23af0cc4d580","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.3.5.tgz","fileCount":26,"integrity":"sha512-2bI8Pt/DwQobk9CiS881IGqz1B0RVdZ2fdHDW126+Hx/7N/VJen4gh3AT/7SXkdHK9udyQroEZMPKzjTj5zhaA==","signatures":[{"sig":"MEUCIH4GYHiinLTEh/fqUOu4X1VfJvq2KzKwvpysY3VtPNwRAiEAlXeFuPYHAxK5uCnxWIJOr2plHf4b7EsFmKSylc1/F1A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81001},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"1ca1832163262906c1ae12624a107c0652daeb68","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.3.5","@aeye/core":"^0.3.5","@aeye/openai":"^0.3.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.3.5_1770757035658_0.170556070389011","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@aeye/openrouter","version":"0.3.6","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.3.6","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"75b4e52fc87ecd0793eff9115af4249e21b30398","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.3.6.tgz","fileCount":26,"integrity":"sha512-Sh8a+SvsYrF3MZ9yy4oYAy6LeYUkHDqorbGnxtJvkrnbJVBW33CVnKj8mZOW+UpSwep/REkKHTTu6pi7eHR7Ig==","signatures":[{"sig":"MEUCICduBAg2fld12WOctlCSwS4Qz7PhwqokPUvelI/keAYPAiEAtJoW2Z+WVqYg27S/sL5wR+ABrxcbLD85CwJLWGwyD0w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81278},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"1ca1832163262906c1ae12624a107c0652daeb68","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.3.6","@aeye/core":"^0.3.6","@aeye/openai":"^0.3.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.3.6_1772640919986_0.9264633187319264","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@aeye/openrouter","version":"0.3.7","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.3.7","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"a9fc864b12de56ed03feee3528b6fd0bbd99d213","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.3.7.tgz","fileCount":26,"integrity":"sha512-WhGpw9VJfT+8CwI2BBCVoiIZkSwRJtxCKU2Qi5tdLng/I5KtXxdbQPMDdHdz8oSe31KulR8D+y1T8qRGZslxzQ==","signatures":[{"sig":"MEQCIGTDPR0YYv1FFjW0YOJXIzfc0sCDAjV88HrZuvVlelZcAiARanoAflhw9foYzvJKgfXHYYjoGGZ4Hgri2I5FIEDr0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81278},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"a3490a88105713496870fbcf0a8d5ff9d85a3e6c","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.3.7","@aeye/core":"^0.3.7","@aeye/openai":"^0.3.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.3.7_1772642472135_0.49497507332399016","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@aeye/openrouter","version":"0.3.8","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.3.8","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"17c525fd8f5dafb4df1ed1fb3b2f13fff30200a8","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.3.8.tgz","fileCount":26,"integrity":"sha512-0ak1oVjzXayn9k9w8yR/ED6YtkGJYI6cDQCl16pKy1aW4RySEZwC6j7m4PrLsteACE2uuG2bRp3MU/QR2QX7Mw==","signatures":[{"sig":"MEUCIE9bkswvdJ12h9quEeH8DFZ2u2q62mCWCYy5CYc0a8ChAiEA7WEgbl+4RqwqI7a6CHAvJcclb2Es8qgVS5Tleyb90pQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84897},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"04319fa907b4c219f0843292baa1bcd313a97c74","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.8.2","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"20.18.1","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.3.8","@aeye/core":"^0.3.8","@aeye/openai":"^0.3.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.3.8_1775335854755_0.4543149137654019","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"@aeye/openrouter","version":"0.3.9","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.3.9","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"c7bd89a11896bf824c4383db819ccfedeb6185d7","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.3.9.tgz","fileCount":31,"integrity":"sha512-WqnqE1OgWA8nHTdCKwpekagkFOradoKCb2uxR/ihPYho+q+EbFZTxW2X90H46s8HPRNI/GHLnoS+WbWfPDiCzA==","signatures":[{"sig":"MEUCIAjhTh01CMtFbaVRelA1QEpDSt2RMG1VCzWXYN95b3d5AiEAtyn8rDX3VhU2d/Tb49HN6+YPB/BvFSyudxRCqtoZXW0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107131},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"7df3bae899c5a30cf17f4925fb7057e9a61e7332","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.9.8","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"22.22.3","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.3.9","@aeye/core":"^0.3.9","@aeye/openai":"^0.3.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.3.9_1783858085102_0.026418316135201625","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aeye/openrouter","version":"0.4.0","keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/openrouter@0.4.0","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"1652ee92684a6bc0f1dc9adf6ad73d285e1494c4","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.4.0.tgz","fileCount":31,"integrity":"sha512-Ik1X2ObR3g8qpu+X7A5lAAYUiulux36nLSmiP63Id/5eOiibkYiG1CRGp6KSkNtcUtXQTWAO1DTqULM3tu0HvQ==","signatures":[{"sig":"MEYCIQDwbAho7tdBuc+V2Z5vIjqeJ+98SQfg51Dk/c1krjhUKQIhAIf5pzCskBg8XQOSTmCOx3a6bxme31IQUn90aBgMnTmE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107470},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"4ad1dab1c6ee79a2d325b2b94c3fe1975741ea43","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","test:unit":"jest --testPathIgnorePatterns=__integration__","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/openrouter"},"_npmVersion":"10.9.8","description":"@aeye OpenRouter - OpenRouter integration for @aeye","directories":{},"_nodeVersion":"22.22.3","dependencies":{"openai":"^6.6.0","@aeye/ai":"^0.3.9","@aeye/core":"^0.5.0","@aeye/openai":"^0.3.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter_0.4.0_1787434691001_0.3770895760366133","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@aeye/openrouter","version":"0.4.1","description":"@aeye OpenRouter - OpenRouter integration for @aeye","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"default":"./dist/index.js"}},"scripts":{"build":"tsc","test":"jest","test:unit":"jest --testPathIgnorePatterns=__integration__","test:integration":"jest --testPathPattern=__integration__","test:coverage":"jest --coverage --testPathIgnorePatterns=__integration__","test:watch":"jest --watch","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit"},"keywords":["ai","openrouter","typescript"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","repository":{"type":"git","url":"git+https://github.com/ClickerMonkey/aeye.git","directory":"packages/openrouter"},"dependencies":{"@aeye/ai":"^0.3.9","@aeye/core":"^0.5.0","@aeye/openai":"^0.3.9","openai":"^6.6.0"},"devDependencies":{"@types/jest":"^30.0.0","jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3"},"publishConfig":{"access":"public"},"engines":{"node":">=16.0.0"},"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"_id":"@aeye/openrouter@0.4.1","gitHead":"40fd8e900a5946b0741a2e24d715b9fc455f8c2c","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-OyaBbWdTvk3BzTlL2tg3oUfrwv7mP8OU114GLc5qSuacDdBPPQiQfaukEXWwLO+WTmFOnTEr0MOP4X3GYrdEHw==","shasum":"d2859bf47b6510bb28c1b26efbc3427c41eb3715","tarball":"https://registry.npmjs.org/@aeye/openrouter/-/openrouter-0.4.1.tgz","fileCount":31,"unpackedSize":131113,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD4bxo6HB05ZOvtWSw6761uZomEyt4UOY51ca8w1NgxyQIgHZsQGDf2USbkXRgk7EkK/carCKtJvzYFlwMmEej0Ijo="}]},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"directories":{},"maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/openrouter_0.4.1_1787440715543_0.3755830498680135"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-17T15:33:51.734Z","modified":"2026-08-22T23:18:35.843Z","0.1.0":"2025-11-17T15:33:52.053Z","0.1.1":"2025-11-20T20:40:43.402Z","0.1.2":"2025-11-20T21:11:29.288Z","0.2.0":"2025-11-27T16:18:18.460Z","0.3.0":"2025-12-06T03:57:33.271Z","0.3.1":"2025-12-10T10:47:05.786Z","0.3.2":"2025-12-21T16:57:46.196Z","0.3.4":"2026-02-10T20:21:33.234Z","0.3.5":"2026-02-10T20:57:15.801Z","0.3.6":"2026-03-04T16:15:20.137Z","0.3.7":"2026-03-04T16:41:12.273Z","0.3.8":"2026-04-04T20:50:54.925Z","0.3.9":"2026-07-12T12:08:05.246Z","0.4.0":"2026-08-22T21:38:11.137Z","0.4.1":"2026-08-22T23:18:35.703Z"},"bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","homepage":"https://github.com/ClickerMonkey/aeye#readme","keywords":["ai","openrouter","typescript"],"repository":{"type":"git","url":"git+https://github.com/ClickerMonkey/aeye.git","directory":"packages/openrouter"},"description":"@aeye OpenRouter - OpenRouter integration for @aeye","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"readme":"# @aeye/openrouter\r\n\r\nOpenRouter provider for the @aeye (AI TypeScript) framework. OpenRouter provides unified access to multiple AI providers through a single API, with automatic fallbacks, routing optimization, and competitive pricing.\r\n\r\n## Features\r\n\r\n- **Multi-Provider Access**: Access models from OpenAI, Anthropic, Google, Meta, and more through one API\r\n- **Automatic Fallbacks**: Seamless failover to alternative providers if primary fails\r\n- **Intelligent Routing**: Automatic selection of best provider for each request\r\n- **Cost Tracking**: Built-in cost information in responses\r\n- **ZDR Support**: Zero Data Retention mode for privacy-sensitive applications\r\n- **Provider Preferences**: Control which providers to use, prefer, or avoid\r\n- **Reasoning Models**: Support for advanced reasoning with o1, Claude, and others\r\n- **Streaming**: Full streaming support across compatible models\r\n- **Extends OpenAI**: Built on the OpenAI provider for compatibility\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @aeye/openrouter @aeye/openai @aeye/ai @aeye/core openai zod\r\n```\r\n\r\n## Quick Start\r\n\r\n```typescript\r\nimport { OpenRouterProvider } from '@aeye/openrouter';\r\nimport { AI } from '@aeye/ai';\r\n\r\n// Create provider instance\r\nconst openrouter = new OpenRouterProvider({\r\n  apiKey: process.env.OPENROUTER_API_KEY!,\r\n  defaultParams: {\r\n    siteUrl: 'https://yourapp.com',\r\n    appName: 'Your App Name',\r\n  },\r\n});\r\n\r\n// Use with AI instance\r\nconst ai = AI.with()\r\n  .providers({ openrouter })\r\n  .create();\r\n\r\n// Make a request (OpenRouter picks the best provider)\r\nconst response = await ai.chat.get([\r\n  { role: 'user', content: 'Explain TypeScript generics' }\r\n], {\r\n  metadata: { model: 'openai/gpt-4-turbo' }\r\n});\r\n\r\nconsole.log(response.content);\r\nconsole.log('Cost:', response.usage.cost); // Actual cost from OpenRouter\r\n```\r\n\r\n## Configuration\r\n\r\n### Basic Configuration\r\n\r\n```typescript\r\nimport { OpenRouterProvider, OpenRouterConfig } from '@aeye/openrouter';\r\n\r\nconst config: OpenRouterConfig = {\r\n  apiKey: process.env.OPENROUTER_API_KEY!,\r\n  defaultParams: {\r\n    siteUrl: 'https://yourapp.com', // Your app URL (helps with rankings)\r\n    appName: 'My AI App', // Your app name (shown in OpenRouter dashboard)\r\n  },\r\n};\r\n\r\nconst provider = new OpenRouterProvider(config);\r\n```\r\n\r\n### Advanced Configuration\r\n\r\n```typescript\r\nconst provider = new OpenRouterProvider({\r\n  apiKey: process.env.OPENROUTER_API_KEY!,\r\n  defaultParams: {\r\n    siteUrl: 'https://yourapp.com',\r\n    appName: 'My AI App',\r\n\r\n    // Automatic fallbacks\r\n    allowFallbacks: true, // Enable fallback to alternative providers\r\n\r\n    // Provider preferences\r\n    providers: {\r\n      prefer: ['openai', 'anthropic'], // Prefer these providers\r\n      allow: ['openai', 'anthropic', 'google'], // Only use these providers\r\n      deny: ['provider-x'], // Never use these providers\r\n      ignore: ['low-quality-provider'], // Exclude from consideration\r\n      order: ['openai', 'anthropic'], // Preferred order\r\n      quantizations: ['int8', 'fp16'], // Preferred quantization levels\r\n      dataCollection: 'deny', // or 'allow' - control data collection\r\n    },\r\n\r\n    // Privacy & security\r\n    requireParameters: true, // Require all providers to support parameters\r\n    dataCollection: 'deny', // Global data collection setting\r\n\r\n    // Model transformations\r\n    transforms: ['middle-out'], // Apply transformations to requests\r\n  },\r\n});\r\n```\r\n\r\n## Usage Examples\r\n\r\n### Basic Chat with Cost Tracking\r\n\r\n```typescript\r\nconst response = await ai.chat.get([\r\n  { role: 'user', content: 'What is the capital of France?' }\r\n], {\r\n  metadata: { model: 'openai/gpt-3.5-turbo' }\r\n});\r\n\r\nconsole.log(response.content);\r\nconsole.log('Tokens:', response.usage.totalTokens);\r\nconsole.log('Cost: $', response.usage.cost); // Actual cost from OpenRouter\r\n```\r\n\r\n### Using Multiple Models\r\n\r\nOpenRouter allows you to access models from different providers using the format `provider/model`:\r\n\r\n```typescript\r\n// OpenAI GPT-4\r\nconst gpt4 = await ai.chat.get(messages, {\r\n  metadata: { model: 'openai/gpt-4-turbo' }\r\n});\r\n\r\n// Anthropic Claude\r\nconst claude = await ai.chat.get(messages, {\r\n  metadata: { model: 'anthropic/claude-3-opus' }\r\n});\r\n\r\n// Google Gemini\r\nconst gemini = await ai.chat.get(messages, {\r\n  metadata: { model: 'google/gemini-pro' }\r\n});\r\n\r\n// Meta Llama\r\nconst llama = await ai.chat.get(messages, {\r\n  metadata: { model: 'meta-llama/llama-3-70b' }\r\n});\r\n```\r\n\r\n### Automatic Model Selection\r\n\r\nLet OpenRouter choose the best model based on your criteria:\r\n\r\n```typescript\r\nconst ai = AI.with()\r\n  .providers({ openrouter })\r\n  .create({\r\n    defaultMetadata: {\r\n      required: ['chat', 'streaming'],\r\n      weights: {\r\n        speed: 0.3,\r\n        cost: 0.4,\r\n        quality: 0.3,\r\n      },\r\n    },\r\n  });\r\n\r\n// OpenRouter will select the best model matching criteria\r\nconst response = await ai.chat.get([\r\n  { role: 'user', content: 'Explain quantum computing' }\r\n]);\r\n```\r\n\r\n### Provider Fallbacks\r\n\r\n```typescript\r\n// Primary provider fails? OpenRouter automatically falls back\r\nconst provider = new OpenRouterProvider({\r\n  apiKey: process.env.OPENROUTER_API_KEY!,\r\n  defaultParams: {\r\n    allowFallbacks: true,\r\n    providers: {\r\n      order: ['openai', 'anthropic', 'google'], // Try in this order\r\n    },\r\n  },\r\n});\r\n\r\n// If OpenAI is down, automatically tries Anthropic, then Google\r\nconst response = await ai.chat.get(messages, {\r\n  metadata: { model: 'openai/gpt-4-turbo' }\r\n});\r\n```\r\n\r\n### Zero Data Retention (ZDR)\r\n\r\n```typescript\r\n// Only use ZDR-compliant models\r\nconst ai = AI.with()\r\n  .providers({ openrouter })\r\n  .create({\r\n    defaultMetadata: {\r\n      required: ['chat', 'zdr'], // Require ZDR support\r\n    },\r\n  });\r\n\r\n// Also configure at provider level\r\nconst provider = new OpenRouterProvider({\r\n  apiKey: process.env.OPENROUTER_API_KEY!,\r\n  defaultParams: {\r\n    dataCollection: 'deny', // Ensure no data collection\r\n  },\r\n});\r\n```\r\n\r\n### Streaming with Cost Tracking\r\n\r\n```typescript\r\nlet totalCost = 0;\r\n\r\nfor await (const chunk of ai.chat.stream([\r\n  { role: 'user', content: 'Write a story about a robot' }\r\n], {\r\n  metadata: { model: 'anthropic/claude-3-sonnet' }\r\n})) {\r\n  if (chunk.content) {\r\n    process.stdout.write(chunk.content);\r\n  }\r\n\r\n  // Cost is sent in final chunk\r\n  if (chunk.usage?.cost) {\r\n    totalCost = chunk.usage.cost;\r\n  }\r\n}\r\n\r\nconsole.log(`\\n\\nTotal cost: $${totalCost}`);\r\n```\r\n\r\n### Reasoning Models\r\n\r\n```typescript\r\n// Use OpenAI o1 through OpenRouter\r\nconst response = await ai.chat.get([\r\n  {\r\n    role: 'user',\r\n    content: 'Solve: If a train leaves NYC at 3pm going 60mph, and another leaves Boston at 4pm going 80mph, when do they meet?'\r\n  }\r\n], {\r\n  metadata: { model: 'openai/o1-preview' }\r\n});\r\n\r\nconsole.log('Reasoning:', response.reasoning);\r\nconsole.log('Answer:', response.content);\r\nconsole.log('Cost:', response.usage.cost);\r\n```\r\n\r\n### Function Calling\r\n\r\n```typescript\r\nimport z from 'zod';\r\n\r\nconst response = await ai.chat.get([\r\n  { role: 'user', content: 'What is the weather in Paris?' }\r\n], {\r\n  metadata: { model: 'openai/gpt-4-turbo' },\r\n  tools: [\r\n    {\r\n      name: 'get_weather',\r\n      description: 'Get current weather for a location',\r\n      parameters: z.object({\r\n        location: z.string(),\r\n        unit: z.enum(['celsius', 'fahrenheit']).optional(),\r\n      }),\r\n    }\r\n  ],\r\n  toolChoice: 'auto',\r\n});\r\n```\r\n\r\n### Fetching Available Models\r\n\r\nOpenRouter provides a model source that can fetch all available models:\r\n\r\n```typescript\r\nimport { OpenRouterModelSource } from '@aeye/openrouter';\r\n\r\nconst source = new OpenRouterModelSource({\r\n  apiKey: process.env.OPENROUTER_API_KEY,\r\n  includeZDR: true, // Include ZDR information\r\n});\r\n\r\nconst models = await source.fetchModels();\r\n\r\nmodels.forEach(model => {\r\n  console.log(`${model.id}`);\r\n  console.log(`  Pricing: $${model.pricing.text.input}/1M input tokens`);\r\n  console.log(`  Context: ${model.contextWindow} tokens`);\r\n  console.log(`  ZDR: ${model.capabilities.has('zdr')}`);\r\n});\r\n```\r\n\r\n### Automatic Model Registration\r\n\r\n```typescript\r\n// Automatically fetch and register OpenRouter models\r\nconst ai = AI.with()\r\n  .providers({ openrouter })\r\n  .create({\r\n    fetchOpenRouterModels: true, // Auto-fetch all available models\r\n  });\r\n\r\n// Now all OpenRouter models are available for automatic selection\r\nconst response = await ai.chat.get(messages);\r\n```\r\n\r\n## Configuration Options\r\n\r\n### OpenRouterConfig\r\n\r\nExtends `OpenAIConfig` from `@aeye/openai`.\r\n\r\n| Property | Type | Required | Description |\r\n|----------|------|----------|-------------|\r\n| `apiKey` | `string` | Yes | OpenRouter API key |\r\n| `baseURL` | `string` | No | Custom base URL (defaults to https://openrouter.ai/api/v1) |\r\n| `defaultParams` | `object` | No | Default parameters for all requests |\r\n\r\n### defaultParams\r\n\r\n| Property | Type | Description |\r\n|----------|------|-------------|\r\n| `siteUrl` | `string` | Your app URL (helps with rankings on OpenRouter) |\r\n| `appName` | `string` | Your app name (shown in OpenRouter dashboard) |\r\n| `allowFallbacks` | `boolean` | Enable automatic provider fallbacks |\r\n| `requireParameters` | `boolean` | Require all providers support parameters |\r\n| `dataCollection` | `'deny' \\| 'allow'` | Control data collection |\r\n| `order` | `string[]` | Preferred provider order |\r\n| `providers` | `object` | Provider preferences (see below) |\r\n| `transforms` | `string[]` | Request transformations to apply |\r\n\r\n### providers Options\r\n\r\n| Property | Type | Description |\r\n|----------|------|-------------|\r\n| `allow` | `string[]` | Whitelist of allowed providers |\r\n| `deny` | `string[]` | Blacklist of denied providers |\r\n| `prefer` | `string[]` | Preferred providers (given priority) |\r\n| `ignore` | `string[]` | Providers to ignore |\r\n| `order` | `string[]` | Explicit provider order |\r\n| `quantizations` | `string[]` | Preferred quantization levels |\r\n| `dataCollection` | `'deny' \\| 'allow'` | Provider-level data collection |\r\n\r\n## Cost Information\r\n\r\nOpenRouter includes actual cost information in every response:\r\n\r\n```typescript\r\nconst response = await ai.chat.get(messages, {\r\n  metadata: { model: 'openai/gpt-4-turbo' }\r\n});\r\n\r\n// Cost is automatically included\r\nconsole.log('Input tokens:', response.usage.text.input);\r\nconsole.log('Output tokens:', response.usage.text.output);\r\nconsole.log('Cost: $', response.usage.cost); // Actual USD cost\r\n\r\n// Cost calculation is skipped when provider returns cost\r\n// No need to manually calculate costs!\r\n```\r\n\r\nThe cost is provided by OpenRouter's API in the `total_cost` field and automatically extracted into the `usage.cost` field.\r\n\r\n## Model Format\r\n\r\nOpenRouter uses the format `provider/model-name`:\r\n\r\n- `openai/gpt-4-turbo`\r\n- `anthropic/claude-3-opus`\r\n- `google/gemini-pro`\r\n- `meta-llama/llama-3-70b-instruct`\r\n- `mistralai/mistral-large`\r\n- `cohere/command-r-plus`\r\n\r\nSee the [OpenRouter Models](https://openrouter.ai/models) page for the full list.\r\n\r\n## Privacy & Data Retention\r\n\r\n### Zero Data Retention (ZDR)\r\n\r\nOpenRouter supports ZDR mode where your data is not stored:\r\n\r\n```typescript\r\n// Require ZDR-compliant models\r\nconst ai = AI.with()\r\n  .providers({ openrouter })\r\n  .create({\r\n    defaultMetadata: {\r\n      required: ['chat', 'zdr'],\r\n    },\r\n  });\r\n\r\n// Or configure at provider level\r\nconst provider = new OpenRouterProvider({\r\n  apiKey: process.env.OPENROUTER_API_KEY!,\r\n  defaultParams: {\r\n    dataCollection: 'deny',\r\n    providers: {\r\n      dataCollection: 'deny',\r\n    },\r\n  },\r\n});\r\n```\r\n\r\nModels with ZDR support have the `zdr` capability tag.\r\n\r\n## Error Handling\r\n\r\nOpenRouter uses the same error types as the OpenAI provider:\r\n\r\n```typescript\r\nimport { ProviderError, RateLimitError } from '@aeye/openrouter';\r\n\r\ntry {\r\n  const response = await ai.chat.get(messages, {\r\n    metadata: { model: 'openai/gpt-4-turbo' }\r\n  });\r\n} catch (error) {\r\n  if (error instanceof RateLimitError) {\r\n    console.error('Rate limit exceeded');\r\n    console.log(`Retry after ${error.retryAfter} seconds`);\r\n  } else if (error instanceof ProviderError) {\r\n    console.error(`Provider error: ${error.message}`);\r\n  }\r\n}\r\n```\r\n\r\n## Best Practices\r\n\r\n1. **Set Site URL and App Name**: This helps with OpenRouter rankings and analytics\r\n   ```typescript\r\n   defaultParams: {\r\n     siteUrl: 'https://yourapp.com',\r\n     appName: 'Your App',\r\n   }\r\n   ```\r\n\r\n2. **Use Cost Tracking**: Monitor costs with the built-in `usage.cost` field\r\n   ```typescript\r\n   console.log('Cost: $', response.usage.cost);\r\n   ```\r\n\r\n3. **Enable Fallbacks**: Use automatic fallbacks for reliability\r\n   ```typescript\r\n   defaultParams: {\r\n     allowFallbacks: true,\r\n     providers: {\r\n       order: ['openai', 'anthropic', 'google'],\r\n     },\r\n   }\r\n   ```\r\n\r\n4. **Specify Provider Preferences**: Control which providers are used\r\n   ```typescript\r\n   providers: {\r\n     prefer: ['openai', 'anthropic'],\r\n     deny: ['low-quality-provider'],\r\n   }\r\n   ```\r\n\r\n5. **Use ZDR for Sensitive Data**: Enable Zero Data Retention for privacy\r\n   ```typescript\r\n   defaultParams: {\r\n     dataCollection: 'deny',\r\n   }\r\n   ```\r\n\r\n6. **Monitor Model Availability**: OpenRouter's model list changes frequently\r\n   ```typescript\r\n   fetchOpenRouterModels: true // Auto-fetch latest models\r\n   ```\r\n\r\n## API Reference\r\n\r\n### OpenRouterProvider\r\n\r\nExtends `OpenAIProvider` from `@aeye/openai`.\r\n\r\n**Constructor**: `new OpenRouterProvider(config: OpenRouterConfig)`\r\n\r\n**Methods**:\r\n- Inherits all methods from `OpenAIProvider`\r\n- `createExecutor<TContext, TMetadata>(config?)` - Returns executor with cost tracking\r\n- `createStreamer<TContext, TMetadata>(config?)` - Returns streamer with cost tracking\r\n- `listModels(config?)` - Fetches models from OpenRouter API with ZDR info\r\n\r\n**Overridden Methods**:\r\n- `createClient(config)` - Creates OpenAI client with OpenRouter endpoint\r\n- `customizeChatParams(params, config, request)` - Adds OpenRouter-specific params\r\n\r\n### OpenRouterModelSource\r\n\r\nModel source for fetching OpenRouter models.\r\n\r\n**Constructor**: `new OpenRouterModelSource(config?: OpenRouterSourceConfig)`\r\n\r\n**Methods**:\r\n- `fetchModels(config?): Promise<ModelInfo[]>` - Fetch all available models\r\n\r\n**Config Options**:\r\n- `apiKey?: string` - OpenRouter API key (optional for public models)\r\n- `includeZDR?: boolean` - Include ZDR information (default: true)\r\n\r\n## Supported Features\r\n\r\n- ✅ Chat completions\r\n- ✅ Streaming\r\n- ✅ Function calling\r\n- ✅ Vision (for supported models)\r\n- ✅ Reasoning models\r\n- ✅ Cost tracking\r\n- ✅ Automatic fallbacks\r\n- ✅ Provider routing\r\n- ✅ ZDR mode\r\n- ✅ Multi-modal (for supported models)\r\n- ❌ Image generation (not supported by OpenRouter)\r\n- ❌ Speech synthesis (not supported by OpenRouter)\r\n- ❌ Transcription (not supported by OpenRouter)\r\n- ❌ Embeddings (not supported by OpenRouter)\r\n\r\nFor image generation, speech, transcription, and embeddings, use provider-specific packages like `@aeye/openai`, `@aeye/anthropic`, etc.\r\n\r\n## Related Packages\r\n\r\n- **[@aeye/core](../core)**: Core @aeye framework types and interfaces\r\n- **[@aeye/ai](../ai)**: AI abstractions and utilities\r\n- **[@aeye/openai](../openai)**: OpenAI provider (base class)\r\n- **[@aeye/anthropic](../anthropic)**: Anthropic Claude provider\r\n- **[@aeye/google](../google)**: Google AI provider\r\n\r\n## Links\r\n\r\n- [OpenRouter Website](https://openrouter.ai)\r\n- [OpenRouter Models](https://openrouter.ai/models)\r\n- [OpenRouter Documentation](https://openrouter.ai/docs)\r\n- [OpenRouter API Keys](https://openrouter.ai/keys)\r\n\r\n## License\r\n\r\nGPL-3.0\r\n\r\n## Contributing\r\n\r\nContributions are welcome! Please see the main [@aeye repository](https://github.com/ClickerMonkey/aeye) for contribution guidelines.\r\n\r\n## Support\r\n\r\nFor issues and questions:\r\n- GitHub Issues: https://github.com/ClickerMonkey/aeye/issues\r\n- Documentation: https://github.com/ClickerMonkey/aeye\r\n- OpenRouter Discord: https://discord.gg/openrouter\r\n","readmeFilename":"README.md"}