diff --git a/README.md b/README.md index 29af5919..b0933c5e 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ ### 多租户大模型管理 -- 按租户隔离 AI 模型配置,不同租户可使用不同的 LLM 提供商(OpenAI / Ollama / 智谱等) +- 按租户隔离 AI 模型配置,不同租户可使用不同的 LLM 提供商(OpenAI / Ollama / 智谱 / [OrcaRouter](https://www.orcarouter.ai) 等) - ChatModel 按配置签名缓存共享,不随租户增长 - 提供 OpenAI 兼容的 `/v1/chat/completions` 统一代理接口,流式/非流式自动切换 diff --git a/db/mf_system.sql b/db/mf_system.sql index da769264..b77d390e 100644 --- a/db/mf_system.sql +++ b/db/mf_system.sql @@ -277,6 +277,7 @@ INSERT INTO `sys_dict_item` VALUES ('e100aa3c678f2bf6a4e1e24a9feee89f', 'cd33855 INSERT INTO `sys_dict_item` VALUES ('cac0983d1430c0a7dce98bd8c01cc19c', 'cd338555eccf73e26e9243837d6c711e', 'ai_model_protocol', 'ollama', 'ollama', 0, 2, '', 'blue', 0, NULL, 'admin', '2026-07-10 16:58:34', '', NULL); INSERT INTO `sys_dict_item` VALUES ('64a2906317754ac19c779e04ddc155de', 'cd338555eccf73e26e9243837d6c711e', 'ai_model_protocol', 'deepseek', 'deepseek', 0, 3, NULL, 'cyan', 0, NULL, 'admin', '2026-07-10 16:58:49', '', NULL); INSERT INTO `sys_dict_item` VALUES ('76faf36cc4e459171c273fa833e79ff4', 'cd338555eccf73e26e9243837d6c711e', 'ai_model_protocol', 'anthropic', 'anthropic', 0, 4, NULL, 'pink', 0, NULL, 'admin', '2026-07-10 16:59:22', '', NULL); +INSERT INTO `sys_dict_item` VALUES ('9f3c1a7d2e5b4a8c6f0d1e2a3b4c5d6e', 'cd338555eccf73e26e9243837d6c711e', 'ai_model_protocol', 'orcarouter', 'orcarouter', 0, 5, NULL, 'gold', 0, 'OrcaRouter 路由网关', 'admin', '2026-08-15 00:00:00', '', NULL); -- ---------------------------- -- Table structure for sys_log diff --git a/mf-api/mf-ai-api/src/main/java/cn/com/mfish/ai/api/entity/AiModelConfig.java b/mf-api/mf-ai-api/src/main/java/cn/com/mfish/ai/api/entity/AiModelConfig.java index e31610eb..07cc1bad 100644 --- a/mf-api/mf-ai-api/src/main/java/cn/com/mfish/ai/api/entity/AiModelConfig.java +++ b/mf-api/mf-ai-api/src/main/java/cn/com/mfish/ai/api/entity/AiModelConfig.java @@ -30,14 +30,14 @@ public class AiModelConfig extends BaseEntity { @ExcelProperty("租户ID") @Schema(description = "租户ID") private String tenantId; - @ExcelProperty("提供者: openai/ollama/deepseek/zhipuai/anthropic等") - @Schema(description = "提供者: openai/ollama/deepseek/zhipuai/anthropic等") + @ExcelProperty("提供者: openai/ollama/deepseek/zhipuai/anthropic/orcarouter等") + @Schema(description = "提供者: openai/ollama/deepseek/zhipuai/anthropic/orcarouter等") private String provider; @ExcelProperty("模型名称: gpt-4o, qwen3:8b, deepseek-v3 等") @Schema(description = "模型名称: gpt-4o, qwen3:8b, deepseek-v3 等") private String modelName; - @ExcelProperty("接入协议: openai/ollama/deepseek/anthropic") - @Schema(description = "接入协议: openai/ollama/deepseek/anthropic") + @ExcelProperty("接入协议: openai/ollama/deepseek/anthropic/orcarouter") + @Schema(description = "接入协议: openai/ollama/deepseek/anthropic/orcarouter") private String protocol; @ExcelProperty("API密钥(加密存储)") @Schema(description = "API密钥(加密存储)") diff --git a/mf-common/mf-common-ai/src/main/java/cn/com/mfish/common/ai/enums/LlmProtocol.java b/mf-common/mf-common-ai/src/main/java/cn/com/mfish/common/ai/enums/LlmProtocol.java index 4f8c57d6..1749f4c2 100644 --- a/mf-common/mf-common-ai/src/main/java/cn/com/mfish/common/ai/enums/LlmProtocol.java +++ b/mf-common/mf-common-ai/src/main/java/cn/com/mfish/common/ai/enums/LlmProtocol.java @@ -81,6 +81,21 @@ public enum LlmProtocol { .build()) .build(); } + }, + ORCA_ROUTER("orcarouter") { + @Override + public ChatModel create(String apiKey, String baseUrl, String model, Integer maxTokens, Double temperature) { + // OrcaRouter 是 OpenAI 兼容的 LLM 路由网关(https://www.orcarouter.ai) + return OpenAiChatModel.builder() + .options(OpenAiChatOptions.builder() + .apiKey(apiKey) + .model(model) + .temperature(temperature) + .maxTokens(maxTokens) + .baseUrl(baseUrl) + .build()) + .build(); + } }; private final String value;