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
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"test": "pnpm -r --if-present run test",

"build:base": "pnpm --filter scorpio.di run build && pnpm --filter scorpio.command run build && pnpm --filter scorpio.ai run build && pnpm --filter scorpio.tools.filesystem run build && pnpm --filter scorpio.tools.command run build",
"build:llm": "node scripts/fetch-models-dev.js && pnpm --filter scorpio.llm run build && pnpm --filter scorpio.llm.openai run build && pnpm --filter scorpio.llm.anthropic run build && pnpm --filter scorpio.llm.gemini run build && pnpm --filter scorpio.llm.ollama run build && pnpm --filter scorpio.llm.cohere run build && pnpm --filter scorpio.llm.voyage run build",
"build:llm": "node scripts/fetch-models-dev.js && pnpm --filter scorpio.llm run build && pnpm --filter scorpio.llm.openai run build && pnpm --filter scorpio.llm.anthropic run build && pnpm --filter scorpio.llm.gemini run build && pnpm --filter scorpio.llm.ollama run build && pnpm --filter scorpio.llm.cohere run build && pnpm --filter scorpio.llm.voyage run build && pnpm --filter scorpio.llm.orcarouter run build",
"build:saver": "pnpm --filter scorpio.saver run build && pnpm --filter scorpio.saver.file run build && pnpm --filter scorpio.saver.sqlite run build && pnpm --filter scorpio.saver.postgres run build",
"build:schema": "pnpm --filter plugin.schema run build && pnpm --filter @sbot/shared run build",
"build:agents": "pnpm --filter agent.skill run build && pnpm --filter agent.agenda run build && pnpm --filter agent.memory run build && pnpm --filter agent.note run build && pnpm --filter agent.wiki run build",
Expand Down
1 change: 1 addition & 0 deletions packages/apps/docs/guide/models.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Fill in provider, API key, base URL, and model name. The same connection can be
| Google Gemini | Gemini 2.0 / 2.5 Pro, Flash |
| Gemini Image | Gemini image-generation models |
| Ollama | Local models via Ollama runtime |
| OrcaRouter | OpenAI-compatible gateway for models and agents (adaptive routing, failover, zero-markup inference) |
| OpenAI-compatible | Azure OpenAI, Groq, Mistral, DeepSeek, Qwen, Together, etc. |

Any endpoint that implements the OpenAI chat completions API can be used as a provider — pick **OpenAI-compatible** and override the base URL.
Expand Down
1 change: 1 addition & 0 deletions packages/apps/docs/zh/guide/models.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
| Google Gemini | Gemini 2.0 / 2.5 Pro、Flash |
| Gemini Image | Gemini 图像生成模型 |
| Ollama | 通过 Ollama 运行时使用本地模型 |
| OrcaRouter | 面向模型与 Agent 的 OpenAI 兼容网关(自适应路由、故障转移、零加成推理) |
| OpenAI 兼容 | Azure OpenAI、Groq、Mistral、DeepSeek、Qwen、Together 等 |

任何实现了 OpenAI Chat Completions 接口的服务都可以作为供应商使用 —— 选择 **OpenAI 兼容** 并覆盖 Base URL 即可。
Expand Down
4 changes: 4 additions & 0 deletions packages/backend/llm/scorpio.llm.orcarouter/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/node_modules
/dist
/package-lock.json
/tsconfig.tsbuildinfo
20 changes: 20 additions & 0 deletions packages/backend/llm/scorpio.llm.orcarouter/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "scorpio.llm.orcarouter",
"version": "0.0.1",
"description": "OrcaRouter model provider for scorpio.llm",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": { "build": "rimraf dist && tsc -b --force" },
"dependencies": {
"@langchain/core": "catalog:",
"@langchain/openai": "^1.4.7",
"scorpio.llm": "workspace:*",
"scorpio.llm.openai": "workspace:*"
},
"private": true,
"devDependencies": {
"@types/node": "catalog:",
"rimraf": "catalog:",
"typescript": "catalog:"
}
}
30 changes: 30 additions & 0 deletions packages/backend/llm/scorpio.llm.orcarouter/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { type LlmProviderRegistry, llmProviderRegistry } from "scorpio.llm";
import { OpenAIModelService } from "scorpio.llm.openai";

/** OrcaRouter provider id, kept stable so saved model configs keep working. */
export const OrcaRouterProvider = "orcarouter";

export function registerOrcaRouterProvider(registry: LlmProviderRegistry = llmProviderRegistry): void {
registry.registerModel({
type: OrcaRouterProvider,
label: "OrcaRouter",
configSchema: {},
defaults: { baseURL: "https://api.orcarouter.ai/v1", model: "orcarouter/fusion" },
apiKeyRequired: true,
createModel: config => {
const service = new OpenAIModelService(config);
service.initialize();
return service;
},
listModels: async config => {
if (!config.apiKey) throw new Error("apiKey is required for OrcaRouter");
const base = (config.baseURL || "https://api.orcarouter.ai/v1").replace(/\/$/, "");
const res = await fetch(`${base}/models`, {
headers: { Authorization: `Bearer ${config.apiKey}` },
});
if (!res.ok) throw new Error(`Models request failed: ${res.status}`);
const data: any = await res.json();
return (data.data || []).map((model: any) => model.id as string);
},
});
}
9 changes: 9 additions & 0 deletions packages/backend/llm/scorpio.llm.orcarouter/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": { "outDir": "dist", "rootDir": "src" },
"include": ["src"],
"references": [
{ "path": "../scorpio.llm" },
{ "path": "../scorpio.llm.openai" }
]
}
1 change: 1 addition & 0 deletions packages/backend/sbot/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
"scorpio.llm.gemini": "workspace:*",
"scorpio.llm.ollama": "workspace:*",
"scorpio.llm.openai": "workspace:*",
"scorpio.llm.orcarouter": "workspace:*",
"scorpio.llm.voyage": "workspace:*",
"scorpio.saver": "workspace:*",
"scorpio.saver.file": "workspace:*",
Expand Down
2 changes: 2 additions & 0 deletions packages/backend/sbot/src/Core/LlmProviders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { registerCohereProvider } from "scorpio.llm.cohere";
import { registerGeminiProvider } from "scorpio.llm.gemini";
import { registerOllamaProvider } from "scorpio.llm.ollama";
import { registerOpenAIProvider } from "scorpio.llm.openai";
import { registerOrcaRouterProvider } from "scorpio.llm.orcarouter";
import { registerVoyageProvider } from "scorpio.llm.voyage";

let registered = false;
Expand All @@ -16,5 +17,6 @@ export function registerBuiltInLlmProviders(): void {
registerOllamaProvider();
registerCohereProvider();
registerVoyageProvider();
registerOrcaRouterProvider();
registered = true;
}
74 changes: 50 additions & 24 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.