☰
从 help 文档到 Function Calling:CLI-Anything 怎么给 Agent 搭桥
2026/10/11 10:30:36 网站建设 项目流程

从 help 文档到 Function Calling:CLI-Anything 怎么给 Agent 搭桥

【免费下载链接】CLI-Anything"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything

Agent 最擅长推理,但面对真实软件时常常寸步难行:GIMP、Blender、LibreOffice 这类专业工具没有稳定开放的 API,像素级的 GUI 自动化又脆弱得经不起一次窗口抖动。业界为此讨论过两条出路——要么让 Agent 学会"看图点鼠标",要么把软件的每一个操作都压缩成一行可调用、可校验、可复现的命令。CLI-Anything 选择的是后者,并且它用一条几乎零人工介入的流水线回答了那个更关键的问题:如何让 Agent 不读 README,就能知道某个命令该怎么调、会返回什么?

本文从源码出发,拆解这条「help 文档 → 结构化工具契约 → Agent 可调用」的搭桥链路:它如何自动把 Click 命令树翻译成机器可读的 SKILL.md,如何用--json把输出变成数据,又如何在 CLI-Hub 与 Workflow Matrix 的加持下,把"单个工具可用"升级成"多步工作流自动化"。

一、问题根源:Agent 缺的不是推理,是"操作面"

AI Agent 的短板从来不是规划能力,而是对真实软件的执行能力。CLI-Anything 的 README.md 把这种断层描述得很直白:当前的主流方案要么是脆弱的 UI 自动化,要么是有限的 API,要么是丢掉了 90% 功能的"简化重实现"。而 CLI 恰好是人与机器之间最古老也最通用的接口——文本命令天然匹配 LLM 的输入输出格式,--help自描述特性让工具的能力可以被程序化发现,确定性输出则让 Agent 的行为可预测。

这正是社区讨论中反复出现的共识:CLI 是 Agent 时代的"通用遥控器"。但遥控器再通用,Agent 也得先知道"哪个键对应哪个功能"。CLI-Anything 的核心工作,就是把这个"键位表"自动生成出来。

二、从 help 文档到机器契约:SKILL.md 的自动生成链路

社区对 CLI-Anything 的早期描述往往浓缩为"解析 help 文档、生成 JSON Schema / OpenAI Function Calling 格式的工具描述"。这句话没错,但真正的工程细节藏在 skill_generator.py 里——它并不真的去"读"--help的终端输出,而是直接对 CLI 源码做 AST 解析。

每个生成的 harness 都是 Click 构建的命令树:顶层是@click.group,下面挂着若干@click.command。skill_generator.py用 Python 的ast模块遍历函数定义,识别@click.group与@click.command装饰器,从装饰器参数中读出声明的命令名,再取函数 docstring 作为描述,最终组装成CommandGroup/CommandInfo结构:

# cli-anything-plugin/skill_generator.py def _click_decorator_info(function, kind): """Return the owner and declared name for a Click decorator.""" for decorator in function.decorator_list: target = decorator.func if isinstance(decorator, ast.Call) else decorator if not (isinstance(target, ast.Attribute) and target.attr == kind): continue ...

这些结构化元数据随后通过 Jinja2 模板 templates/SKILL.md.template 渲染成标准 SKILL.md,输出到仓库根目录skills/cli-anything-<software>/SKILL.md。以 WireMock 为例,生成的契约长这样:

--- name: "cli-anything-wiremock" description: Python CLI harness for WireMock HTTP mock server administration version: 0.1.0 entrypoint: cli-anything-wiremock ---

对照 Function Calling 的惯例,这个 YAML frontmatter 里的name与description就相当于 tool 的名称与用途声明;正文中的 Command Groups 表格相当于参数与子命令的 schema;Examples 与"Agent Guidance"则是调用约定。换句话说,CLI-Anything 把"帮助文档"翻译成了 Agent 可以直接消费的工具契约——这正是它与 LangChain、AutoGen 等框架集成的接口基础:SKILL.md 提供工具定义,--json提供结构化返回,两端一拼就是一个标准 Tool 对象。

三、--json双模输出:让 Agent 拿到的不是文本,而是数据

有了工具契约,还差最后一步:调用结果必须是机器可解析的。这是所有 CLI-Anything harness 的硬性约定——同一个命令同时支持人读与机读两种输出,由全局--json标志切换。

以 wiremock_cli.py 为例,顶层 group 上声明了--json与连接参数,后者还支持从环境变量注入:

@click.group() @click.option("--host", default=None, envvar="WIREMOCK_HOST", help="WireMock host") @click.option("--json", "json_mode", is_flag=True, envvar="WIREMOCK_JSON", help="Output as JSON") def cli(ctx, host, port, scheme, user, password, json_mode): ...

子命令内部按json_mode分流:人读模式走彩色表格与状态文案,机读模式直接打印原始 JSON:

@stub.command("list") @click.pass_context def stub_list(ctx, limit, offset): client = ctx.obj json_mode = ctx.meta.get("json_mode", False) data = StubsManager(client).list(limit=limit, offset=offset) if json_mode: print_json(data) else: print_table(["ID", "Name", "Method", "URL", "Status"], rows, ...)

模板 templates/SKILL.md.template 里甚至为 Agent 固化了一组调用纪律:始终使用--json;检查返回码(0 成功、非零失败);失败时解析 stderr;所有文件操作使用绝对路径;导出操作后验证产物存在。加上 REPL 模式的会话状态(undo/redo、JSON 工程文件持久化),Agent 拿到的不再是"一段终端输出",而是一个有状态、可回滚、可断点续做的执行环境。

四、给 Agent 开一座"货架":CLI-Hub、Meta-Skill 与 Workflow Matrix

单条桥搭好了,接下来是规模化的问题:仓库里有 40+ 个 harness,Agent 怎么知道该装哪个、装了怎么用?答案是三件套。

第一件是包管理器 cli-hub。pip install cli-anything-hub之后,cli-hub list、cli-hub search、cli-hub info、cli-hub install一整套命令把"浏览、筛选、安装、卸载"全部收敛到终端,且列表命令同样支持--json。背后的目录数据在 registry.json:每个条目都带name、version、description、install_cmd、entry_point、skill_md、category、contributors等字段——又是一层结构化的机器契约,只是这次描述的是"工具的仓库"本身。

第二件是 cli-hub-meta-skill/SKILL.md。它教 Agent 自主完成"搜索 → preflight → 安装 → 阅读 SKILL.md → 执行任务"的完整流程,相当于把"找工具"这件事本身变成了 Agent 的一项技能,而非人工操作。

第三件是 Workflow Matrix,见 cli-hub-matrix/video-creation/SKILL.md。它把多步工作流抽象成"能力 × 提供方"矩阵:比如视频创作这条链路里,text.transcribe、visual.generate、composite.assemble各是一个能力,每个能力可绑定 harness CLI、公共 CLI、Python 库、原生二进制或云 API 中的某一种提供方。Agent 遵循的标准动作是"先 preflight 再安装"——cli-hub matrix preflight video-creation --json探测当前环境可用性与缺口,cli-hub matrix install video-creation --capability text.transcribe则只按需安装任务真正需要的工具,避免一次性批量装下 14 个 CLI。

这三点恰好回应了社区情报中反复出现的两个关键词:批量工具管理与多步工作流自动化。单工具时代,Agent 每次调用都要靠提示词硬塞命令;而有了结构化目录 + 能力矩阵,Agent 可以像程序员用包管理器一样,按任务动态组装自己的工具链。

五、桥的另一端不是玩具:真实后端与安全边界

生成式 AI 很容易生产"看起来能用"的玩具代码。CLI-Anything 的工程约束在 HARNESS.md 里写得非常强硬,第一条规则就是调用真实软件,禁止重实现:LibreOffice 渲染必须走libreoffice --headless,Blender 必须走blender --background,GIMP 走 Script-Fu,Kdenlive/Shotcut 走 MLT XML +melt。每个 harness 的utils/<software>_backend.py负责定位可执行文件、构造 subprocess 参数、处理安装缺失的错误提示,并生成合法的中间文件后交给真实引擎渲染。

安全上同样有完整的设计:CLI 只暴露结构化、白名单式的命令面,而不是把任意 shell 交给 LLM;测试策略分成四层——单元测试、中间文件 E2E、真实后端 E2E、安装态 CLI 子进程 E2E,README 里记录了 2,461 个测试全部通过的成绩。社区对"沙箱化安全执行"的讨论,在这里落成了可验证的工程事实。

六、案例:从一行命令到一件成品

纸上谈兵到此为止,看两个真实案例。

WireMock是最典型的"无 GUI 服务型软件"——Agent 用它做接口测试编排:stub quick GET /api/users 200 --body '[...]'注册桩,request count '{"method":"POST","url":"/api/orders"}'断言请求次数,scenario set "cart-flow" "item-added"推进状态机,record start录制真实后端流量。完整命令表见 skills/cli-anything-wiremock/SKILL.md,这些操作全部通过 WireMock 的 Admin REST API 完成,Agent 可以用--json拿到每次调用的精确返回。

FreeCAD则展示了"多步工作流"的极限形态:Agent 通过cli-anything-freecad增量组装一台火星车,每一步操作都发布真实的预览包,preview live维持实时预览会话,trajectory.json把每条命令与对应的视觉状态绑定——整个构建过程从首块草图到成品展示全程可见、可回放:

类似的还有 Draw.io——Agent 从零画出一张完整的 HTTPS 握手时序图,先 TCP 三次握手、再 TLS 协商、加密数据交换、四次挥手,全部由命令驱动:

这些不是"点一下按钮截一张图"的演示,而是 Agent 在无 GUI、无人工干预的前提下,用纯命令链生产出真实工件的全过程。当每一步都建立在结构化的工具契约与 JSON 校验之上时,这种自动化就是可审计、可复现、可增量调试的。

七、结语

回看整条链路,CLI-Anything 的搭桥思路其实非常克制:它没有试图教 Agent"理解软件",而是把软件压缩成 Agent 天然擅长的两种东西——结构化契约(SKILL.md / registry.json / matrix 能力表)与确定性调用(--json+ 退出码)。从 Click 装饰器的 AST 解析,到自动化生成的 SKILL.md,再到按需安装的 CLI-Hub 与按能力组合的 Workflow Matrix,每一个环节都在把"人读的帮助文档"逐步替换为"机读的工具定义"。

当社区还在争论 GUI 与 CLI 谁将胜出时,CLI-Anything 用代码给出了更实际的答案:未来 Agent 需要的不是某种单一界面,而是一套能把"世界上所有软件"翻译成工具调用的标准化桥梁。桥已经搭起来了,剩下的问题只是——今天你想让 Agent 学会用哪一款软件?

【免费下载链接】CLI-Anything"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询