ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Spring AI GA1.0.0 入门到源码系列课:用 TaoToken 统一 Key 打通 ChatClient 配置

Spring AI GA1.0.0 入门到源码系列课:用 TaoToken 统一 Key 打通 ChatClient 配置 1. 从一次“Key 满天飞”的翻车说起Spring AI GA 1.0.0 发布之后我第一时间把手上几个 Demo 升了上去。ChatClient 的 API 确实比早期版本顺手太多prompt().user().call().content()这套链式写法几乎不用看文档就能猜出来。但真正让我卡住的不是 API而是配置DeepSeek 一个 Key、通义一个 Key、本地 Ollama 又是另一套 base-urlapplication.yml里spring.ai下面挂了一堆api-key测试环境、生产环境、同事本地各一份改一次配置要动五个文件。Spring AI GA 1.0.0 是 Spring 官方面向 AI 工程的应用框架它把提示词、对话记忆、Advisor 拦截、Tool 调用、RAG、MCP 这些能力统一收敛到ChatClient这一层抽象上适合已经用 Spring Boot 3.x、想用一套 Java 代码对接多家模型的团队。而这一篇要解决的就是最前面那一步用 TaoToken 统一 Key 打通 ChatClient 配置让你只维护一个 API Key 和一个 base-url就能跑通第一个对话调用后面再逐步往源码层深入。我会给你可直接复制的application.yml与config.toml骨架、TaoToken 统一 Key 的接入步骤、启动验证方式以及我实际踩过的几个报错。整套流程跑通大概十分钟前提是 JDK 17 和 Maven 已经就绪。2. TaoToken 前置统一 Key 与通道准备TaoToken 在这里扮演的角色是“统一入口”你不需要在代码里为每家模型分别写 Key而是把请求统一发到 TaoToken 的 API 通道由它按模型名路由。对 Spring AI 来说这等价于把base-url指向一个兼容 OpenAI 协议的端点api-key填 TaoToken 的 Key 即可。先做三件事。第一注册并登录 TaoToken 控制台地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 登录后在控制台里能看到账户余额和调用统计。第二创建 API Key。进入 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_campaignrewriteutm_content 点新建复制生成的 Key。这个 Key 只显示一次建议直接存到环境变量里别写死在代码仓库。第三确认你要用的模型名。TaoToken 的模型列表在文档里能查到常见的有gpt-4o-mini、claude-3-5-sonnet、deepseek-chat这类命名。Spring AI 的 OpenAI starter 会把model字段原样透传所以模型名要和 TaoToken 侧一致。注意TaoToken 的 API 端点是https://taotoken.net/api注意这里不带任何查询参数配置时不要多加斜杠或路径后缀否则会出现 404。环境变量这样设置Linux/macOSexport TAOTOKEN_API_KEYsk-你的TaoToken密钥Windows PowerShell$env:TAOTOKEN_API_KEYsk-你的TaoToken密钥设置完可以用echo $TAOTOKEN_API_KEY确认一下避免后面启动时报“api-key 为空”却找不到原因。3. 可复制配置application.yml 与 config.toml 骨架3.1 pom.xml 依赖Spring AI GA 1.0.0 用 BOM 统一管理版本父工程用 Spring Boot 3.4.x。核心依赖只需要 OpenAI starter因为 TaoToken 走的是 OpenAI 兼容协议。project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.4.5/version relativePath/ /parent groupIdcom.example/groupId artifactIdspring-ai-taotoken-demo/artifactId version0.0.1-SNAPSHOT/version properties java.version17/java.version spring-ai.version1.0.0/spring-ai.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version${spring-ai.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement /project3.2 application.yml这是本篇最核心的一段。base-url指向 TaoToken 的 API 端点api-key从环境变量读取chat.options.model填你要用的模型名。server: port: 8080 spring: application: name: spring-ai-taotoken-demo ai: openai: # TaoToken 统一 API 端点注意结尾不要带斜杠 base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY} chat: options: model: gpt-4o-mini temperature: 0.7 max-tokens: 1024 embedding: options: model: text-embedding-3-small logging: level: org.springframework.ai.chat.client.advisor: DEBUG org.springframework.ai.openai: INFO几个参数说明一下。temperature控制随机性0.2 偏严谨、1.0 偏发散日常对话 0.7 比较稳。max-tokens限制单次输出长度防止意外跑飞。base-url是 TaoToken 的 API 地址Spring AI 会在它后面自动拼/v1/chat/completions这类路径所以你自己不要手动加/v1。3.3 config.toml 骨架如果你用 Spring Boot 3.x 的spring.config.import或者本地工具链需要 TOML 配置可以这样写。TOML 里环境变量用${}引用Spring 会做占位符替换。[spring.ai.openai] base-url https://taotoken.net/api api-key ${TAOTOKEN_API_KEY} [spring.ai.openai.chat.options] model gpt-4o-mini temperature 0.7 max-tokens 1024 [spring.ai.openai.embedding.options] model text-embedding-3-small在application.yml里加一行spring.config.import: optional:classpath:config.toml就能加载它。两种格式二选一即可别同时配同一项否则后加载的会覆盖前面的排查起来很烦。3.4 ChatClient 的 Bean 配置Spring AI 的 OpenAI starter 会自动装配OpenAiChatModel你只需要把它包成ChatClient。package com.example.demo; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.model.ChatModel; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class ChatClientConfig { Bean public ChatClient chatClient(ChatModel chatModel) { return ChatClient.builder(chatModel) .defaultSystem(你是一个简洁、准确的中文助手回答控制在三句话以内。) .build(); } }这里注入的是ChatModel接口而不是具体的OpenAiChatModel好处是以后换模型实现时这个配置类不用动。defaultSystem设了系统提示词后面每次调用都会带上省得重复写。4. 验证请求跑通第一个对话调用4.1 写一个 Controllerpackage com.example.demo; import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController public class ChatController { private final ChatClient chatClient; public ChatController(ChatClient chatClient) { this.chatClient chatClient; } GetMapping(/chat) public String chat(RequestParam String message) { return chatClient.prompt() .user(message) .call() .content(); } }4.2 启动并请求mvn spring-boot:run看到Started DemoApplication in x.xxx seconds就说明启动成功。另开一个终端curl http://localhost:8080/chat?message用一句话解释什么是Spring%20AI正常返回类似Spring AI 是 Spring 官方推出的 AI 应用开发框架把大模型调用、提示词、记忆、工具调用等能力统一封装成 Spring 风格的 API。4.3 流式输出验证非流式跑通后顺手验证一下流式因为后面做打字机效果会用到。GetMapping(value /chat/stream, produces text/event-stream;charsetUTF-8) public FluxString stream(RequestParam String message) { return chatClient.prompt() .user(message) .stream() .content(); }curl -N http://localhost:8080/chat/stream?message数一下1到5-N关闭 curl 缓冲你会看到内容一段段吐出来。如果这里能出字说明 TaoToken 通道的流式协议也通了。4.4 用单元测试固定住配置比起每次手动 curl我更推荐写个测试把“配置是否正确”这件事固化下来。SpringBootTest class ChatClientSmokeTest { Autowired private ChatClient chatClient; Test void shouldReturnNonEmptyContent() { String content chatClient.prompt() .user(回复两个字收到) .call() .content(); System.out.println(模型返回: content); assert content ! null !content.isBlank(); } }跑mvn test如果这个测试过了说明 Key、base-url、模型名三件套都是对的。以后改配置先跑它比启动整个应用快得多。5. 本篇常见错排查5.1 401 Unauthorized最常见的原因是TAOTOKEN_API_KEY没生效。先确认环境变量在当前 shell 里存在再确认 IDE 启动时有没有继承它——IDEA 里跑main方法默认不读你终端里export的变量需要在 Run Configuration 的 Environment variables 里手动加或者用.env插件。还有一种情况是 Key 复制时带了空格或换行。TaoToken 控制台复制出来的 Key 建议先粘到纯文本编辑器里看一眼首尾。5.2 404 Not Found八成是base-url写错了。正确值是https://taotoken.net/api不要写成https://taotoken.net/api/v1也不要带结尾斜杠。Spring AI 内部会拼接具体路径你多写一层就变成/api/v1/v1/chat/completions。5.3 模型名不识别报错信息通常是model not found或invalid model。去 TaoToken 文档页 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_campaignrewriteutm_content 核对当前可用的模型名注意大小写和连字符。gpt-4o-mini和gpt-4o是两个不同的模型别混。5.4 启动时报“No qualifying bean of type ChatModel”说明 starter 没被扫描到。检查pom.xml里spring-ai-starter-model-openai是否在dependencies里而不是只写在dependencyManagement。BOM 只管版本不引入依赖。5.5 超时或连接被重置先确认网络能访问taotoken.net。如果公司网络有出口限制联系运维放行。另外max-tokens设太大、模型响应慢时也可能触发默认超时可以在配置里加spring: ai: openai: chat: options: model: gpt-4o-mini # 连接与读取超时毫秒 base-url: https://taotoken.net/apiSpring AI 1.0.0 的超时通过底层RestClient控制需要自定义OpenAiApiBean 时再调日常先用默认值即可。5.6 中文乱码curl返回乱码通常是终端编码问题不是服务端问题。在 Windows 上先执行chcp 65001切到 UTF-8。Spring Boot 侧默认就是 UTF-8不用额外配。6. 下一步从跑通到源码到这里你已经用 TaoToken 统一 Key 把 Spring AI GA 1.0.0 的 ChatClient 跑通了。这套配置的价值在于以后加模型只改model字段加环境只改环境变量代码层几乎不动。接下来往源码走建议按这个顺序先看ChatClient的prompt()返回的ChatClientRequestSpec是怎么把 system、user、advisor 串起来的再看OpenAiChatModel.internalCall如何把Prompt转成 HTTP 请求最后看Advisor链在call前后的拦截时机。这三块吃透Spring AI 的对话主链路就通了。如果你要长期做编码类 Agent可以顺手了解 TaoToken 的 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_campaignrewriteutm_content 它针对代码场景做了通道优化。想直接在网页里对比不同模型的输出模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_campaignrewriteutm_content 可以快速试。接入过程中遇到配置问题接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_campaignrewriteutm_content 里有各语言的最小示例对照着看比猜快。我自己的习惯是每加一个新模型先写一个SpringBootTest断言它返回非空再动业务代码。这样配置问题永远在测试阶段暴露不会拖到联调。
返回列表