ARTICLE DETAIL

资讯详情

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

Spring AI MCP 的 DeepSeek 直连,改走 TaoToken 行不行?

Spring AI MCP 的 DeepSeek 直连,改走 TaoToken 行不行? Spring AI MCP 从直连 DeepSeek 到生产级部署最容易被低估的一步是application.yml里那行openai.base-url。官方 DeepSeek API Key 一旦分散在本地、测试、预发、生产多套环境后面换模型或换供应商就要挨个改配置。现在把 DeepSeek 模型通道切到 TaoToken先打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并创建 API Key再把 MCP Client 的openai.base-url从https://api.deepseek.com改成https://taotoken.net/apiapi-key填刚创建的 Key。ChatClient 调用模型时仍然走原来的getWeather工具链路Token 消耗统一由 TaoToken 计量。这样做的最大好处是MCP Server 不用重写工具注册不用重写Nacos 注册和监控告警也不用推翻只把模型出口从 DeepSeek 官方地址换到兼容通道即可。1. 快速开始把 MCP Client 的 DeepSeek 直连改到 TaoToken1.1 环境准备JDK、Maven 和一把 TaoToken Key原文的快速开始列了 JDK 17、Maven 3.6、Spring Boot 4.x以及“网络可访问 DeepSeek API”。前三项不变最后一项现在改成“能访问 TaoToken 的 API 通道”。这里不要改 MCP Server 的端口也不要改 SSE 端点只改 Client 端调用模型的那一段。准备材料如下组件版本或要求说明JDK17Spring Boot 4.x 要求Maven3.6构建 MCP Server 和 ClientSpring AI2.0.0MCP 与 OpenAI 兼容 starterTaoToken API KeyYOUR_API_KEY从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建模型 ID以模型广场为准不要直接抄原文的deepseek-chat打开 TaoToken 之后先在控制台创建一把 Key。Key 到手后不要写死在代码仓库里建议用环境变量TAOTOKEN_API_KEY注入。原文里的${DEEPSEEK_API_KEY:sk-your-key}可以保留同样的写法只是变量名换成TAOTOKEN_API_KEY默认值换成YOUR_API_KEY。这样本地开发、CI、预发环境可以各自配置不至于把 Key 提交到 Git。模型 ID 这一步要特别小心。原文的deepseek-chat是 DeepSeek 官方接口里的名字TaoToken 模型广场里的模型 ID 可能不同。正确做法是打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 看模型广场当时列表把对应 DeepSeek 通道的模型 ID 复制到spring.ai.openai.chat.options.model。不要自己编deepseek-v3-20250101这类没有依据的后缀否则启动后调用会直接报模型不存在。1.2 MCP Server 的 Tool 链路不用动MCP Server 仍然负责暴露工具和用哪家模型 API 没有关系。WeatherService里的Tool注解、ToolRegistryConfig里的ToolCallbackProvider、SSE 端点/api/v1/sse这些都保持原样。模型通道换到 TaoToken 之后MCP Server 不知道也不关心 Client 把请求发给了谁。下面是一个可运行的 MCP Server 配置端口、SSE 端点、工具能力都按原文风格保留server: port: 8080 spring: ai: mcp: server: enabled: true name: weather-service version: 1.0.0 sse-endpoint: /api/v1/sse sse-message-endpoint: /api/v1/mcp capabilities: tool: true logging: level: io.modelcontextprotocol: DEBUG org.springframework.ai.mcp: DEBUG工具类也只需要关注自己的业务逻辑。getWeather可以继续调用你自己的天气接口或者先用降级数据跑通链路。下面这段代码重写自原文的WeatherService但保留了Tool和ToolParam的关键用法package com.example.mcp.tool; import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.stereotype.Service; Service public class WeatherService { Tool(description 查询指定城市的实时天气信息返回温度、湿度、天气状况) public WeatherInfo getWeather( ToolParam(description 城市名称如北京、上海、深圳) String city) { if (city null || city.trim().isEmpty()) { throw new IllegalArgumentException(城市名称不能为空); } // 这里仍然调用你自己的天气 API和模型通道无关 return weatherClient.query(city); } }工具注册配置也不用改package com.example.mcp.config; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.ai.tool.method.MethodToolCallbackProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class ToolRegistryConfig { Bean public ToolCallbackProvider toolProvider(WeatherService weatherService, MathTool mathTool) { return MethodToolCallbackProvider.builder() .toolObjects(weatherService, mathTool) .build(); } }启动 Server 后仍然可以用curl http://localhost:8080/api/v1/sse看 SSE 端点是否返回event: endpoint。这一步和 TaoToken 没有直接关系它验证的是 MCP Server 自己是否正常。1.3 改写 MCP Client 的 application.ymlMCP Client 的改动集中在一处把spring.ai.openai下面指向 DeepSeek 官方的base-url和api-key换掉。原文的 MCP Client 连接配置、SSE 配置、工具回调开关都保留。下面是一份可复制的application.ymlserver: port: 8081 spring: ai: mcp: client: sse: connections: weather-service: url: http://localhost:8080 sse-endpoint: /api/v1/sse toolcallback: enabled: true openai: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY:YOUR_API_KEY} chat: options: model: YOUR_MODEL_ID temperature: 0.7 logging: level: org.springframework.ai: DEBUG io.modelcontextprotocol: TRACE这里有两个硬性细节base-url必须写成https://taotoken.net/api末尾不要加/v1api-key用环境变量或占位符YOUR_API_KEY不要写真实 Key。原文里model: deepseek-chat现在改成YOUR_MODEL_ID实际值去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 模型广场复制当时列表里的 ID。Client 侧的ChatClient构建方式也不需要大改。原文通过ChatClient.Builder注册系统提示词和工具下面这段代码保持同样的装配顺序package com.example.client.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import java.util.List; RestController RequestMapping(/api/chat) public class WeatherChatController { private final ChatClient chatClient; public WeatherChatController(ChatClient.Builder builder, ListToolCallbackProvider toolProviders) { builder.defaultSystem(你是一个智能天气助手可以调用 getWeather 查询天气并给出出行建议。); toolProviders.forEach(provider - builder.defaultTools(provider.getToolCallbacks())); this.chatClient builder.build(); } GetMapping(/sync) public String chat(RequestParam String message) { return chatClient.prompt().user(message).call().content(); } GetMapping(value /stream, produces text/event-stream) public FluxString streamChat(RequestParam String message) { return chatClient.prompt().user(message).stream().content(); } }注意模型请求走的是spring.ai.openai.base-url工具调用走的是 MCP SSE 连接这两条链路在 Spring AI 里是分开的。换 TaoToken 只影响模型请求不影响getWeather的参数校验、超时和降级逻辑。1.4 启动并跑通 getWeather 天气查询先启动 MCP Servercd mcp-server mvn spring-boot:run再启动 MCP Clientcd mcp-client mvn spring-boot:run然后发起一次流式对话curl http://localhost:8081/api/chat/stream?message北京今天天气怎么样适合户外运动吗期望看到的行为是Client 先通过 SSE 拿到工具列表模型决定调用getWeatherMCP Server 执行工具并返回天气数据最后模型基于工具结果生成出行建议。日志里应该能看到Registered tools: 2或类似数量以及getWeather被调用的记录。如果工具被调用了但模型返回内容为空或报 401那问题通常不在 MCP而在TAOTOKEN_API_KEY或模型 ID。2. 核心原理解析ChatClient 如何经 TaoToken 触发 MCP 工具2.1 MCP 协议与工具发现和模型通道解耦MCP 基于 JSON-RPC 2.0工具发现流程是 Client 向 Server 发tools/listServer 返回工具 Schema。这个流程完全不经过模型 API。所以你把openai.base-url改成https://taotoken.net/api之后tools/list仍然走http://localhost:8080/api/v1/sse工具列表不会因为换模型通道而丢失。原文的初始化请求、工具列表查询、工具调用请求格式都可以保持不变。真正变化的是模型侧ChatClient 把用户问题、系统提示词、工具描述一起发给模型模型返回“我要调用 getWeather”的意图Spring AI 再通过 MCP Client 执行工具。这个过程中模型 API 只负责决策不负责执行工具。2.2 Spring AI OpenAI 兼容层怎么把请求交给 TaoTokenSpring AI 的spring-ai-starter-model-openai使用 OpenAI 兼容协议。原文把base-url指向https://api.deepseek.com是因为 DeepSeek 提供了 OpenAI 兼容接口现在改成https://taotoken.net/api也是走同样的兼容层。关键在于 URL 拼接如果base-url写成https://taotoken.net/apiSpring AI 会拼出正确的聊天补全路径如果多写一个/v1就可能变成https://taotoken.net/api/v1/chat/completions从而出现 404。这也是为什么产品事实里反复强调填进工具的 Base URL 用https://taotoken.net/api末尾不要带/v1。模型 ID 则决定 TaoToken 把请求路由到哪个模型通道。原文写deepseek-chatTaoToken 模型广场里可能叫别的名字。不要靠自己猜打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 看当时列表复制对应 ID。模型广场里的 ID 和计费、通道能力是对齐的写错就会报模型不存在。2.3 ToolCallbackProvider 与 ChatClient 的装配顺序原文在WeatherController构造函数里先设置defaultSystem再遍历ToolCallbackProvider注册工具。这个顺序在改走 TaoToken 后仍然成立。ChatClient.Builder会把工具定义转换成模型能理解的 function 描述然后随请求发到https://taotoken.net/api。模型返回工具调用指令后Spring AI 再调用 MCP Server。如果工具没有被调用先看日志里有没有“Registered tools”以及工具数量。如果工具数量为 0检查Service是否被 Spring 扫描、Tool是否加了description、ToolCallbackProvider是否传入了实例。如果工具数量正常但模型不调用可以把temperature暂时调低或者把系统提示词写得更明确例如“必须先调用 getWeather 获取天气再回答”。这些都不是 TaoToken 的问题而是 MCP 工具提示词和模型决策的问题。3. 生产环境实践Nacos 注册、监控告警与 Token 计量3.1 Nacos 服务发现与 MCP Server 多实例原文在生产环境把 MCP Server 注册到 NacosClient 通过DiscoveryClient动态获取地址。这部分不需要因为 TaoToken 而修改。MCP Server 仍然把mcp-weather-server注册到 NacosClient 仍然可以轮询多个实例。唯一要注意的是模型通道走 TaoToken 之后Client 到 Server 的 SSE 连接和 Client 到 TaoToken 的 HTTPS 请求是两条独立链路。Nacos 负责前者TaoToken 负责后者。多实例部署时每个 Client 实例都可以用同一把 TaoToken Key也可以按环境拆分 Key。更推荐按环境拆分本地、测试、预发、生产各自创建 Key这样用量统计和排障都更清楚。Key 从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建创建后放进对应环境的密钥管理服务不要写进 Nacos 明文配置。3.2 高可用SSE 超时、重连与工具调用超时原文给了 MCP Client 的连接超时、读超时、最大重连次数等配置。这些配置在换模型通道后仍然有效。因为模型请求走 TaoToken工具调用走 MCP SSE所以两类超时要分开设置spring.ai.mcp.client.sse.connections.weather-service.read-timeout管的是 Client 到 MCP Server 的 SSE 读超时spring.ai.openai本身没有单独的读超时属性时可以通过底层 HTTP 客户端或全局超时控制。工具调用超时仍然建议在RestTemplate或WebClient上设置。如果生产日志里出现工具调用超时不要先怀疑 TaoToken。先看getWeather背后的天气 API 是否慢再看 MCP Server 的 Tomcat 线程池是否被打满。模型通道超时则表现为请求https://taotoken.net/api后长时间无响应这时检查 Client 到公网的出口、重试次数和 Key 的额度状态。3.3 工具调用链路追踪与 TaoToken 用量对照原文的ToolCallTraceAdvice会给每次工具调用生成traceId记录开始、完成和失败。改走 TaoToken 后建议在模型响应日志里也带上同一个traceId这样一次用户提问可以串起“模型请求 - 工具调用 - 模型总结”全过程。TaoToken 控制台会记录模型侧的 Token 消耗MCP 日志记录工具侧的耗时和成功率两边对照就能判断是模型通道慢还是工具慢。具体做法可以在ChatClient调用前后加日志把traceId放进 MDC然后去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 控制台看这次调用的用量记录。注意TaoToken 只计量模型 Token不计量你本地getWeather调用的第三方天气 API。工具本身的监控仍然靠 Micrometer。3.4 监控指标与告警配置原文用 Micrometer 注册了mcp.tool.calls、mcp.tool.duration、mcp.tool.errors等指标。这些指标继续保留。模型通道换到 TaoToken 后可以额外关注两类日志一类是spring.ai.openai的请求耗时另一类是 HTTP 状态码。401 通常代表 Key 未生效404 通常代表base-url多写了/v1或模型 ID 不存在429 则要看 TaoToken 控制台里的额度或并发情况。告警规则可以这样拆工具错误率超过阈值时告警到工具负责人模型请求 401/404 连续出现时告警到配置负责人Token 用量突增时去控制台看是哪个 Key、哪个模型、哪个环境。原文的 Prometheus 暴露配置不需要改只要在 Grafana 里增加模型请求面板即可。4. 常见问题与解决方案base-url、API Key 与工具发现4.1 context-path 404 与 TaoToken base-url 的区别原文提到 Server 配置server.servlet.context-path/javaai后Client 连接报 404。这个 404 是 MCP SSE 路径问题解决办法是在 Client 的url里补上/javaai前缀。改走 TaoToken 后可能出现另一种 404模型请求 404。两者的排查位置不同MCP SSE 404看spring.ai.mcp.client.sse.connections.weather-service.url和sse-endpoint是否拼错。模型请求 404看spring.ai.openai.base-url是否写成https://taotoken.net/api/v1正确写法是https://taotoken.net/api。分清楚这两个 404能省很多时间。4.2 工具无法被发现先查 Tool 再查 ToolCallbackProvider如果 Client 启动日志显示No tool methods found这通常和 TaoToken 无关。检查顺序是第一工具类是否被Service或Component管理第二Tool是否加了description第三ToolCallbackProvider是否把工具实例传进去第四MCP Server 的 SSE 端点是否返回了工具列表。可以在 Server 侧用日志确认Registered tools的数量。工具发现是 MCP 协议层的事模型通道换了不影响它。4.3 401 与模型 ID 不存在401 最常见的原因是TAOTOKEN_API_KEY没有注入成功或者 Key 被删除、禁用。先确认环境变量是否生效再确认 Key 是从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建的。如果日志里返回的是“模型不存在”则去模型广场复制正确的模型 ID把YOUR_MODEL_ID替换掉。不要直接沿用deepseek-chat除非模型广场当时列表里确实有这个名字。4.4 连接超时与工具调用超时原文把连接超时和工具调用超时分开处理。改走 TaoToken 后仍然要分开看Client 到 MCP Server 的 SSE 连接超时调大connection-timeout和read-timeout模型请求到 TaoToken 的超时检查出口网络和重试配置工具内部调用第三方 API 的超时在RestTemplate或WebClient上单独设置。不要把所有超时都归因到模型通道否则容易改错地方。5. 下一步对一下这次 Spring AI MCP 调用的账5.1 去模型对话确认模型 ID配置保存并跑通天气查询后建议先去 TaoToken 模型对话 用同一把 Key 发一条测试消息确认模型 ID 和 Base URL 没填错。模型对话里能正常返回说明 Key、模型 ID、通道都没问题再回到 Spring AI MCP 里排查工具链。5.2 去控制台看用量与创建新 Key然后打开 控制台 API Keys 看这次调用是否记上账。如果本地、测试、生产混用同一把 Key建议按环境拆成多把方便后续对账。创建新 Key 的入口也在同一个控制台页面。5.3 长期写代码看 Coding Plan如果你准备把 Spring AI MCP 接到日常编码流程里比如让 MCP 工具查询内部文档、查天气、查数学计算模型调用频率会慢慢上来。可以打开 TaoToken Coding Plan 看套餐是否够用。到这一步application.yml里的base-url已经稳定指向https://taotoken.net/apiMCP Server 的getWeather仍然按原样执行Nacos 注册和监控告警也不用推倒重来。真正需要你盯住的是模型 ID 是否随模型广场更新、Key 是否按环境隔离、以及工具超时是否和模型超时分开配置。
返回列表