REPL JSON双模式,Agent与人类使用区别何在?

摘要:同一个 CLI,两种使用方式 CLI-Anything 生成的每个 CLI 都支持两种交互模式。 第一种是传统的命令调用方式: cli-anything-blender scene new --name MyScene cli-anythi
同一个 CLI,两种使用方式 CLI-Anything 生成的每个 CLI 都支持两种交互模式。 第一种是传统的命令调用方式: cli-anything-blender scene new --name MyScene cli-anything-blender object add -t cube -n Cube cli-anything-blender render start --output ./render.png 第二种是 REPL 交互方式——不带任何子命令直接运行,就会进入一个交互式界面: $ cli-anything-blender ╔══════════════════════════════════════════╗ ║ cli-anything-blender v1.0.0 ║ ║ Blender CLI for AI Agents ║ ╚══════════════════════════════════════════╝ [blender]> 两种模式共享同一套后端逻辑,区别在于使用场景:单条命令适合写脚本和 CI/CD,REPL 适合探索和 Agent 的多轮对话。 为什么 Agent 需要 JSON 模式 CLI 输出供人阅读和供机器消费,是两个完全不同的设计问题。 人类看 CLI 输出,需要的是可读性——成功消息有没有颜色、进度条漂不漂亮、表格对齐得整不整齐。这些对 Agent 来说是噪音,反而增加解析成本。 Agent 需要的是结构化数据——一个 JSON 对象,字段名固定,类型清晰,不需要做任何文本解析就能直接用。 所以每个命令都内置了 --json 参数: # 人类可读模式(默认) $ cli-anything-gimp project info --project poster.json Project: poster.json Size: 1920 × 1080 Layers: 3 Modified: Yes # JSON 模式 $ cli-anything-gimp --json project info --project poster.json { "project": "poster.json", "width": 1920, "height": 1080, "layers": 3, "modified": true, "format": "xcf" } Agent 的工作流就变成了:调用命令 → 解析 JSON → 根据结果决定下一步。这个模式在 Claude Code 的日常使用中被验证是稳定可靠的。 JSON 输出的实现方式 技术上实现起来并不复杂,用 Click 的 option flag 模式就能搞定: import click import json @click.command() @click.option('--json', 'as_json', flag_value=True, default=False) @click.option('--project', required=True) def project_info(as_json, project): info = load_project(project) if as_json: click.echo(json.dumps({ "project": info.path, "width": info.width, "height": info.height, "layers": len(info.layers), "modified": info.modified }, indent=2)) else: click.echo(f"Project: {info.path}") click.echo(f"Size: {info.width} × {info.height}") click.echo(f"Layers: {len(info.layers)}") 关键是 --json 的默认值是 False。也就是说,在没有显式指定 --json 的情况下,命令输出对人类友好;显式指定 --json 时,输出对机器友好。这个设计让 Agent 不会意外污染人类用户的输出,同时也让交互式调试变得自然。
阅读全文