aidc CLI

第 3 课 · 共 6 课 约 8 分钟

读、查、改、建都有命令;输出是干净的 JSON,进度在 stderr,退出码告诉脚本下一步该做什么。

本课目标

读完这一课,你将能够

  • 用 aidc semantic 的命令读、查、聚合,并把结果交给脚本
  • 按退出码判断一条命令的结果,写出可以放心重试的脚本
  • 分清 CLI 里哪些命令读、哪些改、哪些建

为什么智能体首选 CLI

aidc 是同一套 API 外面的命令行,业务逻辑都在服务端,CLI 只管参数、文件和输出。它有四个习惯,让人和智能体都用得放心:

  • 每条命令都能输出 JSON:标准输出不是终端时自动开启,也可以手动加 --json。
  • 脚本命令不等输入:终端里的裸命令 aidc 会进入交互界面,aidc login 也会提示输入。脚本要写出子命令。
  • 退出码固定:脚本靠它决定下一步,不用去解析文字。
  • 支持预演的命令先演一遍:--dry-run、--validate-only、--preview。

多数远程命令要凭证。免登录命令包括 login、logout、update、help 和 --version。本地命令也有例外。streams pipe 可用 AIDC_PUBLISH_KEY,connect send 可用 AIDC_AGENT_KEY。开发者凭证先读 AIDC_API_KEY,再读 ~/.aidc/config.json。命名空间缺省是当前组织,-n cell-… 可指定。用 aidc whoami 核对身份与组织。

READ

读

ontology、object-types、objects、object、links、aggregate、object-set、sql、edits-history:只读,可以放心试。

CHANGE

改

apply、apply-batch:执行 Action,先 --validate-only。

BUILD

建

define、branch …、proposals:改本体的定义,智能体只能在分支上做。

在示例工厂上跑一遍

先从读开始。ontology 给全貌,objects 按条件取一页,aggregate 聚合,sql 直接写 SELECT。条件与聚合的写法和 SDK 一致,只是变成了 JSON 参数。

aidc semantic ontology --json                      # 全貌:对象类型(主键、链接)、Action Type、Interface
aidc semantic object-types workOrder --json        # 一个对象类型的属性与链接

aidc semantic objects workOrder --where '{"status":"running","lineCode":"L01"}' --order-by dueAt:asc --select workOrderNo,dueAt,goodQty --page-size 20 --json
aidc semantic object workOrder WO-1001 --json
aidc semantic links workOrder WO-1001 order --json         # 沿关系:这张工单属于哪张销售订单
aidc semantic edits-history workOrder --pk WO-1001 --json  # 谁改过什么

aidc semantic aggregate workOrder --where '{"status":"done"}' --select '{"$count":"unordered","goodQty:sum":"desc"}' --group-by '{"lineCode":"exact"}' --json
aidc semantic sql 'SELECT status, count(*) FROM "workOrder" GROUP BY 1' --csv

翻页也很简单:输出里有 nextPageToken 时,把它交给 --page-token,直到不再出现。

另外两条值得记住。复杂的对象集(并、交、差、沿关系)可以写成一个 JSON 文件,交给 aidc semantic object-set,加 --aggregate 就直接对它聚合。sql 走只读的 Semantic 数据库:一条 SELECT,最多 10,000 行、20 秒,表名是对象类型的 API name,名字里有大写字母要加双引号。

改的命令一律先校验。--validate-only 不写任何东西;校验不通过时退出码是 2,脚本里加了 set -e 就会停在这一步。通过了,再去掉它,想看改了什么就加 --return-edits。批量用 apply-batch,参数写成一个数组文件,普通批量一次最多 20 个,放在一个事务里。配置 writeback webhook 的 Action 一次只能提交一个请求。

aidc semantic apply hold-work-order --param workOrder=WO-1001 --param reason="来料不良" --validate-only
aidc semantic apply hold-work-order --param workOrder=WO-1001 --param reason="来料不良" --return-edits

把它们串起来,就是一个可以放心重试的改数据脚本:

  1. 读现状

    object 取出对象,确认它还是你以为的样子。

  2. 只校验

    apply --validate-only,退出码不是 0 就停。

  3. 执行

    去掉校验开关,加 --return-edits,把返回存下来。

  4. 复查

    edits-history 看这次改动是否记在账上。

输出与退出码

JSON 模式下,成功输出这条命令的数据对象,失败输出 { ok: false, error: { code, message, status, details, requestId } }。进度提示一律写在 stderr,所以 stdout 永远是干净的 JSON,可以直接交给别的程序。

脚本里怎么办什么时候会遇到
0 · 成功继续下一步读到了数据,或 apply 执行完成
2 · 参数错误或校验不通过改参数或定义,不要重试--validate-only 发现提交条件不满足
3 · 未登录或凭证无效停下,找人登录或换 Key没设 AIDC_API_KEY,也没登录过
4 无权限 · 5 不存在停下,核对身份和名字看不到的对象类型,拼错的 API name
6 · 冲突重新读取,再决定别人刚改过同一份东西,或智能体想直接改 main
7 限流 · 8 上游或网络故障等一等,退避后重试429、5xx,或网络断了

这些退出码和第 1 课讲的 HTTP 状态一一对应:400 与 422 是 2,401 是 3,403 是 4,404 是 5,409 是 6,429 是 7,5xx 和网络错误是 8。所以在 REST 里学到的错误规则,在命令行里原样适用。

这张表放进脚本,就是一个 case:

aidc semantic apply hold-work-order --param workOrder=WO-1001 --validate-only --json > check.json
case $? in
  0)   aidc semantic apply hold-work-order --param workOrder=WO-1001 --return-edits --json ;;
  2)   echo "校验没通过,先改参数" >&2; exit 2 ;;        # 不重试
  7|8) echo "稍后再试" >&2; exit 1 ;;                   # 退避后重试
  *)   exit 1 ;;
esac

有一个坑很常见:把所有非零退出码都当成「再试一次」。2、3、4、5 重试一万次结果也一样,只有 7 和 8 才值得退避重试。

要点

  • 脚本写出子命令,用 JSON 输出和固定退出码。裸命令 aidc 与 login 在终端里会交互。
  • aidc semantic 分三类:读、改、建;改之前先 --validate-only。
  • 翻页用 --page-size 与 --page-token,输出里不再有 nextPageToken 就读完了。
  • 失败时 stdout 是 { ok: false, error: … },进度在 stderr;2、3、4、5 不要重试,7、8 才退避重试。
  • 多数远程命令要凭证;无人值守可用 AIDC_API_KEY,免登录与本地命令有例外。

练一练

在自己的终端里跑三条命令

先用 aidc login 登录。没有示例工厂的数据时,用你公司里任何一个对象类型,思路一样。

运行 aidc semantic ontology --json,数一数对象类型和 Action 各有几个;再用 aidc semantic object-types 加一个类型名,看它的属性。

小测

选一个答案,马上看解析。

Q1脚本里 aidc semantic apply … --validate-only 的退出码是 2。最合理的处理是?

Q2为什么智能体用 CLI,比自己拼 HTTP 请求省心?

Q3脚本收到退出码 3,最可能是什么问题?

延伸阅读