Skip to content

CLI: 文档化语义化退出码 + 核心命令支持 --format json #5

Description

@KenyonY

背景

对照 agent-cli-guide review 现有 flexllm --help,发现最高 ROI 的缺口是:agent 无法可靠判断失败类型(只有 0/非0),也无法稳定解析核心命令的输出。

问题

  1. 所有命令 help 都没有文档化退出码。目前只有默认的 0 = 成功 / 1 = 异常。agent 只能靠解析 stderr 猜测,无法自动重试/修正。
  2. 核心命令没有结构化输出:askchatbatchservemock 都没有 --format json / --json。只有 list/models/test/version/pricing/credits 支持,agent 使用核心命令时必须解析自然语言输出。
  3. 现有 --json 是布尔开关,缺少统一的 --format json|table|ndjson 枚举。batch 天然适合 NDJSON 流式输出。

目标

退出码规范(POSIX 兼容)

含义
0 成功
1 通用错误
2 用法/参数错误
3 资源未找到(模型/配置/文件)
4 权限拒绝(API key 错误/额度不足)
5 冲突(资源已存在)
10 Dry-run 成功(非实际执行)
  • 在 `flexllm/cli/exit_codes.py` 定义 `ExitCode` IntEnum
  • 在顶层 `flexllm --help` 末尾追加 "Exit Codes" 章节
  • 所有抛错路径替换 `typer.Exit(1)` 为具体码

核心命令 --format json

优先覆盖:`ask` / `batch` / `test`(对齐已有)。

  • `ask --format json` 输出 `{content, thinking, usage, model, elapsed_ms}`
  • `batch` 终端汇总改为 `--format json` 时输出聚合指标 JSON(输出文件本身已是 JSONL)
  • stdout 只放数据,所有进度/日志走 stderr(`batch` 的进度条已经用 rich stderr,核查保持)

验收

  • `flexllm --help` 显示退出码表
  • `flexllm ask "hi" --format json` 输出合法 JSON
  • `flexllm ask --model not-exist` 退出码 3
  • `flexllm ask --base-url bad` 鉴权失败退出码 4
  • `flexllm --dry-run` 退出码 10
  • 新增 unit test 覆盖退出码与 JSON schema

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions