1. 为什么 JoyAgent-JDGenie 值得本地跑一遍
JoyAgent-JDGenie 是京东开源的一款端到端通用多智能体产品,在 GAIA 基准测试上拿到 75.15% 的准确率,超过 OWL(CAMEL)的 64.24% 和 OpenManus 的 40.61%。它不是只开源一个框架壳子,而是把前端、后端、执行引擎、报告 Agent、代码 Agent、PPT Agent、文件 Agent 整套放出来,属于「产品级」开源。适合谁?想在自己机器上复现多智能体端到端任务、想研究 Plan & Executor 与 React 双模式调度、想把统一 Key 接进多模型路由的开发者。
我这次的目标很明确:不改业务代码,只通过一份统一 Key 把 JoyAgent-JDGenie 的模型调用层接起来,然后跑一个 GAIA 风格的样例任务,核对结果。下面把 config.toml、settings.json 骨架和验证清单都给出来,你可以直接抄。
2. TaoToken 前置:统一 Key 与接入地址
JoyAgent-JDGenie 默认会读环境变量里的模型配置。为了不让每个子 Agent 各配一套 Key,我用 TaoToken 做统一入口:一个 Key 覆盖对话模型、代码模型、报告模型,省去在 application.yml 里到处填不同厂商的 base_url。
需要先拿到 Key,入口在这里:
- 控制台取 Key:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console
- API Key 管理页:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api-keys
- 接入文档(base_url 与兼容格式):https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc
API 基地址统一用https://taotoken.net/api(这个地址不加 UTM,直接写进配置)。它兼容 OpenAI 风格的/v1/chat/completions,所以 JoyAgent 里凡是走 OpenAI SDK 的调用点,改 base_url 和 api_key 就能通。
注意:Key 只放环境变量或本地 settings.json,不要提交到 Git。下面配置里我用
${TAOTOKEN_API_KEY}占位。
3. 可复制配置:config.toml 与 settings.json 骨架
JoyAgent-JDGenie 的 Python 侧(genie-tool)用 uv 管理依赖,Java 侧(genie-backend)读 application.yml。我额外加了两份统一配置文件,让模型层集中管理。
先建目录结构:
mkdir -p ~/joyagent-config cd ~/joyagent-config3.1 config.toml(模型路由与统一 Key)
# ~/joyagent-config/config.toml # JoyAgent-JDGenie 统一模型配置,所有子 Agent 共用 TaoToken Key [provider] name = "taotoken" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" api_style = "openai" # 兼容 /v1/chat/completions [models] # 主规划模型:Plan & Executor 模式用 planner = "gpt-4o" # 执行模型:React 模式子 Agent 用 executor = "gpt-4o-mini" # 代码 Agent 专用 coder = "claude-3-5-sonnet" # 报告 / PPT 生成 reporter = "gpt-4o" [agent] max_turns = 12 enable_memory = true # 跨任务记忆 enable_tool_evolve = true # 工具自动进化 dag_concurrency = 4 # DAG 执行引擎并发度 [gaia] dataset = "gaia_validation" level = "level1" timeout_seconds = 3003.2 settings.json(后端读取的运行时配置)
{ "llm": { "provider": "taotoken", "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "default_model": "gpt-4o", "fallback_model": "gpt-4o-mini" }, "agents": { "report": { "model": "gpt-4o", "enabled": true }, "code": { "model": "claude-3-5-sonnet", "enabled": true }, "file": { "model": "gpt-4o-mini", "enabled": true }, "ppt": { "model": "gpt-4o", "enabled": true } }, "mcp": { "servers": [] }, "runtime": { "work_dir": "./genie-workspace", "log_level": "INFO" } }3.3 环境变量与启动
export TAOTOKEN_API_KEY="sk-你的Key" export JOYAGENT_CONFIG="$HOME/joyagent-config/config.toml" export JOYAGENT_SETTINGS="$HOME/joyagent-config/settings.json" # 依赖安装 pip install uv cd genie-tool uv sync source .venv/bin/activate # 首次初始化 sh start_genie_init.sh # 后续启动 sh start_genie.shJava 侧如果走 application.yml,把模型段替换成:
llm: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY} model: gpt-4o这样前端、后端、Python 工具层三处都指向同一个 Key,不用再分厂商维护。
4. 验证请求:GAIA 样例任务与结果核对
配置写完必须验证,不然你不知道是 Key 没通还是 Agent 调度出错。分两步:先验模型连通,再跑 GAIA 样例。
4.1 先验 Key 连通性
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": "reply with ok"}] }'返回里有choices[0].message.content就说明 Key 和 base_url 都对。这一步不通,后面 Agent 一定报错。
4.2 跑一个 GAIA Level1 样例
GAIA 的 Level1 任务通常是「查一个事实 + 简单推理」。我用一个典型样例:给定一段公开网页信息,要求 Agent 检索并给出答案。
cd genie-tool python -m genie.run \ --task "Find the name of the tallest building in the city where the 2024 summer Olympics were held, and report its height in meters." \ --level level1 \ --config "$JOYAGENT_CONFIG"执行时观察日志里的几个关键点:
planner是否先输出任务分解(Plan & Executor 模式)- 子 Agent 是否被正确路由到 file / report
- DAG 引擎是否并发执行了检索与推理分支
- 最终是否输出结构化答案
4.3 结果核对清单
| 核对项 | 期望结果 | 不通过时看哪 |
|---|---|---|
| 模型调用 | 无 401/404 | Key、base_url、模型名 |
| 任务分解 | 有 plan 输出 | planner 模型是否可用 |
| 子 Agent 路由 | report/code/file 被调用 | settings.json agents 段 |
| DAG 并发 | 日志出现并行分支 | dag_concurrency 配置 |
| 最终答案 | 与 GAIA 标注一致 | 检索工具是否挂载 |
| 记忆复用 | 第二次相似任务命中缓存 | enable_memory |
跑通后,你可以把--level换成 level2 复测,JoyAgent-JDGenie 在 Level2 的得分是 77.91%,比 Level1 的 86.79% 低,说明多跳推理是难点,正好用来观察 Plan 模式的表现。
5. 本篇常见错排查
报 401 Unauthorized:九成是TAOTOKEN_API_KEY没 export,或者 settings.json 里写成了字面量${TAOTOKEN_API_KEY}而没做变量替换。检查echo $TAOTOKEN_API_KEY是否有值。
报 model not found:config.toml 里的模型名要和 TaoToken 文档里支持的名称一致。别自己拼gpt4o这种简写,用gpt-4o。
Agent 卡在 planning 不动:planner 模型超时。把max_turns调小,或换gpt-4o-mini先跑通流程,再换回大模型。
DAG 并发报资源冲突:dag_concurrency设太高,本地机器扛不住。降到 2 再试。
GAIA 答案对不上:先确认检索工具(file Agent)是否真的挂载成功,很多「答错」其实是没检索到源信息,不是推理错。
Java 侧读不到配置:application.yml 的缩进容易错,llm:下面必须是两个空格,不是 Tab。
提示:排障时优先看
genie-workspace下的运行日志,里面会打印每次模型请求的 base_url 和状态码,比猜快得多。
6. 把统一 Key 接进你的多智能体工作流
JoyAgent-JDGenie 的价值在于端到端:从任务输入到报告输出,中间不需要你手动串子 Agent。而 TaoToken 统一 Key 的价值在于,你只维护一份凭证,就能让 planner、executor、coder、reporter 四个角色各用各的模型,不用在四个厂商后台之间来回切。
如果你后面要长期跑编码类 Agent 任务,可以看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding-plan
想直接在网页里对比不同模型对同一个 GAIA 任务的输出,用模型对话:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=chat
接入细节和兼容格式以文档为准:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc
我实测下来,最容易踩的坑不是模型能力,而是配置分散——三处 base_url 不一致,排查半天。把 config.toml 和 settings.json 集中管理后,换模型只改一个文件,重跑 GAIA 样例就能验证,效率高很多。