From 10ff9ba06c3155592f34b2a618708adab4e9f518 Mon Sep 17 00:00:00 2001 From: orcasjh Date: Sat, 15 Aug 2026 03:01:46 +0000 Subject: [PATCH] feat: add OrcaRouter as a chat platform Add OrcaRouterConfig (OpenAI-compatible, https://api.orcarouter.ai) and OrcaRouterChatService mirroring OpenAiChatService, wire it into PlatformType, Configuration, AiService and CopilotConfig, and document in README. --- README.md | 2 +- .../copilot/config/OrcaRouterConfig.java | 13 ++++++++++++ .../openai/chat/OpenAiChatService.java | 9 +++++++- .../chat/OrcaRouterChatService.java | 21 +++++++++++++++++++ .../copilot/service/Configuration.java | 1 + .../copilot/service/PlatformType.java | 1 + .../copilot/service/factor/AiService.java | 3 +++ .../northstar/config/CopilotConfig.java | 14 +++++++++++++ 8 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 northstar-copilot/src/main/java/org/dromara/northstar/copilot/config/OrcaRouterConfig.java create mode 100644 northstar-copilot/src/main/java/org/dromara/northstar/copilot/platform/orcarouter/chat/OrcaRouterChatService.java diff --git a/README.md b/README.md index 5b8a857ea..743ba75cf 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ **AI助手** ● 可对接主流的大模型平台API -● 已有Deepseek及Kimi的对接案例 +● 已有Deepseek、Kimi及[OrcaRouter](https://www.orcarouter.ai)的对接案例 **日志分析** ● 隔离平台日志与模组日志 diff --git a/northstar-copilot/src/main/java/org/dromara/northstar/copilot/config/OrcaRouterConfig.java b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/config/OrcaRouterConfig.java new file mode 100644 index 000000000..68222b672 --- /dev/null +++ b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/config/OrcaRouterConfig.java @@ -0,0 +1,13 @@ +package org.dromara.northstar.copilot.config; + +/** + * @Description OrcaRouter 路由网关(OpenAI 兼容,https://www.orcarouter.ai)配置 + */ +public class OrcaRouterConfig extends OpenAiConfig { + + public OrcaRouterConfig() { + super(); + setApiHost("https://api.orcarouter.ai/"); + setChatCompletionUrl("v1/chat/completions"); + } +} diff --git a/northstar-copilot/src/main/java/org/dromara/northstar/copilot/platform/openai/chat/OpenAiChatService.java b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/platform/openai/chat/OpenAiChatService.java index 5b513a024..04e7e0996 100644 --- a/northstar-copilot/src/main/java/org/dromara/northstar/copilot/platform/openai/chat/OpenAiChatService.java +++ b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/platform/openai/chat/OpenAiChatService.java @@ -46,7 +46,14 @@ public class OpenAiChatService implements IHelperFactory, IChatService { private final EventSource.Factory factory; public OpenAiChatService(Configuration configuration) { - this.openAiConfig = configuration.getOpenAiConfig(); + this(configuration.getOpenAiConfig(), configuration); + } + + /** + * 子类可传入自定义的 OpenAI 兼容配置(如 OrcaRouter)。 + */ + protected OpenAiChatService(OpenAiConfig openAiConfig, Configuration configuration) { + this.openAiConfig = openAiConfig; this.okHttpClient = configuration.getOkHttpClient(); this.factory = configuration.createRequestFactory(); } diff --git a/northstar-copilot/src/main/java/org/dromara/northstar/copilot/platform/orcarouter/chat/OrcaRouterChatService.java b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/platform/orcarouter/chat/OrcaRouterChatService.java new file mode 100644 index 000000000..19e6bbc01 --- /dev/null +++ b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/platform/orcarouter/chat/OrcaRouterChatService.java @@ -0,0 +1,21 @@ +package org.dromara.northstar.copilot.platform.orcarouter.chat; + +import org.dromara.northstar.copilot.config.OrcaRouterConfig; +import org.dromara.northstar.copilot.platform.openai.chat.OpenAiChatService; +import org.dromara.northstar.copilot.service.Configuration; +import org.dromara.northstar.copilot.service.PlatformType; + +/** + * @Description OrcaRouter 路由网关(OpenAI 兼容,https://www.orcarouter.ai)聊天服务 + */ +public class OrcaRouterChatService extends OpenAiChatService { + + public OrcaRouterChatService(Configuration configuration) { + super(configuration.getOrcaRouterConfig(), configuration); + } + + @Override + public PlatformType platformType() { + return PlatformType.ORCA_ROUTER; + } +} diff --git a/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/Configuration.java b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/Configuration.java index 25fb710a2..27709923e 100644 --- a/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/Configuration.java +++ b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/Configuration.java @@ -33,6 +33,7 @@ public class Configuration { private OllamaConfig ollamaConfig; private MinimaxConfig minimaxConfig; private BaichuanConfig baichuanConfig; + private OrcaRouterConfig orcaRouterConfig; private PineconeConfig pineconeConfig; diff --git a/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/PlatformType.java b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/PlatformType.java index 04f7deb33..c7bb0d42c 100644 --- a/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/PlatformType.java +++ b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/PlatformType.java @@ -20,6 +20,7 @@ public enum PlatformType { OLLAMA("ollama"), MINIMAX("minimax"), BAICHUAN("baichuan"), + ORCA_ROUTER("orcarouter"), ; private final String platform; diff --git a/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/factor/AiService.java b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/factor/AiService.java index 8270bccea..95027400e 100644 --- a/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/factor/AiService.java +++ b/northstar-copilot/src/main/java/org/dromara/northstar/copilot/service/factor/AiService.java @@ -7,6 +7,7 @@ import org.dromara.northstar.copilot.platform.openai.audio.OpenAiAudioService; import org.dromara.northstar.copilot.platform.openai.chat.OpenAiChatService; import org.dromara.northstar.copilot.platform.openai.embedding.OpenAiEmbeddingService; import org.dromara.northstar.copilot.platform.openai.realtime.OpenAiRealtimeService; +import org.dromara.northstar.copilot.platform.orcarouter.chat.OrcaRouterChatService; import org.dromara.northstar.copilot.service.Configuration; import org.dromara.northstar.copilot.service.IAudioService; import org.dromara.northstar.copilot.service.IChatService; @@ -51,6 +52,8 @@ public class AiService { return new MoonshotChatService(configuration); case OLLAMA: return new OllamaAiChatService(configuration); + case ORCA_ROUTER: + return new OrcaRouterChatService(configuration); default: throw new IllegalArgumentException("Unknown platform: " + platform); } diff --git a/northstar-main/src/main/java/org/dromara/northstar/config/CopilotConfig.java b/northstar-main/src/main/java/org/dromara/northstar/config/CopilotConfig.java index 046337fc2..7e7d3db24 100644 --- a/northstar-main/src/main/java/org/dromara/northstar/config/CopilotConfig.java +++ b/northstar-main/src/main/java/org/dromara/northstar/config/CopilotConfig.java @@ -4,8 +4,10 @@ import java.util.concurrent.TimeUnit; import org.dromara.northstar.copilot.config.DeepSeekConfig; import org.dromara.northstar.copilot.config.MoonshotConfig; +import org.dromara.northstar.copilot.config.OrcaRouterConfig; import org.dromara.northstar.copilot.platform.deepseek.chat.DeepSeekChatService; import org.dromara.northstar.copilot.platform.moonshot.chat.MoonshotChatService; +import org.dromara.northstar.copilot.platform.orcarouter.chat.OrcaRouterChatService; import org.dromara.northstar.copilot.service.IChatService; import org.dromara.northstar.copilot.utils.SharedInfoUtils; import org.springframework.beans.factory.annotation.Value; @@ -52,4 +54,16 @@ public class CopilotConfig { cfg.setDeepSeekConfig(dsCfg); return new DeepSeekChatService(cfg); } + + @Bean + @ConditionalOnProperty("copilot.orcarouter.apiKey") + IChatService orcaRouterService(@Value("${copilot.orcarouter.apiKey}") String apiKey, OkHttpClient client) { + log.info("创建OrcaRouter聊天服务"); + OrcaRouterConfig orcaCfg = new OrcaRouterConfig(); + orcaCfg.setApiKey(apiKey); + org.dromara.northstar.copilot.service.Configuration cfg = new org.dromara.northstar.copilot.service.Configuration(); + cfg.setOkHttpClient(client); + cfg.setOrcaRouterConfig(orcaCfg); + return new OrcaRouterChatService(cfg); + } } -- Gitee