diff --git a/README.md b/README.md index 5b8a857ea1cdb99971685e5eede0e7a51c81f92b..743ba75cfcc4a2bdec8bb6d862000c16c7282479 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 0000000000000000000000000000000000000000..68222b67282c58a89c0dd7899fffdeff5cfe0844 --- /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 5b513a024111abc5941504c190585df84c639342..04e7e0996048501bb26d53a96d87cb5d5becf02b 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 0000000000000000000000000000000000000000..19e6bbc015f73175e4170aff08cd59205b68dd75 --- /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 25fb710a25e2bd37f831bc010d8aa47e3e08bd18..27709923e45c9f72cad8bf2d5ac46c8e91988de6 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 04f7deb333a164291410c02a90d46ec04965e790..c7bb0d42c085ce693874c3bd0d022ae83b449dc7 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 8270bccea3983fdd6f8e1f0b010e4202cc612fc3..95027400e0765491911baf9bfc1d23f62f66eef1 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 046337fc273b12b75fb3e907ce1edb16e57ac0ec..7e7d3db2447c7f9928957b3daeef09983abd7792 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); + } }