Provider architecture

Orcus is a monorepo of independently publishable provider SDKs. There is no umbrella package and no shared gateway endpoint.

Orcus is a monorepo with one folder per provider under packages/. Each folder is an independent npm package with its own implementation, dependencies, tests, documentation, version number and release cycle.

Provider status

  • `@orcushq/gemini`, Gemini Web, available.
  • `@orcushq/deepseek`, DeepSeek Web, planned. The folder exists in the monorepo and is empty.
  • `@orcushq/chatgpt`, ChatGPT Web, planned and not started.

Available means installable

Only `@orcushq/gemini` is published today. Treat the other rows as roadmap, not as install instructions.

There is no Orcus gateway

This is the most important thing to understand about the architecture. Orcus does not run a server, does not proxy your traffic, and does not sit between your code and a provider. Each SDK issues its own requests from your process.

  • There is no Orcus base URL to configure.
  • There is no Orcus API key. Each provider uses that provider's own session or key material.
  • There is no cross provider router. If you want to route between providers, you build that in your application and treat each SDK as one more adapter.
  • Because nothing is proxied, your provider credentials never pass through a service you do not control.

Install independently

Installing one provider does not pull in another. Adding a provider later means adding one dependency and one client instance.

bash
npm install @orcushq/gemini
typescript
import { GeminiWeb } from '@orcushq/gemini' const gemini = new GeminiWeb({ model: 'gemini-3.6-flash' })

Package layout

text
packages/gemini/  package.json        @orcushq/gemini  src/    index.ts          the entire public API, explicitly re-exported    client/           the user facing class    protocol/         wire format: payload, headers, endpoints, parsers    transport/        fetch, retry, timeout, HTTP error mapping    models/           registry, resolution, served model reconciliation    errors/           the typed error taxonomy    messages/         multi turn normalisation    streaming/        incremental parser    tools/            prompt based tool calling    structured-output/ Zod validated output    multimodal/       image resolution and upload  tests/    unit/             pure logic, no I/O    integration/      full request path against recorded payloads    e2e/              opt in, hits the real backend

Anything not re-exported from src/index.ts is internal. That is a deliberate rule, not an accident: it keeps each package surface small and lets the internals move without breaking you.

Sparse payload indexes are positions

Gemini Web identifies request fields by array index. Those indexes are positions on the wire, not names, so they are never renumbered or cleaned up. A provider can also change its frontend build label and break every request at once.