{"_id":"@carloscortezcloud/styrr-llm","_rev":"9-a841ddc6ac789123b5b3eb20f3ce26da","name":"@carloscortezcloud/styrr-llm","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@carloscortezcloud/styrr-llm","version":"0.1.0","keywords":["llm","router","ai","openrouter","bedrock","fallback","multi-model","openai","agents"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/styrr-llm@0.1.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/styrr#readme","bugs":{"url":"https://github.com/breakingthecloud/styrr/issues"},"dist":{"shasum":"e1adad43c73c8149cf7dad8a9e168acabd5b8de9","tarball":"https://registry.npmjs.org/@carloscortezcloud/styrr-llm/-/styrr-llm-0.1.0.tgz","fileCount":4,"integrity":"sha512-oSDdStVoFO8QDiJKlkqgQKndREMFiZ1VYOY3nfyENuIjnFGKxsD/EX+Zm2i1k1hbfV+mCI3aPLfye68/mZjqaA==","signatures":[{"sig":"MEYCIQClIyhHp3BzF1+7sgoHvtOUtRbWmO4mRC42OwBb4HFhPQIhAOQj365na3n8w5zfFn9MIoLhnJGbHpXqjH2+VTAVyLZg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14242},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"efe8349ba25ab260d80b3a68a7b98d603862f746","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/styrr.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal LLM router with multi-model fallback chain. Zero dependencies. Works in CF Workers, Lambda, Node.js.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/styrr-llm_0.1.0_1784762957090_0.3117060252926722","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@carloscortezcloud/styrr-llm","version":"0.1.1","keywords":["llm","router","ai","openrouter","bedrock","fallback","multi-model","openai","agents"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/styrr-llm@0.1.1","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/styrr#readme","bugs":{"url":"https://github.com/breakingthecloud/styrr/issues"},"dist":{"shasum":"e0780c2fbdb57588fd5687b85c4dbb784f36b15c","tarball":"https://registry.npmjs.org/@carloscortezcloud/styrr-llm/-/styrr-llm-0.1.1.tgz","fileCount":4,"integrity":"sha512-fCpur0J2v3jt/cHMN7p46xjzd6qavj5j75tc5xSAc+oPRX6WxUNohCymLO82vusbdaCJxTci5phFJRaMPslJow==","signatures":[{"sig":"MEUCIGtPFU1ktnM27KmIJlNf66duvx3zi5uaZwrSTNjt8Q7CAiEAzQN5e9sMxS6ji2cPRLmf2GNCVUaA6HQcTNa9RgtL370=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14262},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"efe8349ba25ab260d80b3a68a7b98d603862f746","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/styrr.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal LLM router with multi-model fallback chain. Zero dependencies. Works in CF Workers, Lambda, Node.js.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/styrr-llm_0.1.1_1784763375414_0.357415075379633","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@carloscortezcloud/styrr-llm","version":"0.1.2","keywords":["llm","router","ai","openrouter","bedrock","fallback","multi-model","openai","agents"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/styrr-llm@0.1.2","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/styrr#readme","bugs":{"url":"https://github.com/breakingthecloud/styrr/issues"},"dist":{"shasum":"944d8f5020923e850f62bd6c6a5e876ef893a741","tarball":"https://registry.npmjs.org/@carloscortezcloud/styrr-llm/-/styrr-llm-0.1.2.tgz","fileCount":4,"integrity":"sha512-J1K2lxS+Beu9JcpV58lZlNgH1aCOJ7z8yGmCcacfZBw4v35VIQYB69HVDvTxUDCe/wlZ1Q1qijKPN1zHFxR99A==","signatures":[{"sig":"MEQCIBTjGdqXozXA3ZlqZDuZjW4poPI340bysw03ceNlEPJWAiAC5R8AubYRos+Ovrzanjnvm3mKLzBPWBtGuHsYScdbrA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15279},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"efe8349ba25ab260d80b3a68a7b98d603862f746","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/styrr.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal LLM router with multi-model fallback chain. Zero dependencies. Works in CF Workers, Lambda, Node.js.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/styrr-llm_0.1.2_1784763871551_0.9237360478798653","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@carloscortezcloud/styrr-llm","version":"0.2.0","keywords":["llm","router","ai","openrouter","bedrock","fallback","multi-model","openai","agents"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/styrr-llm@0.2.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/styrr#readme","bugs":{"url":"https://github.com/breakingthecloud/styrr/issues"},"dist":{"shasum":"d6b81acf951fb35947e14a9e10bc2b9d3ec5468a","tarball":"https://registry.npmjs.org/@carloscortezcloud/styrr-llm/-/styrr-llm-0.2.0.tgz","fileCount":6,"integrity":"sha512-wzccMkvlDNvqWKL1BTlRqqODIcB1oULyvJoXkaBQHUu1V+PWygGCoGZkLx+sBUMPrL3xAbjkfM6COmJsWZvJBQ==","signatures":[{"sig":"MEUCIQCxR9qcCALbYoSlgZDPcNgPPeqt+8Q+nQNW5LPvxeZjIwIgKHFKWIji2evOuUoNvgVU9pon2COlJg1Mu+WLJWCxcvE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24112},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"87d7316fea6a3e6ae97acca2170ad4d06c70a457","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/styrr.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal LLM router with multi-model fallback chain. Zero dependencies. Works in CF Workers, Lambda, Node.js.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/styrr-llm_0.2.0_1784930600537_0.5886536089059451","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@carloscortezcloud/styrr-llm","version":"0.3.0","keywords":["llm","router","ai","openrouter","bedrock","fallback","multi-model","openai","agents"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/styrr-llm@0.3.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/styrr#readme","bugs":{"url":"https://github.com/breakingthecloud/styrr/issues"},"dist":{"shasum":"972499496029c002539bbe4e74097741e0080152","tarball":"https://registry.npmjs.org/@carloscortezcloud/styrr-llm/-/styrr-llm-0.3.0.tgz","fileCount":16,"integrity":"sha512-A49vQxsJ80tGbpKPb2rH+z19+tW7YFKBZQJeTHWA/RneoODk2YfCcL61wA0bL/wqr2y2m4GMCuKQT+pbazJnpw==","signatures":[{"sig":"MEUCIBbCKYibNlCOjfUfvdZiugQR5lnns0bKdIgfp/B/tAdhAiEA7kviqypqVVWAUuwr/kGUQ6AKIolGxHMeiw5VvoPRCiE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35383},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"906e3148658c2eeee2344ffc7a1f0e9c594b80ec","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/styrr.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal LLM router with multi-model fallback chain. Zero dependencies. Works in CF Workers, Lambda, Node.js.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/styrr-llm_0.3.0_1785285384313_0.5077386598187765","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@carloscortezcloud/styrr-llm","version":"0.3.1","keywords":["llm","router","ai","openrouter","bedrock","fallback","multi-model","openai","agents"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/styrr-llm@0.3.1","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/styrr#readme","bugs":{"url":"https://github.com/breakingthecloud/styrr/issues"},"dist":{"shasum":"1118d5f7eea25ab97461a5780fdb15a8d3c44d16","tarball":"https://registry.npmjs.org/@carloscortezcloud/styrr-llm/-/styrr-llm-0.3.1.tgz","fileCount":18,"integrity":"sha512-mciVRxGpxOMFJKQPRbDhpHxE+ndyw6oFyZ+LtDUuYviJexWL/C3xn6UP4myrDdrQKMbALSeizhOndrDSDQ2kkg==","signatures":[{"sig":"MEYCIQDchqERJwIZLgN8vujH6Ncwnly8IS9a4C8qJ6c0PvUYQAIhAObDJm5DD6iXgvdsdacGNxddggoY2rN0p+i1+m6TBLly","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39277},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"901ea8d59d93527da2f1daeb25984d0ff155fe3a","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/styrr.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal LLM router with multi-model fallback chain. Zero dependencies. Works in CF Workers, Lambda, Node.js.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/styrr-llm_0.3.1_1785287379311_0.5953398321051222","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@carloscortezcloud/styrr-llm","version":"0.4.0","keywords":["llm","router","ai","openrouter","bedrock","fallback","multi-model","openai","agents"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/styrr-llm@0.4.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/styrr#readme","bugs":{"url":"https://github.com/breakingthecloud/styrr/issues"},"dist":{"shasum":"a73f346045eab2029354f81a422104e3beb6918a","tarball":"https://registry.npmjs.org/@carloscortezcloud/styrr-llm/-/styrr-llm-0.4.0.tgz","fileCount":20,"integrity":"sha512-w8a1EYqBy0iUddAN/tK/97YBpEj7XJ7Fl7ZqWNz0+QCwTLuNrPRVeH9kDcmpMxAWtO/J8eJf2EqqS6BGz84ZOg==","signatures":[{"sig":"MEUCICw3Fyzwl1KZgPMWptnLN21F6Iv3a3OhheR+rDzJIKt+AiEAs0VrqFoq0qKv+5KW4aXu0V0N6td4eNsqVhMIthog+EU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55108},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"c54424b3ff148aed1cb9dee5e2a88b61b8214ef1","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/styrr.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal LLM router with multi-model fallback chain. Zero dependencies. Works in CF Workers, Lambda, Node.js.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/styrr-llm_0.4.0_1785288316824_0.981344319626346","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@carloscortezcloud/styrr-llm","version":"0.5.0","keywords":["llm","router","ai","openrouter","bedrock","fallback","multi-model","openai","agents"],"author":"Carlos Cortez <carlos@finoptix.dev>","license":"Apache-2.0","_id":"@carloscortezcloud/styrr-llm@0.5.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"dist":{"shasum":"0fc01aacffd9c6b01249c46e52dd672d9a241561","tarball":"https://registry.npmjs.org/@carloscortezcloud/styrr-llm/-/styrr-llm-0.5.0.tgz","fileCount":20,"integrity":"sha512-8IQhPA3KjI//jfnvgxrsiBNPRqYuWPEb9Ph3LEVWVzGJCRFzeLzBX3sgrgtqyyvSz7EoH38VpP3/lp8eQbEVng==","signatures":[{"sig":"MEQCIBJqwL0PZPpboyW7/oMokXaGaO/7SCzbcIm3AorzZiQSAiBpT9F2rc5yAy2S5GHdsB33rkyfBVtkJj3rJ2JuMZ8ATQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55806},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"https://github.com/breakingthecloud/styrr","type":"git"},"description":"Minimal LLM router with multi-model fallback chain. Zero dependencies. Works in CF Workers, Lambda, Node.js.","directories":{},"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/styrr-llm_0.5.0_1785706721503_0.5383490813729759","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@carloscortezcloud/styrr-llm","version":"0.6.0","description":"Minimal LLM router with multi-model fallback chain. Zero dependencies. Works in CF Workers, Lambda, Node.js.","main":"dist/index.js","types":"dist/index.d.ts","keywords":["llm","router","ai","openrouter","bedrock","fallback","multi-model","openai","agents"],"author":"Carlos Cortez <carlos@finoptix.dev>","license":"Apache-2.0","repository":{"type":"git","url":"https://github.com/breakingthecloud/styrr"},"devDependencies":{"typescript":"^5.5.0","vitest":"^2.0.0"},"type":"module","scripts":{"build":"tsc","test":"vitest run","test:watch":"vitest"},"_nodeVersion":"22.23.1","_id":"@carloscortezcloud/styrr-llm@0.6.0","dist":{"integrity":"sha512-fCV4w5Q1oHlD+o+a2+oudtj5YwPZeAKStMizNp2G0opIofOBqarOYEw2xJuSeBwXctissSAvsMXhDgREkrZPvg==","shasum":"b79f501ad6c0331539c3d3a297a7128647f68422","tarball":"https://registry.npmjs.org/@carloscortezcloud/styrr-llm/-/styrr-llm-0.6.0.tgz","fileCount":22,"unpackedSize":71545,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCFDocBputj3A9rUHrgsT4KChRs3e9aaWP/0D71JgiXfQIhAPmvzpX9yUVUTu/fIubRAnMEnlVhRmcx7fHlcxK33O1f"}]},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"directories":{},"maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/styrr-llm_0.6.0_1786198378063_0.031132774221945603"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-22T23:29:16.993Z","modified":"2026-08-08T14:12:58.413Z","0.1.0":"2026-07-22T23:29:17.228Z","0.1.1":"2026-07-22T23:36:15.555Z","0.1.2":"2026-07-22T23:44:31.687Z","0.2.0":"2026-07-24T22:03:20.680Z","0.3.0":"2026-07-29T00:36:24.479Z","0.3.1":"2026-07-29T01:09:39.467Z","0.4.0":"2026-07-29T01:25:16.982Z","0.5.0":"2026-08-02T21:38:41.658Z","0.6.0":"2026-08-08T14:12:58.242Z"},"author":"Carlos Cortez <carlos@finoptix.dev>","license":"Apache-2.0","keywords":["llm","router","ai","openrouter","bedrock","fallback","multi-model","openai","agents"],"repository":{"type":"git","url":"https://github.com/breakingthecloud/styrr"},"description":"Minimal LLM router with multi-model fallback chain. Zero dependencies. Works in CF Workers, Lambda, Node.js.","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"readme":"<p align=\"center\">\n  <img alt=\"Styrr\" src=\"https://img.shields.io/badge/🧭-Styrr-10B981?style=for-the-badge\" height=\"50\">\n</p>\n\n<p align=\"center\">\n  <b>Minimal LLM Router</b><br>\n  Multi-model fallback chain. Zero dependencies. Works everywhere.\n</p>\n\n<p align=\"center\">\n  <a href=\"#quick-start\">Quick Start</a>\n  ·\n  <a href=\"#features\">Features</a>\n  ·\n  <a href=\"#why-styrr\">Why Styrr?</a>\n  ·\n  <a href=\"#ecosystem\">Ecosystem</a>\n</p>\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/npm/v/styrr?style=flat-square&logo=npm&color=10B981\" alt=\"npm\">\n  <img src=\"https://img.shields.io/badge/license-Apache_2.0-10B981?style=flat-square\" alt=\"License\">\n  <img src=\"https://img.shields.io/badge/TypeScript-5.5%2B-3178C6?style=flat-square&logo=typescript\" alt=\"TypeScript\">\n  <img src=\"https://img.shields.io/badge/dependencies-0-success?style=flat-square\" alt=\"Zero deps\">\n  <img src=\"https://img.shields.io/badge/size-%3E5KB-10B981?style=flat-square\" alt=\"Size\">\n  <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen?style=flat-square\" alt=\"PRs\">\n</p>\n\n---\n\n## What Is Styrr?\n\nStyrr (Old Norse: \"rudder\") steers your LLM requests to the right model. If one model fails (rate limit, timeout, error), it automatically tries the next. One consistent API for OpenAI, OpenRouter, Bedrock, Ollama — or any OpenAI-compatible endpoint.\n\n```typescript\nimport { StyrRouter } from 'styrr';\n\nconst router = new StyrRouter({\n  apiKey: process.env.OPENROUTER_API_KEY!,\n  models: [\n    { id: 'nvidia/nemotron-3-super-120b:free' },\n    { id: 'meta-llama/llama-3.3-70b-instruct:free' },\n    { id: 'qwen/qwen3-coder:free' },\n  ],\n});\n\nconst result = await router.prompt('Explain FinOps in 2 sentences.');\nconsole.log(result.text);          // \"FinOps is...\"\nconsole.log(result.modelUsed);     // which model responded\nconsole.log(result.latencyMs);     // how long it took\nconsole.log(result.fallbacksTried); // 0 if primary worked\n```\n\n## Install\n\n```bash\nnpm install styrr\n```\n\n## Quick Start\n\n### 1. Install\n\n```bash\nnpm install styrr\n```\n\n### 2. Route your first prompt\n\n```typescript\nimport { StyrRouter } from 'styrr';\n\nconst router = new StyrRouter({\n  apiKey: process.env.OPENROUTER_API_KEY!,\n  models: [\n    { id: 'meta-llama/llama-3.3-70b-instruct:free' },\n  ],\n});\n\nconst result = await router.prompt('Hello!');\nconsole.log(result.text);\n```\n\n## Features\n\n| Feature | Description |\n|---------|-------------|\n| **Multi-model fallback** | If model 1 returns 429/5xx, automatically tries model 2, 3, etc. |\n| **Fail-fast on auth errors** | 401/400 throws immediately — don't retry with different model |\n| **Structured JSON output** | Auto-parses JSON responses, strips markdown fences |\n| **Tool calling** | Pass tool schemas, get parsed tool_calls back |\n| **Timeout per model** | `AbortSignal.timeout` per call |\n| **Zero dependencies** | Just `fetch()` — works anywhere |\n| **Observable** | `onFallback` and `onAllFailed` hooks |\n\n## Advanced Usage\n\n### With tools (function calling)\n\n```typescript\nconst result = await router.call(messages, {\n  tools: [{\n    type: 'function',\n    function: {\n      name: 'get_weather',\n      description: 'Get current weather',\n      parameters: { type: 'object', properties: { city: { type: 'string' } } }\n    }\n  }]\n});\n\nif (result.toolCalls) {\n  console.log(result.toolCalls[0].name);      // 'get_weather'\n  console.log(result.toolCalls[0].arguments); // { city: 'Lima' }\n}\n```\n\n### With observability hooks\n\n```typescript\nconst router = new StyrRouter({\n  apiKey: '...',\n  models: [...],\n  onFallback: (failed, error, next) => {\n    console.warn(`[Styrr] ${failed} failed (${error}), trying ${next}`);\n  },\n  onAllFailed: (errors) => {\n    console.error('[Styrr] All models exhausted:', errors);\n  },\n});\n```\n\n### Custom providers (Bedrock, Ollama, etc.)\n\n```typescript\nconst router = new StyrRouter({\n  apiKey: 'not-used',\n  models: [\n    { id: 'llama3.2', baseUrl: 'http://localhost:11434/v1', provider: 'ollama' },\n    { id: 'gpt-4o', baseUrl: 'https://api.openai.com/v1', apiKey: 'sk-...' },\n  ],\n});\n```\n\n### Bedrock AgentCore cross-provider fallback\n\nPattern for using Styrr as the routing layer inside a Bedrock AgentCore deployment,\nwith ordered fallback by budget + latency (Bedrock → external → free). Lazy-imports\nthe AWS SDK, so the package stays zero-dependency:\n\n```typescript\nconst router = new StyrRouter({\n  apiKey: process.env.OPENROUTER_API_KEY!,\n  models: [\n    { id: 'anthropic.claude-3-sonnet-20240229-v1:0', provider: 'bedrock' },\n    { id: 'openai/o1', provider: 'openrouter' },\n    { id: 'meta-llama/llama-3.3-70b-instruct:free', provider: 'openrouter' },\n  ],\n});\n```\n\nSee [docs/bedrock-agentcore.md](docs/bedrock-agentcore.md) for the full pattern\n(IAM auth, AgentCore tool integration, Sayay budget-aware degrade).\n\n## Why Styrr?\n\n| Feature | Styrr | LiteLLM | OpenRouter |\n|---------|:-----:|:-------:|:----------:|\n| Zero dependencies | ✅ | ❌ | N/A |\n| Self-hosted | ✅ | ✅ | ❌ |\n| Works in CF Workers | ✅ | ❌ | N/A |\n| Fallback chain | ✅ | ✅ | ❌ |\n| Tool calling | ✅ | ✅ | ✅ |\n| Cost-aware routing | 🔜 | ❌ | ❌ |\n| Size | ~5KB | ~500KB | — |\n\n## Ecosystem\n\n| Package | Role | npm |\n|---------|------|-----|\n| **Styrr** | LLM router (this) | `styrr` |\n| **Sayay** | Cost guardrails | GitHub |\n| **Tinkuy** | Agent framework | `@carloscortezcloud/tinkuy-agent` |\n| **Qhaway** | Agent observability | `@carloscortezcloud/qhaway` |\n| **TideRAG** | Edge RAG pipeline | `@carloscortezcloud/tiderag` |\n\n## License\n\nApache 2.0 — see [LICENSE](LICENSE).\n\n---\n\n<p align=\"center\">\n  Built by engineers who got tired of vendor lock-in.<br>\n  <a href=\"https://github.com/breakingthecloud/tinkuylabs\">Tinkuy Labs</a> · <a href=\"https://finoptix.dev\">finoptix.dev</a>\n</p>\n<p align=\"center\">\n  <sub>Works on free models. Zero deps. Ship it.</sub>\n</p>\n","readmeFilename":""}