media-analysis-mcp 2.0.0

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/dist/server.js ADDED
@@ -0,0 +1,290 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import { createMediaAnalyzer, } from "./bailian.js";
4
+ import { loadConfig, readBootstrapServerName } from "./config.js";
5
+ import { formatConfigSourceLog, inspectConfig } from "./config-lookup.js";
6
+ import { agentErrorStructuredContent, agentErrorText, configToMediaError, MediaError, } from "./errors.js";
7
+ import { closeResolvedMedia, resolveMedia } from "./media.js";
8
+ import { pathVariants, redactKnownPaths, sanitizeSensitiveText } from "./sanitize.js";
9
+ import { printableRequestId } from "./sse.js";
10
+ import { createCachedUploader } from "./upload-cache.js";
11
+ import { createTemporaryUploader } from "./upload.js";
12
+ import { PACKAGE_VERSION } from "./version.js";
13
+ export const TOOL_NAME = "analyze_media";
14
+ export const MAX_PROMPT_CHARS = 8000;
15
+ export const PROGRESS_TOTAL = 4;
16
+ const INVOCATION_GUIDANCE = "只在用户明确要求用 MCP(本工具)分析媒体时才调用。用户只是要你处理媒体(剪辑、转码、截图、看画面、写文案等)而没点名要用本工具时,走宿主自己的流程,不要自动调用。";
17
+ const CAPABILITY_GUIDANCE = "本工具把本地 MP4/MOV 视频(画面与内嵌声音一起)、本地 MP3 音频或公开 HTTPS 视频 URL 交给媒体模型分析,返回模型的文本回答。不要先自行抽帧或抽音频。prompt 必填:请把用户的分析要求写进去;服务端不补写分析提纲,也不改写你的问题。";
18
+ const LIMITS_GUIDANCE = "一次最多 1 小时、本地最大 1024 MiB;这是抽样理解,不是帧级或逐字核验,精确转场与半秒内 J/L-cut 请先切 5–30 秒片段。本地文件须已获授权:位于 MEDIA_ALLOWED_ROOTS 内,或该安装已开启 MEDIA_ALLOW_ANY_LOCAL_FILE(被拒绝时请提示用户改配置,不要换路径重试)。大文件上行慢时改用公开 HTTPS。";
19
+ const DELIVERY_GUIDANCE = "长回答请先保存工具结果,正文只读取 content 文本或 structuredContent.answer 中的一份,避免重复打印整个结果。宿主显示截断时,先从已保存结果分段读取;不要仅因显示截断重新调用媒体分析。宿主无法保留或取回完整结果时,明确说明交付限制。";
20
+ const SERVER_INSTRUCTIONS = `${INVOCATION_GUIDANCE}${CAPABILITY_GUIDANCE}${LIMITS_GUIDANCE}${DELIVERY_GUIDANCE}`;
21
+ const TOOL_DESCRIPTION = `${INVOCATION_GUIDANCE}${CAPABILITY_GUIDANCE}它会联合分析视频画面与内嵌声音,或单独分析音频。${LIMITS_GUIDANCE}${DELIVERY_GUIDANCE}`;
22
+ export const PROGRESS_VALIDATE_START = "正在校验媒体";
23
+ export const PROGRESS_VALIDATE_DONE = "媒体校验完成";
24
+ export const PROGRESS_UPLOAD_DONE = "上传完成";
25
+ export const PROGRESS_ANALYZE_START = "正在等待模型回答";
26
+ export const PROGRESS_ANALYZE_DONE = "分析完成";
27
+ export async function notifyProgress(extra, progress, total, message) {
28
+ const token = extra._meta?.progressToken;
29
+ if (token === undefined) {
30
+ return;
31
+ }
32
+ try {
33
+ await extra.sendNotification({
34
+ method: "notifications/progress",
35
+ params: { progressToken: token, progress, total, message },
36
+ });
37
+ }
38
+ catch {
39
+ // Hosts that ignore progress must still complete the tool call.
40
+ }
41
+ }
42
+ const aborters = new WeakMap();
43
+ /** Called on SIGINT/SIGTERM and stdin close to stop in-flight upload or analysis. */
44
+ export function abortActiveAnalysis(server) {
45
+ aborters.get(server)?.();
46
+ }
47
+ function throwIfCancelled(signal) {
48
+ if (signal.aborted) {
49
+ throw new MediaError({ code: "MEDIA_ANALYSIS_CANCELLED", stage: "aborted" });
50
+ }
51
+ }
52
+ /**
53
+ * Only facts this run actually established. A missing field means unknown — it is
54
+ * never filled with `false` to look like a completed check. HTTPS input is not
55
+ * downloaded or probed, so it carries no container, duration or track fact.
56
+ */
57
+ export function mediaFacts(media) {
58
+ if (media.kind === "https") {
59
+ return { kind: media.mediaKind };
60
+ }
61
+ const facts = { kind: media.mediaKind, container: media.container };
62
+ if (media.durationSeconds !== undefined) {
63
+ facts.duration_seconds = media.durationSeconds;
64
+ }
65
+ if (media.mediaKind === "video" && media.trackProbeComplete === true) {
66
+ facts.audio_track_present = media.audioCodecs.length > 0;
67
+ }
68
+ return facts;
69
+ }
70
+ function limitationsFor(media) {
71
+ if (media.kind === "https") {
72
+ return [
73
+ "远端视频由应用服务抓取,本机没有下载或探测它的内容、格式与时长;结果只代表模型这次的回答。",
74
+ ];
75
+ }
76
+ if (media.mediaKind === "audio") {
77
+ return [
78
+ "音频由模型分析,本机未逐句转写,也未核对模型自报的段数与时间点;本地帧校验只证明文件含可解码的 MPEG 音频,不代表模型确认听到或听准了内容。",
79
+ ];
80
+ }
81
+ if (media.trackProbeComplete !== true) {
82
+ return [
83
+ "画面与内嵌音频由模型分析,本机未逐帧核验;本地未能完整读取轨道结构,音轨存在性未确认。",
84
+ ];
85
+ }
86
+ if (media.audioCodecs.length === 0) {
87
+ return ["画面与内嵌音频由模型分析,本机未逐帧核验;本地未发现音轨,本次只分析画面。"];
88
+ }
89
+ return [
90
+ "画面与内嵌音频由模型分析,本机未逐帧核验;本地轨道探测只证明文件含可解码音轨,不代表模型确认听到声音。",
91
+ ];
92
+ }
93
+ function usageOut(usage) {
94
+ if (usage === undefined) {
95
+ return undefined;
96
+ }
97
+ const out = {};
98
+ if (usage.prompt_tokens !== undefined)
99
+ out.prompt_tokens = usage.prompt_tokens;
100
+ if (usage.completion_tokens !== undefined)
101
+ out.completion_tokens = usage.completion_tokens;
102
+ if (usage.total_tokens !== undefined)
103
+ out.total_tokens = usage.total_tokens;
104
+ return Object.keys(out).length > 0 ? out : undefined;
105
+ }
106
+ function okResult(args) {
107
+ // Deterministic first (the Agent's own path, whatever its characters), then the
108
+ // generic rules for paths this call never saw.
109
+ const answer = sanitizeSensitiveText(redactKnownPaths(args.answer, args.redactPaths));
110
+ const request = { provider: "dashscope", model: args.model };
111
+ if (args.uploadReused !== undefined) {
112
+ request.upload_reused = args.uploadReused;
113
+ }
114
+ const structured = {
115
+ ok: true,
116
+ answer,
117
+ media: mediaFacts(args.media),
118
+ request,
119
+ limitations: limitationsFor(args.media),
120
+ };
121
+ const usage = usageOut(args.usage);
122
+ if (usage !== undefined) {
123
+ structured.usage = usage;
124
+ }
125
+ return {
126
+ content: [{ type: "text", text: answer }],
127
+ isError: false,
128
+ structuredContent: structured,
129
+ };
130
+ }
131
+ function fail(err) {
132
+ const mapped = err instanceof MediaError ? err : configToMediaError(err);
133
+ if (mapped instanceof MediaError) {
134
+ const requestId = printableRequestId(mapped.requestId ?? "") ?? "";
135
+ process.stderr.write(`${TOOL_NAME} code=${mapped.code} stage=${mapped.stage} http=${String(mapped.httpStatus ?? "")} request_id=${requestId} parse_reason=${String(mapped.diagnostic.parse_reason ?? "")} events=${String(mapped.diagnostic.received_sse_events ?? "unknown")} usage_prompt=${String(mapped.diagnostic.prompt_tokens ?? "unknown")} usage_completion=${String(mapped.diagnostic.completion_tokens ?? "unknown")} usage_total=${String(mapped.diagnostic.total_tokens ?? "unknown")}\n`);
136
+ }
137
+ return {
138
+ content: [{ type: "text", text: agentErrorText(mapped) }],
139
+ structuredContent: agentErrorStructuredContent(mapped),
140
+ isError: true,
141
+ };
142
+ }
143
+ /**
144
+ * The Agent's question is never rewritten, expanded or cut; only the surrounding
145
+ * whitespace is dropped before the length check. An empty or oversized prompt is an
146
+ * input error, not something the server substitutes or truncates.
147
+ */
148
+ function readPrompt(raw) {
149
+ const trimmed = raw.trim();
150
+ if (trimmed.length === 0 || trimmed.length > MAX_PROMPT_CHARS) {
151
+ throw new MediaError({ code: "INVALID_MEDIA_INPUT", stage: "received" });
152
+ }
153
+ return trimmed;
154
+ }
155
+ export function createServer(cfg, deps = {}) {
156
+ const serverName = cfg?.serverName ?? readBootstrapServerName();
157
+ let runtime = cfg;
158
+ let analyzer = deps.analyzer ?? (cfg !== undefined ? createMediaAnalyzer(cfg) : undefined);
159
+ let uploader = cfg !== undefined
160
+ ? createCachedUploader(cfg, deps.uploader ?? createTemporaryUploader(cfg))
161
+ : undefined;
162
+ let busy = false;
163
+ let active;
164
+ const server = new McpServer({
165
+ name: serverName,
166
+ version: PACKAGE_VERSION,
167
+ }, { instructions: SERVER_INSTRUCTIONS });
168
+ aborters.set(server, () => {
169
+ active?.abort();
170
+ });
171
+ const resolveRuntime = () => {
172
+ if (runtime !== undefined) {
173
+ return runtime;
174
+ }
175
+ try {
176
+ runtime = loadConfig();
177
+ process.stderr.write(`${formatConfigSourceLog(inspectConfig())}\n`);
178
+ return runtime;
179
+ }
180
+ catch (err) {
181
+ throw configToMediaError(err);
182
+ }
183
+ };
184
+ const resolveAnalyzer = (rt) => {
185
+ if (analyzer === undefined) {
186
+ analyzer = createMediaAnalyzer(rt);
187
+ }
188
+ return analyzer;
189
+ };
190
+ const resolveUploader = (rt) => {
191
+ if (uploader === undefined) {
192
+ uploader = createCachedUploader(rt, deps.uploader ?? createTemporaryUploader(rt));
193
+ }
194
+ return uploader;
195
+ };
196
+ server.registerTool(TOOL_NAME, {
197
+ description: TOOL_DESCRIPTION,
198
+ inputSchema: {
199
+ media: z.string().min(1).describe("本地绝对 MP4/MOV/MP3 路径,或公开 HTTPS 视频 URL"),
200
+ prompt: z
201
+ .string()
202
+ .min(1)
203
+ .max(MAX_PROMPT_CHARS)
204
+ .describe("要问媒体模型的问题;必填,服务端不会替你补写提纲"),
205
+ },
206
+ }, async (args, extra) => {
207
+ if (busy) {
208
+ return fail(new MediaError({ code: "MEDIA_ANALYSIS_BUSY", stage: "received" }));
209
+ }
210
+ busy = true;
211
+ const controller = new AbortController();
212
+ active = controller;
213
+ const hostSignal = extra.signal;
214
+ const onHostAbort = () => {
215
+ controller.abort();
216
+ };
217
+ if (hostSignal.aborted) {
218
+ controller.abort();
219
+ }
220
+ else {
221
+ hostSignal.addEventListener("abort", onHostAbort, { once: true });
222
+ }
223
+ try {
224
+ const rt = resolveRuntime();
225
+ const activeAnalyzer = resolveAnalyzer(rt);
226
+ const activeUploader = resolveUploader(rt);
227
+ const prompt = readPrompt(args.prompt);
228
+ await notifyProgress(extra, 0, PROGRESS_TOTAL, PROGRESS_VALIDATE_START);
229
+ const resolved = await resolveMedia(args.media, rt);
230
+ try {
231
+ throwIfCancelled(controller.signal);
232
+ await notifyProgress(extra, 1, PROGRESS_TOTAL, PROGRESS_VALIDATE_DONE);
233
+ let provider;
234
+ let uploadReused;
235
+ if (resolved.kind === "https") {
236
+ provider = { url: resolved.url, format: "video", requiresOssResolve: false };
237
+ }
238
+ else {
239
+ const uploaded = await activeUploader.upload(resolved, controller.signal);
240
+ uploadReused = uploaded.reused;
241
+ provider = {
242
+ url: uploaded.url,
243
+ format: resolved.mediaKind === "audio" ? "mp3" : "video",
244
+ requiresOssResolve: uploaded.requiresOssResolve,
245
+ };
246
+ await notifyProgress(extra, 2, PROGRESS_TOTAL, PROGRESS_UPLOAD_DONE);
247
+ throwIfCancelled(controller.signal);
248
+ }
249
+ await notifyProgress(extra, 3, PROGRESS_TOTAL, PROGRESS_ANALYZE_START);
250
+ const started = performance.now();
251
+ const result = await activeAnalyzer.analyze(provider, { prompt }, controller.signal);
252
+ process.stderr.write(`${TOOL_NAME}_diag requests=1 elapsed_ms=${String(Math.max(0, Math.round(performance.now() - started)))} request_id=${printableRequestId(result.requestId ?? "") ?? ""} finish_reason=${result.finishReason ?? "unknown"} usage_prompt=${String(result.usage?.prompt_tokens ?? "unknown")} usage_completion=${String(result.usage?.completion_tokens ?? "unknown")} usage_total=${String(result.usage?.total_tokens ?? "unknown")}\n`);
253
+ if (result.answer.trim().length === 0) {
254
+ throw new MediaError({ code: "PROVIDER_RESPONSE_INVALID", stage: "analyzing" });
255
+ }
256
+ await notifyProgress(extra, PROGRESS_TOTAL, PROGRESS_TOTAL, PROGRESS_ANALYZE_DONE);
257
+ process.stderr.write(`${TOOL_NAME} ok request_id=${printableRequestId(result.requestId ?? "") ?? ""} events=${String(result.receivedEvents)}\n`);
258
+ return okResult({
259
+ answer: result.answer,
260
+ media: resolved,
261
+ model: rt.model,
262
+ uploadReused,
263
+ usage: result.usage,
264
+ redactPaths: resolved.kind === "local" ? pathVariants(args.media) : [],
265
+ });
266
+ }
267
+ finally {
268
+ await closeResolvedMedia(resolved);
269
+ }
270
+ }
271
+ catch (err) {
272
+ // Cancellation can surface from any stage — policy fetch, multipart upload,
273
+ // retry backoff — as whatever failure that layer raises. If this run's
274
+ // controller is aborted, the caller cancelled; report that instead of the
275
+ // stage-specific error the layer below produced.
276
+ return fail(controller.signal.aborted
277
+ ? new MediaError({ code: "MEDIA_ANALYSIS_CANCELLED", stage: "aborted" })
278
+ : err);
279
+ }
280
+ finally {
281
+ hostSignal.removeEventListener("abort", onHostAbort);
282
+ if (active === controller) {
283
+ active = undefined;
284
+ }
285
+ busy = false;
286
+ }
287
+ });
288
+ return server;
289
+ }
290
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/dist/sse.js ADDED
@@ -0,0 +1,327 @@
1
+ import { z } from "zod";
2
+ import { MediaError } from "./errors.js";
3
+ import { mapProviderError, safeProviderRequestId } from "./provider-error.js";
4
+ const usageSchema = z.looseObject({
5
+ prompt_tokens: z.number().optional(),
6
+ completion_tokens: z.number().optional(),
7
+ total_tokens: z.number().optional(),
8
+ });
9
+ const deltaSchema = z.looseObject({
10
+ content: z.string().nullish(),
11
+ role: z.string().optional(),
12
+ });
13
+ const choiceSchema = z.looseObject({
14
+ delta: deltaSchema.optional(),
15
+ finish_reason: z.string().nullable().optional(),
16
+ });
17
+ const eventSchema = z.looseObject({
18
+ id: z.string().optional(),
19
+ request_id: z.string().optional(),
20
+ choices: z.array(choiceSchema).optional(),
21
+ usage: usageSchema.nullish(),
22
+ });
23
+ export const MAX_SSE_BUFFER_BYTES = 4 * 1024 * 1024;
24
+ export function printableRequestId(raw) {
25
+ let out = "";
26
+ for (const char of raw) {
27
+ const code = char.codePointAt(0);
28
+ if (code === undefined || code < 0x20 || code === 0x7f) {
29
+ continue;
30
+ }
31
+ out += char;
32
+ }
33
+ return out.length > 0 ? out : undefined;
34
+ }
35
+ function invalid(reason, extra) {
36
+ return new MediaError({
37
+ code: "PROVIDER_RESPONSE_INVALID",
38
+ stage: "analyzing",
39
+ diagnostic: { parse_reason: reason, ...extra },
40
+ });
41
+ }
42
+ function valueKind(value) {
43
+ if (value === null) {
44
+ return "null";
45
+ }
46
+ if (Array.isArray(value)) {
47
+ return "array";
48
+ }
49
+ return typeof value;
50
+ }
51
+ function asRecord(value) {
52
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
53
+ return undefined;
54
+ }
55
+ return value;
56
+ }
57
+ const SHAPE_KEY_PATTERN = /^[A-Za-z0-9_]{1,32}$/;
58
+ const SHAPE_KEY_LIMIT = 12;
59
+ /**
60
+ * Shape diagnostics reach the Agent, so only plain field-name keys are echoed
61
+ * (bounded in count): a hostile endpoint must not be able to smuggle prose
62
+ * through key names.
63
+ */
64
+ function safeKeys(rec) {
65
+ const keys = Object.keys(rec).filter((key) => SHAPE_KEY_PATTERN.test(key));
66
+ const dropped = Object.keys(rec).length - keys.length;
67
+ const shown = keys.sort().slice(0, SHAPE_KEY_LIMIT);
68
+ const overflow = keys.length - shown.length;
69
+ const omitted = dropped + overflow;
70
+ return omitted > 0 ? `${shown.join(",")},+${String(omitted)}_other` : shown.join(",");
71
+ }
72
+ function eventShape(json) {
73
+ const rec = asRecord(json);
74
+ if (rec === undefined) {
75
+ return `root=${valueKind(json)}`;
76
+ }
77
+ const parts = [`keys=${safeKeys(rec)}`];
78
+ if ("id" in rec) {
79
+ parts.push(`id=${valueKind(rec.id)}`);
80
+ }
81
+ if ("choices" in rec) {
82
+ const choices = rec.choices;
83
+ parts.push(`choices=${Array.isArray(choices) ? `array:${String(choices.length)}` : valueKind(choices)}`);
84
+ const first = Array.isArray(choices) ? asRecord(choices[0]) : undefined;
85
+ if (first !== undefined) {
86
+ parts.push(`choice_keys=${safeKeys(first)}`);
87
+ if ("delta" in first) {
88
+ const delta = asRecord(first.delta);
89
+ if (delta !== undefined) {
90
+ parts.push(`delta_keys=${safeKeys(delta)}`);
91
+ if ("content" in delta) {
92
+ parts.push(`content=${valueKind(delta.content)}`);
93
+ }
94
+ }
95
+ else {
96
+ parts.push(`delta=${valueKind(first.delta)}`);
97
+ }
98
+ }
99
+ if ("finish_reason" in first) {
100
+ parts.push(`finish_reason=${valueKind(first.finish_reason)}`);
101
+ }
102
+ }
103
+ }
104
+ if ("usage" in rec) {
105
+ parts.push(`usage=${valueKind(rec.usage)}`);
106
+ }
107
+ return parts.join(";");
108
+ }
109
+ function schemaReason(json) {
110
+ const rec = asRecord(json);
111
+ const choices = rec?.choices;
112
+ const first = Array.isArray(choices) ? asRecord(choices[0]) : undefined;
113
+ const delta = first === undefined ? undefined : asRecord(first.delta);
114
+ const content = delta?.content;
115
+ return Array.isArray(content) ? "array_content" : "schema";
116
+ }
117
+ function combinedByte(pending, incoming, index) {
118
+ if (index < pending.length) {
119
+ return pending[index];
120
+ }
121
+ return incoming[index - pending.length];
122
+ }
123
+ function findEventBoundaryBytes(pending, incoming) {
124
+ const total = pending.length + incoming.byteLength;
125
+ for (let i = 0; i + 1 < total; i += 1) {
126
+ const a = combinedByte(pending, incoming, i);
127
+ const b = combinedByte(pending, incoming, i + 1);
128
+ if (a === 0x0d && b === 0x0a) {
129
+ const c = combinedByte(pending, incoming, i + 2);
130
+ const d = combinedByte(pending, incoming, i + 3);
131
+ if (c === 0x0d && d === 0x0a) {
132
+ return { eventBytes: i + 4, delim: 4 };
133
+ }
134
+ }
135
+ if (a === 0x0a && b === 0x0a) {
136
+ return { eventBytes: i + 2, delim: 2 };
137
+ }
138
+ }
139
+ return undefined;
140
+ }
141
+ function sliceCombined(pending, incoming, start, end) {
142
+ const pendingSliceEnd = Math.min(end, pending.length);
143
+ const parts = [];
144
+ if (start < pending.length) {
145
+ parts.push(pending.subarray(start, pendingSliceEnd));
146
+ }
147
+ if (end > pending.length) {
148
+ const incomingStart = Math.max(0, start - pending.length);
149
+ parts.push(Buffer.from(incoming.subarray(incomingStart, end - pending.length)));
150
+ }
151
+ if (parts.length === 0) {
152
+ return Buffer.alloc(0);
153
+ }
154
+ const first = parts[0];
155
+ if (parts.length === 1 && first !== undefined) {
156
+ return first;
157
+ }
158
+ return Buffer.concat(parts);
159
+ }
160
+ function dataPayload(block) {
161
+ const lines = block.split(/\r?\n/);
162
+ const dataLines = [];
163
+ for (const line of lines) {
164
+ if (line.startsWith(":") || line.length === 0) {
165
+ continue;
166
+ }
167
+ if (line.startsWith("data:")) {
168
+ const value = line.slice(5);
169
+ dataLines.push(value.startsWith(" ") ? value.slice(1) : value);
170
+ }
171
+ }
172
+ if (dataLines.length === 0) {
173
+ return undefined;
174
+ }
175
+ return dataLines.join("\n");
176
+ }
177
+ const THINK_BLOCK = /<think\b[^>]*>[\s\S]*?<\/think>/gi;
178
+ const THINK_OPEN = /<think\b[^>]*>/i;
179
+ /**
180
+ * Newer Qwen models with thinking on by default may stream the reasoning inside
181
+ * `delta.content` wrapped in `<think>…</think>` (others use a separate
182
+ * `reasoning_content` field, which this parser ignores). The reasoning is not
183
+ * part of the answer, so it is dropped here; an unterminated trailing block means
184
+ * the stream was cut before any answer arrived.
185
+ */
186
+ export function stripThinkingBlocks(text) {
187
+ const withoutBlocks = text.replace(THINK_BLOCK, "");
188
+ const open = withoutBlocks.search(THINK_OPEN);
189
+ return open >= 0 ? withoutBlocks.slice(0, open) : withoutBlocks;
190
+ }
191
+ export class SseParser {
192
+ pending = Buffer.alloc(0);
193
+ pieces = [];
194
+ answerBytes = 0;
195
+ receivedEvents = 0;
196
+ terminated = false;
197
+ finishReason;
198
+ usage;
199
+ requestId;
200
+ providerRequestId;
201
+ constructor(requestId) {
202
+ this.providerRequestId = safeProviderRequestId(requestId);
203
+ this.requestId = this.providerRequestId;
204
+ }
205
+ get sawText() {
206
+ return this.pieces.length > 0;
207
+ }
208
+ get eventCount() {
209
+ return this.receivedEvents;
210
+ }
211
+ push(chunk) {
212
+ let incoming = chunk;
213
+ while (incoming.byteLength > 0) {
214
+ const boundary = findEventBoundaryBytes(this.pending, incoming);
215
+ if (boundary === undefined) {
216
+ if (this.pending.length + incoming.byteLength > MAX_SSE_BUFFER_BYTES) {
217
+ throw invalid("sse_event_too_large", { received_sse_events: this.receivedEvents });
218
+ }
219
+ this.pending = Buffer.concat([this.pending, incoming]);
220
+ return;
221
+ }
222
+ if (boundary.eventBytes > MAX_SSE_BUFFER_BYTES) {
223
+ throw invalid("sse_event_too_large", { received_sse_events: this.receivedEvents });
224
+ }
225
+ const total = this.pending.length + incoming.byteLength;
226
+ const eventBuf = sliceCombined(this.pending, incoming, 0, boundary.eventBytes);
227
+ const rest = sliceCombined(this.pending, incoming, boundary.eventBytes, total);
228
+ this.pending = Buffer.alloc(0);
229
+ incoming = rest;
230
+ const block = eventBuf.subarray(0, eventBuf.length - boundary.delim).toString("utf8");
231
+ this.handleBlock(block);
232
+ }
233
+ }
234
+ finish() {
235
+ if (this.pending.length > 0) {
236
+ throw invalid("leftover", { received_sse_events: this.receivedEvents });
237
+ }
238
+ if (!this.terminated) {
239
+ throw invalid("unterminated", { received_sse_events: this.receivedEvents });
240
+ }
241
+ const raw = this.pieces.join("");
242
+ const text = stripThinkingBlocks(raw).trim();
243
+ if (text.length === 0) {
244
+ throw invalid(THINK_OPEN.test(raw) ? "reasoning_only" : "empty_text", {
245
+ received_sse_events: this.receivedEvents,
246
+ });
247
+ }
248
+ return {
249
+ text,
250
+ finishReason: this.finishReason,
251
+ receivedEvents: this.receivedEvents,
252
+ usage: this.usage,
253
+ requestId: this.requestId,
254
+ };
255
+ }
256
+ handleBlock(block) {
257
+ const payload = dataPayload(block);
258
+ if (payload === undefined) {
259
+ return;
260
+ }
261
+ this.receivedEvents += 1;
262
+ if (payload === "[DONE]") {
263
+ this.terminated = true;
264
+ return;
265
+ }
266
+ let json;
267
+ try {
268
+ json = JSON.parse(payload);
269
+ }
270
+ catch {
271
+ throw invalid("non_json", { received_sse_events: this.receivedEvents });
272
+ }
273
+ if (typeof json === "object" && json !== null && "error" in json) {
274
+ throw (mapProviderError(json, {
275
+ receivedEvents: this.receivedEvents,
276
+ ...(this.providerRequestId === undefined ? {} : { requestId: this.providerRequestId }),
277
+ }) ?? invalid("provider_error", { received_sse_events: this.receivedEvents }));
278
+ }
279
+ const parsed = eventSchema.safeParse(json);
280
+ if (!parsed.success) {
281
+ throw invalid(schemaReason(json), {
282
+ received_sse_events: this.receivedEvents,
283
+ event_shape: eventShape(json),
284
+ });
285
+ }
286
+ if (parsed.data.request_id !== undefined && this.requestId === undefined) {
287
+ this.requestId = safeProviderRequestId(parsed.data.request_id);
288
+ }
289
+ if (parsed.data.usage != null) {
290
+ this.usage = {
291
+ prompt_tokens: parsed.data.usage.prompt_tokens,
292
+ completion_tokens: parsed.data.usage.completion_tokens,
293
+ total_tokens: parsed.data.usage.total_tokens,
294
+ };
295
+ }
296
+ const choices = parsed.data.choices ?? [];
297
+ if (choices.length === 0) {
298
+ return;
299
+ }
300
+ const choice = choices[0];
301
+ if (choice === undefined) {
302
+ return;
303
+ }
304
+ const content = choice.delta?.content;
305
+ if (typeof content === "string" && content.length > 0) {
306
+ const add = Buffer.byteLength(content, "utf8");
307
+ if (this.answerBytes + add > MAX_SSE_BUFFER_BYTES) {
308
+ throw invalid("sse_answer_too_large", { received_sse_events: this.receivedEvents });
309
+ }
310
+ this.pieces.push(content);
311
+ this.answerBytes += add;
312
+ }
313
+ const reason = choice.finish_reason;
314
+ if (typeof reason === "string" && reason.length > 0) {
315
+ this.finishReason = reason;
316
+ this.terminated = true;
317
+ }
318
+ }
319
+ }
320
+ export async function aggregateSse(source) {
321
+ const parser = new SseParser();
322
+ for await (const chunk of source) {
323
+ parser.push(chunk);
324
+ }
325
+ return parser.finish();
326
+ }
327
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"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"}