{"_id":"@caeliq/llms","_rev":"19-825cccfc5c68ad163a6f2beb1aa4f122","name":"@caeliq/llms","dist-tags":{"latest":"1.0.72"},"versions":{"1.0.54":{"name":"@caeliq/llms","version":"1.0.54","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.54","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"13ea1cf990393abb9577433c010418a172451798","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.54.tgz","fileCount":7,"integrity":"sha512-+VH82qOfAJiwHcsvAblH/ltk/X+ciwQe3in+vTf2Ym07j3Glp+OnVh9VK+kHdRsylRQRuVZGQCedgHBK0Zep6w==","signatures":[{"sig":"MEQCIB6POUboRlAXeH/ZD8ECNM3XNir1L4/2C1jty5LCes00AiBh+/MW0Qy1nfvxnoLYQft/jXqHicBTYewTJ7zC1S96Ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5698711},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"7563b6d76c090172768d631d901488d8d0d72fa9","_npmUser":{"name":"oakimov","email":"o.akimov@caeliq.io"},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"11.6.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"24.13.0","dependencies":{"uuid":"^11.1.0","json5":"^2.2.3","dotenv":"^16.5.0","openai":"^5.6.0","undici":"^7.10.0","fastify":"^5.4.0","tiktoken":"^1.0.21","lru-cache":"^11.2.2","jsonrepair":"^3.13.0","@cursor/sdk":"^1.0.23","@fastify/cors":"^11.0.1","@google/genai":"^1.7.0","fastify-plugin":"^5.1.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.54.0","@caeliq/ccr-shared":"^2.0.0","google-auth-library":"^10.1.0","@huggingface/tokenizers":"^0.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.3","esbuild":"^0.25.1","typescript":"^5.8.2","@types/node":"^24.0.15"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.54_1784527168733_0.770304782924027","host":"s3://npm-registry-packages-npm-production"}},"1.0.55":{"name":"@caeliq/llms","version":"1.0.55","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.55","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"fd1b2f4065f4b3f348f71a13fc70a19af28b1dac","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.55.tgz","fileCount":7,"integrity":"sha512-dczqTPFPfgIWhYUtg5i89UwPJ/Mlvy5EsT31PY+qialLoqVCqVBj/sDqYpwItzvwo+3L8lDB0l5HZ1J6e/CElg==","signatures":[{"sig":"MEYCIQCfZG4FFsfwjyyh1Paduia1w7iDys5JjatiW63pTMPxWQIhAKHDz/YtzSQ6qj6nTVMOC5l4LmyJEfWfMoYayRVfmJe8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.55","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5698739},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"2a8509be1311e449baee1e61a37be4dfa81d454b","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.1","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.1","dependencies":{"uuid":"^11.1.0","json5":"^2.2.3","dotenv":"^16.5.0","openai":"^5.6.0","undici":"^7.10.0","fastify":"^5.4.0","tiktoken":"^1.0.21","lru-cache":"^11.2.2","jsonrepair":"^3.13.0","@cursor/sdk":"^1.0.23","@fastify/cors":"^11.0.1","@google/genai":"^1.7.0","fastify-plugin":"^5.1.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.54.0","@caeliq/ccr-shared":"^2.0.1","google-auth-library":"^10.1.0","@huggingface/tokenizers":"^0.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.3","esbuild":"^0.25.1","typescript":"^5.8.2","@types/node":"^24.0.15"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.55_1784528301366_0.37408074763733623","host":"s3://npm-registry-packages-npm-production"}},"1.0.56":{"name":"@caeliq/llms","version":"1.0.56","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.56","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"b0231dde0c23adffb21814e3310cb2cbf021ee7e","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.56.tgz","fileCount":7,"integrity":"sha512-oFwD6TObYYOMQRp5QS7XmO4j2IkpwocMiuTFAve6TD8v8vAdsQvdIBqtJ4fRglNZdlC1qVMYUcgmd9Cqqji+sg==","signatures":[{"sig":"MEUCIBWOksautuSHLfQ3fbGCyEG9BchB5BQnnSBzacUYw+U0AiEA//XCxpLBzYU6C8stlkTY1fR62XM28H3ZVmYW/Bsgl2M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.56","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5837984},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"3df5edb78f2f5d51d011c8e36c56f8d46fdcc661","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.1","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.1","dependencies":{"uuid":"^11.1.0","json5":"^2.2.3","dotenv":"^16.5.0","openai":"^5.6.0","undici":"^7.10.0","fastify":"^5.4.0","tiktoken":"^1.0.21","lru-cache":"^11.2.2","jsonrepair":"^3.13.0","@cursor/sdk":"^1.0.23","@fastify/cors":"^11.0.1","@google/genai":"^1.7.0","fastify-plugin":"^5.1.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.54.0","@caeliq/ccr-shared":"^2.0.2","google-auth-library":"^10.1.0","@huggingface/tokenizers":"^0.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.3","esbuild":"^0.25.1","typescript":"^5.8.2","@types/node":"^24.0.15"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.56_1784546678258_0.41106192879772085","host":"s3://npm-registry-packages-npm-production"}},"1.0.57":{"name":"@caeliq/llms","version":"1.0.57","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.57","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"54c2e6917327a4296e0c7070d48ce3aeb51b8156","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.57.tgz","fileCount":129,"integrity":"sha512-8wRRvMcwSa6vhvk3T505RMonMDRfoqSFMf2lXPo9PZCIQnPH/eMa6WTu1QFh2gRx8wc5e2RT8S/7x9rjKsiSDQ==","signatures":[{"sig":"MEUCIC3wP9dNCrELvpN9zoRAZHLK0nWg2a5/R2y5nC95Oe7wAiEAj/S1OXcz2IsXZoo0pk5qd/Msj+XSukKQ1eMb+gfO6xI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.57","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6038537},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"3ddcc33bdacdf5952f14ddf056c53d302ff375c3","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.1","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.1","dependencies":{"uuid":"^11.1.0","json5":"^2.2.3","dotenv":"^16.5.0","openai":"^5.6.0","undici":"^7.10.0","fastify":"^5.4.0","tiktoken":"^1.0.21","lru-cache":"^11.2.2","jsonrepair":"^3.13.0","@cursor/sdk":"^1.0.23","@fastify/cors":"^11.0.1","@google/genai":"^2.13.0","fastify-plugin":"^5.1.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.54.0","@caeliq/ccr-shared":"^2.0.3","google-auth-library":"^10.1.0","@huggingface/tokenizers":"^0.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.3","esbuild":"^0.25.1","typescript":"^5.8.2","@types/node":"^24.0.15"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.57_1785094933793_0.11431960359734084","host":"s3://npm-registry-packages-npm-production"}},"1.0.58":{"name":"@caeliq/llms","version":"1.0.58","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.58","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"eee55efac52ef72e7eb7655563f00b15de589681","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.58.tgz","fileCount":149,"integrity":"sha512-oPUvdbXdnoy2YOekd5iX8Rl7WhFFE7WZEaDlvdvTfxqLGz+tA2s4WYo92xOo6/hEm45319a/JZTnrYGTy50gwA==","signatures":[{"sig":"MEUCIQDwL/d1ad8zph3mB8FZCWfL8wVjojuvi7Fs+9w/DlGxkAIgWEVpXxgXP4Way9If6AiFSyg4wZBNpCZEaUpxTbwfUi8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.58","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6398788},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"f2db40ada0d49c3089ad6597463279bf9ce21790","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.1","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.1","dependencies":{"uuid":"^11.1.0","json5":"^2.2.3","dotenv":"^16.5.0","openai":"^5.6.0","undici":"^7.10.0","fastify":"^5.4.0","tiktoken":"^1.0.21","lru-cache":"^11.2.2","jsonrepair":"^3.13.0","@cursor/sdk":"^1.0.23","@fastify/cors":"^11.0.1","@google/genai":"^2.13.0","fastify-plugin":"^5.1.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.54.0","@caeliq/ccr-shared":"^2.1.0","google-auth-library":"^10.1.0","@huggingface/tokenizers":"^0.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.3","esbuild":"^0.25.1","typescript":"^5.8.2","@types/node":"^24.0.15"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.58_1785272846343_0.20151799566373052","host":"s3://npm-registry-packages-npm-production"}},"1.0.59":{"name":"@caeliq/llms","version":"1.0.59","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.59","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"4a7de5ebbece06611d05deff4696b77cf7e2972e","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.59.tgz","fileCount":171,"integrity":"sha512-6ndpO2hyd3ZdmfrJHHKJaT/YIqr5HgumM4mjm21mmxiy1WA61prZtqTZk6gQdZ8F2ELWIT5sV0J+V+zwOp//JQ==","signatures":[{"sig":"MEUCIQDng2xotuvnR4L2r/sjKRqDWavL1oePLY3ZLgakKPC1SQIgI+5pTex75qr+Vejv9bihOnIvgmXMJG1IQreaMojE76Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.59","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7240747},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"0d89061d0a563ebf04786341927756a91a676a3c","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.1","dependencies":{"uuid":"^14.0.1","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.2.0","undici":"^8.9.0","fastify":"^5.11.2","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.26","@fastify/cors":"^11.3.0","@google/genai":"^2.15.0","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.115.0","@caeliq/ccr-shared":"^2.1.1","@fastify/rate-limit":"^10.3.0","google-auth-library":"^11.0.0","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","esbuild":"^0.28.1","typescript":"^6.0.3","@types/node":"^26.1.2"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.59_1785934746025_0.552496149644311","host":"s3://npm-registry-packages-npm-production"}},"1.0.60":{"name":"@caeliq/llms","version":"1.0.60","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.60","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"2eb971b678e48ada3610c2889bb98bc447e7a94d","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.60.tgz","fileCount":176,"integrity":"sha512-57ha282QbB/XFlnTLlQ8aRH8vE/UWlTAPEO+tvwmiuTGXca2zBMYsF4uiTz8/zu/AI100Mf8p7VQqs3F40rpVw==","signatures":[{"sig":"MEUCIQC1IeRHg+/UcVQ6UcdJxXEHHAUG2M/QIkxR02UTI5YgDQIgbyI8tuuAFHYAHE5IIFzbM6sh0jNUEk/ft3hXRj93lqo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.60","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7394274},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"6ccfb98c94606d69aa34b7f7e51725163df0cf81","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.1","dependencies":{"uuid":"^14.0.1","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.2.0","undici":"^8.9.0","fastify":"^5.11.2","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.26","@fastify/cors":"^11.3.0","@google/genai":"^2.15.0","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.115.0","@caeliq/ccr-shared":"^2.1.2","@fastify/rate-limit":"^10.3.0","google-auth-library":"^11.0.0","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","esbuild":"^0.28.1","typescript":"^6.0.3","@types/node":"^26.1.2"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.60_1786353774068_0.9319293161395077","host":"s3://npm-registry-packages-npm-production"}},"1.0.61":{"name":"@caeliq/llms","version":"1.0.61","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.61","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"37ad114caf796c1cb91c6228decd6058785cb497","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.61.tgz","fileCount":192,"integrity":"sha512-b6xgk7wudmjk7Uu26CSuFi/6PYRWoqsH7OWEwBhpbv3XW8iD4sYOL7GrMvW4xu26WlK+BmpttgZI2ZJB+rLkhA==","signatures":[{"sig":"MEUCIQCSb9OVKvjh1C1Hsgz/1nDZX3Ghygaimh3eM1xsmRifEgIgeCtc8Gq2OcIeHwpybP25ZFTUC77zelxCmYLFLbejcr8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.61","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8137860},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"3880ec2ad1e610360055f79ec0f8b5d596f13ebf","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.1","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.4.0","undici":"^8.10.0","fastify":"^5.12.0","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.28","@fastify/cors":"^11.3.0","@google/genai":"^2.17.1","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.115.0","@caeliq/ccr-shared":"^2.1.3","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.61_1787019766282_0.29290470504965693","host":"s3://npm-registry-packages-npm-production"}},"1.0.62":{"name":"@caeliq/llms","version":"1.0.62","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.62","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"9cd1ed58d14be357f80a0f63978373d67fda133a","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.62.tgz","fileCount":195,"integrity":"sha512-57pI5e2ML7IIHpDhXch3HeDAwZHd91A5HIigO0GfzmHwPcdDle+mG5xu8ji+joRJXMN6t35wfCKyTyw8i4gEKg==","signatures":[{"sig":"MEQCICUJ++jBgw7wipyzl4Eu9Nx9tb82JmiKRn3x/5ABzKNYAiAb0J5KKmgZzKGLP5Oia/O45VKciAJmlw/FqBK8J66tyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.62","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8164633},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"dc050022cff11836f94b9b1b2890bde94ee89d1e","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.1","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.4.0","undici":"^8.10.0","fastify":"^5.12.0","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.28","@fastify/cors":"^11.3.0","@google/genai":"^2.17.1","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.115.0","@caeliq/ccr-shared":"^2.1.4","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.62_1787146870552_0.22513248373203987","host":"s3://npm-registry-packages-npm-production"}},"1.0.63":{"name":"@caeliq/llms","version":"1.0.63","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.63","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"e335c2c85177ec2e6786125402f9d0a775c6aa49","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.63.tgz","fileCount":195,"integrity":"sha512-Nvd8xUICdEy0ugPFeAOtR48opqvUDBCHT+hE2saaoRf35HpCQnnf44ZYrIUpoo/vaF8ojdheZzZILSknaoqZAw==","signatures":[{"sig":"MEYCIQCGul/CZj9+qjOmhyliD6+YF6eywGRAXTlANzvhvdDa5wIhAMWjS/XJ7v2iSP35USpRKUiI3vpYJen3jOTPe0klIcE9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.63","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8194239},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"1bc963622ba0e375eb9706aeb59a9c692ba33c00","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.1","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.4.0","undici":"^8.10.0","fastify":"^5.12.0","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.28","@fastify/cors":"^11.3.0","@google/genai":"^2.17.1","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.115.0","@caeliq/ccr-shared":"^2.1.5","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.63_1787515741209_0.4250585254762822","host":"s3://npm-registry-packages-npm-production"}},"1.0.64":{"name":"@caeliq/llms","version":"1.0.64","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.64","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"da69c0b6badf96f5c1dab222c8e1bf7c4c53e41a","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.64.tgz","fileCount":195,"integrity":"sha512-t38/SeQ6897Yg/NSFoUKBSPwpmp3OQOYTKMccRumiyAQkewQJE9YHF30Vywf/Xi59UAAQFFqoLn3d+4U+WjGoA==","signatures":[{"sig":"MEUCIGp2mbWcSrX0+At6zO9x3WLlEXfIRppIt7vZG5joLCa4AiEA4xr2D5cRUZVRXHWgEx4hzkELZ6v2rK8e/ZRBD49n+Mc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.64","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8201900},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"b01621d0c35d65e2b0de6c8a54e10f5cf7b245bb","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.1","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.4.0","undici":"^8.10.0","fastify":"^5.12.0","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.28","@fastify/cors":"^11.3.0","@google/genai":"^2.17.1","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.115.0","@caeliq/ccr-shared":"^2.1.6","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.64_1787655096519_0.878383418042423","host":"s3://npm-registry-packages-npm-production"}},"1.0.65":{"name":"@caeliq/llms","version":"1.0.65","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.65","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"2e12e09e7cf1d1de0df377c635159c42d47e3800","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.65.tgz","fileCount":196,"integrity":"sha512-F8veyRBqdfzZPXr6CSGt/lWK2iuFIChy9DeEwnpHuM5dqOPgegSNG2q9zJK7V7V2agjoZPod7gPzGrgMPGuL+w==","signatures":[{"sig":"MEUCIQC//hGPShHh6s6GAn24blPiC6bknFzpKj7biKKsjQZtJwIgHElLG6ak9Cc5u+ECVbHXo51+FD2H6YnH5J9BwUnM/sg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.65","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8225925},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"36f8a92ac1bc36d8774ff22b16dae4a6e37b70b2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.2","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.5.0","undici":"^8.10.0","fastify":"^5.12.1","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.28","@fastify/cors":"^11.3.0","@google/genai":"^2.18.0","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.120.0","@caeliq/ccr-shared":"^2.1.7","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.65_1787691448642_0.3655435219799039","host":"s3://npm-registry-packages-npm-production"}},"1.0.66":{"name":"@caeliq/llms","version":"1.0.66","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.66","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"8d1f75659195e3798a541b50d1ac4135d7518dc1","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.66.tgz","fileCount":209,"integrity":"sha512-xHhGLv5Re6BVA7rNkvEfrD43D8lQr1NcLAdDBL22ssYJRDyYdVSxjvU8q6W1CPUbMfrw2Oj9uqI6qNWgY8G57g==","signatures":[{"sig":"MEQCIAVKQja2rlv+QxggL466sHBl6oncj7NQQi4JzJjlDRieAiABuA0ruNT4XiTvYXz1Tkkvi54gbl1uUqrNkOIegvguyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.66","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8439758},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"32e72a265db7a2d9521bc8a02845fdd1bf471801","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.2","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.5.0","undici":"^8.10.0","fastify":"^5.12.1","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.30","@fastify/cors":"^11.3.0","@google/genai":"^2.18.0","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.120.0","@caeliq/ccr-shared":"^2.1.8","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.4.0"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.66_1787998886230_0.4791741922523476","host":"s3://npm-registry-packages-npm-production"}},"1.0.67":{"name":"@caeliq/llms","version":"1.0.67","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.67","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"e17525cc3739d40b16ada8c078f1c94aa39333d8","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.67.tgz","fileCount":222,"integrity":"sha512-XsTgvRt8GG8eGBq+Fuom4+vt80cFvoi+laGEIZRsodG8gMyldpFJze9MU3ESeP9K3iDuA/2A3TL2oyQWpwTJKg==","signatures":[{"sig":"MEYCIQCfkwfciwxUMiklo8SuZ4kMjMHb+/39yoE5X/na/iHCCAIhALJ89NddEEnH4F3V+vDQ4nASHIeeKVusFv9MJDNuDms0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.67","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8754924},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"a04eb6c33508c8085f1910f99180960fee1c5442","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.2","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.5.0","undici":"^8.10.0","fastify":"^5.12.1","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.30","@fastify/cors":"^11.3.0","@google/genai":"^2.18.0","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.120.0","@caeliq/ccr-shared":"^2.1.9","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.4.0"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.67_1788288408100_0.8337427984283687","host":"s3://npm-registry-packages-npm-production"}},"1.0.68":{"name":"@caeliq/llms","version":"1.0.68","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.68","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"6f1aca3e80d9fc6a403c042d05678e8beddede58","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.68.tgz","fileCount":226,"integrity":"sha512-lcvOx8/fHRUOqR96C3q8UvSDZudCvFZPjQ9Gr+fwkHtgIS+eKLL0rDgUkpWjcFs59txfGHe2Xn33UGcqVGFEmQ==","signatures":[{"sig":"MEUCIQDNySv5zt4v37VgqfwcHoSHSnUk3wB9JP2S1gPqCrPwoQIgQdSAutOaqeAo3tZ0P1eZakJiIQtF8NP9dRRIDGB2nwA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.68","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8849593},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"b13a48e98a0a44c6e82bcb9de460e26d264b36a5","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.2","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.5.0","undici":"^8.10.1","fastify":"^5.12.1","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.30","@fastify/cors":"^11.3.0","@google/genai":"^2.18.0","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.120.0","@caeliq/ccr-shared":"^2.1.10","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.4.1"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.68_1788466997104_0.1885206462840432","host":"s3://npm-registry-packages-npm-production"}},"1.0.69":{"name":"@caeliq/llms","version":"1.0.69","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.69","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"b0b0945efb6835593a166c0b84ef32c979d8f030","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.69.tgz","fileCount":242,"integrity":"sha512-pU3obNRyoM68Y/4fMreb1UN4bdsRXBG/B5cN5O2H+u+He95U4ZsLshJXVNKWWS7vxrA9xnRnKFyJlW3aK6iWew==","signatures":[{"sig":"MEQCIEL5gxRIwKq1moXgAaWYcbbWtwD17O3i4YUE5s0wmYo/AiBCUTL1TvfJO7ccds7N/Y2KJ1nMRRB3cdRJN8Y1AHJVCA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.69","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":9015624},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"7aeca85f6c640ee4a550b305aef7ecdc4a2dc76b","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.2","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.5.0","undici":"^8.10.1","fastify":"^5.12.1","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.30","@fastify/cors":"^11.3.0","@google/genai":"^2.18.0","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.120.0","@caeliq/ccr-shared":"^2.1.11","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.4.1"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.69_1788943765331_0.30271087815505116","host":"s3://npm-registry-packages-npm-production"}},"1.0.70":{"name":"@caeliq/llms","version":"1.0.70","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.70","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"319b3b4961f966efa557ddc62f098df9d3e5856f","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.70.tgz","fileCount":243,"integrity":"sha512-uEvrKrpinSlZdYZM+1fb/dAI57S8jzcfa3UHkYo+qKSHtTCFUntyRl2Tar0XTo5YCbSumY948G7AhnQd56/fSw==","signatures":[{"sig":"MEQCIGyNlxYP5rd8b1vrATcDhvdyV4oWNdszWMVTTPiDoH2gAiAE7inampdYhwyooJVgx8Z+3+0HoOQFPz3QCq8iqQvzoA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHw/1iwnV/sylfaTJBsFNLp5Xk0/gfJ5PZ6++NgNLSoOAiBBSH2t5/QYqK+WTEeN+grQfS4lDVJP1cZnTQcxKgAtuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.70","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":9183574},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"ab83e2bdf371e1d4f00a358214950c70f41e1aad","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.1.0","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.2","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.5.0","undici":"^8.10.1","fastify":"^5.12.1","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.32","@fastify/cors":"^11.3.0","@google/genai":"^2.18.0","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.120.0","@caeliq/ccr-shared":"^2.1.12","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.4.1"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.70_1790285418769_0.5173803782437945","host":"s3://npm-registry-packages-npm-production"}},"1.0.71":{"name":"@caeliq/llms","version":"1.0.71","keywords":["llm","anthropic","openai","gemini","transformer","api"],"author":{"name":"caeliq"},"license":"MIT","_id":"@caeliq/llms@1.0.71","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"homepage":"https://github.com/oakimov/claude-code-router#readme","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"5947ff2d29cfe0e9bb756a893629240403e128ae","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.71.tgz","fileCount":243,"integrity":"sha512-NuKs830ELWWu18Ud1kAcP20H1NLAfMBp8TVtBJa93KYdY+x5oGW8/wLeNCE+ZGXTyVfntGwIQE69bxM0OId9zw==","signatures":[{"sig":"MEUCIGZDxgxCg8cwwGVC++TAd6HFqVSddbVlqjim5Mzyu8SyAiEA8lkhA9D8QX2tqGEItvtGd4VAhZP1b860uoj5jAmCMfw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC6AAcMtWlj2w/VoD4+zCrup6X7JxVYS3REgc83XqTI4AIgQDZQb0NOgx8RfYUT2HUS9JHn12OIJb+pfVYIrVx0nB8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.71","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":9222465},"main":"dist/cjs/server.cjs","type":"module","types":"./dist/index.d.ts","module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"851c6d5d648f6b9dac623106b365a9c795314310","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.1.0","description":"A universal LLM API transformation server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.2","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.5.0","undici":"^8.10.1","fastify":"^5.12.1","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.32","@fastify/cors":"^11.3.0","@google/genai":"^2.18.0","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.120.0","@caeliq/ccr-shared":"^2.1.13","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.4.1"},"_npmOperationalInternal":{"tmp":"tmp/llms_1.0.71_1790379058661_0.8016407170292792","host":"s3://npm-registry-packages-npm-production"}},"1.0.72":{"_id":"@caeliq/llms@1.0.72","bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"dist":{"shasum":"133ea06b86d9b9fc59e7ad7bf9f6b566e21e54db","tarball":"https://registry.npmjs.org/@caeliq/llms/-/llms-1.0.72.tgz","fileCount":245,"integrity":"sha512-+UVhVu93MaPw1+UxmS7/Mqx7AQooz1hTPV1db0q8MIGw37ZLK+1j54W28aru/gCbIiNUm64r5rKwMJfPvs99Cw==","signatures":[{"sig":"MEYCIQCfoxHyYqsPwHC5Ueo9lygGotxdhSLm/hlncGx5UVgf0wIhAKVBpRRXx5eO/aul9g+kDC3LPevv6NGUJjaRynqJig12","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCChonlTf/yoa5fvhBjkpDuOS8mbXyCDojj2Cc7IGPMSwIgIZRuJFB+RU5hERoCOu4gBnOHtGuHPsWDpfp34tN2Xos="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caeliq%2fllms@1.0.72","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":9314581},"main":"dist/cjs/server.cjs","name":"@caeliq/llms","type":"module","types":"./dist/index.d.ts","author":{"name":"caeliq"},"module":"dist/esm/server.mjs","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/esm/server.mjs","require":"./dist/cjs/server.cjs"}},"gitHead":"73a80f8c5384f3d76a6d4d6db5eeef6ae9e54335","license":"MIT","version":"1.0.72","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0e000650-f9aa-4798-aa69-b02c9e340ec9"}},"homepage":"https://github.com/oakimov/claude-code-router#readme","keywords":["llm","anthropic","openai","gemini","transformer","api"],"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"_npmVersion":"12.1.0","description":"A universal LLM API transformation server","directories":{},"maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.2","json5":"^2.2.3","dotenv":"^17.4.2","openai":"^7.5.0","undici":"^8.10.1","fastify":"^5.12.1","tiktoken":"^1.0.22","lru-cache":"^11.5.2","jsonrepair":"^3.15.0","@cursor/sdk":"^1.0.32","@fastify/cors":"^11.3.0","@google/genai":"^2.18.0","fastify-plugin":"^6.0.0","latex-to-unicode":"^0.1.0","@anthropic-ai/sdk":"^0.120.0","@caeliq/ccr-shared":"^2.1.14","@fastify/rate-limit":"^11.2.0","google-auth-library":"^11.0.2","@huggingface/tokenizers":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","esbuild":"^0.28.2","typescript":"^6.0.3","@types/node":"^26.4.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/llms_1.0.72_1790420422625_0.7340783529059614"}}},"time":{"created":"2026-07-20T05:59:28.626Z","modified":"2026-09-26T11:00:23.114Z","1.0.54":"2026-07-20T05:59:28.939Z","1.0.55":"2026-07-20T06:18:21.552Z","1.0.56":"2026-07-20T11:24:38.456Z","1.0.57":"2026-07-26T19:42:13.978Z","1.0.58":"2026-07-28T21:07:26.531Z","1.0.59":"2026-08-05T12:59:06.181Z","1.0.60":"2026-08-10T09:22:54.236Z","1.0.61":"2026-08-18T02:22:46.487Z","1.0.62":"2026-08-19T13:41:10.747Z","1.0.63":"2026-08-23T20:09:01.423Z","1.0.64":"2026-08-25T10:51:36.677Z","1.0.65":"2026-08-25T20:57:28.814Z","1.0.66":"2026-08-29T10:21:26.426Z","1.0.67":"2026-09-01T18:46:48.296Z","1.0.68":"2026-09-03T20:23:17.291Z","1.0.69":"2026-09-09T08:49:25.553Z","1.0.70":"2026-09-24T21:30:18.948Z","1.0.71":"2026-09-25T23:30:59.092Z","1.0.72":"2026-09-26T11:00:22.794Z"},"bugs":{"url":"https://github.com/oakimov/claude-code-router/issues"},"author":{"name":"caeliq"},"license":"MIT","homepage":"https://github.com/oakimov/claude-code-router#readme","keywords":["llm","anthropic","openai","gemini","transformer","api"],"repository":{"url":"git+https://github.com/oakimov/claude-code-router.git","type":"git","directory":"packages/core"},"description":"A universal LLM API transformation server","maintainers":[{"name":"oakimov","email":"o.akimov@caeliq.io"}],"readme":"![Claude Code Router — adaptive model routing, tool use, and thinking](blog/images/claude-code-router-img.png)\n\n[![](https://img.shields.io/github/license/musistudio/claude-code-router)](https://github.com/musistudio/claude-code-router/blob/main/LICENSE)\n\nClaude Code Router is an adaptive LLM gateway for Claude Code. It routes each request to the most suitable model and provider while preserving tool calls, streaming, extended thinking, and multi-turn context across different APIs.\n\n## ✨ Features\n\n- **Adaptive Model Routing**: Route requests by scenario, including background tasks, thinking, long context, web search, FIM completions, and image workflows.\n- **Tool Use & Thinking**: Preserve tool calls, tool results, and reasoning content across providers with different API formats.\n- **Multi-Provider Support**: Supports various model providers like OpenRouter, DeepSeek, Ollama, Gemini, Antigravity, Volcengine, SiliconFlow, Codex, Claude subscription, Qwen, Chrome On-Device, and Cursor (SDK).\n- **Request/Response Transformation**: Customize requests and responses for different providers using transformers.\n- **Native Client Protocols**: Accept Anthropic Messages, OpenAI Chat Completions, OpenAI Responses, and FIM Completions through the same router (FIM uses a dedicated pipeline and `fim.*` transformers).\n- **Dynamic Model Switching**: Switch models on-the-fly within Claude Code using the `/model` command.\n- **CLI Model Management**: Manage models and providers directly from the terminal with `ccr model`.\n- **GitHub Actions Integration**: Trigger Claude Code tasks in your GitHub workflows.\n- **Plugin System**: Extend functionality with custom transformers.\n\n## 🛠 Improvements in this fork\n\nThis fork is based on [claude-code-router](https://github.com/musistudio/claude-code-router) and includes several enhancements:\n\n- **Codex breaking change — required chaining:** Codex is no longer a converting owner. Providers **must** set `\"transformer\": { \"use\": [\"openai-responses\", \"codex\"] }`. A `codex`-only chain is rejected. `openai-responses` owns the Responses wire (including encrypted reasoning items); `codex` is ChatGPT auth/headers middleware (`store: false`, `stream: true`). Responses clients passthrough `input[]`.\n- **Improved LLM Support**: Fixed streaming for Gemini/Gemma and enhanced OpenAI API handling.\n- **Reasoning & Streaming Refactor**: Modularized streaming and reasoning logic into reusable utilities for better maintainability.\n- **Mistral Integration**: Added specific handling for Mistral's reasoning parameters and decoupled transformation logic.\n- **Build & Deployment**: Integrated the UI package into the Docker build process and added a Docker Compose configuration.\n- **Code Quality**: Localized codebase (English comments), improved error handling, and addressed Copilot review feedback.\n- **Dependency Security**: Keeps the workspace audit-clean with scoped security floors. Docusaurus's archived `image-size` dependency is replaced only on the MDX loader edge by a private `image-size/fromFile` compatibility adapter backed by maintained `probe-image-size`; it is build tooling and does not enter CCR runtime packages.\n- **Gemini Stability & Tool Use Fixes**: Corrected `thoughtSignature` placement in Gemini request bodies (Gemini 3 expects it as a sibling field on the `functionCall` part itself, and validates only the first such part per step); filtered synthetic `ccr_` placeholder signatures from outgoing Gemini requests to prevent Gemini 500 errors; fixed `tool_result` content-array serialization in the Anthropic transformer so models receive plain text instead of JSON-wrapped arrays (resolves \"Error editing file\" in Claude Code); fixed Fastify `onSend` hook to prevent `invalid type 'object'` unhandled rejections on error responses.\n- **Codex (ChatGPT) Integration**: ChatGPT backend over the Responses API. **Requires** `\"use\": [\"openai-responses\", \"codex\"]`. Supports OAuth (`ccr codex-auth`) and PAT (`api_key: \"at-...\"`), SSE streaming, encrypted reasoning replay, tool calls with web search, and image handling.\n- **Gateway and Codex model discovery**: The server's OpenAI-compatible `GET /v1/models` enriches configured models with native-provider metadata from models.dev (friendly names, descriptions, context/output limits, reasoning effort levels, and Claude Desktop family tiers). `MODEL_ID_OUTPUT` controls whether discovery emits literal canonical IDs (the default) or masks otherwise-filtered IDs as reversible `claude-<lowercase UTF-8 hex>` aliases. Inbound always accepts both forms. Separately, the CLI's `ccr codex-config` command uses the same exact-model/native-provider matching rule for Codex's local picker catalog: a unique model-id row is authoritative, duplicate ids are resolved to the native provider, and a true miss falls back to a 200K context window with `low`/`medium`/`high` effort. It also wires Codex's `config.toml` to route over the Responses API.\n- **Cursor SDK Integration**: Added `cursor-sdk` transformer that runs Cursor models in-process via `@cursor/sdk`. Default **bridge** mode keeps Claude Code as the tool host (Cursor built-ins denied); supports `plan` / `agent` modes, `crsr_` / `CURSOR_API_KEY` auth, `ccr model get cursor` model discovery, and Docker runtime install of the SDK native packages.\n- **Claude Subscription Integration**: Added `claude-auth` support for routing through a Claude Pro or Max subscription via OAuth (`ccr claude-auth`), using the `claude-auth` + `Anthropic` transformer chain.\n- **Antigravity Integration**: Added Google Antigravity OAuth via `ccr antigravity-auth`, with the `antigravity-auth` + `gemini` transformer chain targeting the Antigravity / `cloudcode-pa` API. Supports Gemini and Claude models under that quota, thought-signature round-tripping / fallback, and Claude tool-schema sanitization for Gemini-backed Claude models. Requires `gemini` options `{\"cachedContent\": false}` because Antigravity has no Google `cachedContents` resource (leaving the default `true` causes 404s).\n- **Qwen Chat Integration**: Added `qwen-auth` transformer for the Qwen Chat backend (`qwen.aikit.club/v1/chat/completions`), supporting JWT-based authentication (`ccr qwen-auth`) where the user pastes a token copied from `chat.qwen.ai` localStorage, automatic token rotation, and stripping of the trailing `<details>...</details>` metadata block Qwen injects into responses.\n- **xAI Grok Integration**: Added `xai-auth` transformer for xAI's Grok models over the Responses API (`openai-responses`), supporting both device-code OAuth (`ccr xai-auth`, backed by a SuperGrok/X Premium+ subscription — no local callback server needed) and a plain `xai-...` API key / `$XAI_API_KEY`, plus `ccr model get` autodiscovery for either mode.\n- **DeepSeek Reasoning Replay**: Implemented mandatory reasoning replay for DeepSeek models (e.g., via OpenCode/ZenGo). DeepSeek requires previous assistant reasoning content to be included in subsequent requests — the `reasoning` transformer automatically replays reasoning output from prior turns.\n- **Model Discovery**: Enabled non-interactive model discovery for arbitrary API providers. Using `ccr model get <provider>`, the tool automatically fetches remote models, parses custom JSON structures using configurable paths, and appends missing models to the local configuration while preserving existing settings.\n- **Chrome On-Device Model**: Added `chrome-on-device` transformer for Chrome's built-in Gemini Nano (~4GB local model). Communicates via a bridge process (`ccr chrome-bridge`) that connects to Chrome's Prompt API over CDP. Uses `responseConstraint` for structured JSON output (tool calls + text), supports streaming and non-streaming, exposes an OpenAI-compatible `/v1/chat/completions` endpoint, and replaces Claude Code's system prompt with a minimal tool-focused one. Zero API cost, zero latency to external providers.\n  - **Stability & Prompting**: Implemented an \"OPERATIONAL OVERRIDE\" in the system prompt to prevent hallucinations and force adherence to user-provided paths.\n  - **Stall Recovery**: Added a tiered retry mechanism for whitespace-heavy content: if the model stalls (emits 1000+ whitespace chars), the bridge aborts and retries without constraints and with increased temperature (Dynamic Temperature Scaling).\n  - **Contextual awareness**: Added labels (\"Tool Result:\") to tool outputs and instructed the model to check for existing results before calling tools again.\n\n## 🚀 Getting Started\n\n### 1. Installation\n\n#### Prerequisites\n\nBefore you begin, ensure you have the following installed on your system:\n- **Docker** (Recommended): The primary way to run the router via the published image. See [Docker Install Guide](https://docs.docker.com/get-docker/).\n- **Node.js** (Optional): Required to run from source, publish packages, or use the **Chrome On-Device** bridge. This fork requires **Node.js ≥ 22.19.0** (needed by `undici`). See [Node.js Download](https://nodejs.org/).\n- **Claude Code**: See the [official quickstart guide](https://code.claude.com/docs/en/quickstart) for installation instructions.\n\n#### Quick Start with Docker\n\nThe fastest way to launch Claude Code Router is the published Docker image:\n\n```shell\nmkdir -p ~/.claude-code-router\ndocker run -d --name ccr \\\n  -p 3456:3456 \\\n  -v ~/.claude-code-router:/root/.claude-code-router \\\n  ghcr.io/oakimov/claude-code-router:latest\n```\n\nThe image ships the server and UI, exposes the proxy on `http://localhost:3456`, and mounts `~/.claude-code-router` as the config directory (`/root/.claude-code-router` inside the container). Set `\"HOST\": \"0.0.0.0\"` in your `config.json` so the port mapping can reach the server. After changing the config, restart with `docker restart ccr`; view logs with `docker logs -f ccr`.\n\n### 2. Configuration\n\nCreate and configure your `~/.claude-code-router/config.json` file. For more details, you can refer to `config.example.json`.\n\nThe `config.json` file has several key sections:\n\n- **`PROXY_URL`** (optional): You can set a proxy for API requests, for example: `\"PROXY_URL\": \"http://127.0.0.1:7890\"`. Loopback targets (`localhost`, `127.0.0.1`, `::1`) always bypass the proxy. Hosts listed in the `NO_PROXY` / `no_proxy` environment variables also bypass it (comma-separated hosts, `.domain` / `*.domain`, CIDR, optional `:port`).\n- **`LOG`** (optional): You can enable logging by setting it to `true`. When set to `false`, no log files will be created. Default is `true`.\n- **`LOG_LEVEL`** (optional): Set the logging level. Available options are: `\"fatal\"`, `\"error\"`, `\"warn\"`, `\"info\"`, `\"debug\"`, `\"trace\"`. Default is `\"info\"`.\n- **`LOG_SSE_EVENTS`** (optional): When `true`, logs every SSE event on both **provider→CCR** and **CCR→client** while `LOG_LEVEL` is `debug`. Default is `false` — debug still records terminal cache/usage summaries without per-delta file I/O. Pair with `LOG_REQUEST_BODY` to also capture request bodies on **client→CCR** and **CCR→provider** (all protocols). Each record includes a `direction` field.\n- **Logging Systems**: The Claude Code Router uses two separate logging systems:\n  - **Server-level logs**: HTTP requests, API calls, and server events are logged using pino in the `~/.claude-code-router/logs/` directory with filenames like `ccr-*.log`\n  - **Application-level logs**: Routing decisions and business logic events are logged in `~/.claude-code-router/claude-code-router.log`\n- **`APIKEY`** (optional): You can set a secret key to authenticate requests. API clients can provide it in the `Authorization` header (e.g., `Bearer your-secret-key`) or the `x-api-key` header. The web UI exchanges it for an opaque `HttpOnly`, same-site session cookie and never stores the key in browser storage. UI sessions are kept in memory and require login again after CCR restarts. Example: `\"APIKEY\": \"your-secret-key\"`.\n- **`HOST`** (optional): You can set the host address for the server. If `APIKEY` is not set, the host will be forced to `127.0.0.1` for security reasons to prevent unauthorized access. Example: `\"HOST\": \"0.0.0.0\"`.\n- **Rate limiting**: Every route has a default limit of 1000 requests per minute. The shared default is defined by `RATE_LIMIT_CONFIG` in `packages/shared/src/constants.ts`; change it there to update all route limits.\n- **`NON_INTERACTIVE_MODE`** (optional): When set to `true`, enables compatibility with non-interactive environments like GitHub Actions, Docker containers, or other CI/CD systems. This sets appropriate environment variables (`CI=true`, `FORCE_COLOR=0`, etc.) and configures stdin handling to prevent the process from hanging in automated environments. Example: `\"NON_INTERACTIVE_MODE\": true`.\n\n- **`Providers`**: Used to configure different model providers.\n- **`Router`**: Used to set up routing rules. `default` specifies the default model, which will be used for all requests if no other route is configured.\n- **`API_TIMEOUT_MS`**: Specifies the timeout for API calls in milliseconds.\n\n#### Environment Variable Interpolation\n\nClaude Code Router supports environment variable interpolation for secure API key management. You can reference environment variables in your `config.json` using either `$VAR_NAME` or `${VAR_NAME}` syntax:\n\n```json\n{\n  \"OPENAI_API_KEY\": \"$OPENAI_API_KEY\",\n  \"GEMINI_API_KEY\": \"${GEMINI_API_KEY}\",\n  \"Providers\": [\n    {\n      \"name\": \"openai\",\n      \"api_base_url\": \"https://api.openai.com/v1/chat/completions\",\n      \"api_key\": \"$OPENAI_API_KEY\",\n      \"models\": [\"gpt-5\", \"gpt-5-mini\"]\n    }\n  ]\n}\n```\n\nThis allows you to keep sensitive API keys in environment variables instead of hardcoding them in configuration files. The interpolation works recursively through nested objects and arrays.\n\nHere is a minimal configuration:\n\n```json\n{\n  \"APIKEY\": \"your-secret-key\",\n  \"Providers\": [\n    {\n      \"name\": \"openrouter\",\n      \"api_base_url\": \"https://openrouter.ai/api/v1/chat/completions\",\n      \"api_key\": \"$OPENROUTER_API_KEY\",\n      \"models\": [\"anthropic/claude-sonnet-4\"],\n      \"transformer\": {\n        \"use\": [\"openrouter\"]\n      }\n    }\n  ],\n  \"Router\": {\n    \"default\": \"openrouter,anthropic/claude-sonnet-4\"\n  }\n}\n```\n\n> **See also**: The complete config reference, per-provider examples, and routing\n> options are in `docs/docs/server/config/basic.md`,\n> `docs/docs/server/config/providers.md`,\n> `docs/docs/server/config/transformers.md`, and\n> `docs/docs/server/config/routing.md`.\n\n#### Adding a New Provider\n\nIf you want to add a new provider and automatically discover its models, follow these steps:\n\n1. **Add Minimal Config**: Add a new entry to the `Providers` array in `config.json` with just the basic details:\n   ```json\n   {\n     \"name\": \"my-new-provider\",\n     \"api_base_url\": \"https://api.example.com/v1/chat/completions\",\n     \"api_key\": \"$MY_API_KEY\",\n     \"models\": []\n   }\n   ```\n2. **Perform Model Discovery**: Run the discovery command to fetch available models:\n   ```shell\n   ccr model get my-new-provider\n   ```\n3. **Sync Models**: The command will list remote models and prompt you to append missing ones to your configuration.\n4. **Restart**: Restart the service to pick up the updated configuration:\n   ```shell\n   ccr restart\n   ```\n\n> **Tip**: For a more comprehensive description of model discovery options, custom JSON response formats, and interactive model management, see the [CLI Model Management](#5-cli-model-management) section.\n\n### 3. Running Claude Code with the Router\n\n#### Via `ccr code`\n\nStart Claude Code using the router:\n\n```shell\nccr code\n```\n\n#### Via Claude Code Settings (Alternative)\n\nYou can also configure Claude Code to always use the router by editing its `settings.json` file (typically at `~/.claude/settings.json`). Models are specified using the `<provider>,<model>` syntax:\n\n```json\n{\n  \"env\": {\n    \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:3456\",\n    \"ANTHROPIC_AUTH_TOKEN\": \"dummy\",\n    \"ANTHROPIC_DEFAULT_HAIKU_MODEL\": \"gemini,gemma-4-31b-it\",\n    \"ANTHROPIC_DEFAULT_SONNET_MODEL\": \"opencode,minimax-m2.7\",\n    \"ANTHROPIC_DEFAULT_OPUS_MODEL\": \"opencode,glm-5.1\"\n  }\n}\n```\n\n| Variable | Purpose |\n|---|---|\n| `ANTHROPIC_BASE_URL` | Points Claude Code to the router's proxy address |\n| `ANTHROPIC_AUTH_TOKEN` | Must match the `APIKEY` value set in the router's `config.json` |\n| `ANTHROPIC_MODEL` | Default model (overrides per-tier defaults below) |\n| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | Fast / cost-effective model (Haiku equivalent) |\n| `ANTHROPIC_DEFAULT_SONNET_MODEL` | Balanced performance model (Sonnet equivalent) |\n| `ANTHROPIC_DEFAULT_OPUS_MODEL` | Maximum capability model (Opus equivalent) |\n\nThis approach lets you run `claude` directly without needing `ccr code`.\n\n#### Via OpenAI-compatible clients\n\nOpenAI SDK clients can use CCR without an Anthropic compatibility layer:\n\n```shell\nexport OPENAI_BASE_URL=http://127.0.0.1:3456/v1\nexport OPENAI_API_KEY=your-router-api-key\n```\n\nCCR accepts Chat Completions at `/v1/chat/completions` (alias `/chat/completions`), Responses at `/v1/responses` (alias `/responses`), and FIM at `/v1/fim/completions` (alias `/fim/completions`). Send a model as `provider,model` to select a destination explicitly, or send a bare model and configure `Router.default` (FIM also uses `Router.fim`). Chat JSON/SSE responses are converted back to the protocol used by the client; FIM responses follow the inbound FIM wire (v1: Codestral/Mistral).\n\nDiscover what the router can reach with `GET /v1/models` (alias `/models`). By default it emits literal `provider,model` IDs. Set `\"MODEL_ID_OUTPUT\": \"masked\"` to expose otherwise-filtered IDs as `claude-<hex>` while leaving IDs beginning with `claude` or `anthropic` unchanged. Chat routes accept both representations regardless of this output setting. To surface CCR models in Codex's native picker, use `ccr codex-config`, which writes a Codex model catalog and the managed `config.toml` block that points Codex at the router.\n\nThe compatibility layer supports ordinary text, images, function tools/results, reasoning effort, and usage reporting. Stateful Responses features such as `store: true`, `previous_response_id`, conversations, background mode, and provider file IDs return an explicit 400 error instead of being silently discarded. Client-hosted `custom` tools (the shape Codex uses for MCP / plugin tools) are projected onto function tools rather than rejected, so Codex can call them through the router.\n\n> **Note**: After modifying the configuration file, you need to restart the service for the changes to take effect:\n>\n> ```shell\n> ccr restart\n> ```\n\n### 4. UI Mode\n\nFor a more intuitive experience, you can use the UI mode to manage your configuration:\n\n```shell\nccr ui\n```\n\nThis will open a web-based interface where you can easily view and edit your `config.json` file.\n\n![UI](blog/images/ui.png)\n\n### 5. CLI Model Management\n\nFor users who prefer terminal-based workflows, you can use the interactive CLI model selector:\n\n```shell\nccr model\n```\n![](blog/images/models.gif)\n\n`ccr model` lets you view configured models, switch models per scenario, add models, and create providers with transformer configuration — all with validation and prompts.\n\nFor non-interactive model discovery from any provider with a model-list endpoint:\n\n```shell\nccr model get claude\nccr model get gemini\nccr model get openai\n```\n\n`ccr model get <provider>` fetches remote models, then prompts to append missing ones and remove configured ones the API no longer returns. Built-in endpoint support exists for `anthropic`/`claude`, `gemini`, `openai`, `codex`, `cursor`, and `xai` (resolves the same PAT-or-OAuth credential `xai-auth` uses). Other providers can use `models_api_url` plus a `models_response_format` (`listPath`, `idPath`, `stripPrefix`) to parse custom JSON responses.\n\n> **See also**: `docs/docs/server/guides/model-discovery.md` and `docs/docs/cli/commands/model-get.md`.\n>\n> **Note**: After syncing models into `config.json`, restart the service with `ccr restart`.\n\n> **Note — account OAuth providers**: The provider auth flows below (Antigravity, Codex, Claude subscription, Qwen, xAI Grok) authenticate through your account-level OAuth session rather than a dedicated API key. See [DISCLAIMER.md](DISCLAIMER.md) for the interoperability and compliance notes that apply to those providers.\n\n#### Antigravity Authentication\n\nRoute Claude Code through Google's Antigravity gateway (`cloudcode-pa`) using account OAuth instead of an API key.\n\n```shell\nccr antigravity-auth\n# or, for headless/remote:\nccr antigravity-auth --manual\nccr antigravity-auth --project <gcp-project-id>\n```\n\nThis command:\n1. Prints a Google OAuth URL (PKCE; callback `http://localhost:51121/oauth-callback`)\n2. The CCR server handles the public `/oauth-callback` route (Docker maps `51121:3456`, like Codex `1455:3456`)\n3. Tokens land in `~/.claude-code-router/antigravity_auth.json` (mounted config dir in Docker)\n\nExample provider:\n\n```json\n{\n  \"name\": \"antigravity\",\n  \"api_base_url\": \"https://daily-cloudcode-pa.sandbox.googleapis.com\",\n  \"api_key\": \"oauth\",\n  \"project_id\": \"$ANTIGRAVITY_PROJECT_ID\",\n  \"models\": [\"gemini-3-flash\", \"claude-sonnet-4-6\", \"claude-opus-4-6-thinking\"],\n  \"transformer\": {\n    \"use\": [\n      [\"gemini\", { \"cachedContent\": false, \"thoughtSignatureFallback\": \"skip\" }],\n      \"antigravity-auth\"\n    ]\n  }\n}\n```\n\n`cachedContent: false` is required — Antigravity has no Google `cachedContents` resource, and leaving the Gemini default (`true`) causes 404s. The `thoughtSignatureFallback` option is covered in `docs/docs/server/config/transformers.md`.\n\n> **Note**: Keep the CCR server running during auth. Using Antigravity IDE OAuth client credentials from a non-IDE client may violate Google's terms.\n\n#### Codex Provider Authentication\n\nThe Codex provider supports two authentication modes:\n\n- **OAuth** via `ccr codex-auth` — browser flow handled by the CCR server callback on port `1455` (Docker maps `1455:3456`); tokens stored in `~/.claude-code-router/codex_auth.json` and auto-refreshed.\n- **PAT** via a literal `api_key: \"at-...\"` (or an env var containing an `at-` token) — skips `ccr codex-auth`.\n\nAn `at-` value is always treated as a PAT and never silently falls back to OAuth; any other placeholder selects OAuth tokens.\n\n> **See also**: Full Codex setup, both auth modes, provider config, and troubleshooting are in `docs/docs/server/guides/codex.md`.\n\n#### Cursor Provider Authentication\n\nThe Cursor provider runs models in-process via the official `@cursor/sdk` (no browser OAuth CLI). Auth resolves from the provider `api_key` starting with `crsr_`, then `CURSOR_API_KEY`. Default **bridge** mode keeps Claude Code as the tool host; Cursor built-ins are denied in an isolated workspace. Discover models with `ccr model get cursor`.\n\n> **See also**: Full Cursor setup, bridge/plan/agent modes, and configuration are in `docs/docs/server/guides/cursor.md`.\n\n#### Claude Subscription Authentication\n\nRoute Claude Code through your Claude Pro or Max subscription via OAuth:\n\n```shell\nccr claude-auth\n```\n\nThe OAuth flow is handled by the CCR server callback on port `1455` (Docker maps `1455:3456`); tokens are stored in `~/.claude-code-router/claude_auth.json` and auto-refreshed. A Claude subscription provider requires the `claude-auth` + `Anthropic` transformer chain.\n\n> **See also**: Full setup, the transformer chain, client classification, and billing/identity details are in `docs/docs/server/guides/claude-auth.md`.\n\n#### Qwen Provider Authentication\n\nAuthenticate with Qwen Chat by saving a JWT from `chat.qwen.ai` localStorage:\n\n```shell\nccr qwen-auth\n```\n\nThe CCR server hosts an auth page at `/qwen/auth` offering a bookmarklet or manual paste. The token is validated, saved to `~/.claude-code-router/qwen_auth.json`, and auto-refreshed. The Qwen provider requires the `qwen-auth` + `reasoning` + `OpenAI` transformer chain.\n\n> **See also**: Full Qwen setup and provider config are in `docs/docs/server/guides/qwen.md`.\n\n#### xAI Grok Authentication\n\nThe xAI provider supports two authentication modes:\n\n- **OAuth** via `ccr xai-auth` — an RFC 8628 device-code flow against `auth.x.ai`, backed by a SuperGrok or X Premium+ subscription. Unlike Codex/Claude/Antigravity, this needs **no server callback route or port mapping** — the CLI prints a verification URL, you approve it in any browser on any device, and the CLI polls in the background. Tokens are stored in `~/.claude-code-router/xai_auth.json` and auto-refreshed.\n- **PAT** via a literal `api_key: \"xai-...\"` (or an env var containing one, e.g. `$XAI_API_KEY`) — skips `ccr xai-auth` entirely.\n\nA `xai-` value is always treated as a PAT and never silently falls back to OAuth; any other placeholder (e.g. `\"no-key\"`) selects OAuth tokens.\n\n```shell\nccr xai-auth\n```\n\nExample provider (either auth mode uses the same transformer chain):\n\n```json\n{\n  \"name\": \"xai-subscription\",\n  \"api_base_url\": \"https://api.x.ai/v1\",\n  \"api_key\": \"no-key\",\n  \"models\": [\"grok-4.6\", \"grok-4.3\", \"grok-code-fast-1\"],\n  \"transformer\": {\n    \"use\": [\"xai-auth\", \"openai-responses\"]\n  }\n}\n```\n\n`xai-auth` resolves the credential and injects it as a `Bearer` token; `openai-responses` owns the `/v1/responses` wire format, xAI's current default API surface.\n\n> **See also**: Full xAI setup, both auth modes, and troubleshooting are in `docs/docs/server/guides/xai-auth.md`.\n\n#### Chrome On-Device Bridge\n\nUse Chrome's built-in Gemini Nano (~4GB local model) with zero API cost via a host-side bridge:\n\n```bash\nccr chrome-bridge            # default: port 3457, CDP 9222\nccr chrome-bridge --port 3457 --cdp 9222\n```\n\nThe bridge connects to Chrome's Prompt API over CDP, maintains persistent model sessions, and exposes an OpenAI-compatible API (`/v1/chat/completions`) on `127.0.0.1:3457`. It replaces Claude Code's system prompt with a minimal tool-focused one and uses `responseConstraint` (JSON Schema) to force structured `{text, tool_calls[]}` output.\n\n**Prerequisites**: enable `chrome://flags/#optimization-guide-on-device-model` and `chrome://flags/#prompt-api-for-gemini-nano-multimodal-input`, restart Chrome, and let the ~4GB model download.\n\n> **Note for Docker**: The bridge runs on the Docker **host**, not inside the container — set the provider host to `http://host.docker.internal:3457`. Full setup, provider config, features, and limitations are in `docs/docs/server/guides/chrome-on-device.md`.\n\n### 6. Presets Management\n\nSave, share, and reuse configurations:\n\n```shell\nccr preset export my-preset                    # export current config as a preset\nccr preset export my-preset --description \"My OpenAI config\" --author \"Your Name\" --tags \"openai,production\"\nccr preset install /path/to/preset             # install from a directory\nccr preset list\nccr preset info my-preset\nccr preset delete my-preset\n```\n\nPresets store your configuration (plus metadata) as a directory with `manifest.json`. Sensitive fields are sanitized to `{{field}}` placeholders on export, and presets can include input schemas to collect required values (e.g. API keys) at install time.\n\n> **See also**: `docs/docs/cli/commands/preset.md`.\n\n### 7. Activate Command (Environment Variables Setup)\n\nThe `activate` command allows you to set up environment variables globally in your shell, enabling you to use the `claude` command directly or integrate Claude Code Router with applications built using the Agent SDK.\n\nTo activate the environment variables, run:\n\n```shell\neval \"$(ccr activate)\"\n```\n\nThis command outputs the necessary environment variables in shell-friendly format, which are then set in your current shell session. After activation, you can:\n\n- **Use `claude` command directly**: Run `claude` commands without needing to use `ccr code`. The `claude` command will automatically route requests through Claude Code Router.\n- **Integrate with Agent SDK applications**: Applications built with the Anthropic Agent SDK will automatically use the configured router and models.\n\nThe `activate` command sets the following environment variables:\n\n- `ANTHROPIC_AUTH_TOKEN`: API key from your configuration\n- `ANTHROPIC_BASE_URL`: The local router endpoint (default: `http://127.0.0.1:3456`)\n- `NO_PROXY`: Set to `127.0.0.1` to prevent proxy interference\n- `DISABLE_TELEMETRY`: Disables telemetry\n- `DISABLE_COST_WARNINGS`: Disables cost warnings\n- `API_TIMEOUT_MS`: API timeout from your configuration\n\n> **Note**: Make sure the Claude Code Router service is running (`ccr start`) before using the activated environment variables. The environment variables are only valid for the current shell session. To make them persistent, you can add `eval \"$(ccr activate)\"` to your shell configuration file (e.g., `~/.zshrc` or `~/.bashrc`).\n\n#### Providers and Transformers\n\nThe `Providers` array defines each provider: `name`, `api_base_url`, `api_key`, `models`, and an optional `transformer` object. The `transformer.use` list applies transformers globally (all models) or per model key, and some transformers accept options via a nested `[name, options]` array.\n\n> **See also**: Provider schema and per-provider examples are in `docs/docs/server/config/providers.md`; the transformer reference and option passing are in `docs/docs/server/config/transformers.md`.\n\n**Available Built-in Transformers:**\n\n- Protocol owners: `Anthropic` (`/v1/messages`), `OpenAI` (`/v1/chat/completions`), `openai-responses` (`/v1/responses`), `Fim` (`/v1/fim/completions`).\n- FIM provider adapters: `fim.mistral`, `fim.deepseek`, `fim.qwen` (dedicated FIM providers only — do not stack with chat transformers).\n- Provider adapters: `deepseek`, `groq`, `mistral`, `openrouter`, `gemini` / `vertex-gemini`, `codex` (pair with `openai-responses`), `claude-auth` (pair with `Anthropic`), `antigravity-auth`, `qwen-auth`, `xai-auth`, `cursor-sdk`, `chrome-on-device`.\n- `maxtoken` — sets a specific `max_tokens`. `tooluse` — optimizes tool usage via `tool_choice`. `reasoning` — replays provider `reasoning_content` across turns. `sampling` — maps `temperature` / `top_p` / `top_k` / `repetition_penalty`. `enhancetool` — adds error tolerance to tool-call parameters (disables streaming of tool calls). `cleancache` — clears `cache_control`. `customparams` — injects custom request parameters.\n- Experimental gist/CLI integrations: `gemini-cli`, `chutes-glm`, `qwen-cli`, `rovo-cli`.\n\n> **See also**: The full transformer reference — including the `gemini` `cachedContent` / `thoughtSignatureFallback` options and the `openrouter` provider-routing parameter — is in `docs/docs/server/config/transformers.md`.\n\n**Custom Transformers:**\n\nLoad your own transformers via the `transformers` field in `config.json`, e.g. `{ \"transformers\": [{ \"path\": \"/User/xxx/.claude-code-router/plugins/gemini-cli.js\", \"options\": { \"project\": \"xxx\" } }] }`. See `docs/docs/server/config/transformers.md` for the full custom-transformer guide.\n\n#### Router\n\nThe `Router` object defines which model to use for different scenarios:\n\n- `default`: The default model for general tasks.\n- `background`: A model for background tasks. This can be a smaller, local model to save costs.\n- `think`: A model for reasoning-heavy tasks, like Plan Mode.\n- `longContext`: A model for handling long contexts (e.g., > 60K tokens).\n- `longContextThreshold` (optional): The token count threshold for triggering the long context model. Defaults to 60000 if not specified.\n- `webSearch`: Used for handling web search tasks and this requires the model itself to support the feature. If you're using openrouter, you need to add the `:online` suffix after the model name.\n- `fim`: Used for `POST /v1/fim/completions` (fill-in-the-middle). Destination provider must use a `fim.*` transformer (`fim.mistral`, `fim.deepseek`, or `fim.qwen`). Setup for Codestral and local Qwen (LM Studio): `docs/docs/server/api/fim-completions-api.md`.\n- `image` (beta): Used for handling image-related tasks (supported by CCR’s built-in agent). If the model does not support tool calling, you need to set the `config.forceUseImageAgent` property to `true`.\n\n- You can also switch models dynamically in Claude Code with the `/model` command:\n`/model provider_name,model_name`\nExample: `/model openrouter,anthropic/claude-3.5-sonnet`\n\n#### Custom Router\n\nFor advanced routing logic, set `CUSTOM_ROUTER_PATH` in `config.json` to a JS module exporting an `async function(req, config)` that returns a `\"provider,model\"` string, or `null` to fall back to the default router. See `custom-router.example.js` and `docs/docs/server/advanced/custom-router.md`.\n\n##### Subagent Routing\n\nClaude Code subagent requests can be routed with:\n\n1. An explicit `<CCR-SUBAGENT-MODEL>provider,model</CCR-SUBAGENT-MODEL>` tag in system or message text (the tag is stripped before the upstream request). `provider/model` is also accepted.\n2. Or the `CLAUDE_CODE_SUBAGENT_MODEL=provider,model` environment variable when Claude Code marks the turn as a subagent.\n\nTag takes priority over the environment variable. If neither is set, normal Router rules apply.\n\n**Example:**\n\n```\n<CCR-SUBAGENT-MODEL>openrouter,anthropic/claude-3.5-sonnet</CCR-SUBAGENT-MODEL>\nPlease help me analyze this code snippet for potential optimizations...\n```\n\n```bash\nexport CLAUDE_CODE_SUBAGENT_MODEL=\"openrouter,anthropic/claude-3.5-sonnet\"\n```\n\n## Prompt Caching\n\nCCR translates Claude Code's Anthropic cache intent into each upstream's native caching mechanism automatically:\n\n- Anthropic, Claude Auth, and Vertex Claude use Anthropic automatic prompt caching while preserving bounded explicit block markers.\n- OpenAI Chat and Responses use stable `prompt_cache_key` values; GPT-5.6+ models also receive explicit content breakpoints. Codex uses its separate native contract for every model: a stable prompt key plus session-routing headers, with no explicit content breakpoints.\n- OpenRouter uses sticky `session_id` routing plus model-native caching. Vercel AI Gateway receives `providerOptions.gateway.caching: \"auto\"`.\n- Mistral and Cerebras receive native `prompt_cache_key` values. Qwen/DashScope receives a final-content cache marker. DeepSeek, Groq, and Vertex OpenAI retain their native implicit caching.\n- Gemini and Vertex Gemini use implicit caching and create/reuse native CachedContent resources for sufficiently large stable system/tool prefixes.\n- Cursor SDK and Chrome On-Device reuse stable native sessions.\n\nProvider-incompatible cache fields are removed only after translation. Cache read/write usage reported upstream is converted back to Anthropic `cache_read_input_tokens` and `cache_creation_input_tokens` for Claude Code.\n\nSee [the implementation plan and review](tasks/caching-plan.md) for the provider matrix and verification scope.\n\n## Status Line (Beta)\nTo better monitor the status of claude-code-router at runtime, version v1.0.40 includes a built-in statusline tool, which you can enable in the UI.\n![statusline-config.png](blog/images/statusline-config.png)\n\nThe effect is as follows:\n![statusline](blog/images/statusline.png)\n\n## 🤖 GitHub Actions\n\nIntegrate Claude Code Router into your CI/CD pipeline. After setting up [Claude Code Actions](https://docs.anthropic.com/en/docs/claude-code/github-actions), modify your `.github/workflows/claude.yaml` to use the router:\n\n```yaml\nname: Claude Code\n\non:\n  issue_comment:\n    types: [created]\n  # ... other triggers\n\njobs:\n  claude:\n    if: |\n      (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||\n      # ... other conditions\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      pull-requests: read\n      issues: read\n      id-token: write\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 1\n\n      - name: Prepare Environment\n        run: |\n          curl -fsSL https://bun.sh/install | bash\n          mkdir -p $HOME/.claude-code-router\n          cat << 'EOF' > $HOME/.claude-code-router/config.json\n          {\n            \"log\": true,\n            \"NON_INTERACTIVE_MODE\": true,\n            \"OPENAI_API_KEY\": \"${{ secrets.OPENAI_API_KEY }}\",\n            \"OPENAI_BASE_URL\": \"https://api.deepseek.com\",\n            \"OPENAI_MODEL\": \"deepseek-chat\"\n          }\n          EOF\n        shell: bash\n\n      - name: Start Claude Code Router\n        run: |\n          nohup ~/.bun/bin/bunx @caeliq/claude-code-router@1.0.8 start &\n        shell: bash\n\n      - name: Run Claude Code\n        id: claude\n        uses: anthropics/claude-code-action@beta\n        env:\n          ANTHROPIC_BASE_URL: http://localhost:3456\n        with:\n          anthropic_api_key: \"any-string-is-ok\"\n```\n\n> **Note**: When running in GitHub Actions or other automation environments, make sure to set `\"NON_INTERACTIVE_MODE\": true` in your configuration to prevent the process from hanging due to stdin handling issues.\n\nThis setup allows for interesting automations, like running tasks during off-peak hours to reduce API costs.\n\n## 📝 Further Reading\n\n- [Codex API](https://developers.openai.com/codex/sdk) — Developer docs for the ChatGPT backend API used by the `codex` transformer (OAuth PKCE, Responses API, streaming, tool calls)\n- [Chrome Prompt API](https://developer.chrome.com/docs/ai/prompt-api) — On-device Gemini Nano API used by the `chrome-on-device` transformer and bridge\n- [Provider Integration Lessons](tasks/lessons.md) — Hard-won knowledge for LLM provider integrations (DeepSeek, Mistral, Gemini, Codex, Gemini Nano)\n","readmeFilename":"README.md"}