
1. 为什么要在 Dify 里做 12306 查询应用每年抢票季查车次、盯余票、比价格这套动作手动刷 12306 是真的累。我试过把这件事交给 Dify 智能体来做用户用自然语言说一句「查明天北京到上海的高铁票」Agent 自动调用 12306 查询接口把车次、时刻、历时、座席、票价、余票状态整理成一张干净的表返回。这就是本篇要交付的东西——一个能跑起来的 Dify 12306 查询 AI 应用。但真正动手时很多人会卡在两个地方。第一是模型通道Dify 里要填模型服务地址和 Key如果每个模型都单独申请、单独配 Key工作流一多就乱换模型还得改一堆节点。第二是工具通道12306 查询能力通常以 MCP 服务形式提供Dify 需要通过 Agent 策略插件去连它配置写错一个字段就连不上。所以这篇的路线是用 TaoToken 做统一的模型 Key 与 API 通道Dify 只认一个地址、一个 Key12306 查询能力用 MCP 服务承载通过 Dify 的 Agent 节点调用。整条链路覆盖config.toml与settings.json骨架配置、可复制的 Dify 工作流配置、TaoToken 接入参数、12306 接口调用示例最后给出本地启动与查询验证动作。适合已经会一点 Dify、想把它接到真实工具上的开发者也适合想搞明白「统一 Key 到底省了什么」的同学。2. TaoToken 前置统一 Key 与 API 通道怎么准备先说清楚 TaoToken 在这里扮演的角色。它是一个统一的模型 API 通道你在控制台创建一次 API KeyDify 里所有需要模型能力的地方都填这个 Key服务地址统一指向https://taotoken.net/api。好处是模型切换、额度管理、调用排查都在一个地方看不用在 Dify 的每个节点里维护不同的 Key。第一步打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录进入控制台。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 在里面找到 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 新建一个 Key 并复制保存。这个 Key 只显示一次丢了只能重建。第二步确认你要用的模型名。Dify 的模型配置里需要填模型标识TaoToken 的模型列表可以在模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里先试一下确认这个模型能正常回话再写进 Dify。这一步别省很多人 Dify 报 404 就是因为模型名写错。第三步记住两个地址的区别。官网带 UTM 参数用于来源统计API 地址是纯接口地址不要加参数https://taotoken.net/api。Dify 里填的是后者。如果你后面要做长期编码或 Agent 类高频调用可以看下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 按套餐走比单次调用更划算。注意API Key 属于敏感凭证不要写进会提交到公开仓库的配置文件里。本地调试可以用环境变量或.env下文示例会给出两种写法。3. 可复制配置config.toml 与 settings.json 骨架这一节是全文的核心操作区。Dify 的模型接入配置在不同版本里落点略有差异但骨架逻辑一致一个描述模型供应商与模型的config.toml一个描述运行时设置的settings.json。下面给的是可直接改参数使用的骨架。3.1 config.toml 模型供应商骨架# config.toml # Dify 模型供应商配置骨架服务地址统一指向 TaoToken [provider] name taotoken display_name TaoToken 统一通道 base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY # 从环境变量读取避免硬编码 [[provider.models]] model gpt-4o-mini # 换成你在模型对话页验证过的模型名 model_type llm context_size 128000 max_tokens 4096 temperature 0.3 # 查询类任务建议低温度输出更稳 [[provider.models]] model claude-3-5-sonnet model_type llm context_size 200000 max_tokens 8192 temperature 0.2关键点有三个。base_url必须是https://taotoken.net/api不要带路径后缀。api_key_env指向环境变量名实际 Key 通过环境变量注入。temperature对 12306 这种结构化查询任务建议压到 0.3 以下否则模型容易在排版上自由发挥把车次信息写乱。3.2 settings.json 运行时骨架{ model_provider: taotoken, default_model: gpt-4o-mini, api_base: https://taotoken.net/api, api_key: ${TAOTOKEN_API_KEY}, timeout: 60, retry: { max_attempts: 3, backoff_seconds: 2 }, agent: { strategy: function_calling, max_iterations: 8, tool_timeout: 30 }, mcp_servers: { 12306-mcp: { transport: sse, url: http://127.0.0.1:8080/sse } } }mcp_servers这一段就是 12306 查询能力的挂载点。transport用sseurl指向你本地或内网部署的 12306-mcp 服务地址。如果你把服务部署在另一台机器上把127.0.0.1换成那台机器的内网 IP端口保持一致。3.3 环境变量注入# .env 或 shell 中导出 export TAOTOKEN_API_KEYsk-你的TaoToken密钥 export DIFY_MCP_12306_URLhttp://127.0.0.1:8080/sse配置文件里用${TAOTOKEN_API_KEY}引用运行时由 Dify 读取环境变量替换。这样配置文件可以进版本库Key 不会泄露。4. 12306 查询服务与 Dify Agent 工作流搭建配置写好了接下来把 12306 查询服务跑起来再在 Dify 里建 Agent 工作流。4.1 启动 12306 查询服务12306 查询能力以 MCP 服务形式提供常见做法是拉取开源实现后本地构建运行。下面给出通用步骤具体镜像名以你使用的项目为准。# 拉取 12306-mcp 源码 git clone https://github.com/Joooook/12306-mcp.git cd 12306-mcp # 构建镜像 docker build . -t 12306-mcp # 启动容器映射 8080 端口 docker run --name 12306-mcp -p 8080:8080 -d 12306-mcp npx 12306-mcp --port 8080 # 确认容器在运行 docker ps -a启动后SSE 端点地址是http://127.0.0.1:8080/sse。这个地址要和settings.json里mcp_servers的url完全一致否则 Dify 连不上。4.2 Dify 侧安装 Agent 策略插件进入 Dify 插件市场搜索并安装 Agent 策略插件function calling 类。安装完成后重启 Dify 服务让插件生效。这一步不做后面新建 Agent 节点时选不到策略。4.3 创建智能体并替换 LLM 节点新建一个 Agent 类型应用。默认工作流里会有一个 LLM 节点把它删掉新建 Agent 节点。Agent 节点的模型选择里供应商选 TaoToken模型选你在config.toml里配好的那个服务地址填https://taotoken.net/apiKey 填环境变量注入的那个。4.4 挂载 12306 工具在 Agent 节点的工具配置里添加 MCP 工具填入{ 12306-mcp: { transport: sse, url: http://127.0.0.1:8080/sse } }保存后Agent 就能在推理过程中调用 12306 查询工具了。4.5 提示词设置提示词决定 Agent 怎么组织查询和输出。下面这版可以直接用重点是约束输出格式和排序。instruction 请按照以下步骤执行12306车票查询任务 1. 接收用户输入的中文查询请求包含出发城市、到达城市和日期今天、明天、后天等需要计算具体日期 2. 调用12306-mcp接口获取实时车票数据 3. 若查询无结果返回友好提示抱歉未找到[日期]从[出发城市]到[到达城市]的车次 4. 若有结果按车次整理以下信息 - 车次编号 - 出发/到达时间格式HH:MM - 历时小时分钟 - 座席类型二等座/一等座等 - 对应价格人民币符号¥ - 余票状态充足/少量/无票 5. 使用清晰的中文排版呈现每列车次信息间用空行分隔 6. 按出发时间从早到晚排序车次 7. 绝对禁止包含任何XML标签或代码符号 8. 若遇系统错误返回查询服务暂时不可用请稍后再试 /instruction提示词里第 7 条很关键。不加这条模型有时会把内部推理的标签一起吐出来用户看到一堆尖括号。第 6 条保证车次按时间排序不然输出顺序随机体验很差。4.6 回复节点与发布在 Agent 节点后接一个回复节点把 Agent 的输出直接返回给用户。预览测试通过后点发布。发布后这个应用就能通过 Dify 的 Web 界面或 API 调用了。5. 验证请求与成功结果配置完成后必须做一次端到端验证确认模型通道和工具通道都通。5.1 先验证 TaoToken 通道在 Dify 的模型配置页点「测试」或者直接用 curl 打一次接口curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [{role: user, content: 回复 OK}], max_tokens: 10 }返回里有choices[0].message.content且内容正常说明 Key 和地址都对。如果返回 401检查 Key 是否复制完整返回 404检查模型名是否写错。5.2 再验证 12306 工具通道curl -N http://127.0.0.1:8080/sse能持续收到 SSE 事件流说明服务在跑。如果连接被拒绝检查容器是否启动、端口是否映射正确。5.3 端到端查询验证在 Dify 应用预览里输入查明天北京到上海的高铁票预期输出类似找到3个车次信息 G101 北京南(07:00) → 上海虹桥(12:20) 历时5小时20分 二等座 ¥553余票充足 一等座 ¥933余票充足 商务座 ¥1748余票3张 G15 北京南(12:05) → 上海虹桥(16:25) 历时4小时20分 二等座 ¥558余票少量 商务座 ¥1753余票充足看到这个结果说明整条链路打通Dify 用 TaoToken 的 Key 调模型模型通过 Agent 策略调用 12306 工具工具返回数据模型按提示词排版输出。6. 本篇常见错排查配置过程中最容易踩的坑集中在下面几类对照排查基本能解决。模型报 401 或 403。九成是 Key 问题。检查TAOTOKEN_API_KEY环境变量是否真的注入到 Dify 进程里而不是只写在了.env文件里没被加载。Docker 部署的话确认docker run时带了-e TAOTOKEN_API_KEY...。模型报 404。模型名写错或者base_url多写了路径。base_url只能是https://taotoken.net/api不要写成https://taotoken.net/api/v1Dify 会自己拼路径。Agent 节点选不到策略。Agent 策略插件没装或没重启 Dify。装完插件必须重启服务。12306 工具连不上。检查settings.json里mcp_servers的url和实际服务地址是否一致。容器部署时127.0.0.1在 Dify 容器内指向的是容器自己如果 Dify 也是容器要用宿主机内网 IP 或 Docker 网络别名。输出里带 XML 标签。提示词第 7 条没生效或者模型温度太高。把temperature降到 0.2 再试。查询结果为空但实际有车。日期解析错了。提示词里要求模型把「明天」换算成具体日期如果模型算错可以在提示词里加一句「日期格式统一为 YYYY-MM-DD」。响应超时。settings.json里timeout默认 60 秒12306 查询偶尔慢可以调到 90。retry.max_attempts设 3 次避免偶发失败直接报错。排障时如果怀疑是 Key 或接入配置问题直接去 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 核对 Key 状态接入细节看文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。想先确认模型能不能正常对话用模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 最快。如果你打算把这个应用扩展成长期跑的编码或 Agent 工具Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 更合适。最后补一个实用技巧把config.toml和settings.json里的模型名、地址、超时参数抽成一份env.example模板放进仓库团队成员复制成.env填自己的 Key 就能跑省得每个人重新配一遍。这套骨架不只适用于 12306换成任何 MCP 工具服务改mcp_servers那一段就行。