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 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
- messages.push({
502
- role: "assistant",
503
- content: [{ type: "text", text }]
504
- });
619
+ assistantMsg.content = text ? [{ type: "text", text }] : null;
505
620
  } else {
506
- messages.push({
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
- if (this.isOmniModel) {
524
- messages.push({
525
- role: "user",
526
- content: [{ type: "text", text: contentValue }]
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
- messages.push({
477
- role: "assistant",
478
- content: [{ type: "text", text }]
479
- });
594
+ assistantMsg.content = text ? [{ type: "text", text }] : null;
480
595
  } else {
481
- messages.push({
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
- if (this.isOmniModel) {
499
- messages.push({
500
- role: "user",
501
- content: [{ type: "text", text: contentValue }]
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
  }
@@ -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":"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","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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "longcat-ai-sdk-provider",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Vercel AI SDK provider for Longcat",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",