面向 AI 代理集成的结构化 JSON 输出、退出码、错误码和两级发现机制
Anysite CLI 会自动检测标准输出是否处于管道或子进程中(非 TTY),并在这种情况下将大多数命令切换为 结构化 JSON 输出。脚本和 AI 代理无需任何标志或配置。
| 场景 | 默认输出 | 覆盖方式 |
|---|---|---|
| 终端(TTY) | 人类可读的富文本 | 在命令上加 --json,强制输出 JSON |
| 管道 / 子进程(非 TTY) | JSON | 使用全局标志 --human,强制输出人类可读文本 |
# In terminal — human-readable output (default)
anysite config list
# In terminal — force JSON output
anysite config list --json
# In pipe — JSON automatically
anysite config list | jq '.result'
# In pipe — force human output
anysite config list --human | less
--non-interactive 会禁用交互式提示(确认、选择)。只要 stdin 不是 TTY,它就会自动启用。
--json 是按命令单独定义的,不是全局标志 — 见
Installation。运行
anysite <command> --help 可以检查某个命令是否有 --json 标志。
config、db、dataset、llm、auth status、schema update 和 changelog 下的大多数子命令都会将
JSON 输出包装在一个信封结构中:
成功:
{
"ok": true,
"result": { "...": "command-specific data" },
"hints": [{"action": "Next step", "command": "anysite ..."}],
"meta": {"version": "0.3.23", "command": "anysite db add"}
}
失败:
{
"ok": false,
"error": {
"code": "CONNECTION_NOT_FOUND",
"message": "Connection 'mydb' not found",
"retryable": false,
"suggestions": ["Add one with: anysite db add <name> --type sqlite --path ./data.db"]
},
"meta": {"version": "0.3.23"}
}
示例:添加数据库连接会返回该信封结构,其中 hints 给出后续命令建议:
anysite db add local --type sqlite --path ./data.db --json | jq '.hints'
anysite api 和 anysite describe(列表模式和单端点模式)是两个例外:它们会以所选的
--format 直接打印 API/模式数据,而不是 {ok, result, ...} 信封,并且 anysite api 完全没有
--json 标志。只有 anysite describe --search 使用该信封。只在上面列出的信封命令上检查 ok。
在信封结构适用的地方:通过 ok 判断成功/失败,通过 error.code 做程序化处理,通过
error.retryable 决定是否重试,通过 error.suggestions / hints 获取后续步骤建议。
| 代码 | 含义 | 触发场景 |
|---|---|---|
| 0 | 成功 | 命令成功完成 |
| 1 | 一般错误 | 未处理的错误、服务器错误 |
| 2 | 用法错误 | 参数无效、缺少必填参数 |
| 3 | 认证失败 | API 密钥无效或已过期 |
| 4 | 资源未找到 | 端点、连接或数据源未找到 |
| 5 | 网络错误 | 连接失败、超时、速率限制 |
anysite api /api/linkedin/user user=satyanadella
case $? in
0) echo "Success" ;;
3) echo "Check your API key" ;;
5) echo "Network issue, retrying..." ;;
*) echo "Error: exit code $?" ;;
esac
| 错误码 | 退出码 | 可重试 | 触发条件 |
|------------|-----------|-----------|---------|
| `AUTH_FAILED` | 3 | 否 | API 密钥无效或已过期 |
| `RATE_LIMIT` | 5 | 是 | 请求过多 |
| `NOT_FOUND` | 4 | 否 | 资源未找到 |
| `VALIDATION_ERROR` | 2 | 否 | 输入参数有误 |
| `SERVER_ERROR` | 1 | 是 | API 服务器错误(5xx) |
| `NETWORK_ERROR` | 5 | 是 | 连接失败 |
| `TIMEOUT` | 5 | 是 | 请求超时 |
| 错误码 | 退出码 | 可重试 | 触发条件 |
|------------|-----------|-----------|---------|
| `CONNECTION_NOT_FOUND` | 4 | 否 | 数据库连接未配置 |
| 错误码 | 退出码 | 可重试 | 触发条件 |
|------------|-----------|-----------|---------|
| `DATASET_ERROR` | 1 | 否 | 数据集操作失败 |
| `CIRCULAR_DEPENDENCY` | 1 | 否 | 多个数据源之间形成循环引用 |
| `SOURCE_NOT_FOUND` | 4 | 否 | 在数据集配置中未找到数据源 |
| 错误码 | 退出码 | 可重试 | 触发条件 |
|------------|-----------|-----------|---------|
| `CONFIG_ERROR` | 2 | 否 | 未配置 LLM 提供商 |
| `LLM_PROVIDER_ERROR` | 1 | 是 | LLM 提供商调用失败 |
| `PROMPT_ERROR` | 1 | 否 | 提示词模板错误 |
CLI 通过两个层级提供自描述的发现载荷,其设计目的是让代理无需任何预先知识即可规划出一个工作流。
在管道中不带任何参数运行 anysite,即可获得一份精简的发现载荷:
anysite | jq '.result'
result 包含:
| 字段 | 描述 |
|---|---|
status |
当前认证方式、LLM 提供商、已保存的数据库连接、模式/关系图缓存状态 |
agent_protocol |
自动 JSON、--json、--human、--non-interactive 的工作方式 |
output_schema |
成功与失败信封结构的形状 |
exit_codes |
机器可读的退出码含义 |
whats_new |
最新版本的更新摘要 |
commands |
每个顶层命令的描述;对于命令组,还包括每个子命令的一句话描述和一个 detail_command 提示 |
installed_extras |
已安装的可选依赖包:data、llm、postgres、clickhouse、mysql |
对于任意命令组,将空输入通过管道传给它即可获得完整选项、精选示例和使用提示:
echo '' | anysite db
echo '' | anysite dataset
echo '' | anysite llm
这会返回该分组下每个子命令的选项(提取出组内公共部分)、精选的调用示例和提示 — 例如 db 的提示中包括
如何将 API 输出直接通过管道传给 db insert。
没有子命令的顶层命令(api、describe)在管道中以空参数调用时也使用同样的机制:
echo '' | anysite api
echo '' | anysite describe
返回 JSON 信封的命令还会返回后续步骤提示 — 建议的后续命令。在 JSON 模式下它们出现在 hints
数组中;在人类可读模式下则以暗淡文字打印到 stderr。
anysite db add local --type sqlite --path ./data.db --json | jq -r '.hints[].command'
数据集子系统内置了一份完整的配置参考:
# Full configuration reference
anysite dataset guide
# Specific section
anysite dataset guide --section sources
# Complete example config
anysite dataset guide --example advanced
# List all available sections and examples
anysite dataset guide --list
# JSON output for agents
anysite dataset guide --json
anysite api /api/linkedin/user user=satyanadella | jq '.follower_count'
anysite api /api/linkedin/search/users keywords="CTO" count=10 --format jsonl | \
jq -r '[.name, .headline] | @csv'
#!/bin/bash
RESPONSE=$(anysite api /api/linkedin/user user="$1" 2>/dev/null)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
echo "$RESPONSE" | jq '.'
elif [ $EXIT_CODE -eq 3 ]; then
echo "Authentication failed. Check your API key."
exit 1
elif [ $EXIT_CODE -eq 5 ]; then
echo "Network error."
else
echo "Error: exit code $EXIT_CODE"
exit $EXIT_CODE
fi
# 1. Discover CLI capabilities and current status
anysite | jq '.result.status'
# 2. Discover available API endpoints
anysite describe --search "linkedin" --json
# 3. Inspect a specific endpoint
anysite describe /api/linkedin/user --json
# 4. Execute and check the exit code
anysite api /api/linkedin/user user=satyanadella
echo "exit: $?"
基于同一协议构建的声明式多数据源采集
安装 CLI 并配置全局选项