diff --git a/autoqa/checklist.md b/autoqa/checklist.md index cc48f170d..6742f881e 100644 --- a/autoqa/checklist.md +++ b/autoqa/checklist.md @@ -98,6 +98,7 @@ In Remote Model Providers: - [ ] Anthropic - [ ] Cohere - [ ] OpenRouter + - [ ] OrcaRouter - [ ] Mistral - [ ] Groq - [ ] Gemini diff --git a/docs/src/pages/docs/desktop/remote-models/_meta.json b/docs/src/pages/docs/desktop/remote-models/_meta.json index a21422d9d..f0932dfeb 100644 --- a/docs/src/pages/docs/desktop/remote-models/_meta.json +++ b/docs/src/pages/docs/desktop/remote-models/_meta.json @@ -20,6 +20,9 @@ "openrouter": { "title": "OpenRouter" }, + "orcarouter": { + "title": "OrcaRouter" + }, "huggingface": { "title": "Hugging Face" } diff --git a/docs/src/pages/docs/desktop/remote-models/orcarouter.mdx b/docs/src/pages/docs/desktop/remote-models/orcarouter.mdx new file mode 100644 index 000000000..cf0310a33 --- /dev/null +++ b/docs/src/pages/docs/desktop/remote-models/orcarouter.mdx @@ -0,0 +1,101 @@ +--- +title: OrcaRouter +description: A step-by-step guide on integrating Atomic Chat with OrcaRouter. +keywords: + [ + Jan, + Customizable Intelligence, LLM, + local AI, + privacy focus, + free and open source, + private and offline, + conversational AI, + no-subscription fee, + large language models, + OrcaRouter integration, + OrcaRouter, + ] +--- + +import { Callout, Steps } from 'nextra/components' +import { Settings, Plus } from 'lucide-react' + +# OrcaRouter + +## Integrate OrcaRouter with Atomic Chat + +[OrcaRouter](https://www.orcarouter.ai) is an AI gateway that routes every +request to the best model for the job — mixing frontier models, open-weight +models, and long-context specialists behind one unified, OpenAI-compatible +API. It also runs gateway-level, zero-trust security for AI agents on the same +endpoint — screening every prompt/response and governing every tool call on a +default-deny basis, with no application code changes. + +Atomic Chat supports the OrcaRouter API, so you can use one key to reach any +of the 150+ models OrcaRouter routes to (Anthropic, Google, DeepSeek, MiniMax +and more) without juggling a separate API key per provider. + +## Integrate OrcaRouter with Atomic Chat + + + +### Step 1: Get Your API Key +1. Visit [OrcaRouter](https://www.orcarouter.ai) and sign in +2. Create & copy a new API key (keys are prefixed `sk-orca-`) or copy your existing one + + +`orcarouter/auto` is OrcaRouter's smart routing model: send every request to +it and the gateway picks the cheapest model that satisfies the request, so +you get frontier quality without the frontier price. + + +### Step 2: Configure Atomic Chat + +1. Navigate to the **Settings** page () +2. Under **Model Providers**, select **OrcaRouter** +3. Insert your **API Key** + +### Step 3: Start Using OrcaRouter Models + +1. Pick any existing **Chat** or create a new one +2. Select any model from **model selector** under OrcaRouter +3. Start chatting + + + +## Available Models Through OrcaRouter + +Atomic Chat automatically lists OrcaRouter's available models via its +`/v1/models` endpoint. For custom configurations: + +**Model Field Settings:** +- Leave empty to use your account's default model +- Specify a model using the format: `orcarouter/` or + `/` +- The full model catalog is available at [https://www.orcarouter.ai/models](https://www.orcarouter.ai/models) + +**Examples of Model IDs:** +- Smart router: `orcarouter/auto` +- Claude via OrcaRouter: `anthropic/claude-sonnet-4.6` +- Gemini via OrcaRouter: `google/gemini-3-flash-preview` + +## Troubleshooting + +Common issues and solutions: + +**1. API Key Issues** +- Verify your API key is correct and starts with `sk-orca-` +- Check you have sufficient credits in your OrcaRouter account +- Ensure you have access to the model you're trying to use + +**2. Connection Problems** +- Check your internet connection +- Verify the API base URL is `https://api.orcarouter.ai/v1` +- Look for error messages in [Atomic Chat's logs](/docs/desktop/troubleshooting#how-to-get-error-logs) + +**3. Model Unavailable** +- Confirm the model is currently available on OrcaRouter +- Check if you're using the correct model ID format (`orcarouter/` prefix for routers) +- Verify the provider is currently operational + +Need more help? Join our [Discord community](https://discord.com/invite/8wGSsvmg4V) or check the [OrcaRouter documentation](https://docs.orcarouter.ai). diff --git a/tests/checklist.md b/tests/checklist.md index 7e843bdb8..e06ae1a5d 100644 --- a/tests/checklist.md +++ b/tests/checklist.md @@ -113,6 +113,7 @@ In Remote Model Providers: - [ ] [0.7.0] Azure - [ ] Cohere - [ ] OpenRouter + - [ ] OrcaRouter - [ ] Mistral - [ ] Groq - [ ] Gemini diff --git a/web-app/public/images/model-provider/orcarouter.svg b/web-app/public/images/model-provider/orcarouter.svg new file mode 100644 index 000000000..7a331df6a --- /dev/null +++ b/web-app/public/images/model-provider/orcarouter.svg @@ -0,0 +1,3 @@ + + + diff --git a/web-app/src/constants/models.ts b/web-app/src/constants/models.ts index 0b86a494b..aac0b12b4 100644 --- a/web-app/src/constants/models.ts +++ b/web-app/src/constants/models.ts @@ -777,6 +777,15 @@ export const providerModels = { supportsToolCalls: true, supportsN: true, }, + 'orcarouter': { + models: true, + supportsCompletion: true, + supportsStreaming: true, + supportsJSON: true, + supportsImages: true, + supportsToolCalls: true, + supportsN: true, + }, 'nvidia': { models: ['moonshotai/kimi-k2.5', 'minimaxai/minimax-m2.5', 'z-ai/glm5'], supportsCompletion: true, diff --git a/web-app/src/lib/__tests__/models.test.ts b/web-app/src/lib/__tests__/models.test.ts index 5cfe28888..49043c9e2 100644 --- a/web-app/src/lib/__tests__/models.test.ts +++ b/web-app/src/lib/__tests__/models.test.ts @@ -418,6 +418,13 @@ describe('getModelCapabilities', () => { expect(capabilities).not.toContain(ModelCapabilities.VISION) }) + it('handles orcarouter like other OpenAI-compatible providers', () => { + const capabilities = getModelCapabilities('orcarouter', 'orcarouter/auto') + expect(capabilities).toEqual([ModelCapabilities.COMPLETION]) + expect(capabilities).not.toContain(ModelCapabilities.TOOLS) + expect(capabilities).not.toContain(ModelCapabilities.VISION) + }) + it('handles model not in capability list', () => { const capabilities = getModelCapabilities('xai', 'grok-2-vision-1212') expect(capabilities).toContain(ModelCapabilities.COMPLETION) diff --git a/web-app/src/lib/__tests__/utils.test.ts b/web-app/src/lib/__tests__/utils.test.ts index 70d38845a..770587b8d 100644 --- a/web-app/src/lib/__tests__/utils.test.ts +++ b/web-app/src/lib/__tests__/utils.test.ts @@ -23,6 +23,9 @@ describe('getProviderLogo', () => { expect(getProviderLogo('openai')).toBe('/images/model-provider/openai.svg') expect(getProviderLogo('gemini')).toBe('/images/model-provider/gemini.svg') expect(getProviderLogo('nvidia')).toBe('/images/model-provider/nvidia.svg') + expect(getProviderLogo('orcarouter')).toBe( + '/images/model-provider/orcarouter.svg' + ) }) it('returns undefined for unknown providers', () => { @@ -36,6 +39,7 @@ describe('getProviderTitle', () => { expect(getProviderTitle('llamacpp')).toBe('llama.cpp turboquant') expect(getProviderTitle('openai')).toBe('OpenAI') expect(getProviderTitle('openrouter')).toBe('OpenRouter') + expect(getProviderTitle('orcarouter')).toBe('OrcaRouter') expect(getProviderTitle('gemini')).toBe('Gemini') expect(getProviderTitle('nvidia')).toBe('NVIDIA NIM') }) diff --git a/web-app/src/lib/model-factory.ts b/web-app/src/lib/model-factory.ts index cb60d4bd4..249d75685 100644 --- a/web-app/src/lib/model-factory.ts +++ b/web-app/src/lib/model-factory.ts @@ -767,6 +767,7 @@ export class ModelFactory { case 'moonshot': case 'minimax': case 'openrouter': + case 'orcarouter': case 'huggingface': case 'nvidia': case 'ollama': diff --git a/web-app/src/lib/utils.ts b/web-app/src/lib/utils.ts index 05f6f2aac..2801f8fff 100644 --- a/web-app/src/lib/utils.ts +++ b/web-app/src/lib/utils.ts @@ -93,6 +93,8 @@ export function getProviderLogo(provider: string) { return '/images/model-provider/mistral.svg' case 'openrouter': return '/images/model-provider/open-router.svg' + case 'orcarouter': + return '/images/model-provider/orcarouter.svg' case 'groq': return '/images/model-provider/groq.svg' case 'cohere': @@ -176,6 +178,8 @@ export const getProviderTitle = (provider: string) => { return 'OpenAI' case 'openrouter': return 'OpenRouter' + case 'orcarouter': + return 'OrcaRouter' case 'gemini': return 'Gemini' case 'huggingface':