diff --git a/README.md b/README.md index c4aa88ed22a15d02ea0e5f36679c28d705891252..3b415674c2c55131d043c6dfb3c124141ea097ec 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,15 @@ spring: ⚠️ novel-plus 项目默认使用的都是免费 AI 模型,生成效果有限。如果对生成内容有更高的要求,建议选用付费的 AI 模型。 +除了默认的硅基流动之外,novel-plus 还内置了对 [OrcaRouter](https://www.orcarouter.ai) 的命名接入。OrcaRouter 是 OpenAI 兼容的 LLM 路由网关,使用 `model=orcarouter/auto` 自动路由到合适的大模型。设置环境变量 `ORCAROUTER_API_KEY`(或在 novel-front 模块的 yaml 中填写 `orca-router.api-key`),即可通过 `author/ai/orca/chat` 接口体验: + +```yaml +orca-router: + api-key: ${ORCAROUTER_API_KEY:} + base-url: https://api.orcarouter.ai # 网关根地址,Spring AI 会自动拼接 /v1/chat/completions + model: orcarouter/auto +``` + ## 增值服务 👉 [了解详情](https://novel.xxyopen.com/service.htm) diff --git a/novel-front/src/main/java/com/java2nb/novel/config/OrcaRouterConfig.java b/novel-front/src/main/java/com/java2nb/novel/config/OrcaRouterConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..ce6e5bd26612edc15b0d0b0cdd306ba9ce5e9d75 --- /dev/null +++ b/novel-front/src/main/java/com/java2nb/novel/config/OrcaRouterConfig.java @@ -0,0 +1,51 @@ +package com.java2nb.novel.config; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.openai.OpenAiChatModel; +import org.springframework.ai.openai.OpenAiChatOptions; +import org.springframework.ai.openai.api.OpenAiApi; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * OrcaRouter 命名接入 + * + *
镜像既有 {@code spring.ai.openai}(硅基流动 SiliconFlow)的 OpenAI 兼容接法,新增一个指向 + * OrcaRouter 网关的命名 {@link ChatClient}。 + * OrcaRouter 是 OpenAI 兼容的 LLM 路由网关,使用 {@code model=orcarouter/auto} 自动路由到合适的大模型。 + * 注意:base-url 填网关根地址 {@code https://api.orcarouter.ai}(Spring AI 会自行拼接 + * {@code /v1/chat/completions})。
+ * + *启用方式:在 {@code application.yml} 的 {@code orca-router} 配置块中填入 OrcaRouter + * API Key(或设置环境变量 {@code ORCAROUTER_API_KEY}),即可通过注入名为 + * {@code orcaRouterChatClient} 的 {@link ChatClient} 调用。
+ * + * @author orcasjh + */ +@Configuration +public class OrcaRouterConfig { + + /** + * 命名 OrcaRouter ChatClient:指向 {@code https://api.orcarouter.ai}(根地址),模型 orcarouter/auto。 + */ + @Bean + public ChatClient orcaRouterChatClient( + @Value("${orca-router.api-key:}") String apiKey, + @Value("${orca-router.base-url:https://api.orcarouter.ai}") String baseUrl, + @Value("${orca-router.model:orcarouter/auto}") String model) { + OpenAiApi openAiApi = OpenAiApi.builder() + .baseUrl(baseUrl) + .apiKey(apiKey) + .build(); + OpenAiChatOptions chatOptions = OpenAiChatOptions.builder() + .model(model) + .build(); + OpenAiChatModel chatModel = OpenAiChatModel.builder() + .openAiApi(openAiApi) + .defaultOptions(chatOptions) + .build(); + return ChatClient.builder(chatModel).build(); + } + +} diff --git a/novel-front/src/main/java/com/java2nb/novel/controller/AuthorController.java b/novel-front/src/main/java/com/java2nb/novel/controller/AuthorController.java index eacaca625c960093a473263c52b01da6a182c22a..b2d03bd9b2222ebfbc5488519aaa41bdba1f8ce7 100644 --- a/novel-front/src/main/java/com/java2nb/novel/controller/AuthorController.java +++ b/novel-front/src/main/java/com/java2nb/novel/controller/AuthorController.java @@ -43,6 +43,8 @@ public class AuthorController extends BaseController { private final ChatClient chatClient; + private final ChatClient orcaRouterChatClient; + private final OpenAiChatModel chatModel; /** @@ -328,4 +330,20 @@ public class AuthorController extends BaseController { .content(); } + /** + * OrcaRouter AI 对话(命名接入,模型由网关自动路由) + * + *镜像上述 {@code spring.ai.openai}(硅基流动)的 OpenAI 兼容接法,走 + * OrcaRouter 网关(base-url + * {@code https://api.orcarouter.ai},模型 {@code orcarouter/auto} 自动路由,Spring AI + * 自动拼接 {@code /v1/chat/completions})。
+ */ + @PostMapping("ai/orca/chat") + public RestResult