Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions autoqa/checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ In Remote Model Providers:
- [ ] Anthropic
- [ ] Cohere
- [ ] OpenRouter
- [ ] OrcaRouter
- [ ] Mistral
- [ ] Groq
- [ ] Gemini
Expand Down
3 changes: 3 additions & 0 deletions docs/src/pages/docs/desktop/remote-models/_meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
"openrouter": {
"title": "OpenRouter"
},
"orcarouter": {
"title": "OrcaRouter"
},
"huggingface": {
"title": "Hugging Face"
}
Expand Down
101 changes: 101 additions & 0 deletions docs/src/pages/docs/desktop/remote-models/orcarouter.mdx
Original file line number Diff line number Diff line change
@@ -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

<Steps>

### 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

<Callout type='info'>
`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.
</Callout>

### Step 2: Configure Atomic Chat

1. Navigate to the **Settings** page (<Settings width={16} height={16} style={{display:"inline"}}/>)
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

</Steps>

## 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/<router-name>` or
`<provider>/<model-name>`
- 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).
1 change: 1 addition & 0 deletions tests/checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ In Remote Model Providers:
- [ ] [0.7.0] Azure
- [ ] Cohere
- [ ] OpenRouter
- [ ] OrcaRouter
- [ ] Mistral
- [ ] Groq
- [ ] Gemini
Expand Down
3 changes: 3 additions & 0 deletions web-app/public/images/model-provider/orcarouter.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions web-app/src/constants/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
7 changes: 7 additions & 0 deletions web-app/src/lib/__tests__/models.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 4 additions & 0 deletions web-app/src/lib/__tests__/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand All @@ -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')
})
Expand Down
1 change: 1 addition & 0 deletions web-app/src/lib/model-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -767,6 +767,7 @@ export class ModelFactory {
case 'moonshot':
case 'minimax':
case 'openrouter':
case 'orcarouter':
case 'huggingface':
case 'nvidia':
case 'ollama':
Expand Down
4 changes: 4 additions & 0 deletions web-app/src/lib/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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':
Expand Down Expand Up @@ -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':
Expand Down