diff --git a/open-sse/providers/registry/index.js b/open-sse/providers/registry/index.js index 6482293a6b..f362c9f3ed 100644 --- a/open-sse/providers/registry/index.js +++ b/open-sse/providers/registry/index.js @@ -121,6 +121,10 @@ import p118 from "./selfhosted-tts.js"; import p119 from "./selfhosted-embedding.js"; import p120 from "./fish-audio.js"; import p121 from "./alitp-intl.js"; +import p122 from "./reasonix.js"; +import p123 from "./ovh.js"; +import p124 from "./joycode.js"; +import p125 from "./openmodel.js"; export default [ p0, @@ -243,4 +247,8 @@ export default [ p119, p120, p121, + p122, + p123, + p124, + p125, ]; diff --git a/open-sse/providers/registry/joycode.js b/open-sse/providers/registry/joycode.js new file mode 100644 index 0000000000..4159563f35 --- /dev/null +++ b/open-sse/providers/registry/joycode.js @@ -0,0 +1,31 @@ +import { CLAUDE_API_HEADERS } from "../shared.js"; + +export default { + id: "joycode", + priority: 122, + alias: "joycode", + uiAlias: "joycode", + display: { + name: "JD JoyCode", + icon: "code", + color: "#FF6B35", + textIcon: "JC", + website: "https://joycode.jd.com", + notice: { + apiKeyUrl: "https://joycode.jd.com/settings/api-keys", + }, + }, + category: "apikey", + transport: { + baseUrl: "https://api.joycode.jd.com/v1/chat/completions", + validateUrl: "https://api.joycode.jd.com/v1/models", + }, + models: [ + { id: "joycode-v1", name: "JoyCode V1" }, + { id: "joycode-v1-code", name: "JoyCode V1 Code" }, + ], + features: { + usage: true, + usageApikey: true, + }, +}; \ No newline at end of file diff --git a/open-sse/providers/registry/openmodel.js b/open-sse/providers/registry/openmodel.js new file mode 100644 index 0000000000..cf07d7ca7e --- /dev/null +++ b/open-sse/providers/registry/openmodel.js @@ -0,0 +1,26 @@ +export default { + id: "openmodel", + priority: 100, + alias: "openmodel", + uiAlias: "openmodel", + display: { + name: "OpenModel.ai", + icon: "smart_toy", + color: "#7C3AED", + textIcon: "OM", + website: "https://openmodel.ai", + notice: { + apiKeyUrl: "https://openmodel.ai/settings/api-keys", + text: "OpenModel.ai uses the OpenAI Responses API format (/v1/responses). Compatible with Codex, Claude Code Responses mode.", + }, + }, + category: "apikey", + transport: { + baseUrl: "https://api.openmodel.ai/v1/chat/completions", + format: "openai", + }, + models: [], + features: { + usage: true, + }, +}; diff --git a/open-sse/providers/registry/ovh.js b/open-sse/providers/registry/ovh.js new file mode 100644 index 0000000000..afc02239e2 --- /dev/null +++ b/open-sse/providers/registry/ovh.js @@ -0,0 +1,37 @@ +import { CLAUDE_API_HEADERS } from "../shared.js"; + +export default { + id: "ovh", + priority: 90, + hasFree: true, + alias: "ovh", + uiAlias: "ovh", + display: { + name: "OVH AI Endpoints", + icon: "cloud", + color: "#0078D4", + textIcon: "OV", + website: "https://ai.endpoints.ovh.com", + notice: { + text: "Free tier available with generous limits", + apiKeyUrl: "https://ai.endpoints.ovh.com/settings/api-keys", + }, + }, + category: "freeTier", + transport: { + baseUrl: "https://ai.endpoints.ovh.com/v1/chat/completions", + validateUrl: "https://ai.endpoints.ovh.com/v1/models", + }, + models: [ + { id: "ovh/mistral-7b-instruct", name: "Mistral 7B Instruct" }, + { id: "ovh/llama-3-8b-instruct", name: "Llama 3 8B Instruct" }, + { id: "ovh/llama-3-70b-instruct", name: "Llama 3 70B Instruct" }, + { id: "ovh/mixtral-8x7b-instruct", name: "Mixtral 8x7B Instruct" }, + { id: "ovh/codellama-7b-instruct", name: "CodeLlama 7B Instruct" }, + { id: "ovh/codellama-34b-instruct", name: "CodeLlama 34B Instruct" }, + ], + features: { + usage: true, + usageApikey: true, + }, +}; \ No newline at end of file diff --git a/open-sse/providers/registry/reasonix.js b/open-sse/providers/registry/reasonix.js new file mode 100644 index 0000000000..961bcb573a --- /dev/null +++ b/open-sse/providers/registry/reasonix.js @@ -0,0 +1,31 @@ +import { CLAUDE_API_HEADERS } from "../shared.js"; + +export default { + id: "reasonix", + priority: 121, + alias: "reasonix", + uiAlias: "reasonix", + display: { + name: "Reasonix IDE", + icon: "psychology", + color: "#8B5CF6", + textIcon: "RX", + website: "https://reasonix.ai", + notice: { + apiKeyUrl: "https://platform.reasonix.ai/api-keys", + }, + }, + category: "apikey", + transport: { + baseUrl: "https://api.reasonix.ai/v1/chat/completions", + validateUrl: "https://api.reasonix.ai/v1/models", + }, + models: [ + { id: "reasonix-v1", name: "Reasonix V1" }, + { id: "reasonix-v1-reasoning", name: "Reasonix V1 Reasoning" }, + ], + features: { + usage: true, + usageApikey: true, + }, +}; \ No newline at end of file diff --git a/umbrel-app.yml b/umbrel-app.yml new file mode 100644 index 0000000000..1ef976b608 --- /dev/null +++ b/umbrel-app.yml @@ -0,0 +1,30 @@ +name: 9router +version: "0.5.50" +description: "9Router — Local AI routing gateway. One OpenAI-compatible endpoint routes traffic across 40+ upstream providers with format translation, model-combo fallback, multi-account, and OAuth/usage tracking." +website: https://github.com/decolua/9router +submittable: true +tips: + github: + - decolua +support: https://github.com/decolua/9router/issues +gallery: + - 1.jpg + - 2.jpg + - 3.jpg +release: + date: "2026-08-05" + version: "0.5.50" +container: + tungstenFabric: false + monorepo: false + anyArchitecture: false + buildTime: "30 minutes" + startTimeout: 60 + restart: on-failure + uid: 1000 + gid: 1000 + build: + image: "" + dockerfile: "" + runners: [] + prereqs: []