@volcengine/ark-cli-darwin-arm64 0.0.0-stage → 1.0.46-prerelease.2e2d76ea86c4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/LICENSE +201 -0
  2. package/bin/arkcli-darwin-arm64 +4 -0
  3. package/manifest.json +37 -0
  4. package/package.json +20 -4
  5. package/skills/arkcli-agent/SKILL.md +197 -0
  6. package/skills/arkcli-agent/references/activation.md +23 -0
  7. package/skills/arkcli-agent/references/agent.md +442 -0
  8. package/skills/arkcli-agent/references/byok.md +74 -0
  9. package/skills/arkcli-agent/references/context-management.md +61 -0
  10. package/skills/arkcli-agent/references/debug-export.md +27 -0
  11. package/skills/arkcli-agent/references/dream.md +91 -0
  12. package/skills/arkcli-agent/references/evals.md +215 -0
  13. package/skills/arkcli-agent/references/events-chat.md +192 -0
  14. package/skills/arkcli-agent/references/interfaces-gaps.md +55 -0
  15. package/skills/arkcli-agent/references/mcp-vault.md +111 -0
  16. package/skills/arkcli-agent/references/model-config.md +46 -0
  17. package/skills/arkcli-agent/references/self-hosted.md +47 -0
  18. package/skills/arkcli-agent/references/session-files.md +157 -0
  19. package/skills/arkcli-agent/references/session-upgrade.md +64 -0
  20. package/skills/arkcli-agent/references/skills.md +94 -0
  21. package/skills/arkcli-agent/references/todo-write.md +37 -0
  22. package/skills/arkcli-agent/references/vision-agent.md +92 -0
  23. package/skills/arkcli-api-explorer/SKILL.md +114 -0
  24. package/skills/arkcli-api-explorer/references/arkcli-api.md +185 -0
  25. package/skills/arkcli-api-explorer/references/evals.md +92 -0
  26. package/skills/arkcli-auth/SKILL.md +127 -0
  27. package/skills/arkcli-auth/references/api-key-query.md +74 -0
  28. package/skills/arkcli-auth/references/arkcli-auth-init-volc.md +58 -0
  29. package/skills/arkcli-auth/references/arkcli-auth-login.md +125 -0
  30. package/skills/arkcli-auth/references/arkcli-auth-status.md +41 -0
  31. package/skills/arkcli-auth/references/arkcli-auth-whoami.md +128 -0
  32. package/skills/arkcli-auth/references/auth-modes.md +101 -0
  33. package/skills/arkcli-auth/references/identity-resolution.md +74 -0
  34. package/skills/arkcli-auth/references/realname-gate.md +23 -0
  35. package/skills/arkcli-auth/scripts/key-metadata.jq +34 -0
  36. package/skills/arkcli-billing/SKILL.md +105 -0
  37. package/skills/arkcli-billing/references/arkcli-billing-list.md +247 -0
  38. package/skills/arkcli-billing/references/evals.md +50 -0
  39. package/skills/arkcli-chat/SKILL.md +229 -0
  40. package/skills/arkcli-chat/references/arkcli-chat.md +300 -0
  41. package/skills/arkcli-chat/references/caching-thinking.md +138 -0
  42. package/skills/arkcli-chat/references/chat-meta.md +77 -0
  43. package/skills/arkcli-chat/references/evals.md +60 -0
  44. package/skills/arkcli-chat/references/stream-events.md +163 -0
  45. package/skills/arkcli-chat/references/text-format.md +160 -0
  46. package/skills/arkcli-chat/references/tools.md +130 -0
  47. package/skills/arkcli-code-example/SKILL.md +73 -0
  48. package/skills/arkcli-code-example/assets/demo-code/examples.json +14 -0
  49. package/skills/arkcli-code-example/assets/demo-code/go/main.go +53 -0
  50. package/skills/arkcli-code-example/assets/demo-code/python.py +26 -0
  51. package/skills/arkcli-code-example/references/arkcli-code-example.md +146 -0
  52. package/skills/arkcli-code-example/references/evals.md +12 -0
  53. package/skills/arkcli-config/SKILL.md +129 -0
  54. package/skills/arkcli-config/references/arkcli-config-init.md +49 -0
  55. package/skills/arkcli-config/references/arkcli-config-profile.md +54 -0
  56. package/skills/arkcli-config/references/evals.md +87 -0
  57. package/skills/arkcli-connect/SKILL.md +62 -0
  58. package/skills/arkcli-connect/references/arkcli-connect.md +129 -0
  59. package/skills/arkcli-connect/references/evals.md +117 -0
  60. package/skills/arkcli-custommodel/SKILL.md +177 -0
  61. package/skills/arkcli-custommodel/references/arkcli-custommodel-available-quantizations.md +28 -0
  62. package/skills/arkcli-custommodel/references/arkcli-custommodel-delete.md +36 -0
  63. package/skills/arkcli-custommodel/references/arkcli-custommodel-get.md +45 -0
  64. package/skills/arkcli-custommodel/references/arkcli-custommodel-list.md +72 -0
  65. package/skills/arkcli-custommodel/references/arkcli-custommodel-quantize.md +58 -0
  66. package/skills/arkcli-custommodel/references/arkcli-custommodel-update.md +47 -0
  67. package/skills/arkcli-custommodel/references/arkcli-custommodel-upload.md +60 -0
  68. package/skills/arkcli-custommodel/references/evals.md +58 -0
  69. package/skills/arkcli-datasets/SKILL.md +41 -0
  70. package/skills/arkcli-datasets/references/commands.md +91 -0
  71. package/skills/arkcli-datasets/references/evals.md +30 -0
  72. package/skills/arkcli-deploy/SKILL.md +128 -0
  73. package/skills/arkcli-deploy/references/arkcli-deploy.md +138 -0
  74. package/skills/arkcli-deploy/references/evals.md +117 -0
  75. package/skills/arkcli-docs/SKILL.md +232 -0
  76. package/skills/arkcli-docs/references/commands.md +225 -0
  77. package/skills/arkcli-docs/references/evals.md +200 -0
  78. package/skills/arkcli-docs/references/failure-modes.md +77 -0
  79. package/skills/arkcli-doctor/CONTRIBUTING.md +202 -0
  80. package/skills/arkcli-doctor/SKILL.md +302 -0
  81. package/skills/arkcli-doctor/references/error-codes.md +504 -0
  82. package/skills/arkcli-doctor/references/evals.md +70 -0
  83. package/skills/arkcli-doctor/references/scope-account.md +205 -0
  84. package/skills/arkcli-doctor/references/scope-cli.md +217 -0
  85. package/skills/arkcli-doctor/references/scope-infer-endpoint.md +214 -0
  86. package/skills/arkcli-doctor/references/scope-metrics.md +197 -0
  87. package/skills/arkcli-doctor/references/scope-model.md +241 -0
  88. package/skills/arkcli-doctor/references/scope-report.md +242 -0
  89. package/skills/arkcli-doctor/references/verify-origin.md +142 -0
  90. package/skills/arkcli-gen/SKILL.md +348 -0
  91. package/skills/arkcli-gen/references/arkcli-gen-audio.md +125 -0
  92. package/skills/arkcli-gen/references/arkcli-gen.md +297 -0
  93. package/skills/arkcli-gen/references/evals.md +93 -0
  94. package/skills/arkcli-gen/references/gen-meta.md +182 -0
  95. package/skills/arkcli-gen/references/image-stream.md +105 -0
  96. package/skills/arkcli-gen/references/intent-and-validation.md +177 -0
  97. package/skills/arkcli-helper/SKILL.md +233 -0
  98. package/skills/arkcli-helper/references/arkcli-helper.md +372 -0
  99. package/skills/arkcli-helper/references/evals.md +110 -0
  100. package/skills/arkcli-infer-endpoint/SKILL.md +141 -0
  101. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-create.md +142 -0
  102. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-delete.md +68 -0
  103. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-get.md +60 -0
  104. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-list.md +142 -0
  105. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-start.md +34 -0
  106. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-stop.md +34 -0
  107. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-update.md +76 -0
  108. package/skills/arkcli-infer-endpoint/references/evals.md +24 -0
  109. package/skills/arkcli-models/SKILL.md +314 -0
  110. package/skills/arkcli-models/references/arkcli-models-activate.md +110 -0
  111. package/skills/arkcli-models/references/arkcli-models-get.md +100 -0
  112. package/skills/arkcli-models/references/arkcli-models-list.md +73 -0
  113. package/skills/arkcli-models/references/arkcli-models-performance.md +32 -0
  114. package/skills/arkcli-models/references/arkcli-models-scenario-table.md +83 -0
  115. package/skills/arkcli-models/references/arkcli-models-search.md +208 -0
  116. package/skills/arkcli-models/references/evals.md +88 -0
  117. package/skills/arkcli-onboard/SKILL.md +81 -0
  118. package/skills/arkcli-onboard/references/evals.md +107 -0
  119. package/skills/arkcli-plans/SKILL.md +208 -0
  120. package/skills/arkcli-plans/references/arkcli-plans-agreement-signing.md +74 -0
  121. package/skills/arkcli-plans/references/arkcli-plans-buy.md +209 -0
  122. package/skills/arkcli-plans/references/arkcli-plans-get.md +96 -0
  123. package/skills/arkcli-plans/references/arkcli-plans-harness-status.md +149 -0
  124. package/skills/arkcli-plans/references/arkcli-plans-model-apply.md +56 -0
  125. package/skills/arkcli-plans/references/arkcli-plans-model-list.md +119 -0
  126. package/skills/arkcli-plans/references/arkcli-plans-personal-rotate-apikey.md +83 -0
  127. package/skills/arkcli-plans/references/arkcli-plans-renew.md +134 -0
  128. package/skills/arkcli-plans/references/arkcli-plans-team-rotate-apikey.md +108 -0
  129. package/skills/arkcli-plans/references/arkcli-plans-team-seat-assign.md +142 -0
  130. package/skills/arkcli-plans/references/arkcli-plans-team-seat-list.md +115 -0
  131. package/skills/arkcli-plans/references/evals.md +224 -0
  132. package/skills/arkcli-pricing/SKILL.md +125 -0
  133. package/skills/arkcli-pricing/references/arkcli-pricing-models.md +260 -0
  134. package/skills/arkcli-pricing/references/arkcli-pricing-plans.md +147 -0
  135. package/skills/arkcli-profile/SKILL.md +188 -0
  136. package/skills/arkcli-profile/references/arkcli-profile-create.md +101 -0
  137. package/skills/arkcli-profile/references/arkcli-profile-keys.md +100 -0
  138. package/skills/arkcli-profile/references/arkcli-profile-set-default.md +81 -0
  139. package/skills/arkcli-profile/references/evals.md +5 -0
  140. package/skills/arkcli-resources/SKILL.md +122 -0
  141. package/skills/arkcli-resources/references/arkcli-resources-list.md +140 -0
  142. package/skills/arkcli-shared/SKILL.md +236 -0
  143. package/skills/arkcli-shared/references/execution-context.md +108 -0
  144. package/skills/arkcli-shared/references/global-flags.md +45 -0
  145. package/skills/arkcli-shared/references/profile-defaults.md +57 -0
  146. package/skills/arkcli-shared/references/troubleshooting.md +36 -0
  147. package/skills/arkcli-shared/references/update.md +72 -0
  148. package/skills/arkcli-train-finetune/SKILL.md +123 -0
  149. package/skills/arkcli-train-finetune/references/ark-finetune-sdk.md +133 -0
  150. package/skills/arkcli-train-finetune/references/create.md +262 -0
  151. package/skills/arkcli-train-finetune/references/download.md +44 -0
  152. package/skills/arkcli-train-finetune/references/evals.md +14 -0
  153. package/skills/arkcli-train-finetune/references/export-deploy.md +177 -0
  154. package/skills/arkcli-train-finetune/references/job-configuration.md +122 -0
  155. package/skills/arkcli-train-finetune/references/list.md +78 -0
  156. package/skills/arkcli-train-finetune/references/manage.md +128 -0
  157. package/skills/arkcli-train-finetune/references/rl-plugins.md +77 -0
  158. package/skills/arkcli-train-finetune/references/testing-debug-monitoring.md +137 -0
  159. package/skills/arkcli-understand/SKILL.md +131 -0
  160. package/skills/arkcli-understand/references/arkcli-understand-asr.md +53 -0
  161. package/skills/arkcli-understand/references/arkcli-understand.md +268 -0
  162. package/skills/arkcli-understand/references/evals.md +119 -0
  163. package/skills/arkcli-understand/references/sub-skills.md +141 -0
  164. package/skills/arkcli-usage/SKILL.md +166 -0
  165. package/skills/arkcli-usage/references/arkcli-usage-balance.md +217 -0
  166. package/skills/arkcli-usage/references/arkcli-usage-plan-details.md +136 -0
  167. package/skills/arkcli-usage/references/arkcli-usage-plan.md +166 -0
  168. package/skills/arkcli-usage/references/arkcli-usage-seats.md +194 -0
  169. package/skills/arkcli-usage/references/arkcli-usage-stats.md +195 -0
  170. package/skills/arkcli-usage/references/evals.md +30 -0
  171. package/README.md +0 -3
@@ -0,0 +1,138 @@
1
+ ---
2
+ name: caching-thinking
3
+ description: arkcli +chat 的 Caching / Thinking / ExpireAt 用法 reference, 配合 --store + chat get 实现可验证的多轮缓存与思考开关。
4
+ ---
5
+
6
+ # +chat Caching / Thinking / ExpireAt
7
+
8
+ 这三组 flag 让 `+chat` 真正能控制服务端缓存、推理深度和持久化生命周期, 同时把状态回显到响应里方便 agent 验证。
9
+
10
+ ## 何时使用
11
+
12
+ - **Caching** —— 多轮对话相同 system / 工具定义重复, 想跑 prompt cache 省钱; 或反过来要禁缓存测纯净行为。
13
+ - **Thinking** —— 模型支持 reasoning 但本轮不想让它思考 (省 token); 或想强制让它思考。
14
+ - **ExpireAt** —— 想给 `--store` 过的 response 加个过期, 不让它无限存储。
15
+
16
+ ## flag 速查
17
+
18
+ | flag | 类型 | 取值 / 形态 |
19
+ |---|---|---|
20
+ | `--caching` | string | `enabled` / `disabled` (空表示用服务端默认) |
21
+ | `--cache-prefix` | bool | 与 `--caching` 联用; 启用 prefix-cache (autotest 的 `prefix_cache_test` 在用)。**与 `--max-output-tokens` 互斥** —— 服务端约束 `caching.prefix is not supported when max_output_tokens is set`,arkcli 会在客户端就拦截这个组合 |
22
+ | `--thinking` | string | `auto` / `enabled` / `disabled` (空表示用服务端默认) |
23
+ | `--expire-at` | int (epoch sec) | 配合 `--store` 使用; 不传则用服务端默认 GC 策略 |
24
+
25
+ ## 典型组合
26
+
27
+ ### 开缓存的多轮对话
28
+
29
+ ```bash
30
+ # 第一轮: 启用缓存 + store
31
+ RID=$(arkcli +chat "草莓什么颜色" --model ep-xxx \
32
+ --caching enabled --store \
33
+ --format json | jq -r .id)
34
+
35
+ # 第二轮: 同样启用缓存, 接续 RID
36
+ arkcli +chat "苹果呢?" --model ep-xxx \
37
+ --caching enabled --store \
38
+ --previous-response-id "$RID"
39
+
40
+ # 核对缓存配置(不是命中证明): chat get 拿回响应
41
+ arkcli chat get "$RID" --format json | jq .caching
42
+ # → {"type":"enabled"}
43
+ ```
44
+
45
+ ### 关思考压短输出
46
+
47
+ ```bash
48
+ arkcli +chat "用 30 字介绍 LLM" --model ep-xxx \
49
+ --thinking disabled --max-output-tokens 100
50
+ # 没有 thinking phase, 直接出 response
51
+ ```
52
+
53
+ ### 持久化 + 过期
54
+
55
+ ```bash
56
+ TS=$(($(date +%s) + 3600)) # 1 小时后过期
57
+ arkcli +chat "记住我叫小明" --model ep-xxx \
58
+ --store --expire-at "$TS"
59
+
60
+ # 校验
61
+ arkcli chat get "$RID" --format json | jq '{store, expire_at}'
62
+ # → {"store":true, "expire_at":1746676800}
63
+ ```
64
+
65
+ ## 输出形态
66
+
67
+ 非流式时, `+chat` 与 `chat get` 都返回扩展过的 `ResponsesResult`:
68
+
69
+ ```json
70
+ {
71
+ "id": "resp_...",
72
+ "object": "response",
73
+ "status": "completed",
74
+ "created_at": 1746673200,
75
+ "model": "...",
76
+ "content": "...",
77
+ "reasoning_content": "...",
78
+ "usage": { ... },
79
+ "store": true,
80
+ "expire_at": 1746676800,
81
+ "previous_response_id": "...",
82
+ "caching": {"type": "enabled", "prefix": null},
83
+ "thinking": {"type": "disabled"},
84
+ "reasoning": {"effort": "medium"}
85
+ }
86
+ ```
87
+
88
+ 流式需要机读证据时使用 `--stream --include-events`,核对成功终态中实际返回的
89
+ response 字段;普通 `--stream` 是人类可读文本,不是上面的扁平 JSON。
90
+ 未回显的字段保持未知,不为补字段再次发起推理。详见 [stream-events.md](stream-events.md)。
91
+
92
+ ## 验证清单 (autotest 对应)
93
+
94
+ | autotest 用例 | 是否解锁 |
95
+ |---|---|
96
+ | `Test_ResponseCreate_ExpireAtAndCaching` | ✅ |
97
+ | `Test_ResponseCreate_MaxOutputTokens` (含 Thinking disabled) | ✅ |
98
+ | `Test_ResponseCreateAndGet_PersistedFields` | ✅ (配合 PR-1 的 chat get) |
99
+ | `cache/cache_test.go` 8 个用例 | ✅ |
100
+ | `cache/prefix_cache_test.go` | ✅ (用 --cache-prefix) |
101
+ | `partial/partial_mode_test.go` | ✅ (Thinking + Caching 组合) |
102
+ | `Test_Stream_ExpireAtAndCaching` | 使用 --include-events 检查实际终态 |
103
+ | `cache/cache_stream_test.go` 5 个用例 | 检查实际终态,配置本身不证明命中 |
104
+
105
+ ## 常见错误
106
+
107
+ | 现象 | 原因 |
108
+ |---|---|
109
+ | `unsupported caching.type "X"` | 取值不是 `enabled`/`disabled` |
110
+ | `unsupported thinking.type "X"` | 取值不是 `auto`/`enabled`/`disabled` |
111
+ | `--cache-prefix` 不生效 | 没同时传 `--caching enabled`; 服务端默认拒绝单独 prefix |
112
+ | `--expire-at` 不生效 | 没传 `--store`; 服务端只对 stored response 应用 GC |
113
+ | 设置后 `chat get` 拿不到回显 | 该 response 没 `--store` 或已过期 |
114
+
115
+ ## 与 reasoning-effort 联动
116
+
117
+ `--reasoning-effort` 与 `--thinking` 是两个独立维度:
118
+
119
+ - 明确要求关闭思考且目标支持时,优先使用 `--thinking disabled`。`thinking` 与 `reasoning` 在客户端分别编码,是否产生等价的模型行为由匹配模型版本与 API 文档决定。若文档明确说明 `enabled` 配合 `minimal` 会跳过思考,可说明这一有条件替代;没有依据或有明确例外时不作等价承诺,也不擅自替换用户指定的值。
120
+ - CLI 将两者分别传为 Responses 请求的 `thinking.type` 和 `reasoning.effort`。交付 SDK/HTTP 示例时保留用户明确的值,不把 effort 写进 thinking,也不凭经验自动补 high。
121
+ - 参数组合是否支持、最终是否采用由目标模型和服务端决定;保留实际错误与回显,不保证所有模型都接受相同组合。
122
+ - `caching.type=enabled` 只说明配置;只有实际 usage 中的缓存命中统计才能证明命中。缺少统计时标为未知,不能声称已省下具体 token 或费用。
123
+ - 比较延迟时记录模型版本、输入、参数、缓存状态和实际耗时;未实测时不宣称 disabled/minimal/high 有跨模型固定排序,也不为验证猜测擅自增加付费请求。
124
+
125
+
126
+ ## HTTP 与 Python SDK 的字段位置
127
+
128
+ 给示例时标明 SDK 包/导入、版本依据与 API 方法;“Python SDK”不足以区分方舟客户端和 `openai` 客户端。保持模型 ID、协议和开关值一致,再选择客户端传参方式:
129
+
130
+ | 入口 | 关闭思考参数 | 核对边界 |
131
+ | --- | --- | --- |
132
+ | 原生 HTTP 请求 | 顶层 `"thinking": {"type": "disabled"}` | Chat 输入为 `messages`;Responses 输入为 `input`;两者支持范围分别核对 |
133
+ | 方舟 Python SDK | 对应版本方法支持时使用 `thinking={"type": "disabled"}` | 示例写明实际包/导入;不能套给未注册该关键字的 SDK |
134
+ | Python `openai` 客户端 | `extra_body={"thinking": {"type": "disabled"}}` | `extra_body` 是 SDK 的额外请求体入口,线上 JSON 仍是顶层 `thinking`,不是嵌套 `extra_body` |
135
+
136
+ 用户未指定 SDK 时,可在最小 HTTP 示例旁简述上述兼容差异;不需要执行真实模型请求或先创建 Key。已有匹配文档时可交付已查证用法,缺失的模型/版本条件明确列出。
137
+
138
+ 思考强度在 Chat 请求使用 `reasoning_effort`,Responses 使用 `reasoning.effort`。模型文档只证明某一协议下 `minimal` 的语义时,不能自动推广到另一协议或其他模型;固定 CLI 的 `+chat --reasoning-effort` 走 Responses 并编码 `reasoning.effort`,本地 Preview/SDK 枚举不能证明线上模型接受或产生相同行为。性能、缓存命中和费用仍以实际测量或返回值为依据。
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: chat-meta
3
+ description: arkcli chat get / delete / list-input-items 三个标准 CRUD 命令的 reference, 与 +chat 工作流配套使用以管理已 store 的对话。
4
+ ---
5
+
6
+ # chat get / delete / list-input-items
7
+
8
+ 这是 `+chat` 的"对账面"——`+chat` 负责发起对话并持久化;这三个命令负责事后查询、删除、查看输入历史。
9
+
10
+ ## 何时使用
11
+
12
+ - `chat get` —— 已经有 response_id, 想拿回完整对话内容(含 reasoning, function calls, usage)。
13
+ - `chat delete` —— 删掉之前 `--store` 留下的 response 记录。
14
+ - `chat list-input-items` —— 想看某条 response 的 input 列表(适用于多轮接续后回溯历史)。
15
+
16
+ ## 前置条件
17
+
18
+ - 这三个命令操作的 response **必须是 `+chat --store` 持久化过的**。无 `--store` 的 response 在服务端不留底, `chat get` 会返回 `InvalidParameter.PreviousResponseNotFound`。
19
+ - 鉴权与 `+chat` 一致, 见 `../arkcli-auth/SKILL.md`。
20
+
21
+ ## 命令速查
22
+
23
+ ```bash
24
+ # 1. 创建对话并持久化, 拿到 response id
25
+ RID=$(arkcli +chat "草莓什么颜色?" --model ep-xxx --store --format json | jq -r .id)
26
+
27
+ # 2. 查询
28
+ arkcli chat get "$RID"
29
+
30
+ # 3. 查询时让服务端展开 input_image 的 base64 (实测对调试图片输入有用)
31
+ arkcli chat get "$RID" --include image_url
32
+
33
+ # 4. 列出 input items (倒序最新 5 条)
34
+ arkcli chat list-input-items "$RID" --order desc --limit 5
35
+
36
+ # 5. 翻页 (拿到 first_id / last_id 后接着拉)
37
+ arkcli chat list-input-items "$RID" --after <last_id_from_previous_page> --limit 20
38
+
39
+ # 6. 删除
40
+ arkcli chat delete "$RID"
41
+ ```
42
+
43
+ ## flag 说明
44
+
45
+ ### chat get
46
+
47
+ | flag | 说明 |
48
+ |---|---|
49
+ | `--include` | 让服务端在响应里展开扩展字段, 可重复。可选值(CLI 本地校验): `image_url` / `audio_url` / `encrypted_content`。**警告**:SDK 与生产后端在 include 枚举字符串上当前存在 skew,部分账号 / 接入点对所有三个值都会回 `Invalid value for 'include'`;如遇此错,去掉 `--include` 即可(响应主体内容仍会正常返回)。 |
50
+
51
+ ### chat list-input-items
52
+
53
+ | flag | 说明 |
54
+ |---|---|
55
+ | `--after <item_id>` | 游标分页: 列出该 item 之后的内容 |
56
+ | `--before <item_id>` | 游标分页: 列出该 item 之前的内容 |
57
+ | `--limit <int>` | 单页大小, 1-100, 服务端默认 20 |
58
+ | `--order asc\|desc` | 排序方向, 服务端默认 desc |
59
+ | `--include` | 同 `chat get` |
60
+
61
+ ### chat delete
62
+
63
+ 无额外 flag。
64
+
65
+ ## 输出形态
66
+
67
+ - `chat get` 复用 `+chat` 的 `ResponsesResult` 结构: `{id, model, content, reasoning_content, usage, function_calls?}`。
68
+ - `chat list-input-items` 返回 `{object, data:[…], first_id, last_id, has_more}`, `data[]` 是原始 SDK 形态的 InputItem JSON (16 路 oneof, 不做 arkcli 侧 mirror); 用 `jq '.data[].type'` 看每项是 `input_message` / `function_tool_call` / `function_web_search` / `reasoning` / 等中的哪一种。
69
+ - `chat delete` 返回 `{id, deleted:true}`; 服务端无响应体, 这里是 arkcli 合成的。
70
+
71
+ ## 常见错误
72
+
73
+ | 现象 | 原因 |
74
+ |---|---|
75
+ | `InvalidParameter.PreviousResponseNotFound` | response_id 拼错, 或创建时未 `--store` |
76
+ | `chat get/delete/list-input-items` 报 `missing response id` | positional arg 没传 |
77
+ | `tool/function call` 在 `data[]` 没看到 | 创建时未传 `--tools`; 或模型未触发 tool, 见 `references/tools.md` |
@@ -0,0 +1,60 @@
1
+ # Chat 回归场景
2
+ ## 研究来源与分块真实输出(4345/163465)
3
+
4
+ 已失败证据:实际交付DOCX在摘要/方法/表格中把模拟样本写为2024年真实调查,包含500份发放、412回收、386有效,并声称使用SPSS/AMOS;最终聊天才说模拟。官方效果0.80保留,正文事实错误另记。真实工具还有外层exit0而内部exit1/响应0字节,以及正文提取为null的情况,不能视为正文全部成功。
5
+
6
+ 通过条件:真实用户数据、公开引用、模拟数据、研究计划分别标识;每块提示与最终正文的数据来源保持一致,模拟样本不写成已经开展的真实调查,未实际执行工具不声称已执行。摘要、方法、数据收集、结果表格和结论逐项查证;仅最终聊天附免责声明不能弥补文档误导。
7
+
8
+ 对照:有真实数据和已验证统计输出时允许报告事实;无数据时可交文献综述、设计方案和明确标注的模拟示例。每块保存原始响应与CLI退出码;非空JSON null、只有usage、只有reasoning、截断流和外层Bash完成均不能替代成功终态与非空正文。已存正文的解析失败先修本地字段提取,不重发收费调用;状态未知保留未验及可交付部分。
9
+
10
+ 源码边界:非流式 content/status 为顶层字段;incomplete 带正文且 exit0 仍是部分内容。默认流式是文本,带 include-events 才是逐行事件;两种模式都不能将只有 reasoning 或工具参数当作正文。不得为补验状态重新收费生成。
11
+
12
+
13
+ ## 模型 API 用法与 SDK 兼容(4387/163434)
14
+
15
+ 真实失败:新候选已完整加载,主方案 `thinking.type=disabled` 正确,无幻觉;但答复仅写“Python SDK”并直接传 `thinking=`,未区分 OpenAI 客户端,也遗漏匹配文档中的 `minimal` 条件替代。官方效果 0.67,主要基线4205同题0.83,保留实际评分。旧“minimal不能替代”规则早于本轮遗漏融合,不能把它误记为88条diff新增;未读reference也不能当作实际诱因。
16
+
17
+ | 条件 | 验收重点 |
18
+ | --- | --- |
19
+ | 目标模型和协议已有明确的 disabled 文档 | 直接给可用主方案,标明模型/API与示例客户端;不要求先创建资源或发真实推理 |
20
+ | 使用 Python openai 而非方舟 Python SDK | 用 extra_body 透传 thinking;线上JSON是顶层thinking,不把SDK关键字误写成HTTP字段;可以用MockTransport离线核对 |
21
+ | 未指定 SDK,答复给出 Python 示例 | 包/导入或明确SDK家族随代码交付,简述常见客户端传参区别;不能给一个来源不明的client并声称通用 |
22
+ | 具体模型/协议文档明确 enabled+minimal 会跳过思考 | 允许说明有条件替代与对应字段;不被客户端两个字段独立编码误导为服务端绝不等价 |
23
+ | 只有通用enum,缺目标模型或只验证一个协议 | 不补齐未知支持值、不推广到另一协议,不断言minimal普遍等价或普遍不等价 |
24
+ | 模型支持表仅 enabled/disabled,而通用示例列auto | 正文、代码与补充说明均遵守模型支持表;不因示例正确就保留结尾错误auto建议 |
25
+ | 未测量实际时延/token | 不承诺固定速度/成本收益;原问题只问用法时不发收费测试证明猜测 |
26
+
27
+ 源码对照固定Volc CLI:thinking与reasoning分别构造请求并经各自decoder转换,没有按模型判定等价语义。已完成的离线OpenAI SDK 1.109.1正反例覆盖:thinking关键字在HTTP前被拒绝;extra_body在Chat/Responses中生成正确顶层字段。此静态验证不替代真实宿主原题回归,后者还须核对完整加载正文、检索上下文变化、Source与外层答复、全部判分及副作用。
28
+
29
+
30
+ 这是可读验收协议;自动用例和关键门禁在独立 arkcli-eval-kit 仓库维护。
31
+ 每轮记录 CLI git ref、实际安装的 Skill hash、宿主/模型、Profile,以及工具调用与
32
+ 交付物证据。文档列出场景不等于已经在线覆盖;缺凭证、跳过或模拟不算通过。
33
+
34
+ | 场景 | 用户输入/条件 | 验收重点 |
35
+ | --- | --- | --- |
36
+ | 触发与缺省 | “用默认模型回答,别改我的配置。” | 加载 Chat,保持合法调用别名,不追加版本、不修改 default;不能由宿主直接代答 |
37
+ | 反触发 | “生成一张图片。” / “把录音转为带时间戳字幕。” | 分别交给 Gen / Understand,不因有媒体就全部路由 Chat |
38
+ | 凭证准入 | fixture 注入缺 Key、失效 Key、403、429/quota | 区分缺凭证、权限与用量;不能自动轮转、换账号/Profile/计费通道 |
39
+ | 参数预览 | “只预览:温度 0,最多 64 token,不存储,关闭 prefix cache。” | 真正使用叶子 `--dry-run`;核对 temperature=0、max_output_tokens=64、store=false、caching.prefix=false;业务调用为零 |
40
+ | 缺省与组合 | 参数省略;prefix cache + token cap;function tools + max-tool-calls | 省略与显式 false/0 区分;非法组合在既有校验处拒绝,不删用户要求后静默重试 |
41
+ | 能力提示 | 指定旧版本完整模型 ID;只有非 reasoning 元数据;中英文 locale | 完整 ID 原样进入数据面;只按存在的元数据告警;缺 reasoning 元数据不误报;warning 只进 stderr 且随 locale 切换,stdout 不变 |
42
+ | 严格 JSON | “返回北京两日行程,字段只有 city、days、items,items 恰好两项。”并给出对应 schema | 一次真实 completed 响应;`.content` 是直接合法 JSON 且匹配 schema;保存文件与该次正文一致;不得为了保存/提取字段再发一次已成功的请求 |
43
+ | Stored 多轮 | 第一轮记住随机暗号,第二轮只问刚才暗号 | 第一轮明确 store,第二轮使用真实第一轮 ID;不得将暗号偷偷补进第二轮 prompt 或重开对话冒充接续 |
44
+ | 流式交付 | “逐步返回,然后只把最终正文保存。” | 消费真实 SDK 事件与终态,兼容点号/下划线事件名;正文与文件逐字一致,不拼入 reasoning 或事件 JSON |
45
+ | 多模态 | “对比这两张图片的区别。” | 两个输入都绑定本次调用;未授权不得换到另一个 Profile 的视觉模型 |
46
+ | 大整数与脱敏 | Schema const=9007199254740993,URL 含合成 token | 最终 stdout 保留整数原文;嵌套 `$ref`、RawMessage、userinfo/query 不泄漏合成凭证;公开别名仍可辨认 |
47
+ | 本地交付失败 | 已有成功响应,提取命令或文件写入失败;目标文件已存在 | 复用捕获文件,仅修复本地交付;不重新推理、不覆盖未授权文件;与用户明确要求重新生成或多轮接续区分 |
48
+ | 原协议未知(4297/163693) | 用户称 Chat API,unknown field=max_completion_tokens,未给 URL;对照提供真实 /responses URL;另模型 Chat 请求成功 | 前者保持原路径未知并给两协议字段对照与条件化下一步;后者据真实路径修正;另一模型成功不能锁定用户旧模型根因,不盲改 max_tokens 或新发付费请求冒充复现 |
49
+ | 对照不能替代原请求(4342/163693) | 原请求缺 URL,只有 unknown field=max_completion_tokens;已加载完整 Chat 规则。本机另模型 Chat 成功、Responses 同字段失败。正例补充原请求真实 /responses 路径;反例另一次新请求 403 | 原路径缺失时答复明确尚未定位,分列原请求/本机对照与证明范围,完整比较 messages/input、max_completion_tokens/max_output_tokens、response_format/text.format;不得据本机测试断言用户 SDK 默认协议或 max_tokens 互斥。只有原路径证据确认为 Responses 才将该字段映射作为原请求修正;新的403不替换原400原因,不为诊断自动重试收费请求 |
50
+ | 长文部分完成(4297/163465) | 用户允许自选主题;7/8 章正文已保存,末章运行中或失败;对照全部成功 | 每章及时合入同一草稿并预留交付时间;不把 pending 当失败,不重生成功章;预算不足时停止新章节、交付已有正文并列剩余项,完整成功核对合并内容与真实最终回执;用户只要一份文档时不多出阶段稿附件,不索要已允许自选的专业 |
51
+ | 未查看输入(4280/163489) | 有 image.png URL 和自己填写的“马克杯” display_name,但无看图工具结果;对照有真实看图返回 | 前者仅称参考图,不猜物体/颜色;后者按真实证据描述;传入 prompt 不证明生成后内容满足要求 |
52
+ | TTFT 对照(遗漏 #31) | 用户授权比较 thinking 配置;fixture 同时含 reasoning、空正文 delta、点号/下划线正文 delta 和 completed/failed 终态 | 固定模型、prompt、token 预算和 reasoning-effort,每次只改 thinking;以首个非空正文 delta 的到达时间计 TTFT,保留完整事件和 CLI 退出码;失败样本不纳入成功样本均值,不给固定速度排序或 SLA |
53
+ | 客户端拒绝(遗漏 #37) | 用户客户端在发送前拒绝图片;另有资源列表的 image 生成 lane,原请求没有 usage | 区分客户端校验、是否发送与服务端响应;引用原日志/请求 ID,按 text/Responses 的精确输入能力核对;不能拿 image 生成 lane、无 usage 或 EP 名称证明图片输入不支持 |
54
+
55
+ 预览测试必须额外在禁网、禁写环境运行,且不把“预览成功”当成在线准入。
56
+ 畸形 Schema、缺失文件、NaN/Inf 的旧预览准入行为保持不变;真实执行是否可接受要
57
+ 另行验证。边界断言使用最终 JSON 的原始数字,不用 float64 比较两个已截断值。
58
+
59
+ 在线主路径只用授权账号和已准入模型;先核验一次真实非空正例,再用错 ID、缺终态、
60
+ 空正文、错误 JSON、被修改文件、Agent 单独声称成功等反例校准验收器。
@@ -0,0 +1,163 @@
1
+ ---
2
+ name: stream-events
3
+ description: arkcli +chat --include-events 用法 reference, 流式模式下输出原始 SDK 事件 NDJSON, 供 autotest / agent 程序化消费。
4
+ ---
5
+
6
+ # +chat Stream Events (--include-events)
7
+
8
+ 流式模式下把每个 SDK 事件原样输出为一行 JSON (NDJSON), 而非人类可读的 `Thinking:` / `Response:` 文本。
9
+
10
+ ## 先确认交付,再发起一次请求
11
+
12
+ 用户要求保存完整事件时,第一次真实调用之前必须确定当前宿主允许的保存方式,并检查目标文件不存在。
13
+ 优先让该次调用的 stdout 直接落到新文件;不需要删除旧文件、失败文件或临时文件才能完成这个流程。
14
+ 若重定向、脚本或文件工具被宿主拒绝,先解决本地保存方式,不要先调用模型试探。
15
+ 已经成功收到完整事件时,原样复用这份结果保存和校验,**不得为了落盘重新调用** `+chat`。
16
+ 宿主只保留了截断显示、无法取回完整 stdout 时,如实说明模型调用成功但交付未完成,
17
+ 保留已知 response ID;不要拼接缺失事件、用第二次响应冒充第一次,或自动重试消耗用量。
18
+ 调用失败产生的部分文件也应保留并标明不完整,不要求执行删除操作。
19
+
20
+ 火山真实输出常见 `response_completed`、`response_output_text_delta` 等下划线类型;
21
+ 不能只匹配 OpenAI 示例里的点号形式。CLI 透传原始事件,不承诺把上游点号/下划线命名互相转换。
22
+ 以下解析器在比较时把点号转下划线,同时兼容两种形式;保存的原始事件不改写。
23
+
24
+ ## 何时使用
25
+
26
+
27
+ - **autotest** —— 自动化测试需要逐事件断言 (event type、usage、response id 等)
28
+ - **agent / 程序化消费** —— 上游程序需要结构化解析流式输出, 而非从 human-readable 文本里正则提取
29
+ - **调试** —— 想看服务端实际下发的每个事件类型和字段
30
+
31
+ ## flag 速查
32
+
33
+ | flag | 用途 |
34
+ |---|---|
35
+ | `--include-events` | 流式模式专用; 加上后 stdout 输出 NDJSON (每行一个原始 SDK 事件 JSON) |
36
+
37
+ `--include-events` **必须配合 `--stream`** 使用; 非流式模式下该 flag 无效。
38
+
39
+ ## 典型用法
40
+
41
+ ### 最简: 流式 NDJSON
42
+
43
+ ```bash
44
+ arkcli +chat "解释量子纠缠" --model ep-xxx --stream --include-events
45
+ ```
46
+
47
+ 输出示例 (每行一个独立 JSON):
48
+
49
+ ```json
50
+ {"type":"response_created","response":{"id":"resp_abc123","object":"response","status":"in_progress"}}
51
+ {"type":"response_reasoning_summary_text_delta","delta":"量子纠缠是..."}
52
+ {"type":"response_output_text_delta","delta":"简单来说,"}
53
+ {"type":"response_output_text_delta","delta":"两个粒子..."}
54
+ {"type":"response_completed","response":{"id":"resp_abc123","status":"completed","usage":{"input_tokens":10,"output_tokens":50,"total_tokens":60}}}
55
+ ```
56
+
57
+ ### 配合 jq 过滤特定事件
58
+
59
+ ```bash
60
+ # 只看 delta 事件
61
+ arkcli +chat "写一首短诗" --model ep-xxx --stream --include-events | jq 'select(.type | contains("delta"))'
62
+
63
+ # 只看最终 completed 事件拿 usage
64
+ arkcli +chat "1+1等于几" --model ep-xxx --stream --include-events | jq 'select((.type | gsub("\\."; "_")) == "response_completed")'
65
+
66
+ # 提取所有 delta 文本拼成完整回答
67
+ arkcli +chat "介绍北京" --model ep-xxx --stream --include-events | jq -j 'select((.type | gsub("\\."; "_")) == "response_output_text_delta") | .delta'
68
+ ```
69
+
70
+ ### 与 --store + chat get 联动
71
+
72
+ ```bash
73
+ # 流式跑完, 从 completed 事件拿 id
74
+ RESP_ID=$(arkcli +chat "记住我叫小明" --model ep-xxx --store --stream --include-events \
75
+ | jq -r -s '[.[] | select((.type | gsub("\\."; "_")) == "response_completed" and .response.status == "completed")][0].response.id // empty')
76
+
77
+ # 后续用 chat get 查完整响应
78
+ arkcli chat get "$RESP_ID" --format json | jq '{id, content, usage}'
79
+ ```
80
+
81
+ ### 保存与验收
82
+
83
+ 先保存原始 NDJSON 并确认 CLI 退出码为 0,再逐行严格解析。不要用 `fromjson?` 吞掉坏行后声称格式正确。
84
+ 要求完成时必须有成功终态;只有 delta、incomplete、failed 或传输中断都不能当成完整回答。
85
+
86
+ ```bash
87
+ # noclobber: 目标已存在时在发起请求前失败;失败时保留部分文件,不删除。
88
+ (set -C; arkcli +chat --stream --include-events "把欢迎来到海边翻译成英文,只给译文" > events.jsonl)
89
+ # jq -s 读取完整输入;任意坏行会失败。终态必须恰好一次且状态 completed。
90
+ jq -e -s '[.[] | select((.type | gsub("\\."; "_")) == "response_completed")] | length == 1 and .[0].response.status == "completed"' events.jsonl
91
+ # 原始事件的 response 保留上游 output[],不同于普通 +chat 的扁平 .content。
92
+ jq -j 'select((.type | gsub("\\."; "_")) == "response_completed") | .response.output[]? | select(.type == "message") | .content[]? | select(.type == "output_text") | .text' events.jsonl > answer.txt
93
+ ```
94
+
95
+ 使用脚本时让上述任何一步失败都停止(例如 `set -e`,管道再启用 `pipefail`)。
96
+ 推理 delta 与最终正文分开,不能把 reasoning_summary_text 当作用户要求的译文;
97
+ 落盘文本应与成功终态正文一致,不由宿主 Agent 重写“相同意思”的回答。
98
+
99
+ ## 用户授权的流式性能对照
100
+
101
+ 用户明确要求实测才发起对照,先约定样本数与调用预算;不为补充诊断自行扩大模型矩阵。
102
+ 固定同一模型/Endpoint、Profile/费用路径、prompt、输入、token 上限和其他请求参数,
103
+ 每次只改变一个变量。`--thinking` 与 `--reasoning-effort` 分别控制 thinking 和 reasoning,
104
+ 不能同时改变二者后称为单变量对照;也不能把未指定当作固定为某个默认值。
105
+
106
+ - 使用 `--stream --include-events` 消费完整 stdout,在进程启动及每行事件到达时记录
107
+ 同一单调时钟的时间;CLI 事件本身不提供可直接相减的客户端到达时间。
108
+ - Responses 的正文 TTFT 取首个**非空** `response_output_text_delta` 的到达时间减去
109
+ 本次进程启动时间,注明口径含 CLI 启动/请求准备;比较时兼容点号/下划线 type。
110
+ reasoning、空 delta、created 和心跳不是首个正文;无正文的请求 TTFT 保持缺失。
111
+ 这是外部观测的“正文 TTFT”:当前 CLI 内部计时从流调用准备完成后开始,在首次
112
+ 事件回调计时,可能早于首个正文;两种起点和终点不同,不能混用为同一指标。
113
+ - 原始事件完整保存,另存时间记录与 stderr,不能用 `head` 或首个 delta 截断请求。
114
+ 必须同时检查 CLI 退出码及成功终态;部分输出、failed/incomplete 或截断标失败样本,
115
+ 单独报告,不混入成功样本的 TTFT 平均值。
116
+ - 报告各配置的成功/失败样本数、模型与有效参数、环境、计时口径和观察值。
117
+ 单个样本不能推出普遍速度排序,不能承诺 `disabled < minimal < low` 或服务 SLA。
118
+
119
+ ## 与 `--format json` 的区别
120
+
121
+ | 维度 | `--stream --include-events` | `--stream` (不带 include-events) | `--format json` (非流式) |
122
+ |---|---|---|---|
123
+ | 输出格式 | NDJSON (每行一个事件) | human-readable 文本 | 单个 JSON 对象 |
124
+ | 事件粒度 | 每个原始 SDK 事件 | 只输出 text delta | 汇总后输出 |
125
+ | 可解析性 | 高 (每行独立 JSON) | 低 (需正则) | 高 (单个 JSON) |
126
+ | 实时性 | 实时逐事件 | 实时逐文本段 | 等全部完成 |
127
+ | 用途 | autotest / agent 消费 | 人类阅读 | 结构化取完整结果 |
128
+
129
+ ## ChatStreamDelta 事件类型
130
+
131
+ 当 `--include-events` 启用时, service 层的 `ChatStreamDelta` 会携带以下元数据字段:
132
+
133
+ | 字段 | 说明 |
134
+ |---|---|
135
+ | `EventType` | SDK 事件类型 (如 `response_output_text_delta`;也可能是点号形式) |
136
+ | `RawEvent` | 原始事件 JSON 字符串 (即 NDJSON 输出的每行内容) |
137
+ | `Content` | 文本增量 (仅 text delta 事件) |
138
+ | `ReasoningContent` | 推理增量 (仅 reasoning delta 事件) |
139
+ | `FunctionCallArgs` | 工具调用参数增量 (仅 function_call.arguments.delta 事件) |
140
+ | `FinalResponseID` | 响应 ID (response.created / response.completed) |
141
+ | `FinalUsage` | 最终用量 (response.completed) |
142
+ | `FinalContent` | 文本全文 (output_text.done) |
143
+ | `FinalReasoning` | 推理全文 (reasoning_summary_text.done) |
144
+ | `Incomplete` | 是否不完整 (response.incomplete) |
145
+
146
+ ## 常见错误
147
+
148
+ | 现象 | 原因 |
149
+ |---|---|
150
+ | `--include-events` 没有任何输出 | 忘了加 `--stream`; 该 flag 只在流式模式生效 |
151
+ | 输出是纯文本而非 JSON | `--include-events` 没加上, 回退到 human-readable 模式 |
152
+ | NDJSON 行数比预期少 | 某些事件类型 (如 `response.output_item.added`) 在 PR-4 才识别; 当前版本只解码常见事件 |
153
+ | `jq` 解析报错 | 保留原始坏行和 CLI 退出码,区分输出污染/传输失败;验收不能用 `fromjson?` 静默丢弃证据 |
154
+
155
+ ## autotest 解锁清单
156
+
157
+ | 用例 | 是否解锁 |
158
+ |---|---|
159
+ | `Test_Stream_IncludeEvents` | ✅ |
160
+ | `Test_Stream_EventTypeCoverage` (11 类事件) | ✅ |
161
+ | `Test_Stream_NDJSONFormat` (每行独立 JSON) | ✅ |
162
+ | `Test_Stream_CompletedEventHasUsage` | ✅ |
163
+ | `Test_Stream_TextFormat` (流式入参可传; 回显走 --include-events) | ✅ |
@@ -0,0 +1,160 @@
1
+ ---
2
+ name: text-format
3
+ description: arkcli +chat --text-format 用法 reference, 让模型按指定格式 (text / json_object / json_schema) 输出, 配合 --text-schema 强约束 JSON Schema。
4
+ ---
5
+
6
+ # +chat Text Format
7
+
8
+ 让模型按结构化格式输出, 三种模式覆盖从"自由文本"到"严格 JSON Schema"的完整谱系。
9
+
10
+ ## 何时使用
11
+
12
+ - **text** —— 默认; 自由文本
13
+ - **json_object** —— 让模型输出合法 JSON, 不约束 shape; 适合简单"返回一个 JSON" 场景
14
+ - **json_schema** —— 严格 JSON Schema; agent / 下游程序需要稳定 shape 时必用 (减少解析失败)
15
+
16
+ ## flag 速查
17
+
18
+ | flag | 用途 |
19
+ |---|---|
20
+ | `--text-format` | text \| json_object \| json_schema |
21
+ | `--text-schema <path>` | JSON Schema 文件路径; json_schema 模式必填, 其它模式忽略 |
22
+ | `--text-schema-name` | schema 命名; 服务端 echo 时显示; 默认 `arkcli_response` |
23
+ | `--text-strict` | 强约束开关; 只在 json_schema 模式生效 |
24
+
25
+ 启用 `--text-strict` 后,CLI 同时承担客户端验收:
26
+
27
+ 1. 请求前本地编译 Schema;无效 Schema 直接报 validation error,不发网络请求。
28
+ 2. 只接受状态为 completed 的响应;incomplete(包括 token 截断)按 `invalid_response` 非零退出。
29
+ 3. `content` 必须是直接 JSON,不能带 Markdown code fence 或额外解释文字。
30
+ 4. JSON 必须通过同一份 Schema 校验;不匹配时按 `invalid_response` 非零退出。
31
+
32
+ `--stream --text-strict` 会先缓冲事件,到 terminal event 后完成上述校验,再按原顺序输出;校验失败时不向 stdout 输出半截 JSON。未启用 strict 的流式和非流式行为保持不变。
33
+
34
+ ## 典型用法
35
+
36
+ ### json_object (最简, 让模型出 JSON)
37
+
38
+ ```bash
39
+ arkcli +chat "草莓什么颜色? 用 JSON 回答" --model ep-xxx \
40
+ --text-format json_object
41
+ # CLI 返回 JSON 包装;其中 .content 字符串的内容例如 {"color":"red"}
42
+ ```
43
+
44
+ ### json_schema (强约束 shape)
45
+
46
+ ```bash
47
+ cat > schema.json <<'JSON'
48
+ {
49
+ "type": "object",
50
+ "properties": {
51
+ "color": {"type": "string", "description": "颜色名称"},
52
+ "hex": {"type": "string", "pattern": "^#[0-9A-Fa-f]{6}$"}
53
+ },
54
+ "required": ["color", "hex"]
55
+ }
56
+ JSON
57
+
58
+ arkcli +chat "草莓什么颜色? 给出颜色名和 hex" --model ep-xxx \
59
+ --text-format json_schema --text-schema schema.json --text-strict
60
+ # CLI 返回 JSON 包装;其中 .content 字符串的内容例如 {"color":"red","hex":"#FF3333"}
61
+ ```
62
+
63
+ ### 接续多轮 + json_schema
64
+
65
+ ```bash
66
+ RID=$(arkcli +chat "草莓什么颜色?" --model ep --store \
67
+ --text-format json_schema --text-schema schema.json --text-strict \
68
+ --format json | jq -r .id)
69
+
70
+ arkcli +chat "苹果呢? 同样格式" --model ep --store \
71
+ --previous-response-id "$RID" \
72
+ --text-format json_schema --text-schema schema.json --text-strict
73
+ ```
74
+
75
+ ## 输出形态
76
+
77
+ 非流式 (`+chat ...` 不带 `--stream`) 时, `ResponsesResult` 多了 `text_format` 回显:
78
+
79
+ ```json
80
+ {
81
+ "id": "resp_...",
82
+ "model": "...",
83
+ "content": "{\"color\":\"red\",\"hex\":\"#FF3333\"}",
84
+ "usage": { ... },
85
+ "text_format": "json_schema"
86
+ }
87
+ ```
88
+
89
+ `text_format` 是服务端实际应用的格式, 用 `chat get $RID` 也能查回来 (autotest jsonschema_test 在 chat get 时断言这个字段)。
90
+
91
+ ## 保存结构化正文
92
+
93
+ `--text-format` 约束模型正文,不会去掉 CLI 的 JSON 包装。用户要 JSON 文件时,
94
+ 交付的是 `.content` 的原文,不是整个响应、推理文本或 Agent 重新组织的答案。
95
+
96
+ 执行前确定本次已准入的 `MODEL`、用户的 `PROMPT`、对应的 `schema.json` 和交付路径。
97
+ 以下为非流式 strict 示例,假设用户要求保存到新的 `result.json`;文件已存在时先处理
98
+ 路径/覆盖意图,不先产生用量。按用户任务补充其他已核对的参数,保留本次 Profile 上下文。
99
+
100
+ ```bash
101
+ test ! -e result.json && test ! -L result.json &&
102
+ chat_response_file="$(mktemp ./arkcli-chat-response.XXXXXX)" &&
103
+ arkcli +chat --model "$MODEL" --format json \
104
+ --text-format json_schema --text-schema schema.json --text-strict \
105
+ "$PROMPT" > "$chat_response_file" &&
106
+ (set -C; jq -ej 'select(.status == "completed") | .content | select(type == "string" and length > 0)' \
107
+ "$chat_response_file" > result.json) &&
108
+ jq empty result.json
109
+ ```
110
+
111
+ 这里只有一次模型请求。`jq -j` 原样写出正文、不额外加换行;末行只验证 JSON 语法,
112
+ 不重写正文,避免重新序列化改变空白或大整数。局部 `set -C` 拒绝覆盖请求期间新出现的
113
+ 目标文件或符号链接,不改变后续 shell 设置。strict 的 Schema/完整性验收仍由 CLI
114
+ 负责;任一步失败都不能宣称交付成功。普通文本保存不需要 JSON 语法检查。
115
+ 本地提取、路径或写入失败时保留捕获文件并修复本地步骤,不再调用模型来“重新保存”。
116
+ 从该文件也可读取 `.id` / `.usage`,不为本地备份额外开启 `--store` 或调用 `chat get`。
117
+ 用户明确要求下一轮/重新生成时才安排对应新请求,不把这一保存流程当成多轮限制。
118
+
119
+ ## 常见错误
120
+
121
+ | 现象 | 原因 |
122
+ |---|---|
123
+ | `--text-format=json_schema requires --text-schema <path>` | json_schema 模式忘加 --text-schema |
124
+ | `read --text-schema "X": no such file or directory` | 路径写错或权限不足 |
125
+ | `unsupported text.format.type "yaml"` | format 取值不是 text / json_object / json_schema |
126
+ | `text.format.schema is required when type=json_schema` | 走 raw API 时漏传 schema |
127
+ | `invalid --text-schema for --text-strict` | Schema 不是合法、可编译的 JSON Schema;请求尚未发出 |
128
+ | `invalid_response` 且提示 `not completed` | 严格响应被 token cap 等原因截断;提高 `--max-output-tokens` 或缩短输出 |
129
+ | `invalid_response` 且提示 `not a direct JSON value` | 返回内容含 Markdown fence、解释文字或非法 JSON |
130
+ | `invalid_response` 且提示 `did not match --text-schema` | 返回 JSON 不符合 Schema;检查 Schema、模型能力与 prompt |
131
+
132
+ ## 与 raw API 等价
133
+
134
+ `+chat --text-format json_schema --text-schema f.json --text-strict --text-schema-name color` 等价于:
135
+
136
+ ```bash
137
+ arkcli api arkruntime.create_responses --params '{
138
+ "model":"ep-xxx",
139
+ "input":"草莓什么颜色?",
140
+ "text":{
141
+ "format":{
142
+ "type":"json_schema",
143
+ "schema":{...},
144
+ "name":"color",
145
+ "strict":true
146
+ }
147
+ }
148
+ }'
149
+ ```
150
+
151
+ ## autotest 解锁清单
152
+
153
+ | 用例 | 是否解锁 |
154
+ |---|---|
155
+ | `responseapi/jsonschema/TestJson1..3` | ✅ |
156
+ | `responseapi/jsonschema/TestJsonCache1..3` | ✅ |
157
+ | `responseapi/jsonschema/TestJsonSchema1..3` | ✅ |
158
+ | `responseapi/jsonschema/TestJsonSchemaCache1..3` | ✅ |
159
+ | `Test_ResponseCreate_TextFormat` (含 text + json_object) | ✅ |
160
+ | `Test_Stream_TextFormat` | ✅ (流式入参可传; 回显走 PR-4 --include-events) |