longcat-ai-sdk-provider 0.0.3 → 0.0.5
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/index.js +131 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +131 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -45,6 +45,9 @@ function convertFinishReason(raw) {
|
|
|
45
45
|
if (raw === "length") {
|
|
46
46
|
return { unified: "length", raw };
|
|
47
47
|
}
|
|
48
|
+
if (raw === "tool_calls" || raw === "function_call") {
|
|
49
|
+
return { unified: "tool-calls", raw };
|
|
50
|
+
}
|
|
48
51
|
try {
|
|
49
52
|
const parsed = JSON.parse(raw);
|
|
50
53
|
if (parsed?.type === "abort") {
|
|
@@ -137,6 +140,37 @@ var LongcatChatLanguageModel = class {
|
|
|
137
140
|
body.audioRepetitionPenalty = this.settings.audioRepetitionPenalty;
|
|
138
141
|
}
|
|
139
142
|
}
|
|
143
|
+
if (options.tools?.length) {
|
|
144
|
+
body.tools = options.tools.map((tool) => ({
|
|
145
|
+
type: "function",
|
|
146
|
+
function: {
|
|
147
|
+
name: tool.type === "function" ? tool.name : tool.id,
|
|
148
|
+
description: tool.type === "function" ? tool.description : void 0,
|
|
149
|
+
parameters: tool.type === "function" ? tool.inputSchema : void 0,
|
|
150
|
+
strict: tool.type === "function" ? tool.strict : void 0
|
|
151
|
+
}
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
if (options.toolChoice) {
|
|
155
|
+
const choice = options.toolChoice;
|
|
156
|
+
switch (choice.type) {
|
|
157
|
+
case "auto":
|
|
158
|
+
body.tool_choice = "auto";
|
|
159
|
+
break;
|
|
160
|
+
case "none":
|
|
161
|
+
body.tool_choice = "none";
|
|
162
|
+
break;
|
|
163
|
+
case "required":
|
|
164
|
+
body.tool_choice = "required";
|
|
165
|
+
break;
|
|
166
|
+
case "tool":
|
|
167
|
+
body.tool_choice = {
|
|
168
|
+
type: "function",
|
|
169
|
+
function: { name: choice.toolName }
|
|
170
|
+
};
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
140
174
|
if (options.maxOutputTokens ?? this.settings.maxTokens) {
|
|
141
175
|
body.max_tokens = options.maxOutputTokens ?? this.settings.maxTokens;
|
|
142
176
|
}
|
|
@@ -183,6 +217,16 @@ var LongcatChatLanguageModel = class {
|
|
|
183
217
|
text: choice.message.content
|
|
184
218
|
});
|
|
185
219
|
}
|
|
220
|
+
if (choice?.message?.tool_calls?.length) {
|
|
221
|
+
for (const tc of choice.message.tool_calls) {
|
|
222
|
+
content.push({
|
|
223
|
+
type: "tool-call",
|
|
224
|
+
toolCallId: tc.id ?? `call_${Date.now()}`,
|
|
225
|
+
toolName: tc.function?.name ?? "",
|
|
226
|
+
input: tc.function?.arguments ?? "{}"
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
186
230
|
if (choice?.message?.audio) {
|
|
187
231
|
content.push({
|
|
188
232
|
type: "file",
|
|
@@ -210,7 +254,6 @@ var LongcatChatLanguageModel = class {
|
|
|
210
254
|
}
|
|
211
255
|
async doStream(options) {
|
|
212
256
|
const body = this.buildRequestBody(options, true);
|
|
213
|
-
console.log(JSON.stringify(body, null, 2));
|
|
214
257
|
const url = this.config.url({ path: "/chat/completions" });
|
|
215
258
|
const response = await (this.config.fetch ?? fetch)(url, {
|
|
216
259
|
method: "POST",
|
|
@@ -246,6 +289,9 @@ var LongcatChatLanguageModel = class {
|
|
|
246
289
|
let responseModel;
|
|
247
290
|
let responseTimestamp;
|
|
248
291
|
let emittedResponseMetadata = false;
|
|
292
|
+
const toolCallAccumulator = /* @__PURE__ */ new Map();
|
|
293
|
+
let activeToolCallIndex = null;
|
|
294
|
+
let toolCallIdCounter = 0;
|
|
249
295
|
const emitResponseMetadata = () => {
|
|
250
296
|
if (!emittedResponseMetadata) {
|
|
251
297
|
emittedResponseMetadata = true;
|
|
@@ -289,6 +335,21 @@ var LongcatChatLanguageModel = class {
|
|
|
289
335
|
currentReasoningId = null;
|
|
290
336
|
}
|
|
291
337
|
};
|
|
338
|
+
const finalizeToolCall = (index) => {
|
|
339
|
+
const tc = toolCallAccumulator.get(index);
|
|
340
|
+
if (!tc) return;
|
|
341
|
+
controller.enqueue({
|
|
342
|
+
type: "tool-input-end",
|
|
343
|
+
id: tc.id
|
|
344
|
+
});
|
|
345
|
+
controller.enqueue({
|
|
346
|
+
type: "tool-call",
|
|
347
|
+
toolCallId: tc.id,
|
|
348
|
+
toolName: tc.name,
|
|
349
|
+
input: tc.arguments
|
|
350
|
+
});
|
|
351
|
+
toolCallAccumulator.delete(index);
|
|
352
|
+
};
|
|
292
353
|
try {
|
|
293
354
|
controller.enqueue({
|
|
294
355
|
type: "stream-start",
|
|
@@ -303,7 +364,6 @@ var LongcatChatLanguageModel = class {
|
|
|
303
364
|
const lines = buffer.split("\n");
|
|
304
365
|
buffer = lines.pop() ?? "";
|
|
305
366
|
for (const line of lines) {
|
|
306
|
-
console.log({ line });
|
|
307
367
|
const rawdata = line.split("data:")[1];
|
|
308
368
|
if (!rawdata) {
|
|
309
369
|
continue;
|
|
@@ -353,6 +413,10 @@ var LongcatChatLanguageModel = class {
|
|
|
353
413
|
case "response.audio_transcript.done":
|
|
354
414
|
endReasoningBlock();
|
|
355
415
|
endTextBlock();
|
|
416
|
+
for (const idx of toolCallAccumulator.keys()) {
|
|
417
|
+
finalizeToolCall(idx);
|
|
418
|
+
}
|
|
419
|
+
activeToolCallIndex = null;
|
|
356
420
|
break;
|
|
357
421
|
case "response.audio.delta":
|
|
358
422
|
if (choice.delta.audio) {
|
|
@@ -404,10 +468,53 @@ var LongcatChatLanguageModel = class {
|
|
|
404
468
|
delta: choice.delta.content
|
|
405
469
|
});
|
|
406
470
|
}
|
|
471
|
+
if (choice.delta.tool_calls?.length) {
|
|
472
|
+
emitResponseMetadata();
|
|
473
|
+
endTextBlock();
|
|
474
|
+
endReasoningBlock();
|
|
475
|
+
for (const tc of choice.delta.tool_calls) {
|
|
476
|
+
const idx = tc.index ?? 0;
|
|
477
|
+
if (tc.id && !toolCallAccumulator.has(idx)) {
|
|
478
|
+
if (activeToolCallIndex !== null && activeToolCallIndex !== idx) {
|
|
479
|
+
finalizeToolCall(activeToolCallIndex);
|
|
480
|
+
}
|
|
481
|
+
activeToolCallIndex = idx;
|
|
482
|
+
const id = tc.id || `call_${++toolCallIdCounter}`;
|
|
483
|
+
toolCallAccumulator.set(idx, {
|
|
484
|
+
id,
|
|
485
|
+
name: tc.function?.name ?? "",
|
|
486
|
+
arguments: ""
|
|
487
|
+
});
|
|
488
|
+
controller.enqueue({
|
|
489
|
+
type: "tool-input-start",
|
|
490
|
+
id,
|
|
491
|
+
toolName: tc.function?.name ?? ""
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
const acc = toolCallAccumulator.get(idx);
|
|
495
|
+
if (acc) {
|
|
496
|
+
if (tc.function?.name) {
|
|
497
|
+
acc.name = tc.function.name;
|
|
498
|
+
}
|
|
499
|
+
if (tc.function?.arguments) {
|
|
500
|
+
acc.arguments += tc.function.arguments;
|
|
501
|
+
controller.enqueue({
|
|
502
|
+
type: "tool-input-delta",
|
|
503
|
+
id: acc.id,
|
|
504
|
+
delta: tc.function.arguments
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
407
510
|
if (choice.finish_reason) {
|
|
408
511
|
lastFinishReason = choice.finish_reason;
|
|
409
512
|
endReasoningBlock();
|
|
410
513
|
endTextBlock();
|
|
514
|
+
if (activeToolCallIndex !== null) {
|
|
515
|
+
finalizeToolCall(activeToolCallIndex);
|
|
516
|
+
activeToolCallIndex = null;
|
|
517
|
+
}
|
|
411
518
|
}
|
|
412
519
|
}
|
|
413
520
|
} catch {
|
|
@@ -492,22 +599,31 @@ var LongcatChatLanguageModel = class {
|
|
|
492
599
|
}
|
|
493
600
|
} else if (role === "assistant") {
|
|
494
601
|
let text = "";
|
|
602
|
+
const toolCalls = [];
|
|
495
603
|
for (const part of message.content) {
|
|
496
604
|
if (part.type === "text") {
|
|
497
605
|
text += part.text;
|
|
606
|
+
} else if (part.type === "tool-call") {
|
|
607
|
+
toolCalls.push({
|
|
608
|
+
id: part.toolCallId,
|
|
609
|
+
type: "function",
|
|
610
|
+
function: {
|
|
611
|
+
name: part.toolName,
|
|
612
|
+
arguments: typeof part.input === "string" ? part.input : JSON.stringify(part.input)
|
|
613
|
+
}
|
|
614
|
+
});
|
|
498
615
|
}
|
|
499
616
|
}
|
|
617
|
+
const assistantMsg = { role: "assistant" };
|
|
500
618
|
if (this.isOmniModel) {
|
|
501
|
-
|
|
502
|
-
role: "assistant",
|
|
503
|
-
content: [{ type: "text", text }]
|
|
504
|
-
});
|
|
619
|
+
assistantMsg.content = text ? [{ type: "text", text }] : null;
|
|
505
620
|
} else {
|
|
506
|
-
|
|
507
|
-
role: "assistant",
|
|
508
|
-
content: text
|
|
509
|
-
});
|
|
621
|
+
assistantMsg.content = text || null;
|
|
510
622
|
}
|
|
623
|
+
if (toolCalls.length > 0) {
|
|
624
|
+
assistantMsg.tool_calls = toolCalls;
|
|
625
|
+
}
|
|
626
|
+
messages.push(assistantMsg);
|
|
511
627
|
} else if (role === "tool") {
|
|
512
628
|
for (const toolResult of message.content) {
|
|
513
629
|
if (toolResult.type === "tool-result") {
|
|
@@ -520,17 +636,11 @@ var LongcatChatLanguageModel = class {
|
|
|
520
636
|
} else {
|
|
521
637
|
contentValue = String(output);
|
|
522
638
|
}
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
} else {
|
|
529
|
-
messages.push({
|
|
530
|
-
role: "user",
|
|
531
|
-
content: contentValue
|
|
532
|
-
});
|
|
533
|
-
}
|
|
639
|
+
messages.push({
|
|
640
|
+
role: "tool",
|
|
641
|
+
tool_call_id: toolResult.toolCallId,
|
|
642
|
+
content: contentValue
|
|
643
|
+
});
|
|
534
644
|
}
|
|
535
645
|
}
|
|
536
646
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/longcat-provider.ts","../src/longcat-chat-language-model.ts"],"sourcesContent":["export { createLongcat, longcat } from './longcat-provider';\nexport { LongcatChatLanguageModel } from './longcat-chat-language-model';\nexport type {\n LongcatProvider,\n LongcatProviderSettings,\n} from './longcat-provider';\nexport type {\n LongcatChatModelId,\n LongcatChatSettings,\n LongcatAudioConfig,\n} from './longcat-chat-settings';\n","import { LanguageModelV3 } from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { LongcatChatLanguageModel } from './longcat-chat-language-model';\nimport type { LongcatChatModelId, LongcatChatSettings } from './longcat-chat-settings';\nimport type { LongcatChatConfig } from './longcat-chat-language-model';\n\nexport interface LongcatProviderSettings {\n apiKey?: string;\n baseURL?: string;\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface LongcatProvider {\n (\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ): LanguageModelV3;\n\n chatModel(\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ): LanguageModelV3;\n}\n\nexport function createLongcat(\n options: LongcatProviderSettings = {},\n): LongcatProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.longcat.chat/openai/v1',\n );\n\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'LONGCAT_API_KEY',\n description: 'Longcat API key',\n })}`,\n ...options.headers,\n });\n\n const config: LongcatChatConfig = {\n provider: 'longcat',\n url: ({ path }) => {\n const url = new URL(`${baseURL}${path}`);\n if (options.queryParams) {\n url.search = new URLSearchParams(options.queryParams).toString();\n }\n return url.toString();\n },\n headers: getHeaders,\n fetch: options.fetch,\n };\n\n const createChatModel = (\n modelId: LongcatChatModelId,\n settings: LongcatChatSettings = {},\n ) => {\n return new LongcatChatLanguageModel(\n modelId,\n settings,\n config,\n );\n };\n\n const provider = (\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ) => createChatModel(modelId, settings);\n\n provider.chatModel = createChatModel;\n\n return provider;\n}\n\nexport const longcat = createLongcat();\n","import {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Prompt,\n LanguageModelV3StreamPart,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n LanguageModelV3Content,\n LanguageModelV3Text,\n LanguageModelV3File,\n LanguageModelV3FilePart,\n} from \"@ai-sdk/provider\";\nimport { convertUint8ArrayToBase64 } from \"@ai-sdk/provider-utils\";\nimport type {\n LongcatChatModelId,\n LongcatChatSettings,\n} from \"./longcat-chat-settings\";\n\nexport interface LongcatChatConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: () => Record<string, string>;\n fetch?: typeof fetch;\n}\n\ninterface LongcatResponseChunk {\n id?: string;\n object?: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string | null;\n reasoning_content?: string | null;\n audio?: string | null;\n type?: string;\n turn_id?: string;\n response_id?: string;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n session_id?: string;\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nfunction convertFinishReason(\n raw: string | null | undefined,\n): LanguageModelV3FinishReason {\n if (raw === \"stop\" || raw == null) {\n return { unified: \"stop\", raw: raw ?? undefined };\n }\n if (raw === \"length\") {\n return { unified: \"length\", raw };\n }\n try {\n const parsed = JSON.parse(raw);\n if (parsed?.type === \"abort\") {\n return { unified: \"stop\", raw };\n }\n } catch {\n // not JSON, fall through\n }\n return { unified: \"other\", raw };\n}\n\nfunction makeUsage(\n promptTokens?: number,\n completionTokens?: number,\n totalTokens?: number,\n) {\n return {\n inputTokens: {\n total: promptTokens ?? undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens ?? undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: {\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n total_tokens: totalTokens,\n },\n };\n}\n\nfunction mediaTypeToOmniType(\n mediaType: string,\n): \"input_image\" | \"input_audio\" | \"input_video\" {\n if (mediaType.startsWith(\"image/\")) return \"input_image\";\n if (mediaType.startsWith(\"audio/\")) return \"input_audio\";\n if (mediaType.startsWith(\"video/\")) return \"input_video\";\n return \"input_image\";\n}\n\nfunction formatFromMediaType(mediaType: string): string {\n const parts = mediaType.split(\"/\");\n return parts[1] ?? mediaType;\n}\n\nexport class LongcatChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\" as const;\n readonly modelId: string;\n readonly settings: LongcatChatSettings;\n readonly supportedUrls:\n | PromiseLike<Record<string, RegExp[]>>\n | Record<string, RegExp[]> = {\n \"image/*\": [/.*/],\n \"audio/*\": [/.*/],\n \"video/*\": [/.*/],\n };\n\n private readonly config: LongcatChatConfig;\n\n constructor(\n modelId: LongcatChatModelId,\n settings: LongcatChatSettings,\n config: LongcatChatConfig,\n ) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get isOmniModel(): boolean {\n return this.modelId.toLowerCase().includes(\"omni\");\n }\n\n private buildRequestBody(\n options: LanguageModelV3CallOptions,\n stream: boolean,\n outputModalities?: string[],\n ): Record<string, unknown> {\n const messages = this.convertToLongcatMessages(options.prompt);\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages,\n stream,\n output_modalities: outputModalities ?? [\"text\"],\n };\n\n if (this.isOmniModel) {\n if (this.settings.sessionId) {\n body.sessionId = this.settings.sessionId;\n }\n if (this.settings.audio) {\n const audioConfig: Record<string, unknown> = {};\n if (this.settings.audio.voice)\n audioConfig.voice = this.settings.audio.voice;\n if (this.settings.audio.speed)\n audioConfig.speed = this.settings.audio.speed;\n if (this.settings.audio.volume)\n audioConfig.volume = this.settings.audio.volume;\n if (this.settings.audio.outputAudioSamplerate) {\n audioConfig.output_audio_samplerate =\n this.settings.audio.outputAudioSamplerate;\n }\n body.audio = audioConfig;\n }\n if (this.settings.outputModalities) {\n body.output_modalities = this.settings.outputModalities;\n }\n if (this.settings.textRepetitionPenalty) {\n body.textRepetitionPenalty = this.settings.textRepetitionPenalty;\n }\n if (this.settings.audioRepetitionPenalty) {\n body.audioRepetitionPenalty = this.settings.audioRepetitionPenalty;\n }\n }\n\n if (options.maxOutputTokens ?? this.settings.maxTokens) {\n body.max_tokens = options.maxOutputTokens ?? this.settings.maxTokens;\n }\n if (options.temperature ?? this.settings.temperature) {\n body.temperature = options.temperature ?? this.settings.temperature;\n }\n if (this.isOmniModel) {\n if (options.topP ?? this.settings.topP) {\n body.topP = options.topP ?? this.settings.topP;\n }\n if (options.topK ?? this.settings.topK) {\n body.topK = options.topK ?? this.settings.topK;\n }\n } else {\n if (options.topP ?? this.settings.topP) {\n body.top_p = options.topP ?? this.settings.topP;\n }\n }\n\n return body;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const body = this.buildRequestBody(options, false);\n\n const url = this.config.url({ path: \"/chat/completions\" });\n const response = await (this.config.fetch ?? fetch)(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers(),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\n `Longcat API error: ${response.status} ${response.statusText} - ${text}`,\n );\n }\n\n const json = await response.json();\n const choice = json.choices?.[0];\n\n const content: LanguageModelV3Content[] = [];\n if (choice?.message?.content) {\n content.push({\n type: \"text\",\n text: choice.message.content,\n } as LanguageModelV3Text);\n }\n if (choice?.message?.audio) {\n content.push({\n type: \"file\",\n mediaType: \"audio/wav\",\n data: choice.message.audio,\n } as LanguageModelV3File);\n }\n\n return {\n content,\n finishReason: convertFinishReason(choice?.finish_reason),\n usage: makeUsage(\n json.usage?.prompt_tokens,\n json.usage?.completion_tokens,\n json.usage?.total_tokens,\n ),\n warnings: [],\n response: {\n id: json.id,\n timestamp: json.created ? new Date(json.created * 1000) : undefined,\n modelId: json.model,\n headers: headersToObject(response.headers),\n body: json,\n },\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const body = this.buildRequestBody(options, true);\n\n console.log(JSON.stringify(body, null, 2));\n\n const url = this.config.url({ path: \"/chat/completions\" });\n const response = await (this.config.fetch ?? fetch)(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers(),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(\n error.error?.message ??\n `Longcat API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const self = this;\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n const decoder = new TextDecoder();\n const bodyStream = response.body!;\n let buffer = \"\";\n\n let textIdCounter = 0;\n const nextTextId = () => `text-${++textIdCounter}`;\n\n let currentTextId: string | null = null;\n let currentReasoningId: string | null = null;\n let lastUsage = {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n };\n let lastFinishReason: string | null = null;\n let responseId: string | undefined;\n let responseModel: string | undefined;\n let responseTimestamp: Date | undefined;\n let emittedResponseMetadata = false;\n\n const emitResponseMetadata = () => {\n if (!emittedResponseMetadata) {\n emittedResponseMetadata = true;\n controller.enqueue({\n type: \"response-metadata\",\n id: responseId,\n timestamp: responseTimestamp,\n modelId: responseModel,\n });\n }\n };\n\n const startTextBlock = () => {\n currentTextId = nextTextId();\n controller.enqueue({\n type: \"text-start\",\n id: currentTextId,\n });\n };\n\n const endTextBlock = () => {\n if (currentTextId) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n currentTextId = null;\n }\n };\n\n const startReasoningBlock = () => {\n currentReasoningId = nextTextId();\n controller.enqueue({\n type: \"reasoning-start\",\n id: currentReasoningId,\n });\n };\n\n const endReasoningBlock = () => {\n if (currentReasoningId) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: currentReasoningId,\n });\n currentReasoningId = null;\n }\n };\n\n try {\n controller.enqueue({\n type: \"stream-start\",\n warnings: [],\n });\n\n const reader = bodyStream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n console.log({ line });\n\n const rawdata = line.split(\"data:\")[1];\n if (!rawdata) {\n continue;\n }\n\n const data = rawdata.trim();\n if (!data || data === \"[DONE]\") {\n continue;\n }\n\n try {\n const parsed: LongcatResponseChunk = JSON.parse(data);\n if (parsed.usage) {\n lastUsage = parsed.usage;\n }\n if (parsed.id && !responseId) {\n responseId = parsed.id;\n }\n if (parsed.model) {\n responseModel = parsed.model;\n }\n if (parsed.created && !responseTimestamp) {\n responseTimestamp = new Date(parsed.created * 1000);\n }\n\n const choice = parsed.choices?.[0];\n if (!choice) continue;\n\n if (!responseId && choice.delta.response_id) {\n responseId = choice.delta.response_id;\n }\n\n const deltaType = choice.delta.type;\n\n if (self.isOmniModel && deltaType) {\n // Omni model streaming\n switch (deltaType) {\n case \"response.start\":\n emitResponseMetadata();\n break;\n\n case \"response.text.delta\":\n case \"response.audio_transcript.delta\":\n if (\n choice.delta.content &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n break;\n\n case \"response.text.done\":\n case \"response.audio_transcript.done\":\n endReasoningBlock();\n endTextBlock();\n break;\n\n case \"response.audio.delta\":\n if (choice.delta.audio) {\n emitResponseMetadata();\n controller.enqueue({\n type: \"file\",\n mediaType: \"audio/wav\",\n data: choice.delta.audio,\n });\n }\n break;\n\n case \"response.audio.done\":\n break;\n\n default:\n if (\n choice.delta.content &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n break;\n }\n\n if (choice.finish_reason) {\n lastFinishReason = choice.finish_reason;\n }\n } else {\n // Standard OpenAI-compatible streaming\n if (choice.delta.role === \"assistant\") {\n emitResponseMetadata();\n }\n\n if (\n choice.delta.reasoning_content !== undefined &&\n choice.delta.reasoning_content !== null &&\n choice.delta.reasoning_content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentReasoningId) startReasoningBlock();\n controller.enqueue({\n type: \"reasoning-delta\",\n id: currentReasoningId!,\n delta: choice.delta.reasoning_content,\n });\n }\n\n if (\n choice.delta.content !== undefined &&\n choice.delta.content !== null &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n endReasoningBlock();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n\n if (choice.finish_reason) {\n lastFinishReason = choice.finish_reason;\n endReasoningBlock();\n endTextBlock();\n }\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n endTextBlock();\n\n controller.enqueue({\n type: \"finish\",\n finishReason: convertFinishReason(lastFinishReason),\n usage: makeUsage(\n lastUsage.prompt_tokens,\n lastUsage.completion_tokens,\n lastUsage.total_tokens,\n ),\n });\n } catch (e) {\n controller.enqueue({\n type: \"error\",\n error: e,\n });\n } finally {\n controller.close();\n }\n },\n });\n\n return {\n stream,\n response: {\n headers: headersToObject(response.headers),\n },\n };\n }\n\n private convertToLongcatMessages(prompt: LanguageModelV3Prompt): unknown[] {\n const messages: Array<{ role: string; content: unknown }> = [];\n\n for (const message of prompt) {\n const { role } = message;\n\n if (role === \"system\") {\n if (this.isOmniModel) {\n messages.push({\n role: \"system\",\n content: [{ type: \"text\", text: message.content }],\n });\n } else {\n messages.push({\n role: \"system\",\n content: message.content,\n });\n }\n } else if (role === \"user\") {\n if (this.isOmniModel) {\n const userContent = message.content.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n return this.convertFilePartToOmni(part);\n });\n messages.push({ role: \"user\", content: userContent });\n } else {\n // Non-omni: collect text parts into a single string.\n // If there are file parts, fall back to the array format.\n const textParts: string[] = [];\n const fileParts: unknown[] = [];\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n textParts.push(part.text);\n } else {\n fileParts.push(this.convertFilePartToOmni(part));\n }\n }\n\n if (fileParts.length === 0) {\n // Text-only: send as plain string per LongCat standard API\n messages.push({ role: \"user\", content: textParts.join(\"\") });\n } else {\n // Mixed content: use array format\n const content: unknown[] = textParts.map((t) => ({\n type: \"text\",\n text: t,\n }));\n content.push(...fileParts);\n messages.push({ role: \"user\", content });\n }\n }\n } else if (role === \"assistant\") {\n let text = \"\";\n for (const part of message.content) {\n if (part.type === \"text\") {\n text += part.text;\n }\n }\n if (this.isOmniModel) {\n messages.push({\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n });\n } else {\n messages.push({\n role: \"assistant\",\n content: text,\n });\n }\n } else if (role === \"tool\") {\n for (const toolResult of message.content) {\n if (toolResult.type === \"tool-result\") {\n const output = toolResult.output;\n let contentValue: string;\n\n if (typeof output === \"string\") {\n contentValue = output;\n } else if (typeof output === \"object\") {\n contentValue = JSON.stringify(output);\n } else {\n contentValue = String(output);\n }\n\n if (this.isOmniModel) {\n messages.push({\n role: \"user\",\n content: [{ type: \"text\", text: contentValue }],\n });\n } else {\n messages.push({\n role: \"user\",\n content: contentValue,\n });\n }\n }\n }\n }\n }\n\n return messages;\n }\n\n private convertFilePartToOmni(\n part: LanguageModelV3FilePart,\n ): Record<string, unknown> {\n const omniType = mediaTypeToOmniType(part.mediaType);\n const format = formatFromMediaType(part.mediaType);\n\n if (part.data instanceof URL) {\n return {\n type: omniType,\n [omniType]: {\n type: \"url\",\n data:\n omniType === \"input_image\"\n ? [part.data.toString()]\n : part.data.toString(),\n ...(omniType === \"input_audio\" ? { format } : {}),\n },\n };\n }\n\n let base64Data: string;\n if (typeof part.data === \"string\") {\n base64Data = part.data;\n } else {\n base64Data = convertUint8ArrayToBase64(part.data);\n }\n\n return {\n type: omniType,\n [omniType]: {\n type: \"base64\",\n data: omniType === \"input_image\" ? [base64Data] : base64Data,\n ...(omniType === \"input_audio\" ? { format } : {}),\n },\n };\n }\n}\n"],"mappings":"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","names":["import_provider_utils"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/longcat-provider.ts","../src/longcat-chat-language-model.ts"],"sourcesContent":["export { createLongcat, longcat } from './longcat-provider';\nexport { LongcatChatLanguageModel } from './longcat-chat-language-model';\nexport type {\n LongcatProvider,\n LongcatProviderSettings,\n} from './longcat-provider';\nexport type {\n LongcatChatModelId,\n LongcatChatSettings,\n LongcatAudioConfig,\n} from './longcat-chat-settings';\n","import { LanguageModelV3 } from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { LongcatChatLanguageModel } from './longcat-chat-language-model';\nimport type { LongcatChatModelId, LongcatChatSettings } from './longcat-chat-settings';\nimport type { LongcatChatConfig } from './longcat-chat-language-model';\n\nexport interface LongcatProviderSettings {\n apiKey?: string;\n baseURL?: string;\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface LongcatProvider {\n (\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ): LanguageModelV3;\n\n chatModel(\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ): LanguageModelV3;\n}\n\nexport function createLongcat(\n options: LongcatProviderSettings = {},\n): LongcatProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.longcat.chat/openai/v1',\n );\n\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'LONGCAT_API_KEY',\n description: 'Longcat API key',\n })}`,\n ...options.headers,\n });\n\n const config: LongcatChatConfig = {\n provider: 'longcat',\n url: ({ path }) => {\n const url = new URL(`${baseURL}${path}`);\n if (options.queryParams) {\n url.search = new URLSearchParams(options.queryParams).toString();\n }\n return url.toString();\n },\n headers: getHeaders,\n fetch: options.fetch,\n };\n\n const createChatModel = (\n modelId: LongcatChatModelId,\n settings: LongcatChatSettings = {},\n ) => {\n return new LongcatChatLanguageModel(\n modelId,\n settings,\n config,\n );\n };\n\n const provider = (\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ) => createChatModel(modelId, settings);\n\n provider.chatModel = createChatModel;\n\n return provider;\n}\n\nexport const longcat = createLongcat();\n","import {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Prompt,\n LanguageModelV3StreamPart,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n LanguageModelV3Content,\n LanguageModelV3Text,\n LanguageModelV3File,\n LanguageModelV3FilePart,\n} from \"@ai-sdk/provider\";\nimport { convertUint8ArrayToBase64 } from \"@ai-sdk/provider-utils\";\nimport type {\n LongcatChatModelId,\n LongcatChatSettings,\n} from \"./longcat-chat-settings\";\n\nexport interface LongcatChatConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: () => Record<string, string>;\n fetch?: typeof fetch;\n}\n\ninterface LongcatToolCallChunk {\n index: number;\n id?: string;\n type?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n}\n\ninterface LongcatResponseChunk {\n id?: string;\n object?: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string | null;\n reasoning_content?: string | null;\n audio?: string | null;\n tool_calls?: LongcatToolCallChunk[];\n type?: string;\n turn_id?: string;\n response_id?: string;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n session_id?: string;\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nfunction convertFinishReason(\n raw: string | null | undefined,\n): LanguageModelV3FinishReason {\n if (raw === \"stop\" || raw == null) {\n return { unified: \"stop\", raw: raw ?? undefined };\n }\n if (raw === \"length\") {\n return { unified: \"length\", raw };\n }\n if (raw === \"tool_calls\" || raw === \"function_call\") {\n return { unified: \"tool-calls\", raw };\n }\n try {\n const parsed = JSON.parse(raw);\n if (parsed?.type === \"abort\") {\n return { unified: \"stop\", raw };\n }\n } catch {\n // not JSON, fall through\n }\n return { unified: \"other\", raw };\n}\n\nfunction makeUsage(\n promptTokens?: number,\n completionTokens?: number,\n totalTokens?: number,\n) {\n return {\n inputTokens: {\n total: promptTokens ?? undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens ?? undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: {\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n total_tokens: totalTokens,\n },\n };\n}\n\nfunction mediaTypeToOmniType(\n mediaType: string,\n): \"input_image\" | \"input_audio\" | \"input_video\" {\n if (mediaType.startsWith(\"image/\")) return \"input_image\";\n if (mediaType.startsWith(\"audio/\")) return \"input_audio\";\n if (mediaType.startsWith(\"video/\")) return \"input_video\";\n return \"input_image\";\n}\n\nfunction formatFromMediaType(mediaType: string): string {\n const parts = mediaType.split(\"/\");\n return parts[1] ?? mediaType;\n}\n\nexport class LongcatChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\" as const;\n readonly modelId: string;\n readonly settings: LongcatChatSettings;\n readonly supportedUrls:\n | PromiseLike<Record<string, RegExp[]>>\n | Record<string, RegExp[]> = {\n \"image/*\": [/.*/],\n \"audio/*\": [/.*/],\n \"video/*\": [/.*/],\n };\n\n private readonly config: LongcatChatConfig;\n\n constructor(\n modelId: LongcatChatModelId,\n settings: LongcatChatSettings,\n config: LongcatChatConfig,\n ) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get isOmniModel(): boolean {\n return this.modelId.toLowerCase().includes(\"omni\");\n }\n\n private buildRequestBody(\n options: LanguageModelV3CallOptions,\n stream: boolean,\n outputModalities?: string[],\n ): Record<string, unknown> {\n const messages = this.convertToLongcatMessages(options.prompt);\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages,\n stream,\n output_modalities: outputModalities ?? [\"text\"],\n };\n\n if (this.isOmniModel) {\n if (this.settings.sessionId) {\n body.sessionId = this.settings.sessionId;\n }\n if (this.settings.audio) {\n const audioConfig: Record<string, unknown> = {};\n if (this.settings.audio.voice)\n audioConfig.voice = this.settings.audio.voice;\n if (this.settings.audio.speed)\n audioConfig.speed = this.settings.audio.speed;\n if (this.settings.audio.volume)\n audioConfig.volume = this.settings.audio.volume;\n if (this.settings.audio.outputAudioSamplerate) {\n audioConfig.output_audio_samplerate =\n this.settings.audio.outputAudioSamplerate;\n }\n body.audio = audioConfig;\n }\n if (this.settings.outputModalities) {\n body.output_modalities = this.settings.outputModalities;\n }\n if (this.settings.textRepetitionPenalty) {\n body.textRepetitionPenalty = this.settings.textRepetitionPenalty;\n }\n if (this.settings.audioRepetitionPenalty) {\n body.audioRepetitionPenalty = this.settings.audioRepetitionPenalty;\n }\n }\n\n if (options.tools?.length) {\n body.tools = options.tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.type === \"function\" ? tool.name : tool.id,\n description: tool.type === \"function\" ? tool.description : undefined,\n parameters: tool.type === \"function\" ? tool.inputSchema : undefined,\n strict: tool.type === \"function\" ? tool.strict : undefined,\n },\n }));\n }\n\n if (options.toolChoice) {\n const choice = options.toolChoice;\n switch (choice.type) {\n case \"auto\":\n body.tool_choice = \"auto\";\n break;\n case \"none\":\n body.tool_choice = \"none\";\n break;\n case \"required\":\n body.tool_choice = \"required\";\n break;\n case \"tool\":\n body.tool_choice = {\n type: \"function\",\n function: { name: choice.toolName },\n };\n break;\n }\n }\n\n if (options.maxOutputTokens ?? this.settings.maxTokens) {\n body.max_tokens = options.maxOutputTokens ?? this.settings.maxTokens;\n }\n if (options.temperature ?? this.settings.temperature) {\n body.temperature = options.temperature ?? this.settings.temperature;\n }\n if (this.isOmniModel) {\n if (options.topP ?? this.settings.topP) {\n body.topP = options.topP ?? this.settings.topP;\n }\n if (options.topK ?? this.settings.topK) {\n body.topK = options.topK ?? this.settings.topK;\n }\n } else {\n if (options.topP ?? this.settings.topP) {\n body.top_p = options.topP ?? this.settings.topP;\n }\n }\n\n return body;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const body = this.buildRequestBody(options, false);\n\n const url = this.config.url({ path: \"/chat/completions\" });\n const response = await (this.config.fetch ?? fetch)(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers(),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\n `Longcat API error: ${response.status} ${response.statusText} - ${text}`,\n );\n }\n\n const json = await response.json();\n const choice = json.choices?.[0];\n\n const content: LanguageModelV3Content[] = [];\n if (choice?.message?.content) {\n content.push({\n type: \"text\",\n text: choice.message.content,\n } as LanguageModelV3Text);\n }\n if (choice?.message?.tool_calls?.length) {\n for (const tc of choice.message.tool_calls) {\n content.push({\n type: \"tool-call\",\n toolCallId: tc.id ?? `call_${Date.now()}`,\n toolName: tc.function?.name ?? \"\",\n input: tc.function?.arguments ?? \"{}\",\n });\n }\n }\n if (choice?.message?.audio) {\n content.push({\n type: \"file\",\n mediaType: \"audio/wav\",\n data: choice.message.audio,\n } as LanguageModelV3File);\n }\n\n return {\n content,\n finishReason: convertFinishReason(choice?.finish_reason),\n usage: makeUsage(\n json.usage?.prompt_tokens,\n json.usage?.completion_tokens,\n json.usage?.total_tokens,\n ),\n warnings: [],\n response: {\n id: json.id,\n timestamp: json.created ? new Date(json.created * 1000) : undefined,\n modelId: json.model,\n headers: headersToObject(response.headers),\n body: json,\n },\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const body = this.buildRequestBody(options, true);\n\n const url = this.config.url({ path: \"/chat/completions\" });\n const response = await (this.config.fetch ?? fetch)(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers(),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(\n error.error?.message ??\n `Longcat API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const self = this;\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n const decoder = new TextDecoder();\n const bodyStream = response.body!;\n let buffer = \"\";\n\n let textIdCounter = 0;\n const nextTextId = () => `text-${++textIdCounter}`;\n\n let currentTextId: string | null = null;\n let currentReasoningId: string | null = null;\n let lastUsage = {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n };\n let lastFinishReason: string | null = null;\n let responseId: string | undefined;\n let responseModel: string | undefined;\n let responseTimestamp: Date | undefined;\n let emittedResponseMetadata = false;\n\n const toolCallAccumulator = new Map<\n number,\n { id: string; name: string; arguments: string }\n >();\n let activeToolCallIndex: number | null = null;\n let toolCallIdCounter = 0;\n\n const emitResponseMetadata = () => {\n if (!emittedResponseMetadata) {\n emittedResponseMetadata = true;\n controller.enqueue({\n type: \"response-metadata\",\n id: responseId,\n timestamp: responseTimestamp,\n modelId: responseModel,\n });\n }\n };\n\n const startTextBlock = () => {\n currentTextId = nextTextId();\n controller.enqueue({\n type: \"text-start\",\n id: currentTextId,\n });\n };\n\n const endTextBlock = () => {\n if (currentTextId) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n currentTextId = null;\n }\n };\n\n const startReasoningBlock = () => {\n currentReasoningId = nextTextId();\n controller.enqueue({\n type: \"reasoning-start\",\n id: currentReasoningId,\n });\n };\n\n const endReasoningBlock = () => {\n if (currentReasoningId) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: currentReasoningId,\n });\n currentReasoningId = null;\n }\n };\n\n const finalizeToolCall = (index: number) => {\n const tc = toolCallAccumulator.get(index);\n if (!tc) return;\n controller.enqueue({\n type: \"tool-input-end\",\n id: tc.id,\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: tc.name,\n input: tc.arguments,\n });\n toolCallAccumulator.delete(index);\n };\n\n try {\n controller.enqueue({\n type: \"stream-start\",\n warnings: [],\n });\n\n const reader = bodyStream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const rawdata = line.split(\"data:\")[1];\n if (!rawdata) {\n continue;\n }\n\n const data = rawdata.trim();\n if (!data || data === \"[DONE]\") {\n continue;\n }\n\n try {\n const parsed: LongcatResponseChunk = JSON.parse(data);\n if (parsed.usage) {\n lastUsage = parsed.usage;\n }\n if (parsed.id && !responseId) {\n responseId = parsed.id;\n }\n if (parsed.model) {\n responseModel = parsed.model;\n }\n if (parsed.created && !responseTimestamp) {\n responseTimestamp = new Date(parsed.created * 1000);\n }\n\n const choice = parsed.choices?.[0];\n if (!choice) continue;\n\n if (!responseId && choice.delta.response_id) {\n responseId = choice.delta.response_id;\n }\n\n const deltaType = choice.delta.type;\n\n if (self.isOmniModel && deltaType) {\n // Omni model streaming\n switch (deltaType) {\n case \"response.start\":\n emitResponseMetadata();\n break;\n\n case \"response.text.delta\":\n case \"response.audio_transcript.delta\":\n if (\n choice.delta.content &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n break;\n\n case \"response.text.done\":\n case \"response.audio_transcript.done\":\n endReasoningBlock();\n endTextBlock();\n\n for (const idx of toolCallAccumulator.keys()) {\n finalizeToolCall(idx);\n }\n activeToolCallIndex = null;\n break;\n\n case \"response.audio.delta\":\n if (choice.delta.audio) {\n emitResponseMetadata();\n controller.enqueue({\n type: \"file\",\n mediaType: \"audio/wav\",\n data: choice.delta.audio,\n });\n }\n break;\n\n case \"response.audio.done\":\n break;\n\n default:\n if (\n choice.delta.content &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n break;\n }\n\n if (choice.finish_reason) {\n lastFinishReason = choice.finish_reason;\n }\n } else {\n // Standard OpenAI-compatible streaming\n if (choice.delta.role === \"assistant\") {\n emitResponseMetadata();\n }\n\n if (\n choice.delta.reasoning_content !== undefined &&\n choice.delta.reasoning_content !== null &&\n choice.delta.reasoning_content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentReasoningId) startReasoningBlock();\n controller.enqueue({\n type: \"reasoning-delta\",\n id: currentReasoningId!,\n delta: choice.delta.reasoning_content,\n });\n }\n\n if (\n choice.delta.content !== undefined &&\n choice.delta.content !== null &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n endReasoningBlock();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n\n if (choice.delta.tool_calls?.length) {\n emitResponseMetadata();\n endTextBlock();\n endReasoningBlock();\n\n for (const tc of choice.delta.tool_calls) {\n const idx = tc.index ?? 0;\n\n if (\n tc.id &&\n !toolCallAccumulator.has(idx)\n ) {\n if (\n activeToolCallIndex !== null &&\n activeToolCallIndex !== idx\n ) {\n finalizeToolCall(activeToolCallIndex);\n }\n activeToolCallIndex = idx;\n const id =\n tc.id ||\n `call_${++toolCallIdCounter}`;\n toolCallAccumulator.set(idx, {\n id,\n name: tc.function?.name ?? \"\",\n arguments: \"\",\n });\n controller.enqueue({\n type: \"tool-input-start\",\n id,\n toolName: tc.function?.name ?? \"\",\n });\n }\n\n const acc = toolCallAccumulator.get(idx);\n if (acc) {\n if (tc.function?.name) {\n acc.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n acc.arguments += tc.function.arguments;\n controller.enqueue({\n type: \"tool-input-delta\",\n id: acc.id,\n delta: tc.function.arguments,\n });\n }\n }\n }\n }\n\n if (choice.finish_reason) {\n lastFinishReason = choice.finish_reason;\n endReasoningBlock();\n endTextBlock();\n if (activeToolCallIndex !== null) {\n finalizeToolCall(activeToolCallIndex);\n activeToolCallIndex = null;\n }\n }\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n endTextBlock();\n\n controller.enqueue({\n type: \"finish\",\n finishReason: convertFinishReason(lastFinishReason),\n usage: makeUsage(\n lastUsage.prompt_tokens,\n lastUsage.completion_tokens,\n lastUsage.total_tokens,\n ),\n });\n } catch (e) {\n controller.enqueue({\n type: \"error\",\n error: e,\n });\n } finally {\n controller.close();\n }\n },\n });\n\n return {\n stream,\n response: {\n headers: headersToObject(response.headers),\n },\n };\n }\n\n private convertToLongcatMessages(prompt: LanguageModelV3Prompt): unknown[] {\n const messages: Array<Record<string, unknown>> = [];\n\n for (const message of prompt) {\n const { role } = message;\n\n if (role === \"system\") {\n if (this.isOmniModel) {\n messages.push({\n role: \"system\",\n content: [{ type: \"text\", text: message.content }],\n });\n } else {\n messages.push({\n role: \"system\",\n content: message.content,\n });\n }\n } else if (role === \"user\") {\n if (this.isOmniModel) {\n const userContent = message.content.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n return this.convertFilePartToOmni(part);\n });\n messages.push({ role: \"user\", content: userContent });\n } else {\n // Non-omni: collect text parts into a single string.\n // If there are file parts, fall back to the array format.\n const textParts: string[] = [];\n const fileParts: unknown[] = [];\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n textParts.push(part.text);\n } else {\n fileParts.push(this.convertFilePartToOmni(part));\n }\n }\n\n if (fileParts.length === 0) {\n // Text-only: send as plain string per LongCat standard API\n messages.push({ role: \"user\", content: textParts.join(\"\") });\n } else {\n // Mixed content: use array format\n const content: unknown[] = textParts.map((t) => ({\n type: \"text\",\n text: t,\n }));\n content.push(...fileParts);\n messages.push({ role: \"user\", content });\n }\n }\n } else if (role === \"assistant\") {\n let text = \"\";\n const toolCalls: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }> = [];\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n text += part.text;\n } else if (part.type === \"tool-call\") {\n toolCalls.push({\n id: part.toolCallId,\n type: \"function\",\n function: {\n name: part.toolName,\n arguments:\n typeof part.input === \"string\"\n ? part.input\n : JSON.stringify(part.input),\n },\n });\n }\n }\n\n const assistantMsg: Record<string, unknown> = { role: \"assistant\" };\n\n if (this.isOmniModel) {\n assistantMsg.content = text\n ? [{ type: \"text\", text }]\n : null;\n } else {\n assistantMsg.content = text || null;\n }\n\n if (toolCalls.length > 0) {\n assistantMsg.tool_calls = toolCalls;\n }\n\n messages.push(assistantMsg);\n } else if (role === \"tool\") {\n for (const toolResult of message.content) {\n if (toolResult.type === \"tool-result\") {\n const output = toolResult.output;\n let contentValue: string;\n\n if (typeof output === \"string\") {\n contentValue = output;\n } else if (typeof output === \"object\") {\n contentValue = JSON.stringify(output);\n } else {\n contentValue = String(output);\n }\n\n messages.push({\n role: \"tool\",\n tool_call_id: toolResult.toolCallId,\n content: contentValue,\n });\n }\n }\n }\n }\n\n return messages;\n }\n\n private convertFilePartToOmni(\n part: LanguageModelV3FilePart,\n ): Record<string, unknown> {\n const omniType = mediaTypeToOmniType(part.mediaType);\n const format = formatFromMediaType(part.mediaType);\n\n if (part.data instanceof URL) {\n return {\n type: omniType,\n [omniType]: {\n type: \"url\",\n data:\n omniType === \"input_image\"\n ? [part.data.toString()]\n : part.data.toString(),\n ...(omniType === \"input_audio\" ? { format } : {}),\n },\n };\n }\n\n let base64Data: string;\n if (typeof part.data === \"string\") {\n base64Data = part.data;\n } else {\n base64Data = convertUint8ArrayToBase64(part.data);\n }\n\n return {\n type: omniType,\n [omniType]: {\n type: \"base64\",\n data: omniType === \"input_image\" ? [base64Data] : base64Data,\n ...(omniType === \"input_audio\" ? { format } : {}),\n },\n };\n }\n}\n"],"mappings":"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","names":["import_provider_utils"]}
|
package/dist/index.mjs
CHANGED
|
@@ -20,6 +20,9 @@ function convertFinishReason(raw) {
|
|
|
20
20
|
if (raw === "length") {
|
|
21
21
|
return { unified: "length", raw };
|
|
22
22
|
}
|
|
23
|
+
if (raw === "tool_calls" || raw === "function_call") {
|
|
24
|
+
return { unified: "tool-calls", raw };
|
|
25
|
+
}
|
|
23
26
|
try {
|
|
24
27
|
const parsed = JSON.parse(raw);
|
|
25
28
|
if (parsed?.type === "abort") {
|
|
@@ -112,6 +115,37 @@ var LongcatChatLanguageModel = class {
|
|
|
112
115
|
body.audioRepetitionPenalty = this.settings.audioRepetitionPenalty;
|
|
113
116
|
}
|
|
114
117
|
}
|
|
118
|
+
if (options.tools?.length) {
|
|
119
|
+
body.tools = options.tools.map((tool) => ({
|
|
120
|
+
type: "function",
|
|
121
|
+
function: {
|
|
122
|
+
name: tool.type === "function" ? tool.name : tool.id,
|
|
123
|
+
description: tool.type === "function" ? tool.description : void 0,
|
|
124
|
+
parameters: tool.type === "function" ? tool.inputSchema : void 0,
|
|
125
|
+
strict: tool.type === "function" ? tool.strict : void 0
|
|
126
|
+
}
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
if (options.toolChoice) {
|
|
130
|
+
const choice = options.toolChoice;
|
|
131
|
+
switch (choice.type) {
|
|
132
|
+
case "auto":
|
|
133
|
+
body.tool_choice = "auto";
|
|
134
|
+
break;
|
|
135
|
+
case "none":
|
|
136
|
+
body.tool_choice = "none";
|
|
137
|
+
break;
|
|
138
|
+
case "required":
|
|
139
|
+
body.tool_choice = "required";
|
|
140
|
+
break;
|
|
141
|
+
case "tool":
|
|
142
|
+
body.tool_choice = {
|
|
143
|
+
type: "function",
|
|
144
|
+
function: { name: choice.toolName }
|
|
145
|
+
};
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
115
149
|
if (options.maxOutputTokens ?? this.settings.maxTokens) {
|
|
116
150
|
body.max_tokens = options.maxOutputTokens ?? this.settings.maxTokens;
|
|
117
151
|
}
|
|
@@ -158,6 +192,16 @@ var LongcatChatLanguageModel = class {
|
|
|
158
192
|
text: choice.message.content
|
|
159
193
|
});
|
|
160
194
|
}
|
|
195
|
+
if (choice?.message?.tool_calls?.length) {
|
|
196
|
+
for (const tc of choice.message.tool_calls) {
|
|
197
|
+
content.push({
|
|
198
|
+
type: "tool-call",
|
|
199
|
+
toolCallId: tc.id ?? `call_${Date.now()}`,
|
|
200
|
+
toolName: tc.function?.name ?? "",
|
|
201
|
+
input: tc.function?.arguments ?? "{}"
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
161
205
|
if (choice?.message?.audio) {
|
|
162
206
|
content.push({
|
|
163
207
|
type: "file",
|
|
@@ -185,7 +229,6 @@ var LongcatChatLanguageModel = class {
|
|
|
185
229
|
}
|
|
186
230
|
async doStream(options) {
|
|
187
231
|
const body = this.buildRequestBody(options, true);
|
|
188
|
-
console.log(JSON.stringify(body, null, 2));
|
|
189
232
|
const url = this.config.url({ path: "/chat/completions" });
|
|
190
233
|
const response = await (this.config.fetch ?? fetch)(url, {
|
|
191
234
|
method: "POST",
|
|
@@ -221,6 +264,9 @@ var LongcatChatLanguageModel = class {
|
|
|
221
264
|
let responseModel;
|
|
222
265
|
let responseTimestamp;
|
|
223
266
|
let emittedResponseMetadata = false;
|
|
267
|
+
const toolCallAccumulator = /* @__PURE__ */ new Map();
|
|
268
|
+
let activeToolCallIndex = null;
|
|
269
|
+
let toolCallIdCounter = 0;
|
|
224
270
|
const emitResponseMetadata = () => {
|
|
225
271
|
if (!emittedResponseMetadata) {
|
|
226
272
|
emittedResponseMetadata = true;
|
|
@@ -264,6 +310,21 @@ var LongcatChatLanguageModel = class {
|
|
|
264
310
|
currentReasoningId = null;
|
|
265
311
|
}
|
|
266
312
|
};
|
|
313
|
+
const finalizeToolCall = (index) => {
|
|
314
|
+
const tc = toolCallAccumulator.get(index);
|
|
315
|
+
if (!tc) return;
|
|
316
|
+
controller.enqueue({
|
|
317
|
+
type: "tool-input-end",
|
|
318
|
+
id: tc.id
|
|
319
|
+
});
|
|
320
|
+
controller.enqueue({
|
|
321
|
+
type: "tool-call",
|
|
322
|
+
toolCallId: tc.id,
|
|
323
|
+
toolName: tc.name,
|
|
324
|
+
input: tc.arguments
|
|
325
|
+
});
|
|
326
|
+
toolCallAccumulator.delete(index);
|
|
327
|
+
};
|
|
267
328
|
try {
|
|
268
329
|
controller.enqueue({
|
|
269
330
|
type: "stream-start",
|
|
@@ -278,7 +339,6 @@ var LongcatChatLanguageModel = class {
|
|
|
278
339
|
const lines = buffer.split("\n");
|
|
279
340
|
buffer = lines.pop() ?? "";
|
|
280
341
|
for (const line of lines) {
|
|
281
|
-
console.log({ line });
|
|
282
342
|
const rawdata = line.split("data:")[1];
|
|
283
343
|
if (!rawdata) {
|
|
284
344
|
continue;
|
|
@@ -328,6 +388,10 @@ var LongcatChatLanguageModel = class {
|
|
|
328
388
|
case "response.audio_transcript.done":
|
|
329
389
|
endReasoningBlock();
|
|
330
390
|
endTextBlock();
|
|
391
|
+
for (const idx of toolCallAccumulator.keys()) {
|
|
392
|
+
finalizeToolCall(idx);
|
|
393
|
+
}
|
|
394
|
+
activeToolCallIndex = null;
|
|
331
395
|
break;
|
|
332
396
|
case "response.audio.delta":
|
|
333
397
|
if (choice.delta.audio) {
|
|
@@ -379,10 +443,53 @@ var LongcatChatLanguageModel = class {
|
|
|
379
443
|
delta: choice.delta.content
|
|
380
444
|
});
|
|
381
445
|
}
|
|
446
|
+
if (choice.delta.tool_calls?.length) {
|
|
447
|
+
emitResponseMetadata();
|
|
448
|
+
endTextBlock();
|
|
449
|
+
endReasoningBlock();
|
|
450
|
+
for (const tc of choice.delta.tool_calls) {
|
|
451
|
+
const idx = tc.index ?? 0;
|
|
452
|
+
if (tc.id && !toolCallAccumulator.has(idx)) {
|
|
453
|
+
if (activeToolCallIndex !== null && activeToolCallIndex !== idx) {
|
|
454
|
+
finalizeToolCall(activeToolCallIndex);
|
|
455
|
+
}
|
|
456
|
+
activeToolCallIndex = idx;
|
|
457
|
+
const id = tc.id || `call_${++toolCallIdCounter}`;
|
|
458
|
+
toolCallAccumulator.set(idx, {
|
|
459
|
+
id,
|
|
460
|
+
name: tc.function?.name ?? "",
|
|
461
|
+
arguments: ""
|
|
462
|
+
});
|
|
463
|
+
controller.enqueue({
|
|
464
|
+
type: "tool-input-start",
|
|
465
|
+
id,
|
|
466
|
+
toolName: tc.function?.name ?? ""
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
const acc = toolCallAccumulator.get(idx);
|
|
470
|
+
if (acc) {
|
|
471
|
+
if (tc.function?.name) {
|
|
472
|
+
acc.name = tc.function.name;
|
|
473
|
+
}
|
|
474
|
+
if (tc.function?.arguments) {
|
|
475
|
+
acc.arguments += tc.function.arguments;
|
|
476
|
+
controller.enqueue({
|
|
477
|
+
type: "tool-input-delta",
|
|
478
|
+
id: acc.id,
|
|
479
|
+
delta: tc.function.arguments
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
382
485
|
if (choice.finish_reason) {
|
|
383
486
|
lastFinishReason = choice.finish_reason;
|
|
384
487
|
endReasoningBlock();
|
|
385
488
|
endTextBlock();
|
|
489
|
+
if (activeToolCallIndex !== null) {
|
|
490
|
+
finalizeToolCall(activeToolCallIndex);
|
|
491
|
+
activeToolCallIndex = null;
|
|
492
|
+
}
|
|
386
493
|
}
|
|
387
494
|
}
|
|
388
495
|
} catch {
|
|
@@ -467,22 +574,31 @@ var LongcatChatLanguageModel = class {
|
|
|
467
574
|
}
|
|
468
575
|
} else if (role === "assistant") {
|
|
469
576
|
let text = "";
|
|
577
|
+
const toolCalls = [];
|
|
470
578
|
for (const part of message.content) {
|
|
471
579
|
if (part.type === "text") {
|
|
472
580
|
text += part.text;
|
|
581
|
+
} else if (part.type === "tool-call") {
|
|
582
|
+
toolCalls.push({
|
|
583
|
+
id: part.toolCallId,
|
|
584
|
+
type: "function",
|
|
585
|
+
function: {
|
|
586
|
+
name: part.toolName,
|
|
587
|
+
arguments: typeof part.input === "string" ? part.input : JSON.stringify(part.input)
|
|
588
|
+
}
|
|
589
|
+
});
|
|
473
590
|
}
|
|
474
591
|
}
|
|
592
|
+
const assistantMsg = { role: "assistant" };
|
|
475
593
|
if (this.isOmniModel) {
|
|
476
|
-
|
|
477
|
-
role: "assistant",
|
|
478
|
-
content: [{ type: "text", text }]
|
|
479
|
-
});
|
|
594
|
+
assistantMsg.content = text ? [{ type: "text", text }] : null;
|
|
480
595
|
} else {
|
|
481
|
-
|
|
482
|
-
role: "assistant",
|
|
483
|
-
content: text
|
|
484
|
-
});
|
|
596
|
+
assistantMsg.content = text || null;
|
|
485
597
|
}
|
|
598
|
+
if (toolCalls.length > 0) {
|
|
599
|
+
assistantMsg.tool_calls = toolCalls;
|
|
600
|
+
}
|
|
601
|
+
messages.push(assistantMsg);
|
|
486
602
|
} else if (role === "tool") {
|
|
487
603
|
for (const toolResult of message.content) {
|
|
488
604
|
if (toolResult.type === "tool-result") {
|
|
@@ -495,17 +611,11 @@ var LongcatChatLanguageModel = class {
|
|
|
495
611
|
} else {
|
|
496
612
|
contentValue = String(output);
|
|
497
613
|
}
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
} else {
|
|
504
|
-
messages.push({
|
|
505
|
-
role: "user",
|
|
506
|
-
content: contentValue
|
|
507
|
-
});
|
|
508
|
-
}
|
|
614
|
+
messages.push({
|
|
615
|
+
role: "tool",
|
|
616
|
+
tool_call_id: toolResult.toolCallId,
|
|
617
|
+
content: contentValue
|
|
618
|
+
});
|
|
509
619
|
}
|
|
510
620
|
}
|
|
511
621
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/longcat-provider.ts","../src/longcat-chat-language-model.ts"],"sourcesContent":["import { LanguageModelV3 } from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { LongcatChatLanguageModel } from './longcat-chat-language-model';\nimport type { LongcatChatModelId, LongcatChatSettings } from './longcat-chat-settings';\nimport type { LongcatChatConfig } from './longcat-chat-language-model';\n\nexport interface LongcatProviderSettings {\n apiKey?: string;\n baseURL?: string;\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface LongcatProvider {\n (\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ): LanguageModelV3;\n\n chatModel(\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ): LanguageModelV3;\n}\n\nexport function createLongcat(\n options: LongcatProviderSettings = {},\n): LongcatProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.longcat.chat/openai/v1',\n );\n\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'LONGCAT_API_KEY',\n description: 'Longcat API key',\n })}`,\n ...options.headers,\n });\n\n const config: LongcatChatConfig = {\n provider: 'longcat',\n url: ({ path }) => {\n const url = new URL(`${baseURL}${path}`);\n if (options.queryParams) {\n url.search = new URLSearchParams(options.queryParams).toString();\n }\n return url.toString();\n },\n headers: getHeaders,\n fetch: options.fetch,\n };\n\n const createChatModel = (\n modelId: LongcatChatModelId,\n settings: LongcatChatSettings = {},\n ) => {\n return new LongcatChatLanguageModel(\n modelId,\n settings,\n config,\n );\n };\n\n const provider = (\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ) => createChatModel(modelId, settings);\n\n provider.chatModel = createChatModel;\n\n return provider;\n}\n\nexport const longcat = createLongcat();\n","import {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Prompt,\n LanguageModelV3StreamPart,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n LanguageModelV3Content,\n LanguageModelV3Text,\n LanguageModelV3File,\n LanguageModelV3FilePart,\n} from \"@ai-sdk/provider\";\nimport { convertUint8ArrayToBase64 } from \"@ai-sdk/provider-utils\";\nimport type {\n LongcatChatModelId,\n LongcatChatSettings,\n} from \"./longcat-chat-settings\";\n\nexport interface LongcatChatConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: () => Record<string, string>;\n fetch?: typeof fetch;\n}\n\ninterface LongcatResponseChunk {\n id?: string;\n object?: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string | null;\n reasoning_content?: string | null;\n audio?: string | null;\n type?: string;\n turn_id?: string;\n response_id?: string;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n session_id?: string;\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nfunction convertFinishReason(\n raw: string | null | undefined,\n): LanguageModelV3FinishReason {\n if (raw === \"stop\" || raw == null) {\n return { unified: \"stop\", raw: raw ?? undefined };\n }\n if (raw === \"length\") {\n return { unified: \"length\", raw };\n }\n try {\n const parsed = JSON.parse(raw);\n if (parsed?.type === \"abort\") {\n return { unified: \"stop\", raw };\n }\n } catch {\n // not JSON, fall through\n }\n return { unified: \"other\", raw };\n}\n\nfunction makeUsage(\n promptTokens?: number,\n completionTokens?: number,\n totalTokens?: number,\n) {\n return {\n inputTokens: {\n total: promptTokens ?? undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens ?? undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: {\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n total_tokens: totalTokens,\n },\n };\n}\n\nfunction mediaTypeToOmniType(\n mediaType: string,\n): \"input_image\" | \"input_audio\" | \"input_video\" {\n if (mediaType.startsWith(\"image/\")) return \"input_image\";\n if (mediaType.startsWith(\"audio/\")) return \"input_audio\";\n if (mediaType.startsWith(\"video/\")) return \"input_video\";\n return \"input_image\";\n}\n\nfunction formatFromMediaType(mediaType: string): string {\n const parts = mediaType.split(\"/\");\n return parts[1] ?? mediaType;\n}\n\nexport class LongcatChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\" as const;\n readonly modelId: string;\n readonly settings: LongcatChatSettings;\n readonly supportedUrls:\n | PromiseLike<Record<string, RegExp[]>>\n | Record<string, RegExp[]> = {\n \"image/*\": [/.*/],\n \"audio/*\": [/.*/],\n \"video/*\": [/.*/],\n };\n\n private readonly config: LongcatChatConfig;\n\n constructor(\n modelId: LongcatChatModelId,\n settings: LongcatChatSettings,\n config: LongcatChatConfig,\n ) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get isOmniModel(): boolean {\n return this.modelId.toLowerCase().includes(\"omni\");\n }\n\n private buildRequestBody(\n options: LanguageModelV3CallOptions,\n stream: boolean,\n outputModalities?: string[],\n ): Record<string, unknown> {\n const messages = this.convertToLongcatMessages(options.prompt);\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages,\n stream,\n output_modalities: outputModalities ?? [\"text\"],\n };\n\n if (this.isOmniModel) {\n if (this.settings.sessionId) {\n body.sessionId = this.settings.sessionId;\n }\n if (this.settings.audio) {\n const audioConfig: Record<string, unknown> = {};\n if (this.settings.audio.voice)\n audioConfig.voice = this.settings.audio.voice;\n if (this.settings.audio.speed)\n audioConfig.speed = this.settings.audio.speed;\n if (this.settings.audio.volume)\n audioConfig.volume = this.settings.audio.volume;\n if (this.settings.audio.outputAudioSamplerate) {\n audioConfig.output_audio_samplerate =\n this.settings.audio.outputAudioSamplerate;\n }\n body.audio = audioConfig;\n }\n if (this.settings.outputModalities) {\n body.output_modalities = this.settings.outputModalities;\n }\n if (this.settings.textRepetitionPenalty) {\n body.textRepetitionPenalty = this.settings.textRepetitionPenalty;\n }\n if (this.settings.audioRepetitionPenalty) {\n body.audioRepetitionPenalty = this.settings.audioRepetitionPenalty;\n }\n }\n\n if (options.maxOutputTokens ?? this.settings.maxTokens) {\n body.max_tokens = options.maxOutputTokens ?? this.settings.maxTokens;\n }\n if (options.temperature ?? this.settings.temperature) {\n body.temperature = options.temperature ?? this.settings.temperature;\n }\n if (this.isOmniModel) {\n if (options.topP ?? this.settings.topP) {\n body.topP = options.topP ?? this.settings.topP;\n }\n if (options.topK ?? this.settings.topK) {\n body.topK = options.topK ?? this.settings.topK;\n }\n } else {\n if (options.topP ?? this.settings.topP) {\n body.top_p = options.topP ?? this.settings.topP;\n }\n }\n\n return body;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const body = this.buildRequestBody(options, false);\n\n const url = this.config.url({ path: \"/chat/completions\" });\n const response = await (this.config.fetch ?? fetch)(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers(),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\n `Longcat API error: ${response.status} ${response.statusText} - ${text}`,\n );\n }\n\n const json = await response.json();\n const choice = json.choices?.[0];\n\n const content: LanguageModelV3Content[] = [];\n if (choice?.message?.content) {\n content.push({\n type: \"text\",\n text: choice.message.content,\n } as LanguageModelV3Text);\n }\n if (choice?.message?.audio) {\n content.push({\n type: \"file\",\n mediaType: \"audio/wav\",\n data: choice.message.audio,\n } as LanguageModelV3File);\n }\n\n return {\n content,\n finishReason: convertFinishReason(choice?.finish_reason),\n usage: makeUsage(\n json.usage?.prompt_tokens,\n json.usage?.completion_tokens,\n json.usage?.total_tokens,\n ),\n warnings: [],\n response: {\n id: json.id,\n timestamp: json.created ? new Date(json.created * 1000) : undefined,\n modelId: json.model,\n headers: headersToObject(response.headers),\n body: json,\n },\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const body = this.buildRequestBody(options, true);\n\n console.log(JSON.stringify(body, null, 2));\n\n const url = this.config.url({ path: \"/chat/completions\" });\n const response = await (this.config.fetch ?? fetch)(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers(),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(\n error.error?.message ??\n `Longcat API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const self = this;\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n const decoder = new TextDecoder();\n const bodyStream = response.body!;\n let buffer = \"\";\n\n let textIdCounter = 0;\n const nextTextId = () => `text-${++textIdCounter}`;\n\n let currentTextId: string | null = null;\n let currentReasoningId: string | null = null;\n let lastUsage = {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n };\n let lastFinishReason: string | null = null;\n let responseId: string | undefined;\n let responseModel: string | undefined;\n let responseTimestamp: Date | undefined;\n let emittedResponseMetadata = false;\n\n const emitResponseMetadata = () => {\n if (!emittedResponseMetadata) {\n emittedResponseMetadata = true;\n controller.enqueue({\n type: \"response-metadata\",\n id: responseId,\n timestamp: responseTimestamp,\n modelId: responseModel,\n });\n }\n };\n\n const startTextBlock = () => {\n currentTextId = nextTextId();\n controller.enqueue({\n type: \"text-start\",\n id: currentTextId,\n });\n };\n\n const endTextBlock = () => {\n if (currentTextId) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n currentTextId = null;\n }\n };\n\n const startReasoningBlock = () => {\n currentReasoningId = nextTextId();\n controller.enqueue({\n type: \"reasoning-start\",\n id: currentReasoningId,\n });\n };\n\n const endReasoningBlock = () => {\n if (currentReasoningId) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: currentReasoningId,\n });\n currentReasoningId = null;\n }\n };\n\n try {\n controller.enqueue({\n type: \"stream-start\",\n warnings: [],\n });\n\n const reader = bodyStream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n console.log({ line });\n\n const rawdata = line.split(\"data:\")[1];\n if (!rawdata) {\n continue;\n }\n\n const data = rawdata.trim();\n if (!data || data === \"[DONE]\") {\n continue;\n }\n\n try {\n const parsed: LongcatResponseChunk = JSON.parse(data);\n if (parsed.usage) {\n lastUsage = parsed.usage;\n }\n if (parsed.id && !responseId) {\n responseId = parsed.id;\n }\n if (parsed.model) {\n responseModel = parsed.model;\n }\n if (parsed.created && !responseTimestamp) {\n responseTimestamp = new Date(parsed.created * 1000);\n }\n\n const choice = parsed.choices?.[0];\n if (!choice) continue;\n\n if (!responseId && choice.delta.response_id) {\n responseId = choice.delta.response_id;\n }\n\n const deltaType = choice.delta.type;\n\n if (self.isOmniModel && deltaType) {\n // Omni model streaming\n switch (deltaType) {\n case \"response.start\":\n emitResponseMetadata();\n break;\n\n case \"response.text.delta\":\n case \"response.audio_transcript.delta\":\n if (\n choice.delta.content &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n break;\n\n case \"response.text.done\":\n case \"response.audio_transcript.done\":\n endReasoningBlock();\n endTextBlock();\n break;\n\n case \"response.audio.delta\":\n if (choice.delta.audio) {\n emitResponseMetadata();\n controller.enqueue({\n type: \"file\",\n mediaType: \"audio/wav\",\n data: choice.delta.audio,\n });\n }\n break;\n\n case \"response.audio.done\":\n break;\n\n default:\n if (\n choice.delta.content &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n break;\n }\n\n if (choice.finish_reason) {\n lastFinishReason = choice.finish_reason;\n }\n } else {\n // Standard OpenAI-compatible streaming\n if (choice.delta.role === \"assistant\") {\n emitResponseMetadata();\n }\n\n if (\n choice.delta.reasoning_content !== undefined &&\n choice.delta.reasoning_content !== null &&\n choice.delta.reasoning_content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentReasoningId) startReasoningBlock();\n controller.enqueue({\n type: \"reasoning-delta\",\n id: currentReasoningId!,\n delta: choice.delta.reasoning_content,\n });\n }\n\n if (\n choice.delta.content !== undefined &&\n choice.delta.content !== null &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n endReasoningBlock();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n\n if (choice.finish_reason) {\n lastFinishReason = choice.finish_reason;\n endReasoningBlock();\n endTextBlock();\n }\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n endTextBlock();\n\n controller.enqueue({\n type: \"finish\",\n finishReason: convertFinishReason(lastFinishReason),\n usage: makeUsage(\n lastUsage.prompt_tokens,\n lastUsage.completion_tokens,\n lastUsage.total_tokens,\n ),\n });\n } catch (e) {\n controller.enqueue({\n type: \"error\",\n error: e,\n });\n } finally {\n controller.close();\n }\n },\n });\n\n return {\n stream,\n response: {\n headers: headersToObject(response.headers),\n },\n };\n }\n\n private convertToLongcatMessages(prompt: LanguageModelV3Prompt): unknown[] {\n const messages: Array<{ role: string; content: unknown }> = [];\n\n for (const message of prompt) {\n const { role } = message;\n\n if (role === \"system\") {\n if (this.isOmniModel) {\n messages.push({\n role: \"system\",\n content: [{ type: \"text\", text: message.content }],\n });\n } else {\n messages.push({\n role: \"system\",\n content: message.content,\n });\n }\n } else if (role === \"user\") {\n if (this.isOmniModel) {\n const userContent = message.content.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n return this.convertFilePartToOmni(part);\n });\n messages.push({ role: \"user\", content: userContent });\n } else {\n // Non-omni: collect text parts into a single string.\n // If there are file parts, fall back to the array format.\n const textParts: string[] = [];\n const fileParts: unknown[] = [];\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n textParts.push(part.text);\n } else {\n fileParts.push(this.convertFilePartToOmni(part));\n }\n }\n\n if (fileParts.length === 0) {\n // Text-only: send as plain string per LongCat standard API\n messages.push({ role: \"user\", content: textParts.join(\"\") });\n } else {\n // Mixed content: use array format\n const content: unknown[] = textParts.map((t) => ({\n type: \"text\",\n text: t,\n }));\n content.push(...fileParts);\n messages.push({ role: \"user\", content });\n }\n }\n } else if (role === \"assistant\") {\n let text = \"\";\n for (const part of message.content) {\n if (part.type === \"text\") {\n text += part.text;\n }\n }\n if (this.isOmniModel) {\n messages.push({\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n });\n } else {\n messages.push({\n role: \"assistant\",\n content: text,\n });\n }\n } else if (role === \"tool\") {\n for (const toolResult of message.content) {\n if (toolResult.type === \"tool-result\") {\n const output = toolResult.output;\n let contentValue: string;\n\n if (typeof output === \"string\") {\n contentValue = output;\n } else if (typeof output === \"object\") {\n contentValue = JSON.stringify(output);\n } else {\n contentValue = String(output);\n }\n\n if (this.isOmniModel) {\n messages.push({\n role: \"user\",\n content: [{ type: \"text\", text: contentValue }],\n });\n } else {\n messages.push({\n role: \"user\",\n content: contentValue,\n });\n }\n }\n }\n }\n }\n\n return messages;\n }\n\n private convertFilePartToOmni(\n part: LanguageModelV3FilePart,\n ): Record<string, unknown> {\n const omniType = mediaTypeToOmniType(part.mediaType);\n const format = formatFromMediaType(part.mediaType);\n\n if (part.data instanceof URL) {\n return {\n type: omniType,\n [omniType]: {\n type: \"url\",\n data:\n omniType === \"input_image\"\n ? [part.data.toString()]\n : part.data.toString(),\n ...(omniType === \"input_audio\" ? { format } : {}),\n },\n };\n }\n\n let base64Data: string;\n if (typeof part.data === \"string\") {\n base64Data = part.data;\n } else {\n base64Data = convertUint8ArrayToBase64(part.data);\n }\n\n return {\n type: omniType,\n [omniType]: {\n type: \"base64\",\n data: omniType === \"input_image\" ? [base64Data] : base64Data,\n ...(omniType === \"input_audio\" ? { format } : {}),\n },\n };\n }\n}\n"],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,OACK;;;ACSP,SAAS,iCAAiC;AAuC1C,SAAS,gBAAgB,SAA0C;AACjE,QAAM,SAAiC,CAAC;AACxC,UAAQ,QAAQ,CAAC,OAAO,QAAQ;AAC9B,WAAO,GAAG,IAAI;AAAA,EAChB,CAAC;AACD,SAAO;AACT;AAEA,SAAS,oBACP,KAC6B;AAC7B,MAAI,QAAQ,UAAU,OAAO,MAAM;AACjC,WAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,OAAU;AAAA,EAClD;AACA,MAAI,QAAQ,UAAU;AACpB,WAAO,EAAE,SAAS,UAAU,IAAI;AAAA,EAClC;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,QAAQ,SAAS,SAAS;AAC5B,aAAO,EAAE,SAAS,QAAQ,IAAI;AAAA,IAChC;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,EAAE,SAAS,SAAS,IAAI;AACjC;AAEA,SAAS,UACP,cACA,kBACA,aACA;AACA,SAAO;AAAA,IACL,aAAa;AAAA,MACX,OAAO,gBAAgB;AAAA,MACvB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACZ,OAAO,oBAAoB;AAAA,MAC3B,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,IACA,KAAK;AAAA,MACH,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,cAAc;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,oBACP,WAC+C;AAC/C,MAAI,UAAU,WAAW,QAAQ,EAAG,QAAO;AAC3C,MAAI,UAAU,WAAW,QAAQ,EAAG,QAAO;AAC3C,MAAI,UAAU,WAAW,QAAQ,EAAG,QAAO;AAC3C,SAAO;AACT;AAEA,SAAS,oBAAoB,WAA2B;AACtD,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,SAAO,MAAM,CAAC,KAAK;AACrB;AAEO,IAAM,2BAAN,MAA0D;AAAA,EAc/D,YACE,SACA,UACA,QACA;AAjBF,SAAS,uBAAuB;AAGhC,SAAS,gBAEsB;AAAA,MAC7B,WAAW,CAAC,IAAI;AAAA,MAChB,WAAW,CAAC,IAAI;AAAA,MAChB,WAAW,CAAC,IAAI;AAAA,IAClB;AASE,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAY,cAAuB;AACjC,WAAO,KAAK,QAAQ,YAAY,EAAE,SAAS,MAAM;AAAA,EACnD;AAAA,EAEQ,iBACN,SACA,QACA,kBACyB;AACzB,UAAM,WAAW,KAAK,yBAAyB,QAAQ,MAAM;AAE7D,UAAM,OAAgC;AAAA,MACpC,OAAO,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,mBAAmB,oBAAoB,CAAC,MAAM;AAAA,IAChD;AAEA,QAAI,KAAK,aAAa;AACpB,UAAI,KAAK,SAAS,WAAW;AAC3B,aAAK,YAAY,KAAK,SAAS;AAAA,MACjC;AACA,UAAI,KAAK,SAAS,OAAO;AACvB,cAAM,cAAuC,CAAC;AAC9C,YAAI,KAAK,SAAS,MAAM;AACtB,sBAAY,QAAQ,KAAK,SAAS,MAAM;AAC1C,YAAI,KAAK,SAAS,MAAM;AACtB,sBAAY,QAAQ,KAAK,SAAS,MAAM;AAC1C,YAAI,KAAK,SAAS,MAAM;AACtB,sBAAY,SAAS,KAAK,SAAS,MAAM;AAC3C,YAAI,KAAK,SAAS,MAAM,uBAAuB;AAC7C,sBAAY,0BACV,KAAK,SAAS,MAAM;AAAA,QACxB;AACA,aAAK,QAAQ;AAAA,MACf;AACA,UAAI,KAAK,SAAS,kBAAkB;AAClC,aAAK,oBAAoB,KAAK,SAAS;AAAA,MACzC;AACA,UAAI,KAAK,SAAS,uBAAuB;AACvC,aAAK,wBAAwB,KAAK,SAAS;AAAA,MAC7C;AACA,UAAI,KAAK,SAAS,wBAAwB;AACxC,aAAK,yBAAyB,KAAK,SAAS;AAAA,MAC9C;AAAA,IACF;AAEA,QAAI,QAAQ,mBAAmB,KAAK,SAAS,WAAW;AACtD,WAAK,aAAa,QAAQ,mBAAmB,KAAK,SAAS;AAAA,IAC7D;AACA,QAAI,QAAQ,eAAe,KAAK,SAAS,aAAa;AACpD,WAAK,cAAc,QAAQ,eAAe,KAAK,SAAS;AAAA,IAC1D;AACA,QAAI,KAAK,aAAa;AACpB,UAAI,QAAQ,QAAQ,KAAK,SAAS,MAAM;AACtC,aAAK,OAAO,QAAQ,QAAQ,KAAK,SAAS;AAAA,MAC5C;AACA,UAAI,QAAQ,QAAQ,KAAK,SAAS,MAAM;AACtC,aAAK,OAAO,QAAQ,QAAQ,KAAK,SAAS;AAAA,MAC5C;AAAA,IACF,OAAO;AACL,UAAI,QAAQ,QAAQ,KAAK,SAAS,MAAM;AACtC,aAAK,QAAQ,QAAQ,QAAQ,KAAK,SAAS;AAAA,MAC7C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WACJ,SACwC;AACxC,UAAM,OAAO,KAAK,iBAAiB,SAAS,KAAK;AAEjD,UAAM,MAAM,KAAK,OAAO,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACzD,UAAM,WAAW,OAAO,KAAK,OAAO,SAAS,OAAO,KAAK;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG,KAAK,OAAO,QAAQ;AAAA,MACzB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,IAAI;AAAA,QACR,sBAAsB,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,IAAI;AAAA,MACxE;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,SAAS,KAAK,UAAU,CAAC;AAE/B,UAAM,UAAoC,CAAC;AAC3C,QAAI,QAAQ,SAAS,SAAS;AAC5B,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM,OAAO,QAAQ;AAAA,MACvB,CAAwB;AAAA,IAC1B;AACA,QAAI,QAAQ,SAAS,OAAO;AAC1B,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,WAAW;AAAA,QACX,MAAM,OAAO,QAAQ;AAAA,MACvB,CAAwB;AAAA,IAC1B;AAEA,WAAO;AAAA,MACL;AAAA,MACA,cAAc,oBAAoB,QAAQ,aAAa;AAAA,MACvD,OAAO;AAAA,QACL,KAAK,OAAO;AAAA,QACZ,KAAK,OAAO;AAAA,QACZ,KAAK,OAAO;AAAA,MACd;AAAA,MACA,UAAU,CAAC;AAAA,MACX,UAAU;AAAA,QACR,IAAI,KAAK;AAAA,QACT,WAAW,KAAK,UAAU,IAAI,KAAK,KAAK,UAAU,GAAI,IAAI;AAAA,QAC1D,SAAS,KAAK;AAAA,QACd,SAAS,gBAAgB,SAAS,OAAO;AAAA,QACzC,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SACsC;AACtC,UAAM,OAAO,KAAK,iBAAiB,SAAS,IAAI;AAEhD,YAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAEzC,UAAM,MAAM,KAAK,OAAO,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACzD,UAAM,WAAW,OAAO,KAAK,OAAO,SAAS,OAAO,KAAK;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG,KAAK,OAAO,QAAQ;AAAA,MACzB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACpD,YAAM,IAAI;AAAA,QACR,MAAM,OAAO,WACX,sBAAsB,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,MAChE;AAAA,IACF;AAEA,UAAM,OAAO;AACb,UAAM,SAAS,IAAI,eAA0C;AAAA,MAC3D,MAAM,MAAM,YAAY;AACtB,cAAM,UAAU,IAAI,YAAY;AAChC,cAAM,aAAa,SAAS;AAC5B,YAAI,SAAS;AAEb,YAAI,gBAAgB;AACpB,cAAM,aAAa,MAAM,QAAQ,EAAE,aAAa;AAEhD,YAAI,gBAA+B;AACnC,YAAI,qBAAoC;AACxC,YAAI,YAAY;AAAA,UACd,eAAe;AAAA,UACf,mBAAmB;AAAA,UACnB,cAAc;AAAA,QAChB;AACA,YAAI,mBAAkC;AACtC,YAAI;AACJ,YAAI;AACJ,YAAI;AACJ,YAAI,0BAA0B;AAE9B,cAAM,uBAAuB,MAAM;AACjC,cAAI,CAAC,yBAAyB;AAC5B,sCAA0B;AAC1B,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN,IAAI;AAAA,cACJ,WAAW;AAAA,cACX,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,iBAAiB,MAAM;AAC3B,0BAAgB,WAAW;AAC3B,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAEA,cAAM,eAAe,MAAM;AACzB,cAAI,eAAe;AACjB,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN,IAAI;AAAA,YACN,CAAC;AACD,4BAAgB;AAAA,UAClB;AAAA,QACF;AAEA,cAAM,sBAAsB,MAAM;AAChC,+BAAqB,WAAW;AAChC,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAEA,cAAM,oBAAoB,MAAM;AAC9B,cAAI,oBAAoB;AACtB,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN,IAAI;AAAA,YACN,CAAC;AACD,iCAAqB;AAAA,UACvB;AAAA,QACF;AAEA,YAAI;AACF,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,UAAU,CAAC;AAAA,UACb,CAAC;AAED,gBAAM,SAAS,WAAW,UAAU;AACpC,cAAI;AACF,mBAAO,MAAM;AACX,oBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,kBAAI,KAAM;AACV,wBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,oBAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,uBAAS,MAAM,IAAI,KAAK;AAExB,yBAAW,QAAQ,OAAO;AACxB,wBAAQ,IAAI,EAAE,KAAK,CAAC;AAEpB,sBAAM,UAAU,KAAK,MAAM,OAAO,EAAE,CAAC;AACrC,oBAAI,CAAC,SAAS;AACZ;AAAA,gBACF;AAEA,sBAAM,OAAO,QAAQ,KAAK;AAC1B,oBAAI,CAAC,QAAQ,SAAS,UAAU;AAC9B;AAAA,gBACF;AAEA,oBAAI;AACF,wBAAM,SAA+B,KAAK,MAAM,IAAI;AACpD,sBAAI,OAAO,OAAO;AAChB,gCAAY,OAAO;AAAA,kBACrB;AACA,sBAAI,OAAO,MAAM,CAAC,YAAY;AAC5B,iCAAa,OAAO;AAAA,kBACtB;AACA,sBAAI,OAAO,OAAO;AAChB,oCAAgB,OAAO;AAAA,kBACzB;AACA,sBAAI,OAAO,WAAW,CAAC,mBAAmB;AACxC,wCAAoB,IAAI,KAAK,OAAO,UAAU,GAAI;AAAA,kBACpD;AAEA,wBAAM,SAAS,OAAO,UAAU,CAAC;AACjC,sBAAI,CAAC,OAAQ;AAEb,sBAAI,CAAC,cAAc,OAAO,MAAM,aAAa;AAC3C,iCAAa,OAAO,MAAM;AAAA,kBAC5B;AAEA,wBAAM,YAAY,OAAO,MAAM;AAE/B,sBAAI,KAAK,eAAe,WAAW;AAEjC,4BAAQ,WAAW;AAAA,sBACjB,KAAK;AACH,6CAAqB;AACrB;AAAA,sBAEF,KAAK;AAAA,sBACL,KAAK;AACH,4BACE,OAAO,MAAM,WACb,OAAO,MAAM,YAAY,IACzB;AACA,+CAAqB;AACrB,8BAAI,CAAC,cAAe,gBAAe;AACnC,qCAAW,QAAQ;AAAA,4BACjB,MAAM;AAAA,4BACN,IAAI;AAAA,4BACJ,OAAO,OAAO,MAAM;AAAA,0BACtB,CAAC;AAAA,wBACH;AACA;AAAA,sBAEF,KAAK;AAAA,sBACL,KAAK;AACH,0CAAkB;AAClB,qCAAa;AACb;AAAA,sBAEF,KAAK;AACH,4BAAI,OAAO,MAAM,OAAO;AACtB,+CAAqB;AACrB,qCAAW,QAAQ;AAAA,4BACjB,MAAM;AAAA,4BACN,WAAW;AAAA,4BACX,MAAM,OAAO,MAAM;AAAA,0BACrB,CAAC;AAAA,wBACH;AACA;AAAA,sBAEF,KAAK;AACH;AAAA,sBAEF;AACE,4BACE,OAAO,MAAM,WACb,OAAO,MAAM,YAAY,IACzB;AACA,+CAAqB;AACrB,8BAAI,CAAC,cAAe,gBAAe;AACnC,qCAAW,QAAQ;AAAA,4BACjB,MAAM;AAAA,4BACN,IAAI;AAAA,4BACJ,OAAO,OAAO,MAAM;AAAA,0BACtB,CAAC;AAAA,wBACH;AACA;AAAA,oBACJ;AAEA,wBAAI,OAAO,eAAe;AACxB,yCAAmB,OAAO;AAAA,oBAC5B;AAAA,kBACF,OAAO;AAEL,wBAAI,OAAO,MAAM,SAAS,aAAa;AACrC,2CAAqB;AAAA,oBACvB;AAEA,wBACE,OAAO,MAAM,sBAAsB,UACnC,OAAO,MAAM,sBAAsB,QACnC,OAAO,MAAM,sBAAsB,IACnC;AACA,2CAAqB;AACrB,0BAAI,CAAC,mBAAoB,qBAAoB;AAC7C,iCAAW,QAAQ;AAAA,wBACjB,MAAM;AAAA,wBACN,IAAI;AAAA,wBACJ,OAAO,OAAO,MAAM;AAAA,sBACtB,CAAC;AAAA,oBACH;AAEA,wBACE,OAAO,MAAM,YAAY,UACzB,OAAO,MAAM,YAAY,QACzB,OAAO,MAAM,YAAY,IACzB;AACA,2CAAqB;AACrB,wCAAkB;AAClB,0BAAI,CAAC,cAAe,gBAAe;AACnC,iCAAW,QAAQ;AAAA,wBACjB,MAAM;AAAA,wBACN,IAAI;AAAA,wBACJ,OAAO,OAAO,MAAM;AAAA,sBACtB,CAAC;AAAA,oBACH;AAEA,wBAAI,OAAO,eAAe;AACxB,yCAAmB,OAAO;AAC1B,wCAAkB;AAClB,mCAAa;AAAA,oBACf;AAAA,kBACF;AAAA,gBACF,QAAQ;AAAA,gBAER;AAAA,cACF;AAAA,YACF;AAAA,UACF,UAAE;AACA,mBAAO,YAAY;AAAA,UACrB;AAEA,uBAAa;AAEb,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,cAAc,oBAAoB,gBAAgB;AAAA,YAClD,OAAO;AAAA,cACL,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,YACZ;AAAA,UACF,CAAC;AAAA,QACH,SAAS,GAAG;AACV,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,OAAO;AAAA,UACT,CAAC;AAAA,QACH,UAAE;AACA,qBAAW,MAAM;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,QACR,SAAS,gBAAgB,SAAS,OAAO;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,yBAAyB,QAA0C;AACzE,UAAM,WAAsD,CAAC;AAE7D,eAAW,WAAW,QAAQ;AAC5B,YAAM,EAAE,KAAK,IAAI;AAEjB,UAAI,SAAS,UAAU;AACrB,YAAI,KAAK,aAAa;AACpB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,UACnD,CAAC;AAAA,QACH,OAAO;AACL,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,QACH;AAAA,MACF,WAAW,SAAS,QAAQ;AAC1B,YAAI,KAAK,aAAa;AACpB,gBAAM,cAAc,QAAQ,QAAQ,IAAI,CAAC,SAAS;AAChD,gBAAI,KAAK,SAAS,QAAQ;AACxB,qBAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,YACzC;AACA,mBAAO,KAAK,sBAAsB,IAAI;AAAA,UACxC,CAAC;AACD,mBAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,YAAY,CAAC;AAAA,QACtD,OAAO;AAGL,gBAAM,YAAsB,CAAC;AAC7B,gBAAM,YAAuB,CAAC;AAE9B,qBAAW,QAAQ,QAAQ,SAAS;AAClC,gBAAI,KAAK,SAAS,QAAQ;AACxB,wBAAU,KAAK,KAAK,IAAI;AAAA,YAC1B,OAAO;AACL,wBAAU,KAAK,KAAK,sBAAsB,IAAI,CAAC;AAAA,YACjD;AAAA,UACF;AAEA,cAAI,UAAU,WAAW,GAAG;AAE1B,qBAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,UAAU,KAAK,EAAE,EAAE,CAAC;AAAA,UAC7D,OAAO;AAEL,kBAAM,UAAqB,UAAU,IAAI,CAAC,OAAO;AAAA,cAC/C,MAAM;AAAA,cACN,MAAM;AAAA,YACR,EAAE;AACF,oBAAQ,KAAK,GAAG,SAAS;AACzB,qBAAS,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,UACzC;AAAA,QACF;AAAA,MACF,WAAW,SAAS,aAAa;AAC/B,YAAI,OAAO;AACX,mBAAW,QAAQ,QAAQ,SAAS;AAClC,cAAI,KAAK,SAAS,QAAQ;AACxB,oBAAQ,KAAK;AAAA,UACf;AAAA,QACF;AACA,YAAI,KAAK,aAAa;AACpB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,UAClC,CAAC;AAAA,QACH,OAAO;AACL,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF,WAAW,SAAS,QAAQ;AAC1B,mBAAW,cAAc,QAAQ,SAAS;AACxC,cAAI,WAAW,SAAS,eAAe;AACrC,kBAAM,SAAS,WAAW;AAC1B,gBAAI;AAEJ,gBAAI,OAAO,WAAW,UAAU;AAC9B,6BAAe;AAAA,YACjB,WAAW,OAAO,WAAW,UAAU;AACrC,6BAAe,KAAK,UAAU,MAAM;AAAA,YACtC,OAAO;AACL,6BAAe,OAAO,MAAM;AAAA,YAC9B;AAEA,gBAAI,KAAK,aAAa;AACpB,uBAAS,KAAK;AAAA,gBACZ,MAAM;AAAA,gBACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,aAAa,CAAC;AAAA,cAChD,CAAC;AAAA,YACH,OAAO;AACL,uBAAS,KAAK;AAAA,gBACZ,MAAM;AAAA,gBACN,SAAS;AAAA,cACX,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,sBACN,MACyB;AACzB,UAAM,WAAW,oBAAoB,KAAK,SAAS;AACnD,UAAM,SAAS,oBAAoB,KAAK,SAAS;AAEjD,QAAI,KAAK,gBAAgB,KAAK;AAC5B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,CAAC,QAAQ,GAAG;AAAA,UACV,MAAM;AAAA,UACN,MACE,aAAa,gBACT,CAAC,KAAK,KAAK,SAAS,CAAC,IACrB,KAAK,KAAK,SAAS;AAAA,UACzB,GAAI,aAAa,gBAAgB,EAAE,OAAO,IAAI,CAAC;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,OAAO,KAAK,SAAS,UAAU;AACjC,mBAAa,KAAK;AAAA,IACpB,OAAO;AACL,mBAAa,0BAA0B,KAAK,IAAI;AAAA,IAClD;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,CAAC,QAAQ,GAAG;AAAA,QACV,MAAM;AAAA,QACN,MAAM,aAAa,gBAAgB,CAAC,UAAU,IAAI;AAAA,QAClD,GAAI,aAAa,gBAAgB,EAAE,OAAO,IAAI,CAAC;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACF;;;ADrqBO,SAAS,cACd,UAAmC,CAAC,GACnB;AACjB,QAAM,UAAU;AAAA,IACd,QAAQ,WAAW;AAAA,EACrB;AAEA,QAAM,aAAa,OAAO;AAAA,IACxB,eAAe,UAAU,WAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,SAA4B;AAAA,IAChC,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,KAAK,MAAM;AACjB,YAAM,MAAM,IAAI,IAAI,GAAG,OAAO,GAAG,IAAI,EAAE;AACvC,UAAI,QAAQ,aAAa;AACvB,YAAI,SAAS,IAAI,gBAAgB,QAAQ,WAAW,EAAE,SAAS;AAAA,MACjE;AACA,aAAO,IAAI,SAAS;AAAA,IACtB;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,kBAAkB,CACtB,SACA,WAAgC,CAAC,MAC9B;AACH,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,CACf,SACA,aACG,gBAAgB,SAAS,QAAQ;AAEtC,WAAS,YAAY;AAErB,SAAO;AACT;AAEO,IAAM,UAAU,cAAc;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/longcat-provider.ts","../src/longcat-chat-language-model.ts"],"sourcesContent":["import { LanguageModelV3 } from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { LongcatChatLanguageModel } from './longcat-chat-language-model';\nimport type { LongcatChatModelId, LongcatChatSettings } from './longcat-chat-settings';\nimport type { LongcatChatConfig } from './longcat-chat-language-model';\n\nexport interface LongcatProviderSettings {\n apiKey?: string;\n baseURL?: string;\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface LongcatProvider {\n (\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ): LanguageModelV3;\n\n chatModel(\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ): LanguageModelV3;\n}\n\nexport function createLongcat(\n options: LongcatProviderSettings = {},\n): LongcatProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.longcat.chat/openai/v1',\n );\n\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'LONGCAT_API_KEY',\n description: 'Longcat API key',\n })}`,\n ...options.headers,\n });\n\n const config: LongcatChatConfig = {\n provider: 'longcat',\n url: ({ path }) => {\n const url = new URL(`${baseURL}${path}`);\n if (options.queryParams) {\n url.search = new URLSearchParams(options.queryParams).toString();\n }\n return url.toString();\n },\n headers: getHeaders,\n fetch: options.fetch,\n };\n\n const createChatModel = (\n modelId: LongcatChatModelId,\n settings: LongcatChatSettings = {},\n ) => {\n return new LongcatChatLanguageModel(\n modelId,\n settings,\n config,\n );\n };\n\n const provider = (\n modelId: LongcatChatModelId,\n settings?: LongcatChatSettings,\n ) => createChatModel(modelId, settings);\n\n provider.chatModel = createChatModel;\n\n return provider;\n}\n\nexport const longcat = createLongcat();\n","import {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Prompt,\n LanguageModelV3StreamPart,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n LanguageModelV3Content,\n LanguageModelV3Text,\n LanguageModelV3File,\n LanguageModelV3FilePart,\n} from \"@ai-sdk/provider\";\nimport { convertUint8ArrayToBase64 } from \"@ai-sdk/provider-utils\";\nimport type {\n LongcatChatModelId,\n LongcatChatSettings,\n} from \"./longcat-chat-settings\";\n\nexport interface LongcatChatConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: () => Record<string, string>;\n fetch?: typeof fetch;\n}\n\ninterface LongcatToolCallChunk {\n index: number;\n id?: string;\n type?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n}\n\ninterface LongcatResponseChunk {\n id?: string;\n object?: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string | null;\n reasoning_content?: string | null;\n audio?: string | null;\n tool_calls?: LongcatToolCallChunk[];\n type?: string;\n turn_id?: string;\n response_id?: string;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n session_id?: string;\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nfunction convertFinishReason(\n raw: string | null | undefined,\n): LanguageModelV3FinishReason {\n if (raw === \"stop\" || raw == null) {\n return { unified: \"stop\", raw: raw ?? undefined };\n }\n if (raw === \"length\") {\n return { unified: \"length\", raw };\n }\n if (raw === \"tool_calls\" || raw === \"function_call\") {\n return { unified: \"tool-calls\", raw };\n }\n try {\n const parsed = JSON.parse(raw);\n if (parsed?.type === \"abort\") {\n return { unified: \"stop\", raw };\n }\n } catch {\n // not JSON, fall through\n }\n return { unified: \"other\", raw };\n}\n\nfunction makeUsage(\n promptTokens?: number,\n completionTokens?: number,\n totalTokens?: number,\n) {\n return {\n inputTokens: {\n total: promptTokens ?? undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens ?? undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: {\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n total_tokens: totalTokens,\n },\n };\n}\n\nfunction mediaTypeToOmniType(\n mediaType: string,\n): \"input_image\" | \"input_audio\" | \"input_video\" {\n if (mediaType.startsWith(\"image/\")) return \"input_image\";\n if (mediaType.startsWith(\"audio/\")) return \"input_audio\";\n if (mediaType.startsWith(\"video/\")) return \"input_video\";\n return \"input_image\";\n}\n\nfunction formatFromMediaType(mediaType: string): string {\n const parts = mediaType.split(\"/\");\n return parts[1] ?? mediaType;\n}\n\nexport class LongcatChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\" as const;\n readonly modelId: string;\n readonly settings: LongcatChatSettings;\n readonly supportedUrls:\n | PromiseLike<Record<string, RegExp[]>>\n | Record<string, RegExp[]> = {\n \"image/*\": [/.*/],\n \"audio/*\": [/.*/],\n \"video/*\": [/.*/],\n };\n\n private readonly config: LongcatChatConfig;\n\n constructor(\n modelId: LongcatChatModelId,\n settings: LongcatChatSettings,\n config: LongcatChatConfig,\n ) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get isOmniModel(): boolean {\n return this.modelId.toLowerCase().includes(\"omni\");\n }\n\n private buildRequestBody(\n options: LanguageModelV3CallOptions,\n stream: boolean,\n outputModalities?: string[],\n ): Record<string, unknown> {\n const messages = this.convertToLongcatMessages(options.prompt);\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages,\n stream,\n output_modalities: outputModalities ?? [\"text\"],\n };\n\n if (this.isOmniModel) {\n if (this.settings.sessionId) {\n body.sessionId = this.settings.sessionId;\n }\n if (this.settings.audio) {\n const audioConfig: Record<string, unknown> = {};\n if (this.settings.audio.voice)\n audioConfig.voice = this.settings.audio.voice;\n if (this.settings.audio.speed)\n audioConfig.speed = this.settings.audio.speed;\n if (this.settings.audio.volume)\n audioConfig.volume = this.settings.audio.volume;\n if (this.settings.audio.outputAudioSamplerate) {\n audioConfig.output_audio_samplerate =\n this.settings.audio.outputAudioSamplerate;\n }\n body.audio = audioConfig;\n }\n if (this.settings.outputModalities) {\n body.output_modalities = this.settings.outputModalities;\n }\n if (this.settings.textRepetitionPenalty) {\n body.textRepetitionPenalty = this.settings.textRepetitionPenalty;\n }\n if (this.settings.audioRepetitionPenalty) {\n body.audioRepetitionPenalty = this.settings.audioRepetitionPenalty;\n }\n }\n\n if (options.tools?.length) {\n body.tools = options.tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.type === \"function\" ? tool.name : tool.id,\n description: tool.type === \"function\" ? tool.description : undefined,\n parameters: tool.type === \"function\" ? tool.inputSchema : undefined,\n strict: tool.type === \"function\" ? tool.strict : undefined,\n },\n }));\n }\n\n if (options.toolChoice) {\n const choice = options.toolChoice;\n switch (choice.type) {\n case \"auto\":\n body.tool_choice = \"auto\";\n break;\n case \"none\":\n body.tool_choice = \"none\";\n break;\n case \"required\":\n body.tool_choice = \"required\";\n break;\n case \"tool\":\n body.tool_choice = {\n type: \"function\",\n function: { name: choice.toolName },\n };\n break;\n }\n }\n\n if (options.maxOutputTokens ?? this.settings.maxTokens) {\n body.max_tokens = options.maxOutputTokens ?? this.settings.maxTokens;\n }\n if (options.temperature ?? this.settings.temperature) {\n body.temperature = options.temperature ?? this.settings.temperature;\n }\n if (this.isOmniModel) {\n if (options.topP ?? this.settings.topP) {\n body.topP = options.topP ?? this.settings.topP;\n }\n if (options.topK ?? this.settings.topK) {\n body.topK = options.topK ?? this.settings.topK;\n }\n } else {\n if (options.topP ?? this.settings.topP) {\n body.top_p = options.topP ?? this.settings.topP;\n }\n }\n\n return body;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const body = this.buildRequestBody(options, false);\n\n const url = this.config.url({ path: \"/chat/completions\" });\n const response = await (this.config.fetch ?? fetch)(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers(),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\n `Longcat API error: ${response.status} ${response.statusText} - ${text}`,\n );\n }\n\n const json = await response.json();\n const choice = json.choices?.[0];\n\n const content: LanguageModelV3Content[] = [];\n if (choice?.message?.content) {\n content.push({\n type: \"text\",\n text: choice.message.content,\n } as LanguageModelV3Text);\n }\n if (choice?.message?.tool_calls?.length) {\n for (const tc of choice.message.tool_calls) {\n content.push({\n type: \"tool-call\",\n toolCallId: tc.id ?? `call_${Date.now()}`,\n toolName: tc.function?.name ?? \"\",\n input: tc.function?.arguments ?? \"{}\",\n });\n }\n }\n if (choice?.message?.audio) {\n content.push({\n type: \"file\",\n mediaType: \"audio/wav\",\n data: choice.message.audio,\n } as LanguageModelV3File);\n }\n\n return {\n content,\n finishReason: convertFinishReason(choice?.finish_reason),\n usage: makeUsage(\n json.usage?.prompt_tokens,\n json.usage?.completion_tokens,\n json.usage?.total_tokens,\n ),\n warnings: [],\n response: {\n id: json.id,\n timestamp: json.created ? new Date(json.created * 1000) : undefined,\n modelId: json.model,\n headers: headersToObject(response.headers),\n body: json,\n },\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const body = this.buildRequestBody(options, true);\n\n const url = this.config.url({ path: \"/chat/completions\" });\n const response = await (this.config.fetch ?? fetch)(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers(),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(\n error.error?.message ??\n `Longcat API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const self = this;\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n const decoder = new TextDecoder();\n const bodyStream = response.body!;\n let buffer = \"\";\n\n let textIdCounter = 0;\n const nextTextId = () => `text-${++textIdCounter}`;\n\n let currentTextId: string | null = null;\n let currentReasoningId: string | null = null;\n let lastUsage = {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n };\n let lastFinishReason: string | null = null;\n let responseId: string | undefined;\n let responseModel: string | undefined;\n let responseTimestamp: Date | undefined;\n let emittedResponseMetadata = false;\n\n const toolCallAccumulator = new Map<\n number,\n { id: string; name: string; arguments: string }\n >();\n let activeToolCallIndex: number | null = null;\n let toolCallIdCounter = 0;\n\n const emitResponseMetadata = () => {\n if (!emittedResponseMetadata) {\n emittedResponseMetadata = true;\n controller.enqueue({\n type: \"response-metadata\",\n id: responseId,\n timestamp: responseTimestamp,\n modelId: responseModel,\n });\n }\n };\n\n const startTextBlock = () => {\n currentTextId = nextTextId();\n controller.enqueue({\n type: \"text-start\",\n id: currentTextId,\n });\n };\n\n const endTextBlock = () => {\n if (currentTextId) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n currentTextId = null;\n }\n };\n\n const startReasoningBlock = () => {\n currentReasoningId = nextTextId();\n controller.enqueue({\n type: \"reasoning-start\",\n id: currentReasoningId,\n });\n };\n\n const endReasoningBlock = () => {\n if (currentReasoningId) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: currentReasoningId,\n });\n currentReasoningId = null;\n }\n };\n\n const finalizeToolCall = (index: number) => {\n const tc = toolCallAccumulator.get(index);\n if (!tc) return;\n controller.enqueue({\n type: \"tool-input-end\",\n id: tc.id,\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: tc.name,\n input: tc.arguments,\n });\n toolCallAccumulator.delete(index);\n };\n\n try {\n controller.enqueue({\n type: \"stream-start\",\n warnings: [],\n });\n\n const reader = bodyStream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const rawdata = line.split(\"data:\")[1];\n if (!rawdata) {\n continue;\n }\n\n const data = rawdata.trim();\n if (!data || data === \"[DONE]\") {\n continue;\n }\n\n try {\n const parsed: LongcatResponseChunk = JSON.parse(data);\n if (parsed.usage) {\n lastUsage = parsed.usage;\n }\n if (parsed.id && !responseId) {\n responseId = parsed.id;\n }\n if (parsed.model) {\n responseModel = parsed.model;\n }\n if (parsed.created && !responseTimestamp) {\n responseTimestamp = new Date(parsed.created * 1000);\n }\n\n const choice = parsed.choices?.[0];\n if (!choice) continue;\n\n if (!responseId && choice.delta.response_id) {\n responseId = choice.delta.response_id;\n }\n\n const deltaType = choice.delta.type;\n\n if (self.isOmniModel && deltaType) {\n // Omni model streaming\n switch (deltaType) {\n case \"response.start\":\n emitResponseMetadata();\n break;\n\n case \"response.text.delta\":\n case \"response.audio_transcript.delta\":\n if (\n choice.delta.content &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n break;\n\n case \"response.text.done\":\n case \"response.audio_transcript.done\":\n endReasoningBlock();\n endTextBlock();\n\n for (const idx of toolCallAccumulator.keys()) {\n finalizeToolCall(idx);\n }\n activeToolCallIndex = null;\n break;\n\n case \"response.audio.delta\":\n if (choice.delta.audio) {\n emitResponseMetadata();\n controller.enqueue({\n type: \"file\",\n mediaType: \"audio/wav\",\n data: choice.delta.audio,\n });\n }\n break;\n\n case \"response.audio.done\":\n break;\n\n default:\n if (\n choice.delta.content &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n break;\n }\n\n if (choice.finish_reason) {\n lastFinishReason = choice.finish_reason;\n }\n } else {\n // Standard OpenAI-compatible streaming\n if (choice.delta.role === \"assistant\") {\n emitResponseMetadata();\n }\n\n if (\n choice.delta.reasoning_content !== undefined &&\n choice.delta.reasoning_content !== null &&\n choice.delta.reasoning_content !== \"\"\n ) {\n emitResponseMetadata();\n if (!currentReasoningId) startReasoningBlock();\n controller.enqueue({\n type: \"reasoning-delta\",\n id: currentReasoningId!,\n delta: choice.delta.reasoning_content,\n });\n }\n\n if (\n choice.delta.content !== undefined &&\n choice.delta.content !== null &&\n choice.delta.content !== \"\"\n ) {\n emitResponseMetadata();\n endReasoningBlock();\n if (!currentTextId) startTextBlock();\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: choice.delta.content,\n });\n }\n\n if (choice.delta.tool_calls?.length) {\n emitResponseMetadata();\n endTextBlock();\n endReasoningBlock();\n\n for (const tc of choice.delta.tool_calls) {\n const idx = tc.index ?? 0;\n\n if (\n tc.id &&\n !toolCallAccumulator.has(idx)\n ) {\n if (\n activeToolCallIndex !== null &&\n activeToolCallIndex !== idx\n ) {\n finalizeToolCall(activeToolCallIndex);\n }\n activeToolCallIndex = idx;\n const id =\n tc.id ||\n `call_${++toolCallIdCounter}`;\n toolCallAccumulator.set(idx, {\n id,\n name: tc.function?.name ?? \"\",\n arguments: \"\",\n });\n controller.enqueue({\n type: \"tool-input-start\",\n id,\n toolName: tc.function?.name ?? \"\",\n });\n }\n\n const acc = toolCallAccumulator.get(idx);\n if (acc) {\n if (tc.function?.name) {\n acc.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n acc.arguments += tc.function.arguments;\n controller.enqueue({\n type: \"tool-input-delta\",\n id: acc.id,\n delta: tc.function.arguments,\n });\n }\n }\n }\n }\n\n if (choice.finish_reason) {\n lastFinishReason = choice.finish_reason;\n endReasoningBlock();\n endTextBlock();\n if (activeToolCallIndex !== null) {\n finalizeToolCall(activeToolCallIndex);\n activeToolCallIndex = null;\n }\n }\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n endTextBlock();\n\n controller.enqueue({\n type: \"finish\",\n finishReason: convertFinishReason(lastFinishReason),\n usage: makeUsage(\n lastUsage.prompt_tokens,\n lastUsage.completion_tokens,\n lastUsage.total_tokens,\n ),\n });\n } catch (e) {\n controller.enqueue({\n type: \"error\",\n error: e,\n });\n } finally {\n controller.close();\n }\n },\n });\n\n return {\n stream,\n response: {\n headers: headersToObject(response.headers),\n },\n };\n }\n\n private convertToLongcatMessages(prompt: LanguageModelV3Prompt): unknown[] {\n const messages: Array<Record<string, unknown>> = [];\n\n for (const message of prompt) {\n const { role } = message;\n\n if (role === \"system\") {\n if (this.isOmniModel) {\n messages.push({\n role: \"system\",\n content: [{ type: \"text\", text: message.content }],\n });\n } else {\n messages.push({\n role: \"system\",\n content: message.content,\n });\n }\n } else if (role === \"user\") {\n if (this.isOmniModel) {\n const userContent = message.content.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n return this.convertFilePartToOmni(part);\n });\n messages.push({ role: \"user\", content: userContent });\n } else {\n // Non-omni: collect text parts into a single string.\n // If there are file parts, fall back to the array format.\n const textParts: string[] = [];\n const fileParts: unknown[] = [];\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n textParts.push(part.text);\n } else {\n fileParts.push(this.convertFilePartToOmni(part));\n }\n }\n\n if (fileParts.length === 0) {\n // Text-only: send as plain string per LongCat standard API\n messages.push({ role: \"user\", content: textParts.join(\"\") });\n } else {\n // Mixed content: use array format\n const content: unknown[] = textParts.map((t) => ({\n type: \"text\",\n text: t,\n }));\n content.push(...fileParts);\n messages.push({ role: \"user\", content });\n }\n }\n } else if (role === \"assistant\") {\n let text = \"\";\n const toolCalls: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }> = [];\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n text += part.text;\n } else if (part.type === \"tool-call\") {\n toolCalls.push({\n id: part.toolCallId,\n type: \"function\",\n function: {\n name: part.toolName,\n arguments:\n typeof part.input === \"string\"\n ? part.input\n : JSON.stringify(part.input),\n },\n });\n }\n }\n\n const assistantMsg: Record<string, unknown> = { role: \"assistant\" };\n\n if (this.isOmniModel) {\n assistantMsg.content = text\n ? [{ type: \"text\", text }]\n : null;\n } else {\n assistantMsg.content = text || null;\n }\n\n if (toolCalls.length > 0) {\n assistantMsg.tool_calls = toolCalls;\n }\n\n messages.push(assistantMsg);\n } else if (role === \"tool\") {\n for (const toolResult of message.content) {\n if (toolResult.type === \"tool-result\") {\n const output = toolResult.output;\n let contentValue: string;\n\n if (typeof output === \"string\") {\n contentValue = output;\n } else if (typeof output === \"object\") {\n contentValue = JSON.stringify(output);\n } else {\n contentValue = String(output);\n }\n\n messages.push({\n role: \"tool\",\n tool_call_id: toolResult.toolCallId,\n content: contentValue,\n });\n }\n }\n }\n }\n\n return messages;\n }\n\n private convertFilePartToOmni(\n part: LanguageModelV3FilePart,\n ): Record<string, unknown> {\n const omniType = mediaTypeToOmniType(part.mediaType);\n const format = formatFromMediaType(part.mediaType);\n\n if (part.data instanceof URL) {\n return {\n type: omniType,\n [omniType]: {\n type: \"url\",\n data:\n omniType === \"input_image\"\n ? [part.data.toString()]\n : part.data.toString(),\n ...(omniType === \"input_audio\" ? { format } : {}),\n },\n };\n }\n\n let base64Data: string;\n if (typeof part.data === \"string\") {\n base64Data = part.data;\n } else {\n base64Data = convertUint8ArrayToBase64(part.data);\n }\n\n return {\n type: omniType,\n [omniType]: {\n type: \"base64\",\n data: omniType === \"input_image\" ? [base64Data] : base64Data,\n ...(omniType === \"input_audio\" ? { format } : {}),\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
|