ARTICLE DETAIL

资讯详情

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

agent-skill 与 subagent 到底怎么分?用 TaoToken 统一 Key 跑通两种调用链

agent-skill 与 subagent 到底怎么分?用 TaoToken 统一 Key 跑通两种调用链 1. 从一次调用链踩坑说起skill 和 subagent 到底谁在干活如果你正在搭多智能体工作流大概率遇到过这个场景主 Agent 收到一句「帮我审一下这段代码」然后你发现日志里既出现了skill: syntax_check又出现了subagent: code_reviewer最后你搞不清到底是哪个环节在真正执行任务。更麻烦的是两者用的 Key 不一样、通道不一样排查问题时根本对不上号。这就是 agent-skill 与 subagent 最容易混淆的地方。简单说agent-skill 是「能力组件」本质是一个无自主决策的执行单元比如文本摘要 skill、OCR 识别 skill、代码生成 skill它必须依附在主智能体的调度逻辑上才能跑起来。而 subagent 是「层级子个体」是一个具备轻量化自主决策能力的迷你智能体有自己的感知、规划、执行逻辑可以独立完成细分任务。一个 subagent 内部可以挂载多个 agent-skill比如「代码审查 subagent」可能同时集成了语法检测 skill、漏洞扫描 skill、性能分析 skill。从调用链视角看区别更清晰skill 是「被调用者」subagent 是「调用者兼被调用者」。主 Agent 可以直接挂载 skill 做轻量扩展也可以拆分出独立 subagent 处理复杂任务。问题在于当你用不同的 API Key 分别触发这两条链路时日志会散落在不同通道验证成本极高。这篇就带你用 TaoToken 统一 Key 和 API 通道把两种调用链跑通并验证。2. 前置准备用 TaoToken 统一 Key 打通两条调用链在动手写配置之前先把通道统一。TaoToken 的作用是提供一个统一的 API 入口让你用同一个 Key 分别触发 skill 调用和 subagent 调用这样日志和计费都能在一个地方对齐。你需要先拿到 Key。访问控制台创建 API Keyhttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite创建完成后你会得到一个形如sk-xxxx的 Key。接下来确认 API 基地址注意这里不加 UTMhttps://taotoken.net/api模型对话入口可以用来快速验证 Key 是否可用https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite如果你后续要做长期编码或 Agent 工作流可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite接入文档在这里配置细节以文档为准https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite环境变量先设好后面所有配置都引用它避免 Key 硬编码export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api注意Key 只放在环境变量或本地配置里不要提交到 Git 仓库。日志排查时如果发现 Key 泄露第一时间去控制台吊销重建。3. 可复制配置settings.json 与 config.toml 骨架下面给出两份骨架配置。settings.json用于定义 skill 与 subagent 的注册关系config.toml用于定义 API 通道和调用参数。两者配合才能让同一个 Key 分别触发两条链路。3.1 settings.json定义 skill 与 subagent 的挂载关系{ agent: { name: main_agent, api_key_env: TAOTOKEN_API_KEY, base_url_env: TAOTOKEN_BASE_URL, skills: [ { id: syntax_check, type: agent-skill, entry: skills.syntax_check:run, description: 语法检测无自主决策输入代码返回问题列表 }, { id: vuln_scan, type: agent-skill, entry: skills.vuln_scan:run, description: 漏洞扫描依赖规则库 } ], subagents: [ { id: code_reviewer, type: subagent, entry: subagents.code_reviewer:main, skills: [syntax_check, vuln_scan], description: 代码审查子智能体自主规划审查步骤并调度 skill } ] } }关键点skills数组里的是 agent-skill它们没有自己的调度循环subagents数组里的是 subagent它通过skills字段引用 skill形成「subagent 调度 skill」的层级关系。3.2 config.toml统一 API 通道与调用参数[api] base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} timeout 60 max_retries 3 [api.headers] Content-Type application/json [skill.default] model qwen3-vl-8b temperature 0.1 max_tokens 2048 [subagent.default] model qwen3-vl-32b temperature 0.3 max_tokens 4096 planning_depth 3 [logging] level debug log_file ./logs/agent_call.log log_skill_calls true log_subagent_calls true这里把 skill 和 subagent 的模型参数分开配置是因为两者职责不同skill 是单一执行单元温度调低保证稳定subagent 需要规划温度略高、token 上限更大。log_skill_calls和log_subagent_calls都打开后面验证时才能区分两条链路。4. 验证请求分别触发 skill 与 subagent 并检查日志配置写好后不要急着跑完整工作流先用最小请求分别验证两条链路是否生效。4.1 直接触发 agent-skillskill 的调用是「直接执行」不经过规划层。用一个 Python 脚本模拟import os import json import requests base_url os.environ[TAOTOKEN_BASE_URL] api_key os.environ[TAOTOKEN_API_KEY] payload { model: qwen3-vl-8b, messages: [ {role: system, content: 你是语法检测 skill只返回问题列表。}, {role: user, content: 检查这段代码def f(x) return x1} ], temperature: 0.1 } resp requests.post( f{base_url}/v1/chat/completions, headers{Authorization: fBearer {api_key}}, jsonpayload, timeout60 ) print(resp.status_code) print(json.dumps(resp.json(), ensure_asciiFalse, indent2))预期结果返回 200内容里包含「缺少冒号」之类的语法问题。日志中应出现skill_call: syntax_check标记。4.2 触发 subagentsubagent 的调用会先走规划再调度 skill。请求体里通过agent_id指定payload { model: qwen3-vl-32b, agent_id: code_reviewer, messages: [ {role: user, content: 审查这段代码并给出修复建议def f(x) return x1} ], temperature: 0.3, max_tokens: 4096 } resp requests.post( f{base_url}/v1/chat/completions, headers{Authorization: fBearer {api_key}}, jsonpayload, timeout60 ) print(resp.status_code) print(json.dumps(resp.json(), ensure_asciiFalse, indent2))预期结果返回 200内容里不仅有语法问题还有修复建议和审查步骤。日志中应出现subagent_call: code_reviewer以及它内部调用的skill_call: syntax_check、skill_call: vuln_scan。4.3 日志检查动作打开./logs/agent_call.log按时间顺序核对日志标记含义出现时机skill_call: syntax_checkskill 被直接调用4.1 请求后subagent_call: code_reviewersubagent 启动4.2 请求后subagent_plan: step1subagent 规划步骤4.2 请求中skill_call: vuln_scansubagent 内部调度 skill4.2 请求中如果 4.1 只出现 skill 标记、4.2 同时出现 subagent 和 skill 标记说明两条调用链已经区分开且都生效。5. 本篇常见错排查5.1 两条链路日志混在一起分不清最常见的原因是log_skill_calls和log_subagent_calls没同时打开或者用了两个不同的 Key 导致日志写到不同文件。统一用 TaoToken 的同一个 Key并在 config.toml 里把两个开关都设为 true。5.2 subagent 没有调度 skill检查 settings.json 里 subagent 的skills字段是否引用了正确的 skill id。如果 id 拼写不一致subagent 会启动但找不到可调度的 skill日志里只有subagent_call没有skill_call。5.3 skill 调用返回 401说明 Key 没被正确读取。确认环境变量TAOTOKEN_API_KEY已 export且 config.toml 里写的是${TAOTOKEN_API_KEY}而不是硬编码的空值。如果用的是模型对话入口测试确认请求头是Authorization: Bearer sk-xxx。5.4 subagent 规划深度过大导致超时planning_depth 3是保守值。如果你的任务复杂可以调到 5但要注意 timeout 也要相应放大。实测下来depth 超过 5 后收益递减反而容易触发超时。5.5 模型名写错导致 404skill 和 subagent 用的模型名必须和 TaoToken 支持的模型列表一致。去模型对话入口确认可用模型名不要凭记忆写。6. 把统一 Key 用顺后续接入与长期编码两条链路跑通后你会发现统一 Key 的最大价值是「可观测」skill 和 subagent 的调用都走同一个通道日志、计费、限流都在一处排查问题时不用来回切换。如果你要长期跑编码类 Agent建议把 Coding Plan 也接进来让 skill 和 subagent 共享同一套配额策略https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite接入细节以文档为准配置项和本篇的 config.toml 可以复用https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite最后留一个实用技巧在 settings.json 里给每个 skill 和 subagent 加一个tag字段日志里会带上这个 tag排查时用grep tagcode_review就能一次性捞出整条调用链比按时间翻日志快得多。
返回列表