@lingjingai/scriptctl 0.63.2 → 0.63.4
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/README.md +1 -1
- package/changes/0.63.3.md +5 -0
- package/changes/0.63.4.md +5 -0
- package/dist/bin.js +166 -19
- package/dist/bin.js.map +3 -3
- package/dist/llm/router.d.ts +3 -2
- package/dist/llm/router.js +144 -22
- package/dist/llm/router.js.map +1 -1
- package/package.json +1 -1
- package/skills/scriptctl/SKILL.md +6 -0
- package/skills/scriptctl/references/ingest-workflow.md +4 -3
- package/dist/cli/register-batch.d.ts +0 -3
- package/dist/cli/register-batch.js +0 -28
- package/dist/cli/register-batch.js.map +0 -1
- package/dist/cli/register-edits.d.ts +0 -4
- package/dist/cli/register-edits.js +0 -234
- package/dist/cli/register-edits.js.map +0 -1
- package/dist/cli/register-query.d.ts +0 -4
- package/dist/cli/register-query.js +0 -95
- package/dist/cli/register-query.js.map +0 -1
- package/dist/infra/llm/doubao-video-model.d.ts +0 -56
- package/dist/infra/llm/doubao-video-model.js +0 -231
- package/dist/infra/llm/doubao-video-model.js.map +0 -1
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
// Doubao / Volcengine Ark video-understanding adapter — the LAST-resort fallback
|
|
2
|
-
// after the Gemini model chain is exhausted (§10.5). Ark is a different protocol:
|
|
3
|
-
// the Files API sets sampling fps at UPLOAD time (preprocess_configs[video][fps]),
|
|
4
|
-
// then the Responses API references the file by id. So this adapter can't fit the
|
|
5
|
-
// upload/generate split of VideoUnderstandingPort cleanly — it exposes one
|
|
6
|
-
// self-contained run(): upload the local transcode → poll ACTIVE → respond →
|
|
7
|
-
// best-effort delete. Transport only; it never builds business prompts. HTTP is
|
|
8
|
-
// reached through a narrow structural client so tests inject a fake.
|
|
9
|
-
import * as fs from "node:fs";
|
|
10
|
-
import * as path from "node:path";
|
|
11
|
-
import { File } from "node:buffer";
|
|
12
|
-
import { Agent, fetch, FormData } from "undici";
|
|
13
|
-
import { LlmTransportError, } from "../../llm/types.js";
|
|
14
|
-
import { httpError, httpStatusOf, networkError } from "./failure-mapping.js";
|
|
15
|
-
import { addTokenUsage, withTransientRetry } from "./retry.js";
|
|
16
|
-
const POLL_INTERVAL_MS = 2000;
|
|
17
|
-
function delay(ms) {
|
|
18
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
19
|
-
}
|
|
20
|
-
// Map an SDK/HTTP error to a transport error with the shared retry policy: retry
|
|
21
|
-
// only transient network/timeout/408/429/5xx.
|
|
22
|
-
function toArkError(error, signal, what, model) {
|
|
23
|
-
if (error instanceof LlmTransportError)
|
|
24
|
-
return error;
|
|
25
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
26
|
-
const status = httpStatusOf(error);
|
|
27
|
-
const context = { provider: "doubao", model, operation: what };
|
|
28
|
-
if (status !== null) {
|
|
29
|
-
return httpError(status, `Doubao ${what} failed.`, message.slice(0, 500), context);
|
|
30
|
-
}
|
|
31
|
-
return networkError(error, signal, `Doubao ${what} failed.`, message.slice(0, 500), context);
|
|
32
|
-
}
|
|
33
|
-
function arkUsage(u) {
|
|
34
|
-
if (!u)
|
|
35
|
-
return {};
|
|
36
|
-
const num = (v) => (typeof v === "number" ? v : undefined);
|
|
37
|
-
return { inputTokens: num(u.input_tokens), outputTokens: num(u.output_tokens) };
|
|
38
|
-
}
|
|
39
|
-
// Concatenate every output_text across message items (reasoning items carry no
|
|
40
|
-
// output_text, so they are naturally skipped).
|
|
41
|
-
function extractText(res) {
|
|
42
|
-
const parts = [];
|
|
43
|
-
for (const item of res.output ?? []) {
|
|
44
|
-
if (item.type !== "message")
|
|
45
|
-
continue;
|
|
46
|
-
for (const c of item.content ?? []) {
|
|
47
|
-
if (c.type === "output_text" && typeof c.text === "string")
|
|
48
|
-
parts.push(c.text);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return parts.join("").trim();
|
|
52
|
-
}
|
|
53
|
-
export class DoubaoVideoModel {
|
|
54
|
-
model;
|
|
55
|
-
timeoutMs;
|
|
56
|
-
maxAttempts;
|
|
57
|
-
client;
|
|
58
|
-
constructor(model, timeoutMs, maxAttempts, apiKey, baseUrl, client) {
|
|
59
|
-
this.model = model;
|
|
60
|
-
this.timeoutMs = timeoutMs;
|
|
61
|
-
this.maxAttempts = maxAttempts;
|
|
62
|
-
this.client = client ?? createArkClient(apiKey, baseUrl, timeoutMs);
|
|
63
|
-
}
|
|
64
|
-
// upload local transcode → poll ACTIVE → respond → best-effort delete.
|
|
65
|
-
async run(request) {
|
|
66
|
-
const { value: file } = await withTransientRetry(this.maxAttempts, async () => {
|
|
67
|
-
try {
|
|
68
|
-
return await this.client.uploadFile({ filePath: request.localPath, mimeType: request.localMime, fps: request.fps });
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
throw toArkError(error, request.signal, "upload", this.model);
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
if (!file.id)
|
|
75
|
-
throw new LlmTransportError("invalid_response", "Doubao upload returned no file id.");
|
|
76
|
-
const active = await this.pollActive(file.id, request.signal);
|
|
77
|
-
try {
|
|
78
|
-
return await this.generateOnce(active, request);
|
|
79
|
-
}
|
|
80
|
-
finally {
|
|
81
|
-
await this.client.deleteFile({ id: active }).catch(() => { }); // cleanup is best-effort
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
async pollActive(id, signal) {
|
|
85
|
-
const deadline = Date.now() + this.timeoutMs;
|
|
86
|
-
let status = "processing";
|
|
87
|
-
while (status === "processing" || status === "") {
|
|
88
|
-
if (signal?.aborted) {
|
|
89
|
-
throw new LlmTransportError("cancelled", "Doubao upload aborted.", {
|
|
90
|
-
context: { provider: "doubao", model: this.model, operation: "file_poll" },
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
if (Date.now() >= deadline) {
|
|
94
|
-
throw new LlmTransportError("timeout", "Doubao file processing timed out.", {
|
|
95
|
-
retryable: true,
|
|
96
|
-
classification: { failure_type: "timeout", failure_code: "media_processing_timeout" },
|
|
97
|
-
context: { provider: "doubao", model: this.model, operation: "file_poll" },
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
await delay(POLL_INTERVAL_MS);
|
|
101
|
-
let file;
|
|
102
|
-
try {
|
|
103
|
-
file = await this.client.getFile({ id });
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
throw toArkError(error, signal, "file_poll", this.model);
|
|
107
|
-
}
|
|
108
|
-
status = (file.status ?? "").toLowerCase();
|
|
109
|
-
}
|
|
110
|
-
if (status === "failed" || status === "error") {
|
|
111
|
-
throw new LlmTransportError("invalid_response", "Doubao file processing failed.", {
|
|
112
|
-
classification: { failure_type: "media", failure_code: "media_processing_failed" },
|
|
113
|
-
context: { provider: "doubao", model: this.model, operation: "file_poll" },
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
return id;
|
|
117
|
-
}
|
|
118
|
-
async generateOnce(fileId, request) {
|
|
119
|
-
const params = {
|
|
120
|
-
model: this.model,
|
|
121
|
-
max_output_tokens: request.maxOutputTokens,
|
|
122
|
-
input: [{ role: "user", content: [
|
|
123
|
-
{ type: "input_video", file_id: fileId },
|
|
124
|
-
{ type: "input_text", text: request.user },
|
|
125
|
-
] }],
|
|
126
|
-
};
|
|
127
|
-
if (request.system?.trim())
|
|
128
|
-
params["instructions"] = request.system;
|
|
129
|
-
if (request.responseJsonSchema) {
|
|
130
|
-
params["text"] = { format: { type: "json_schema", name: "video_serial", schema: request.responseJsonSchema } };
|
|
131
|
-
}
|
|
132
|
-
const { value, attempts, failedUsage } = await withTransientRetry(this.maxAttempts, async () => {
|
|
133
|
-
let res;
|
|
134
|
-
try {
|
|
135
|
-
res = await this.client.createResponse(params, request.signal);
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
throw toArkError(error, request.signal, "generate", this.model);
|
|
139
|
-
}
|
|
140
|
-
const status = (res.status ?? "").toLowerCase();
|
|
141
|
-
const usage = arkUsage(res.usage);
|
|
142
|
-
if (status === "incomplete") {
|
|
143
|
-
const reason = res.incomplete_details?.reason ?? "unknown";
|
|
144
|
-
if (reason === "max_output_tokens")
|
|
145
|
-
throw new LlmTransportError("truncated", "Doubao output was truncated.", { usage });
|
|
146
|
-
throw new LlmTransportError("content_filtered", `Doubao response incomplete (reason=${reason}).`, { usage });
|
|
147
|
-
}
|
|
148
|
-
const text = extractText(res);
|
|
149
|
-
if (!text)
|
|
150
|
-
throw new LlmTransportError("empty_response", "Doubao returned an empty response.", { retryable: true, usage });
|
|
151
|
-
if (request.responseJsonSchema) {
|
|
152
|
-
try {
|
|
153
|
-
JSON.parse(text);
|
|
154
|
-
}
|
|
155
|
-
catch {
|
|
156
|
-
throw new LlmTransportError("invalid_response", "Doubao returned malformed JSON for a structured video response.", {
|
|
157
|
-
retryable: true,
|
|
158
|
-
usage,
|
|
159
|
-
context: { provider: "doubao", model: this.model, operation: "generate" },
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
return { text, usage, raw: res };
|
|
164
|
-
});
|
|
165
|
-
return { text: value.text, finishReason: "STOP", attempts, usage: addTokenUsage(failedUsage, value.usage), raw: value.raw };
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
// Real HTTP client over the Ark REST API using global fetch (Node 18+). No SDK
|
|
169
|
-
// dependency — the surface is tiny (4 calls) and multipart upload is trivial.
|
|
170
|
-
class HttpError extends Error {
|
|
171
|
-
status;
|
|
172
|
-
constructor(status, message) {
|
|
173
|
-
super(message);
|
|
174
|
-
this.status = status;
|
|
175
|
-
this.name = "HttpError";
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
function createArkClient(apiKey, baseUrl, timeoutMs) {
|
|
179
|
-
const root = baseUrl.replace(/\/$/, "");
|
|
180
|
-
const auth = { Authorization: `Bearer ${apiKey}` };
|
|
181
|
-
// Node's global fetch uses Undici's 5-minute response-header timeout even
|
|
182
|
-
// when the AbortSignal allows a longer model request. Ark video responses
|
|
183
|
-
// can legitimately take longer, so keep the transport deadline aligned with
|
|
184
|
-
// the provider timeout instead of failing every retry at exactly 5 minutes.
|
|
185
|
-
const dispatcher = new Agent({ headersTimeout: timeoutMs, bodyTimeout: timeoutMs });
|
|
186
|
-
function signalFor(extra) {
|
|
187
|
-
const timeout = AbortSignal.timeout(timeoutMs);
|
|
188
|
-
return extra ? AbortSignal.any([extra, timeout]) : timeout;
|
|
189
|
-
}
|
|
190
|
-
async function readError(res) {
|
|
191
|
-
const body = await res.text().catch(() => "");
|
|
192
|
-
throw new HttpError(res.status, body.slice(0, 500));
|
|
193
|
-
}
|
|
194
|
-
return {
|
|
195
|
-
async uploadFile({ filePath, mimeType, fps }) {
|
|
196
|
-
const form = new FormData();
|
|
197
|
-
const bytes = fs.readFileSync(filePath);
|
|
198
|
-
form.append("file", new File([bytes], path.basename(filePath), { type: mimeType }));
|
|
199
|
-
form.append("purpose", "user_data");
|
|
200
|
-
form.append("preprocess_configs[video][fps]", String(fps));
|
|
201
|
-
const res = await fetch(`${root}/files`, { method: "POST", headers: auth, body: form, signal: signalFor(), dispatcher });
|
|
202
|
-
if (!res.ok)
|
|
203
|
-
await readError(res);
|
|
204
|
-
return (await res.json());
|
|
205
|
-
},
|
|
206
|
-
async getFile({ id }) {
|
|
207
|
-
const res = await fetch(`${root}/files/${id}`, { headers: auth, signal: signalFor(), dispatcher });
|
|
208
|
-
if (!res.ok)
|
|
209
|
-
await readError(res);
|
|
210
|
-
return (await res.json());
|
|
211
|
-
},
|
|
212
|
-
async createResponse(params, signal) {
|
|
213
|
-
const res = await fetch(`${root}/responses`, {
|
|
214
|
-
method: "POST",
|
|
215
|
-
headers: { ...auth, "Content-Type": "application/json" },
|
|
216
|
-
body: JSON.stringify(params),
|
|
217
|
-
signal: signalFor(signal),
|
|
218
|
-
dispatcher,
|
|
219
|
-
});
|
|
220
|
-
if (!res.ok)
|
|
221
|
-
await readError(res);
|
|
222
|
-
return (await res.json());
|
|
223
|
-
},
|
|
224
|
-
async deleteFile({ id }) {
|
|
225
|
-
const res = await fetch(`${root}/files/${id}`, { method: "DELETE", headers: auth, signal: signalFor(), dispatcher });
|
|
226
|
-
if (!res.ok)
|
|
227
|
-
await readError(res);
|
|
228
|
-
},
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
//# sourceMappingURL=doubao-video-model.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"doubao-video-model.js","sourceRoot":"","sources":["../../../src/infra/llm/doubao-video-model.ts"],"names":[],"mappings":"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"}
|