人工智能AI AgentAgent 编排AI 技能【免费下载链接】oh-my-opencode-slimLean, fine tuned Opencode multi agent suite · Mix any models · Auto delegate tasks项目地址https://gitcode.com/gh_mirrors/oh/oh-my-opencode-slim点击查看免费下载oh-my-opencode-slim 是一套面向 OpenCode 的多 Agent 编排插件除了标准文件与 Shell 操作外还为 Agent 注入了大量内置工具能力。本文以仓库文档 docs/tools.md 为核心骨架结合 src/hooks/apply-patch/、src/tools/smartfetch/、src/tools/ast-grep/、src/tools/task-message.ts 等源码实现系统讲解 apply_patch 救援、webfetch 增强、grep/ast-grep 结构化搜索、后台任务控制、工具循环护栏与格式化能力。读完本文你将掌握这套插件每个内置工具的职责边界、底层实现机制与实战使用方式能够正确编排后台任务、规避搜索路径陷阱并理解故障安全策略。apply_patch 救援apply_patch rescueapply_patch是 Agent 修改文件的核心工具但模型生成的补丁经常因空白字符、换行符漂移而失配。oh-my-opencode-slim 在原生apply_patch执行之前通过tool.execute.before钩子拦截调用对其进行救援式重写。实现位于 src/hooks/apply-patch/index.ts核心入口是rewritePatch见 src/hooks/apply-patch/operations.ts启用prefixSuffix: true与lcsRescue: true两组救援选项。救援逻辑遵循以下原则只重写可恢复的过期补丁补丁行号或上下文已过期时尝试基于真实文件重新对齐宽容匹配当 Unicode 或首尾空白差异trim 漂移是唯一失配原因时对真实文件做规范化宽容匹配保留作者意图new_lines的原始字节保持不变更新场景下维持文件既有的 EOL 与末尾换行状态严格校验在执行辅助操作之前对格式错误的补丁做严格校验并失败保守的 LCS 回退使用有界的最长公共子序列LCS算法兜底避免过度重写累积状态同一路径出现在多个Update File块中时跨 hunk 累积辅助状态工作区安全任何补丁路径落在允许的 root/worktree 之外时在原生执行前直接阻止该apply_patch歧义即失败无法唯一判定如何重写时拒绝猜测明确报错。需要注意边界该钩子不重写edit或write工具的输入只针对apply_patch。从源码看tool.execute.before仅在input.tool ! apply_patch时提前返回随后用replacePatchArgs把重写后的patchText替换回输出参数若输出参数只读则记录skipped并放行fail-open其余错误按blocked/validation/verification/internal分类记录并抛出。Web Fetch增强版 webfetchsmartfetchwebfetch本是 OpenCode 内置工具本插件激活时以同名覆盖默认实现增强版内部模块名为smartfetch位于 src/tools/smartfetch/工具在 src/index.ts 中注册。完整参数说明见 docs/webfetch.md。参数一览参数类型默认值说明urlURLstring必填要抓取的 URL必须是合法的 HTTP/HTTPS 地址formattext|markdown|htmlmarkdown抓取内容的输出格式timeoutnumber30超时秒数最大120promptstring可选交给次级模型对抓取内容执行的提取任务见下文次级模型extract_mainbooleantrue使用 Mozilla Readability 从 HTML 提取正文关闭时返回完整页面 bodyprefer_llms_txtauto|always|neverauto是否优先/llms.txt或/llms-full.txtauto只对文档类域名探测readthedocs、gitbook、netlify、vercel 等include_metadatabooleantrue是否在输出前附加含抓取元数据的 YAML frontmatter状态码、内容类型、字符集、重定向链、缓存信息等save_binarybooleanfalse是否将二进制负载图片、PDF、音视频保存到系统临时目录关闭时二进制内容仅报告元数据输出与元数据文本类内容HTML、纯文本、llms.txt按请求的format返回默认在响应前附加 YAML frontmatter--- requested_url: https://example.com/docs final_url: https://example.com/docs canonical_url: https://example.com/docs status_code: 200 source_content_type: text/html source_kind: html title: Documentation headings: - Getting Started - API Reference used_llms_txt: false extracted_main: true redirect_chain: [] upgraded_to_https: true cache_hit: false word_count: 1420 quality_signals: [] truncated: false ---其中quality_signals用于标记潜在问题very_short_content少于 60 词、possible_paywall内容命中付费墙/登录关键词、high_boilerplate_ratioHTML 与正文比例过大且未做 Readability 提取。二进制响应图片、PDF、音频、视频返回文件元数据内容类型与大小、文件名取自Content-Disposition或 URL 路径、二进制类型image/audio/video/pdf/binary。存在两种模式仅元数据内容超过下载上限不开save_binary时为 2 MiB开启后为 10 MiB只报告大小与类型保存到磁盘save_binarytrue时写入tmpdir/opencode-smartfetch/filename响应中给出文件系统路径。次级模型Secondary Model传入prompt参数时webfetch可以把抓取内容路由给一个更廉价的次级模型做聚焦提取例如总结此页或提取代码示例。流程内容照常抓取并缓存 → 创建所有工具禁用的一次性 OpenCode 会话 → 把内容与 prompt 发给次级模型 → 完成后清理会话。实现见 src/tools/smartfetch/secondary-model.ts。模型解析优先级从高到低webfetch.model专用模型最高优先级支持数组形式做回退OpenCode 配置中的small_modelopencode.json/opencode.jsonc插件配置的explorerAgent 模型插件配置的librarianAgent 模型。次级模型仅在同时满足以下条件时才被调用提供了prompt、已配置次级模型、抓取内容至少 25 个词。若次级模型失败超时、报错、空响应webfetch优雅回退直接返回原始抓取内容。配置示例{ webfetch: { enabled: false // 关闭增强版使用 OpenCode 内置 webfetch } }{ webfetch: { model: [ openai/gpt-4o-mini, { id: anthropic/claude-3-haiku, variant: low-latency } ] } }模型数组按顺序逐个尝试第一个返回可用文本的生效small_model可在opencode.jsonc顶层配置为openai/gpt-4o-mini之类。缓存、llms.txt 探测与重定向策略内存 LRU 缓存上限 50 MiB、TTL 15 分钟见 src/tools/smartfetch/cache.ts。缓存键包含 URL 及行为相关选项extract_main、prefer_llms_txt、save_binary修改这些选项会重新抓取。渲染格式text/markdown/html从缓存结果派生不会引发冗余网络请求。条件重验证带ETag/Last-Modified的缓存条目支持If-None-Match/If-Modified-Since条件请求304 Not Modified只刷新 TTL 不重新下载缓存的 llms.txt 结果会被校验若实际不是 llms.txt 响应路径错误、HTML、登录页则驱逐后重抓。llms.txt 探测对文档站先探测/llms-full.txt再探测/llms.txt最后才回退到页面本身。auto仅对文档类域名探测.readthedocs.io、.gitbook.io、docs.rs后缀docs.、developer.、dev.、wiki.前缀always总是探测两者皆不存在时报错never跳过。探测遵循同源重定向策略若 llms.txt 响应是 HTML 或登录页则拒绝。重定向策略单次请求最多跟随 10 次重定向但仅在同源范围内跨源重定向被阻止返回提示要求调用方直接抓取新 URL可配合权限模式显式放行。http://输入会先尝试https://HTTPS 失败连接错误、重定向被阻、非 2xx再回退http://。二进制检测显式二进制 MIMEimage/*、audio/*、video/*、application/pdf、application/zip、application/octet-stream直接视为二进制application/octet-stream与已知文本类型会扫描前 2 KiB 的空字节与不可打印字符来区分文本声明为text/plain但看起来像 HTML 的内容会被升级为text/html以改进提取。超时默认 30 秒、最大 120 秒llms.txt 探测在总超时内封顶 8 秒探测与页面抓取相互独立多个作用域超时并行运行。跨源重定向阻止除非请求 URL 或派生的权限模式显式允许webfetch会阻止跨源重定向次级模型摘要不可用时回退到原始抓取内容。代码搜索工具grep 与 ast-grep基于 ripgrep 的grepgrep使用 ripgrep 做快速内容搜索。在原生grep/glob执行前插件通过 src/hooks/search-path-guard/ 预检请求的path是否有效解析规则与宿主一致v1 的grep用path.join拼接相对路径v1 的glob用path.resolve解析v2 对两者都用path.resolve。缺失路径或包含非目录组件的路径会快速失败并给出可操作的错误信息而不是抛出难懂的 ripgrep execution failed 或静默搜索父目录。解析使用宿主进程的原生路径风格保留 Windows 驱动器相对行为无项目目录时保守放行。AST 感知的ast_grep_search/ast_grep_replaceast_grep理解代码结构能匹配所有返回 JSX 元素的箭头函数这类模式而非依赖精确文本。实现位于 src/tools/ast-grep/通过 src/tools/ast-grep/cli.ts 调用 sg 二进制支持25 种语言见 src/tools/ast-grep/types.ts。ast_grep_search的参数包括pattern带元变量的 AST 模式$VAR匹配单个节点$$$匹配多个节点必须写完整的 AST 节点合法代码例如函数要写export async function $NAME($$$) { $$$ }而非export async function $NAME示例console.log($MSG)、def $FUNC($$$):、async function $NAME($$$)lang目标语言CLI 支持列表内的枚举paths搜索路径默认[.]globs包含/排除规则前缀!排除context匹配上下文行数。ast_grep_replace做 AST 感知的重构默认 dry-run重写中可用元变量保留匹配内容例如patternconsole.log($MSG) rewritelogger.info($MSG)。匹配结果为空时会给出基于模式与语言的空结果提示getEmptyResultHint。后台任务控制工具组后台编排是 oh-my-opencode-slim 的默认编排模型其完整概念见 docs/background-orchestration.mdorchestrator 从主要执行者变为调度器——规划 → 后台派发专家 → 监控 → 对账 → 验证。工具组如下工具说明task启动一个专家任务并返回 task IDtask_status检查任务状态task_result获取任务结果task_message排队一条不打断的消息返回queuedtask_cancel停止一次生成但保留其会话task_revive用新指令恢复被保留的会话wait_for_user暂停自动 orchestrator 唤醒直到下一条不同的外部用户消息任务控制工具使用 task ID 或 Background Job Board 别名来定位被管理的任务。运行时要求原生后台子 Agent 可用并以环境变量启动OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTStrue opencode可用opencode --version检查版本缺后台任务则升级。task_message非打断消息与消息租约task_message的实现见 src/tools/task-message.ts参数为task_id受追踪的活跃任务 ID 或父作用域别名与message1–500 字符的短消息。它不会打断当前生成请求体以noReply: true发送仅更新转录而不调度执行绝不会通过合成消息或切换模型选择来完成。noReply: true防止启动一轮对话而不是改变转录——延迟到达的更新包括捕获的 agent/model/variant可能改变被复用生成的上文。超时并不能证明消息未被送达。核心安全机制是按任务的消息租约本地超时到期但写入传输仍挂起时保留该租约写入未落定前该 taskID 的进一步消息、task_cancel取消、同会话复活/复用以及受租约保护的终止通知全部被排除写入永不落定时这种控制面排除无限期持续不承诺自动恢复但不会停止子任务执行也不阻塞其他 taskID结果仍可通过其他观察/结果路径到达落定无论成功失败即释放令牌没有 TTL也没有session.abort回滚。这是遵循 job board 租约协议的本地互斥不是与外部动作的隔离也不保证恰好一次投递。用board.drop或clearParent删除 job 不会注销其租约liveLeases与jobs相互独立。v2 上task_message继承会话持久化的 agent/model/variant不再每次读取并固定选择v1 保留权威查找v2 写入使用delivery: queue, resume: false以queue语义更新转录但不调度执行。task_cancel停止生成、保留会话task_cancel见 src/tools/cancel-task.ts停止一次生成但保留其会话不回滚部分编辑。因此取消一个可写任务后必须检查并对账文件变更再启动替代工作。它只应由 orchestrator 使用assertOrchestrator校验非 orchestrator agent 或非 orchestrator 管理的会话都会被拒绝仅用于过时、错误、冲突或用户要求的取消。取消流程cancelTrackedExecution获取取消租约调用session.abort然后通过 terminal gate 验证会话真正静默verifyQuiescentSession活动映射中idle或条目缺失即静默证据需保持静默 300ms 稳定窗口。若中止请求在挂起时超时task_cancel报告不确定性并保留取消租约迟到的中止绝不能影响被复用的会话。没有租约 TTL——永不落定的中止会一直阻塞复用迟到落定释放令牌但不恢复验证也不发布已确认的取消恢复依赖后续观察。中止落定后验证有自己的时间预算v2 的 session-info 读取只使用剩余预算超时使任务保持不确定并释放租约不确认取消也不消费迟到证据。v2 没有session.status映射时回退到宿主 session info 的outcome终止值白名单或中止开始后的新 idle 时间戳来确认静默。task_revive恢复保留会话task_revive见 src/tools/task-revive.ts参数为task_id与prompt用新指令恢复被保留cancelled / errored / stopped的会话。被保留状态验证安全后可立即复活acknowledgement 只控制父会话与 job board 消费及可复用池展示不控制同会话复活。关键时序约束基线捕获有 5 秒截止超期则失败且不发送 prompt释放复活租约本地准入等待有 10 秒截止超期返回status: admission_unknown而非启动失败报告的 generation/state 是准入前快照即使接受在调用方收到截止结果前已落定宿主可能已在运行该 prompt不要重试用task_status检查挂起的发送保留租约直到落定迟到接受注册一次新 generation拒绝则释放且不注册完成探测发生在租约释放后探测错误记录为观察失败观察不预留 generation若在第一个调用方等待探测期间另一个task_revive替换了它第一个调用以revive became stale拒绝该取代拒绝不会使更新的启动失效删除胜过挂起准入删除子会话或其父会话后接受到达也不会重建任一记录若原复活租约仍持有缺失的子会话独立补偿所有者恰好发送一次针对该子会话的 abort不注册 generation、不清墓碑、不通知已删父、不中止兄弟节点被撤销/替换的租约或已变更的 generation 保持 fenced绝不触发对继任者的中止若调用方仍在等待会收到admission accepted but invalidated by loss of the record; compensation initiated已返回的admission_unknown不变准入拒绝无需补偿补偿在 abort 挂起期间保留排除无本地截止释放只有真实 abort 落定后的新鲜有界 live-status 读取确认 idle/absence 才释放该租约abort 失败或不可验证/忙碌状态记录compensation unconfirmed并无限期排除该 ID历史结果不是停止证据实时静默不保证排队 prompt 已被清除租约释放后未来排队执行仍不确定。task()拒绝无法恢复的显式task_id而不是丢弃它另开会话。复活前必须先建立空闲验证机制v1 的 live status 映射或 v2 的宿主 idle wait缺失该能力时在 abort、基线捕获、prompt 之前就失败重试无法补足该能力。v2 的 wait 有 5 秒本地预算超时、拒绝、无效完成或在截止后处理的完成都不会发送 prompt 并释放准备租约迟到落定不会恢复已结束的复活流程。被接受的复活可能返回status: started且status_uncertain: true附带观察诊断不确定性单独永远不会在重试耗尽时成为终态但也没有保证的恢复截止。wait_for_user面向外部人工工作的显式等待wait_for_user同样仅限 orchestrator 使用实现见 src/tools/wait-for-user.ts。orchestrator 在给出外部人工操作的具体步骤后把它作为最后一个工具动作调用。其reason仅作诊断文本插件不解析 assistant 散文来判定某轮是否为 HITL。参数reason为 1–500 字符、非空、压缩空白后的描述。新的真实用户文本/文件/图片消息清除等待合成/内部消息与等待之前用户消息的重复投递不清除若有未完成的背景任务且启用了waitForUserGuardEnabled返回state: waiting_for_user_skipped指示立刻结束本轮由 Background Job Board 与 orchestrator wake scheduler 自动恢复正常路径返回state: waiting_for_user、protocol: oh-my-opencode-slim.wait_for_user.v1指示结束本轮用户响应前不要调用更多工具立即回答、选择、澄清与粘贴的命令输出继续使用question工具若在disabled_tools中列出wait_for_userorchestrator 用question工具作为阻塞边界。重复工具调用循环护栏Tool Loop Guard模型侧无限循环是现实风险某个子 Agent例如可能退化的模型在 Explorer 中反复发出完全相同的工具调用、得到完全相同的结果、毫无进展。实现见 src/hooks/tool-loop-guard/hook.ts按会话监控连续相同的工具调用——只统计返回结果与上次逐字节相同的调用返回新信息的调用例如文件被修改后的重读永远不会计入阻断。响应策略第 3 次确认相同结果后向工具输出追加纠正性提示要求模型停止重复、改变方法适用于所有工具第 5 次确认相同结果后对只读文件工具read、grep、glob拒绝下一次相同调用终止循环其他工具保持仅警告。计数在tool.execute.after中确认因此重叠的并行调用无法在结果已知前虚增计数。tool.execute.before永不递增计数拒绝只发生在运行已被确认相同之后。wait_for_user/wait_for_background_tasks这类等待工具使用按轮次、仅按键名的专用计数其契约是结束本轮一轮内重复调用总是退化的第 2 次警告、第 3 次拒绝。整个护栏豁免任务控制与等待工具task、task_status、task_result、task_cancel、task_message、task_revive、wait_for_user、wait_for_background_tasks——它们轮询长时后台任务时合法地重复相同调用。task_status/task_result使用独立的 task-ID/生命周期状态流交替轮询仍可识别而不会被当作无进展。注意task_status输出的possibly_stuck字段见 src/tools/task-status.ts用于辅助判断任务是否停滞。格式化器FormattersOpenCode 在文件写入或编辑后自动使用语言对应的格式化器格式化无需手动步骤。内置 Prettier、Biome、gofmt、rustfmt、ruff以及 20 其他格式化器完整列表参见官方 OpenCode 格式化器文档。小结oh-my-opencode-slim 的内置工具能力围绕三条主线设计可靠性apply_patch 救援与严格校验、搜索路径预检、循环护栏、效率AST 感知的代码搜索与重构、带缓存与 llms.txt 探测的 webfetch、编排后台任务控制工具组与租约/对账/补偿机制。对这些工具的理解是正确使用后台编排模型的前提——更多调度器职责、任务提示契约与运行时集成细节可继续阅读 docs/background-orchestration.mdwebfetch 的完整实现细节见 docs/webfetch.md背景任务管理的相关配置项见 docs/configuration.md。赞分享人工智能AI AgentAgent 编排AI 技能【免费下载链接】oh-my-opencode-slimLean, fine tuned Opencode multi agent suite · Mix any models · Auto delegate tasks项目地址https://gitcode.com/gh_mirrors/oh/oh-my-opencode-slim点击查看免费下载相关推荐技术深度解析AWTKSDL2如何重塑跨平台GUI开发体验技术深度解析AWTKSDL2如何重塑跨平台GUI开发体验 在嵌入式与桌面GUI开发领域跨平台一致性一直是技术团队面临的核心挑战。传统的解决方案要么牺牲性能人工智能AI AgentAgent 编排AI 技能oh-my-opencode-slim 的 apply_patch 钩子系统模糊匹配、自动救援与补丁重写全解析oh my opencode slim 的 apply_patch 钩子系统模糊匹配、自动救援与补丁重写全解析 导读 本文深入解析 oh my opencod人工智能AI AgentAgent 编排AI 技能如何构建高效的开源项目团队协作体系WeChatMsg完整实战指南如何构建高效的开源项目团队协作体系WeChatMsg完整实战指南 在开源项目开发中团队协作效率直接影响项目成败。WeChatMsg作为一款专业的微信聊天记录人工智能AI AgentAgent 编排AI 技能上一篇构建区块链APIJapronto与Web3.py集成下一篇5分钟掌握WebGL太空场景生成Space-3D完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考