{"_id":"@anyr/sdk","_rev":"4-0f383cd01d391138858a02a6f7ed47bc","name":"@anyr/sdk","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@anyr/sdk","version":"0.1.0","keywords":["anyrouter","llm","ai","openai","anthropic","gateway","sdk","api-client"],"author":{"name":"Duyet Le"},"license":"MIT","_id":"@anyr/sdk@0.1.0","maintainers":[{"name":"duyetdev","email":"lvduit08@gmail.com"}],"homepage":"https://anyrouter.dev","bugs":{"url":"https://github.com/duyet/anyrouter/issues"},"dist":{"shasum":"036b7dae7cdc44c23b5abf3d784728b4cbb5d174","tarball":"https://registry.npmjs.org/@anyr/sdk/-/sdk-0.1.0.tgz","fileCount":9,"integrity":"sha512-vMDeNbDsuhIKjv1fuCMu2DobxEVQItgRfubqTLxHUkB0gFPqHF0wS+lR/GMJmlscZAJ9AsywXjg2pRYqavlm5A==","signatures":[{"sig":"MEUCIGXynEmVJ16CwykcRcZ60b2igh1iU1mUuzrujNAPBTK2AiEApnPQdu5ufC4cRCGNV2/qfiXFv2F2VivwZhCZ6SKLlxQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198859},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"tsup"},"_npmUser":{"name":"duyetdev","email":"lvduit08@gmail.com"},"repository":{"url":"git+https://github.com/duyet/anyrouter.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.15.0","description":"Official TypeScript SDK for the AnyRouter LLM gateway API — chat, embeddings, images, models, credits, keys, presets, responses, and the Anthropic Messages API.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1781719480798_0.0193351611036785","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@anyr/sdk","version":"0.1.1","keywords":["anyrouter","llm","ai","openai","anthropic","gateway","sdk","api-client"],"author":{"name":"Duyet Le"},"license":"MIT","_id":"@anyr/sdk@0.1.1","maintainers":[{"name":"duyetdev","email":"lvduit08@gmail.com"}],"homepage":"https://anyrouter.dev","bugs":{"url":"https://github.com/duyet/anyrouter/issues"},"dist":{"shasum":"0e1cfc897b35013f7e42d3d6b6c1c26f90e89050","tarball":"https://registry.npmjs.org/@anyr/sdk/-/sdk-0.1.1.tgz","fileCount":7,"integrity":"sha512-c6ATe77ht7Mg6uiaMLWo5LTO7A5m8JwGYOS7PTgEuMruTa0Vc6GXqOTZ8qPQqFnQYvwlrxzKayORh5Sv/7f55A==","signatures":[{"sig":"MEYCIQCzeUPxdbLEE2yRC1svY4yEqXn3OHarh2HrRNRWqN0SHAIhAOAL+Vd0wooVvnQUNcxh+lVPrjD6x2D5A6m0H6krwXI2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102394},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"tsup"},"_npmUser":{"name":"duyetdev","email":"lvduit08@gmail.com"},"repository":{"url":"git+https://github.com/duyet/anyrouter.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.15.0","description":"Official TypeScript SDK for the AnyRouter LLM gateway API — chat, embeddings, images, models, credits, keys, presets, responses, and the Anthropic Messages API.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.1_1781719862236_0.46816677829822373","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@anyr/sdk","version":"0.1.2","keywords":["anyrouter","llm","ai","openai","anthropic","gateway","sdk","api-client"],"author":{"name":"Duyet Le"},"license":"MIT","_id":"@anyr/sdk@0.1.2","maintainers":[{"name":"duyetdev","email":"lvduit08@gmail.com"}],"homepage":"https://anyrouter.dev","bugs":{"url":"https://github.com/duyet/anyrouter/issues"},"dist":{"shasum":"5f52b503b93c05f653ada323a1cb11d8b91c90e5","tarball":"https://registry.npmjs.org/@anyr/sdk/-/sdk-0.1.2.tgz","fileCount":7,"integrity":"sha512-opdTQhwPM2X4gqjbdCwJkm4l6sDW907pbqVU5gH9C5/TFtckLb9onSQOaZx7S2ZbxiMtIm5I3yLkypRmU8kohg==","signatures":[{"sig":"MEYCIQDioAG3+EKdHM/DhdQ/L4eWj6NeUFeNdvr0LeaNukgIiQIhAJC8qr3LuOKnfFAAheTXDQoqGhcanMtfKZsoVq0czouE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102394},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"tsup"},"_npmUser":{"name":"duyetdev","email":"lvduit08@gmail.com"},"repository":{"url":"git+https://github.com/duyet/anyrouter.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.12.1","description":"Official TypeScript SDK for the AnyRouter LLM gateway API — chat, embeddings, images, models, credits, keys, presets, responses, and the Anthropic Messages API.","directories":{},"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.2_1781722774475_0.8538280894076176","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@anyr/sdk","version":"0.1.3","description":"Official TypeScript SDK for the AnyRouter LLM gateway API — chat, embeddings, images, models, credits, keys, presets, responses, and the Anthropic Messages API.","type":"module","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.js"}},"./package.json":"./package.json"},"engines":{"node":">=18"},"scripts":{"build":"tsup","dev":"tsup --watch","clean":"rm -rf dist","typecheck":"tsc --noEmit","test":"vitest run","prepublishOnly":"tsup"},"keywords":["anyrouter","llm","ai","openai","anthropic","gateway","sdk","api-client"],"homepage":"https://anyrouter.dev","repository":{"type":"git","url":"git+https://github.com/duyet/anyrouter.git","directory":"packages/sdk"},"bugs":{"url":"https://github.com/duyet/anyrouter/issues"},"author":{"name":"Duyet Le"},"license":"MIT","publishConfig":{"access":"public"},"devDependencies":{"@types/node":"^24.0.0"},"gitHead":"6635fe076250ac6655544d13c2e9b4c1283eb78e","_id":"@anyr/sdk@0.1.3","_nodeVersion":"26.0.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-I7sWLdzHSSoDrkx/DlJDpJXvsjNOllgfg6NyRc9EH+/MoV5pXC3hQaYLrLxm4sh1IGkGw77HHVFv9ooy2Vtikg==","shasum":"363404d9104c2a2a80431b2f9e4ea846c07ffc6c","tarball":"https://registry.npmjs.org/@anyr/sdk/-/sdk-0.1.3.tgz","fileCount":7,"unpackedSize":114824,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCtMgxGJ+BujI9WDXOD9RBy6q6Es9BsqcHngJTRGBn0aQIgXJt0m1woU5ytc3DxF8elJ1TSdyc0iY0RWTNuWMpA4t8="}]},"_npmUser":{"name":"duyetdev","email":"lvduit08@gmail.com"},"directories":{},"maintainers":[{"name":"duyetdev","email":"lvduit08@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.1.3_1781782457389_0.5363276032142978"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-17T18:04:40.604Z","modified":"2026-06-18T11:34:17.718Z","0.1.0":"2026-06-17T18:04:40.944Z","0.1.1":"2026-06-17T18:11:02.390Z","0.1.2":"2026-06-17T18:59:34.617Z","0.1.3":"2026-06-18T11:34:17.584Z"},"bugs":{"url":"https://github.com/duyet/anyrouter/issues"},"author":{"name":"Duyet Le"},"license":"MIT","homepage":"https://anyrouter.dev","keywords":["anyrouter","llm","ai","openai","anthropic","gateway","sdk","api-client"],"repository":{"type":"git","url":"git+https://github.com/duyet/anyrouter.git","directory":"packages/sdk"},"description":"Official TypeScript SDK for the AnyRouter LLM gateway API — chat, embeddings, images, models, credits, keys, presets, responses, and the Anthropic Messages API.","maintainers":[{"name":"duyetdev","email":"lvduit08@gmail.com"}],"readme":"# @anyr/sdk\n\nOfficial TypeScript SDK for the [AnyRouter](https://anyrouter.dev) LLM gateway API.\n\nOne key, one base URL, every model — chat, embeddings, images, models, credits,\nkey management, presets, the Responses API, and the Anthropic Messages API, with\ntyped requests, typed responses, and a typed error envelope.\n\n## Install\n\n```bash\nnpm install @anyr/sdk\n```\n\n## Quickstart\n\n```ts\nimport { AnyRouter } from \"@anyr/sdk\"\n\n// Reads the key from ANYROUTER_API_KEY when omitted.\nconst client = new AnyRouter()\n\nconst completion = await client.chat.completions.create({\n  model: \"openai/gpt-4o-mini\",\n  messages: [{ role: \"user\", content: \"Hello!\" }],\n})\n\nconsole.log(completion.choices[0].message.content)\n```\n\n## Authentication\n\n| Option | Env fallback | Used for |\n| --- | --- | --- |\n| `apiKey` (`sk-ar-v1-…`) | `ANYROUTER_API_KEY` | Inference (chat, embeddings, images, responses, messages) |\n| `managementKey` (`ak_…`) | `ANYROUTER_MANAGEMENT_KEY` | Management plane (keys, presets) — falls back to `apiKey` |\n\n```ts\nconst client = new AnyRouter({\n  apiKey: \"<your-anyrouter-key>\",\n  managementKey: \"ak_...\", // optional; falls back to apiKey\n  baseURL: \"https://anyrouter.dev/api/v1\", // default\n  headers: { \"X-My-Header\": \"value\" }, // merged into every request\n  maxRetries: 2, // default; retries transient failures (see below)\n  timeout: 600_000, // default 10 min; bounds time-to-first-byte\n})\n```\n\n## Retries, timeouts & cancellation\n\nEvery request automatically retries transient failures — connection errors,\ntimeouts, and `408` / `409` / `429` / `5xx` responses — with exponential\nbackoff and jitter, honoring the server's `Retry-After` / `Retry-After-Ms`\nheaders. The default budget is **2 retries**; set `maxRetries: 0` to disable.\n\nThe default per-request `timeout` is **10 minutes**, applied to the time until\nresponse headers arrive — so it never aborts an in-progress stream.\n\nBoth are overridable per request, alongside an `AbortSignal` for cancellation\nand one-off `headers`:\n\n```ts\nconst controller = new AbortController()\n\nconst stream = await client.chat.completions.create(\n  { model: \"openai/gpt-4o-mini\", messages, stream: true },\n  { signal: controller.signal, timeout: 30_000, maxRetries: 0 },\n)\n\n// later — stop generating\ncontroller.abort()\n```\n\nA caller-triggered abort throws `APIUserAbortError` and is never retried.\nA timeout throws `APITimeoutError`.\n\n## Resources\n\n### Chat completions\n\n```ts\n// Non-streaming\nconst completion = await client.chat.completions.create({\n  model: \"openai/gpt-4o-mini\",\n  messages: [{ role: \"user\", content: \"Explain quantum entanglement simply.\" }],\n  temperature: 0.7,\n  max_tokens: 512,\n})\nconsole.log(completion.choices[0].message.content)\n\n// Streaming\nconst stream = await client.chat.completions.create({\n  model: \"openai/gpt-4o-mini\",\n  messages: [{ role: \"user\", content: \"Write a haiku about TypeScript.\" }],\n  stream: true,\n})\nfor await (const chunk of stream) {\n  process.stdout.write(chunk.choices[0]?.delta?.content ?? \"\")\n}\n\n// With AnyRouter provider routing\nconst completion = await client.chat.completions.create({\n  model: \"openai/gpt-4o\",\n  messages: [{ role: \"user\", content: \"Hello\" }],\n  provider: {\n    order: [\"openai\", \"deepinfra\"],\n    allow_fallbacks: true,\n  },\n  session_id: \"my-session-123\",\n})\n```\n\n### Embeddings\n\n```ts\nconst result = await client.embeddings.create({\n  model: \"openai/text-embedding-3-small\",\n  input: [\"Hello world\", \"AnyRouter rocks\"],\n  encoding_format: \"float\",\n})\nconsole.log(result.data[0].embedding) // number[]\n```\n\n### Image generation\n\n```ts\nconst result = await client.images.generate({\n  model: \"dall-e-3\",\n  prompt: \"A futuristic city at sunset, digital art\",\n  n: 1,\n  size: \"1024x1024\",\n})\nconsole.log(result.data[0].url)\n```\n\n### Models\n\n```ts\n// List all available models\nconst { data: models } = await client.models.list()\nconsole.log(models.map((m) => m.id))\n\n// Retrieve a single model\nconst model = await client.models.retrieve(\"openai/gpt-4o-mini\")\nconsole.log(model.context_length, model.pricing)\n```\n\n### Credits\n\n```ts\nconst credits = await client.credits.retrieve()\nconsole.log(`Balance: $${credits.balance.toFixed(4)} USD`)\n```\n\n### API Key management (management key required)\n\n```ts\n// Create a new key\nconst { key, data } = await client.keys.create({\n  name: \"My production key\",\n  limit: 10.0, // USD spend limit\n  limit_reset: \"monthly\",\n})\nconsole.log(\"Save this key — shown only once:\", key)\n\n// List all keys\nconst { data: keys } = await client.keys.list()\n\n// Update a key\nawait client.keys.update(data.hash, { disabled: false, name: \"Renamed key\" })\n\n// Delete a key\nawait client.keys.del(data.hash)\n```\n\n### Presets (management key required)\n\nPresets are saved model configurations routed via `@preset/<slug>`.\n\n```ts\n// Create a preset\nconst preset = await client.presets.create({\n  slug: \"my-assistant\",\n  name: \"My Assistant\",\n  config: {\n    model: \"openai/gpt-4o-mini\",\n    system: \"You are a helpful assistant.\",\n    temperature: 0.5,\n    max_tokens: 1024,\n  },\n})\n\n// List presets\nconst { data: presets } = await client.presets.list()\n\n// Use the preset in a chat completion\nconst completion = await client.chat.completions.create({\n  model: \"@preset/my-assistant\",\n  messages: [{ role: \"user\", content: \"Help me.\" }],\n})\n\n// Update and delete\nawait client.presets.update(\"my-assistant\", { config: { temperature: 0.8 } })\nawait client.presets.del(\"my-assistant\")\n```\n\n### Responses API (OpenAI-compatible)\n\n```ts\n// Non-streaming\nconst response = await client.responses.create({\n  model: \"openai/gpt-4o-mini\",\n  input: \"What is 2 + 2?\",\n})\nconsole.log(response.output_text)\n\n// Streaming\nconst stream = await client.responses.create({\n  model: \"openai/gpt-4o-mini\",\n  input: \"Count to 5.\",\n  stream: true,\n})\nfor await (const event of stream) {\n  // handle server-sent events\n}\n\n// Retrieve / delete a stored response\nconst stored = await client.responses.retrieve(response.id)\nawait client.responses.del(response.id)\n```\n\n### Messages API (Anthropic-compatible)\n\n```ts\n// Non-streaming\nconst message = await client.messages.create({\n  model: \"anthropic/claude-3-5-haiku-20241022\",\n  max_tokens: 256,\n  system: \"You are a concise assistant.\",\n  messages: [{ role: \"user\", content: \"Hello!\" }],\n})\nconsole.log(message.content[0]) // { type: \"text\", text: \"…\" }\n\n// Streaming\nconst stream = await client.messages.create({\n  model: \"anthropic/claude-3-5-haiku-20241022\",\n  max_tokens: 256,\n  messages: [{ role: \"user\", content: \"Tell me a short joke.\" }],\n  stream: true,\n})\nfor await (const event of stream) {\n  // handle Anthropic SSE events\n}\n```\n\n## Error handling\n\nAll API errors throw typed subclasses of `AnyRouterError`:\n\n```ts\nimport {\n  AnyRouterError,\n  AuthenticationError,\n  InsufficientCreditsError,\n  RateLimitError,\n  NotFoundError,\n} from \"@anyr/sdk\"\n\ntry {\n  await client.chat.completions.create({ model: \"...\", messages: [] })\n} catch (err) {\n  if (err instanceof AuthenticationError) {\n    console.error(\"Bad key:\", err.message, \"requestId:\", err.requestId)\n  } else if (err instanceof InsufficientCreditsError) {\n    console.error(\"Top up your credits at https://anyrouter.dev/credits\")\n  } else if (err instanceof RateLimitError) {\n    console.error(\"Rate limited — back off and retry\")\n  } else if (err instanceof AnyRouterError) {\n    console.error(`HTTP ${err.status} ${err.code}: ${err.message}`)\n  }\n}\n```\n\n| Error class | HTTP status |\n| --- | --- |\n| `AuthenticationError` | 401 |\n| `InsufficientCreditsError` | 402 |\n| `PermissionDeniedError` | 403 |\n| `NotFoundError` | 404 |\n| `ConflictError` | 409 |\n| `RateLimitError` | 429 |\n| `InternalServerError` | 5xx |\n| `UpstreamError` | 502, 503 |\n| `APIConnectionError` | network failure |\n| `APITimeoutError` | request timeout |\n| `APIUserAbortError` | request aborted via `AbortSignal` |\n\nEach error exposes `.status`, `.code`, `.message`, `.requestId`, and `.metadata`.\n\n## Vercel AI SDK\n\nUsing the Vercel AI SDK? See [`@anyr/ai-sdk-provider`](https://www.npmjs.com/package/@anyr/ai-sdk-provider),\nwhich wraps this SDK as a fully-typed Vercel AI provider.\n\n## License\n\nMIT © Duyet Le\n","readmeFilename":"README.md"}