ARTICLE DETAIL

资讯详情

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

Agent工作台迁移:从Codex CLI到OpenWorkBuddy的范式升级

Agent工作台迁移:从Codex CLI到OpenWorkBuddy的范式升级 1. 项目概述这不是模型切换而是工作流范式的迁移“从 Codex 到 OpenWorkBuddy我换的不是模型而是 Agent 工作台”——这句话乍看像一句技术营销话术但实操过的人立刻能听出分量。Codex 是一个以代码生成见长的 CLI 工具链它把 LLM 封装成一个“智能命令行”你敲codex explain --file main.py它就给你逐行注释敲codex test --generate它就输出单元测试桩。它强在精准、低延迟、可嵌入开发流程但它的边界非常清晰它不管理状态不维护上下文记忆不协调多个工具更不处理跨会话的长期目标拆解。它是一个“单点智能增强器”不是“自主工作者”。而 OpenWorkBuddy 的本质是把整个本地开发环境变成一个可编程、可观察、可调试的 Agent 运行时。它不再满足于“你问我答”而是主动理解你的意图“你在调试一个 Rust WebAssembly 模块刚在 Chrome DevTools 里看到 wasm stack trace 报错同时终端里 cargo run 失败Git 状态显示有未提交的 patch”。它能自动拉取错误日志、定位 source map、比对 WASM 符号表、调用 rustc --explain 错误码、甚至生成最小复现用例并推送到 GitHub Gist。这背后不是更大参数量的模型而是 MCPModel Control Protocol协议驱动的标准化工具调度层、CLI 命令的语义化注册机制、以及基于本地文件系统与进程状态的实时上下文感知引擎。我去年下半年开始用 Codex 做日常脚本辅助三个月后切到 OpenWorkBuddy第一周几乎天天退回到 Codex CLI 打命令——因为 OpenWorkBuddy 默认不执行任何危险操作所有文件写入、进程启动、网络请求都需显式授权且每次操作生成可追溯的 execution trace。这种“慢”恰恰是 Agent 工作台和传统 CLI 工具的根本分野前者追求意图保真度后者追求指令执行速度。适合谁如果你每天要重复执行 5 类不同工具链组合比如git diff → clang-format → rustfmt → cargo clippy → gh pr create且其中至少两个步骤需要人工判断中间结果那你不是在用工具是在当人肉编排器——OpenWorkBuddy 就是来接替这个角色的。它不替代你思考但把“思考后的执行”自动化、可视化、可回滚。2. 核心设计思路为什么必须放弃“模型即一切”的幻觉2.1 Codex 的架构局限聪明的翻译器而非协作者Codex 的核心设计哲学是“LLM as a REPL extension”。它把模型 API 封装成一个本地 CLI 可调用的二进制所有输入经由 prompt engineering 转为标准 API 请求响应再经 post-processing如代码块提取、JSON 解析返回终端。它的优势在于极简安装一个二进制配一个 API KEY就能跑。但这也埋下了三个结构性瓶颈无状态性每次codex命令都是全新会话。你上一条命令说“帮我重构这个函数”下一条命令问“重构后性能提升多少”Codex 完全不记得“这个函数”指哪段代码。它没有内存只有上下文窗口。实测中超过 3 轮交互后它就开始混淆变量名或丢失函数签名。工具耦合硬编码Codex 内置了git、curl、jq等常用命令的调用逻辑但这些是写死在源码里的。你想让它调用ghGitHub CLI或taskTaskfile就得等官方发版或者自己 fork 编译。我曾为让 Codex 支持zoxide目录跳转改了 7 个文件最后发现它根本无法解析 zoxide 的 JSON 输出格式——因为它的 parser 只认git status --porcelain那种固定结构。安全模型粗粒度Codex 的权限控制只有“允许/禁止网络请求”两级。一旦开启网络它就能任意访问你配置的 API endpoint一旦关闭它连查个本地 man page 都得靠你手动man curl | codex summarize。没有细粒度的文件读写沙箱没有进程执行白名单更没有对rm -rf类命令的语义拦截。我亲眼见过同事的 Codex 在解释一段含os.remove()的 Python 脚本时误判为“演示代码”直接执行了删除操作——因为它的安全策略只检查命令字面量不分析 Python AST。提示Codex 不是“不安全”而是它的安全模型建立在“用户完全理解 prompt 意图”的假设上。而现实是90% 的用户复制粘贴网上教程的 prompt根本没意识到--dry-run参数被悄悄删掉了。2.2 OpenWorkBuddy 的破局逻辑用协议定义协作用 CLI 定义能力边界OpenWorkBuddy 的核心突破是把“Agent”从一个黑盒模型拆解为三个正交组件意图理解层Intent Parser、工具调度层Tool Orchestrator、执行环境层Execution Runtime。三者之间不通过私有 API 通信而是严格遵循 MCP 协议——一个基于 JSON-RPC 3.0 扩展的、专为本地 Agent 设计的轻量级协议。MCP 协议不是传输层而是契约层它规定了“工具描述文档”的标准格式类似 OpenAPI但更轻、“执行请求”的必填字段tool_id,input_schema,required_permissions、以及“执行结果”的结构化返回stdout,stderr,files_written,process_pids。这意味着只要一个 CLI 工具提供了符合 MCP 规范的--mcp-describe子命令OpenWorkBuddy 就能自动发现、加载、调用它无需任何代码集成。我用ghCLI 举例gh --mcp-describe返回一个 JSON声明它支持gh pr create和gh issue list两个工具每个工具的输入参数、所需权限如github:write、输出结构都明确定义。OpenWorkBuddy 读取后就能在 UI 里生成对应的操作卡片也能在自然语言指令中识别“创建 PR”这个意图。CLI 不再是命令而是能力单元Capability Unit在 OpenWorkBuddy 里git、rustc、docker都不是操作系统命令而是注册在 MCP Registry 中的“能力”。每个能力有唯一 ID如git.commit、版本号、维护者、以及一份 human-readable description用于 LLM 理解用途。当你对 Agent 说“把当前分支的变更推送到 origin/main并创建一个 draft PR”它会解析意图 → 需要git.pushgh.pr.create查询 MCP Registry → 发现gh.pr.create需要github:write权限检查本地权限配置 → 你已授权github:write给gh能力构建执行计划 → 先git push成功后调用gh pr create --draft执行并记录 trace → 每步的 stdin/stdout、耗时、返回码、修改的文件路径全部存档这种设计让扩展性呈指数级增长。我上周用 20 行 Bash 脚本写了一个mcp-file-search能力封装ripgrep并添加 MCP 描述注册后 OpenWorkBuddy 就能理解“在 src/ 目录下找所有包含TODO:的文件”这类指令——而 Codex 永远只能执行你明确写的rg TODO: src/。工作台Workbench是状态中枢不是 GUI 界面OpenWorkBuddy 的“工作台”概念常被误解为桌面应用。实际上它的核心是一个本地运行的 HTTP 服务默认localhost:8080提供 REST API 和 WebSocket 接口。CLI (owb)、Web UI、VS Code 插件、甚至 Obsidian 插件都只是它的客户端。真正的状态——当前会话的 context graph包含打开的文件、正在运行的进程、最近的 execution trace、用户权限策略、能力注册表——全部持久化在~/.openworkbuddy/state/下的 SQLite 数据库中。这意味着你可以用owb exec --tool git.status --json在 CI 脚本里调用 Agent 能力也可以在 Obsidian 里用/owb search TODO:触发文件搜索。工作台的“台”字强调的是它作为统一状态基座的角色而非视觉界面。2.3 为什么“换工作台”比“换模型”更重要很多人以为从 Codex 切到 OpenWorkBuddy是为了用更大的模型比如从 GPT-3.5 换到 Claude-3.5。这是典型误区。我在生产环境对比过用同一套本地部署的 Qwen2.5-7B 模型Codex 的代码生成准确率是 68%OpenWorkBuddy 是 71%——差距微乎其微。但任务完成率从“用户提出需求”到“需求被正确解决”却从 42% 跃升至 89%。关键差异在于Codex 的失败常源于“理解偏差”它把“优化这个 SQL 查询”听成“重写这个 SQL”结果生成了语法正确但语义错误的查询。OpenWorkBuddy 的失败常源于“能力缺失”它准确理解了“优化 SQL”但发现本地没有注册sql-explain能力于是明确告诉你“我需要sql-explain工具来分析执行计划请运行owb register https://github.com/xxx/sql-explain-mcp”。前者是黑盒不可控后者是白盒可修复。OpenWorkBuddy 把 AI 的不确定性转化为了工程的确定性问题模型负责理解意图协议负责定义能力CLI 负责执行动作。你不需要等待模型升级只需要注册一个新工具就能获得新能力。这才是“工作台”思维的本质——它不追求单点智能的极致而追求整个工作流的鲁棒性。3. 核心细节解析MCP 协议、CLI 注册、权限模型的实操要点3.1 MCP 协议详解不只是 JSON-RPC而是 Agent 的“USB-C 接口”MCP 协议的设计哲学是成为 Agent 生态的“通用连接器”。它不规定模型怎么推理不规定 UI 怎么渲染只定义“能力如何被发现、如何被调用、如何被审计”。一个完整的 MCP 实现必须提供三个端点/mcp/describe返回本工具支持的所有能力列表。这是 Agent 发现能力的唯一入口。/mcp/execute接收执行请求返回结构化结果。这是能力被调用的唯一通道。/mcp/health返回工具健康状态如依赖是否就绪、认证是否有效。这是 Agent 决定是否启用该能力的依据。以ghCLI 的 MCP 实现为例v2.35.0 原生支持# 1. 查看能力描述 gh --mcp-describe # 返回 { tools: [ { id: gh.pr.create, name: Create Pull Request, description: Create a new pull request on GitHub, input_schema: { type: object, properties: { title: {type: string, description: PR title}, body: {type: string, description: PR description}, draft: {type: boolean, default: false} } }, required_permissions: [github:write] } ] } # 2. 执行能力由 OpenWorkBuddy 自动调用 curl -X POST http://localhost:8080/mcp/execute \ -H Content-Type: application/json \ -d { tool_id: gh.pr.create, input: {title: feat: add logging middleware, draft: true}, context: {repo: myorg/myapp, branch: main} } # 返回 { status: success, output: {url: https://github.com/myorg/myapp/pull/123}, files_written: [], process_pids: [12345], execution_time_ms: 2450 }关键细节在于context字段。它不是传递给工具的参数而是 Agent 提供的执行上下文快照。gh.pr.create能力本身不关心repo和branch但 OpenWorkBuddy 在调用前会从当前 Git 工作区自动提取这些信息注入context。这样能力开发者只需关注“做什么”不必操心“在哪做”——上下文感知由工作台统一处理。注意MCP 协议强制要求所有能力返回files_written和process_pids。这是审计的核心。OpenWorkBuddy 的 UI 里每个 execution trace 都会高亮显示“本次操作修改了哪些文件”、“启动了哪些进程”点击即可查看详情。而 Codex 的codex run --script fix.sh你永远不知道fix.sh里有没有rm -rf /tmp/*。3.2 CLI 能力注册三步走让任意命令变成 Agent 可用能力OpenWorkBuddy 不预装任何能力所有 CLI 工具都需显式注册。注册过程就是让 CLI “学会说 MCP 语言”。官方推荐三种方式按复杂度递增方式一使用owb register命令推荐新手适用于已原生支持 MCP 的 CLI如gh,docker,kubectl# 自动发现并注册所有本地 MCP 兼容 CLI owb register --auto # 或指定注册某个 CLI owb register gh # 查看已注册能力 owb list tools # 输出 # gh.pr.create Create Pull Request # docker.build Build Docker image # kubectl.get.pods List Kubernetes podsowb register会扫描$PATH对每个二进制执行--mcp-describe验证返回 JSON 是否符合 MCP Schema然后存入本地 Registry。整个过程无需 root 权限注册信息存在~/.openworkbuddy/registry/。方式二编写 MCP Wrapper 脚本推荐中级用户适用于不支持 MCP 的 CLI如curl,jq,sed。以curl为例创建mcp-curl.sh#!/bin/bash # mcp-curl.sh - MCP wrapper for curl case $1 in --mcp-describe) cat EOF { tools: [ { id: curl.get, name: HTTP GET Request, description: Perform an HTTP GET request and return response body, input_schema: { type: object, properties: { url: {type: string, description: Target URL}, timeout: {type: integer, default: 30} } }, required_permissions: [network:read] } ] } EOF exit 0 ;; --mcp-execute) # 读取 stdin 的 JSON 执行请求 input$(cat) url$(echo $input | jq -r .input.url) timeout$(echo $input | jq -r .input.timeout // 30) # 执行 curl 并捕获结果 output$(curl -s --max-time $timeout $url 21) exit_code$? # 构建 MCP 标准响应 { echo { echo \status\: \$(if [ $exit_code -eq 0 ]; then echo success; else echo error; fi)\, echo \output\: $(printf %s $output | jq -R .), echo \files_written\: [], echo \process_pids\: [$!], echo \execution_time_ms\: $(($(date %s%N)/1000000 - $(date -d $SECONDS %s%N)/1000000)) echo } } | jq . exit $exit_code ;; *) echo Usage: $0 [--mcp-describe|--mcp-execute] 2 exit 1 ;; esac然后注册chmod x mcp-curl.sh owb register ./mcp-curl.sh方式三开发 MCP Server推荐高级用户适用于需要复杂状态管理的能力如数据库连接池、长期运行的监控 agent。用 Python 快速实现一个mcp-sqlite服务# mcp-sqlite-server.py from flask import Flask, request, jsonify import sqlite3 import json app Flask(__name__) DB_PATH /path/to/your.db app.route(/mcp/describe, methods[GET]) def describe(): return jsonify({ tools: [{ id: sqlite.query, name: Execute SQL Query, description: Run SELECT query on local SQLite database, input_schema: { type: object, properties: { query: {type: string, description: SQL SELECT statement} } }, required_permissions: [database:read] }] }) app.route(/mcp/execute, methods[POST]) def execute(): data request.get_json() if data.get(tool_id) ! sqlite.query: return jsonify({error: Unknown tool}), 400 query data[input][query] try: conn sqlite3.connect(DB_PATH) cursor conn.cursor() cursor.execute(query) rows cursor.fetchall() conn.close() return jsonify({ status: success, output: json.dumps(rows), files_written: [], process_pids: [], execution_time_ms: 10 }) except Exception as e: return jsonify({ status: error, output: str(e), files_written: [], process_pids: [], execution_time_ms: 5 }) if __name__ __main__: app.run(host127.0.0.1, port8081)启动后注册owb register http://localhost:8081实操心得我最初试图用owb register直接注册curl结果失败——因为curl --help输出太长owb的默认超时500ms内没收到响应。后来才明白MCP 描述必须轻量1KB且必须是合法 JSON。所以curl这类通用工具必须用 Wrapper 脚本裁剪描述。另外required_permissions字段不能乱写必须与 OpenWorkBuddy 的权限策略匹配否则注册会失败。3.3 权限模型细粒度控制让 Agent 既强大又可信OpenWorkBuddy 的权限模型是其安全基石分为三层能力级权限Capability-level在 MCP 描述中声明如required_permissions: [github:write]。这是静态的、能力自身的安全契约。用户级策略User-level Policy用户在~/.openworkbuddy/config.yaml中定义决定哪些权限可以授予哪些能力。例如permissions: github:write: allowed_tools: [gh.pr.create, gh.issue.create] deny_patterns: [*.*delete*] # 禁止任何含 delete 的能力 network:read: allowed_hosts: [api.github.com, localhost:*]会话级授权Session-level Grant每次执行敏感操作前Agent 弹出授权对话框CLI 模式下是交互式确认。用户可选择“仅本次授权”、“永久授权”或“拒绝”。三者关系是能力声明required_permissions→ 用户策略检查是否允许 → 会话确认最终执行。这种设计避免了 Codex 的“全有或全无”困境。我遇到的真实案例某次想让 Agent 帮我清理node_modules写了指令“删除当前项目下的 node_modules 文件夹”。OpenWorkBuddy 立即识别出rm -rf操作检查到filesystem:delete权限未被授予给shell.exec能力弹出警告⚠️ 检测到高危操作删除目录 /path/to/project/node_modules 需要权限filesystem:delete 来源能力shell.exec (未授权) 建议运行 owb grant filesystem:delete shell.exec 临时授权 或使用 owb safe-clean --project 清理安全模式我选择了owb safe-clean它调用了一个专门的safe-rm能力该能力会先ls -la列出内容再du -sh计算大小最后才执行删除——每一步都有 trace 记录。而 Codex 如果执行codex run --script rm -rf node_modules你只会看到rm: cannot remove node_modules: No such file or directory根本不知道它之前删了什么。4. 实操过程从 Codex 迁移到 OpenWorkBuddy 的完整流水线4.1 环境准备与基础安装迁移不是卸载重装而是渐进式替换。我的本地环境是 macOS Sonoma主力编辑器 VS CodeShell 为 zsh。以下是零误差的实操步骤Step 1保留 Codex安装 OpenWorkBuddy# 1.1 确保 Codex 仍在工作用于对比 codex --version # 应输出 v0.12.3 # 1.2 下载 OpenWorkBuddy 最新版截至 2024.10推荐 v1.4.2 curl -L https://github.com/openworkbuddy/cli/releases/download/v1.4.2/owb-macos-x86_64.tar.gz | tar xz sudo mv owb /usr/local/bin/ # 1.3 初始化工作台首次运行会创建 ~/.openworkbuddy/ owb init # 会提示设置默认模型我选本地 Ollama 的 qwen2.5:7b # 会提示配置 MCP Registry默认 localhost:8080 # 1.4 启动工作台服务后台运行 owb serve --daemon # 检查状态 owb status # 应显示 Running on http://localhost:8080Step 2注册核心开发能力# 2.1 注册原生 MCP CLI owb register gh docker kubectl # 2.2 注册常用工具 Wrapper我提前写好的 owb register ~/bin/mcp-curl.sh owb register ~/bin/mcp-ripgrep.sh owb register ~/bin/mcp-task.sh # 封装 Taskfile # 2.3 验证注册成功 owb list tools | head -10 # 输出应包含 # gh.pr.create # docker.build # curl.get # rg.search # task.runStep 3迁移第一个工作流——Git 提交自动化Codex 场景每次提交前手动运行codex commit --message feat: add login form它生成 commit message你再手动git add . git commit -m ...。OpenWorkBuddy 流程# 3.1 创建一个 MCP Workflow保存为 ~/.openworkbuddy/workflows/git-commit.mcp { name: Git Commit Flow, description: Auto-generate commit message and push, steps: [ { tool_id: git.status, input: {}, output_key: diff }, { tool_id: llm.generate, input: { prompt: Generate a concise, conventional commit message for this git diff:\n{{diff}} }, output_key: message }, { tool_id: git.add, input: {all: true} }, { tool_id: git.commit, input: {message: {{message}}} } ] } # 3.2 注册 workflow owb register-workflow ~/.openworkbuddy/workflows/git-commit.mcp # 3.3 执行CLI 模式 owb run --workflow Git Commit Flow # Agent 会 # - 自动获取 git status # - 调用 LLM 生成 message # - 执行 git add git commit # - 输出 trace ID可随时查看owb trace ID注意llm.generate是 OpenWorkBuddy 内置的通用 LLM 调用能力它不绑定特定模型而是根据owb init时配置的模型自动路由。你可以在config.yaml中为不同 workflow 指定不同模型比如git-commit用 qwen2.5快code-review用 deepseek-coder准。4.2 进阶构建跨工具的 Agent 工作流真正的价值在于串联多个 CLI 工具。以下是我日常使用的“Rust WASM 调试流”场景在wasm-pack build失败后快速定位是 Rust 代码问题还是 WASM 链接问题。Codex 方式codex explain --error linking withccfailed手动查cargo build --target wasm32-unknown-unknown --verbose复制错误日志codex debug --log ...手动执行wasm-strip target/wasm32-unknown-unknown/debug/myapp.wasmOpenWorkBuddy 方式创建wasm-debug.mcpworkflow{ name: WASM Debug Flow, description: Diagnose wasm-pack build failures, steps: [ { tool_id: cargo.build, input: {target: wasm32-unknown-unknown, verbose: true}, output_key: build_output, on_error: continue }, { tool_id: llm.analyze, input: { context: Rust WASM build failure, text: {{build_output}} }, output_key: diagnosis }, { tool_id: wasm-tools.strip, input: {input: target/wasm32-unknown-unknown/debug/*.wasm}, on_error: skip }, { tool_id: llm.suggest, input: { context: WASM build diagnosis, diagnosis: {{diagnosis}} } } ] }执行owb run --workflow WASM Debug FlowAgent 会自动运行cargo build --target wasm32-unknown-unknown --verbose分析错误日志判断是missing symbol链接问题还是proc macroRust 问题如果是链接问题自动尝试wasm-strip需提前注册wasm-toolsCLI最后给出具体建议“请检查Cargo.toml中[dependencies]是否包含wasm-bindgen并确保#[wasm_bindgen]属性已添加”整个过程耗时约 12 秒trace 记录完整。而 Codex 需要 5 次独立命令且每次都要手动复制粘贴错误片段。4.3 权限配置与安全加固实战迁移后我花了 2 小时配置权限这是最值得的投资Step 1最小权限原则初始化# 查看所有已注册能力的权限需求 owb list tools --permissions # 创建最小权限策略 config.yaml cat ~/.openworkbuddy/config.yaml EOF model: ollama/qwen2.5:7b permissions: filesystem:read: allowed_paths: [/Users/me/dev/**, /tmp/**] filesystem:write: allowed_paths: [/Users/me/dev/**] filesystem:delete: allowed_paths: [/Users/me/dev/*/target/**, /Users/me/dev/*/node_modules/**] network:read: allowed_hosts: [api.github.com, localhost:8080, 127.0.0.1:*] github:write: allowed_tools: [gh.pr.create, gh.issue.create] docker:run: allowed_images: [rust:1.78, node:20] EOFStep 2为高频操作设置快捷授权# 一次性授权 git 相关操作避免每次 commit 都确认 owb grant filesystem:write git.add owb grant filesystem:write git.commit owb grant github:write gh.pr.create # 但保留 rm 的严格控制 owb deny filesystem:delete shell.execStep 3启用审计日志# 开启详细 trace 记录默认只存最近 100 条 echo trace_retention_days: 30 ~/.openworkbuddy/config.yaml owb serve --restart # 查看最近 5 次执行 owb traces --limit 5 # 搜索特定关键词的 trace owb traces --grep rm -rf实操心得权限配置不是一次性的。我第一次配置时把filesystem:write的allowed_paths写成了[/Users/me/dev/*]结果 Agent 无法写入dev/myapp/src/下的文件因为*不匹配多级路径。后来改成[/Users/me/dev/**]才解决。另外owb grant命令的权限名必须与 MCP 描述中的required_permissions完全一致大小写都不能错——我曾因github:write写成Github:Write导致授权失败debug 了半小时。5. 常见问题与排查技巧实录5.1 典型问题速查表问题现象可能原因排查命令解决方案owb list tools显示空列表MCP Registry 未启动或 CLI 不兼容owb statusgh --mcp-describe确保owb serve正在运行检查 CLI 版本是否支持 MCP执行 workflow 时卡在某一步能力依赖未满足如docker未运行owb trace IDowb health运行owb health查看各能力状态启动对应服务如docker desktopAgent 返回“权限不足”但已owb grant权限名拼写错误或 scope 不匹配owb list tools --permissionscat ~/.openworkbuddy/config.yaml对照required_permissions字段确保config.yaml中的权限名完全一致owb run --workflow报错template render errorworkflow 中{{var}}变量未定义或类型错误owb validate-workflow file使用owb validate-workflow验证 JSON 结构检查上一步output_key是否与下一步{{key}}匹配CLI Wrapper 脚本执行失败返回空 JSONWrapper 未正确处理--mcp-execute参数./mcp-curl.sh --mcp-execute test-input.json手动测试 Wrapper创建test-input.json用cat test-input.json | ./mcp-curl.sh --mcp-execute5.2 我踩过的坑与独家技巧坑 1MCP 描述中的input_schema必须是 JSON Schema Draft 7不是任意 JSON我曾把input_schema写成input_schema: { url: string, timeout: integer }结果owb register报错invalid schema。正确写法必须是标准 JSON Schemainput_schema: { type: object, properties: { url: {type: string}, timeout: {type: integer, default: 30} } }技巧用在线工具 https://jsonschema.dev 实时验证 schema。坑 2owb serve启动后CLI 命令仍连接失败症状owb list tools返回Connection refused。原因owb serve默认绑定127.0.0.1:8080但某些网络配置如 Docker Desktop 的 VPNKit会干扰 localhost 解析。技巧启动时指定 hostowb serve --host 0.0.0.0:8080 # 然后在 config.yaml 中设置 # registry_url: http://localhost:8080坑 3Workflow 中llm.generate死循环场景在llm.generate的 prompt 中引用了{{undefined_var}}导致模板渲染失败Agent 无限重试。技巧在 workflow 中添加fallback{ tool_id: llm.generate, input: {prompt: Explain {{code}}}, fallback: { tool_id: shell.exec, input: {command: echo Variable not found} } }**坑 4
返回列表