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.
npm install @orcushq/geminiimport { GeminiWeb } from '@orcushq/gemini' const gemini = new GeminiWeb({ model: 'gemini-3.6-flash' })Package layout
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 backendAnything 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.