From c5d110dd35e405589afa56a1575a27df8869adc6 Mon Sep 17 00:00:00 2001 From: 0-don Date: Thu, 9 Jul 2026 23:34:49 +0200 Subject: [PATCH 1/2] feat: add UnoRouter provider --- core/llm/autodetect.ts | 2 + core/llm/llms/OpenAI-compatible.vitest.ts | 6 +++ core/llm/llms/UnoRouter.ts | 13 ++++++ core/llm/llms/index.ts | 2 + .../model-providers/more/unorouter.mdx | 42 +++++++++++++++++++ docs/docs.json | 1 + gui/public/logos/unorouter.svg | 1 + gui/src/pages/AddNewModel/configs/models.ts | 31 ++++++++++++++ .../pages/AddNewModel/configs/providers.ts | 22 ++++++++++ 9 files changed, 120 insertions(+) create mode 100644 core/llm/llms/UnoRouter.ts create mode 100644 docs/customize/model-providers/more/unorouter.mdx create mode 100644 gui/public/logos/unorouter.svg diff --git a/core/llm/autodetect.ts b/core/llm/autodetect.ts index c8511554b8b..8b959929a6f 100644 --- a/core/llm/autodetect.ts +++ b/core/llm/autodetect.ts @@ -65,6 +65,7 @@ const PROVIDER_HANDLES_TEMPLATING: string[] = [ "relace", "openrouter", "clawrouter", + "unorouter", "deepseek", "xAI", "minimax", @@ -123,6 +124,7 @@ const PROVIDER_SUPPORTS_IMAGES: string[] = [ "sagemaker", "openrouter", "clawrouter", + "unorouter", "venice", "sambanova", "vertexai", diff --git a/core/llm/llms/OpenAI-compatible.vitest.ts b/core/llm/llms/OpenAI-compatible.vitest.ts index 402fb7e7585..42b0cd9a38b 100644 --- a/core/llm/llms/OpenAI-compatible.vitest.ts +++ b/core/llm/llms/OpenAI-compatible.vitest.ts @@ -10,6 +10,7 @@ import OpenRouter from "./OpenRouter.js"; import xAI from "./xAI.js"; import Mistral from "./Mistral.js"; import Mimo from "./Mimo.js"; +import UnoRouter from "./UnoRouter.js"; import LMStudio from "./LMStudio.js"; import Cerebras from "./Cerebras.js"; import DeepInfra from "./DeepInfra.js"; @@ -306,6 +307,11 @@ createOpenAISubclassTests(Mimo, { defaultApiBase: "https://api.xiaomimimo.com/v1/", }); +createOpenAISubclassTests(UnoRouter, { + providerName: "unorouter", + defaultApiBase: "https://api.unorouter.com/v1/", +}); + createOpenAISubclassTests(LMStudio, { providerName: "lmstudio", defaultApiBase: "http://localhost:1234/v1/", diff --git a/core/llm/llms/UnoRouter.ts b/core/llm/llms/UnoRouter.ts new file mode 100644 index 00000000000..d16190bb1a8 --- /dev/null +++ b/core/llm/llms/UnoRouter.ts @@ -0,0 +1,13 @@ +import { LLMOptions } from "../../index.js"; + +import OpenAI from "./OpenAI.js"; + +class UnoRouter extends OpenAI { + static providerName = "unorouter"; + static defaultOptions: Partial = { + apiBase: "https://api.unorouter.com/v1/", + model: "deepseek-v4-flash:free", + }; +} + +export default UnoRouter; diff --git a/core/llm/llms/index.ts b/core/llm/llms/index.ts index 4978f0617f2..d0ff3b09b22 100644 --- a/core/llm/llms/index.ts +++ b/core/llm/llms/index.ts @@ -63,6 +63,7 @@ import TARS from "./TARS"; import TestLLM from "./Test"; import TextGenWebUI from "./TextGenWebUI"; import Together from "./Together"; +import UnoRouter from "./UnoRouter"; import Venice from "./Venice"; import VertexAI from "./VertexAI"; import Vllm from "./Vllm"; @@ -120,6 +121,7 @@ export const LLMClasses = [ Asksage, Nebius, Nous, + UnoRouter, Venice, VertexAI, xAI, diff --git a/docs/customize/model-providers/more/unorouter.mdx b/docs/customize/model-providers/more/unorouter.mdx new file mode 100644 index 00000000000..ab353f38f08 --- /dev/null +++ b/docs/customize/model-providers/more/unorouter.mdx @@ -0,0 +1,42 @@ +--- +title: "How to Configure UnoRouter with Continue" +sidebarTitle: "UnoRouter" +--- + + + Get your API key from the [UnoRouter dashboard](https://unorouter.com/token) + + +UnoRouter is an open-source OpenAI-compatible gateway serving 200+ models (Claude, GPT, Gemini, DeepSeek, Kimi, GLM, Qwen and more) behind a single API key. Models with a `:free` suffix cost nothing; browse the full catalog at [unorouter.com/models](https://unorouter.com/models). + +## Configuration + + + + ```yaml title="config.yaml" + name: My Config + version: 0.0.1 + schema: v1 + + models: + - name: + provider: unorouter + model: deepseek-v4-flash:free + apiKey: + ``` + + + ```json title="config.json" + { + "models": [ + { + "title": "", + "provider": "unorouter", + "model": "deepseek-v4-flash:free", + "apiKey": "" + } + ] + } + ``` + + diff --git a/docs/docs.json b/docs/docs.json index b7a1d83f13a..e598d5da925 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -119,6 +119,7 @@ "customize/model-providers/more/nvidia", "customize/model-providers/more/tensorix", "customize/model-providers/more/together", + "customize/model-providers/more/unorouter", "customize/model-providers/more/xAI", "customize/model-providers/more/zai" ] diff --git a/gui/public/logos/unorouter.svg b/gui/public/logos/unorouter.svg new file mode 100644 index 00000000000..b5265699a72 --- /dev/null +++ b/gui/public/logos/unorouter.svg @@ -0,0 +1 @@ +UnoRouter diff --git a/gui/src/pages/AddNewModel/configs/models.ts b/gui/src/pages/AddNewModel/configs/models.ts index 7065248d68f..7183a96051f 100644 --- a/gui/src/pages/AddNewModel/configs/models.ts +++ b/gui/src/pages/AddNewModel/configs/models.ts @@ -3312,6 +3312,37 @@ export const models: { [key: string]: ModelPackage } = { isOpenSource: false, }, + // UnoRouter models + unorouterDeepseekV4FlashFree: { + title: "deepseek-v4-flash:free", + description: + "DeepSeek V4 Flash on UnoRouter's free tier; fast, long context, costs nothing", + refUrl: "https://unorouter.com/models", + params: { + title: "deepseek-v4-flash:free", + model: "deepseek-v4-flash:free", + contextLength: 128_000, + apiKey: "", + }, + providerOptions: ["unorouter"], + icon: "unorouter.svg", + isOpenSource: true, + }, + unorouterClaudeSonnet5: { + title: "claude-sonnet-5", + description: "Anthropic Claude Sonnet 5 served through UnoRouter", + refUrl: "https://unorouter.com/models", + params: { + title: "claude-sonnet-5", + model: "claude-sonnet-5", + contextLength: 200_000, + apiKey: "", + }, + providerOptions: ["unorouter"], + icon: "unorouter.svg", + isOpenSource: false, + }, + // Inception Labs models mercury2: { title: "Mercury 2", diff --git a/gui/src/pages/AddNewModel/configs/providers.ts b/gui/src/pages/AddNewModel/configs/providers.ts index 9e2aba08c5c..c512ebdfd0a 100644 --- a/gui/src/pages/AddNewModel/configs/providers.ts +++ b/gui/src/pages/AddNewModel/configs/providers.ts @@ -224,6 +224,28 @@ export const providers: Partial> = { ], }, + unorouter: { + title: "UnoRouter", + provider: "unorouter", + description: + "UnoRouter is an open-source gateway serving 200+ models, most with a genuine free tier.", + longDescription: `To get started with UnoRouter, sign up at [unorouter.com](https://unorouter.com/) (Discord or GitHub, no card) and create an API key on the [token page](https://unorouter.com/token). Models with a \`:free\` suffix cost nothing.`, + icon: "unorouter.svg", + tags: [ModelProviderTags.RequiresApiKey, ModelProviderTags.OpenSource], + apiKeyUrl: "https://unorouter.com/token", + collectInputFor: [ + { + inputType: "text", + key: "apiKey", + label: "API Key", + placeholder: "Enter your UnoRouter API key", + required: true, + }, + ...completionParamsInputsConfigs, + ], + packages: [models.unorouterDeepseekV4FlashFree, models.unorouterClaudeSonnet5], + }, + moonshot: { title: "Moonshot", provider: "moonshot", From 20f4d97d20ec91d31498ea13a58907a6d48ea234 Mon Sep 17 00:00:00 2001 From: 0-don Date: Fri, 10 Jul 2026 00:50:01 +0200 Subject: [PATCH 2/2] chore: format providers.ts --- gui/src/pages/AddNewModel/configs/providers.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gui/src/pages/AddNewModel/configs/providers.ts b/gui/src/pages/AddNewModel/configs/providers.ts index c512ebdfd0a..4d7afb01efa 100644 --- a/gui/src/pages/AddNewModel/configs/providers.ts +++ b/gui/src/pages/AddNewModel/configs/providers.ts @@ -243,7 +243,10 @@ export const providers: Partial> = { }, ...completionParamsInputsConfigs, ], - packages: [models.unorouterDeepseekV4FlashFree, models.unorouterClaudeSonnet5], + packages: [ + models.unorouterDeepseekV4FlashFree, + models.unorouterClaudeSonnet5, + ], }, moonshot: {