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 不会意外污染人类用户的输出,同时也让交互式调试变得自然。
