chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
# Auto-Combo: Let OmniRoute Pick the Best AI for You
|
||||
|
||||
> **TL;DR**: Set your model to `auto` and OmniRoute automatically picks the best AI provider for each request. No configuration needed.
|
||||
|
||||
---
|
||||
|
||||
## What It Does
|
||||
|
||||
Instead of choosing a specific AI model (like GPT-4o or Claude), you can let OmniRoute **automatically pick the best one** for each request. It considers:
|
||||
|
||||
- **Health** — Is the provider working right now?
|
||||
- **Speed** — How fast is it?
|
||||
- **Cost** — How much does it cost?
|
||||
- **Quality** — Is it good at this type of task?
|
||||
- **Capacity** — Does it have quota remaining?
|
||||
|
||||
OmniRoute scores all your connected providers and picks the best one. If it fails, it automatically tries the next one.
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
**Step 1**: Set your model to `auto` in your IDE or CLI:
|
||||
|
||||
```
|
||||
model: "auto"
|
||||
```
|
||||
|
||||
**Step 2**: That's it! OmniRoute handles the rest.
|
||||
|
||||
**Step 3** (optional): Use a variant for specific tasks:
|
||||
|
||||
```
|
||||
model: "auto/coding" # Best for code
|
||||
model: "auto/fast" # Fastest response
|
||||
model: "auto/cheap" # Cheapest option
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Which "auto" Should I Use?
|
||||
|
||||
| If you want... | Use this | Best for | How it works |
|
||||
|----------------|----------|----------|--------------|
|
||||
| **Best overall** | `auto` | General questions, chat | Balances speed, cost, and quality |
|
||||
| **Best code** | `auto/coding` | Writing code, debugging | Picks models good at coding tasks |
|
||||
| **Fastest response** | `auto/fast` | Quick answers, low latency | Prioritizes speed over everything |
|
||||
| **Cheapest option** | `auto/cheap` | Saving money | Picks the cheapest provider |
|
||||
| **Smartest model** | `auto/smart` | Complex tasks | Quality-first + explores new models |
|
||||
| **Most available** | `auto/offline` | When providers are busy | Picks providers with most capacity |
|
||||
|
||||
### Examples
|
||||
|
||||
```bash
|
||||
# General chat — balanced
|
||||
curl http://localhost:20128/v1/chat/completions \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"model":"auto","messages":[{"role":"user","content":"Hello!"}]}'
|
||||
|
||||
# Code generation — quality-first
|
||||
curl http://localhost:20128/v1/chat/completions \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"model":"auto/coding","messages":[{"role":"user","content":"Write a Python function"}]}'
|
||||
|
||||
# Quick answer — speed-first
|
||||
curl http://localhost:20128/v1/chat/completions \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"model":"auto/fast","messages":[{"role":"user","content":"What is 2+2?"}]}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## How It Works (Simple Version)
|
||||
|
||||
When you send a request with `model: "auto"`, OmniRoute:
|
||||
|
||||
1. **Looks at all your connected providers** — Every provider you've added (OpenAI, Anthropic, Google, etc.)
|
||||
2. **Scores each one** on 5 factors:
|
||||
- Is it working? (health)
|
||||
- Does it have capacity? (quota)
|
||||
- How much does it cost? (price)
|
||||
- How fast is it? (speed)
|
||||
- Is it good at this task? (quality)
|
||||
3. **Picks the best one** — The highest-scoring provider gets your request
|
||||
4. **Auto-recovers** — If it fails, OmniRoute tries the next one automatically
|
||||
|
||||
### The Scoring System
|
||||
|
||||
Each provider gets a score from 0 to 1. The higher the score, the better the fit.
|
||||
|
||||
| Factor | Weight | What it means |
|
||||
|--------|--------|---------------|
|
||||
| Health | 20% | Is the provider working? (circuit breaker state) |
|
||||
| Quota | 15% | Does it have capacity remaining? |
|
||||
| Cost | 15% | How expensive is it? (cheaper = higher score) |
|
||||
| Speed | 12% | How fast is it? (lower latency = higher score) |
|
||||
| Task Fit | 8% | Is it good at this type of task? |
|
||||
| Stability | 5% | Is it consistent? (low error rate) |
|
||||
| Tier | 5% | Account tier (Ultra > Pro > Free) |
|
||||
| Other | 20% | Context affinity, connection density, etc. |
|
||||
|
||||
### How Variants Change the Scoring
|
||||
|
||||
Each variant uses different weights:
|
||||
|
||||
| Variant | Prioritizes | Key Weights |
|
||||
|---------|-------------|-------------|
|
||||
| `auto` | Balanced | health=20%, quota=15%, cost=15% |
|
||||
| `auto/coding` | Quality | taskFit=37%, stability=15% |
|
||||
| `auto/fast` | Speed | latency=32%, health=28% |
|
||||
| `auto/cheap` | Cost | cost=37% |
|
||||
| `auto/smart` | Quality + Explore | taskFit=37%, exploration=10% |
|
||||
| `auto/offline` | Capacity | quota=37%, health=28% |
|
||||
|
||||
---
|
||||
|
||||
## How It Handles Failures
|
||||
|
||||
OmniRoute has **three layers of protection**:
|
||||
|
||||
### 1. Auto-Fallback
|
||||
If the best provider fails, OmniRoute automatically tries the next one. You don't need to do anything.
|
||||
|
||||
### 2. Self-Healing
|
||||
If a provider keeps failing:
|
||||
- **Score < 0.2** → Excluded for 5 minutes
|
||||
- **Circuit breaker open** → Auto-excluded
|
||||
- **More than 50% providers down** → Incident mode (no exploration)
|
||||
|
||||
### 3. Emergency Fallback
|
||||
If all providers fail, OmniRoute routes to stable free providers (like Kiro or Qoder) as a last resort.
|
||||
|
||||
---
|
||||
|
||||
## Multi-Account Support
|
||||
|
||||
If you have multiple accounts for the same provider (e.g., two OpenAI keys), OmniRoute treats each as a **separate candidate**. This means:
|
||||
|
||||
- Account A has quota remaining → use it
|
||||
- Account B is rate-limited → skip it
|
||||
- Account C is cheaper → prefer it
|
||||
|
||||
Each account is scored independently based on its own health, quota, and speed.
|
||||
|
||||
---
|
||||
|
||||
## Bandit Exploration
|
||||
|
||||
OmniRoute occasionally **explores** new providers to discover better options:
|
||||
|
||||
- **Default**: 5% of requests go to random providers
|
||||
- **Auto/smart**: 10% exploration rate
|
||||
- **Disabled** when more than 50% of providers are unhealthy
|
||||
|
||||
This helps OmniRoute learn which providers work best for your usage patterns.
|
||||
|
||||
---
|
||||
|
||||
## Common Questions
|
||||
|
||||
### "Will it always pick the most expensive model?"
|
||||
|
||||
**No.** Cost is only 15% of the score by default. A cheap, fast, healthy provider can beat an expensive one. Use `auto/cheap` if you want to prioritize cost even more.
|
||||
|
||||
### "What if a provider goes down?"
|
||||
|
||||
OmniRoute automatically skips it and tries the next one. If a provider keeps failing, it's excluded temporarily (5-30 minutes). You don't need to do anything.
|
||||
|
||||
### "Can I see which provider was used?"
|
||||
|
||||
Check the response headers — OmniRoute includes the provider and model used in each response.
|
||||
|
||||
### "Does it learn from my usage?"
|
||||
|
||||
Yes! The scoring system uses historical data (latency, error rates, success rates) to make better decisions over time.
|
||||
|
||||
### "What's the difference between `auto` and `auto/smart`?"
|
||||
|
||||
- `auto` — Balanced, 5% exploration
|
||||
- `auto/smart` — Quality-first (same weights as `auto/coding`), 10% exploration
|
||||
|
||||
Use `auto/smart` when you want the best quality and are okay with occasional exploration.
|
||||
|
||||
### "Can I force a specific provider?"
|
||||
|
||||
Yes! Use a combo with `priority` strategy instead of `auto`. See the [Technical Reference](../routing/AUTO-COMBO.md) for details.
|
||||
|
||||
### "How is this different from round-robin?"
|
||||
|
||||
Round-robin cycles through providers in order. Auto-combo **scores each provider** and picks the best one. It's smarter — it considers health, speed, cost, and quality.
|
||||
|
||||
---
|
||||
|
||||
## What's Next?
|
||||
|
||||
- **[Connect a Provider](./PROVIDERS-GUIDE.md)** — Add your first AI provider
|
||||
- **[Free Tiers Guide](./FREE-TIERS-GUIDE.md)** — Get free AI with no credit card
|
||||
- **[Troubleshooting](./TROUBLESHOOTING.md)** — Fix common issues
|
||||
- **[Technical Reference](../routing/AUTO-COMBO.md)** — Deep dive into the scoring algorithm
|
||||
|
||||
---
|
||||
|
||||
## Learn More
|
||||
|
||||
For developers and contributors, see the [Auto-Combo Technical Reference](../routing/AUTO-COMBO.md) for:
|
||||
- Full 12-factor scoring algorithm
|
||||
- Mode pack weight tables
|
||||
- Implementation file paths
|
||||
- API endpoints
|
||||
- Self-healing algorithm details
|
||||
@@ -0,0 +1,270 @@
|
||||
# Free Tiers Guide: Get Free AI Without a Credit Card
|
||||
|
||||
> **TL;DR**: OmniRoute aggregates free tiers from 50+ providers. Connect multiple free providers for unlimited free AI with automatic fallback.
|
||||
|
||||
---
|
||||
|
||||
## What Are Free Tiers?
|
||||
|
||||
Many AI providers offer **free usage** — no credit card required. Think of it like free samples at a grocery store. You can try the product without paying.
|
||||
|
||||
OmniRoute **aggregates** these free tiers into one endpoint. Instead of signing up for 10 different services, you connect them all to OmniRoute and use `model: "auto"` to automatically pick the best free option for each request.
|
||||
|
||||
---
|
||||
|
||||
## Best Free Providers (No Credit Card)
|
||||
|
||||
### Tier 1: Free Forever (Unlimited)
|
||||
|
||||
These providers are **always free** with no limits:
|
||||
|
||||
| Provider | Models | Quota | How to Connect |
|
||||
|----------|--------|-------|----------------|
|
||||
| **Kiro AI** | Claude Sonnet 4.5, Haiku 4.5, Opus 4.6 | 50 credits/month | No auth needed |
|
||||
| **OpenCode Free** | GPT-4o, Claude, Gemini | Unlimited | No auth needed |
|
||||
| **Pollinations** | GPT-5, Claude, Gemini, DeepSeek, Llama 4 | No key needed | No auth needed |
|
||||
| **LongCat** | LongCat-2.0 | 10M tokens (one-time) | API key + KYC |
|
||||
| **Cloudflare AI** | 50+ models | 10K neurons/day | No auth needed |
|
||||
| **Qwen** | Qwen3-coder-plus/flash/next | Unlimited | No auth needed |
|
||||
| **Qoder** | Kimi-K2, DeepSeek-R1, Qwen3-coder | Unlimited | No auth needed |
|
||||
|
||||
### Tier 2: Free with Signup (Generous)
|
||||
|
||||
These providers give you **free credits** when you sign up:
|
||||
|
||||
| Provider | Free Credits | Models | How to Get |
|
||||
|----------|-------------|--------|------------|
|
||||
| **NVIDIA NIM** | ~40 RPM | 129 models | Sign up at build.nvidia.com |
|
||||
| **Cerebras** | 1M tokens/day | Qwen3 235B, GPT-OSS 120B | Sign up at cerebras.ai |
|
||||
| **DeepSeek** | 5M free tokens | DeepSeek V4 | Sign up at platform.deepseek.com |
|
||||
| **Groq** | 30 RPM free | Llama 4, Mixtral | Sign up at console.groq.com |
|
||||
| **OpenAI** | $5 free credits | GPT-5, GPT-4o | Sign up at platform.openai.com |
|
||||
| **Anthropic** | $5 free credits | Claude Opus 4.6, Sonnet 4.6 | Sign up at console.anthropic.com |
|
||||
| **Google** | 1,500 req/day | Gemini 2.5 Pro, Flash | Sign up at aistudio.google.com |
|
||||
|
||||
### Tier 3: Free with Limits (Specific Use Cases)
|
||||
|
||||
These providers have **free tiers** with specific limits:
|
||||
|
||||
| Provider | Free Limit | Models | Best For |
|
||||
|----------|-----------|--------|----------|
|
||||
| **Cerebras** | 1M tokens/day | Qwen3 235B | Fast inference |
|
||||
| **NVIDIA NIM** | ~40 RPM | 129 models | Variety |
|
||||
| **Groq** | 30 RPM | Llama 4, Mixtral | Speed |
|
||||
| **Cloudflare AI** | 10K neurons/day | 50+ models | Variety |
|
||||
|
||||
---
|
||||
|
||||
## How to Stack Free Tiers
|
||||
|
||||
The magic of OmniRoute is **stacking free tiers**. Instead of relying on one provider, you connect multiple free providers and let OmniRoute automatically pick the best one for each request.
|
||||
|
||||
### Example: Unlimited Free AI
|
||||
|
||||
Connect these 4 providers for **unlimited free AI**:
|
||||
|
||||
1. **Kiro AI** — 50 credits/month (Claude models)
|
||||
2. **OpenCode Free** — Unlimited (GPT models)
|
||||
3. **Pollinations** — No key needed (multiple models)
|
||||
4. **LongCat** — 10M tokens one-time (backup, requires KYC)
|
||||
|
||||
Then use `model: "auto"` and OmniRoute will:
|
||||
- Try Kiro first (best quality)
|
||||
- If Kiro is busy → try OpenCode Free
|
||||
- If OpenCode Free is slow → try Pollinations
|
||||
- If all fail → use LongCat as backup
|
||||
|
||||
**Result**: Unlimited free AI with automatic fallback!
|
||||
|
||||
---
|
||||
|
||||
## How to Connect Free Providers
|
||||
|
||||
### Step 1: Open the Dashboard
|
||||
|
||||
Go to `http://localhost:20128` in your browser.
|
||||
|
||||
### Step 2: Go to Providers
|
||||
|
||||
Click **Providers** in the sidebar.
|
||||
|
||||
### Step 3: Click Add Provider
|
||||
|
||||
Click the **+ Add Provider** button.
|
||||
|
||||
### Step 4: Select a Free Provider
|
||||
|
||||
Browse the list and select one of these free providers:
|
||||
- **Kiro AI** — Free Claude models
|
||||
- **OpenCode Free** — Free GPT models
|
||||
- **Pollinations** — Free GPT-5, Claude, Gemini
|
||||
- **LongCat** — 10M tokens free (one-time, requires KYC)
|
||||
- **Cloudflare AI** — 50+ models, 10K neurons/day
|
||||
|
||||
### Step 5: Click Connect
|
||||
|
||||
No API key needed — just click **Connect**.
|
||||
|
||||
### Step 6: Repeat
|
||||
|
||||
Connect 3-4 free providers for the best experience.
|
||||
|
||||
---
|
||||
|
||||
## Free Provider Details
|
||||
|
||||
### Kiro AI
|
||||
|
||||
- **Models**: Claude Sonnet 4.5, Haiku 4.5, Opus 4.6
|
||||
- **Quota**: 50 credits/month
|
||||
- **Auth**: No auth needed
|
||||
- **Best for**: High-quality Claude models
|
||||
|
||||
### OpenCode Free
|
||||
|
||||
- **Models**: GPT-4o, Claude, Gemini
|
||||
- **Quota**: Unlimited
|
||||
- **Auth**: No auth needed
|
||||
- **Best for**: General-purpose AI
|
||||
|
||||
### Pollinations
|
||||
|
||||
- **Models**: GPT-5, Claude, Gemini, DeepSeek, Llama 4
|
||||
- **Quota**: No key needed
|
||||
- **Auth**: No auth needed
|
||||
- **Best for**: Variety of models
|
||||
|
||||
### LongCat
|
||||
|
||||
- **Models**: LongCat-2.0
|
||||
- **Quota**: 10M tokens, one-time grant on signup (not recurring daily/monthly)
|
||||
- **Auth**: API key + KYC verification required to unlock the free grant
|
||||
- **Best for**: A one-off free allowance; pay-as-you-go beyond it
|
||||
|
||||
### Cloudflare AI
|
||||
|
||||
- **Models**: 50+ models
|
||||
- **Quota**: 10K neurons/day
|
||||
- **Auth**: No auth needed
|
||||
- **Best for**: Variety and reliability
|
||||
|
||||
### NVIDIA NIM
|
||||
|
||||
- **Models**: 129 models
|
||||
- **Quota**: ~40 RPM
|
||||
- **Auth**: Sign up at build.nvidia.com
|
||||
- **Best for**: Variety and speed
|
||||
|
||||
### Cerebras
|
||||
|
||||
- **Models**: Qwen3 235B, GPT-OSS 120B
|
||||
- **Quota**: 1M tokens/day
|
||||
- **Auth**: Sign up at cerebras.ai
|
||||
- **Best for**: Fast inference
|
||||
|
||||
### Qwen
|
||||
|
||||
- **Models**: Qwen3-coder-plus/flash/next
|
||||
- **Quota**: Unlimited
|
||||
- **Auth**: No auth needed
|
||||
- **Best for**: Coding tasks
|
||||
|
||||
### Qoder
|
||||
|
||||
- **Models**: Kimi-K2, DeepSeek-R1, Qwen3-coder
|
||||
- **Quota**: Unlimited
|
||||
- **Auth**: No auth needed
|
||||
- **Best for**: Coding tasks
|
||||
|
||||
---
|
||||
|
||||
## How OmniRoute Makes Free Tiers Better
|
||||
|
||||
### 1. Automatic Fallback
|
||||
|
||||
If one free provider is busy or down, OmniRoute automatically tries the next one. You don't need to do anything.
|
||||
|
||||
### 2. Smart Routing
|
||||
|
||||
OmniRoute picks the **best free provider** for each request based on:
|
||||
- Speed — Which provider is fastest right now?
|
||||
- Quality — Which provider is best for this task?
|
||||
- Capacity — Which provider has quota remaining?
|
||||
|
||||
### 3. Token Savings
|
||||
|
||||
OmniRoute's **compression** feature saves 15-95% of tokens. This means your free quota lasts **5-20x longer**.
|
||||
|
||||
### 4. Multi-Account Support
|
||||
|
||||
If you have multiple accounts for the same provider, OmniRoute treats each as a separate candidate. This doubles or triples your free quota.
|
||||
|
||||
---
|
||||
|
||||
## Free Tier Math
|
||||
|
||||
Let's calculate how much free AI you can get:
|
||||
|
||||
### Conservative Estimate (3 providers)
|
||||
|
||||
| Provider | Daily Quota | Monthly Quota |
|
||||
|----------|-------------|---------------|
|
||||
| Kiro AI | ~1.7 credits | 50 credits |
|
||||
| OpenCode Free | Unlimited | Unlimited |
|
||||
| Pollinations | Unlimited | Unlimited |
|
||||
|
||||
**Total**: Unlimited free AI
|
||||
|
||||
### Aggressive Estimate (7 providers)
|
||||
|
||||
| Provider | Daily Quota | Monthly Quota |
|
||||
|----------|-------------|---------------|
|
||||
| Kiro AI | ~1.7 credits | 50 credits |
|
||||
| OpenCode Free | Unlimited | Unlimited |
|
||||
| Pollinations | Unlimited | Unlimited |
|
||||
| LongCat | — (one-time) | 10M tokens (one-time, KYC) |
|
||||
| Cloudflare AI | 10K neurons | 300K neurons |
|
||||
| NVIDIA NIM | ~40 RPM | ~1.7M requests |
|
||||
| Cerebras | 1M tokens | 30M tokens |
|
||||
|
||||
**Total**: ~1.6B documented free tokens/month — up to ~2.1B in your first month with signup credits (with compression: ~7.5B+ effective tokens)
|
||||
|
||||
---
|
||||
|
||||
## Common Questions
|
||||
|
||||
### "Is this really free?"
|
||||
|
||||
**Yes!** These are official free tiers from the providers. OmniRoute just makes it easier to use them all at once.
|
||||
|
||||
### "Will the free tier run out?"
|
||||
|
||||
Some providers have limits (like Kiro's 50 credits/month), but others are unlimited (like OpenCode Free and Pollinations). By connecting multiple providers, you always have a backup.
|
||||
|
||||
### "Can I use free providers for production?"
|
||||
|
||||
**Yes!** Many free providers are production-ready. However, for critical applications, consider adding a paid provider as a backup.
|
||||
|
||||
### "What's the catch?"
|
||||
|
||||
No catch! Providers offer free tiers to attract users. OmniRoute just makes it easier to use them all at once.
|
||||
|
||||
### "How do I get more free quota?"
|
||||
|
||||
1. Connect more free providers
|
||||
2. Use compression to save tokens (15-95% savings)
|
||||
3. Use `auto/cheap` to prioritize free/cheap providers
|
||||
4. Create multiple accounts for the same provider
|
||||
|
||||
### "Do free providers have worse quality?"
|
||||
|
||||
**Not necessarily!** Many free providers offer the same models as paid providers. For example, Kiro gives you access to Claude Sonnet 4.5 — the same model you'd get with a paid Anthropic subscription.
|
||||
|
||||
---
|
||||
|
||||
## What's Next?
|
||||
|
||||
- **[Auto-Combo Guide](./AUTO-COMBO-GUIDE.md)** — Let OmniRoute pick the best AI for you
|
||||
- **[Providers Guide](./PROVIDERS-GUIDE.md)** — Connect more providers
|
||||
- **[Troubleshooting](./TROUBLESHOOTING.md)** — Fix common issues
|
||||
- **[Free Tiers Reference](../reference/FREE_TIERS.md)** — Full list of free tiers
|
||||
@@ -0,0 +1,220 @@
|
||||
# Providers Guide: Connect AI Models to OmniRoute
|
||||
|
||||
> **TL;DR**: A provider is a connection to an AI service (like OpenAI, Anthropic, Google). You need at least one provider to use OmniRoute.
|
||||
|
||||
---
|
||||
|
||||
## What Is a Provider?
|
||||
|
||||
Think of a provider like a **phone carrier**. Just as you need a phone carrier to make calls, you need an AI provider to use AI models. OmniRoute is like a phone that works with **all carriers** — you can switch between them automatically.
|
||||
|
||||
### Types of Providers
|
||||
|
||||
| Type | What It Is | Examples | Cost |
|
||||
| -------------- | ------------------------- | --------------------------------- | ---------------------- |
|
||||
| **Free** | No payment required | Kiro, OpenCode Free, Pollinations | $0 |
|
||||
| **API Key** | You need an API key | OpenAI, Anthropic, Google | Pay per use |
|
||||
| **OAuth** | Login with your account | Claude Code, GitHub Copilot | Subscription |
|
||||
| **Web Cookie** | Uses your browser session | ChatGPT Web, Gemini Web | $0 (uses your account) |
|
||||
|
||||
---
|
||||
|
||||
## Quick Start: Connect Your First Provider
|
||||
|
||||
### Option A: Free Provider (No Credit Card)
|
||||
|
||||
1. Open the dashboard at `http://localhost:20128`
|
||||
2. Go to **Providers** → **Add Provider**
|
||||
3. Select one of these free providers:
|
||||
- **Kiro AI** — Free Claude models (no auth needed)
|
||||
- **OpenCode Free** — Free GPT models (no auth needed)
|
||||
- **Pollinations** — Free GPT-5, Claude, Gemini (no key needed)
|
||||
- **LongCat** — 10M tokens free (one-time grant, requires account + KYC)
|
||||
- **Cloudflare AI** — 50+ models, 10K neurons/day
|
||||
4. Click **Connect**
|
||||
5. Done! You now have free AI access.
|
||||
|
||||
### Option B: API Key Provider (Paid)
|
||||
|
||||
1. Get an API key from the provider's website:
|
||||
- **OpenAI**: https://platform.openai.com/api-keys
|
||||
- **Anthropic**: https://console.anthropic.com/
|
||||
- **Google**: https://aistudio.google.com/apikey
|
||||
- **DeepSeek**: https://platform.deepseek.com/
|
||||
- **Groq**: https://console.groq.com/
|
||||
2. Open the dashboard at `http://localhost:20128`
|
||||
3. Go to **Providers** → **Add Provider**
|
||||
4. Select your provider
|
||||
5. Paste your API key
|
||||
6. Click **Connect**
|
||||
7. Done! You now have access to that provider's models.
|
||||
|
||||
### Option C: OAuth Provider (Subscription)
|
||||
|
||||
1. Open the dashboard at `http://localhost:20128`
|
||||
2. Go to **Providers** → **Add Provider**
|
||||
3. Select your provider (e.g., Claude Code, GitHub Copilot)
|
||||
4. Click **Connect with OAuth**
|
||||
5. Login with your account
|
||||
6. Done! You now have access to your subscription models.
|
||||
|
||||
---
|
||||
|
||||
## Best Free Providers
|
||||
|
||||
These providers offer **free access** with no credit card:
|
||||
|
||||
| Provider | Free Quota | Models | How to Connect |
|
||||
| ----------------- | ---------------- | ---------------------------------------- | -------------- |
|
||||
| **Kiro AI** | 50 credits/month | Claude Sonnet 4.5, Haiku 4.5, Opus 4.6 | No auth needed |
|
||||
| **OpenCode Free** | Unlimited | GPT-4o, Claude, Gemini | No auth needed |
|
||||
| **Pollinations** | No key needed | GPT-5, Claude, Gemini, DeepSeek, Llama 4 | No auth needed |
|
||||
| **LongCat** | 10M one-time | LongCat-2.0 | API key + KYC |
|
||||
| **Cloudflare AI** | 10K neurons/day | 50+ models | No auth needed |
|
||||
| **NVIDIA NIM** | ~40 RPM | 129 models | API key needed |
|
||||
| **Cerebras** | 1M tokens/day | Qwen3 235B, GPT-OSS 120B | API key needed |
|
||||
| **Qwen** | Unlimited | Qwen3-coder-plus/flash/next | No auth needed |
|
||||
| **Qoder** | Unlimited | Kimi-K2, DeepSeek-R1, Qwen3-coder | No auth needed |
|
||||
|
||||
**Tip**: Connect multiple free providers for **unlimited free AI** with automatic fallback!
|
||||
|
||||
---
|
||||
|
||||
## Best Paid Providers
|
||||
|
||||
These providers offer **high-quality models** with API keys:
|
||||
|
||||
| Provider | Best Models | Cost | Free Tier |
|
||||
| ------------- | --------------------------- | ---------------------- | ------------------ |
|
||||
| **OpenAI** | GPT-5, GPT-4o | $2.50-$10/1M tokens | $5 free credits |
|
||||
| **Anthropic** | Claude Opus 4.6, Sonnet 4.6 | $3-$15/1M tokens | $5 free credits |
|
||||
| **Google** | Gemini 2.5 Pro, Flash | $0.075-$1.25/1M tokens | 1,500 req/day free |
|
||||
| **DeepSeek** | DeepSeek V4 | $0.14-$0.28/1M tokens | 5M free tokens |
|
||||
| **Groq** | Llama 4, Mixtral | $0.05-$0.27/1M tokens | 30 RPM free |
|
||||
| **xAI** | Grok 3 | $0.30-$0.60/1M tokens | — |
|
||||
|
||||
---
|
||||
|
||||
## How to Connect a Provider (Step-by-Step)
|
||||
|
||||
### Step 1: Open the Dashboard
|
||||
|
||||
Go to `http://localhost:20128` in your browser.
|
||||
|
||||
### Step 2: Go to Providers
|
||||
|
||||
Click **Providers** in the sidebar.
|
||||
|
||||
### Step 3: Click Add Provider
|
||||
|
||||
Click the **+ Add Provider** button.
|
||||
|
||||
### Step 4: Select Your Provider
|
||||
|
||||
Browse the list or search for your provider. Click on it.
|
||||
|
||||
### Step 5: Enter Credentials
|
||||
|
||||
- **Free providers**: No credentials needed — just click **Connect**
|
||||
- **API key providers**: Paste your API key
|
||||
- **OAuth providers**: Click **Connect with OAuth** and login
|
||||
|
||||
### Step 6: Test the Connection
|
||||
|
||||
Click **Test Connection** to verify it works.
|
||||
|
||||
### Step 7: Done!
|
||||
|
||||
Your provider is now connected. You can use it with `model: "auto"` or specify the provider directly.
|
||||
|
||||
---
|
||||
|
||||
## Using Multiple Providers
|
||||
|
||||
OmniRoute works best with **multiple providers**. This gives you:
|
||||
|
||||
- **Automatic fallback** — If one provider fails, OmniRoute tries the next
|
||||
- **Cost optimization** — OmniRoute picks the cheapest provider for each request
|
||||
- **Speed optimization** — OmniRoute picks the fastest provider for each request
|
||||
- **Quality optimization** — OmniRoute picks the best provider for each task
|
||||
|
||||
### Recommended Setup
|
||||
|
||||
Connect at least **3 providers** for the best experience:
|
||||
|
||||
1. **One free provider** (Kiro, OpenCode Free, or Pollinations) — Always available
|
||||
2. **One fast provider** (Groq, Cerebras) — For quick responses
|
||||
3. **One quality provider** (OpenAI, Anthropic, Google) — For complex tasks
|
||||
|
||||
Then use `model: "auto"` and OmniRoute will automatically pick the best one for each request.
|
||||
|
||||
---
|
||||
|
||||
## Provider-Specific Setup
|
||||
|
||||
### OpenAI
|
||||
|
||||
1. Get API key: https://platform.openai.com/api-keys
|
||||
2. In OmniRoute: Providers → Add Provider → OpenAI
|
||||
3. Paste API key → Connect
|
||||
|
||||
### Anthropic
|
||||
|
||||
1. Get API key: https://console.anthropic.com/
|
||||
2. In OmniRoute: Providers → Add Provider → Anthropic
|
||||
3. Paste API key → Connect
|
||||
|
||||
### Google (Gemini)
|
||||
|
||||
1. Get API key: https://aistudio.google.com/apikey
|
||||
2. In OmniRoute: Providers → Add Provider → Gemini
|
||||
3. Paste API key → Connect
|
||||
|
||||
### DeepSeek
|
||||
|
||||
1. Get API key: https://platform.deepseek.com/
|
||||
2. In OmniRoute: Providers → Add Provider → DeepSeek
|
||||
3. Paste API key → Connect
|
||||
|
||||
### Groq
|
||||
|
||||
1. Get API key: https://console.groq.com/
|
||||
2. In OmniRoute: Providers → Add Provider → Groq
|
||||
3. Paste API key → Connect
|
||||
|
||||
---
|
||||
|
||||
## Common Questions
|
||||
|
||||
### "Do I need to pay to use OmniRoute?"
|
||||
|
||||
**No!** OmniRoute is free and open-source. You can use free providers (Kiro, OpenCode Free, Pollinations) without paying anything. You only pay if you choose to use paid providers.
|
||||
|
||||
### "Which provider should I start with?"
|
||||
|
||||
Start with **Kiro AI** — it's free, requires no API key, and gives you access to Claude models. Then add more providers as needed.
|
||||
|
||||
### "Can I use multiple providers at once?"
|
||||
|
||||
**Yes!** That's the whole point of OmniRoute. Connect multiple providers and use `model: "auto"` to let OmniRoute pick the best one for each request.
|
||||
|
||||
### "What if a provider goes down?"
|
||||
|
||||
OmniRoute automatically skips failed providers and tries the next one. You don't need to do anything.
|
||||
|
||||
### "How do I disconnect a provider?"
|
||||
|
||||
Go to Providers → click on the provider → click **Disconnect**.
|
||||
|
||||
### "Can I use my existing API keys?"
|
||||
|
||||
**Yes!** If you already have API keys for OpenAI, Anthropic, Google, etc., you can use them in OmniRoute. Just paste them when connecting the provider.
|
||||
|
||||
---
|
||||
|
||||
## What's Next?
|
||||
|
||||
- **[Auto-Combo Guide](./AUTO-COMBO-GUIDE.md)** — Let OmniRoute pick the best AI for you
|
||||
- **[Free Tiers Guide](./FREE-TIERS-GUIDE.md)** — Get free AI with no credit card
|
||||
- **[Troubleshooting](./TROUBLESHOOTING.md)** — Fix common issues
|
||||
- **[Provider Reference](../reference/PROVIDER_REFERENCE.md)** — Full list of 226 providers
|
||||
@@ -0,0 +1,135 @@
|
||||
# Quick Start: Get OmniRoute Running in 3 Minutes
|
||||
|
||||
> **TL;DR**: Install → Connect a free provider → Point your IDE to OmniRoute. Done.
|
||||
|
||||
---
|
||||
|
||||
## Step 1: Install OmniRoute
|
||||
|
||||
Choose your preferred method:
|
||||
|
||||
### Option A: npm (Recommended)
|
||||
|
||||
```bash
|
||||
npm install -g omniroute
|
||||
```
|
||||
|
||||
### Option B: Docker
|
||||
|
||||
```bash
|
||||
docker run -d --name omniroute -p 20128:20128 diegosouzapw/omniroute:latest
|
||||
```
|
||||
|
||||
### Option C: From Source
|
||||
|
||||
```bash
|
||||
git clone https://github.com/diegosouzapw/OmniRoute.git
|
||||
cd OmniRoute
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 2: Start OmniRoute
|
||||
|
||||
```bash
|
||||
omniroute
|
||||
```
|
||||
|
||||
OmniRoute starts at `http://localhost:20128`. The dashboard opens automatically.
|
||||
|
||||
---
|
||||
|
||||
## Step 3: Connect a Free Provider
|
||||
|
||||
You can use OmniRoute **without paying anything** by connecting a free provider.
|
||||
|
||||
### Option A: Kiro (Free Claude — No Credit Card)
|
||||
|
||||
1. Open the dashboard at `http://localhost:20128`
|
||||
2. Go to **Providers** → **Add Provider**
|
||||
3. Select **Kiro AI**
|
||||
4. Click **Connect** (no API key needed!)
|
||||
5. Done! You now have free access to Claude models.
|
||||
|
||||
### Option B: OpenCode Free (No Auth)
|
||||
|
||||
1. Open the dashboard at `http://localhost:20128`
|
||||
2. Go to **Providers** → **Add Provider**
|
||||
3. Select **OpenCode Free**
|
||||
4. Click **Connect** (no API key needed!)
|
||||
5. Done! You now have free access to multiple models.
|
||||
|
||||
### Option C: Pollinations (No Key Needed)
|
||||
|
||||
1. Open the dashboard at `http://localhost:20128`
|
||||
2. Go to **Providers** → **Add Provider**
|
||||
3. Select **Pollinations**
|
||||
4. Click **Connect** (no API key needed!)
|
||||
5. Done! You now have free access to GPT-5, Claude, Gemini, and more.
|
||||
|
||||
---
|
||||
|
||||
## Step 4: Point Your IDE to OmniRoute
|
||||
|
||||
In your IDE or CLI tool, set:
|
||||
|
||||
```
|
||||
Base URL: http://localhost:20128/v1
|
||||
API Key: [copy from Dashboard → Endpoints]
|
||||
Model: auto
|
||||
```
|
||||
|
||||
That's it! Your IDE now uses OmniRoute with automatic provider selection.
|
||||
|
||||
---
|
||||
|
||||
## Step 5: Verify It Works
|
||||
|
||||
```bash
|
||||
curl http://localhost:20128/v1/models -H "Authorization: Bearer YOUR_KEY"
|
||||
```
|
||||
|
||||
You should see your connected models listed.
|
||||
|
||||
---
|
||||
|
||||
## What's Next?
|
||||
|
||||
- **[Auto-Combo Guide](./AUTO-COMBO-GUIDE.md)** — Let OmniRoute pick the best AI for you
|
||||
- **[Providers Guide](./PROVIDERS-GUIDE.md)** — Connect more providers (free and paid)
|
||||
- **[Free Tiers Guide](./FREE-TIERS-GUIDE.md)** — Get free AI with no credit card
|
||||
- **[Troubleshooting](./TROUBLESHOOTING.md)** — Fix common issues
|
||||
|
||||
---
|
||||
|
||||
## Common Questions
|
||||
|
||||
### "Do I need an API key?"
|
||||
|
||||
**No!** You can use free providers (Kiro, OpenCode Free, Pollinations) without any API key. Just connect them in the dashboard.
|
||||
|
||||
### "What is `auto`?"
|
||||
|
||||
`auto` tells OmniRoute to automatically pick the best provider for each request. It considers speed, cost, quality, and availability. See the [Auto-Combo Guide](./AUTO-COMBO-GUIDE.md) for details.
|
||||
|
||||
### "How much does it cost?"
|
||||
|
||||
OmniRoute itself is **free and open-source**. You only pay for the providers you use. Many providers have free tiers — see the [Free Tiers Guide](./FREE-TIERS-GUIDE.md).
|
||||
|
||||
### "Can I use it with Claude Code / Cursor / Copilot?"
|
||||
|
||||
**Yes!** OmniRoute works with any tool that supports OpenAI format. Just set the base URL to `http://localhost:20128/v1`. See the [CLI Tools Guide](../reference/CLI-TOOLS.md) for specific setup instructions.
|
||||
|
||||
### "What if a provider goes down?"
|
||||
|
||||
OmniRoute automatically skips failed providers and tries the next one. You don't need to do anything. See the [Auto-Combo Guide](./AUTO-COMBO-GUIDE.md) for details.
|
||||
|
||||
---
|
||||
|
||||
## Need Help?
|
||||
|
||||
- **[Troubleshooting](./TROUBLESHOOTING.md)** — Common issues and fixes
|
||||
- **[Discord](https://discord.gg/EkzRkpzKYt)** — Community support
|
||||
- **[GitHub Issues](https://github.com/diegosouzapw/OmniRoute/issues)** — Report bugs
|
||||
@@ -0,0 +1,504 @@
|
||||
---
|
||||
title: "Troubleshooting"
|
||||
version: 3.8.40
|
||||
lastUpdated: 2026-06-28
|
||||
---
|
||||
|
||||
# Troubleshooting
|
||||
|
||||
> **For Users**: Looking for quick fixes? See the [Quick Reference](#quick-reference) below.
|
||||
|
||||
🌐 **Languages:** 🇺🇸 [English](./TROUBLESHOOTING.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/guides/TROUBLESHOOTING.md) | 🇪🇸 [Español](../i18n/es/docs/guides/TROUBLESHOOTING.md) | 🇫🇷 [Français](../i18n/fr/docs/guides/TROUBLESHOOTING.md) | 🇮🇹 [Italiano](../i18n/it/docs/guides/TROUBLESHOOTING.md) | 🇷🇺 [Русский](../i18n/ru/docs/guides/TROUBLESHOOTING.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/guides/TROUBLESHOOTING.md) | 🇩🇪 [Deutsch](../i18n/de/docs/guides/TROUBLESHOOTING.md) | 🇮🇳 [हिन्दी](../i18n/in/docs/guides/TROUBLESHOOTING.md) | 🇹🇭 [ไทย](../i18n/th/docs/guides/TROUBLESHOOTING.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/guides/TROUBLESHOOTING.md) | 🇸🇦 [العربية](../i18n/ar/docs/guides/TROUBLESHOOTING.md) | 🇯🇵 [日本語](../i18n/ja/docs/guides/TROUBLESHOOTING.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/guides/TROUBLESHOOTING.md) | 🇧🇬 [Български](../i18n/bg/docs/guides/TROUBLESHOOTING.md) | 🇩🇰 [Dansk](../i18n/da/docs/guides/TROUBLESHOOTING.md) | 🇫🇮 [Suomi](../i18n/fi/docs/guides/TROUBLESHOOTING.md) | 🇮🇱 [עברית](../i18n/he/docs/guides/TROUBLESHOOTING.md) | 🇭🇺 [Magyar](../i18n/hu/docs/guides/TROUBLESHOOTING.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/guides/TROUBLESHOOTING.md) | 🇰🇷 [한국어](../i18n/ko/docs/guides/TROUBLESHOOTING.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/guides/TROUBLESHOOTING.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/guides/TROUBLESHOOTING.md) | 🇳🇴 [Norsk](../i18n/no/docs/guides/TROUBLESHOOTING.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/guides/TROUBLESHOOTING.md) | 🇷🇴 [Română](../i18n/ro/docs/guides/TROUBLESHOOTING.md) | 🇵🇱 [Polski](../i18n/pl/docs/guides/TROUBLESHOOTING.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/guides/TROUBLESHOOTING.md) | 🇸🇪 [Svenska](../i18n/sv/docs/guides/TROUBLESHOOTING.md) | 🇵🇭 [Filipino](../i18n/phi/docs/guides/TROUBLESHOOTING.md) | 🇨🇿 [Čeština](../i18n/cs/docs/guides/TROUBLESHOOTING.md)
|
||||
|
||||
Common problems and solutions for OmniRoute.
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference
|
||||
|
||||
**New to OmniRoute?** Start here — these solve 90% of problems:
|
||||
|
||||
| I see this | What it means | What to do |
|
||||
| ----------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------- |
|
||||
| "Can't connect" | OmniRoute isn't running | Run `omniroute` or `docker restart omniroute` |
|
||||
| "Invalid API key" | Your key is wrong or expired | Re-copy the key from the provider's website |
|
||||
| "Rate limit exceeded" | You're sending too many requests | Wait 1 minute, or use `model: "auto"` for automatic fallback |
|
||||
| "Quota exceeded" | You've used up your free/paid quota | Connect more providers, or use free providers (Kiro, Pollinations) |
|
||||
| "Slow responses" | Provider is busy or far away | Use `model: "auto/fast"` or connect a faster provider (Groq, Cerebras) |
|
||||
| "Wrong provider used" | `auto` picked a different provider | That's normal! `auto` picks the best one. Force a specific provider with `model: "openai/gpt-4o"` |
|
||||
| "502 Bad Gateway" | Provider is down | Wait and retry, or use `model: "auto"` to switch providers |
|
||||
| "401 Unauthorized" | Your credentials are wrong | Check your API key or re-authenticate with OAuth |
|
||||
| "429 Too Many Requests" | Rate limited | Wait 1 minute, or connect more providers |
|
||||
|
||||
**Still stuck?** See the [Quick Fixes](#quick-fixes) below, or ask on [Discord](https://discord.gg/EkzRkpzKYt).
|
||||
|
||||
---
|
||||
|
||||
## Quick Fixes
|
||||
|
||||
| Problem | Solution |
|
||||
| --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| First login not working | Set `INITIAL_PASSWORD` in `.env` (no hardcoded default) |
|
||||
| Dashboard opens on wrong port | Set `PORT=20128` and `NEXT_PUBLIC_BASE_URL=http://localhost:20128` |
|
||||
| No logs written to disk | Set `APP_LOG_TO_FILE=true` and verify call log capture is enabled |
|
||||
| EACCES: permission denied | Set `DATA_DIR=/path/to/writable/dir` to override `~/.omniroute` |
|
||||
| Routing strategy not saving | Update to the latest v3.x release (Zod schema fix for settings persistence shipped in earlier versions) |
|
||||
| Login crash / blank page | Check Node.js version — see [Node.js Compatibility](#nodejs-compatibility) below |
|
||||
| `dlopen` / `slice is not valid mach-o file` (macOS) | Run `cd $(npm root -g)/omniroute/app && npm rebuild better-sqlite3 && omniroute` — see [macOS native module rebuild](#macos-native-module-rebuild) below |
|
||||
| Proxy "fetch failed" | Ensure proxy config is set at the correct level — see [Proxy Issues](#proxy-issues) below |
|
||||
|
||||
---
|
||||
|
||||
## Node.js Compatibility
|
||||
|
||||
<a name="nodejs-compatibility"></a>
|
||||
|
||||
### Login page crashes or shows "Module self-registration" error
|
||||
|
||||
**Cause:** You are running a Node.js version outside OmniRoute's approved secure runtime floor. The most common case is running an older Node 22 or 24 patch level that falls below the patched security floor OmniRoute requires.
|
||||
|
||||
**Symptoms:**
|
||||
|
||||
- Login page shows a blank screen or a server error
|
||||
- Console shows `Error: Module did not self-register` or similar native binding errors
|
||||
- The login page shows an **orange warning banner** with your Node version if the runtime is outside the supported secure policy
|
||||
|
||||
**Fix:**
|
||||
|
||||
1. Install a supported Node.js LTS release (recommended: Node.js 24.x):
|
||||
```bash
|
||||
nvm install 24
|
||||
nvm use 24
|
||||
```
|
||||
2. Verify your version: `node --version` should show `v24.0.0` or newer on the 24.x LTS line
|
||||
3. Reinstall OmniRoute: `npm install -g omniroute`
|
||||
4. Restart: `omniroute`
|
||||
|
||||
> **Supported secure versions:** `>=22.22.2 <23` or `>=24.0.0 <27`. Node.js 24.x LTS (Krypton) and Node.js 26 are fully supported.
|
||||
|
||||
### macOS: `dlopen` / "slice is not valid mach-o file"
|
||||
|
||||
<a name="macos-native-module-rebuild"></a>
|
||||
|
||||
**Cause:** After a global `npm install -g omniroute`, the `better-sqlite3` native binary inside the package may have been compiled for a different architecture or Node.js ABI than what is running locally. This is common on macOS (both Apple Silicon and Intel) when the pre-built binary does not match your environment.
|
||||
|
||||
**Symptoms:**
|
||||
|
||||
- Server fails immediately on startup with a `dlopen` error
|
||||
- Error contains `slice is not valid mach-o file`
|
||||
- Full example:
|
||||
|
||||
```
|
||||
dlopen(/Users/<user>/.nvm/versions/node/v24.14.1/lib/node_modules/omniroute/app/node_modules/better-sqlite3/build/Release/better_sqlite3.node, 0x0001): tried: '...' (slice is not valid mach-o file)
|
||||
```
|
||||
|
||||
**Fix — rebuild for your local environment (no Node.js downgrade required):**
|
||||
|
||||
```bash
|
||||
cd $(npm root -g)/omniroute/app
|
||||
npm rebuild better-sqlite3
|
||||
omniroute
|
||||
```
|
||||
|
||||
> **Note:** This recompiles the native binding against your local Node.js version and CPU architecture, resolving the binary mismatch. The officially supported runtime range is **`>=22.22.2 <23` or `>=24.0.0 <27`** (`SUPPORTED_NODE_RANGE` in `src/shared/utils/nodeRuntimeSupport.ts`, aligned with the `package.json` `engines` field). Node.js 24.x LTS (Krypton) and Node.js 26 are fully supported with `better-sqlite3` v12.x.
|
||||
|
||||
---
|
||||
|
||||
## Proxy Issues
|
||||
|
||||
<a name="proxy-issues"></a>
|
||||
|
||||
### Provider validation shows "fetch failed"
|
||||
|
||||
**Cause:** The API key validation endpoint (`POST /api/providers/validate`) was previously bypassing proxy configuration, causing failures in environments that require proxy routing.
|
||||
|
||||
**Fix (v3.5.5+):** This is now fixed. Provider validation routes through `runWithProxyContext`, honoring provider-level and global proxy settings automatically.
|
||||
|
||||
### Token health check fails with "fetch failed"
|
||||
|
||||
**Cause:** Background OAuth token refresh was not resolving proxy configuration per connection.
|
||||
|
||||
**Fix (v3.5.5+):** The token health check scheduler now resolves proxy config per connection before attempting refresh. Update to v3.5.5+.
|
||||
|
||||
### SOCKS5 proxy returns "invalid onRequestStart method"
|
||||
|
||||
**Cause:** On Node.js 22, the undici@8 dispatcher is incompatible with Node's built-in `fetch()` implementation.
|
||||
|
||||
**Fix (v3.5.5+):** OmniRoute now uses undici's own `fetch()` function when a proxy dispatcher is active, ensuring consistent behavior. Update to v3.5.5+.
|
||||
|
||||
---
|
||||
|
||||
## Provider Issues
|
||||
|
||||
### "Language model did not provide messages"
|
||||
|
||||
**Cause:** Provider quota exhausted.
|
||||
|
||||
**Fix:**
|
||||
|
||||
1. Check dashboard quota tracker
|
||||
2. Use a combo with fallback tiers
|
||||
3. Switch to cheaper/free tier
|
||||
|
||||
### Rate Limiting
|
||||
|
||||
**Cause:** Subscription quota exhausted.
|
||||
|
||||
**Fix:**
|
||||
|
||||
- Add fallback: `cc/claude-opus-4-6 → glm/glm-4.7 → if/kimi-k2-thinking`
|
||||
- Use GLM/MiniMax as cheap backup
|
||||
|
||||
### OAuth Token Expired
|
||||
|
||||
OmniRoute auto-refreshes tokens. If issues persist:
|
||||
|
||||
1. Dashboard → Provider → Reconnect
|
||||
2. Delete and re-add the provider connection
|
||||
|
||||
### Kiro multi-account: second account invalidates the first
|
||||
|
||||
**Cause:** Kiro's backend enforces a single active session per OIDC client registration.
|
||||
When two accounts share the same registered client (connections imported before v3.8.0),
|
||||
refreshing one account's token invalidates the other's refresh token.
|
||||
|
||||
**Fix (v3.8.0+):** Re-import affected connections.
|
||||
Starting with v3.8.0, every new Kiro connection created via **Import Token**,
|
||||
**Google/GitHub social login**, or **Auto-Import** automatically registers its own
|
||||
dedicated OIDC client. The connection is therefore fully isolated and refreshing one
|
||||
account has no effect on any other account.
|
||||
|
||||
Connections that were imported _before_ v3.8.0 do not carry a per-connection client
|
||||
registration. Those connections continue to use the shared social-auth refresh endpoint.
|
||||
To gain isolation, delete the old connection from Dashboard → Providers and re-add it
|
||||
via any of the three import flows.
|
||||
|
||||
For full details and step-by-step instructions for adding two Kiro accounts side by side,
|
||||
see [`docs/guides/KIRO_SETUP.md`](../guides/KIRO_SETUP.md).
|
||||
|
||||
---
|
||||
|
||||
## Cloud Issues
|
||||
|
||||
### Cloud Sync Errors
|
||||
|
||||
1. Verify `BASE_URL` points to your running instance (e.g., `http://localhost:20128`)
|
||||
2. Verify `CLOUD_URL` points to your cloud endpoint (e.g., `https://omniroute.dev`)
|
||||
3. Keep `NEXT_PUBLIC_*` values aligned with server-side values
|
||||
|
||||
### Cloud `stream=false` Returns 500
|
||||
|
||||
**Symptom:** `Unexpected token 'd'...` on cloud endpoint for non-streaming calls.
|
||||
|
||||
**Cause:** Upstream returns SSE payload while client expects JSON.
|
||||
|
||||
**Workaround:** Use `stream=true` for cloud direct calls. Local runtime includes SSE→JSON fallback.
|
||||
|
||||
### Cloud Says Connected but "Invalid API key"
|
||||
|
||||
1. Create a fresh key from local dashboard (`/api/keys`)
|
||||
2. Run cloud sync: Enable Cloud → Sync Now
|
||||
3. Old/non-synced keys can still return `401` on cloud
|
||||
|
||||
---
|
||||
|
||||
## Docker Issues
|
||||
|
||||
### CLI Tool Shows Not Installed
|
||||
|
||||
1. Check runtime fields: `curl http://localhost:20128/api/cli-tools/runtime/codex | jq`
|
||||
2. For portable mode: use image target `runner-cli` (bundled CLIs)
|
||||
3. For host mount mode: set `CLI_EXTRA_PATHS` and mount host bin directory as read-only
|
||||
4. If `installed=true` and `runnable=false`: binary was found but failed healthcheck
|
||||
|
||||
### Quick Runtime Validation
|
||||
|
||||
```bash
|
||||
curl -s http://localhost:20128/api/cli-tools/codex-settings | jq '{installed,runnable,commandPath,runtimeMode,reason}'
|
||||
curl -s http://localhost:20128/api/cli-tools/claude-settings | jq '{installed,runnable,commandPath,runtimeMode,reason}'
|
||||
curl -s http://localhost:20128/api/cli-tools/openclaw-settings | jq '{installed,runnable,commandPath,runtimeMode,reason}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Cost Issues
|
||||
|
||||
### High Costs
|
||||
|
||||
1. Check usage stats in Dashboard → Usage
|
||||
2. Switch primary model to GLM/MiniMax
|
||||
3. Use free tier (Qoder, Kiro) for non-critical tasks
|
||||
4. Set cost budgets per API key: Dashboard → API Keys → Budget
|
||||
|
||||
---
|
||||
|
||||
## Debugging
|
||||
|
||||
### Enable Log Files
|
||||
|
||||
Set `APP_LOG_TO_FILE=true` in your `.env` file. Application logs are written under `logs/`.
|
||||
Request artifacts are stored under `${DATA_DIR}/call_logs/` when the call log pipeline is
|
||||
enabled in settings.
|
||||
When pipeline capture is enabled, set `CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS=false` to omit
|
||||
stream chunk payloads, or tune `CALL_LOG_PIPELINE_MAX_SIZE_KB` to change the artifact cap in KB.
|
||||
|
||||
### Check Provider Health
|
||||
|
||||
```bash
|
||||
# Health dashboard
|
||||
http://localhost:20128/dashboard/health
|
||||
|
||||
# API health check
|
||||
curl http://localhost:20128/api/monitoring/health
|
||||
```
|
||||
|
||||
### Runtime Storage
|
||||
|
||||
- Main state: `${DATA_DIR}/storage.sqlite` (providers, combos, aliases, keys, settings)
|
||||
- Usage: SQLite tables in `storage.sqlite` (`usage_history`, `call_logs`, `proxy_logs`) + optional `${DATA_DIR}/call_logs/`
|
||||
- Application logs: `<repo>/logs/...` (when `APP_LOG_TO_FILE=true`)
|
||||
- Call log artifacts: `${DATA_DIR}/call_logs/YYYY-MM-DD/...` when the call log pipeline is enabled
|
||||
|
||||
The Request Logs page's **Clean history** action clears `call_logs`, legacy
|
||||
`request_detail_logs`, and the local `${DATA_DIR}/call_logs/` artifact directory.
|
||||
|
||||
---
|
||||
|
||||
## Circuit Breaker Issues
|
||||
|
||||
### Provider stuck in OPEN state
|
||||
|
||||
When a provider's circuit breaker is OPEN, requests are blocked until the cooldown expires.
|
||||
|
||||
**Fix:**
|
||||
|
||||
1. Go to **Dashboard → Settings → Resilience**
|
||||
2. Check the circuit breaker card for the affected provider
|
||||
3. Click **Reset All** to clear all breakers, or wait for the cooldown to expire
|
||||
4. Verify the provider is actually available before resetting
|
||||
|
||||
### Provider keeps tripping the circuit breaker
|
||||
|
||||
If a provider repeatedly enters OPEN state:
|
||||
|
||||
1. Check **Dashboard → Health → Provider Health** for the failure pattern
|
||||
2. Go to **Settings → Resilience → Provider Profiles** and increase the failure threshold
|
||||
3. Check if the provider has changed API limits or requires re-authentication
|
||||
4. Review latency telemetry — high latency may cause timeout-based failures
|
||||
|
||||
---
|
||||
|
||||
## Audio Transcription Issues
|
||||
|
||||
### "Unsupported model" error
|
||||
|
||||
- Ensure you're using the correct prefix: `deepgram/nova-3` or `assemblyai/best`
|
||||
- Verify the provider is connected in **Dashboard → Providers**
|
||||
|
||||
### Transcription returns empty or fails
|
||||
|
||||
- Check supported audio formats: `mp3`, `wav`, `m4a`, `flac`, `ogg`, `webm`
|
||||
- Verify file size is within provider limits (typically < 25MB)
|
||||
- Check provider API key validity in the provider card
|
||||
|
||||
---
|
||||
|
||||
## Translator Debugging
|
||||
|
||||
Use **Dashboard → Translator** to debug format translation issues:
|
||||
|
||||
| Mode | When to Use |
|
||||
| ---------------- | -------------------------------------------------------------------------------------------- |
|
||||
| **Playground** | Compare input/output formats side by side — paste a failing request to see how it translates |
|
||||
| **Chat Tester** | Send live messages and inspect the full request/response payload including headers |
|
||||
| **Test Bench** | Run batch tests across format combinations to find which translations are broken |
|
||||
| **Live Monitor** | Watch real-time request flow to catch intermittent translation issues |
|
||||
|
||||
### Common format issues
|
||||
|
||||
- **Thinking tags not appearing** — Check if the target provider supports thinking and the thinking budget setting
|
||||
- **Tool calls dropping** — Some format translations may strip unsupported fields; verify in Playground mode
|
||||
- **System prompt missing** — Claude and Gemini handle system prompts differently; check translation output
|
||||
- **SDK returns raw string instead of object** — Resolved in v1.x; response sanitizer strips non-standard fields (`x_groq`, `usage_breakdown`, etc.) that cause OpenAI SDK Pydantic validation failures. If you still see this on v3.x+, please file an issue.
|
||||
- **GLM/ERNIE rejects `system` role** — Resolved in v1.x; role normalizer automatically merges system messages into user messages for incompatible models. If you still see this on v3.x+, please file an issue.
|
||||
- **`developer` role not recognized** — Resolved in v1.x; automatically converted to `system` for non-OpenAI providers. If you still see this on v3.x+, please file an issue.
|
||||
- **`json_schema` not working with Gemini** — Resolved in v1.x; `response_format` is now converted to Gemini's `responseMimeType` + `responseSchema`. If you still see this on v3.x+, please file an issue.
|
||||
|
||||
---
|
||||
|
||||
## Resilience Settings
|
||||
|
||||
### Auto rate-limit not triggering
|
||||
|
||||
- Auto rate-limit only applies to API key providers (not OAuth/subscription)
|
||||
- Verify **Settings → Resilience → Provider Profiles** has auto-rate-limit enabled
|
||||
- Check if the provider returns `429` status codes or `Retry-After` headers
|
||||
|
||||
### Tuning exponential backoff
|
||||
|
||||
Provider profiles support these settings:
|
||||
|
||||
- **Base delay** — Initial wait time after first failure (default: 1s)
|
||||
- **Max delay** — Maximum wait time cap (default: 30s)
|
||||
- **Multiplier** — How much to increase delay per consecutive failure (default: 2x)
|
||||
|
||||
### Anti-thundering herd
|
||||
|
||||
When many concurrent requests hit a rate-limited provider, OmniRoute uses mutex + auto rate-limiting to serialize requests and prevent cascading failures. This is automatic for API key providers.
|
||||
|
||||
---
|
||||
|
||||
## Optional RAG / LLM failure taxonomy (16 problems)
|
||||
|
||||
Some OmniRoute users place the gateway in front of RAG or agent stacks. In those setups it is common to see a strange pattern: OmniRoute looks healthy (providers up, routing profiles ok, no rate limit alerts) but the final answer is still wrong.
|
||||
|
||||
In practice these incidents usually come from the downstream RAG pipeline, not from the gateway itself.
|
||||
|
||||
If you want a shared vocabulary to describe those failures you can use the WFGY ProblemMap, an external MIT license text resource that defines sixteen recurring RAG / LLM failure patterns. At a high level it covers:
|
||||
|
||||
- retrieval drift and broken context boundaries
|
||||
- empty or stale indexes and vector stores
|
||||
- embedding versus semantic mismatch
|
||||
- prompt assembly and context window issues
|
||||
- logic collapse and overconfident answers
|
||||
- long chain and agent coordination failures
|
||||
- multi agent memory and role drift
|
||||
- deployment and bootstrap ordering problems
|
||||
|
||||
The idea is simple:
|
||||
|
||||
1. When you investigate a bad response, capture:
|
||||
- user task and request
|
||||
- route or provider combo in OmniRoute
|
||||
- any RAG context used downstream (retrieved documents, tool calls, etc)
|
||||
2. Map the incident to one or two WFGY ProblemMap numbers (`No.1` … `No.16`).
|
||||
3. Store the number in your own dashboard, runbook, or incident tracker next to the OmniRoute logs.
|
||||
4. Use the corresponding WFGY page to decide whether you need to change your RAG stack, retriever, or routing strategy.
|
||||
|
||||
Full text and concrete recipes live here (MIT license, text only):
|
||||
|
||||
[WFGY ProblemMap README](https://github.com/onestardao/WFGY/blob/main/ProblemMap/README.md)
|
||||
|
||||
You can ignore this section if you do not run RAG or agent pipelines behind OmniRoute.
|
||||
|
||||
---
|
||||
|
||||
## v3.8.0 Known Issues
|
||||
|
||||
Issues specific to the v3.8.0 release and their current workarounds. If a fix lands in a later patch, the entry will be updated or removed.
|
||||
|
||||
### Windsurf OAuth flow fails with 401
|
||||
|
||||
**Symptoms:**
|
||||
|
||||
- "401 unauthorized" while completing the Windsurf OAuth flow from the dashboard
|
||||
- Windsurf provider card stays in "needs reconnection" state after the callback
|
||||
|
||||
**Causes:**
|
||||
|
||||
- `WINDSURF_FIREBASE_API_KEY` env var missing or empty
|
||||
- `WINDSURF_API_KEY` misconfigured or pointing at a stale token
|
||||
- Local firewall/proxy blocking the OAuth callback
|
||||
|
||||
**Fix:**
|
||||
|
||||
1. Verify both `WINDSURF_FIREBASE_API_KEY` and `WINDSURF_API_KEY` are set in `.env`
|
||||
2. Restart OmniRoute so the new env values are picked up
|
||||
3. Re-run the OAuth flow from **Dashboard → Providers → Windsurf → Reconnect**
|
||||
|
||||
### Devin CLI auth failures
|
||||
|
||||
**Symptoms:**
|
||||
|
||||
- "Devin CLI not found" or "auth failed" when invoking Devin-backed tools
|
||||
- CLI runtime check reports `installed=false`
|
||||
|
||||
**Causes:**
|
||||
|
||||
- `CLI_DEVIN_BIN` points to a path that does not exist
|
||||
- Devin CLI is not installed on the host
|
||||
|
||||
**Fix:**
|
||||
|
||||
1. Install the Devin CLI for your platform
|
||||
2. Set `CLI_DEVIN_BIN=/usr/local/bin/devin` (or the real path) in `.env`
|
||||
3. Restart OmniRoute and re-test from **Dashboard → CLI Tools**
|
||||
|
||||
### Model cooldown stuck (manual reset)
|
||||
|
||||
**Symptoms:**
|
||||
|
||||
- A model stays listed in cooldown even after the expiration time has passed
|
||||
- Requests still skip the model in combo routing despite the timestamp being in the past
|
||||
|
||||
**Manual reset:**
|
||||
|
||||
- **Dashboard:** **Settings → Model Cooldowns** → click **Re-enable** on the affected card
|
||||
- **API:** `DELETE /api/resilience/model-cooldowns` with management auth headers
|
||||
|
||||
### Command Code provider connection fails with 403
|
||||
|
||||
**Symptoms:**
|
||||
|
||||
- 403 when testing the Command Code provider connection
|
||||
- The provider card shows "unauthorized" after a fresh add
|
||||
|
||||
**Cause:** The OAuth flow did not complete (callback not received or token not persisted).
|
||||
|
||||
**Fix:**
|
||||
|
||||
- Run `omniroute providers` from the CLI to re-trigger the OAuth flow, or
|
||||
- Re-run OAuth from **Dashboard → Providers → Command Code → Reconnect**
|
||||
|
||||
### ModelScope returns aggressive 429 cooldowns
|
||||
|
||||
**Symptoms:**
|
||||
|
||||
- Very short or immediate cooldowns on ModelScope after a small burst of requests
|
||||
- Combo routing skips ModelScope earlier than expected
|
||||
|
||||
**Cause:** ModelScope emits provider-specific `Retry-After` headers. v3.8.0 ships dedicated handling for those headers, so older versions misread them as generic rate-limit hints.
|
||||
|
||||
**Fix:**
|
||||
|
||||
- Ensure you are on v3.8.0 or later
|
||||
- Verify the `useUpstream429BreakerHints` toggle is enabled under **Settings → Resilience**
|
||||
|
||||
### OMNIROUTE_WS_BRIDGE_SECRET missing in production
|
||||
|
||||
**Symptoms:**
|
||||
|
||||
- 401 on every Codex/Responses WebSocket bridge request when running on a remote production host
|
||||
- WebSocket bridge handshake closes immediately after connect
|
||||
|
||||
**Cause:** The `OMNIROUTE_WS_BRIDGE_SECRET` env var is missing from the production environment.
|
||||
|
||||
**Fix:**
|
||||
|
||||
1. Generate a random secret: `openssl rand -hex 32`
|
||||
2. Set `OMNIROUTE_WS_BRIDGE_SECRET=<random-secret>` in the production server env (and any client that talks to the bridge)
|
||||
3. Restart OmniRoute
|
||||
|
||||
### Responses API: background mode degraded to synchronous
|
||||
|
||||
**Symptoms:**
|
||||
|
||||
- Warning logged: `background mode degraded to synchronous`
|
||||
- A `background: true` request returns a normal synchronous response instead of a background job handle
|
||||
|
||||
**Cause:** v3.8.0 intentionally degrades `background: true` on the Responses API to synchronous execution while emitting a warning. Full async background execution is a future deliverable.
|
||||
|
||||
**Fix:**
|
||||
|
||||
- Adjust the client to call without `background`, or
|
||||
- Wait for a later release that ships full async background mode (track the changelog)
|
||||
|
||||
---
|
||||
|
||||
## Still Stuck?
|
||||
|
||||
- **GitHub Issues**: [github.com/diegosouzapw/OmniRoute/issues](https://github.com/diegosouzapw/OmniRoute/issues)
|
||||
- **Architecture**: See [`docs/architecture/ARCHITECTURE.md`](../architecture/ARCHITECTURE.md) for internal details
|
||||
- **API Reference**: See [`docs/reference/API_REFERENCE.md`](../reference/API_REFERENCE.md) for all endpoints
|
||||
- **Health Dashboard**: Check **Dashboard → Health** for real-time system status
|
||||
- **Translator**: Use **Dashboard → Translator** to debug format issues
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"title": "Getting Started",
|
||||
"description": "Get started with OmniRoute in minutes — no technical background needed",
|
||||
"pages": [
|
||||
"QUICK-START",
|
||||
"AUTO-COMBO-GUIDE",
|
||||
"PROVIDERS-GUIDE",
|
||||
"FREE-TIERS-GUIDE",
|
||||
"TROUBLESHOOTING"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user