TECH NOTE
867 字 4 分钟 系列 21 / 22demo/ — Subagents 抓包实验(手写版 + Deep Agents 版)
收录于合集 多 Agent 精讲 / 实验与总览
ON THIS PAGE / 目录4 节
配套笔记:
../13-附录-Subagents为什么是4次调用-抓包实录.md—— 手写@tool包装版,4 次模型调用的报文解读../14-附录-手写Tool包装vsDeepAgents内置subagents.md—— 手写版 vs Deep Agentssubagents=的逐项对照
文件清单
| 文件 | 作用 |
|---|---|
demo.py | 手写版最小 Subagents 系统:主管(1 个工具 schedule_event)+ 日历子智能体(1 个工具 create_calendar_event,桩函数)。跑一次用户请求会产生 4 次模型调用。 |
deepagents_demo.py | Deep Agents 版:create_deep_agent(tools=[save_note], subagents=[research_subagent])。用来对照”subagents= 参数最终变成了什么”。 |
capture.py | mitmdump addon:把 api.deepseek.com 的请求/响应正文逐条落成 JSONL(输出路径可用 CAPTURE_OUT 指定)。 |
summarize.py | 把抓包 JSONL 汇总成”第 N 次调用:请求了什么上下文 → 产出了什么”的可读清单(兼容 Responses / Chat 两种协议)。 |
captured.jsonl | 手写版实测抓包(4 条 HTTP 往返,16 KB,只含正文,不含请求头与密钥)。 |
captured_deepagents.jsonl | Deep Agents 版实测抓包(4 条 HTTP 往返,约 107 KB——因为 task + 7 个文件系统工具的 schema 都要随每次请求发送)。 |
跑一遍
# 1) 模型配置(不要写进代码/仓库)export CLOUD_MODEL_BASE_URL=https://api.deepseek.comexport CLOUD_MODEL_API_KEY=<你的 key>export CLOUD_MODEL_NAME=deepseek-v4-flash-vision-expexport CLOUD_MODEL_DEFAULT_REF=deepseekexport CLOUD_MODEL_PROVIDER=deepseekexport CLOUD_MODEL_PROTOCOL=RESPONSES # 或 CHAT,两条路都验证过
# 2) 直接跑(不抓包)python demo.py # 手写版python deepagents_demo.py # Deep Agents 版
# 3) 抓包跑(另开一个终端起代理)python -m venv /tmp/mitmenv && /tmp/mitmenv/bin/pip install mitmproxy/tmp/mitmenv/bin/mitmdump -q -s capture.py -p 8888 --set confdir=/tmp/subagents-demo/.mitmproxyHTTPS_PROXY=http://127.0.0.1:8888 SSL_CERT_FILE=/tmp/subagents-demo/.mitmproxy/mitmproxy-ca-cert.pem python demo.py# Deep Agents 版换个输出文件,避免覆盖上一次抓包:CAPTURE_OUT=$PWD/captured_deepagents.jsonl /tmp/mitmenv/bin/mitmdump -q -s capture.py -p 8888 --set confdir=/tmp/subagents-demo/.mitmproxyHTTPS_PROXY=http://127.0.0.1:8888 SSL_CERT_FILE=/tmp/subagents-demo/.mitmproxy/mitmproxy-ca-cert.pem python deepagents_demo.py
# 4) 看结果python summarize.py captured.jsonlpython summarize.py captured_deepagents.jsonl实测结果速览(2026-09-01)
手写版(demo.py,详见 13 篇):4 次调用 / 2227 in + 720 out tokens / 端到端约 5 秒。
| # | 谁在调模型 | 上下文 | 产出 | in / out tokens |
|---|---|---|---|---|
| 1 | 主管 | system + 用户原话 | function_call: schedule_event | 347 / 75 |
| 2 | 日历子智能体 | 自己的 system + 转交的请求 | function_call: create_calendar_event | 398 / 584 |
| 3 | 日历子智能体 | 上者 + 工具结果 | 文本(回给主管) | 1020 / 30 |
| 4 | 主管 | system + 用户原话 + 1 的调用 + 3 的结果 | 文本(给用户) | 462 / 31 |
Deep Agents 版(deepagents_demo.py,详见 14 篇):形状同构,但首轮上下文大得多。
| # | 谁在调模型 | 上下文 | 产出 | in / out tokens |
|---|---|---|---|---|
| 1 | 主管 | system + 用户原话 + 9 个工具的 schema | task(description, subagent_type="research-agent") | 2622 / 466 |
| 2 | 调研子智能体 | 只有自己的 system + 主管给的任务描述 | ls(path="/") | 2536 / 841 |
| 3 | 调研子智能体 | 上者 + ls 结果 | 调研结论(回给主管) | 3392 / 1473 |
| 4 | 主管 | system + 用户原话 + task 调用 + 工具结果 | 面向用户的回答 | 4561 / 933 |
Deep Agents 的派活次数由模型决定:同一份代码另一次运行里,主管连续调了 5 次
task(12 条消息)。所以”Deep Agents 一次请求等于几次模型调用”没有固定答案。
环境说明
- 解释器:Python 3.11 +
langchain1.x +langchain-openai1.x(文档里的create_agent/@toolAPI);Deep Agents 版另需deepagents0.7.5。 - 模型:请求名
deepseek-v4-flash-vision-exp,接口回报的实际模型是deepseek-flash(/v1/models里只有deepseek-flash、deepseek-v4-pro)。 - 协议:
/v1/responses(Responses API)与/v1/chat/completions都能跑通工具调用;本仓库抓的是 Responses 协议。 - 子智能体里的
create_calendar_event是桩函数(不写真实日历),只为让”子智能体自己也要调工具”这一步真实发生。 - Deep Agents 版里
research-agent没有显式指定tools,所以它继承了主 Agent 的全部工具(文件系统工具 +save_note)——这正是14篇要提醒的默认值之一。
demo/ — Subagents 抓包实验(手写版 + Deep Agents 版)
https://aicooleo.cn/blog/posts/multiagent-demo/