@lingjingai/scriptctl 0.52.0 → 0.53.1
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/changes/0.53.0.md +13 -0
- package/changes/0.53.1.md +13 -0
- package/dist/bin.js +0 -0
- package/dist/domain/ingest/environment.d.ts +4 -0
- package/dist/domain/ingest/environment.js +35 -0
- package/dist/domain/ingest/environment.js.map +1 -0
- package/dist/domain/ingest/jsonl-parser.js +14 -1
- package/dist/domain/ingest/jsonl-parser.js.map +1 -1
- package/dist/domain/ingest/markdown-parser.js +4 -3
- package/dist/domain/ingest/markdown-parser.js.map +1 -1
- package/dist/domain/ingest/video-apply.js +2 -2
- package/dist/domain/ingest/video-apply.js.map +1 -1
- package/dist/domain/script/v3/validation.js +14 -0
- package/dist/domain/script/v3/validation.js.map +1 -1
- package/dist/domain/script/v4/validation.js +14 -5
- package/dist/domain/script/v4/validation.js.map +1 -1
- package/dist/infra/llm/anthropic-model.js +13 -11
- package/dist/infra/llm/anthropic-model.js.map +1 -1
- package/dist/infra/llm/doubao-video-model.js +8 -7
- package/dist/infra/llm/doubao-video-model.js.map +1 -1
- package/dist/infra/llm/gemini-video-model.js +9 -8
- package/dist/infra/llm/gemini-video-model.js.map +1 -1
- package/dist/infra/llm/openai-compatible-model.js +51 -31
- package/dist/infra/llm/openai-compatible-model.js.map +1 -1
- package/dist/infra/llm/retry.d.ts +3 -0
- package/dist/infra/llm/retry.js +22 -1
- package/dist/infra/llm/retry.js.map +1 -1
- package/dist/llm/router.d.ts +7 -3
- package/dist/llm/router.js +112 -28
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/tasks/ingest/text-normalize.js +2 -2
- package/dist/llm/tasks/ingest/text-normalize.js.map +1 -1
- package/dist/llm/tasks/ingest/video-serial.js +2 -1
- package/dist/llm/tasks/ingest/video-serial.js.map +1 -1
- package/dist/llm/tasks/schemas.js +5 -1
- package/dist/llm/tasks/schemas.js.map +1 -1
- package/dist/llm/types.d.ts +22 -0
- package/dist/llm/types.js +4 -0
- package/dist/llm/types.js.map +1 -1
- package/dist/usecases/ingest/pipeline.js +257 -220
- package/dist/usecases/ingest/pipeline.js.map +1 -1
- package/dist/usecases/ingest/serial-govern.js +4 -1
- package/dist/usecases/ingest/serial-govern.js.map +1 -1
- package/dist/usecases/ingest/usage-report.d.ts +112 -4
- package/dist/usecases/ingest/usage-report.js +242 -45
- package/dist/usecases/ingest/usage-report.js.map +1 -1
- package/dist/usecases/ingest/video-pipeline.js +157 -117
- package/dist/usecases/ingest/video-pipeline.js.map +1 -1
- package/dist/usecases/ingest/view-server.d.ts +2 -22
- package/dist/usecases/ingest/view-server.js +14 -8
- package/dist/usecases/ingest/view-server.js.map +1 -1
- package/package.json +15 -16
- package/skills/scriptctl/SKILL.md +3 -3
- package/skills/scriptctl/references/ingest-workflow.md +2 -0
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import * as fs from "node:fs";
|
|
10
10
|
import * as path from "node:path";
|
|
11
11
|
import { LlmTransportError, } from "../../llm/types.js";
|
|
12
|
-
import { withTransientRetry } from "./retry.js";
|
|
12
|
+
import { addTokenUsage, withTransientRetry } from "./retry.js";
|
|
13
13
|
const POLL_INTERVAL_MS = 2000;
|
|
14
14
|
function delay(ms) {
|
|
15
15
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -126,7 +126,7 @@ export class DoubaoVideoModel {
|
|
|
126
126
|
if (request.responseJsonSchema) {
|
|
127
127
|
params["text"] = { format: { type: "json_schema", name: "video_serial", schema: request.responseJsonSchema } };
|
|
128
128
|
}
|
|
129
|
-
const { value, attempts } = await withTransientRetry(this.maxAttempts, async () => {
|
|
129
|
+
const { value, attempts, failedUsage } = await withTransientRetry(this.maxAttempts, async () => {
|
|
130
130
|
let res;
|
|
131
131
|
try {
|
|
132
132
|
res = await this.client.createResponse(params, request.signal);
|
|
@@ -135,18 +135,19 @@ export class DoubaoVideoModel {
|
|
|
135
135
|
throw toArkError(error, request.signal, "createResponse");
|
|
136
136
|
}
|
|
137
137
|
const status = (res.status ?? "").toLowerCase();
|
|
138
|
+
const usage = arkUsage(res.usage);
|
|
138
139
|
if (status === "incomplete") {
|
|
139
140
|
const reason = res.incomplete_details?.reason ?? "unknown";
|
|
140
141
|
if (reason === "max_output_tokens")
|
|
141
|
-
throw new LlmTransportError("truncated", "Doubao output was truncated.");
|
|
142
|
-
throw new LlmTransportError("content_filtered", `Doubao response incomplete (reason=${reason})
|
|
142
|
+
throw new LlmTransportError("truncated", "Doubao output was truncated.", { usage });
|
|
143
|
+
throw new LlmTransportError("content_filtered", `Doubao response incomplete (reason=${reason}).`, { usage });
|
|
143
144
|
}
|
|
144
145
|
const text = extractText(res);
|
|
145
146
|
if (!text)
|
|
146
|
-
throw new LlmTransportError("empty_response", "Doubao returned an empty response.", { retryable: true });
|
|
147
|
-
return { text, usage
|
|
147
|
+
throw new LlmTransportError("empty_response", "Doubao returned an empty response.", { retryable: true, usage });
|
|
148
|
+
return { text, usage, raw: res };
|
|
148
149
|
});
|
|
149
|
-
return { text: value.text, finishReason: "STOP", attempts, usage: value.usage, raw: value.raw };
|
|
150
|
+
return { text: value.text, finishReason: "STOP", attempts, usage: addTokenUsage(failedUsage, value.usage), raw: value.raw };
|
|
150
151
|
}
|
|
151
152
|
}
|
|
152
153
|
// Real HTTP client over the Ark REST API using global fetch (Node 18+). No SDK
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doubao-video-model.js","sourceRoot":"","sources":["../../../src/infra/llm/doubao-video-model.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,kFAAkF;AAClF,mFAAmF;AACnF,kFAAkF;AAClF,2EAA2E;AAC3E,6EAA6E;AAC7E,gFAAgF;AAChF,qEAAqE;AAErE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,iBAAiB,GAIlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"doubao-video-model.js","sourceRoot":"","sources":["../../../src/infra/llm/doubao-video-model.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,kFAAkF;AAClF,mFAAmF;AACnF,kFAAkF;AAClF,2EAA2E;AAC3E,6EAA6E;AAC7E,gFAAgF;AAChF,qEAAqE;AAErE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,iBAAiB,GAIlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAwB/D,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAQ,KAA8B,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrG,OAAQ,KAA4B,CAAC,MAAM,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,8CAA8C;AAC9C,SAAS,UAAU,CAAC,KAAc,EAAE,MAA+B,EAAE,IAAY;IAC/E,IAAI,KAAK,YAAY,iBAAiB;QAAE,OAAO,KAAK,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAC5G,OAAO,IAAI,iBAAiB,CAAC,IAAI,EAAE,UAAU,IAAI,UAAU,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,WAAW,MAAM,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACrI,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC;IACzC,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,IAAI,UAAU,EAAE;QAC7F,SAAS,EAAE,CAAC,OAAO;QACnB,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;KACjC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,CAAuB;IACvC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,MAAM,GAAG,GAAG,CAAC,CAAU,EAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxF,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;AAClF,CAAC;AAED,+EAA+E;AAC/E,+CAA+C;AAC/C,SAAS,WAAW,CAAC,GAAgB;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QACtC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/B,CAAC;AAaD,MAAM,OAAO,gBAAgB;IAIR;IACA;IACA;IALF,MAAM,CAAY;IAEnC,YACmB,KAAa,EACb,SAAiB,EACjB,WAAmB,EACpC,MAAc,EACd,OAAe,EACf,MAAkB;QALD,UAAK,GAAL,KAAK,CAAQ;QACb,cAAS,GAAT,SAAS,CAAQ;QACjB,gBAAW,GAAX,WAAW,CAAQ;QAKpC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,GAAG,CAAC,OAAyB;QACjC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YAC5E,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACtH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACpD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,iBAAiB,CAAC,kBAAkB,EAAE,oCAAoC,CAAC,CAAC;QACpG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,yBAAyB;QACzF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,MAAoB;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7C,IAAI,MAAM,GAAG,YAAY,CAAC;QAC1B,OAAO,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAChD,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,IAAI,iBAAiB,CAAC,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;YAC7F,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;gBAAE,MAAM,IAAI,iBAAiB,CAAC,SAAS,EAAE,mCAAmC,CAAC,CAAC;YACxG,MAAM,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAC9B,IAAI,IAAa,CAAC;YAClB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9C,MAAM,IAAI,iBAAiB,CAAC,kBAAkB,EAAE,gCAAgC,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,OAAyB;QAClE,MAAM,MAAM,GAA4B;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,iBAAiB,EAAE,OAAO,CAAC,eAAe;YAC1C,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;wBAC/B,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE;wBACxC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;qBAC3C,EAAE,CAAC;SACL,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE;YAAE,MAAM,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QACpE,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;QACjH,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YAC7F,IAAI,GAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACjE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,EAAE,MAAM,IAAI,SAAS,CAAC;gBAC3D,IAAI,MAAM,KAAK,mBAAmB;oBAAE,MAAM,IAAI,iBAAiB,CAAC,WAAW,EAAE,8BAA8B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxH,MAAM,IAAI,iBAAiB,CAAC,kBAAkB,EAAE,sCAAsC,MAAM,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/G,CAAC;YACD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,iBAAiB,CAAC,gBAAgB,EAAE,oCAAoC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3H,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAC9H,CAAC;CACF;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,MAAM,SAAU,SAAQ,KAAK;IACN;IAArB,YAAqB,MAAc,EAAE,OAAe;QAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAAlD,WAAM,GAAN,MAAM,CAAQ;QAAqC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAAC,CAAC;CACnG;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,OAAe,EAAE,SAAiB;IACzE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC;IAEnD,SAAS,SAAS,CAAC,KAAmB;QACpC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,CAAC;IAED,KAAK,UAAU,SAAS,CAAC,GAAa;QACpC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO;QACL,KAAK,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE;YAC1C,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpF,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,gCAAgC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAC7G,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YAClC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAC;QACvC,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE;YAClB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,UAAU,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YACvF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YAClC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAC;QACvC,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM;YACjC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,YAAY,EAAE;gBAC3C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBACxD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;aAC1B,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YAClC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgB,CAAC;QAC3C,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE;YACrB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,UAAU,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YACzG,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { createRequire } from "node:module";
|
|
8
8
|
import { LlmTransportError, } from "../../llm/types.js";
|
|
9
9
|
import { resumableUpload } from "./gemini-upload.js";
|
|
10
|
-
import { withTransientRetry } from "./retry.js";
|
|
10
|
+
import { addTokenUsage, withTransientRetry } from "./retry.js";
|
|
11
11
|
// finishReasons that yield empty text but are terminal: retry/resume never clears them.
|
|
12
12
|
const FILTERED_FINISH = new Set(["SAFETY", "PROHIBITED_CONTENT", "RECITATION", "BLOCKLIST", "SPII", "IMAGE_SAFETY"]);
|
|
13
13
|
// Gemini reports usageMetadata.{promptTokenCount,candidatesTokenCount}. promptTokenCount
|
|
@@ -122,7 +122,7 @@ export class GeminiVideoModel {
|
|
|
122
122
|
}],
|
|
123
123
|
config,
|
|
124
124
|
};
|
|
125
|
-
const { value, attempts } = await withTransientRetry(this.provider.maxAttempts, async () => {
|
|
125
|
+
const { value, attempts, failedUsage } = await withTransientRetry(this.provider.maxAttempts, async () => {
|
|
126
126
|
let response;
|
|
127
127
|
try {
|
|
128
128
|
response = await this.client.models.generateContent(params);
|
|
@@ -132,24 +132,25 @@ export class GeminiVideoModel {
|
|
|
132
132
|
}
|
|
133
133
|
const finishReason = response.candidates?.[0]?.finishReason ?? "";
|
|
134
134
|
const blockReason = response.promptFeedback?.blockReason ?? "";
|
|
135
|
+
const usage = geminiUsage(response.usageMetadata);
|
|
135
136
|
if (finishReason === "MAX_TOKENS")
|
|
136
|
-
throw new LlmTransportError("truncated", "Gemini output was truncated.");
|
|
137
|
+
throw new LlmTransportError("truncated", "Gemini output was truncated.", { usage });
|
|
137
138
|
const text = (response.text ?? "").trim();
|
|
138
139
|
if (!text) {
|
|
139
140
|
// An empty body is terminal when the prompt was blocked or the candidate
|
|
140
141
|
// hit a content/policy filter — retry & resume never clear these, so surface
|
|
141
142
|
// the real reason instead of spinning through maxAttempts on a stuck episode.
|
|
142
143
|
if (blockReason)
|
|
143
|
-
throw new LlmTransportError("content_filtered", `Gemini blocked the prompt (blockReason=${blockReason})
|
|
144
|
+
throw new LlmTransportError("content_filtered", `Gemini blocked the prompt (blockReason=${blockReason}).`, { usage });
|
|
144
145
|
if (FILTERED_FINISH.has(finishReason))
|
|
145
|
-
throw new LlmTransportError("content_filtered", `Gemini filtered the response (finishReason=${finishReason})
|
|
146
|
+
throw new LlmTransportError("content_filtered", `Gemini filtered the response (finishReason=${finishReason}).`, { usage });
|
|
146
147
|
// Empty body with a normal/blank finishReason is a transient generation hiccup
|
|
147
148
|
// (observed ~1/15 episodes); retry it — a resume of the same episode succeeds.
|
|
148
|
-
throw new LlmTransportError("empty_response", `Gemini returned an empty response (finishReason=${finishReason || "none"}).`, { retryable: true });
|
|
149
|
+
throw new LlmTransportError("empty_response", `Gemini returned an empty response (finishReason=${finishReason || "none"}).`, { retryable: true, usage });
|
|
149
150
|
}
|
|
150
|
-
return { text, finishReason, usage
|
|
151
|
+
return { text, finishReason, usage, raw: response };
|
|
151
152
|
});
|
|
152
|
-
return { text: value.text, finishReason: value.finishReason, attempts, usage: value.usage, raw: value.raw };
|
|
153
|
+
return { text: value.text, finishReason: value.finishReason, attempts, usage: addTokenUsage(failedUsage, value.usage), raw: value.raw };
|
|
153
154
|
}
|
|
154
155
|
async delete(handle, signal) {
|
|
155
156
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-video-model.js","sourceRoot":"","sources":["../../../src/infra/llm/gemini-video-model.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,iFAAiF;AACjF,8EAA8E;AAC9E,gFAAgF;AAChF,iFAAiF;AACjF,iDAAiD;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EACL,iBAAiB,GAMlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"gemini-video-model.js","sourceRoot":"","sources":["../../../src/infra/llm/gemini-video-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LlmTransportError, } from "../../llm/types.js";
|
|
2
|
-
import { withTransientRetry } from "./retry.js";
|
|
2
|
+
import { addTokenUsage, withTransientRetry } from "./retry.js";
|
|
3
3
|
// Token accounting from an OpenAI-shaped usage object. IMPORTANT: our gateway
|
|
4
4
|
// (LiteLLM/aihubmix fronting Anthropic) reports Anthropic-style semantics through
|
|
5
5
|
// OpenAI-shaped fields — prompt_tokens is FRESH (non-cached) input only, and
|
|
@@ -126,7 +126,7 @@ export class OpenAiCompatibleModel {
|
|
|
126
126
|
}
|
|
127
127
|
return parseJson(raw);
|
|
128
128
|
});
|
|
129
|
-
return { payload: result.value, attempts: result.attempts };
|
|
129
|
+
return { payload: result.value, attempts: result.attempts, failedUsage: result.failedUsage };
|
|
130
130
|
}
|
|
131
131
|
baseBody(request) {
|
|
132
132
|
const messages = [];
|
|
@@ -143,20 +143,30 @@ export class OpenAiCompatibleModel {
|
|
|
143
143
|
};
|
|
144
144
|
}
|
|
145
145
|
async generateText(request) {
|
|
146
|
-
const { payload, attempts } = await this.post(this.baseBody(request), request.signal);
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
146
|
+
const { payload, attempts, failedUsage } = await this.post(this.baseBody(request), request.signal);
|
|
147
|
+
const usage = addTokenUsage(failedUsage, usageOf(payload));
|
|
148
|
+
try {
|
|
149
|
+
const choice = firstChoice(payload);
|
|
150
|
+
const reason = finishReason(choice);
|
|
151
|
+
if (reason === "length")
|
|
152
|
+
throw new LlmTransportError("truncated", "Provider output was truncated.");
|
|
153
|
+
if (reason === "content_filter")
|
|
154
|
+
throw new LlmTransportError("content_filtered", "Provider filtered the response.");
|
|
155
|
+
const text = messageText(choice);
|
|
156
|
+
if (!text)
|
|
157
|
+
throw new LlmTransportError("empty_response", "Provider returned an empty text response.");
|
|
158
|
+
return { text, finishReason: reason, attempts, usage, raw: payload };
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
if (error instanceof LlmTransportError) {
|
|
162
|
+
error.attempts = attempts;
|
|
163
|
+
error.usage = usage;
|
|
164
|
+
}
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
157
167
|
}
|
|
158
168
|
async generateTool(request) {
|
|
159
|
-
const { payload, attempts } = await this.post({
|
|
169
|
+
const { payload, attempts, failedUsage } = await this.post({
|
|
160
170
|
...this.baseBody(request),
|
|
161
171
|
tools: [{
|
|
162
172
|
type: "function",
|
|
@@ -165,24 +175,34 @@ export class OpenAiCompatibleModel {
|
|
|
165
175
|
tool_choice: { type: "function", function: { name: request.tool.name } },
|
|
166
176
|
parallel_tool_calls: false,
|
|
167
177
|
}, request.signal);
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
178
|
+
const usage = addTokenUsage(failedUsage, usageOf(payload));
|
|
179
|
+
try {
|
|
180
|
+
const choice = firstChoice(payload);
|
|
181
|
+
const reason = finishReason(choice);
|
|
182
|
+
if (reason === "length")
|
|
183
|
+
throw new LlmTransportError("truncated", "Provider tool output was truncated.");
|
|
184
|
+
if (reason === "content_filter")
|
|
185
|
+
throw new LlmTransportError("content_filtered", "Provider filtered the response.");
|
|
186
|
+
const calls = message(choice)?.["tool_calls"];
|
|
187
|
+
if (!Array.isArray(calls))
|
|
188
|
+
throw new LlmTransportError("invalid_response", "Provider did not return a tool call.");
|
|
189
|
+
for (const call of calls) {
|
|
190
|
+
if (!isRecord(call) || !isRecord(call["function"]))
|
|
191
|
+
continue;
|
|
192
|
+
const fn = call["function"];
|
|
193
|
+
if (fn["name"] !== request.tool.name || typeof fn["arguments"] !== "string")
|
|
194
|
+
continue;
|
|
195
|
+
return { input: parseJson(fn["arguments"]), finishReason: reason, attempts, usage, raw: payload };
|
|
196
|
+
}
|
|
197
|
+
throw new LlmTransportError("invalid_response", "Provider did not return the required tool call.");
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
if (error instanceof LlmTransportError) {
|
|
201
|
+
error.attempts = attempts;
|
|
202
|
+
error.usage = usage;
|
|
203
|
+
}
|
|
204
|
+
throw error;
|
|
184
205
|
}
|
|
185
|
-
throw new LlmTransportError("invalid_response", "Provider did not return the required tool call.");
|
|
186
206
|
}
|
|
187
207
|
}
|
|
188
208
|
//# sourceMappingURL=openai-compatible-model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compatible-model.js","sourceRoot":"","sources":["../../../src/infra/llm/openai-compatible-model.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,GAOlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-compatible-model.js","sourceRoot":"","sources":["../../../src/infra/llm/openai-compatible-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { type TokenUsage } from "../../llm/types.js";
|
|
1
2
|
export interface RetryResult<T> {
|
|
2
3
|
value: T;
|
|
3
4
|
attempts: number;
|
|
5
|
+
failedUsage: TokenUsage;
|
|
4
6
|
}
|
|
7
|
+
export declare function addTokenUsage(left?: TokenUsage, right?: TokenUsage): TokenUsage;
|
|
5
8
|
export declare function withTransientRetry<T>(maxAttempts: number, operation: () => Promise<T>): Promise<RetryResult<T>>;
|
package/dist/infra/llm/retry.js
CHANGED
|
@@ -2,12 +2,33 @@ import { LlmTransportError } from "../../llm/types.js";
|
|
|
2
2
|
function delay(ms) {
|
|
3
3
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
4
4
|
}
|
|
5
|
+
export function addTokenUsage(left = {}, right = {}) {
|
|
6
|
+
const sum = (key) => left[key] === undefined && right[key] === undefined
|
|
7
|
+
? undefined
|
|
8
|
+
: (left[key] ?? 0) + (right[key] ?? 0);
|
|
9
|
+
const inputTokens = sum("inputTokens");
|
|
10
|
+
const outputTokens = sum("outputTokens");
|
|
11
|
+
const cachedInputTokens = sum("cachedInputTokens");
|
|
12
|
+
const cacheCreationTokens = sum("cacheCreationTokens");
|
|
13
|
+
return {
|
|
14
|
+
...(inputTokens !== undefined ? { inputTokens } : {}),
|
|
15
|
+
...(outputTokens !== undefined ? { outputTokens } : {}),
|
|
16
|
+
...(cachedInputTokens !== undefined ? { cachedInputTokens } : {}),
|
|
17
|
+
...(cacheCreationTokens !== undefined ? { cacheCreationTokens } : {}),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
5
20
|
export async function withTransientRetry(maxAttempts, operation) {
|
|
21
|
+
let failedUsage = {};
|
|
6
22
|
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
7
23
|
try {
|
|
8
|
-
return { value: await operation(), attempts: attempt };
|
|
24
|
+
return { value: await operation(), attempts: attempt, failedUsage };
|
|
9
25
|
}
|
|
10
26
|
catch (error) {
|
|
27
|
+
if (error instanceof LlmTransportError) {
|
|
28
|
+
failedUsage = addTokenUsage(failedUsage, error.usage);
|
|
29
|
+
error.attempts = attempt;
|
|
30
|
+
error.usage = failedUsage;
|
|
31
|
+
}
|
|
11
32
|
if (!(error instanceof LlmTransportError) || !error.retryable || attempt === maxAttempts)
|
|
12
33
|
throw error;
|
|
13
34
|
// Exponential backoff (30s cap) — a shared LAN gateway under load needs the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/infra/llm/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/infra/llm/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAmB,MAAM,oBAAoB,CAAC;AAExE,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAQD,MAAM,UAAU,aAAa,CAAC,OAAmB,EAAE,EAAE,QAAoB,EAAE;IACzE,MAAM,GAAG,GAAG,CAAC,GAAqB,EAAsB,EAAE,CACxD,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS;QACjD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC;IACzC,MAAM,iBAAiB,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnD,MAAM,mBAAmB,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACvD,OAAO;QACL,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAI,WAAmB,EAAE,SAA2B;IAC1F,IAAI,WAAW,GAAe,EAAE,CAAC;IACjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;gBACvC,WAAW,GAAG,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtD,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;gBACzB,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,KAAK,WAAW;gBAAE,MAAM,KAAK,CAAC;YACtG,4EAA4E;YAC5E,yDAAyD;YACzD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/llm/router.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DoubaoVideoModel } from "../infra/llm/doubao-video-model.js";
|
|
2
2
|
import { type LlmModelConfig, type LlmProviderConfig, type ResolvedLlmConfig } from "./config.js";
|
|
3
|
-
import type { LlmRouteInfo, LlmRouteUsage, LlmTaskExecutor, LlmTaskId, TaskVideoPort, TextGenerationRequest, TextGenerationResponse, ToolGenerationRequest, ToolGenerationResponse, VideoUnderstandingPort } from "./types.js";
|
|
3
|
+
import type { LlmRouteInfo, LlmRouteUsage, LlmTaskExecutor, LlmTaskId, LlmUsageEvent, TaskVideoPort, TextGenerationRequest, TextGenerationResponse, ToolGenerationRequest, ToolGenerationResponse, VideoUnderstandingPort } from "./types.js";
|
|
4
4
|
interface ResolvedRoute {
|
|
5
5
|
info: LlmRouteInfo;
|
|
6
6
|
providerConfig: LlmProviderConfig;
|
|
@@ -12,7 +12,7 @@ export declare class ModelRouter implements LlmTaskExecutor {
|
|
|
12
12
|
private readonly videoAdapters;
|
|
13
13
|
private readonly doubaoAdapters;
|
|
14
14
|
private readonly resolvedRoutes;
|
|
15
|
-
private readonly
|
|
15
|
+
private readonly usageLog;
|
|
16
16
|
constructor(config: ResolvedLlmConfig);
|
|
17
17
|
get configSource(): "builtin" | "file";
|
|
18
18
|
private resolve;
|
|
@@ -21,7 +21,11 @@ export declare class ModelRouter implements LlmTaskExecutor {
|
|
|
21
21
|
private emptyUsage;
|
|
22
22
|
recordReuse(task: LlmTaskId): void;
|
|
23
23
|
usage(): LlmRouteUsage[];
|
|
24
|
-
|
|
24
|
+
usageEvents(): LlmUsageEvent[];
|
|
25
|
+
private recordEvent;
|
|
26
|
+
private tracked;
|
|
27
|
+
private videoRoute;
|
|
28
|
+
private doubaoRoute;
|
|
25
29
|
private adapter;
|
|
26
30
|
protected videoAdapter(route: ResolvedRoute, model?: string): VideoUnderstandingPort;
|
|
27
31
|
videoPort(task: LlmTaskId): TaskVideoPort;
|
package/dist/llm/router.js
CHANGED
|
@@ -64,7 +64,7 @@ export class ModelRouter {
|
|
|
64
64
|
videoAdapters = new Map();
|
|
65
65
|
doubaoAdapters = new Map();
|
|
66
66
|
resolvedRoutes = new Map();
|
|
67
|
-
|
|
67
|
+
usageLog = [];
|
|
68
68
|
constructor(config) {
|
|
69
69
|
this.config = config;
|
|
70
70
|
}
|
|
@@ -115,25 +115,112 @@ export class ModelRouter {
|
|
|
115
115
|
return LLM_TASK_IDS.map((task) => this.route(task));
|
|
116
116
|
}
|
|
117
117
|
emptyUsage() {
|
|
118
|
-
return {
|
|
118
|
+
return {
|
|
119
|
+
calls: 0,
|
|
120
|
+
succeeded: 0,
|
|
121
|
+
failed: 0,
|
|
122
|
+
reused: 0,
|
|
123
|
+
attempts: 0,
|
|
124
|
+
durationMs: 0,
|
|
125
|
+
inputTokens: 0,
|
|
126
|
+
outputTokens: 0,
|
|
127
|
+
cachedInputTokens: 0,
|
|
128
|
+
cacheCreationTokens: 0,
|
|
129
|
+
};
|
|
119
130
|
}
|
|
120
131
|
recordReuse(task) {
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
this.usageByTask.set(task, usage);
|
|
132
|
+
const at = new Date().toISOString();
|
|
133
|
+
this.recordEvent(this.route(task), "reused", at, at, 0, {});
|
|
124
134
|
}
|
|
125
135
|
usage() {
|
|
126
|
-
|
|
136
|
+
const aggregate = new Map();
|
|
137
|
+
for (const event of this.usageLog) {
|
|
138
|
+
const key = `${event.task}\u0000${event.provider}\u0000${event.protocol}\u0000${event.model}\u0000${event.fingerprint}`;
|
|
139
|
+
const usage = aggregate.get(key) ?? {
|
|
140
|
+
task: event.task,
|
|
141
|
+
profile: event.profile,
|
|
142
|
+
provider: event.provider,
|
|
143
|
+
protocol: event.protocol,
|
|
144
|
+
model: event.model,
|
|
145
|
+
fingerprint: event.fingerprint,
|
|
146
|
+
...this.emptyUsage(),
|
|
147
|
+
};
|
|
148
|
+
if (event.status === "reused")
|
|
149
|
+
usage.reused += 1;
|
|
150
|
+
else {
|
|
151
|
+
usage.calls += 1;
|
|
152
|
+
usage[event.status] += 1;
|
|
153
|
+
usage.attempts += event.attempts;
|
|
154
|
+
usage.durationMs += event.durationMs;
|
|
155
|
+
usage.inputTokens += event.inputTokens;
|
|
156
|
+
usage.outputTokens += event.outputTokens;
|
|
157
|
+
usage.cachedInputTokens += event.cachedInputTokens;
|
|
158
|
+
usage.cacheCreationTokens += event.cacheCreationTokens;
|
|
159
|
+
}
|
|
160
|
+
aggregate.set(key, usage);
|
|
161
|
+
}
|
|
162
|
+
return [...aggregate.values()];
|
|
163
|
+
}
|
|
164
|
+
usageEvents() {
|
|
165
|
+
return this.usageLog.map((event) => ({ ...event }));
|
|
166
|
+
}
|
|
167
|
+
recordEvent(route, status, startedAt, endedAt, durationMs, usage, attempts = 0, errorCode) {
|
|
168
|
+
this.usageLog.push({
|
|
169
|
+
...route,
|
|
170
|
+
sequence: this.usageLog.length + 1,
|
|
171
|
+
status,
|
|
172
|
+
attempts,
|
|
173
|
+
startedAt,
|
|
174
|
+
endedAt,
|
|
175
|
+
durationMs,
|
|
176
|
+
inputTokens: usage.inputTokens ?? 0,
|
|
177
|
+
outputTokens: usage.outputTokens ?? 0,
|
|
178
|
+
cachedInputTokens: usage.cachedInputTokens ?? 0,
|
|
179
|
+
cacheCreationTokens: usage.cacheCreationTokens ?? 0,
|
|
180
|
+
...(errorCode ? { errorCode } : {}),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
async tracked(route, operation) {
|
|
184
|
+
const startedMs = Date.now();
|
|
185
|
+
const startedAt = new Date(startedMs).toISOString();
|
|
186
|
+
try {
|
|
187
|
+
const response = await operation();
|
|
188
|
+
const endedMs = Date.now();
|
|
189
|
+
this.recordEvent(route, "succeeded", startedAt, new Date(endedMs).toISOString(), endedMs - startedMs, response.usage ?? {}, response.attempts);
|
|
190
|
+
return response;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
const endedMs = Date.now();
|
|
194
|
+
const transport = error instanceof LlmTransportError ? error : null;
|
|
195
|
+
this.recordEvent(route, "failed", startedAt, new Date(endedMs).toISOString(), endedMs - startedMs, transport?.usage ?? {}, transport?.attempts ?? 1, transport?.code);
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
videoRoute(route, model) {
|
|
200
|
+
const modelConfig = model === route.info.model ? route.modelConfig : { ...route.modelConfig, model };
|
|
201
|
+
return {
|
|
202
|
+
...route.info,
|
|
203
|
+
model,
|
|
204
|
+
fingerprint: routeFingerprint(route.info.task, route.providerConfig, modelConfig),
|
|
205
|
+
};
|
|
127
206
|
}
|
|
128
|
-
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
this.
|
|
207
|
+
doubaoRoute(task) {
|
|
208
|
+
const provider = {
|
|
209
|
+
protocol: "openai-compatible",
|
|
210
|
+
baseUrl: DOUBAO_FALLBACK.baseUrl,
|
|
211
|
+
apiKeyEnv: DOUBAO_FALLBACK.apiKeyEnv,
|
|
212
|
+
timeoutMs: DOUBAO_FALLBACK.timeoutMs,
|
|
213
|
+
maxAttempts: DOUBAO_FALLBACK.maxAttempts,
|
|
214
|
+
};
|
|
215
|
+
const model = { provider: "doubao", model: this.doubaoModel() };
|
|
216
|
+
return {
|
|
217
|
+
task,
|
|
218
|
+
profile: "doubao-fallback",
|
|
219
|
+
provider: "doubao",
|
|
220
|
+
protocol: provider.protocol,
|
|
221
|
+
model: model.model,
|
|
222
|
+
fingerprint: routeFingerprint(task, provider, model),
|
|
223
|
+
};
|
|
137
224
|
}
|
|
138
225
|
adapter(route) {
|
|
139
226
|
const key = `${route.info.provider}\u0000${route.info.model}\u0000${route.modelConfig.thinkingBudgetTokens ?? ""}`;
|
|
@@ -183,8 +270,7 @@ export class ModelRouter {
|
|
|
183
270
|
const failures = [];
|
|
184
271
|
for (const model of chain) {
|
|
185
272
|
try {
|
|
186
|
-
const response = await this.videoAdapter(route, model).generate({ ...request, maxOutputTokens: spec.maxOutputTokens });
|
|
187
|
-
this.recordCall(task, response.attempts, response.usage);
|
|
273
|
+
const response = await this.tracked(this.videoRoute(route, model), () => this.videoAdapter(route, model).generate({ ...request, maxOutputTokens: spec.maxOutputTokens }));
|
|
188
274
|
if (model !== chain[0])
|
|
189
275
|
process.stderr.write(`↪️ 已回退到备用模型 ${model}\n`);
|
|
190
276
|
return response;
|
|
@@ -200,11 +286,12 @@ export class ModelRouter {
|
|
|
200
286
|
}
|
|
201
287
|
// Cross-provider last resort: Doubao (Ark). Needs ARK_API_KEY + the local file.
|
|
202
288
|
const doubao = this.doubaoAdapter();
|
|
203
|
-
|
|
289
|
+
const localPath = request.localPath;
|
|
290
|
+
if (doubao && localPath) {
|
|
204
291
|
try {
|
|
205
292
|
process.stderr.write(`↪️ Gemini 全部失败,回退到豆包 ${this.doubaoModel()}\n`);
|
|
206
|
-
const response = await doubao.run({
|
|
207
|
-
localPath
|
|
293
|
+
const response = await this.tracked(this.doubaoRoute(task), () => doubao.run({
|
|
294
|
+
localPath,
|
|
208
295
|
localMime: request.localMime ?? "video/mp4",
|
|
209
296
|
user: request.user,
|
|
210
297
|
fps: request.fps,
|
|
@@ -212,8 +299,7 @@ export class ModelRouter {
|
|
|
212
299
|
...(request.system ? { system: request.system } : {}),
|
|
213
300
|
...(request.responseJsonSchema ? { responseJsonSchema: request.responseJsonSchema } : {}),
|
|
214
301
|
...(request.signal ? { signal: request.signal } : {}),
|
|
215
|
-
});
|
|
216
|
-
this.recordCall(task, response.attempts, response.usage);
|
|
302
|
+
}));
|
|
217
303
|
return response;
|
|
218
304
|
}
|
|
219
305
|
catch (error) {
|
|
@@ -257,18 +343,16 @@ export class ModelRouter {
|
|
|
257
343
|
if (spec.mode !== "text")
|
|
258
344
|
throw configRuntimeError("The task does not support text generation.", ["text task"], [`task: ${task}`]);
|
|
259
345
|
const route = this.resolve(task);
|
|
260
|
-
const
|
|
261
|
-
this.
|
|
262
|
-
return response;
|
|
346
|
+
const adapter = this.adapter(route);
|
|
347
|
+
return this.tracked(route.info, () => adapter.generateText({ ...request, maxOutputTokens: spec.maxOutputTokens }));
|
|
263
348
|
}
|
|
264
349
|
async generateTool(task, request) {
|
|
265
350
|
const spec = LLM_TASK_REGISTRY[task];
|
|
266
351
|
if (spec.mode !== "tool")
|
|
267
352
|
throw configRuntimeError("The task does not support tool generation.", ["tool task"], [`task: ${task}`]);
|
|
268
353
|
const route = this.resolve(task);
|
|
269
|
-
const
|
|
270
|
-
this.
|
|
271
|
-
return response;
|
|
354
|
+
const adapter = this.adapter(route);
|
|
355
|
+
return this.tracked(route.info, () => adapter.generateTool({ ...request, maxOutputTokens: spec.maxOutputTokens }));
|
|
272
356
|
}
|
|
273
357
|
}
|
|
274
358
|
export function createLlmExecutor(explicitConfigPath) {
|