ARTICLE DETAIL

资讯详情

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

Qwen3+Qwen Agent 智能体开发实战:用 TaoToken 统一 Key 打通 MCP 工具调用链

Qwen3+Qwen Agent 智能体开发实战:用 TaoToken 统一 Key 打通 MCP 工具调用链 1. Qwen3 Qwen Agent 接 MCP 时Key 和通道为什么总打架Qwen3 是阿里通义千问系列里对 Agent 和工具调用支持比较完整的一代Qwen Agent 则是官方配套的智能体开发框架两者组合起来做 MCP 工具调用链是很自然的路线。MCP 全称 Model Context Protocol你可以把它理解成一套“工具插座标准”模型不直接写死某个函数而是通过 MCP 服务端声明自己有哪些工具、参数长什么样Agent 负责在对话中决定什么时候去插哪个插座。适合谁适合已经在本地跑通 Qwen Agent 多轮对话、想进一步把 SQLite、文件系统、HTTP 接口这类外部能力挂进智能体的开发者。真正卡人的地方往往不在模型而在“凭证 通道”这一层。Qwen Agent 默认走 DashScope 的 model_serverapi_key 直接写在 llm_cfg 里MCP 工具又是 stdio 子进程配置写在 tools 数组里。本地开发时你可能会同时维护好几套 Key一个给对话模型一个给代码解释器一个给 MCP 服务端里可能调用的外部 API。改一次 Key 要翻三四个文件环境变量和硬编码混在一起报 401 的时候根本不知道是哪一层挂了。我试过把模型调用统一收敛到一个兼容 OpenAI 协议的入口Qwen Agent 这边只改 base_url 和 api_key 两个字段MCP 工具声明保持不动。这样 Key 只有一份通道只有一条排错时先看通道再看工具链路清晰很多。下面就把这套配置链路拆成可复制的骨架包括 config.toml、settings.json 和 MCP 工具声明片段最后跑一次端到端调用验证。2. TaoToken 前置统一 Key 与 API 通道的准备TaoToken 在这里扮演的是“统一入口”的角色它提供兼容 OpenAI 协议的 API 通道Qwen Agent 只要把 model_server 指向它就能用同一把 Key 请求 Qwen3 系列模型。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 注意 API 地址后面不加 UTM 参数直接用于代码里的 base_url。你需要先拿到一把 API Key。进入控制台创建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 。生成后复制那串 sk- 开头的字符串后面 config.toml 和 settings.json 都会用到。如果你还没决定用哪个模型可以先去模型对话页面试一下 Qwen3 的返回格式https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。这里有个容易忽略的点Qwen Agent 的 llm_cfg 里 model_server 字段决定它走哪套协议。填 dashscope 时它走 DashScope 原生协议填 openai 时走 OpenAI 兼容协议。TaoToken 的通道是 OpenAI 兼容的所以 model_server 要写 openai同时补上 base_url。很多人只改了 api_key 没改 model_server结果请求发到默认地址报的是模型不存在而不是鉴权失败排查方向直接跑偏。3. 可复制配置config.toml、settings.json 与 MCP 工具声明先建一个干净的项目目录用 conda 起虚拟环境Python 版本建议 3.12conda create -n qwen_mcp python3.12 -y conda activate qwen_mcp pip install -U qwen-agent[rag,code_interpreter,gui,mcp] pip install uvuv 是给 MCP 服务端用的mcp-server-sqlite 这类服务通过 uvx 拉起没有 uv 会报 command not found。接着写 config.toml放在项目根目录用来集中管理通道和 Key避免散落在代码里# config.toml [llm] model qwen3-235b-a22b model_server openai base_url https://taotoken.net/api api_key sk-你的TaoToken密钥 top_p 0.8 [mcp.sqlite] command uvx args [mcp-server-sqlite, --db-path, test.db]settings.json 用来放 MCP 服务端的通用声明方便后续扩展多个工具{ mcpServers: { sqlite: { command: uvx, args: [mcp-server-sqlite, --db-path, test.db] } } }然后在 Python 里读取 config.toml构造 llm_cfg 和 tools。MCP 工具声明片段就是 Qwen Agent 认的 JSON Schema 格式和 settings.json 里的结构一致import tomllib from qwen_agent.agents import Assistant from qwen_agent.utils.output_beautify import typewriter_print with open(config.toml, rb) as f: cfg tomllib.load(f) llm_cfg { model: cfg[llm][model], model_server: cfg[llm][model_server], base_url: cfg[llm][base_url], api_key: cfg[llm][api_key], generate_cfg: {top_p: cfg[llm][top_p]}, } tools [{ mcpServers: { sqlite: { command: cfg[mcp][sqlite][command], args: cfg[mcp][sqlite][args], } } }] def init_agent_service(): bot Assistant( llmllm_cfg, name数据库管理员, description你是一位数据库管理员具有对本地数据库的增删改查能力, system_message你扮演一个数据库助手你具有查询数据库的能力, function_listtools, ) return bot注意 base_url 写的是 https://taotoken.net/api 不要在后面拼 /v1 或加斜杠Qwen Agent 内部会按 OpenAI 协议补全路径。api_key 从 config.toml 读不要硬编码进 Python 文件否则提交代码时容易泄露。4. 验证请求一次端到端 MCP 工具调用配置写好后跑一次完整调用让 Qwen3 通过 MCP 工具在 SQLite 里建表并插数据def run_query(queryNone): bot init_agent_service() messages [{role: user, content: [{text: query}]}] previous_text print(数据库管理员: , end, flushTrue) for response in bot.run(messages): previous_text typewriter_print(response, previous_text) if __name__ __main__: query 帮我创建一个学生表,表名是students,包含id, name, age, gender, score字段,然后插入一条数据,id为1,name为张三,age为20,gender为男,score为95 run_query(query)执行后你会看到两类输出一类是 uvx 自动安装 mcp-server-sqlite 依赖的日志另一类是 Qwen3 的思考过程它会先判断需要调用 sqlite-create_table再调用 sqlite-write_query。跑完后本地目录会多出 test.db 文件。再用一段独立脚本验证数据真的落库了import sqlite3 conn sqlite3.connect(test.db) cursor conn.cursor() cursor.execute(SELECT name FROM sqlite_master WHERE typetable;) tables cursor.fetchall() print(数据库中的表:, tables) if tables: table_name tables[0][0] cursor.execute(fSELECT * FROM {table_name}) print(f{table_name} 表中的数据:, cursor.fetchall()) else: print(数据库中没有表需要先创建表并插入数据) conn.close()如果输出里能看到 students 表和 (1, 张三, 20, 男, 95) 这条记录说明整条链路是通的Qwen Agent 用 TaoToken 的 Key 请求 Qwen3Qwen3 决定调用 MCP 工具MCP 服务端在本地执行 SQLite 操作。成功结果的关键标志是“模型返回里出现 tool_calls 且本地文件发生变化”两者缺一不可。5. 本篇常见错排查5.1 报 401 或 invalid api key先确认 config.toml 里的 api_key 是完整的 sk- 开头字符串没有多余空格或换行。再确认 model_server 写的是 openai 而不是 dashscopebase_url 是 https://taotoken.net/api 。如果 Key 是在 API Keys 页面刚生成的复制时容易带上首尾空白用 repr() 打印一下确认。5.2 报 model not foundQwen Agent 走 OpenAI 协议时model 字段要填 TaoToken 通道支持的模型名比如 qwen3-235b-a22b。如果你填的是 DashScope 特有的别名通道侧可能不认。先去模型对话页面确认可用模型名再回填 config.toml。5.3 MCP 服务端起不来报 uvx: command not found说明 uv 没装或不在当前虚拟环境的 PATH 里。在激活的 conda 环境里执行 pip install uv然后用 which uvx 确认路径。如果还是找不到把 command 改成 uv 的绝对路径比如 /Users/你的用户名/miniconda3/envs/qwen_mcp/bin/uvx。5.4 工具调用没触发模型只回文字检查 function_list 是否传了 tools 数组以及 tools 里的 mcpServers 结构是否和 settings.json 一致。Qwen Agent 对 MCP 配置的解析是严格的key 名写错一个字母就会静默忽略。另外 system_message 里最好明确写“你具有查询数据库的能力”给模型一个调用工具的动机。5.5 数据库文件生成了但表是空的这种情况通常是 MCP 服务端的工作目录和你以为的不一样。uvx 拉起子进程时--db-path 如果是相对路径会相对于子进程的 cwd 解析。建议在 args 里写绝对路径比如 [mcp-server-sqlite, --db-path, /你的项目路径/test.db]避免文件落到别处。6. 把 Key 收敛到一条通道之后这套配置跑通后你手里其实只有一份 config.toml 需要维护。换模型只改 model 字段换 Key 只改 api_key加 MCP 工具只在 tools 数组里追加一段声明。Qwen Agent 的 Assistant 组件负责编排Qwen3 负责决策MCP 服务端负责执行TaoToken 负责把模型请求收敛到一条兼容 OpenAI 协议的通道上。如果你后面要做长期编码类 Agent或者想让智能体在多个会话之间保持工具调用状态可以看一下 Coding Plan 的额度方案https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入过程中遇到协议或参数问题接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面把 base_url、鉴权头和常见返回码都列清楚了。Claude Code 相关的 Anthropic 兼容配置也有单独页面https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后留一个实操建议每次改完 config.toml先跑一个最小请求确认通道通再跑 MCP 工具调用。两步分开验证报错时能立刻定位是通道层还是工具层的问题比一上来就跑完整 Agent 省时间。
返回列表