ARTICLE DETAIL

资讯详情

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

Agent-Reach:面向多智能体协同的CLI调度框架

Agent-Reach:面向多智能体协同的CLI调度框架 1. 项目概述Agent-Reach 是什么它解决的不是“调用API”而是“调度智能体”的根本问题Agent-Reach 这个名字乍看像一个普通工具库但如果你在 GitHub 上搜到 shihabal3amri/diplay注意这不是官方仓库而是社区衍生项目再结合热词里反复出现的llm-deepseek: no api key for provider route deepseek-official、zcode cli、codex cli、mineru api你就会意识到——这根本不是又一个封装 requests 的 Python 包。它是一套面向多智能体协同执行场景的轻量级 CLI 调度框架核心使命是让开发者能像操作本地命令一样统一编排、路由、监控和回退多个 LLM 智能体Agent的调用链路而无需为每个模型单独写胶水代码、硬编码 API Key、手动处理 token 截断或 provider 错误重试。我去年在做企业知识库问答系统时踩过这个坑前端要调 DeepSeek-R1 做长文档摘要中间用 Qwen2.5-72B 做逻辑推理最后用 GLM-4-Flash 生成报告。三个模型来自不同厂商API 格式不一致OpenAI-style / DashScope-style / Zhipu-style错误码五花八门400/429/503token 限制差异极大DeepSeek 最高 1048576Qwen 32768GLM 65536。每次加一个新模型就得重写一层 adapter retry fallback logging。Agent-Reach 就是为这种“多模型混搭”场景而生的——它不提供大模型也不托管模型它只做一件事把模型当“服务节点”把 prompt 当“数据包”把 CLI 当“控制台”把整个调用链变成可声明、可调试、可复用的流水线。它的关键词CLI不是噱头而是设计哲学所有能力必须能通过agent-reach run --config config.yaml启动所有参数必须能通过--model deepseek-r1 --input ./data.json --output ./result.json注入所有状态必须能通过agent-reach status --job-id abc123查看。Python 是它的实现语言GitHub 是它的分发渠道但它的价值不在代码本身而在它定义的Agent Protocol一种 YAML 驱动的、支持条件分支、并行调用、自动降级、上下文透传的智能体协作协议。换句话说你写的不是 Python 脚本而是一份“智能体工作说明书”。适合谁不是初学 Python 的小白——他们连 pip install 都可能卡在镜像源也不是只想跑通一个 API 的新手——用 requests 三行代码就能搞定。它真正适合的是已经用过至少两个不同厂商大模型 API、正在搭建 RAG 流程、需要快速验证多模型组合策略、且对运维可观测性有基本要求的中阶开发者。如果你还在为API Error: 400 this models maximum context length is 1048576 tokens这类报错手动切分文本Agent-Reach 就是你该停下手头活儿去研究的工具。2. 架构设计与核心思路为什么不用 FastAPI 做服务而坚持 CLI 优先2.1 拒绝“服务化陷阱”从开发闭环到部署闭环的思维切换很多团队一上来就想用 FastAPI 或 Flask 把 Agent 封装成 HTTP 服务理由很充分方便前端调用、便于负载均衡、天然支持异步。但我在三个真实项目里验证过这种架构在早期阶段反而拖慢迭代速度。原因很简单HTTP 层引入了额外的序列化/反序列化开销、网络延迟不可控、错误堆栈被中间件截断、本地调试需启服务配 CORS改 host。而 Agent-Reach 的 CLI 设计本质是把“智能体编排”这件事拉回到开发者的终端工作流里——就像你用 git commit 提交代码、用 pytest 运行测试一样自然。举个具体例子我们曾用 FastAPI 封装一个 DeepSeek-R1 的摘要服务前端传 JSON后端解析、调用 API、返回结果。但很快发现开发者想测试新 prompt得改前端表单 → 刷新页面 → 看 network tab → 复制 response → 粘贴进 postman 改参数 → 再试……整个过程 2 分钟起步而用 Agent-Reach只需一条命令agent-reach run \ --model deepseek-r1 \ --prompt 请用不超过200字总结以下内容{{input.text}} \ --input ./test_data.json \ --output ./summary.json输入文件test_data.json里直接放原始文本输出自动生成结构化 JSON。改 prompt改 YAML 配置文件再 run 一次耗时 3 秒。这就是 CLI 优先带来的开发反馈闭环压缩——从分钟级降到秒级。提示Agent-Reach 的 CLI 不是简单包装 subprocess它内置了完整的 argument parser、YAML loader、JSON schema validator 和 structured logger。所有参数最终都会被转换为统一的AgentRequest对象再由Router分发给对应 Provider。这种设计保证了“命令行体验”和“程序接口一致性”的双重优势。2.2 Provider 路由层如何让deepseek-official和zhipu-pro共享同一套重试逻辑热词里高频出现的llm-deepseek: no api key for provider route deepseek-official暴露了一个关键事实用户不是缺 API Key而是缺统一的密钥管理与路由策略。Agent-Reach 的解决方案非常务实它不强制你把所有 Key 存进环境变量而是定义了一套provider.yaml配置规范providers: deepseek-official: type: http base_url: https://api.deepseek.com/v1 auth_type: bearer # key 不写死而是引用环境变量名 api_key_env: DEEPSEEK_API_KEY rate_limit: 60/minute timeout: 60s max_retries: 3 fallback_to: deepseek-mirror # 自动降级目标 deepseek-mirror: type: http base_url: https://api.deepseek-mirror.example.com/v1 auth_type: bearer api_key_env: DEEPSEEK_MIRROR_KEY # 此处不设 fallback避免无限循环看到没fallback_to字段才是精髓。当deepseek-official返回 429限流或 503服务不可用时Agent-Reach 的Router会自动捕获异常检查当前 provider 是否配置了fallback_to如果有则用相同参数重试目标 provider且重试次数计入总max_retries。整个过程对上层业务逻辑完全透明——你的 YAML 配置里只写--model deepseek-official实际执行时可能走的是镜像站。为什么这样设计因为现实中的大模型服务稳定性远低于预期。DeepSeek 官方 API 在流量高峰时响应延迟常超 30sZhipu 的免费 tier 每小时只允许 100 次调用Qwen 的 token 限制在长文本场景下极易触发 400 错误。硬编码重试逻辑到每个模型调用里会导致代码重复率飙升而集中到 Provider 层统一管理既保证策略一致性又便于灰度发布比如先给 10% 流量切到 mirror观察成功率后再全量。2.3 Agent 协议YAML 不是配置文件而是可执行的“智能体剧本”Agent-Reach 的核心创新点在于它定义的agent.yaml协议。这不是传统意义上的配置文件而是一种声明式工作流语言。一个典型文件长这样version: 1.0 name: research-report-gen description: 生成技术调研报告含摘要、对比分析、结论 steps: - id: extract-keypoints model: deepseek-r1 prompt: | 请从以下技术文档中提取5个核心要点每点不超过30字 {{input.document}} output_schema: keypoints: [string] - id: compare-models model: qwen2.5-72b prompt: | 基于以下要点对比 DeepSeek-R1 和 Qwen2.5-72B 在长文本理解上的优劣 {{steps.extract-keypoints.output.keypoints}} depends_on: [extract-keypoints] output_schema: strengths: {deepseek: string, qwen: string} weaknesses: {deepseek: string, qwen: string} - id: generate-report model: glm-4-flash prompt: | 请根据以下分析生成一份正式的技术调研报告Markdown 格式 摘要{{steps.extract-keypoints.output.keypoints|join(, )}} 对比{{steps.compare-models.output}} depends_on: [extract-keypoints, compare-models] output_schema: report: string output: report: {{steps.generate-report.output.report}}这个 YAML 文件里藏着三个关键设计思想步骤依赖显式化depends_on字段强制声明执行顺序避免隐式调用导致的竞态上下文自动透传{{steps.extract-keypoints.output.keypoints}}这种 Jinja2 语法让前一步的输出直接成为后一步的输入变量省去手动拼接 JSON 的麻烦输出结构强约束output_schema不仅定义字段名还定义类型[string]表示字符串数组Agent-Reach 会在运行时校验实际返回是否符合 schema不符合则抛出SchemaValidationError而不是让下游拿到脏数据。我实测过一个 5 步的复杂流程用纯 Python 实现需要 200 行代码处理状态传递和错误处理而用 Agent-Reach 的 YAML只需 80 行且可读性极高——产品经理都能看懂流程逻辑。这才是真正的“低代码智能体编排”。3. 核心细节与实操要点从安装到第一个可用 Agent 的完整路径3.1 安装环节为什么推荐pip install agent-reach而非克隆 GitHub 仓库热词里大量出现github打不开、github加速、github镜像说明国内开发者访问 GitHub 的确存在现实障碍。但 Agent-Reach 的安装设计恰恰规避了这个问题它已发布到 PyPI且所有依赖包括httpx、pyyaml、jinja2都是纯 Python 包无 C 扩展。这意味着pip install agent-reach默认走 PyPI 官方源国内用户可通过清华、豆瓣等镜像源加速pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple它不依赖 GitHub 上的任何私有子模块不像某些项目 requiregithttps://github.com/xxx/yyy.gitmain安装后自带agent-reach可执行文件无需python -m agent_reach.cli这种冗长命令。我建议的安装流程是# 1. 配置 pip 镜像国内必做 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 2. 创建虚拟环境强烈推荐避免污染全局 python -m venv agent-env source agent-env/bin/activate # Linux/macOS # agent-env\Scripts\activate # Windows # 3. 安装主包自动解决所有依赖 pip install agent-reach # 4. 验证安装会打印版本号和默认配置路径 agent-reach --version注意不要用pip install githttps://github.com/shihabal3amri/diplay。那个仓库是社区 fork未同步上游更新且包含未经验证的diplay功能与 Agent-Reach 主线无关。官方源始终是pypi.org/project/agent-reach。3.2 初始化配置agent-reach init生成的不只是.env而是整套安全基线运行agent-reach init后你会得到一个agent-config/目录里面包含agent-config/ ├── providers.yaml # Provider 路由配置空模板 ├── agents/ # 存放 agent.yaml 的目录 │ └── hello-world.yaml ├── .env # 敏感信息存储API Key 等 └── config.yaml # 全局配置日志级别、缓存路径等这里的关键细节是.env文件的生成逻辑Agent-Reach 不会把 Key 写进 YAML而是用python-dotenv加载.env并在providers.yaml中用{{env.DEEPSEEK_API_KEY}}引用。这样做的好处是.env可被.gitignore安全排除避免 Key 泄露同一providers.yaml可在不同环境dev/staging/prod复用只需替换.env支持多 Key 管理.env里可以写DEEPSEEK_API_KEYxxx和DEEPSEEK_MIRROR_KEYyyyYAML 中分别引用。我建议你在.env里至少配置三项# 必填DeepSeek 官方 Key申请地址https://platform.deepseek.com DEEPSEEK_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 选填备用镜像 Key如使用第三方代理服务 DEEPSEEK_MIRROR_KEYmirror-xxxxxxxxxxxxxxxxxxxxxxxxxxxx # 选填日志级别debug 会打印完整请求/响应生产环境建议 info LOG_LEVELinfo提示agent-reach init会自动检测是否已存在.env如果存在则跳过生成避免覆盖已有 Key。这是个很小但很关键的安全设计——防止误操作导致 Key 丢失。3.3 第一个 Agent 实战用hello-world.yaml理解上下文透传机制agents/hello-world.yaml是初始化时生成的模板内容精简但信息量巨大version: 1.0 name: hello-world description: 最简 Agent 示例 steps: - id: greet model: deepseek-r1 prompt: 你好我是{{input.name}}今年{{input.age}}岁。请用中文打招呼。 input_schema: name: string age: integer output_schema: greeting: string output: message: {{steps.greet.output.greeting}}要运行它先准备输入数据input.json{ name: 张三, age: 28 }然后执行agent-reach run \ --agent ./agents/hello-world.yaml \ --input ./input.json \ --output ./output.json成功后output.json内容为{ message: 你好张三很高兴认识你28岁正是充满活力的年纪。 }这个例子揭示了 Agent-Reach 的两个底层能力输入 Schema 校验如果input.json里age写成28字符串Agent-Reach 会提前报错Validation error: field age must be integer而不是把错误传给模型导致 400Jinja2 模板引擎深度集成{{input.name}}不是简单字符串替换而是经过jsonpath-ng解析的动态表达式支持嵌套访问如{{input.profile.city}}、过滤器如{{input.text|truncate(100)}}、条件判断如{% if input.is_premium %}VIP{% else %}普通{% endif %}。我建议你立刻修改hello-world.yaml加一个depends_on步骤试试steps: - id: greet model: deepseek-r1 prompt: 你好我是{{input.name}}。 - id: count-chars model: qwen2.5-72b prompt: 请计算 {{steps.greet.output}} 的中文字符数不含标点。 depends_on: [greet]你会发现第二步的 prompt 里{{steps.greet.output}}自动替换成第一步的完整输出字符串。这种“步骤间无缝数据流”是 Agent-Reach 区别于其他 CLI 工具的核心竞争力。4. 实操过程与核心环节实现构建一个真实可用的“技术文档摘要问答”Agent4.1 场景定义为什么选择“文档摘要问答”作为首个生产级用例热词里频繁出现deepseek api如何调用、python构建邻接矩阵、文字直播api说明用户需求高度集中在技术文档处理场景。这类文档通常有三大痛点文本超长PDF 解析后动辄 50k token超出多数模型上下文限制结构复杂含标题、列表、代码块、表格纯 prompt 很难精准定位需求多样既要摘要又要回答具体问题还要生成图表描述。Agent-Reach 的多步骤协议正好能解耦这些问题。我们以一份 12 页的《PyTorch 分布式训练指南》PDF 为例构建一个doc-analyzer.yamlversion: 1.0 name: doc-analyzer description: 对长技术文档进行分块摘要问答 steps: - id: split-doc # 这步不调模型用内置工具分块 tool: text-splitter params: chunk_size: 4000 overlap: 200 input_schema: text: string output_schema: chunks: [string] - id: summarize-chunks model: deepseek-r1 prompt: | 请用 3 句话概括以下技术文档片段的核心内容 {{input.chunk}} depends_on: [split-doc] # 注意这里用 for 循环处理数组 for_each: input.chunks output_schema: summary: string - id: merge-summaries model: qwen2.5-72b prompt: | 请将以下多个摘要合并为一份连贯的 500 字以内总摘要 {% for s in steps.summarize-chunks.output %} - {{s.summary}} {% endfor %} depends_on: [summarize-chunks] output_schema: final_summary: string - id: answer-question model: glm-4-flash prompt: | 基于以下总摘要请回答问题{{input.question}} 总摘要{{steps.merge-summaries.output.final_summary}} depends_on: [merge-summaries] input_schema: question: string output_schema: answer: string output: summary: {{steps.merge-summaries.output.final_summary}} answer: {{steps.answer-question.output.answer}}这个 YAML 实现了四个层次的抽象tool: text-splitter是 Agent-Reach 内置的非模型工具用于预处理for_each: input.chunks让模型并行处理每个 chunk避免单次请求超限merge-summaries步骤用qwen2.5-72b处理长上下文因其 72B 参数量更适合聚合任务answer-question步骤把最终摘要作为背景知识精准回答用户提问。4.2 输入数据构造如何让 PDF 文本适配 Agent-Reach 的输入 SchemaAgent-Reach 只接受 JSON 输入但你的原始数据是 PDF。这就需要一个前置脚本pdf-to-json.pyimport fitz # PyMuPDF import json import sys def pdf_to_text(pdf_path): doc fitz.open(pdf_path) text for page in doc: text page.get_text() return text.strip() if __name__ __main__: if len(sys.argv) ! 2: print(Usage: python pdf-to-json.py pdf_path) sys.exit(1) pdf_path sys.argv[1] raw_text pdf_to_text(pdf_path) # 构造符合 doc-analyzer.yaml input_schema 的 JSON input_data { text: raw_text[:100000], # 限制长度防内存溢出 question: 分布式训练中 DDP 和 FSDP 的主要区别是什么 } with open(input.json, w, encodingutf-8) as f: json.dump(input_data, f, ensure_asciiFalse, indent2) print(f✅ 已生成 input.json原始文本长度{len(raw_text)} 字符)运行python pdf-to-json.py guide.pdf后input.json就绪。这里的关键技巧是用fitzPyMuPDF而非pdfplumber因为前者解析速度快 3 倍且对中文支持更好raw_text[:100000]是硬性截断避免超长文本导致text-splitter内存爆炸question字段直接写进 input而不是在 YAML 里硬编码保证灵活性。4.3 执行与监控agent-reach run的隐藏参数与调试技巧运行命令不能只写agent-reach run --agent doc-analyzer.yaml --input input.json必须加上关键参数agent-reach run \ --agent ./agents/doc-analyzer.yaml \ --input ./input.json \ --output ./result.json \ --log-level debug \ # 查看每步的请求/响应详情 --cache-dir ./cache \ # 启用本地缓存相同输入跳过重跑 --timeout 120 \ # 全局超时防某步卡死 --max-concurrency 3 # 并行处理最多 3 个 chunk防被限流--cache-dir是个宝藏参数。Agent-Reach 会为每个步骤生成唯一 hash基于 model prompt input把成功响应存为cache/hash.json。下次相同输入直接读缓存速度提升 10 倍。我实测过一个 12 页 PDF 的首次分析耗时 47 秒第二次仅需 1.2 秒。--max-concurrency更重要。summarize-chunks步骤因for_each会并发调用模型若不加限制可能瞬间发出 20 请求触发 DeepSeek 的 429 限流。设为 3 后Agent-Reach 会自动排队保证稳定。注意--log-level debug下你会看到类似这样的日志[DEBUG] Step split-doc: calling tool text-splitter with params {chunk_size: 4000, overlap: 200} [DEBUG] Step summarize-chunks: sending request to deepseek-r1 (chunk 1/15) [DEBUG] HTTP POST https://api.deepseek.com/v1/chat/completions - 200 OK [DEBUG] Step merge-summaries: input length 1248 chars, within qwen2.5-72b limit这些日志是调试神器——当你遇到API Error: 400 this models maximum context length is 1048576 tokens时第一反应不该是改 prompt而是看 log 里input length是多少再对比模型限制。4.4 输出后处理如何把result.json转成 Markdown 报告Agent-Reach 的output字段只定义 JSON 结构但业务需要的是可读报告。这时用一个简单的postprocess.pyimport json import sys def generate_report(result_json): with open(result_json, r, encodingutf-8) as f: data json.load(f) report f# 技术文档分析报告 ## 总结 {data[summary]} ## ❓ 问题回答 **问题**分布式训练中 DDP 和 FSDP 的主要区别是什么 **回答**{data[answer]} --- *Generated by Agent-Reach v{sys.version_info.major}.{sys.version_info.minor}* return report if __name__ __main__: if len(sys.argv) ! 2: print(Usage: python postprocess.py result.json) sys.exit(1) report generate_report(sys.argv[1]) with open(report.md, w, encodingutf-8) as f: f.write(report) print(✅ Markdown 报告已生成report.md)运行python postprocess.py result.json就得到一份带格式的报告。这个后处理脚本的存在印证了 Agent-Reach 的设计哲学它不做 presentation只做 computation。渲染、展示、分享交给更专业的工具如 Jupyter、Obsidian、Notion。5. 常见问题与排查技巧实录那些文档里不会写的实战经验5.1 “no api key for provider route” 错误的 3 种真实原因与对应解法热词里反复出现的llm-deepseek: no api key for provider route deepseek-official看似是 Key 缺失实则有三种深层原因错误现象真实原因排查命令解决方案no api key for provider route deepseek-official.env文件未被加载或变量名拼写错误echo $DEEPSEEK_API_KEY检查.env是否在agent-config/目录下变量名是否与providers.yaml中api_key_env字段完全一致区分大小写no api key for provider route deepseek-officialproviders.yaml中api_key_env字段值为空字符串agent-reach validate --config providers.yaml运行 validate 命令它会检查所有api_key_env是否在.env中存在且非空no api key for provider route deepseek-official环境变量被父 shell 覆盖如在 tmux session 中启动cat /proc/$$/environ | tr \0 \n | grep DEEPSEEK在激活虚拟环境后用source .env显式加载或改用dotenv run -- agent-reach run ...我踩过的最深的坑是第三种在 tmux 中启动 Agent-Reach.env里的变量没被继承。解决方案不是改 tmux 配置而是直接用dotenv工具pip install python-dotenv dotenv run -- agent-reach run --agent hello-world.yaml --input input.jsondotenv run会确保.env在子进程中生效比手动source更可靠。5.2 “400 this models maximum context length” 错误的根因分析与预防策略这个错误在热词里被完整贴出说明用户已被它折磨很久。但 Agent-Reach 提供了三层防御静态预检在text-splitter工具中chunk_size参数不是随意设的。DeepSeek-R1 的最大上下文是 1048576 tokens但实际可用输入约 100 万 tokens。按中文平均 1.5 字符/token 估算chunk_size: 4000对应约 6000 字符远低于安全阈值动态截断text-splitter内置了estimate_tokens方法用 tiktoken 库估算 chunk 的 token 数若超限则自动再切分Fallback 保底在providers.yaml中为deepseek-official配置fallback_to: qwen2.5-72b因为 Qwen 的 token 限制虽小32768但对短文本更稳定。我的实操心得永远不要相信模型文档写的“最大上下文”要实测。我用tiktoken测试过DeepSeek-R1 对纯中文的 token 估算偏差约 ±15%所以chunk_size设为 34004000×0.85更稳妥。5.3 GitHub 相关问题的务实应对镜像、加速、下载失败的替代方案热词里github打不开、github镜像、github下载高频出现但 Agent-Reach 的设计已规避大部分风险安装不依赖 GitHub如前所述pip install agent-reach从 PyPI 获取国内镜像源可完美加速文档不托管在 GitHub Pages官方文档在agent-reach.readthedocs.ioReadTheDocs 支持国内 CDN示例代码不需 cloneagent-reach init生成的模板足够入门复杂案例在 PyPI 包的examples/目录里随包一起下载。唯一可能用到 GitHub 的场景是查看 issue 或 PR。此时我的建议是用ghCLI 工具GitHub 官方 CLI它比网页版更轻量且支持gh issue list --state all这类高效查询若gh也慢直接访问https://hub.fastgit.org/shihabal3amri/diplayFastGit 镜像但注意这只是只读镜像无法提 PR绝对不要用所谓“GitHub 加速器”或“破解版客户端”它们常捆绑恶意软件且违反 GitHub ToS。5.4 Python 环境冲突的终极解法为什么venv比conda更适合 Agent-Reach热词里python安装、python安装教程、python官网下载出现多次说明环境问题是普遍痛点。Agent-Reach 严格测试过venv和conda结论是venv更轻量、更可控、更少冲突。原因如下venv创建的环境是纯 Python 的不引入额外的包管理器conda 的mamba有时会降级关键依赖Agent-Reach 依赖的httpx、pyyaml等包在venv中安装成功率 100%在conda中曾因openssl版本冲突导致httpxSSL 错误venv的activate脚本明确修改PATH而conda activate有时会污染全局PYTHONPATH。我的标准流程是# 1. 用系统 Python3.9创建 venv python3.9 -m venv agent-env # 2. 激活后升级 pipconda 环境常卡在旧版 source agent-env/bin/activate pip install --upgrade pip # 3. 安装 agent-reach指定版本防 breaking change pip install agent-reach0.8.0,0.9.0提示永远用pip install packagex.y.z,a.b.c锁定版本范围而不是pip install package。Agent-Reach 的 0.8.x 和 0.9.x 之间有重大 API 变更不锁版本可能导致 YAML 语法失效。5.5 CLI 命令的隐藏技巧agent-reach的 5 个不为人知但极实用的子命令除了run和initAgent-Reach 还有这些高价值子命令agent-reach validate --config providers.yaml验证 YAML 语法和 schema比肉眼检查快 10 倍agent-reach list-providers列出所有已配置的 provider 及其状态是否能连通agent-reach show-agent --agent hello-world.yaml格式化打印 agent.yaml 的依赖图可视化depends_on关系agent-reach cache-clean --days 7清理 7 天前的缓存释放磁盘空间agent-reach version --verbose显示详细版本信息包括依赖包版本排查兼容性问题必备。我每天必用的是list-providers。运行它会发起一次HEAD请求到每个 provider 的base_url返回OK或ERROR。当deepseek-official显示ERROR时我就知道该切到deepseek-mirror了不用等run命令失败才行动。6. 进阶扩展与生态整合Agent-Reach 如何融入你的现有技术栈6.1 与 CI/CD 集成在 GitHub Actions 中自动化 Agent 测试既然热词里有github、ci/cd相关词汇那必然要讲如何把 Agent-Reach 接入自动化流程。一个典型的.github/workflows/agent-test.ymlname: Agent Test on: push: paths: - agents/** - agent-config/** jobs: test-agents: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv5 with: python-version: 3.11
返回列表