@delta-infra/cli 1.0.42 → 1.0.44
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.
package/checksums.txt
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
2585de0931a11878a5015aaf4d7a1abe8569407e4783233bb78a608a084730f4 delta-cli-darwin-amd64.tar.gz
|
|
2
|
+
0f1a89ceff2028dac941ce6d7c19713fefd8618af2cb06cac61e06f919e733e2 delta-cli-darwin-arm64.tar.gz
|
|
3
|
+
4f6a54889fd965b84b16b565008de899d7b49dbe91b250f06656b3e73b354695 delta-cli-linux-amd64.tar.gz
|
|
4
|
+
2dda53df2e196669d823124c90e550e892f45ad5a39a7150bb06dbbd94b53fe6 delta-cli-linux-arm64.tar.gz
|
|
5
|
+
2bb8f778cdb1683e9d2998a66e4a088ce2e29a2a97d98d62e23bc0af9ff101df delta-cli-windows-amd64.zip
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: delta-sandbox
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.2.0
|
|
4
4
|
description: "在 Delta Sandbox Linux 容器中运行任意命令或脚本。适用于训练、推理、编译、数据处理等任意需要 sandbox 的计算任务,支持 Python / Node.js / Go / Java / Rust 等语言。所有任务通用同一套输出约定:命令在 stdout 末尾输出结构化 JSON,skill 提取为本地 result.json 的 summary,并生成一行 RESULT: 结论。Planner 调用本 skill 时,请在 plan step 的 required_outputs 中声明 [{kind: 'file', extensions: ['.json']}]。请求中用中性动词(运行/执行)描述命令,只有真的会落盘文件时,才使用创建/写入/保存等动词并带上扩展名。认证/配置/权限错误转 delta-shared。"
|
|
5
5
|
metadata:
|
|
6
6
|
requires:
|
|
@@ -33,7 +33,7 @@ metadata:
|
|
|
33
33
|
5. **同步任务一条命令内完成,后台任务可跨轮次**:
|
|
34
34
|
- 同步模式(`sandbox run`):从 `create` 到 `kill` 的完整生命周期必须在同一次执行中完成。不允许跨任务保留。
|
|
35
35
|
- 后台模式(`sandbox run-bg`):允许在当前执行中将 `sandbox_id` 和 `execution_id` 报告给用户,后续轮次通过 `sandbox status` + `sandbox logs` 获取结果。任务完成后仍需 `sandbox kill`。
|
|
36
|
-
6. **禁止重复创建**:同一次任务中只允许存在一个活跃 sandbox。若命令失败需要重试,优先复用已创建的 `sandbox_id`;若确实需要重新创建,必须先 `sandbox kill <旧_sandbox_id>`,确认旧实例销毁后再执行新的 `sandbox create`。可用 `delta-cli sandbox list` 查询当前用户的活跃 sandbox
|
|
36
|
+
6. **禁止重复创建**:同一次任务中只允许存在一个活跃 sandbox。若命令失败需要重试,优先复用已创建的 `sandbox_id`;若确实需要重新创建,必须先 `sandbox kill <旧_sandbox_id>`,确认旧实例销毁后再执行新的 `sandbox create`。可用 `delta-cli sandbox list` 查询当前用户的活跃 sandbox 来**清理残留**(上轮任务异常中断遗留的 sandbox),但 **禁止** 用 list 来绕过“同一次任务只保留一个 sandbox”的规则。
|
|
37
37
|
|
|
38
38
|
7. **长任务必须后台执行**:预计执行时间超过 60 秒的任务(例如下载模型、训练、微调、长推理、大规模数据处理),**必须**使用 `delta-cli sandbox run-bg <id> --command "..." --timeout <秒>` 提交为后台任务,禁止使用同步的 `sandbox run`。
|
|
39
39
|
|
|
@@ -85,6 +85,11 @@ metadata:
|
|
|
85
85
|
3. 已执行 `sandbox kill <id>` 销毁 sandbox;
|
|
86
86
|
4. `final_response` 只有一行 `RESULT: <result_summary>`。
|
|
87
87
|
|
|
88
|
+
14. **避免冗余检查与验证**
|
|
89
|
+
- 如果 `skill_request` 或用户请求已经明确指定了镜像与资源,**不要**在 `sandbox create` 前先调用 `sandbox providers` 或 `sandbox images`。
|
|
90
|
+
- 文件写入 sandbox 后,只需要 `sandbox stat`(可选)确认 size 正常即可。**禁止**用 `sandbox ls` + `sandbox read` 把刚写入的文件读回宿主再验证内容;这会产生一次无意义的往返。
|
|
91
|
+
- 不要在 `sandbox create` 成功后反复调用 `sandbox status` 轮询;create 返回时 sandbox 已就绪。
|
|
92
|
+
|
|
88
93
|
## 请求措辞约定
|
|
89
94
|
|
|
90
95
|
为降低被 host 的 Phase-10B 文件扩展名校验误判的概率,构造 `skill_request` 时遵守:
|
|
@@ -159,10 +164,12 @@ required_outputs:
|
|
|
159
164
|
|
|
160
165
|
## 完整生命周期
|
|
161
166
|
|
|
162
|
-
1. **选择 Provider
|
|
163
|
-
-
|
|
164
|
-
-
|
|
165
|
-
|
|
167
|
+
1. **选择 Provider 和镜像(按需)**:
|
|
168
|
+
- 如果请求里已经明确指定了镜像(例如 `--image image.yangtzeailab.com/opensandbox/pytorch-cuda13`)和资源(cpu/memory/gpu),**直接跳到步骤 2 创建 sandbox**,不要再调 `sandbox providers` / `sandbox images` / `sandbox recommend`。
|
|
169
|
+
- 只有在用户要求“推荐一个配置”或需要查询可用镜像/Provider 时,才调用:
|
|
170
|
+
- `delta-cli sandbox providers` — 可用的计算后端
|
|
171
|
+
- `delta-cli sandbox images` — 服务端支持的镜像列表
|
|
172
|
+
- `delta-cli sandbox recommend --cpu N --memory XGi [--gpu N]` — 资源配置推荐
|
|
166
173
|
2. **创建**:`delta-cli sandbox create --image <img> --cpu 4 --memory 16Gi --gpu 1 --gpu-mem 8000 --max-life 120`。**返回的 JSON 信封中是 `data.sandbox_id`,不是 `data.id`;后续所有命令必须使用这个真实的 `sandbox_id`。**(创建后 sandbox 立即可用,无需额外连接)。**同一次任务若已有 `sandbox_id`,禁止再次 create,必须优先复用。**
|
|
167
174
|
- --max-life 指定 sandbox 最大存活时间(分钟),默认 30。长任务请调高,确保 sandbox 在命令执行期间不被回收。
|
|
168
175
|
- 这是 `sandbox create` 支持的完整资源参数集合,不存在其它“更正确”的资源 flag,不要发明不存在的参数。
|
|
@@ -173,7 +180,7 @@ required_outputs:
|
|
|
173
180
|
- **上传目录**:`sandbox upload <id> --source <本地目录> --target <沙箱路径>` — CLI 将本地目录打包为 tar.gz,通过 multipart/form-data 上传,服务端自动解压到 target 目录。返回每个文件的路径、大小、模式。上传后 CLI 自动对比本地和远程文件清单做完整性校验(大小不匹配、多余文件等会告警)。
|
|
174
181
|
- **注意**:`--source` 是**本地目录路径**,`--target` 是**沙箱内的目标目录**,target 目录不存在会自动创建。
|
|
175
182
|
- 支持嵌套目录,空目录也会被创建。
|
|
176
|
-
|
|
183
|
+
- **写后验证(可选)**:`sandbox stat <id> --path <path>` 确认文件存在且 size 符合预期即可。**不要**用 `sandbox ls` + `sandbox read` 把刚写入的文件读回宿主再逐字对比;无异常时不需要读回。
|
|
177
184
|
4. **运行命令**:
|
|
178
185
|
- **短任务(预计 ≤ 60 秒)**:`delta-cli sandbox run <id> --command "<命令>" --timeout <秒>` 同步执行,返回 `stderr` / `exit_code` / `result_file`,完整 `stdout` 在结果文件中,**不要**再调用 `sandbox logs`。可通过 `--result-file <路径>` 自定义结果文件路径;默认值为 `/tmp/delta-result-{execution_id}.json`。根据镜像中的运行时构造命令,常见示例:
|
|
179
186
|
- Python:`python /workspace/train.py`
|
|
@@ -201,18 +208,13 @@ required_outputs:
|
|
|
201
208
|
env = json.load(open("/tmp/_delta_result_envelope.json", encoding="utf-8"))
|
|
202
209
|
raw = json.loads(env["data"]["content"])
|
|
203
210
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
"finished_at": raw.get("finished_at"),
|
|
212
|
-
"summary": {},
|
|
213
|
-
"error": raw.get("error"),
|
|
214
|
-
"stderr_preview": (raw.get("stderr") or "")[:500],
|
|
215
|
-
}
|
|
211
|
+
# 精简到用户关心的极简字段,避免 host read_file 预览截断
|
|
212
|
+
concise = {
|
|
213
|
+
"exit_code": raw.get("exit_code"),
|
|
214
|
+
"finished": raw.get("finished"),
|
|
215
|
+
"summary": {},
|
|
216
|
+
"error": raw.get("error"),
|
|
217
|
+
}
|
|
216
218
|
|
|
217
219
|
# 优先提取 stdout 末尾的独立 JSON 对象作为 summary
|
|
218
220
|
stdout = raw.get("stdout", "")
|
|
@@ -260,28 +262,25 @@ required_outputs:
|
|
|
260
262
|
|
|
261
263
|
这样 SKILL 可以用同一套代码把它提取到 `result.json` 的 `summary` 字段,再生成 `RESULT:` 行。
|
|
262
264
|
|
|
265
|
+
- **禁止**在 stdout 中打印 `FINAL_ANSWER: ...` 这类冗余标记行;多余的标记会让 Runner 把普通文本误认为结果字段。
|
|
266
|
+
- `summary` 中**不要**使用 `final_answer` 这类与 schema 重复的关键字。统一用语义字段表示结果,例如推理任务用 `generated_text` / `output` / `result`,训练任务用 `final_loss` / `final_accuracy`,数据处理用 `output_file` / `output_rows`。
|
|
267
|
+
|
|
263
268
|
### 本地 `result.json` 通用 Schema
|
|
264
269
|
|
|
265
270
|
```json
|
|
266
271
|
{
|
|
267
|
-
"execution_id": "...",
|
|
268
|
-
"sandbox_id": "...",
|
|
269
|
-
"command": "...",
|
|
270
272
|
"exit_code": 0,
|
|
271
273
|
"finished": true,
|
|
272
|
-
"result_file": "/tmp/delta-result-xxx.json",
|
|
273
|
-
"finished_at": "...",
|
|
274
274
|
"summary": {},
|
|
275
275
|
"result_summary": "exit_code=0, status=ok, torch_version=..., ...",
|
|
276
|
-
"error": null
|
|
277
|
-
"stderr_preview": ""
|
|
276
|
+
"error": null
|
|
278
277
|
}
|
|
279
278
|
```
|
|
280
279
|
|
|
281
280
|
关键字段:
|
|
282
281
|
- `summary`: 命令输出的结构化结果对象。
|
|
283
282
|
- `result_summary`: **一行字符串**,与最终回答的 `RESULT:` 行内容一致,方便 Runner 直接读取。
|
|
284
|
-
- `
|
|
283
|
+
- `error`: 命令失败时的错误信息;成功时一般为 `null`。
|
|
285
284
|
- **不要把完整 `stdout` 塞进来**。完整日志仍保留在 sandbox 的 `result_file` 中。
|
|
286
285
|
|
|
287
286
|
## 输出阅读与最终回答格式
|
|
@@ -308,6 +307,15 @@ required_outputs:
|
|
|
308
307
|
- 错误:在 `RESULT:` 后追加 `Let me know if you need anything else.` 等多余句子。
|
|
309
308
|
- **规则**:`final_response` 里出现的字符,必须是 `RESULT:` 及其后的内容,不允许其它任何自然语言。
|
|
310
309
|
6. **不要依赖或被截断的 `stdout`/`stderr` 字段**,关键结论必须来自 `result.json` 的 `summary` / `result_summary`。
|
|
310
|
+
7. **`sandbox kill` 成功后不再调用任何工具**。kill 命令返回 `{ok:true}` 即表示任务已收尾,下一回合直接输出一行 `RESULT: <result_summary>`。禁止再调 `bash`/`read_file`/`ls` 等工具,也不要以 "Need final answer exactly..."、"Sandbox killed." 等独白开头。
|
|
311
|
+
|
|
312
|
+
## 宿主 / Planner 调用提示
|
|
313
|
+
|
|
314
|
+
本 skill 设计成“结论自包含”:执行结束后,**`result.json` 的 `result_summary` 与 `final_response` 已经包含最终面向用户的结论**。因此:
|
|
315
|
+
|
|
316
|
+
- **Planner** 调用本 skill 的 plan step 时,`required_outputs` 必须声明 `.json`(见上方“请求措辞约定”)。
|
|
317
|
+
- **宿主(host / Runner / finalize 阶段)** 在收到 skill 返回后,应直接把 `final_response` 或 `result.json` 里的 `result_summary` 作为最终答案,**不要再让大模型去读取 result.json、验证文件内容或重新推理**。
|
|
318
|
+
- 如果宿主担心内容不可信,可以读取 `result.json` 核对,但**最终输出仍必须是 `RESULT:` 开头的一行**,不允许把“我需要先读取文件验证”、“Wait, I don't have...”等思考过程暴露给用户。
|
|
311
319
|
|
|
312
320
|
## 常见恢复
|
|
313
321
|
|
|
@@ -24,6 +24,8 @@ required_outputs:
|
|
|
24
24
|
|
|
25
25
|
SKILL 会把它提取为 `result.json` 的 `summary`,并生成 `result_summary` 与最终 `RESULT:` 行。
|
|
26
26
|
|
|
27
|
+
**不要**再输出 `FINAL_ANSWER: ...` 这样的标记行,也不要在 JSON 里使用 `final_answer` 字段。summary 里的语义字段(如 `output`、`result`、`generated_text`、`final_accuracy`)已经足够表达结果。
|
|
28
|
+
|
|
27
29
|
不同任务的关键字段示例:
|
|
28
30
|
|
|
29
31
|
- **CUDA 检查**:`status`, `torch_version`, `cuda_available`, `device_name`
|
|
@@ -103,12 +105,12 @@ SKILL 会把它提取为 `result.json` 的 `summary`,并生成 `result_summary
|
|
|
103
105
|
|
|
104
106
|
说明:
|
|
105
107
|
|
|
106
|
-
- 请求里不要贴完整 Python 代码,也不要指定宿主文件路径(如 `@ROOT/inference.py
|
|
108
|
+
- 请求里不要贴完整 Python 代码,也不要指定宿主文件路径(如 `@ROOT/inference.py`、本地绝对路径等),更不要要求脚本输出 `FINAL_ANSWER:` 标记行。脚本内容、模型下载、执行路径都由 skill 内部通过 `delta-cli sandbox write` 写入 sandbox 后运行。
|
|
107
109
|
- 推荐让脚本在 `stdout` 末尾打印一行结构化 JSON,例如:
|
|
108
110
|
```json
|
|
109
|
-
{"status":"ok","cuda_available":true,"device":"cuda","model":"Qwen/Qwen2.5-0.5B-Instruct","input":"100+10","
|
|
111
|
+
{"status":"ok","cuda_available":true,"device":"cuda","model":"Qwen/Qwen2.5-0.5B-Instruct","input":"100+10","generated_text":"110"}
|
|
110
112
|
```
|
|
111
|
-
- skill 会把它提取为 `result.json` 的 `summary`,最终输出 `RESULT: exit_code=0, status=ok, cuda_available=True,
|
|
113
|
+
- skill 会把它提取为 `result.json` 的 `summary`,最终输出 `RESULT: exit_code=0, status=ok, cuda_available=True, generated_text=110, ...`。
|
|
112
114
|
|
|
113
115
|
## 注意事项
|
|
114
116
|
|
|
@@ -122,6 +124,6 @@ SKILL 会把它提取为 `result.json` 的 `summary`,并生成 `result_summary
|
|
|
122
124
|
|
|
123
125
|
- 本地 `result.json` 是一份**精简摘要**,用于 host deliverable 校验,不是完整日志存档。
|
|
124
126
|
- 必须包含 `result_summary` 字段,内容与最终 `RESULT:` 行一致,方便 Runner 直接读取结论。
|
|
125
|
-
- 只写入关键字段(`
|
|
127
|
+
- 只写入关键字段(`exit_code`、`finished`、`summary`、`result_summary`、`error`)。**不要**额外添加 `final_answer` 等字段。
|
|
126
128
|
- 不要把完整原始 `stdout` 塞进 `result.json`,否则 host 的 `read_file` 工具预览时会截断,Runner 可能误以为文件被截断。
|
|
127
129
|
- 完整原始输出保留在 sandbox 的 `result_file` 中,需要时再 `sandbox read`。
|