@baishuyun/coze-provider 2.0.15 → 2.0.17

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/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @baishuyun/coze-provider
2
2
 
3
+ ## 2.0.17
4
+
5
+ ### Patch Changes
6
+
7
+ - bug fix
8
+ - Updated dependencies
9
+ - @baishuyun/ai-feat-utils@2.0.17
10
+
11
+ ## 2.0.16
12
+
13
+ ### Patch Changes
14
+
15
+ - bug fix
16
+ - Updated dependencies
17
+ - @baishuyun/ai-feat-utils@2.0.16
18
+
3
19
  ## 2.0.15
4
20
 
5
21
  ### Patch Changes
package/dist/index.js CHANGED
@@ -339,7 +339,7 @@ var mcp2llmChunk = (part) => {
339
339
  console.error("[ERROR]", part.data);
340
340
  return {
341
341
  type: "error",
342
- error: new Error(`Coze streaming error: ${JSON.stringify(part.data)}`)
342
+ error: part.data
343
343
  };
344
344
  default:
345
345
  console.warn("Unknown event type:", part.event);
@@ -403,6 +403,7 @@ var BuildWarningGenerateResult = (message) => {
403
403
  };
404
404
 
405
405
  // src/coze-language-model.ts
406
+ var import_ai_feat_utils = require("@baishuyun/ai-feat-utils");
406
407
  var CozeLanguageModel = class {
407
408
  specificationVersion = "v2";
408
409
  provider;
@@ -483,6 +484,7 @@ var CozeLanguageModel = class {
483
484
  });
484
485
  const user_id = options.headers ? options.headers["x-user-id"] : "";
485
486
  const user_var = options.headers ? options.headers["x-user-var"] : "";
487
+ const user_param = (options.headers ? options.headers["x-user-param"] : "") ?? "";
486
488
  let customVar;
487
489
  if (user_var) {
488
490
  try {
@@ -491,13 +493,15 @@ var CozeLanguageModel = class {
491
493
  console.warn("x-user-var parse error", e);
492
494
  }
493
495
  }
494
- console.log("msssage send to coze", JSON.stringify(messages, null, 2));
496
+ const params = user_param ? (0, import_ai_feat_utils.safeParseJson)(user_param) : {};
497
+ console.log("params 2 workflow", params);
495
498
  const body = {
496
499
  bot_id: this.config.botId,
497
500
  auto_save_history: false,
498
501
  user_id: user_id || "7543191937730215936",
499
502
  stream: true,
500
- additional_messages: messages
503
+ additional_messages: messages,
504
+ parameters: params
501
505
  };
502
506
  if (customVar) {
503
507
  body.custom_variables = customVar;
@@ -623,7 +627,7 @@ var createTextInfoEnqueuer = (controller) => (textInfo, metaPayload, id = (0, im
623
627
  };
624
628
 
625
629
  // src/stream-trasnformer/fields-json-transform-stream.ts
626
- var import_ai_feat_utils = require("@baishuyun/ai-feat-utils");
630
+ var import_ai_feat_utils2 = require("@baishuyun/ai-feat-utils");
627
631
  var createFieldsJsonTransformStream = (enableJsonParser) => {
628
632
  let parser;
629
633
  let enqueueTextDelta;
@@ -688,7 +692,7 @@ var createFieldsJsonTransformStream = (enableJsonParser) => {
688
692
  JSON.stringify(value),
689
693
  JSON.stringify({
690
694
  type: "mcp-fields-json",
691
- field: (0, import_ai_feat_utils.rebuildFieldsJsonStructure)(value)
695
+ field: (0, import_ai_feat_utils2.rebuildFieldsJsonStructure)(value)
692
696
  }),
693
697
  id
694
698
  );
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/coze-provider.ts","../src/const.ts","../src/coze-language-model.ts","../src/utils/prompt-to-model-msg.ts","../src/utils/accumulate-sse-response.ts","../src/utils/create-error-stream.ts","../src/evt-sample.ts","../src/stream-trasnformer/llm-chunk-injector-transform-stream.ts","../src/stream-trasnformer/mcp-chunk-filter-transform-stream.ts","../src/utils/mcp-to-llm-chunk.ts","../src/stream-trasnformer/llm-part-transform-stream.ts","../src/utils/build-generate-result-by-chat-res.ts","../src/stream-trasnformer/fields-json-transform-stream.ts","../src/utils/enqueue-text-info.ts","../src/stream-trasnformer/suggestion-transform-stream.ts"],"sourcesContent":["export { createCoze } from \"./coze-provider\";\nexport { createFieldsJsonTransformStream } from \"./stream-trasnformer/fields-json-transform-stream\";\nexport { default as SuggestionTransformStream } from \"./stream-trasnformer/suggestion-transform-stream\";\nexport { createTextInfoEnqueuer } from \"./utils/enqueue-text-info\";\n","import {\n LanguageModelV2,\n LanguageModelV2StreamPart,\n NoSuchModelError,\n ProviderV2,\n} from '@ai-sdk/provider';\n\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { CozeChatModelId } from './types';\nimport { VERSION } from './const';\nimport { CozeLanguageModel } from './coze-language-model';\n\nexport interface CozeProviderSettings {\n apiKey?: string;\n /**\nBase URL for the API calls.\n*/\n baseURL?: string;\n\n botId: string;\n\n /**\nCustom headers to include in the requests.\n*/\n headers?: Record<string, string>;\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n*/\n fetch?: FetchFunction;\n\n extraStreamTransformers?: (() => TransformStream<LanguageModelV2StreamPart, any>)[];\n}\n\nexport interface CozeProvider extends ProviderV2 {\n (modelId: CozeChatModelId): LanguageModelV2;\n\n languageModel(modelId: CozeChatModelId): LanguageModelV2;\n\n /**\nCreates a DeepSeek chat model for text generation.\n*/\n chat(modelId: CozeChatModelId): LanguageModelV2;\n}\n\nexport function createCoze(\n options: CozeProviderSettings = {\n botId: '',\n }\n): CozeProvider {\n const baseURL = withoutTrailingSlash(options.baseURL);\n\n const agentPartHeader = withUserAgentSuffix(options.headers || {}, `ai-sdk/coze/${VERSION}`);\n const authorizationHeader = `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'COZE_API_KEY',\n description: '',\n })}`;\n\n const getHeaders = () => ({\n ...agentPartHeader,\n Authorization: authorizationHeader,\n 'content-type': 'application/json',\n });\n\n const createLanguageModel = (modelId: CozeChatModelId) => {\n return new CozeLanguageModel(modelId, {\n botId: options.botId,\n provider: `coze.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n extraStreamTransformers: options.extraStreamTransformers || [],\n });\n };\n\n const provider = (modelId: CozeChatModelId) => createLanguageModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n","export const VERSION = \"0.0.1\";\n","import {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from '@ai-sdk/provider';\nimport { CozeChatConfig, IGenerateResult } from './types';\nimport { ServerSentEventTransformStream } from 'parse-sse';\nimport { TextDecoderStream } from 'stream/web';\nimport { convertPromptToMessages } from './utils/prompt-to-model-msg';\nimport { accumulateSSEResponse } from './utils/accumulate-sse-response';\nimport { createErrorStream } from './utils/create-error-stream';\nimport { LLMChunkInjectorTransformStream } from './stream-trasnformer/llm-chunk-injector-transform-stream';\nimport MCPChunkFilterTransformStream from './stream-trasnformer/mcp-chunk-filter-transform-stream';\nimport LLMPartTrasnformStream from './stream-trasnformer/llm-part-transform-stream';\nimport { createCozeNonStreamingChat } from './utils/create-coze-non-streaming-chat';\nimport {\n BuildGenerateResultByChatRes,\n BuildWarningGenerateResult,\n} from './utils/build-generate-result-by-chat-res';\n\nexport class CozeLanguageModel implements LanguageModelV2 {\n specificationVersion: 'v2' = 'v2';\n provider: string;\n modelId: string;\n supportedUrls: Record<string, RegExp[]> | PromiseLike<Record<string, RegExp[]>>;\n\n private readonly config: CozeChatConfig;\n\n constructor(modelId: string, config: CozeChatConfig) {\n this.modelId = modelId;\n this.provider = config.provider || 'coze';\n this.supportedUrls = config.supportedUrls?.() || {};\n this.config = config;\n }\n\n async doGenerate(options: LanguageModelV2CallOptions): Promise<IGenerateResult> {\n const messages = convertPromptToMessages(options.prompt);\n const warnings: LanguageModelV2CallWarning[] = [];\n\n const url = this.config.url({ path: '/chat' });\n\n const user_id = options.headers ? options.headers['x-user-id'] : '';\n const user_var = options.headers ? options.headers['x-user-var'] : '';\n\n let customVar;\n if (user_var) {\n try {\n customVar = JSON.parse(user_var);\n } catch (e) {\n console.warn('x-user-var parse error', e);\n }\n }\n\n const body = {\n bot_id: this.config.botId,\n auto_save_history: false,\n user_id: user_id || '7543191937730215936',\n stream: true,\n additional_messages: messages,\n };\n\n if (customVar) {\n (body as any).custom_variables = customVar;\n }\n\n const headers = this.config.headers();\n const abortSignal = options.abortSignal;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n credentials: 'include',\n body: JSON.stringify(body),\n signal: abortSignal,\n });\n\n if (!response.ok || !response.body) {\n const rawError = await response.text();\n let errorDetail;\n try {\n errorDetail = JSON.parse(rawError);\n } catch {\n errorDetail = rawError;\n }\n\n const errorMessage =\n typeof errorDetail === 'object' && errorDetail?.msg\n ? errorDetail.msg\n : `Coze API error: ${response.status} ${response.statusText}`;\n\n return BuildWarningGenerateResult(errorMessage);\n }\n\n const { content, finishReason, usage } = await accumulateSSEResponse(response.body);\n\n return {\n content,\n finishReason,\n usage,\n request: { body },\n response: { body: null },\n warnings,\n };\n }\n\n isVisibleMsgPart(evtData: any) {\n if (evtData.type === 'knowledge' && evtData.role === 'assistant') {\n return false;\n }\n\n return true;\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<{\n stream: ReadableStream<LanguageModelV2StreamPart>;\n request?: { body?: unknown };\n response?: { headers?: SharedV2Headers };\n }> {\n const messages = convertPromptToMessages(options.prompt);\n const warnings: LanguageModelV2CallWarning[] = [];\n\n const url = this.config.url({\n path: '/chat',\n });\n\n const user_id = options.headers ? options.headers['x-user-id'] : '';\n const user_var = options.headers ? options.headers['x-user-var'] : '';\n // const user_token = options.headers ? options.headers['x-user-token'] : '';\n\n let customVar;\n if (user_var) {\n try {\n customVar = JSON.parse(user_var);\n } catch (e) {\n console.warn('x-user-var parse error', e);\n }\n }\n\n console.log('msssage send to coze', JSON.stringify(messages, null, 2));\n const body = {\n bot_id: this.config.botId,\n auto_save_history: false,\n user_id: user_id || '7543191937730215936',\n stream: true,\n additional_messages: messages,\n };\n\n if (customVar) {\n (body as any).custom_variables = customVar;\n }\n\n const headers = this.config.headers();\n\n const abortSignal = options.abortSignal;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n credentials: 'include',\n body: JSON.stringify(body),\n signal: abortSignal,\n });\n\n if (!response.ok || !response.body) {\n // if (true) {\n const rawError = await response.text();\n let errorDetail;\n try {\n errorDetail = JSON.parse(rawError); // 尝试解析为 JSON\n } catch {\n errorDetail = rawError; // 非 JSON 直接使用\n }\n\n // 创建一个包含错误信息的流,让 UI 层处理\n const errorMessage =\n typeof errorDetail === 'object' && errorDetail?.msg\n ? errorDetail.msg\n : `Coze API error: ${response.status} ${response.statusText}`;\n\n console.error(errorMessage);\n\n return {\n stream: createErrorStream('会话异常,请重试'),\n };\n }\n\n let externalTransformers = (this.config.extraStreamTransformers || []).map((factory) =>\n factory()\n );\n\n /// 不同阶段,可能需要不同的流处理逻辑\n const stage = options.headers ? options.headers['x-user-stage'] : '';\n const isBuildStage = stage === 'build';\n const isFillStage = stage === 'fill';\n\n const result = response.body\n // 将字节流解码为文本流\n .pipeThrough(\n new TextDecoderStream() as ReadableWritablePair<\n string | undefined,\n Uint8Array<ArrayBufferLike>\n >\n )\n // 解析为 SSE 事件流\n .pipeThrough(new ServerSentEventTransformStream())\n // 过滤不可见消息部分,比如知识库调用,和一些指令性质无需展示在聊天中的通信内容\n .pipeThrough(new MCPChunkFilterTransformStream(isBuildStage || isFillStage))\n // 补充特殊 llm chunk\n .pipeThrough(new LLMChunkInjectorTransformStream())\n // 转换为 LanguageModelV2StreamPart 格式\n .pipeThrough(new LLMPartTrasnformStream());\n\n let finalResult = result;\n\n if (externalTransformers.length > 0) {\n finalResult = externalTransformers.reduce(\n (stream, transformer) => stream.pipeThrough(transformer),\n result // 初始累积值(原始流)\n );\n }\n\n return {\n stream: finalResult as ReadableStream<LanguageModelV2StreamPart>,\n };\n }\n}\n","import {\n LanguageModelV2FilePart,\n LanguageModelV2Message,\n LanguageModelV2Prompt,\n LanguageModelV2TextPart,\n} from '@ai-sdk/provider';\nimport { RoleType } from '@coze/api';\nimport { Attachment } from '@baishuyun/types/src/chat';\nimport { excel2json } from './excel2json';\n\nconst decoder = new TextDecoder('utf-8');\n\nconst data2csvText = (data: Uint8Array) => {\n return decoder.decode(data);\n};\n\ntype userMsg = {\n role: 'user';\n content: Array<LanguageModelV2TextPart | LanguageModelV2FilePart>;\n};\n\nconst getPartType = (part: LanguageModelV2TextPart | LanguageModelV2FilePart) => {\n if (part.type === 'text') {\n return 'text';\n }\n\n const isImg = part.mediaType?.startsWith('image/');\n if (isImg) {\n return 'image';\n }\n\n const isAudio = part.mediaType?.startsWith('audio/');\n if (isAudio) {\n return 'audio';\n }\n\n return 'file';\n};\n\nconst parseMessageContent = (message: LanguageModelV2Message, isTextOnly?: boolean) => {\n if (isTextOnly) {\n return (message.content as Array<LanguageModelV2TextPart>)\n .map((part: LanguageModelV2TextPart) => part.text)\n .join('\\n');\n }\n\n const result = (message.content as Array<LanguageModelV2TextPart | LanguageModelV2FilePart>).map(\n (part) => {\n const meta = part.providerOptions?.uploadMetadata as Attachment;\n const url = meta?.url;\n\n return {\n type: getPartType(part),\n text: part.type === 'text' ? (part as LanguageModelV2TextPart).text : '',\n file_url: part.type === 'text' ? undefined : url,\n };\n }\n );\n\n return JSON.stringify(result);\n};\n\nconst isTextOnlyMsg = (message: userMsg) => message.content.every((part) => part.type === 'text');\n\nexport const convertPromptToMessages = (messages: LanguageModelV2Prompt) => {\n return messages.map((message) => {\n const isTextOnly = isTextOnlyMsg(message as userMsg);\n switch (message.role) {\n case 'user':\n return {\n role: RoleType.User,\n content: parseMessageContent(message, isTextOnly),\n content_type: isTextOnly ? 'text' : 'object_string',\n };\n break;\n\n case 'assistant':\n return {\n role: RoleType.Assistant,\n content: (message.content as Array<LanguageModelV2TextPart>)\n .map((part: LanguageModelV2TextPart) => (part.type === 'text' ? part.text : ''))\n .join(''),\n content_type: 'text',\n };\n break;\n }\n });\n};\n","import {\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2Usage,\n} from '@ai-sdk/provider';\nimport { ServerSentEventTransformStream } from 'parse-sse';\nimport { TextDecoderStream } from 'stream/web';\n\nexport interface AccumulatedSSEResponse {\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n}\n\n/**\n * 从字节流中解码 SSE 事件并累积完整响应内容\n */\nexport async function accumulateSSEResponse(\n body: ReadableStream<Uint8Array>\n): Promise<AccumulatedSSEResponse> {\n const sseStream = body\n .pipeThrough(\n new TextDecoderStream() as ReadableWritablePair<\n string | undefined,\n Uint8Array<ArrayBufferLike>\n >\n )\n .pipeThrough(new ServerSentEventTransformStream());\n\n let textContent = '';\n let reasoningContent = '';\n let finishReason: LanguageModelV2FinishReason = 'stop';\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n const reader = sseStream.getReader();\n try {\n while (true) {\n const { done, value: evt } = await reader.read();\n if (done) break;\n if (!evt) continue;\n\n let evtData;\n try {\n evtData = JSON.parse(evt.data);\n } catch {\n continue;\n }\n\n const event = evt.type;\n\n if (event === 'conversation.message.delta') {\n if (evtData.reasoning_content) {\n reasoningContent += evtData.reasoning_content;\n } else if (evtData.content) {\n textContent += evtData.content;\n }\n } else if (event === 'conversation.chat.completed' || event === 'done') {\n finishReason = 'stop';\n if (evtData.usage) {\n usage = {\n inputTokens: evtData.usage.input_count || 0,\n outputTokens: evtData.usage.output_count || 0,\n totalTokens: evtData.usage.total_count || 0,\n };\n }\n } else if (event === 'error') {\n finishReason = 'error';\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const content: LanguageModelV2Content[] = [];\n if (reasoningContent) {\n content.push({ type: 'reasoning', text: reasoningContent });\n }\n if (textContent) {\n content.push({ type: 'text', text: textContent });\n }\n\n return { content, finishReason, usage };\n}\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\n\n/**\n * 创建一个包含错误信息的流\n * @param error 错误信息\n * @returns ReadableStream<LanguageModelV2StreamPart>\n */\nexport const createErrorStream = (error: string): ReadableStream<LanguageModelV2StreamPart> => {\n return new ReadableStream<LanguageModelV2StreamPart>({\n start(controller) {\n const id = generateId();\n controller.enqueue({\n id,\n type: 'text-start',\n });\n controller.enqueue({\n id,\n type: 'text-delta',\n providerMetadata: {\n raw: { data: { type: 'agent-error', error } },\n },\n delta: error,\n });\n controller.enqueue({\n type: 'text-end',\n id,\n });\n controller.close();\n },\n });\n};\n","/**\n * 事件数据取样,某些流 chunk 处理,需要用到前后的 chunk 信息,因此设计一个类缓存相邻 chunk,用于处理依据\n */\nexport class EvtSample {\n private _evtSampleMap: Map<string, any> = new Map();\n private _key1: string = \"1\";\n private _key2: string = \"2\";\n private _maxSample = 2;\n\n public addEventSample(evt: any) {\n if (this._evtSampleMap.size >= this._maxSample) {\n const evt2 = this._evtSampleMap.get(this._key2);\n this._evtSampleMap.set(this._key1, evt2);\n this._evtSampleMap.set(this._key2, evt);\n return;\n }\n\n this._evtSampleMap.set((this._evtSampleMap.size + 1).toString(), evt);\n }\n\n public getFirstSample() {\n return this._evtSampleMap.get(this._key1);\n }\n\n public getSecondSample() {\n return this._evtSampleMap.get(this._key2);\n }\n}\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { StreamChatData } from '@coze/api';\nimport { EvtSample } from '../evt-sample';\n\n/**\n * 补充特殊的 llm chunk, reasoning-end, text-start\n */\nexport class LLMChunkInjectorTransformStream extends TransformStream<\n StreamChatData,\n | StreamChatData\n | (LanguageModelV2StreamPart & {\n disableTransform: boolean;\n })\n> {\n private eventSampleMap = new EvtSample();\n\n constructor() {\n super({\n transform: (\n part: StreamChatData,\n controller: TransformStreamDefaultController<\n StreamChatData | (LanguageModelV2StreamPart & { disableTransform: boolean })\n >\n ) => {\n // 添加事件样本(原逻辑中的addEventSample)\n this.eventSampleMap.addEventSample(part);\n\n // 处理sample1/sample2特殊判断逻辑\n const sample1 = this.eventSampleMap.getFirstSample();\n const sample2 = this.eventSampleMap.getSecondSample();\n\n // handle reasoning end\n if (\n sample1 &&\n sample2 &&\n sample1.data.reasoning_content &&\n !sample2.data.reasoning_content\n ) {\n controller.enqueue({\n disableTransform: true,\n type: 'reasoning-end',\n id: sample1.data.conversation_id,\n });\n }\n\n // handle text-start\n if (sample1 && sample2 && !sample1.data.content && sample2.data.content) {\n controller.enqueue({\n disableTransform: true,\n type: 'text-start',\n id: sample2.data.conversation_id,\n });\n }\n\n // 传递part到下一个转换流\n controller.enqueue(part);\n },\n });\n }\n}\n","import { ChatEventType, StreamChatData } from '@coze/api';\nimport { ServerSentEvent } from 'parse-sse';\n\nexport default class MCPChunkFilterTransformStream extends TransformStream {\n isVisibleMsgPart(evtData: any, part: any, omitTextEndChunk?: boolean) {\n if (evtData.type === 'knowledge' && evtData.role === 'assistant') {\n return false;\n }\n\n // Omit text-end chunk if the flag is set\n if (\n omitTextEndChunk &&\n part.event === ChatEventType.CONVERSATION_MESSAGE_COMPLETED &&\n part.data.type !== 'follow_up'\n ) {\n return false;\n }\n\n if (part.event === 'conversation.message.completed' && evtData.type == 'verbose') {\n return false;\n }\n\n return true;\n }\n\n constructor(omitTextEndChunk: boolean = false) {\n super({\n transform: (\n evt: ServerSentEvent,\n controller: TransformStreamDefaultController<StreamChatData>\n ) => {\n if (!evt) return;\n\n // 解析evt为part对象(原逻辑中的part构建)\n const part = {\n event: evt.type,\n data: JSON.parse(evt.data) || {},\n } as StreamChatData;\n\n // 过滤逻辑:仅传递满足条件的part\n if (this.isVisibleMsgPart(part.data, part, omitTextEndChunk)) {\n controller.enqueue(part);\n }\n },\n });\n }\n}\n","import { LanguageModelV2StreamPart, SharedV2ProviderMetadata } from '@ai-sdk/provider';\nimport { ChatEventType } from '@coze/api';\n\nexport const mcp2llmChunk = (part: any): LanguageModelV2StreamPart | null => {\n const fullData = JSON.stringify(part);\n\n switch (part.event) {\n case ChatEventType.CONVERSATION_CHAT_CREATED:\n return {\n type: 'raw',\n rawValue: part.data,\n };\n break;\n\n case ChatEventType.CONVERSATION_CHAT_IN_PROGRESS:\n return {\n // type: \"text-delta\",\n // id: part.data.conversation_id,\n // delta: part.data.content || \"\",\n // providerMetadata: {\n // raw: { data: fullData },\n // },\n type: 'raw',\n rawValue: part.data,\n };\n break;\n\n case ChatEventType.CONVERSATION_MESSAGE_DELTA:\n const isReasoning = Boolean(part.data.reasoning_content);\n return {\n type: isReasoning ? 'reasoning-delta' : 'text-delta',\n delta: isReasoning ? part.data.reasoning_content : part.data.content,\n id: part.data.conversation_id,\n providerMetadata: {},\n };\n break;\n\n case ChatEventType.CONVERSATION_MESSAGE_COMPLETED:\n if (part.data && part.data.type === 'follow_up') {\n return {\n type: 'raw',\n rawValue: part.data,\n };\n }\n\n if (part.status === 'completed') {\n return {\n type: 'text-end',\n id: part.data.conversation_id,\n // delta: part.data.content || part.data.reasoning_content || \"\",\n providerMetadata: {},\n };\n }\n\n return {\n type: 'raw',\n rawValue: part.data,\n };\n\n break;\n\n case ChatEventType.CONVERSATION_CHAT_COMPLETED:\n // Yield finish event with usage information\n return {\n type: 'finish',\n finishReason: 'stop',\n usage: {\n inputTokens: part.data.usage?.input_count || 0,\n outputTokens: part.data.usage?.output_count || 0,\n totalTokens: part.data.usage?.total_count || 0,\n },\n };\n break;\n\n case ChatEventType.DONE:\n // Stream completed successfully\n return {\n type: 'finish',\n finishReason: 'stop',\n usage: {\n inputTokens: part.data.usage?.input_count || 0,\n outputTokens: part.data.usage?.output_count || 0,\n totalTokens: part.data.usage?.total_count || 0,\n },\n };\n break;\n\n case ChatEventType.ERROR:\n // Handle errors\n console.error('[ERROR]', part.data);\n return {\n type: 'error',\n error: new Error(`Coze streaming error: ${JSON.stringify(part.data)}`),\n };\n\n default:\n // Handle unknown event types\n console.warn('Unknown event type:', part.event);\n return {\n type: 'error',\n error: 'Unknown event type' + part.event,\n };\n }\n\n return {\n type: 'error',\n error: 'unknown',\n };\n};\n","import { ChatEventType, StreamChatData } from '@coze/api';\nimport { mcp2llmChunk } from '../utils/mcp-to-llm-chunk';\nimport { LanguageModelV2StreamPart } from '@ai-sdk/provider';\n\nexport default class LLMPartTrasnformStream extends TransformStream {\n constructor() {\n super({\n transform: (\n part: StreamChatData | (LanguageModelV2StreamPart & { disableTransform: boolean }),\n controller: TransformStreamDefaultController<LanguageModelV2StreamPart | undefined>\n ) => {\n // Bypass transform if disableTransform flag is set\n const { disableTransform } = part as any;\n if (disableTransform) {\n controller.enqueue(part as any);\n return;\n }\n\n try {\n const chunk = mcp2llmChunk(part as any);\n if (chunk) {\n controller.enqueue(chunk as any);\n }\n } catch (error) {\n console.error('transform coze evt error');\n }\n },\n });\n }\n}\n","import { CreateChatRes } from '@coze/api';\nimport { CozeChatConfig, IGenerateResult } from '../types';\nimport { getCozeChatMsgDetail } from './get-coze-chat-msg-detail';\n\nexport const BuildWarningGenerateResult = (message: string): IGenerateResult => {\n return {\n content: [],\n finishReason: 'error',\n request: {\n body: null,\n },\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n response: {\n body: null,\n },\n warnings: [\n {\n type: 'other',\n message,\n },\n ],\n };\n};\n\nexport const BuildGenerateResultByChatRes = async (\n response: Response,\n chatConfig: CozeChatConfig,\n reqBody?: unknown\n): Promise<IGenerateResult> => {\n if (!response.ok) {\n return Promise.reject(\n BuildWarningGenerateResult(`Coze API error: ${response.status} ${response.statusText}`)\n );\n }\n\n const res = (await response.json()) as CreateChatRes;\n if (res.code !== 0) {\n return Promise.reject(BuildWarningGenerateResult(`Coze API error: ${res.code} ${res.msg}`));\n }\n\n const msgRes = await getCozeChatMsgDetail(res.data.conversation_id, res.data.id, chatConfig);\n if (!msgRes.ok) {\n return Promise.reject(\n BuildWarningGenerateResult(\n `Failed to get message detail: ${msgRes.status} ${msgRes.statusText}`\n )\n );\n }\n const msgDetail = await msgRes.json();\n\n return {\n content: msgDetail.data.message.content,\n finishReason: msgDetail.data.message.status === 'finished' ? 'stop' : 'error',\n request: {\n body: reqBody,\n },\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n response: {\n body: msgDetail,\n },\n warnings: [],\n };\n};\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { JSONParser } from '@streamparser/json';\nimport { createTextInfoEnqueuer, TextInfoEnqueuer } from '../utils/enqueue-text-info';\nimport { rebuildFieldsJsonStructure } from '@baishuyun/ai-feat-utils';\n\nexport const createFieldsJsonTransformStream = (enableJsonParser: boolean) => {\n let parser: JSONParser;\n let enqueueTextDelta: TextInfoEnqueuer;\n let id: string;\n let isFirstChunk = true;\n // 当 LLM 返回的不是 JSON 而是普通文本时,切换到直通模式\n let passthroughMode = false;\n\n const chunkGuard = (chunk: LanguageModelV2StreamPart): boolean => {\n if (!enableJsonParser || passthroughMode) {\n return false;\n }\n\n if (chunk.type !== 'text-delta' || !('delta' in chunk)) {\n return false;\n }\n\n return true;\n };\n\n const transformer = {\n flush: (controller: TransformStreamDefaultController<any>) => {\n try {\n // parser?.end();\n controller.terminate(); // 信号通知下游可读流已关闭\n } catch (e) {\n controller.error('stop error' + e);\n }\n },\n transform: (\n chunk: LanguageModelV2StreamPart,\n controller: TransformStreamDefaultController<LanguageModelV2StreamPart>\n ) => {\n if (!parser && !passthroughMode) {\n return;\n }\n\n try {\n if (chunkGuard(chunk)) {\n if ('id' in chunk && 'delta' in chunk) {\n id = chunk.id;\n let delta = chunk.delta;\n if (isFirstChunk) {\n delta = delta.replace(/^\\uFEFF/, '');\n isFirstChunk = false;\n }\n parser.write(delta);\n } else {\n console.warn('Unexpected chunk format for JSON parsing:', chunk);\n controller.enqueue(chunk);\n }\n } else {\n controller.enqueue(chunk);\n }\n } catch (e) {\n console.log('write or enqueue error', e);\n controller.error(e);\n }\n },\n start: (controller: TransformStreamDefaultController<any>) => {\n parser = new JSONParser({\n paths: ['$.*'],\n });\n\n enqueueTextDelta = enableJsonParser\n ? createTextInfoEnqueuer(controller)\n : (content: string) => {};\n\n parser.onValue = (parsedInfo: any) => {\n const value = parsedInfo.value;\n\n if (value.widget) {\n value.widget.widgetName = `_widget_${Date.now()}`;\n }\n\n enqueueTextDelta(\n JSON.stringify(value),\n JSON.stringify({\n type: 'mcp-fields-json',\n field: rebuildFieldsJsonStructure(value),\n }),\n id\n );\n };\n\n parser.onError = (err: any) => {\n console.error('JsonWidgetStream: JSON Parsing Error:', err);\n\n // LLM 返回的不是 JSON,切换到直通模式,后续 text-delta 直接透传\n passthroughMode = true;\n };\n\n parser.onEnd = () => {\n enqueueTextDelta(\n ' ',\n JSON.stringify({\n appendConfirm: 'save-fields',\n })\n );\n };\n },\n };\n\n return new TransformStream<LanguageModelV2StreamPart, any>(transformer);\n};\n","import { JSONValue, LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\n\nexport type TextInfoEnqueuer = (textInfo: string, metaPayload?: JSONValue, id?: string) => void;\n\nexport const createTextInfoEnqueuer =\n (controller: TransformStreamDefaultController<LanguageModelV2StreamPart>) =>\n (\n textInfo: string,\n metaPayload?: JSONValue,\n id: string = generateId(),\n deltaOnly: boolean = false\n ) => {\n const i = id ?? generateId();\n\n const startPart: LanguageModelV2StreamPart = {\n type: 'text-start',\n id: i,\n };\n\n const deltaPart: LanguageModelV2StreamPart = {\n type: 'text-delta',\n id: i,\n delta: textInfo,\n providerMetadata: metaPayload\n ? {\n raw: { data: metaPayload },\n }\n : undefined,\n };\n\n const endPart: LanguageModelV2StreamPart = {\n type: 'text-end',\n id: i,\n };\n\n if (deltaOnly) {\n controller.enqueue(deltaPart);\n return;\n }\n\n controller.enqueue(startPart);\n controller.enqueue(deltaPart);\n controller.enqueue(endPart);\n };\n","import {\n createTextInfoEnqueuer,\n TextInfoEnqueuer,\n} from \"../utils/enqueue-text-info\";\n\nexport default class SuggestionTransformStream extends TransformStream<\n any,\n any\n> {\n constructor(enable: boolean) {\n let enqueuer: TextInfoEnqueuer;\n super({\n start(controller) {\n enqueuer = createTextInfoEnqueuer(controller);\n },\n transform(chunk, controller) {\n if (\n enable &&\n chunk.type === \"raw\" &&\n chunk.rawValue.type === \"follow_up\" &&\n enqueuer\n ) {\n enqueuer(\n chunk.rawValue.content,\n JSON.stringify({\n type: \"suggestion\",\n }),\n );\n } else {\n controller.enqueue(chunk);\n }\n },\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sBAKO;AAEP,IAAAA,yBAKO;;;ACZA,IAAM,UAAU;;;ACavB,IAAAC,oBAA+C;AAC/C,IAAAC,cAAkC;;;ACRlC,iBAAyB;AAIzB,IAAM,UAAU,IAAI,YAAY,OAAO;AAWvC,IAAM,cAAc,CAAC,SAA4D;AAC/E,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,WAAW,WAAW,QAAQ;AACjD,MAAI,OAAO;AACT,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK,WAAW,WAAW,QAAQ;AACnD,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,IAAM,sBAAsB,CAAC,SAAiC,eAAyB;AACrF,MAAI,YAAY;AACd,WAAQ,QAAQ,QACb,IAAI,CAAC,SAAkC,KAAK,IAAI,EAChD,KAAK,IAAI;AAAA,EACd;AAEA,QAAM,SAAU,QAAQ,QAAqE;AAAA,IAC3F,CAAC,SAAS;AACR,YAAM,OAAO,KAAK,iBAAiB;AACnC,YAAM,MAAM,MAAM;AAElB,aAAO;AAAA,QACL,MAAM,YAAY,IAAI;AAAA,QACtB,MAAM,KAAK,SAAS,SAAU,KAAiC,OAAO;AAAA,QACtE,UAAU,KAAK,SAAS,SAAS,SAAY;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,MAAM;AAC9B;AAEA,IAAM,gBAAgB,CAAC,YAAqB,QAAQ,QAAQ,MAAM,CAAC,SAAS,KAAK,SAAS,MAAM;AAEzF,IAAM,0BAA0B,CAAC,aAAoC;AAC1E,SAAO,SAAS,IAAI,CAAC,YAAY;AAC/B,UAAM,aAAa,cAAc,OAAkB;AACnD,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,eAAO;AAAA,UACL,MAAM,oBAAS;AAAA,UACf,SAAS,oBAAoB,SAAS,UAAU;AAAA,UAChD,cAAc,aAAa,SAAS;AAAA,QACtC;AACA;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,MAAM,oBAAS;AAAA,UACf,SAAU,QAAQ,QACf,IAAI,CAAC,SAAmC,KAAK,SAAS,SAAS,KAAK,OAAO,EAAG,EAC9E,KAAK,EAAE;AAAA,UACV,cAAc;AAAA,QAChB;AACA;AAAA,IACJ;AAAA,EACF,CAAC;AACH;;;AClFA,uBAA+C;AAC/C,iBAAkC;AAWlC,eAAsB,sBACpB,MACiC;AACjC,QAAM,YAAY,KACf;AAAA,IACC,IAAI,6BAAkB;AAAA,EAIxB,EACC,YAAY,IAAI,gDAA+B,CAAC;AAEnD,MAAI,cAAc;AAClB,MAAI,mBAAmB;AACvB,MAAI,eAA4C;AAChD,MAAI,QAA8B,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,EAAE;AAEpF,QAAM,SAAS,UAAU,UAAU;AACnC,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,OAAO,IAAI,IAAI,MAAM,OAAO,KAAK;AAC/C,UAAI,KAAM;AACV,UAAI,CAAC,IAAK;AAEV,UAAI;AACJ,UAAI;AACF,kBAAU,KAAK,MAAM,IAAI,IAAI;AAAA,MAC/B,QAAQ;AACN;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI;AAElB,UAAI,UAAU,8BAA8B;AAC1C,YAAI,QAAQ,mBAAmB;AAC7B,8BAAoB,QAAQ;AAAA,QAC9B,WAAW,QAAQ,SAAS;AAC1B,yBAAe,QAAQ;AAAA,QACzB;AAAA,MACF,WAAW,UAAU,iCAAiC,UAAU,QAAQ;AACtE,uBAAe;AACf,YAAI,QAAQ,OAAO;AACjB,kBAAQ;AAAA,YACN,aAAa,QAAQ,MAAM,eAAe;AAAA,YAC1C,cAAc,QAAQ,MAAM,gBAAgB;AAAA,YAC5C,aAAa,QAAQ,MAAM,eAAe;AAAA,UAC5C;AAAA,QACF;AAAA,MACF,WAAW,UAAU,SAAS;AAC5B,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,QAAM,UAAoC,CAAC;AAC3C,MAAI,kBAAkB;AACpB,YAAQ,KAAK,EAAE,MAAM,aAAa,MAAM,iBAAiB,CAAC;AAAA,EAC5D;AACA,MAAI,aAAa;AACf,YAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,YAAY,CAAC;AAAA,EAClD;AAEA,SAAO,EAAE,SAAS,cAAc,MAAM;AACxC;;;ACjFA,4BAA2B;AAOpB,IAAM,oBAAoB,CAAC,UAA6D;AAC7F,SAAO,IAAI,eAA0C;AAAA,IACnD,MAAM,YAAY;AAChB,YAAM,SAAK,kCAAW;AACtB,iBAAW,QAAQ;AAAA,QACjB;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AACD,iBAAW,QAAQ;AAAA,QACjB;AAAA,QACA,MAAM;AAAA,QACN,kBAAkB;AAAA,UAChB,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,MAAM,EAAE;AAAA,QAC9C;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AACD,iBAAW,QAAQ;AAAA,QACjB,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AACD,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF,CAAC;AACH;;;AC5BO,IAAM,YAAN,MAAgB;AAAA,EACb,gBAAkC,oBAAI,IAAI;AAAA,EAC1C,QAAgB;AAAA,EAChB,QAAgB;AAAA,EAChB,aAAa;AAAA,EAEd,eAAe,KAAU;AAC9B,QAAI,KAAK,cAAc,QAAQ,KAAK,YAAY;AAC9C,YAAM,OAAO,KAAK,cAAc,IAAI,KAAK,KAAK;AAC9C,WAAK,cAAc,IAAI,KAAK,OAAO,IAAI;AACvC,WAAK,cAAc,IAAI,KAAK,OAAO,GAAG;AACtC;AAAA,IACF;AAEA,SAAK,cAAc,KAAK,KAAK,cAAc,OAAO,GAAG,SAAS,GAAG,GAAG;AAAA,EACtE;AAAA,EAEO,iBAAiB;AACtB,WAAO,KAAK,cAAc,IAAI,KAAK,KAAK;AAAA,EAC1C;AAAA,EAEO,kBAAkB;AACvB,WAAO,KAAK,cAAc,IAAI,KAAK,KAAK;AAAA,EAC1C;AACF;;;ACpBO,IAAM,kCAAN,cAA8C,gBAMnD;AAAA,EACQ,iBAAiB,IAAI,UAAU;AAAA,EAEvC,cAAc;AACZ,UAAM;AAAA,MACJ,WAAW,CACT,MACA,eAGG;AAEH,aAAK,eAAe,eAAe,IAAI;AAGvC,cAAM,UAAU,KAAK,eAAe,eAAe;AACnD,cAAM,UAAU,KAAK,eAAe,gBAAgB;AAGpD,YACE,WACA,WACA,QAAQ,KAAK,qBACb,CAAC,QAAQ,KAAK,mBACd;AACA,qBAAW,QAAQ;AAAA,YACjB,kBAAkB;AAAA,YAClB,MAAM;AAAA,YACN,IAAI,QAAQ,KAAK;AAAA,UACnB,CAAC;AAAA,QACH;AAGA,YAAI,WAAW,WAAW,CAAC,QAAQ,KAAK,WAAW,QAAQ,KAAK,SAAS;AACvE,qBAAW,QAAQ;AAAA,YACjB,kBAAkB;AAAA,YAClB,MAAM;AAAA,YACN,IAAI,QAAQ,KAAK;AAAA,UACnB,CAAC;AAAA,QACH;AAGA,mBAAW,QAAQ,IAAI;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC3DA,IAAAC,cAA8C;AAG9C,IAAqB,gCAArB,cAA2D,gBAAgB;AAAA,EACzE,iBAAiB,SAAc,MAAW,kBAA4B;AACpE,QAAI,QAAQ,SAAS,eAAe,QAAQ,SAAS,aAAa;AAChE,aAAO;AAAA,IACT;AAGA,QACE,oBACA,KAAK,UAAU,0BAAc,kCAC7B,KAAK,KAAK,SAAS,aACnB;AACA,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,UAAU,oCAAoC,QAAQ,QAAQ,WAAW;AAChF,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,mBAA4B,OAAO;AAC7C,UAAM;AAAA,MACJ,WAAW,CACT,KACA,eACG;AACH,YAAI,CAAC,IAAK;AAGV,cAAM,OAAO;AAAA,UACX,OAAO,IAAI;AAAA,UACX,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC;AAAA,QACjC;AAGA,YAAI,KAAK,iBAAiB,KAAK,MAAM,MAAM,gBAAgB,GAAG;AAC5D,qBAAW,QAAQ,IAAI;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC7CA,IAAAC,cAA8B;AAEvB,IAAM,eAAe,CAAC,SAAgD;AAC3E,QAAM,WAAW,KAAK,UAAU,IAAI;AAEpC,UAAQ,KAAK,OAAO;AAAA,IAClB,KAAK,0BAAc;AACjB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,KAAK;AAAA,MACjB;AACA;AAAA,IAEF,KAAK,0BAAc;AACjB,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOL,MAAM;AAAA,QACN,UAAU,KAAK;AAAA,MACjB;AACA;AAAA,IAEF,KAAK,0BAAc;AACjB,YAAM,cAAc,QAAQ,KAAK,KAAK,iBAAiB;AACvD,aAAO;AAAA,QACL,MAAM,cAAc,oBAAoB;AAAA,QACxC,OAAO,cAAc,KAAK,KAAK,oBAAoB,KAAK,KAAK;AAAA,QAC7D,IAAI,KAAK,KAAK;AAAA,QACd,kBAAkB,CAAC;AAAA,MACrB;AACA;AAAA,IAEF,KAAK,0BAAc;AACjB,UAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,aAAa;AAC/C,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU,KAAK;AAAA,QACjB;AAAA,MACF;AAEA,UAAI,KAAK,WAAW,aAAa;AAC/B,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,KAAK,KAAK;AAAA;AAAA,UAEd,kBAAkB,CAAC;AAAA,QACrB;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,KAAK;AAAA,MACjB;AAEA;AAAA,IAEF,KAAK,0BAAc;AAEjB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,cAAc;AAAA,QACd,OAAO;AAAA,UACL,aAAa,KAAK,KAAK,OAAO,eAAe;AAAA,UAC7C,cAAc,KAAK,KAAK,OAAO,gBAAgB;AAAA,UAC/C,aAAa,KAAK,KAAK,OAAO,eAAe;AAAA,QAC/C;AAAA,MACF;AACA;AAAA,IAEF,KAAK,0BAAc;AAEjB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,cAAc;AAAA,QACd,OAAO;AAAA,UACL,aAAa,KAAK,KAAK,OAAO,eAAe;AAAA,UAC7C,cAAc,KAAK,KAAK,OAAO,gBAAgB;AAAA,UAC/C,aAAa,KAAK,KAAK,OAAO,eAAe;AAAA,QAC/C;AAAA,MACF;AACA;AAAA,IAEF,KAAK,0BAAc;AAEjB,cAAQ,MAAM,WAAW,KAAK,IAAI;AAClC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,IAAI,MAAM,yBAAyB,KAAK,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,MACvE;AAAA,IAEF;AAEE,cAAQ,KAAK,uBAAuB,KAAK,KAAK;AAC9C,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,uBAAuB,KAAK;AAAA,MACrC;AAAA,EACJ;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;;;ACxGA,IAAqB,yBAArB,cAAoD,gBAAgB;AAAA,EAClE,cAAc;AACZ,UAAM;AAAA,MACJ,WAAW,CACT,MACA,eACG;AAEH,cAAM,EAAE,iBAAiB,IAAI;AAC7B,YAAI,kBAAkB;AACpB,qBAAW,QAAQ,IAAW;AAC9B;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,QAAQ,aAAa,IAAW;AACtC,cAAI,OAAO;AACT,uBAAW,QAAQ,KAAY;AAAA,UACjC;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,0BAA0B;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACzBO,IAAM,6BAA6B,CAAC,YAAqC;AAC9E,SAAO;AAAA,IACL,SAAS,CAAC;AAAA,IACV,cAAc;AAAA,IACd,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,OAAO;AAAA,MACL,aAAa;AAAA,MACb,cAAc;AAAA,MACd,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,IACR;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ATCO,IAAM,oBAAN,MAAmD;AAAA,EACxD,uBAA6B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EAEiB;AAAA,EAEjB,YAAY,SAAiB,QAAwB;AACnD,SAAK,UAAU;AACf,SAAK,WAAW,OAAO,YAAY;AACnC,SAAK,gBAAgB,OAAO,gBAAgB,KAAK,CAAC;AAClD,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,WAAW,SAA+D;AAC9E,UAAM,WAAW,wBAAwB,QAAQ,MAAM;AACvD,UAAM,WAAyC,CAAC;AAEhD,UAAM,MAAM,KAAK,OAAO,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE7C,UAAM,UAAU,QAAQ,UAAU,QAAQ,QAAQ,WAAW,IAAI;AACjE,UAAM,WAAW,QAAQ,UAAU,QAAQ,QAAQ,YAAY,IAAI;AAEnE,QAAI;AACJ,QAAI,UAAU;AACZ,UAAI;AACF,oBAAY,KAAK,MAAM,QAAQ;AAAA,MACjC,SAAS,GAAG;AACV,gBAAQ,KAAK,0BAA0B,CAAC;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,OAAO;AAAA,MACX,QAAQ,KAAK,OAAO;AAAA,MACpB,mBAAmB;AAAA,MACnB,SAAS,WAAW;AAAA,MACpB,QAAQ;AAAA,MACR,qBAAqB;AAAA,IACvB;AAEA,QAAI,WAAW;AACb,MAAC,KAAa,mBAAmB;AAAA,IACnC;AAEA,UAAM,UAAU,KAAK,OAAO,QAAQ;AACpC,UAAM,cAAc,QAAQ;AAE5B,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR;AAAA,MACA,aAAa;AAAA,MACb,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,YAAM,WAAW,MAAM,SAAS,KAAK;AACrC,UAAI;AACJ,UAAI;AACF,sBAAc,KAAK,MAAM,QAAQ;AAAA,MACnC,QAAQ;AACN,sBAAc;AAAA,MAChB;AAEA,YAAM,eACJ,OAAO,gBAAgB,YAAY,aAAa,MAC5C,YAAY,MACZ,mBAAmB,SAAS,MAAM,IAAI,SAAS,UAAU;AAE/D,aAAO,2BAA2B,YAAY;AAAA,IAChD;AAEA,UAAM,EAAE,SAAS,cAAc,MAAM,IAAI,MAAM,sBAAsB,SAAS,IAAI;AAElF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,EAAE,KAAK;AAAA,MAChB,UAAU,EAAE,MAAM,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB,SAAc;AAC7B,QAAI,QAAQ,SAAS,eAAe,QAAQ,SAAS,aAAa;AAChE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,SAIZ;AACD,UAAM,WAAW,wBAAwB,QAAQ,MAAM;AACvD,UAAM,WAAyC,CAAC;AAEhD,UAAM,MAAM,KAAK,OAAO,IAAI;AAAA,MAC1B,MAAM;AAAA,IACR,CAAC;AAED,UAAM,UAAU,QAAQ,UAAU,QAAQ,QAAQ,WAAW,IAAI;AACjE,UAAM,WAAW,QAAQ,UAAU,QAAQ,QAAQ,YAAY,IAAI;AAGnE,QAAI;AACJ,QAAI,UAAU;AACZ,UAAI;AACF,oBAAY,KAAK,MAAM,QAAQ;AAAA,MACjC,SAAS,GAAG;AACV,gBAAQ,KAAK,0BAA0B,CAAC;AAAA,MAC1C;AAAA,IACF;AAEA,YAAQ,IAAI,wBAAwB,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AACrE,UAAM,OAAO;AAAA,MACX,QAAQ,KAAK,OAAO;AAAA,MACpB,mBAAmB;AAAA,MACnB,SAAS,WAAW;AAAA,MACpB,QAAQ;AAAA,MACR,qBAAqB;AAAA,IACvB;AAEA,QAAI,WAAW;AACb,MAAC,KAAa,mBAAmB;AAAA,IACnC;AAEA,UAAM,UAAU,KAAK,OAAO,QAAQ;AAEpC,UAAM,cAAc,QAAQ;AAE5B,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR;AAAA,MACA,aAAa;AAAA,MACb,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAElC,YAAM,WAAW,MAAM,SAAS,KAAK;AACrC,UAAI;AACJ,UAAI;AACF,sBAAc,KAAK,MAAM,QAAQ;AAAA,MACnC,QAAQ;AACN,sBAAc;AAAA,MAChB;AAGA,YAAM,eACJ,OAAO,gBAAgB,YAAY,aAAa,MAC5C,YAAY,MACZ,mBAAmB,SAAS,MAAM,IAAI,SAAS,UAAU;AAE/D,cAAQ,MAAM,YAAY;AAE1B,aAAO;AAAA,QACL,QAAQ,kBAAkB,kDAAU;AAAA,MACtC;AAAA,IACF;AAEA,QAAI,wBAAwB,KAAK,OAAO,2BAA2B,CAAC,GAAG;AAAA,MAAI,CAAC,YAC1E,QAAQ;AAAA,IACV;AAGA,UAAM,QAAQ,QAAQ,UAAU,QAAQ,QAAQ,cAAc,IAAI;AAClE,UAAM,eAAe,UAAU;AAC/B,UAAM,cAAc,UAAU;AAE9B,UAAM,SAAS,SAAS,KAErB;AAAA,MACC,IAAI,8BAAkB;AAAA,IAIxB,EAEC,YAAY,IAAI,iDAA+B,CAAC,EAEhD,YAAY,IAAI,8BAA8B,gBAAgB,WAAW,CAAC,EAE1E,YAAY,IAAI,gCAAgC,CAAC,EAEjD,YAAY,IAAI,uBAAuB,CAAC;AAE3C,QAAI,cAAc;AAElB,QAAI,qBAAqB,SAAS,GAAG;AACnC,oBAAc,qBAAqB;AAAA,QACjC,CAAC,QAAQ,gBAAgB,OAAO,YAAY,WAAW;AAAA,QACvD;AAAA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AFtLO,SAAS,WACd,UAAgC;AAAA,EAC9B,OAAO;AACT,GACc;AACd,QAAM,cAAU,6CAAqB,QAAQ,OAAO;AAEpD,QAAM,sBAAkB,4CAAoB,QAAQ,WAAW,CAAC,GAAG,eAAe,OAAO,EAAE;AAC3F,QAAM,sBAAsB,cAAU,mCAAW;AAAA,IAC/C,QAAQ,QAAQ;AAAA,IAChB,yBAAyB;AAAA,IACzB,aAAa;AAAA,EACf,CAAC,CAAC;AAEF,QAAM,aAAa,OAAO;AAAA,IACxB,GAAG;AAAA,IACH,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAEA,QAAM,sBAAsB,CAAC,YAA6B;AACxD,WAAO,IAAI,kBAAkB,SAAS;AAAA,MACpC,OAAO,QAAQ;AAAA,MACf,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,yBAAyB,QAAQ,2BAA2B,CAAC;AAAA,IAC/D,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,YAA6B,oBAAoB,OAAO;AAE1E,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAEhB,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,qBAAqB,CAAC;AAAA,EACzE;AACA,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AACA,WAAS,qBAAqB,CAAC,YAAoB;AACjD,UAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,qBAAqB,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;;;AYjGA,kBAA2B;;;ACA3B,IAAAC,yBAA2B;AAIpB,IAAM,yBACX,CAAC,eACD,CACE,UACA,aACA,SAAa,mCAAW,GACxB,YAAqB,UAClB;AACH,QAAM,IAAI,UAAM,mCAAW;AAE3B,QAAM,YAAuC;AAAA,IAC3C,MAAM;AAAA,IACN,IAAI;AAAA,EACN;AAEA,QAAM,YAAuC;AAAA,IAC3C,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,kBAAkB,cACd;AAAA,MACE,KAAK,EAAE,MAAM,YAAY;AAAA,IAC3B,IACA;AAAA,EACN;AAEA,QAAM,UAAqC;AAAA,IACzC,MAAM;AAAA,IACN,IAAI;AAAA,EACN;AAEA,MAAI,WAAW;AACb,eAAW,QAAQ,SAAS;AAC5B;AAAA,EACF;AAEA,aAAW,QAAQ,SAAS;AAC5B,aAAW,QAAQ,SAAS;AAC5B,aAAW,QAAQ,OAAO;AAC5B;;;ADzCF,2BAA2C;AAEpC,IAAM,kCAAkC,CAAC,qBAA8B;AAC5E,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,eAAe;AAEnB,MAAI,kBAAkB;AAEtB,QAAM,aAAa,CAAC,UAA8C;AAChE,QAAI,CAAC,oBAAoB,iBAAiB;AACxC,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,SAAS,gBAAgB,EAAE,WAAW,QAAQ;AACtD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO,CAAC,eAAsD;AAC5D,UAAI;AAEF,mBAAW,UAAU;AAAA,MACvB,SAAS,GAAG;AACV,mBAAW,MAAM,eAAe,CAAC;AAAA,MACnC;AAAA,IACF;AAAA,IACA,WAAW,CACT,OACA,eACG;AACH,UAAI,CAAC,UAAU,CAAC,iBAAiB;AAC/B;AAAA,MACF;AAEA,UAAI;AACF,YAAI,WAAW,KAAK,GAAG;AACrB,cAAI,QAAQ,SAAS,WAAW,OAAO;AACrC,iBAAK,MAAM;AACX,gBAAI,QAAQ,MAAM;AAClB,gBAAI,cAAc;AAChB,sBAAQ,MAAM,QAAQ,WAAW,EAAE;AACnC,6BAAe;AAAA,YACjB;AACA,mBAAO,MAAM,KAAK;AAAA,UACpB,OAAO;AACL,oBAAQ,KAAK,6CAA6C,KAAK;AAC/D,uBAAW,QAAQ,KAAK;AAAA,UAC1B;AAAA,QACF,OAAO;AACL,qBAAW,QAAQ,KAAK;AAAA,QAC1B;AAAA,MACF,SAAS,GAAG;AACV,gBAAQ,IAAI,0BAA0B,CAAC;AACvC,mBAAW,MAAM,CAAC;AAAA,MACpB;AAAA,IACF;AAAA,IACA,OAAO,CAAC,eAAsD;AAC5D,eAAS,IAAI,uBAAW;AAAA,QACtB,OAAO,CAAC,KAAK;AAAA,MACf,CAAC;AAED,yBAAmB,mBACf,uBAAuB,UAAU,IACjC,CAAC,YAAoB;AAAA,MAAC;AAE1B,aAAO,UAAU,CAAC,eAAoB;AACpC,cAAM,QAAQ,WAAW;AAEzB,YAAI,MAAM,QAAQ;AAChB,gBAAM,OAAO,aAAa,WAAW,KAAK,IAAI,CAAC;AAAA,QACjD;AAEA;AAAA,UACE,KAAK,UAAU,KAAK;AAAA,UACpB,KAAK,UAAU;AAAA,YACb,MAAM;AAAA,YACN,WAAO,iDAA2B,KAAK;AAAA,UACzC,CAAC;AAAA,UACD;AAAA,QACF;AAAA,MACF;AAEA,aAAO,UAAU,CAAC,QAAa;AAC7B,gBAAQ,MAAM,yCAAyC,GAAG;AAG1D,0BAAkB;AAAA,MACpB;AAEA,aAAO,QAAQ,MAAM;AACnB;AAAA,UACE;AAAA,UACA,KAAK,UAAU;AAAA,YACb,eAAe;AAAA,UACjB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,gBAAgD,WAAW;AACxE;;;AExGA,IAAqB,4BAArB,cAAuD,gBAGrD;AAAA,EACA,YAAY,QAAiB;AAC3B,QAAI;AACJ,UAAM;AAAA,MACJ,MAAM,YAAY;AAChB,mBAAW,uBAAuB,UAAU;AAAA,MAC9C;AAAA,MACA,UAAU,OAAO,YAAY;AAC3B,YACE,UACA,MAAM,SAAS,SACf,MAAM,SAAS,SAAS,eACxB,UACA;AACA;AAAA,YACE,MAAM,SAAS;AAAA,YACf,KAAK,UAAU;AAAA,cACb,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,qBAAW,QAAQ,KAAK;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":["import_provider_utils","import_parse_sse","import_web","import_api","import_api","import_provider_utils"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/coze-provider.ts","../src/const.ts","../src/coze-language-model.ts","../src/utils/prompt-to-model-msg.ts","../src/utils/accumulate-sse-response.ts","../src/utils/create-error-stream.ts","../src/evt-sample.ts","../src/stream-trasnformer/llm-chunk-injector-transform-stream.ts","../src/stream-trasnformer/mcp-chunk-filter-transform-stream.ts","../src/utils/mcp-to-llm-chunk.ts","../src/stream-trasnformer/llm-part-transform-stream.ts","../src/utils/build-generate-result-by-chat-res.ts","../src/stream-trasnformer/fields-json-transform-stream.ts","../src/utils/enqueue-text-info.ts","../src/stream-trasnformer/suggestion-transform-stream.ts"],"sourcesContent":["export { createCoze } from \"./coze-provider\";\nexport { createFieldsJsonTransformStream } from \"./stream-trasnformer/fields-json-transform-stream\";\nexport { default as SuggestionTransformStream } from \"./stream-trasnformer/suggestion-transform-stream\";\nexport { createTextInfoEnqueuer } from \"./utils/enqueue-text-info\";\n","import {\n LanguageModelV2,\n LanguageModelV2StreamPart,\n NoSuchModelError,\n ProviderV2,\n} from '@ai-sdk/provider';\n\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { CozeChatModelId } from './types';\nimport { VERSION } from './const';\nimport { CozeLanguageModel } from './coze-language-model';\n\nexport interface CozeProviderSettings {\n apiKey?: string;\n /**\nBase URL for the API calls.\n*/\n baseURL?: string;\n\n botId: string;\n\n /**\nCustom headers to include in the requests.\n*/\n headers?: Record<string, string>;\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n*/\n fetch?: FetchFunction;\n\n extraStreamTransformers?: (() => TransformStream<LanguageModelV2StreamPart, any>)[];\n}\n\nexport interface CozeProvider extends ProviderV2 {\n (modelId: CozeChatModelId): LanguageModelV2;\n\n languageModel(modelId: CozeChatModelId): LanguageModelV2;\n\n /**\nCreates a DeepSeek chat model for text generation.\n*/\n chat(modelId: CozeChatModelId): LanguageModelV2;\n}\n\nexport function createCoze(\n options: CozeProviderSettings = {\n botId: '',\n }\n): CozeProvider {\n const baseURL = withoutTrailingSlash(options.baseURL);\n\n const agentPartHeader = withUserAgentSuffix(options.headers || {}, `ai-sdk/coze/${VERSION}`);\n const authorizationHeader = `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'COZE_API_KEY',\n description: '',\n })}`;\n\n const getHeaders = () => ({\n ...agentPartHeader,\n Authorization: authorizationHeader,\n 'content-type': 'application/json',\n });\n\n const createLanguageModel = (modelId: CozeChatModelId) => {\n return new CozeLanguageModel(modelId, {\n botId: options.botId,\n provider: `coze.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n extraStreamTransformers: options.extraStreamTransformers || [],\n });\n };\n\n const provider = (modelId: CozeChatModelId) => createLanguageModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n","export const VERSION = \"0.0.1\";\n","import {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from '@ai-sdk/provider';\nimport { CozeChatConfig, IGenerateResult } from './types';\nimport { ServerSentEventTransformStream } from 'parse-sse';\nimport { TextDecoderStream } from 'stream/web';\nimport { convertPromptToMessages } from './utils/prompt-to-model-msg';\nimport { accumulateSSEResponse } from './utils/accumulate-sse-response';\nimport { createErrorStream } from './utils/create-error-stream';\nimport { LLMChunkInjectorTransformStream } from './stream-trasnformer/llm-chunk-injector-transform-stream';\nimport MCPChunkFilterTransformStream from './stream-trasnformer/mcp-chunk-filter-transform-stream';\nimport LLMPartTrasnformStream from './stream-trasnformer/llm-part-transform-stream';\nimport { createCozeNonStreamingChat } from './utils/create-coze-non-streaming-chat';\nimport {\n BuildGenerateResultByChatRes,\n BuildWarningGenerateResult,\n} from './utils/build-generate-result-by-chat-res';\nimport { safeParseJson } from '@baishuyun/ai-feat-utils';\n\nexport class CozeLanguageModel implements LanguageModelV2 {\n specificationVersion: 'v2' = 'v2';\n provider: string;\n modelId: string;\n supportedUrls: Record<string, RegExp[]> | PromiseLike<Record<string, RegExp[]>>;\n\n private readonly config: CozeChatConfig;\n\n constructor(modelId: string, config: CozeChatConfig) {\n this.modelId = modelId;\n this.provider = config.provider || 'coze';\n this.supportedUrls = config.supportedUrls?.() || {};\n this.config = config;\n }\n\n async doGenerate(options: LanguageModelV2CallOptions): Promise<IGenerateResult> {\n const messages = convertPromptToMessages(options.prompt);\n const warnings: LanguageModelV2CallWarning[] = [];\n\n const url = this.config.url({ path: '/chat' });\n\n const user_id = options.headers ? options.headers['x-user-id'] : '';\n const user_var = options.headers ? options.headers['x-user-var'] : '';\n\n let customVar;\n if (user_var) {\n try {\n customVar = JSON.parse(user_var);\n } catch (e) {\n console.warn('x-user-var parse error', e);\n }\n }\n\n const body = {\n bot_id: this.config.botId,\n auto_save_history: false,\n user_id: user_id || '7543191937730215936',\n stream: true,\n additional_messages: messages,\n };\n\n if (customVar) {\n (body as any).custom_variables = customVar;\n }\n\n const headers = this.config.headers();\n const abortSignal = options.abortSignal;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n credentials: 'include',\n body: JSON.stringify(body),\n signal: abortSignal,\n });\n\n if (!response.ok || !response.body) {\n const rawError = await response.text();\n let errorDetail;\n try {\n errorDetail = JSON.parse(rawError);\n } catch {\n errorDetail = rawError;\n }\n\n const errorMessage =\n typeof errorDetail === 'object' && errorDetail?.msg\n ? errorDetail.msg\n : `Coze API error: ${response.status} ${response.statusText}`;\n\n return BuildWarningGenerateResult(errorMessage);\n }\n\n const { content, finishReason, usage } = await accumulateSSEResponse(response.body);\n\n return {\n content,\n finishReason,\n usage,\n request: { body },\n response: { body: null },\n warnings,\n };\n }\n\n isVisibleMsgPart(evtData: any) {\n if (evtData.type === 'knowledge' && evtData.role === 'assistant') {\n return false;\n }\n\n return true;\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<{\n stream: ReadableStream<LanguageModelV2StreamPart>;\n request?: { body?: unknown };\n response?: { headers?: SharedV2Headers };\n }> {\n const messages = convertPromptToMessages(options.prompt);\n const warnings: LanguageModelV2CallWarning[] = [];\n\n const url = this.config.url({\n path: '/chat',\n });\n\n const user_id = options.headers ? options.headers['x-user-id'] : '';\n const user_var = options.headers ? options.headers['x-user-var'] : '';\n // const user_token = options.headers ? options.headers['x-user-token'] : '';\n const user_param = (options.headers ? options.headers['x-user-param'] : '') ?? '';\n\n let customVar;\n if (user_var) {\n try {\n customVar = JSON.parse(user_var);\n } catch (e) {\n console.warn('x-user-var parse error', e);\n }\n }\n\n const params = user_param ? safeParseJson(user_param) : {};\n\n console.log('params 2 workflow', params);\n\n const body = {\n bot_id: this.config.botId,\n auto_save_history: false,\n user_id: user_id || '7543191937730215936',\n stream: true,\n additional_messages: messages,\n parameters: params,\n };\n\n if (customVar) {\n (body as any).custom_variables = customVar;\n }\n\n const headers = this.config.headers();\n\n const abortSignal = options.abortSignal;\n\n // console.log('url', url);\n // console.log('body', JSON.stringify(body, null, 2));\n\n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n credentials: 'include',\n body: JSON.stringify(body),\n signal: abortSignal,\n });\n\n if (!response.ok || !response.body) {\n // if (true) {\n const rawError = await response.text();\n let errorDetail;\n try {\n errorDetail = JSON.parse(rawError); // 尝试解析为 JSON\n } catch {\n errorDetail = rawError; // 非 JSON 直接使用\n }\n\n // 创建一个包含错误信息的流,让 UI 层处理\n const errorMessage =\n typeof errorDetail === 'object' && errorDetail?.msg\n ? errorDetail.msg\n : `Coze API error: ${response.status} ${response.statusText}`;\n\n console.error(errorMessage);\n\n return {\n stream: createErrorStream('会话异常,请重试'),\n };\n }\n\n let externalTransformers = (this.config.extraStreamTransformers || []).map((factory) =>\n factory()\n );\n\n /// 不同阶段,可能需要不同的流处理逻辑\n const stage = options.headers ? options.headers['x-user-stage'] : '';\n const isBuildStage = stage === 'build';\n const isFillStage = stage === 'fill';\n\n const result = response.body\n // 将字节流解码为文本流\n .pipeThrough(\n new TextDecoderStream() as ReadableWritablePair<\n string | undefined,\n Uint8Array<ArrayBufferLike>\n >\n )\n // 解析为 SSE 事件流\n .pipeThrough(new ServerSentEventTransformStream())\n // 过滤不可见消息部分,比如知识库调用,和一些指令性质无需展示在聊天中的通信内容\n .pipeThrough(new MCPChunkFilterTransformStream(isBuildStage || isFillStage))\n // 补充特殊 llm chunk\n .pipeThrough(new LLMChunkInjectorTransformStream())\n // 转换为 LanguageModelV2StreamPart 格式\n .pipeThrough(new LLMPartTrasnformStream());\n\n let finalResult = result;\n\n if (externalTransformers.length > 0) {\n finalResult = externalTransformers.reduce(\n (stream, transformer) => stream.pipeThrough(transformer),\n result // 初始累积值(原始流)\n );\n }\n\n return {\n stream: finalResult as ReadableStream<LanguageModelV2StreamPart>,\n };\n }\n}\n","import {\n LanguageModelV2FilePart,\n LanguageModelV2Message,\n LanguageModelV2Prompt,\n LanguageModelV2TextPart,\n} from '@ai-sdk/provider';\nimport { RoleType } from '@coze/api';\nimport { Attachment } from '@baishuyun/types/src/chat';\nimport { excel2json } from './excel2json';\n\nconst decoder = new TextDecoder('utf-8');\n\nconst data2csvText = (data: Uint8Array) => {\n return decoder.decode(data);\n};\n\ntype userMsg = {\n role: 'user';\n content: Array<LanguageModelV2TextPart | LanguageModelV2FilePart>;\n};\n\nconst getPartType = (part: LanguageModelV2TextPart | LanguageModelV2FilePart) => {\n if (part.type === 'text') {\n return 'text';\n }\n\n const isImg = part.mediaType?.startsWith('image/');\n if (isImg) {\n return 'image';\n }\n\n const isAudio = part.mediaType?.startsWith('audio/');\n if (isAudio) {\n return 'audio';\n }\n\n return 'file';\n};\n\nconst parseMessageContent = (message: LanguageModelV2Message, isTextOnly?: boolean) => {\n if (isTextOnly) {\n return (message.content as Array<LanguageModelV2TextPart>)\n .map((part: LanguageModelV2TextPart) => part.text)\n .join('\\n');\n }\n\n const result = (message.content as Array<LanguageModelV2TextPart | LanguageModelV2FilePart>).map(\n (part) => {\n const meta = part.providerOptions?.uploadMetadata as Attachment;\n const url = meta?.url;\n\n return {\n type: getPartType(part),\n text: part.type === 'text' ? (part as LanguageModelV2TextPart).text : '',\n file_url: part.type === 'text' ? undefined : url,\n };\n }\n );\n\n return JSON.stringify(result);\n};\n\nconst isTextOnlyMsg = (message: userMsg) => message.content.every((part) => part.type === 'text');\n\nexport const convertPromptToMessages = (messages: LanguageModelV2Prompt) => {\n return messages.map((message) => {\n const isTextOnly = isTextOnlyMsg(message as userMsg);\n switch (message.role) {\n case 'user':\n return {\n role: RoleType.User,\n content: parseMessageContent(message, isTextOnly),\n content_type: isTextOnly ? 'text' : 'object_string',\n };\n break;\n\n case 'assistant':\n return {\n role: RoleType.Assistant,\n content: (message.content as Array<LanguageModelV2TextPart>)\n .map((part: LanguageModelV2TextPart) => (part.type === 'text' ? part.text : ''))\n .join(''),\n content_type: 'text',\n };\n break;\n }\n });\n};\n","import {\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2Usage,\n} from '@ai-sdk/provider';\nimport { ServerSentEventTransformStream } from 'parse-sse';\nimport { TextDecoderStream } from 'stream/web';\n\nexport interface AccumulatedSSEResponse {\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n}\n\n/**\n * 从字节流中解码 SSE 事件并累积完整响应内容\n */\nexport async function accumulateSSEResponse(\n body: ReadableStream<Uint8Array>\n): Promise<AccumulatedSSEResponse> {\n const sseStream = body\n .pipeThrough(\n new TextDecoderStream() as ReadableWritablePair<\n string | undefined,\n Uint8Array<ArrayBufferLike>\n >\n )\n .pipeThrough(new ServerSentEventTransformStream());\n\n let textContent = '';\n let reasoningContent = '';\n let finishReason: LanguageModelV2FinishReason = 'stop';\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n const reader = sseStream.getReader();\n try {\n while (true) {\n const { done, value: evt } = await reader.read();\n if (done) break;\n if (!evt) continue;\n\n let evtData;\n try {\n evtData = JSON.parse(evt.data);\n } catch {\n continue;\n }\n\n const event = evt.type;\n\n if (event === 'conversation.message.delta') {\n if (evtData.reasoning_content) {\n reasoningContent += evtData.reasoning_content;\n } else if (evtData.content) {\n textContent += evtData.content;\n }\n } else if (event === 'conversation.chat.completed' || event === 'done') {\n finishReason = 'stop';\n if (evtData.usage) {\n usage = {\n inputTokens: evtData.usage.input_count || 0,\n outputTokens: evtData.usage.output_count || 0,\n totalTokens: evtData.usage.total_count || 0,\n };\n }\n } else if (event === 'error') {\n finishReason = 'error';\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const content: LanguageModelV2Content[] = [];\n if (reasoningContent) {\n content.push({ type: 'reasoning', text: reasoningContent });\n }\n if (textContent) {\n content.push({ type: 'text', text: textContent });\n }\n\n return { content, finishReason, usage };\n}\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\n\n/**\n * 创建一个包含错误信息的流\n * @param error 错误信息\n * @returns ReadableStream<LanguageModelV2StreamPart>\n */\nexport const createErrorStream = (error: string): ReadableStream<LanguageModelV2StreamPart> => {\n return new ReadableStream<LanguageModelV2StreamPart>({\n start(controller) {\n const id = generateId();\n controller.enqueue({\n id,\n type: 'text-start',\n });\n controller.enqueue({\n id,\n type: 'text-delta',\n providerMetadata: {\n raw: { data: { type: 'agent-error', error } },\n },\n delta: error,\n });\n controller.enqueue({\n type: 'text-end',\n id,\n });\n controller.close();\n },\n });\n};\n","/**\n * 事件数据取样,某些流 chunk 处理,需要用到前后的 chunk 信息,因此设计一个类缓存相邻 chunk,用于处理依据\n */\nexport class EvtSample {\n private _evtSampleMap: Map<string, any> = new Map();\n private _key1: string = \"1\";\n private _key2: string = \"2\";\n private _maxSample = 2;\n\n public addEventSample(evt: any) {\n if (this._evtSampleMap.size >= this._maxSample) {\n const evt2 = this._evtSampleMap.get(this._key2);\n this._evtSampleMap.set(this._key1, evt2);\n this._evtSampleMap.set(this._key2, evt);\n return;\n }\n\n this._evtSampleMap.set((this._evtSampleMap.size + 1).toString(), evt);\n }\n\n public getFirstSample() {\n return this._evtSampleMap.get(this._key1);\n }\n\n public getSecondSample() {\n return this._evtSampleMap.get(this._key2);\n }\n}\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { StreamChatData } from '@coze/api';\nimport { EvtSample } from '../evt-sample';\n\n/**\n * 补充特殊的 llm chunk, reasoning-end, text-start\n */\nexport class LLMChunkInjectorTransformStream extends TransformStream<\n StreamChatData,\n | StreamChatData\n | (LanguageModelV2StreamPart & {\n disableTransform: boolean;\n })\n> {\n private eventSampleMap = new EvtSample();\n\n constructor() {\n super({\n transform: (\n part: StreamChatData,\n controller: TransformStreamDefaultController<\n StreamChatData | (LanguageModelV2StreamPart & { disableTransform: boolean })\n >\n ) => {\n // 添加事件样本(原逻辑中的addEventSample)\n this.eventSampleMap.addEventSample(part);\n\n // 处理sample1/sample2特殊判断逻辑\n const sample1 = this.eventSampleMap.getFirstSample();\n const sample2 = this.eventSampleMap.getSecondSample();\n\n // handle reasoning end\n if (\n sample1 &&\n sample2 &&\n sample1.data.reasoning_content &&\n !sample2.data.reasoning_content\n ) {\n controller.enqueue({\n disableTransform: true,\n type: 'reasoning-end',\n id: sample1.data.conversation_id,\n });\n }\n\n // handle text-start\n if (sample1 && sample2 && !sample1.data.content && sample2.data.content) {\n controller.enqueue({\n disableTransform: true,\n type: 'text-start',\n id: sample2.data.conversation_id,\n });\n }\n\n // 传递part到下一个转换流\n controller.enqueue(part);\n },\n });\n }\n}\n","import { ChatEventType, StreamChatData } from '@coze/api';\nimport { ServerSentEvent } from 'parse-sse';\n\nexport default class MCPChunkFilterTransformStream extends TransformStream {\n isVisibleMsgPart(evtData: any, part: any, omitTextEndChunk?: boolean) {\n if (evtData.type === 'knowledge' && evtData.role === 'assistant') {\n return false;\n }\n\n // Omit text-end chunk if the flag is set\n if (\n omitTextEndChunk &&\n part.event === ChatEventType.CONVERSATION_MESSAGE_COMPLETED &&\n part.data.type !== 'follow_up'\n ) {\n return false;\n }\n\n if (part.event === 'conversation.message.completed' && evtData.type == 'verbose') {\n return false;\n }\n\n return true;\n }\n\n constructor(omitTextEndChunk: boolean = false) {\n super({\n transform: (\n evt: ServerSentEvent,\n controller: TransformStreamDefaultController<StreamChatData>\n ) => {\n if (!evt) return;\n\n // 解析evt为part对象(原逻辑中的part构建)\n const part = {\n event: evt.type,\n data: JSON.parse(evt.data) || {},\n } as StreamChatData;\n\n // 过滤逻辑:仅传递满足条件的part\n if (this.isVisibleMsgPart(part.data, part, omitTextEndChunk)) {\n controller.enqueue(part);\n }\n },\n });\n }\n}\n","import { LanguageModelV2StreamPart, SharedV2ProviderMetadata } from '@ai-sdk/provider';\nimport { ChatEventType } from '@coze/api';\n\nexport const mcp2llmChunk = (part: any): LanguageModelV2StreamPart | null => {\n const fullData = JSON.stringify(part);\n\n switch (part.event) {\n case ChatEventType.CONVERSATION_CHAT_CREATED:\n return {\n type: 'raw',\n rawValue: part.data,\n };\n break;\n\n case ChatEventType.CONVERSATION_CHAT_IN_PROGRESS:\n return {\n // type: \"text-delta\",\n // id: part.data.conversation_id,\n // delta: part.data.content || \"\",\n // providerMetadata: {\n // raw: { data: fullData },\n // },\n type: 'raw',\n rawValue: part.data,\n };\n break;\n\n case ChatEventType.CONVERSATION_MESSAGE_DELTA:\n const isReasoning = Boolean(part.data.reasoning_content);\n return {\n type: isReasoning ? 'reasoning-delta' : 'text-delta',\n delta: isReasoning ? part.data.reasoning_content : part.data.content,\n id: part.data.conversation_id,\n providerMetadata: {},\n };\n break;\n\n case ChatEventType.CONVERSATION_MESSAGE_COMPLETED:\n if (part.data && part.data.type === 'follow_up') {\n return {\n type: 'raw',\n rawValue: part.data,\n };\n }\n\n if (part.status === 'completed') {\n return {\n type: 'text-end',\n id: part.data.conversation_id,\n // delta: part.data.content || part.data.reasoning_content || \"\",\n providerMetadata: {},\n };\n }\n\n return {\n type: 'raw',\n rawValue: part.data,\n };\n\n break;\n\n case ChatEventType.CONVERSATION_CHAT_COMPLETED:\n // Yield finish event with usage information\n return {\n type: 'finish',\n finishReason: 'stop',\n usage: {\n inputTokens: part.data.usage?.input_count || 0,\n outputTokens: part.data.usage?.output_count || 0,\n totalTokens: part.data.usage?.total_count || 0,\n },\n };\n break;\n\n case ChatEventType.DONE:\n // Stream completed successfully\n return {\n type: 'finish',\n finishReason: 'stop',\n usage: {\n inputTokens: part.data.usage?.input_count || 0,\n outputTokens: part.data.usage?.output_count || 0,\n totalTokens: part.data.usage?.total_count || 0,\n },\n };\n break;\n\n case ChatEventType.ERROR:\n // Handle errors\n console.error('[ERROR]', part.data);\n return {\n type: 'error',\n error: part.data,\n };\n\n default:\n // Handle unknown event types\n console.warn('Unknown event type:', part.event);\n return {\n type: 'error',\n error: 'Unknown event type' + part.event,\n };\n }\n\n return {\n type: 'error',\n error: 'unknown',\n };\n};\n","import { ChatEventType, StreamChatData } from '@coze/api';\nimport { mcp2llmChunk } from '../utils/mcp-to-llm-chunk';\nimport { LanguageModelV2StreamPart } from '@ai-sdk/provider';\n\nexport default class LLMPartTrasnformStream extends TransformStream {\n constructor() {\n super({\n transform: (\n part: StreamChatData | (LanguageModelV2StreamPart & { disableTransform: boolean }),\n controller: TransformStreamDefaultController<LanguageModelV2StreamPart | undefined>\n ) => {\n // Bypass transform if disableTransform flag is set\n const { disableTransform } = part as any;\n if (disableTransform) {\n controller.enqueue(part as any);\n return;\n }\n\n try {\n const chunk = mcp2llmChunk(part as any);\n if (chunk) {\n controller.enqueue(chunk as any);\n }\n } catch (error) {\n console.error('transform coze evt error');\n }\n },\n });\n }\n}\n","import { CreateChatRes } from '@coze/api';\nimport { CozeChatConfig, IGenerateResult } from '../types';\nimport { getCozeChatMsgDetail } from './get-coze-chat-msg-detail';\n\nexport const BuildWarningGenerateResult = (message: string): IGenerateResult => {\n return {\n content: [],\n finishReason: 'error',\n request: {\n body: null,\n },\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n response: {\n body: null,\n },\n warnings: [\n {\n type: 'other',\n message,\n },\n ],\n };\n};\n\nexport const BuildGenerateResultByChatRes = async (\n response: Response,\n chatConfig: CozeChatConfig,\n reqBody?: unknown\n): Promise<IGenerateResult> => {\n if (!response.ok) {\n return Promise.reject(\n BuildWarningGenerateResult(`Coze API error: ${response.status} ${response.statusText}`)\n );\n }\n\n const res = (await response.json()) as CreateChatRes;\n if (res.code !== 0) {\n return Promise.reject(BuildWarningGenerateResult(`Coze API error: ${res.code} ${res.msg}`));\n }\n\n const msgRes = await getCozeChatMsgDetail(res.data.conversation_id, res.data.id, chatConfig);\n if (!msgRes.ok) {\n return Promise.reject(\n BuildWarningGenerateResult(\n `Failed to get message detail: ${msgRes.status} ${msgRes.statusText}`\n )\n );\n }\n const msgDetail = await msgRes.json();\n\n return {\n content: msgDetail.data.message.content,\n finishReason: msgDetail.data.message.status === 'finished' ? 'stop' : 'error',\n request: {\n body: reqBody,\n },\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n response: {\n body: msgDetail,\n },\n warnings: [],\n };\n};\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { JSONParser } from '@streamparser/json';\nimport { createTextInfoEnqueuer, TextInfoEnqueuer } from '../utils/enqueue-text-info';\nimport { rebuildFieldsJsonStructure } from '@baishuyun/ai-feat-utils';\n\nexport const createFieldsJsonTransformStream = (enableJsonParser: boolean) => {\n let parser: JSONParser;\n let enqueueTextDelta: TextInfoEnqueuer;\n let id: string;\n let isFirstChunk = true;\n // 当 LLM 返回的不是 JSON 而是普通文本时,切换到直通模式\n let passthroughMode = false;\n\n const chunkGuard = (chunk: LanguageModelV2StreamPart): boolean => {\n if (!enableJsonParser || passthroughMode) {\n return false;\n }\n\n if (chunk.type !== 'text-delta' || !('delta' in chunk)) {\n return false;\n }\n\n return true;\n };\n\n const transformer = {\n flush: (controller: TransformStreamDefaultController<any>) => {\n try {\n // parser?.end();\n controller.terminate(); // 信号通知下游可读流已关闭\n } catch (e) {\n controller.error('stop error' + e);\n }\n },\n transform: (\n chunk: LanguageModelV2StreamPart,\n controller: TransformStreamDefaultController<LanguageModelV2StreamPart>\n ) => {\n if (!parser && !passthroughMode) {\n return;\n }\n\n try {\n if (chunkGuard(chunk)) {\n if ('id' in chunk && 'delta' in chunk) {\n id = chunk.id;\n let delta = chunk.delta;\n if (isFirstChunk) {\n delta = delta.replace(/^\\uFEFF/, '');\n isFirstChunk = false;\n }\n parser.write(delta);\n } else {\n console.warn('Unexpected chunk format for JSON parsing:', chunk);\n controller.enqueue(chunk);\n }\n } else {\n controller.enqueue(chunk);\n }\n } catch (e) {\n console.log('write or enqueue error', e);\n controller.error(e);\n }\n },\n start: (controller: TransformStreamDefaultController<any>) => {\n parser = new JSONParser({\n paths: ['$.*'],\n });\n\n enqueueTextDelta = enableJsonParser\n ? createTextInfoEnqueuer(controller)\n : (content: string) => {};\n\n parser.onValue = (parsedInfo: any) => {\n const value = parsedInfo.value;\n\n if (value.widget) {\n value.widget.widgetName = `_widget_${Date.now()}`;\n }\n\n enqueueTextDelta(\n JSON.stringify(value),\n JSON.stringify({\n type: 'mcp-fields-json',\n field: rebuildFieldsJsonStructure(value),\n }),\n id\n );\n };\n\n parser.onError = (err: any) => {\n console.error('JsonWidgetStream: JSON Parsing Error:', err);\n\n // LLM 返回的不是 JSON,切换到直通模式,后续 text-delta 直接透传\n passthroughMode = true;\n };\n\n parser.onEnd = () => {\n enqueueTextDelta(\n ' ',\n JSON.stringify({\n appendConfirm: 'save-fields',\n })\n );\n };\n },\n };\n\n return new TransformStream<LanguageModelV2StreamPart, any>(transformer);\n};\n","import { JSONValue, LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\n\nexport type TextInfoEnqueuer = (textInfo: string, metaPayload?: JSONValue, id?: string) => void;\n\nexport const createTextInfoEnqueuer =\n (controller: TransformStreamDefaultController<LanguageModelV2StreamPart>) =>\n (\n textInfo: string,\n metaPayload?: JSONValue,\n id: string = generateId(),\n deltaOnly: boolean = false\n ) => {\n const i = id ?? generateId();\n\n const startPart: LanguageModelV2StreamPart = {\n type: 'text-start',\n id: i,\n };\n\n const deltaPart: LanguageModelV2StreamPart = {\n type: 'text-delta',\n id: i,\n delta: textInfo,\n providerMetadata: metaPayload\n ? {\n raw: { data: metaPayload },\n }\n : undefined,\n };\n\n const endPart: LanguageModelV2StreamPart = {\n type: 'text-end',\n id: i,\n };\n\n if (deltaOnly) {\n controller.enqueue(deltaPart);\n return;\n }\n\n controller.enqueue(startPart);\n controller.enqueue(deltaPart);\n controller.enqueue(endPart);\n };\n","import {\n createTextInfoEnqueuer,\n TextInfoEnqueuer,\n} from \"../utils/enqueue-text-info\";\n\nexport default class SuggestionTransformStream extends TransformStream<\n any,\n any\n> {\n constructor(enable: boolean) {\n let enqueuer: TextInfoEnqueuer;\n super({\n start(controller) {\n enqueuer = createTextInfoEnqueuer(controller);\n },\n transform(chunk, controller) {\n if (\n enable &&\n chunk.type === \"raw\" &&\n chunk.rawValue.type === \"follow_up\" &&\n enqueuer\n ) {\n enqueuer(\n chunk.rawValue.content,\n JSON.stringify({\n type: \"suggestion\",\n }),\n );\n } else {\n controller.enqueue(chunk);\n }\n },\n });\n }\n}\n"],"mappings":"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","names":["import_provider_utils","import_parse_sse","import_web","import_api","import_api","import_provider_utils","import_ai_feat_utils"]}
package/dist/index.mjs CHANGED
@@ -316,7 +316,7 @@ var mcp2llmChunk = (part) => {
316
316
  console.error("[ERROR]", part.data);
317
317
  return {
318
318
  type: "error",
319
- error: new Error(`Coze streaming error: ${JSON.stringify(part.data)}`)
319
+ error: part.data
320
320
  };
321
321
  default:
322
322
  console.warn("Unknown event type:", part.event);
@@ -380,6 +380,7 @@ var BuildWarningGenerateResult = (message) => {
380
380
  };
381
381
 
382
382
  // src/coze-language-model.ts
383
+ import { safeParseJson } from "@baishuyun/ai-feat-utils";
383
384
  var CozeLanguageModel = class {
384
385
  specificationVersion = "v2";
385
386
  provider;
@@ -460,6 +461,7 @@ var CozeLanguageModel = class {
460
461
  });
461
462
  const user_id = options.headers ? options.headers["x-user-id"] : "";
462
463
  const user_var = options.headers ? options.headers["x-user-var"] : "";
464
+ const user_param = (options.headers ? options.headers["x-user-param"] : "") ?? "";
463
465
  let customVar;
464
466
  if (user_var) {
465
467
  try {
@@ -468,13 +470,15 @@ var CozeLanguageModel = class {
468
470
  console.warn("x-user-var parse error", e);
469
471
  }
470
472
  }
471
- console.log("msssage send to coze", JSON.stringify(messages, null, 2));
473
+ const params = user_param ? safeParseJson(user_param) : {};
474
+ console.log("params 2 workflow", params);
472
475
  const body = {
473
476
  bot_id: this.config.botId,
474
477
  auto_save_history: false,
475
478
  user_id: user_id || "7543191937730215936",
476
479
  stream: true,
477
- additional_messages: messages
480
+ additional_messages: messages,
481
+ parameters: params
478
482
  };
479
483
  if (customVar) {
480
484
  body.custom_variables = customVar;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/coze-provider.ts","../src/const.ts","../src/coze-language-model.ts","../src/utils/prompt-to-model-msg.ts","../src/utils/accumulate-sse-response.ts","../src/utils/create-error-stream.ts","../src/evt-sample.ts","../src/stream-trasnformer/llm-chunk-injector-transform-stream.ts","../src/stream-trasnformer/mcp-chunk-filter-transform-stream.ts","../src/utils/mcp-to-llm-chunk.ts","../src/stream-trasnformer/llm-part-transform-stream.ts","../src/utils/build-generate-result-by-chat-res.ts","../src/stream-trasnformer/fields-json-transform-stream.ts","../src/utils/enqueue-text-info.ts","../src/stream-trasnformer/suggestion-transform-stream.ts"],"sourcesContent":["import {\n LanguageModelV2,\n LanguageModelV2StreamPart,\n NoSuchModelError,\n ProviderV2,\n} from '@ai-sdk/provider';\n\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { CozeChatModelId } from './types';\nimport { VERSION } from './const';\nimport { CozeLanguageModel } from './coze-language-model';\n\nexport interface CozeProviderSettings {\n apiKey?: string;\n /**\nBase URL for the API calls.\n*/\n baseURL?: string;\n\n botId: string;\n\n /**\nCustom headers to include in the requests.\n*/\n headers?: Record<string, string>;\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n*/\n fetch?: FetchFunction;\n\n extraStreamTransformers?: (() => TransformStream<LanguageModelV2StreamPart, any>)[];\n}\n\nexport interface CozeProvider extends ProviderV2 {\n (modelId: CozeChatModelId): LanguageModelV2;\n\n languageModel(modelId: CozeChatModelId): LanguageModelV2;\n\n /**\nCreates a DeepSeek chat model for text generation.\n*/\n chat(modelId: CozeChatModelId): LanguageModelV2;\n}\n\nexport function createCoze(\n options: CozeProviderSettings = {\n botId: '',\n }\n): CozeProvider {\n const baseURL = withoutTrailingSlash(options.baseURL);\n\n const agentPartHeader = withUserAgentSuffix(options.headers || {}, `ai-sdk/coze/${VERSION}`);\n const authorizationHeader = `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'COZE_API_KEY',\n description: '',\n })}`;\n\n const getHeaders = () => ({\n ...agentPartHeader,\n Authorization: authorizationHeader,\n 'content-type': 'application/json',\n });\n\n const createLanguageModel = (modelId: CozeChatModelId) => {\n return new CozeLanguageModel(modelId, {\n botId: options.botId,\n provider: `coze.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n extraStreamTransformers: options.extraStreamTransformers || [],\n });\n };\n\n const provider = (modelId: CozeChatModelId) => createLanguageModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n","export const VERSION = \"0.0.1\";\n","import {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from '@ai-sdk/provider';\nimport { CozeChatConfig, IGenerateResult } from './types';\nimport { ServerSentEventTransformStream } from 'parse-sse';\nimport { TextDecoderStream } from 'stream/web';\nimport { convertPromptToMessages } from './utils/prompt-to-model-msg';\nimport { accumulateSSEResponse } from './utils/accumulate-sse-response';\nimport { createErrorStream } from './utils/create-error-stream';\nimport { LLMChunkInjectorTransformStream } from './stream-trasnformer/llm-chunk-injector-transform-stream';\nimport MCPChunkFilterTransformStream from './stream-trasnformer/mcp-chunk-filter-transform-stream';\nimport LLMPartTrasnformStream from './stream-trasnformer/llm-part-transform-stream';\nimport { createCozeNonStreamingChat } from './utils/create-coze-non-streaming-chat';\nimport {\n BuildGenerateResultByChatRes,\n BuildWarningGenerateResult,\n} from './utils/build-generate-result-by-chat-res';\n\nexport class CozeLanguageModel implements LanguageModelV2 {\n specificationVersion: 'v2' = 'v2';\n provider: string;\n modelId: string;\n supportedUrls: Record<string, RegExp[]> | PromiseLike<Record<string, RegExp[]>>;\n\n private readonly config: CozeChatConfig;\n\n constructor(modelId: string, config: CozeChatConfig) {\n this.modelId = modelId;\n this.provider = config.provider || 'coze';\n this.supportedUrls = config.supportedUrls?.() || {};\n this.config = config;\n }\n\n async doGenerate(options: LanguageModelV2CallOptions): Promise<IGenerateResult> {\n const messages = convertPromptToMessages(options.prompt);\n const warnings: LanguageModelV2CallWarning[] = [];\n\n const url = this.config.url({ path: '/chat' });\n\n const user_id = options.headers ? options.headers['x-user-id'] : '';\n const user_var = options.headers ? options.headers['x-user-var'] : '';\n\n let customVar;\n if (user_var) {\n try {\n customVar = JSON.parse(user_var);\n } catch (e) {\n console.warn('x-user-var parse error', e);\n }\n }\n\n const body = {\n bot_id: this.config.botId,\n auto_save_history: false,\n user_id: user_id || '7543191937730215936',\n stream: true,\n additional_messages: messages,\n };\n\n if (customVar) {\n (body as any).custom_variables = customVar;\n }\n\n const headers = this.config.headers();\n const abortSignal = options.abortSignal;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n credentials: 'include',\n body: JSON.stringify(body),\n signal: abortSignal,\n });\n\n if (!response.ok || !response.body) {\n const rawError = await response.text();\n let errorDetail;\n try {\n errorDetail = JSON.parse(rawError);\n } catch {\n errorDetail = rawError;\n }\n\n const errorMessage =\n typeof errorDetail === 'object' && errorDetail?.msg\n ? errorDetail.msg\n : `Coze API error: ${response.status} ${response.statusText}`;\n\n return BuildWarningGenerateResult(errorMessage);\n }\n\n const { content, finishReason, usage } = await accumulateSSEResponse(response.body);\n\n return {\n content,\n finishReason,\n usage,\n request: { body },\n response: { body: null },\n warnings,\n };\n }\n\n isVisibleMsgPart(evtData: any) {\n if (evtData.type === 'knowledge' && evtData.role === 'assistant') {\n return false;\n }\n\n return true;\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<{\n stream: ReadableStream<LanguageModelV2StreamPart>;\n request?: { body?: unknown };\n response?: { headers?: SharedV2Headers };\n }> {\n const messages = convertPromptToMessages(options.prompt);\n const warnings: LanguageModelV2CallWarning[] = [];\n\n const url = this.config.url({\n path: '/chat',\n });\n\n const user_id = options.headers ? options.headers['x-user-id'] : '';\n const user_var = options.headers ? options.headers['x-user-var'] : '';\n // const user_token = options.headers ? options.headers['x-user-token'] : '';\n\n let customVar;\n if (user_var) {\n try {\n customVar = JSON.parse(user_var);\n } catch (e) {\n console.warn('x-user-var parse error', e);\n }\n }\n\n console.log('msssage send to coze', JSON.stringify(messages, null, 2));\n const body = {\n bot_id: this.config.botId,\n auto_save_history: false,\n user_id: user_id || '7543191937730215936',\n stream: true,\n additional_messages: messages,\n };\n\n if (customVar) {\n (body as any).custom_variables = customVar;\n }\n\n const headers = this.config.headers();\n\n const abortSignal = options.abortSignal;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n credentials: 'include',\n body: JSON.stringify(body),\n signal: abortSignal,\n });\n\n if (!response.ok || !response.body) {\n // if (true) {\n const rawError = await response.text();\n let errorDetail;\n try {\n errorDetail = JSON.parse(rawError); // 尝试解析为 JSON\n } catch {\n errorDetail = rawError; // 非 JSON 直接使用\n }\n\n // 创建一个包含错误信息的流,让 UI 层处理\n const errorMessage =\n typeof errorDetail === 'object' && errorDetail?.msg\n ? errorDetail.msg\n : `Coze API error: ${response.status} ${response.statusText}`;\n\n console.error(errorMessage);\n\n return {\n stream: createErrorStream('会话异常,请重试'),\n };\n }\n\n let externalTransformers = (this.config.extraStreamTransformers || []).map((factory) =>\n factory()\n );\n\n /// 不同阶段,可能需要不同的流处理逻辑\n const stage = options.headers ? options.headers['x-user-stage'] : '';\n const isBuildStage = stage === 'build';\n const isFillStage = stage === 'fill';\n\n const result = response.body\n // 将字节流解码为文本流\n .pipeThrough(\n new TextDecoderStream() as ReadableWritablePair<\n string | undefined,\n Uint8Array<ArrayBufferLike>\n >\n )\n // 解析为 SSE 事件流\n .pipeThrough(new ServerSentEventTransformStream())\n // 过滤不可见消息部分,比如知识库调用,和一些指令性质无需展示在聊天中的通信内容\n .pipeThrough(new MCPChunkFilterTransformStream(isBuildStage || isFillStage))\n // 补充特殊 llm chunk\n .pipeThrough(new LLMChunkInjectorTransformStream())\n // 转换为 LanguageModelV2StreamPart 格式\n .pipeThrough(new LLMPartTrasnformStream());\n\n let finalResult = result;\n\n if (externalTransformers.length > 0) {\n finalResult = externalTransformers.reduce(\n (stream, transformer) => stream.pipeThrough(transformer),\n result // 初始累积值(原始流)\n );\n }\n\n return {\n stream: finalResult as ReadableStream<LanguageModelV2StreamPart>,\n };\n }\n}\n","import {\n LanguageModelV2FilePart,\n LanguageModelV2Message,\n LanguageModelV2Prompt,\n LanguageModelV2TextPart,\n} from '@ai-sdk/provider';\nimport { RoleType } from '@coze/api';\nimport { Attachment } from '@baishuyun/types/src/chat';\nimport { excel2json } from './excel2json';\n\nconst decoder = new TextDecoder('utf-8');\n\nconst data2csvText = (data: Uint8Array) => {\n return decoder.decode(data);\n};\n\ntype userMsg = {\n role: 'user';\n content: Array<LanguageModelV2TextPart | LanguageModelV2FilePart>;\n};\n\nconst getPartType = (part: LanguageModelV2TextPart | LanguageModelV2FilePart) => {\n if (part.type === 'text') {\n return 'text';\n }\n\n const isImg = part.mediaType?.startsWith('image/');\n if (isImg) {\n return 'image';\n }\n\n const isAudio = part.mediaType?.startsWith('audio/');\n if (isAudio) {\n return 'audio';\n }\n\n return 'file';\n};\n\nconst parseMessageContent = (message: LanguageModelV2Message, isTextOnly?: boolean) => {\n if (isTextOnly) {\n return (message.content as Array<LanguageModelV2TextPart>)\n .map((part: LanguageModelV2TextPart) => part.text)\n .join('\\n');\n }\n\n const result = (message.content as Array<LanguageModelV2TextPart | LanguageModelV2FilePart>).map(\n (part) => {\n const meta = part.providerOptions?.uploadMetadata as Attachment;\n const url = meta?.url;\n\n return {\n type: getPartType(part),\n text: part.type === 'text' ? (part as LanguageModelV2TextPart).text : '',\n file_url: part.type === 'text' ? undefined : url,\n };\n }\n );\n\n return JSON.stringify(result);\n};\n\nconst isTextOnlyMsg = (message: userMsg) => message.content.every((part) => part.type === 'text');\n\nexport const convertPromptToMessages = (messages: LanguageModelV2Prompt) => {\n return messages.map((message) => {\n const isTextOnly = isTextOnlyMsg(message as userMsg);\n switch (message.role) {\n case 'user':\n return {\n role: RoleType.User,\n content: parseMessageContent(message, isTextOnly),\n content_type: isTextOnly ? 'text' : 'object_string',\n };\n break;\n\n case 'assistant':\n return {\n role: RoleType.Assistant,\n content: (message.content as Array<LanguageModelV2TextPart>)\n .map((part: LanguageModelV2TextPart) => (part.type === 'text' ? part.text : ''))\n .join(''),\n content_type: 'text',\n };\n break;\n }\n });\n};\n","import {\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2Usage,\n} from '@ai-sdk/provider';\nimport { ServerSentEventTransformStream } from 'parse-sse';\nimport { TextDecoderStream } from 'stream/web';\n\nexport interface AccumulatedSSEResponse {\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n}\n\n/**\n * 从字节流中解码 SSE 事件并累积完整响应内容\n */\nexport async function accumulateSSEResponse(\n body: ReadableStream<Uint8Array>\n): Promise<AccumulatedSSEResponse> {\n const sseStream = body\n .pipeThrough(\n new TextDecoderStream() as ReadableWritablePair<\n string | undefined,\n Uint8Array<ArrayBufferLike>\n >\n )\n .pipeThrough(new ServerSentEventTransformStream());\n\n let textContent = '';\n let reasoningContent = '';\n let finishReason: LanguageModelV2FinishReason = 'stop';\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n const reader = sseStream.getReader();\n try {\n while (true) {\n const { done, value: evt } = await reader.read();\n if (done) break;\n if (!evt) continue;\n\n let evtData;\n try {\n evtData = JSON.parse(evt.data);\n } catch {\n continue;\n }\n\n const event = evt.type;\n\n if (event === 'conversation.message.delta') {\n if (evtData.reasoning_content) {\n reasoningContent += evtData.reasoning_content;\n } else if (evtData.content) {\n textContent += evtData.content;\n }\n } else if (event === 'conversation.chat.completed' || event === 'done') {\n finishReason = 'stop';\n if (evtData.usage) {\n usage = {\n inputTokens: evtData.usage.input_count || 0,\n outputTokens: evtData.usage.output_count || 0,\n totalTokens: evtData.usage.total_count || 0,\n };\n }\n } else if (event === 'error') {\n finishReason = 'error';\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const content: LanguageModelV2Content[] = [];\n if (reasoningContent) {\n content.push({ type: 'reasoning', text: reasoningContent });\n }\n if (textContent) {\n content.push({ type: 'text', text: textContent });\n }\n\n return { content, finishReason, usage };\n}\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\n\n/**\n * 创建一个包含错误信息的流\n * @param error 错误信息\n * @returns ReadableStream<LanguageModelV2StreamPart>\n */\nexport const createErrorStream = (error: string): ReadableStream<LanguageModelV2StreamPart> => {\n return new ReadableStream<LanguageModelV2StreamPart>({\n start(controller) {\n const id = generateId();\n controller.enqueue({\n id,\n type: 'text-start',\n });\n controller.enqueue({\n id,\n type: 'text-delta',\n providerMetadata: {\n raw: { data: { type: 'agent-error', error } },\n },\n delta: error,\n });\n controller.enqueue({\n type: 'text-end',\n id,\n });\n controller.close();\n },\n });\n};\n","/**\n * 事件数据取样,某些流 chunk 处理,需要用到前后的 chunk 信息,因此设计一个类缓存相邻 chunk,用于处理依据\n */\nexport class EvtSample {\n private _evtSampleMap: Map<string, any> = new Map();\n private _key1: string = \"1\";\n private _key2: string = \"2\";\n private _maxSample = 2;\n\n public addEventSample(evt: any) {\n if (this._evtSampleMap.size >= this._maxSample) {\n const evt2 = this._evtSampleMap.get(this._key2);\n this._evtSampleMap.set(this._key1, evt2);\n this._evtSampleMap.set(this._key2, evt);\n return;\n }\n\n this._evtSampleMap.set((this._evtSampleMap.size + 1).toString(), evt);\n }\n\n public getFirstSample() {\n return this._evtSampleMap.get(this._key1);\n }\n\n public getSecondSample() {\n return this._evtSampleMap.get(this._key2);\n }\n}\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { StreamChatData } from '@coze/api';\nimport { EvtSample } from '../evt-sample';\n\n/**\n * 补充特殊的 llm chunk, reasoning-end, text-start\n */\nexport class LLMChunkInjectorTransformStream extends TransformStream<\n StreamChatData,\n | StreamChatData\n | (LanguageModelV2StreamPart & {\n disableTransform: boolean;\n })\n> {\n private eventSampleMap = new EvtSample();\n\n constructor() {\n super({\n transform: (\n part: StreamChatData,\n controller: TransformStreamDefaultController<\n StreamChatData | (LanguageModelV2StreamPart & { disableTransform: boolean })\n >\n ) => {\n // 添加事件样本(原逻辑中的addEventSample)\n this.eventSampleMap.addEventSample(part);\n\n // 处理sample1/sample2特殊判断逻辑\n const sample1 = this.eventSampleMap.getFirstSample();\n const sample2 = this.eventSampleMap.getSecondSample();\n\n // handle reasoning end\n if (\n sample1 &&\n sample2 &&\n sample1.data.reasoning_content &&\n !sample2.data.reasoning_content\n ) {\n controller.enqueue({\n disableTransform: true,\n type: 'reasoning-end',\n id: sample1.data.conversation_id,\n });\n }\n\n // handle text-start\n if (sample1 && sample2 && !sample1.data.content && sample2.data.content) {\n controller.enqueue({\n disableTransform: true,\n type: 'text-start',\n id: sample2.data.conversation_id,\n });\n }\n\n // 传递part到下一个转换流\n controller.enqueue(part);\n },\n });\n }\n}\n","import { ChatEventType, StreamChatData } from '@coze/api';\nimport { ServerSentEvent } from 'parse-sse';\n\nexport default class MCPChunkFilterTransformStream extends TransformStream {\n isVisibleMsgPart(evtData: any, part: any, omitTextEndChunk?: boolean) {\n if (evtData.type === 'knowledge' && evtData.role === 'assistant') {\n return false;\n }\n\n // Omit text-end chunk if the flag is set\n if (\n omitTextEndChunk &&\n part.event === ChatEventType.CONVERSATION_MESSAGE_COMPLETED &&\n part.data.type !== 'follow_up'\n ) {\n return false;\n }\n\n if (part.event === 'conversation.message.completed' && evtData.type == 'verbose') {\n return false;\n }\n\n return true;\n }\n\n constructor(omitTextEndChunk: boolean = false) {\n super({\n transform: (\n evt: ServerSentEvent,\n controller: TransformStreamDefaultController<StreamChatData>\n ) => {\n if (!evt) return;\n\n // 解析evt为part对象(原逻辑中的part构建)\n const part = {\n event: evt.type,\n data: JSON.parse(evt.data) || {},\n } as StreamChatData;\n\n // 过滤逻辑:仅传递满足条件的part\n if (this.isVisibleMsgPart(part.data, part, omitTextEndChunk)) {\n controller.enqueue(part);\n }\n },\n });\n }\n}\n","import { LanguageModelV2StreamPart, SharedV2ProviderMetadata } from '@ai-sdk/provider';\nimport { ChatEventType } from '@coze/api';\n\nexport const mcp2llmChunk = (part: any): LanguageModelV2StreamPart | null => {\n const fullData = JSON.stringify(part);\n\n switch (part.event) {\n case ChatEventType.CONVERSATION_CHAT_CREATED:\n return {\n type: 'raw',\n rawValue: part.data,\n };\n break;\n\n case ChatEventType.CONVERSATION_CHAT_IN_PROGRESS:\n return {\n // type: \"text-delta\",\n // id: part.data.conversation_id,\n // delta: part.data.content || \"\",\n // providerMetadata: {\n // raw: { data: fullData },\n // },\n type: 'raw',\n rawValue: part.data,\n };\n break;\n\n case ChatEventType.CONVERSATION_MESSAGE_DELTA:\n const isReasoning = Boolean(part.data.reasoning_content);\n return {\n type: isReasoning ? 'reasoning-delta' : 'text-delta',\n delta: isReasoning ? part.data.reasoning_content : part.data.content,\n id: part.data.conversation_id,\n providerMetadata: {},\n };\n break;\n\n case ChatEventType.CONVERSATION_MESSAGE_COMPLETED:\n if (part.data && part.data.type === 'follow_up') {\n return {\n type: 'raw',\n rawValue: part.data,\n };\n }\n\n if (part.status === 'completed') {\n return {\n type: 'text-end',\n id: part.data.conversation_id,\n // delta: part.data.content || part.data.reasoning_content || \"\",\n providerMetadata: {},\n };\n }\n\n return {\n type: 'raw',\n rawValue: part.data,\n };\n\n break;\n\n case ChatEventType.CONVERSATION_CHAT_COMPLETED:\n // Yield finish event with usage information\n return {\n type: 'finish',\n finishReason: 'stop',\n usage: {\n inputTokens: part.data.usage?.input_count || 0,\n outputTokens: part.data.usage?.output_count || 0,\n totalTokens: part.data.usage?.total_count || 0,\n },\n };\n break;\n\n case ChatEventType.DONE:\n // Stream completed successfully\n return {\n type: 'finish',\n finishReason: 'stop',\n usage: {\n inputTokens: part.data.usage?.input_count || 0,\n outputTokens: part.data.usage?.output_count || 0,\n totalTokens: part.data.usage?.total_count || 0,\n },\n };\n break;\n\n case ChatEventType.ERROR:\n // Handle errors\n console.error('[ERROR]', part.data);\n return {\n type: 'error',\n error: new Error(`Coze streaming error: ${JSON.stringify(part.data)}`),\n };\n\n default:\n // Handle unknown event types\n console.warn('Unknown event type:', part.event);\n return {\n type: 'error',\n error: 'Unknown event type' + part.event,\n };\n }\n\n return {\n type: 'error',\n error: 'unknown',\n };\n};\n","import { ChatEventType, StreamChatData } from '@coze/api';\nimport { mcp2llmChunk } from '../utils/mcp-to-llm-chunk';\nimport { LanguageModelV2StreamPart } from '@ai-sdk/provider';\n\nexport default class LLMPartTrasnformStream extends TransformStream {\n constructor() {\n super({\n transform: (\n part: StreamChatData | (LanguageModelV2StreamPart & { disableTransform: boolean }),\n controller: TransformStreamDefaultController<LanguageModelV2StreamPart | undefined>\n ) => {\n // Bypass transform if disableTransform flag is set\n const { disableTransform } = part as any;\n if (disableTransform) {\n controller.enqueue(part as any);\n return;\n }\n\n try {\n const chunk = mcp2llmChunk(part as any);\n if (chunk) {\n controller.enqueue(chunk as any);\n }\n } catch (error) {\n console.error('transform coze evt error');\n }\n },\n });\n }\n}\n","import { CreateChatRes } from '@coze/api';\nimport { CozeChatConfig, IGenerateResult } from '../types';\nimport { getCozeChatMsgDetail } from './get-coze-chat-msg-detail';\n\nexport const BuildWarningGenerateResult = (message: string): IGenerateResult => {\n return {\n content: [],\n finishReason: 'error',\n request: {\n body: null,\n },\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n response: {\n body: null,\n },\n warnings: [\n {\n type: 'other',\n message,\n },\n ],\n };\n};\n\nexport const BuildGenerateResultByChatRes = async (\n response: Response,\n chatConfig: CozeChatConfig,\n reqBody?: unknown\n): Promise<IGenerateResult> => {\n if (!response.ok) {\n return Promise.reject(\n BuildWarningGenerateResult(`Coze API error: ${response.status} ${response.statusText}`)\n );\n }\n\n const res = (await response.json()) as CreateChatRes;\n if (res.code !== 0) {\n return Promise.reject(BuildWarningGenerateResult(`Coze API error: ${res.code} ${res.msg}`));\n }\n\n const msgRes = await getCozeChatMsgDetail(res.data.conversation_id, res.data.id, chatConfig);\n if (!msgRes.ok) {\n return Promise.reject(\n BuildWarningGenerateResult(\n `Failed to get message detail: ${msgRes.status} ${msgRes.statusText}`\n )\n );\n }\n const msgDetail = await msgRes.json();\n\n return {\n content: msgDetail.data.message.content,\n finishReason: msgDetail.data.message.status === 'finished' ? 'stop' : 'error',\n request: {\n body: reqBody,\n },\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n response: {\n body: msgDetail,\n },\n warnings: [],\n };\n};\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { JSONParser } from '@streamparser/json';\nimport { createTextInfoEnqueuer, TextInfoEnqueuer } from '../utils/enqueue-text-info';\nimport { rebuildFieldsJsonStructure } from '@baishuyun/ai-feat-utils';\n\nexport const createFieldsJsonTransformStream = (enableJsonParser: boolean) => {\n let parser: JSONParser;\n let enqueueTextDelta: TextInfoEnqueuer;\n let id: string;\n let isFirstChunk = true;\n // 当 LLM 返回的不是 JSON 而是普通文本时,切换到直通模式\n let passthroughMode = false;\n\n const chunkGuard = (chunk: LanguageModelV2StreamPart): boolean => {\n if (!enableJsonParser || passthroughMode) {\n return false;\n }\n\n if (chunk.type !== 'text-delta' || !('delta' in chunk)) {\n return false;\n }\n\n return true;\n };\n\n const transformer = {\n flush: (controller: TransformStreamDefaultController<any>) => {\n try {\n // parser?.end();\n controller.terminate(); // 信号通知下游可读流已关闭\n } catch (e) {\n controller.error('stop error' + e);\n }\n },\n transform: (\n chunk: LanguageModelV2StreamPart,\n controller: TransformStreamDefaultController<LanguageModelV2StreamPart>\n ) => {\n if (!parser && !passthroughMode) {\n return;\n }\n\n try {\n if (chunkGuard(chunk)) {\n if ('id' in chunk && 'delta' in chunk) {\n id = chunk.id;\n let delta = chunk.delta;\n if (isFirstChunk) {\n delta = delta.replace(/^\\uFEFF/, '');\n isFirstChunk = false;\n }\n parser.write(delta);\n } else {\n console.warn('Unexpected chunk format for JSON parsing:', chunk);\n controller.enqueue(chunk);\n }\n } else {\n controller.enqueue(chunk);\n }\n } catch (e) {\n console.log('write or enqueue error', e);\n controller.error(e);\n }\n },\n start: (controller: TransformStreamDefaultController<any>) => {\n parser = new JSONParser({\n paths: ['$.*'],\n });\n\n enqueueTextDelta = enableJsonParser\n ? createTextInfoEnqueuer(controller)\n : (content: string) => {};\n\n parser.onValue = (parsedInfo: any) => {\n const value = parsedInfo.value;\n\n if (value.widget) {\n value.widget.widgetName = `_widget_${Date.now()}`;\n }\n\n enqueueTextDelta(\n JSON.stringify(value),\n JSON.stringify({\n type: 'mcp-fields-json',\n field: rebuildFieldsJsonStructure(value),\n }),\n id\n );\n };\n\n parser.onError = (err: any) => {\n console.error('JsonWidgetStream: JSON Parsing Error:', err);\n\n // LLM 返回的不是 JSON,切换到直通模式,后续 text-delta 直接透传\n passthroughMode = true;\n };\n\n parser.onEnd = () => {\n enqueueTextDelta(\n ' ',\n JSON.stringify({\n appendConfirm: 'save-fields',\n })\n );\n };\n },\n };\n\n return new TransformStream<LanguageModelV2StreamPart, any>(transformer);\n};\n","import { JSONValue, LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\n\nexport type TextInfoEnqueuer = (textInfo: string, metaPayload?: JSONValue, id?: string) => void;\n\nexport const createTextInfoEnqueuer =\n (controller: TransformStreamDefaultController<LanguageModelV2StreamPart>) =>\n (\n textInfo: string,\n metaPayload?: JSONValue,\n id: string = generateId(),\n deltaOnly: boolean = false\n ) => {\n const i = id ?? generateId();\n\n const startPart: LanguageModelV2StreamPart = {\n type: 'text-start',\n id: i,\n };\n\n const deltaPart: LanguageModelV2StreamPart = {\n type: 'text-delta',\n id: i,\n delta: textInfo,\n providerMetadata: metaPayload\n ? {\n raw: { data: metaPayload },\n }\n : undefined,\n };\n\n const endPart: LanguageModelV2StreamPart = {\n type: 'text-end',\n id: i,\n };\n\n if (deltaOnly) {\n controller.enqueue(deltaPart);\n return;\n }\n\n controller.enqueue(startPart);\n controller.enqueue(deltaPart);\n controller.enqueue(endPart);\n };\n","import {\n createTextInfoEnqueuer,\n TextInfoEnqueuer,\n} from \"../utils/enqueue-text-info\";\n\nexport default class SuggestionTransformStream extends TransformStream<\n any,\n any\n> {\n constructor(enable: boolean) {\n let enqueuer: TextInfoEnqueuer;\n super({\n start(controller) {\n enqueuer = createTextInfoEnqueuer(controller);\n },\n transform(chunk, controller) {\n if (\n enable &&\n chunk.type === \"raw\" &&\n chunk.rawValue.type === \"follow_up\" &&\n enqueuer\n ) {\n enqueuer(\n chunk.rawValue.content,\n JSON.stringify({\n type: \"suggestion\",\n }),\n );\n } else {\n controller.enqueue(chunk);\n }\n },\n });\n }\n}\n"],"mappings":"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","names":["ServerSentEventTransformStream","TextDecoderStream","ChatEventType","TextDecoderStream","ServerSentEventTransformStream","generateId"]}
1
+ {"version":3,"sources":["../src/coze-provider.ts","../src/const.ts","../src/coze-language-model.ts","../src/utils/prompt-to-model-msg.ts","../src/utils/accumulate-sse-response.ts","../src/utils/create-error-stream.ts","../src/evt-sample.ts","../src/stream-trasnformer/llm-chunk-injector-transform-stream.ts","../src/stream-trasnformer/mcp-chunk-filter-transform-stream.ts","../src/utils/mcp-to-llm-chunk.ts","../src/stream-trasnformer/llm-part-transform-stream.ts","../src/utils/build-generate-result-by-chat-res.ts","../src/stream-trasnformer/fields-json-transform-stream.ts","../src/utils/enqueue-text-info.ts","../src/stream-trasnformer/suggestion-transform-stream.ts"],"sourcesContent":["import {\n LanguageModelV2,\n LanguageModelV2StreamPart,\n NoSuchModelError,\n ProviderV2,\n} from '@ai-sdk/provider';\n\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { CozeChatModelId } from './types';\nimport { VERSION } from './const';\nimport { CozeLanguageModel } from './coze-language-model';\n\nexport interface CozeProviderSettings {\n apiKey?: string;\n /**\nBase URL for the API calls.\n*/\n baseURL?: string;\n\n botId: string;\n\n /**\nCustom headers to include in the requests.\n*/\n headers?: Record<string, string>;\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n*/\n fetch?: FetchFunction;\n\n extraStreamTransformers?: (() => TransformStream<LanguageModelV2StreamPart, any>)[];\n}\n\nexport interface CozeProvider extends ProviderV2 {\n (modelId: CozeChatModelId): LanguageModelV2;\n\n languageModel(modelId: CozeChatModelId): LanguageModelV2;\n\n /**\nCreates a DeepSeek chat model for text generation.\n*/\n chat(modelId: CozeChatModelId): LanguageModelV2;\n}\n\nexport function createCoze(\n options: CozeProviderSettings = {\n botId: '',\n }\n): CozeProvider {\n const baseURL = withoutTrailingSlash(options.baseURL);\n\n const agentPartHeader = withUserAgentSuffix(options.headers || {}, `ai-sdk/coze/${VERSION}`);\n const authorizationHeader = `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'COZE_API_KEY',\n description: '',\n })}`;\n\n const getHeaders = () => ({\n ...agentPartHeader,\n Authorization: authorizationHeader,\n 'content-type': 'application/json',\n });\n\n const createLanguageModel = (modelId: CozeChatModelId) => {\n return new CozeLanguageModel(modelId, {\n botId: options.botId,\n provider: `coze.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n extraStreamTransformers: options.extraStreamTransformers || [],\n });\n };\n\n const provider = (modelId: CozeChatModelId) => createLanguageModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n","export const VERSION = \"0.0.1\";\n","import {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from '@ai-sdk/provider';\nimport { CozeChatConfig, IGenerateResult } from './types';\nimport { ServerSentEventTransformStream } from 'parse-sse';\nimport { TextDecoderStream } from 'stream/web';\nimport { convertPromptToMessages } from './utils/prompt-to-model-msg';\nimport { accumulateSSEResponse } from './utils/accumulate-sse-response';\nimport { createErrorStream } from './utils/create-error-stream';\nimport { LLMChunkInjectorTransformStream } from './stream-trasnformer/llm-chunk-injector-transform-stream';\nimport MCPChunkFilterTransformStream from './stream-trasnformer/mcp-chunk-filter-transform-stream';\nimport LLMPartTrasnformStream from './stream-trasnformer/llm-part-transform-stream';\nimport { createCozeNonStreamingChat } from './utils/create-coze-non-streaming-chat';\nimport {\n BuildGenerateResultByChatRes,\n BuildWarningGenerateResult,\n} from './utils/build-generate-result-by-chat-res';\nimport { safeParseJson } from '@baishuyun/ai-feat-utils';\n\nexport class CozeLanguageModel implements LanguageModelV2 {\n specificationVersion: 'v2' = 'v2';\n provider: string;\n modelId: string;\n supportedUrls: Record<string, RegExp[]> | PromiseLike<Record<string, RegExp[]>>;\n\n private readonly config: CozeChatConfig;\n\n constructor(modelId: string, config: CozeChatConfig) {\n this.modelId = modelId;\n this.provider = config.provider || 'coze';\n this.supportedUrls = config.supportedUrls?.() || {};\n this.config = config;\n }\n\n async doGenerate(options: LanguageModelV2CallOptions): Promise<IGenerateResult> {\n const messages = convertPromptToMessages(options.prompt);\n const warnings: LanguageModelV2CallWarning[] = [];\n\n const url = this.config.url({ path: '/chat' });\n\n const user_id = options.headers ? options.headers['x-user-id'] : '';\n const user_var = options.headers ? options.headers['x-user-var'] : '';\n\n let customVar;\n if (user_var) {\n try {\n customVar = JSON.parse(user_var);\n } catch (e) {\n console.warn('x-user-var parse error', e);\n }\n }\n\n const body = {\n bot_id: this.config.botId,\n auto_save_history: false,\n user_id: user_id || '7543191937730215936',\n stream: true,\n additional_messages: messages,\n };\n\n if (customVar) {\n (body as any).custom_variables = customVar;\n }\n\n const headers = this.config.headers();\n const abortSignal = options.abortSignal;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n credentials: 'include',\n body: JSON.stringify(body),\n signal: abortSignal,\n });\n\n if (!response.ok || !response.body) {\n const rawError = await response.text();\n let errorDetail;\n try {\n errorDetail = JSON.parse(rawError);\n } catch {\n errorDetail = rawError;\n }\n\n const errorMessage =\n typeof errorDetail === 'object' && errorDetail?.msg\n ? errorDetail.msg\n : `Coze API error: ${response.status} ${response.statusText}`;\n\n return BuildWarningGenerateResult(errorMessage);\n }\n\n const { content, finishReason, usage } = await accumulateSSEResponse(response.body);\n\n return {\n content,\n finishReason,\n usage,\n request: { body },\n response: { body: null },\n warnings,\n };\n }\n\n isVisibleMsgPart(evtData: any) {\n if (evtData.type === 'knowledge' && evtData.role === 'assistant') {\n return false;\n }\n\n return true;\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<{\n stream: ReadableStream<LanguageModelV2StreamPart>;\n request?: { body?: unknown };\n response?: { headers?: SharedV2Headers };\n }> {\n const messages = convertPromptToMessages(options.prompt);\n const warnings: LanguageModelV2CallWarning[] = [];\n\n const url = this.config.url({\n path: '/chat',\n });\n\n const user_id = options.headers ? options.headers['x-user-id'] : '';\n const user_var = options.headers ? options.headers['x-user-var'] : '';\n // const user_token = options.headers ? options.headers['x-user-token'] : '';\n const user_param = (options.headers ? options.headers['x-user-param'] : '') ?? '';\n\n let customVar;\n if (user_var) {\n try {\n customVar = JSON.parse(user_var);\n } catch (e) {\n console.warn('x-user-var parse error', e);\n }\n }\n\n const params = user_param ? safeParseJson(user_param) : {};\n\n console.log('params 2 workflow', params);\n\n const body = {\n bot_id: this.config.botId,\n auto_save_history: false,\n user_id: user_id || '7543191937730215936',\n stream: true,\n additional_messages: messages,\n parameters: params,\n };\n\n if (customVar) {\n (body as any).custom_variables = customVar;\n }\n\n const headers = this.config.headers();\n\n const abortSignal = options.abortSignal;\n\n // console.log('url', url);\n // console.log('body', JSON.stringify(body, null, 2));\n\n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n credentials: 'include',\n body: JSON.stringify(body),\n signal: abortSignal,\n });\n\n if (!response.ok || !response.body) {\n // if (true) {\n const rawError = await response.text();\n let errorDetail;\n try {\n errorDetail = JSON.parse(rawError); // 尝试解析为 JSON\n } catch {\n errorDetail = rawError; // 非 JSON 直接使用\n }\n\n // 创建一个包含错误信息的流,让 UI 层处理\n const errorMessage =\n typeof errorDetail === 'object' && errorDetail?.msg\n ? errorDetail.msg\n : `Coze API error: ${response.status} ${response.statusText}`;\n\n console.error(errorMessage);\n\n return {\n stream: createErrorStream('会话异常,请重试'),\n };\n }\n\n let externalTransformers = (this.config.extraStreamTransformers || []).map((factory) =>\n factory()\n );\n\n /// 不同阶段,可能需要不同的流处理逻辑\n const stage = options.headers ? options.headers['x-user-stage'] : '';\n const isBuildStage = stage === 'build';\n const isFillStage = stage === 'fill';\n\n const result = response.body\n // 将字节流解码为文本流\n .pipeThrough(\n new TextDecoderStream() as ReadableWritablePair<\n string | undefined,\n Uint8Array<ArrayBufferLike>\n >\n )\n // 解析为 SSE 事件流\n .pipeThrough(new ServerSentEventTransformStream())\n // 过滤不可见消息部分,比如知识库调用,和一些指令性质无需展示在聊天中的通信内容\n .pipeThrough(new MCPChunkFilterTransformStream(isBuildStage || isFillStage))\n // 补充特殊 llm chunk\n .pipeThrough(new LLMChunkInjectorTransformStream())\n // 转换为 LanguageModelV2StreamPart 格式\n .pipeThrough(new LLMPartTrasnformStream());\n\n let finalResult = result;\n\n if (externalTransformers.length > 0) {\n finalResult = externalTransformers.reduce(\n (stream, transformer) => stream.pipeThrough(transformer),\n result // 初始累积值(原始流)\n );\n }\n\n return {\n stream: finalResult as ReadableStream<LanguageModelV2StreamPart>,\n };\n }\n}\n","import {\n LanguageModelV2FilePart,\n LanguageModelV2Message,\n LanguageModelV2Prompt,\n LanguageModelV2TextPart,\n} from '@ai-sdk/provider';\nimport { RoleType } from '@coze/api';\nimport { Attachment } from '@baishuyun/types/src/chat';\nimport { excel2json } from './excel2json';\n\nconst decoder = new TextDecoder('utf-8');\n\nconst data2csvText = (data: Uint8Array) => {\n return decoder.decode(data);\n};\n\ntype userMsg = {\n role: 'user';\n content: Array<LanguageModelV2TextPart | LanguageModelV2FilePart>;\n};\n\nconst getPartType = (part: LanguageModelV2TextPart | LanguageModelV2FilePart) => {\n if (part.type === 'text') {\n return 'text';\n }\n\n const isImg = part.mediaType?.startsWith('image/');\n if (isImg) {\n return 'image';\n }\n\n const isAudio = part.mediaType?.startsWith('audio/');\n if (isAudio) {\n return 'audio';\n }\n\n return 'file';\n};\n\nconst parseMessageContent = (message: LanguageModelV2Message, isTextOnly?: boolean) => {\n if (isTextOnly) {\n return (message.content as Array<LanguageModelV2TextPart>)\n .map((part: LanguageModelV2TextPart) => part.text)\n .join('\\n');\n }\n\n const result = (message.content as Array<LanguageModelV2TextPart | LanguageModelV2FilePart>).map(\n (part) => {\n const meta = part.providerOptions?.uploadMetadata as Attachment;\n const url = meta?.url;\n\n return {\n type: getPartType(part),\n text: part.type === 'text' ? (part as LanguageModelV2TextPart).text : '',\n file_url: part.type === 'text' ? undefined : url,\n };\n }\n );\n\n return JSON.stringify(result);\n};\n\nconst isTextOnlyMsg = (message: userMsg) => message.content.every((part) => part.type === 'text');\n\nexport const convertPromptToMessages = (messages: LanguageModelV2Prompt) => {\n return messages.map((message) => {\n const isTextOnly = isTextOnlyMsg(message as userMsg);\n switch (message.role) {\n case 'user':\n return {\n role: RoleType.User,\n content: parseMessageContent(message, isTextOnly),\n content_type: isTextOnly ? 'text' : 'object_string',\n };\n break;\n\n case 'assistant':\n return {\n role: RoleType.Assistant,\n content: (message.content as Array<LanguageModelV2TextPart>)\n .map((part: LanguageModelV2TextPart) => (part.type === 'text' ? part.text : ''))\n .join(''),\n content_type: 'text',\n };\n break;\n }\n });\n};\n","import {\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2Usage,\n} from '@ai-sdk/provider';\nimport { ServerSentEventTransformStream } from 'parse-sse';\nimport { TextDecoderStream } from 'stream/web';\n\nexport interface AccumulatedSSEResponse {\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n}\n\n/**\n * 从字节流中解码 SSE 事件并累积完整响应内容\n */\nexport async function accumulateSSEResponse(\n body: ReadableStream<Uint8Array>\n): Promise<AccumulatedSSEResponse> {\n const sseStream = body\n .pipeThrough(\n new TextDecoderStream() as ReadableWritablePair<\n string | undefined,\n Uint8Array<ArrayBufferLike>\n >\n )\n .pipeThrough(new ServerSentEventTransformStream());\n\n let textContent = '';\n let reasoningContent = '';\n let finishReason: LanguageModelV2FinishReason = 'stop';\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n const reader = sseStream.getReader();\n try {\n while (true) {\n const { done, value: evt } = await reader.read();\n if (done) break;\n if (!evt) continue;\n\n let evtData;\n try {\n evtData = JSON.parse(evt.data);\n } catch {\n continue;\n }\n\n const event = evt.type;\n\n if (event === 'conversation.message.delta') {\n if (evtData.reasoning_content) {\n reasoningContent += evtData.reasoning_content;\n } else if (evtData.content) {\n textContent += evtData.content;\n }\n } else if (event === 'conversation.chat.completed' || event === 'done') {\n finishReason = 'stop';\n if (evtData.usage) {\n usage = {\n inputTokens: evtData.usage.input_count || 0,\n outputTokens: evtData.usage.output_count || 0,\n totalTokens: evtData.usage.total_count || 0,\n };\n }\n } else if (event === 'error') {\n finishReason = 'error';\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n const content: LanguageModelV2Content[] = [];\n if (reasoningContent) {\n content.push({ type: 'reasoning', text: reasoningContent });\n }\n if (textContent) {\n content.push({ type: 'text', text: textContent });\n }\n\n return { content, finishReason, usage };\n}\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\n\n/**\n * 创建一个包含错误信息的流\n * @param error 错误信息\n * @returns ReadableStream<LanguageModelV2StreamPart>\n */\nexport const createErrorStream = (error: string): ReadableStream<LanguageModelV2StreamPart> => {\n return new ReadableStream<LanguageModelV2StreamPart>({\n start(controller) {\n const id = generateId();\n controller.enqueue({\n id,\n type: 'text-start',\n });\n controller.enqueue({\n id,\n type: 'text-delta',\n providerMetadata: {\n raw: { data: { type: 'agent-error', error } },\n },\n delta: error,\n });\n controller.enqueue({\n type: 'text-end',\n id,\n });\n controller.close();\n },\n });\n};\n","/**\n * 事件数据取样,某些流 chunk 处理,需要用到前后的 chunk 信息,因此设计一个类缓存相邻 chunk,用于处理依据\n */\nexport class EvtSample {\n private _evtSampleMap: Map<string, any> = new Map();\n private _key1: string = \"1\";\n private _key2: string = \"2\";\n private _maxSample = 2;\n\n public addEventSample(evt: any) {\n if (this._evtSampleMap.size >= this._maxSample) {\n const evt2 = this._evtSampleMap.get(this._key2);\n this._evtSampleMap.set(this._key1, evt2);\n this._evtSampleMap.set(this._key2, evt);\n return;\n }\n\n this._evtSampleMap.set((this._evtSampleMap.size + 1).toString(), evt);\n }\n\n public getFirstSample() {\n return this._evtSampleMap.get(this._key1);\n }\n\n public getSecondSample() {\n return this._evtSampleMap.get(this._key2);\n }\n}\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { StreamChatData } from '@coze/api';\nimport { EvtSample } from '../evt-sample';\n\n/**\n * 补充特殊的 llm chunk, reasoning-end, text-start\n */\nexport class LLMChunkInjectorTransformStream extends TransformStream<\n StreamChatData,\n | StreamChatData\n | (LanguageModelV2StreamPart & {\n disableTransform: boolean;\n })\n> {\n private eventSampleMap = new EvtSample();\n\n constructor() {\n super({\n transform: (\n part: StreamChatData,\n controller: TransformStreamDefaultController<\n StreamChatData | (LanguageModelV2StreamPart & { disableTransform: boolean })\n >\n ) => {\n // 添加事件样本(原逻辑中的addEventSample)\n this.eventSampleMap.addEventSample(part);\n\n // 处理sample1/sample2特殊判断逻辑\n const sample1 = this.eventSampleMap.getFirstSample();\n const sample2 = this.eventSampleMap.getSecondSample();\n\n // handle reasoning end\n if (\n sample1 &&\n sample2 &&\n sample1.data.reasoning_content &&\n !sample2.data.reasoning_content\n ) {\n controller.enqueue({\n disableTransform: true,\n type: 'reasoning-end',\n id: sample1.data.conversation_id,\n });\n }\n\n // handle text-start\n if (sample1 && sample2 && !sample1.data.content && sample2.data.content) {\n controller.enqueue({\n disableTransform: true,\n type: 'text-start',\n id: sample2.data.conversation_id,\n });\n }\n\n // 传递part到下一个转换流\n controller.enqueue(part);\n },\n });\n }\n}\n","import { ChatEventType, StreamChatData } from '@coze/api';\nimport { ServerSentEvent } from 'parse-sse';\n\nexport default class MCPChunkFilterTransformStream extends TransformStream {\n isVisibleMsgPart(evtData: any, part: any, omitTextEndChunk?: boolean) {\n if (evtData.type === 'knowledge' && evtData.role === 'assistant') {\n return false;\n }\n\n // Omit text-end chunk if the flag is set\n if (\n omitTextEndChunk &&\n part.event === ChatEventType.CONVERSATION_MESSAGE_COMPLETED &&\n part.data.type !== 'follow_up'\n ) {\n return false;\n }\n\n if (part.event === 'conversation.message.completed' && evtData.type == 'verbose') {\n return false;\n }\n\n return true;\n }\n\n constructor(omitTextEndChunk: boolean = false) {\n super({\n transform: (\n evt: ServerSentEvent,\n controller: TransformStreamDefaultController<StreamChatData>\n ) => {\n if (!evt) return;\n\n // 解析evt为part对象(原逻辑中的part构建)\n const part = {\n event: evt.type,\n data: JSON.parse(evt.data) || {},\n } as StreamChatData;\n\n // 过滤逻辑:仅传递满足条件的part\n if (this.isVisibleMsgPart(part.data, part, omitTextEndChunk)) {\n controller.enqueue(part);\n }\n },\n });\n }\n}\n","import { LanguageModelV2StreamPart, SharedV2ProviderMetadata } from '@ai-sdk/provider';\nimport { ChatEventType } from '@coze/api';\n\nexport const mcp2llmChunk = (part: any): LanguageModelV2StreamPart | null => {\n const fullData = JSON.stringify(part);\n\n switch (part.event) {\n case ChatEventType.CONVERSATION_CHAT_CREATED:\n return {\n type: 'raw',\n rawValue: part.data,\n };\n break;\n\n case ChatEventType.CONVERSATION_CHAT_IN_PROGRESS:\n return {\n // type: \"text-delta\",\n // id: part.data.conversation_id,\n // delta: part.data.content || \"\",\n // providerMetadata: {\n // raw: { data: fullData },\n // },\n type: 'raw',\n rawValue: part.data,\n };\n break;\n\n case ChatEventType.CONVERSATION_MESSAGE_DELTA:\n const isReasoning = Boolean(part.data.reasoning_content);\n return {\n type: isReasoning ? 'reasoning-delta' : 'text-delta',\n delta: isReasoning ? part.data.reasoning_content : part.data.content,\n id: part.data.conversation_id,\n providerMetadata: {},\n };\n break;\n\n case ChatEventType.CONVERSATION_MESSAGE_COMPLETED:\n if (part.data && part.data.type === 'follow_up') {\n return {\n type: 'raw',\n rawValue: part.data,\n };\n }\n\n if (part.status === 'completed') {\n return {\n type: 'text-end',\n id: part.data.conversation_id,\n // delta: part.data.content || part.data.reasoning_content || \"\",\n providerMetadata: {},\n };\n }\n\n return {\n type: 'raw',\n rawValue: part.data,\n };\n\n break;\n\n case ChatEventType.CONVERSATION_CHAT_COMPLETED:\n // Yield finish event with usage information\n return {\n type: 'finish',\n finishReason: 'stop',\n usage: {\n inputTokens: part.data.usage?.input_count || 0,\n outputTokens: part.data.usage?.output_count || 0,\n totalTokens: part.data.usage?.total_count || 0,\n },\n };\n break;\n\n case ChatEventType.DONE:\n // Stream completed successfully\n return {\n type: 'finish',\n finishReason: 'stop',\n usage: {\n inputTokens: part.data.usage?.input_count || 0,\n outputTokens: part.data.usage?.output_count || 0,\n totalTokens: part.data.usage?.total_count || 0,\n },\n };\n break;\n\n case ChatEventType.ERROR:\n // Handle errors\n console.error('[ERROR]', part.data);\n return {\n type: 'error',\n error: part.data,\n };\n\n default:\n // Handle unknown event types\n console.warn('Unknown event type:', part.event);\n return {\n type: 'error',\n error: 'Unknown event type' + part.event,\n };\n }\n\n return {\n type: 'error',\n error: 'unknown',\n };\n};\n","import { ChatEventType, StreamChatData } from '@coze/api';\nimport { mcp2llmChunk } from '../utils/mcp-to-llm-chunk';\nimport { LanguageModelV2StreamPart } from '@ai-sdk/provider';\n\nexport default class LLMPartTrasnformStream extends TransformStream {\n constructor() {\n super({\n transform: (\n part: StreamChatData | (LanguageModelV2StreamPart & { disableTransform: boolean }),\n controller: TransformStreamDefaultController<LanguageModelV2StreamPart | undefined>\n ) => {\n // Bypass transform if disableTransform flag is set\n const { disableTransform } = part as any;\n if (disableTransform) {\n controller.enqueue(part as any);\n return;\n }\n\n try {\n const chunk = mcp2llmChunk(part as any);\n if (chunk) {\n controller.enqueue(chunk as any);\n }\n } catch (error) {\n console.error('transform coze evt error');\n }\n },\n });\n }\n}\n","import { CreateChatRes } from '@coze/api';\nimport { CozeChatConfig, IGenerateResult } from '../types';\nimport { getCozeChatMsgDetail } from './get-coze-chat-msg-detail';\n\nexport const BuildWarningGenerateResult = (message: string): IGenerateResult => {\n return {\n content: [],\n finishReason: 'error',\n request: {\n body: null,\n },\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n response: {\n body: null,\n },\n warnings: [\n {\n type: 'other',\n message,\n },\n ],\n };\n};\n\nexport const BuildGenerateResultByChatRes = async (\n response: Response,\n chatConfig: CozeChatConfig,\n reqBody?: unknown\n): Promise<IGenerateResult> => {\n if (!response.ok) {\n return Promise.reject(\n BuildWarningGenerateResult(`Coze API error: ${response.status} ${response.statusText}`)\n );\n }\n\n const res = (await response.json()) as CreateChatRes;\n if (res.code !== 0) {\n return Promise.reject(BuildWarningGenerateResult(`Coze API error: ${res.code} ${res.msg}`));\n }\n\n const msgRes = await getCozeChatMsgDetail(res.data.conversation_id, res.data.id, chatConfig);\n if (!msgRes.ok) {\n return Promise.reject(\n BuildWarningGenerateResult(\n `Failed to get message detail: ${msgRes.status} ${msgRes.statusText}`\n )\n );\n }\n const msgDetail = await msgRes.json();\n\n return {\n content: msgDetail.data.message.content,\n finishReason: msgDetail.data.message.status === 'finished' ? 'stop' : 'error',\n request: {\n body: reqBody,\n },\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n response: {\n body: msgDetail,\n },\n warnings: [],\n };\n};\n","import { LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { JSONParser } from '@streamparser/json';\nimport { createTextInfoEnqueuer, TextInfoEnqueuer } from '../utils/enqueue-text-info';\nimport { rebuildFieldsJsonStructure } from '@baishuyun/ai-feat-utils';\n\nexport const createFieldsJsonTransformStream = (enableJsonParser: boolean) => {\n let parser: JSONParser;\n let enqueueTextDelta: TextInfoEnqueuer;\n let id: string;\n let isFirstChunk = true;\n // 当 LLM 返回的不是 JSON 而是普通文本时,切换到直通模式\n let passthroughMode = false;\n\n const chunkGuard = (chunk: LanguageModelV2StreamPart): boolean => {\n if (!enableJsonParser || passthroughMode) {\n return false;\n }\n\n if (chunk.type !== 'text-delta' || !('delta' in chunk)) {\n return false;\n }\n\n return true;\n };\n\n const transformer = {\n flush: (controller: TransformStreamDefaultController<any>) => {\n try {\n // parser?.end();\n controller.terminate(); // 信号通知下游可读流已关闭\n } catch (e) {\n controller.error('stop error' + e);\n }\n },\n transform: (\n chunk: LanguageModelV2StreamPart,\n controller: TransformStreamDefaultController<LanguageModelV2StreamPart>\n ) => {\n if (!parser && !passthroughMode) {\n return;\n }\n\n try {\n if (chunkGuard(chunk)) {\n if ('id' in chunk && 'delta' in chunk) {\n id = chunk.id;\n let delta = chunk.delta;\n if (isFirstChunk) {\n delta = delta.replace(/^\\uFEFF/, '');\n isFirstChunk = false;\n }\n parser.write(delta);\n } else {\n console.warn('Unexpected chunk format for JSON parsing:', chunk);\n controller.enqueue(chunk);\n }\n } else {\n controller.enqueue(chunk);\n }\n } catch (e) {\n console.log('write or enqueue error', e);\n controller.error(e);\n }\n },\n start: (controller: TransformStreamDefaultController<any>) => {\n parser = new JSONParser({\n paths: ['$.*'],\n });\n\n enqueueTextDelta = enableJsonParser\n ? createTextInfoEnqueuer(controller)\n : (content: string) => {};\n\n parser.onValue = (parsedInfo: any) => {\n const value = parsedInfo.value;\n\n if (value.widget) {\n value.widget.widgetName = `_widget_${Date.now()}`;\n }\n\n enqueueTextDelta(\n JSON.stringify(value),\n JSON.stringify({\n type: 'mcp-fields-json',\n field: rebuildFieldsJsonStructure(value),\n }),\n id\n );\n };\n\n parser.onError = (err: any) => {\n console.error('JsonWidgetStream: JSON Parsing Error:', err);\n\n // LLM 返回的不是 JSON,切换到直通模式,后续 text-delta 直接透传\n passthroughMode = true;\n };\n\n parser.onEnd = () => {\n enqueueTextDelta(\n ' ',\n JSON.stringify({\n appendConfirm: 'save-fields',\n })\n );\n };\n },\n };\n\n return new TransformStream<LanguageModelV2StreamPart, any>(transformer);\n};\n","import { JSONValue, LanguageModelV2StreamPart } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\n\nexport type TextInfoEnqueuer = (textInfo: string, metaPayload?: JSONValue, id?: string) => void;\n\nexport const createTextInfoEnqueuer =\n (controller: TransformStreamDefaultController<LanguageModelV2StreamPart>) =>\n (\n textInfo: string,\n metaPayload?: JSONValue,\n id: string = generateId(),\n deltaOnly: boolean = false\n ) => {\n const i = id ?? generateId();\n\n const startPart: LanguageModelV2StreamPart = {\n type: 'text-start',\n id: i,\n };\n\n const deltaPart: LanguageModelV2StreamPart = {\n type: 'text-delta',\n id: i,\n delta: textInfo,\n providerMetadata: metaPayload\n ? {\n raw: { data: metaPayload },\n }\n : undefined,\n };\n\n const endPart: LanguageModelV2StreamPart = {\n type: 'text-end',\n id: i,\n };\n\n if (deltaOnly) {\n controller.enqueue(deltaPart);\n return;\n }\n\n controller.enqueue(startPart);\n controller.enqueue(deltaPart);\n controller.enqueue(endPart);\n };\n","import {\n createTextInfoEnqueuer,\n TextInfoEnqueuer,\n} from \"../utils/enqueue-text-info\";\n\nexport default class SuggestionTransformStream extends TransformStream<\n any,\n any\n> {\n constructor(enable: boolean) {\n let enqueuer: TextInfoEnqueuer;\n super({\n start(controller) {\n enqueuer = createTextInfoEnqueuer(controller);\n },\n transform(chunk, controller) {\n if (\n enable &&\n chunk.type === \"raw\" &&\n chunk.rawValue.type === \"follow_up\" &&\n enqueuer\n ) {\n enqueuer(\n chunk.rawValue.content,\n JSON.stringify({\n type: \"suggestion\",\n }),\n );\n } else {\n controller.enqueue(chunk);\n }\n },\n });\n }\n}\n"],"mappings":"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","names":["ServerSentEventTransformStream","TextDecoderStream","ChatEventType","TextDecoderStream","ServerSentEventTransformStream","generateId"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@baishuyun/coze-provider",
3
- "version": "2.0.15",
3
+ "version": "2.0.17",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
@@ -23,7 +23,7 @@
23
23
  "parse-sse": "^0.1.0",
24
24
  "stream-json": "^1.9.1",
25
25
  "xlsx": "^0.18.5",
26
- "@baishuyun/ai-feat-utils": "2.0.15"
26
+ "@baishuyun/ai-feat-utils": "2.0.17"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@changesets/cli": "^2.29.8",
@@ -34,7 +34,7 @@
34
34
  "vite": "^5.1.4",
35
35
  "vite-plugin-dts": "^4.5.4",
36
36
  "@baishuyun/typescript-config": "2.0.9",
37
- "@baishuyun/types": "3.0.15"
37
+ "@baishuyun/types": "3.0.17"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "zod": "^3.25.76 || ^4.1.8"
@@ -24,6 +24,7 @@ import {
24
24
  BuildGenerateResultByChatRes,
25
25
  BuildWarningGenerateResult,
26
26
  } from './utils/build-generate-result-by-chat-res';
27
+ import { safeParseJson } from '@baishuyun/ai-feat-utils';
27
28
 
28
29
  export class CozeLanguageModel implements LanguageModelV2 {
29
30
  specificationVersion: 'v2' = 'v2';
@@ -133,6 +134,7 @@ export class CozeLanguageModel implements LanguageModelV2 {
133
134
  const user_id = options.headers ? options.headers['x-user-id'] : '';
134
135
  const user_var = options.headers ? options.headers['x-user-var'] : '';
135
136
  // const user_token = options.headers ? options.headers['x-user-token'] : '';
137
+ const user_param = (options.headers ? options.headers['x-user-param'] : '') ?? '';
136
138
 
137
139
  let customVar;
138
140
  if (user_var) {
@@ -143,13 +145,17 @@ export class CozeLanguageModel implements LanguageModelV2 {
143
145
  }
144
146
  }
145
147
 
146
- console.log('msssage send to coze', JSON.stringify(messages, null, 2));
148
+ const params = user_param ? safeParseJson(user_param) : {};
149
+
150
+ console.log('params 2 workflow', params);
151
+
147
152
  const body = {
148
153
  bot_id: this.config.botId,
149
154
  auto_save_history: false,
150
155
  user_id: user_id || '7543191937730215936',
151
156
  stream: true,
152
157
  additional_messages: messages,
158
+ parameters: params,
153
159
  };
154
160
 
155
161
  if (customVar) {
@@ -160,6 +166,9 @@ export class CozeLanguageModel implements LanguageModelV2 {
160
166
 
161
167
  const abortSignal = options.abortSignal;
162
168
 
169
+ // console.log('url', url);
170
+ // console.log('body', JSON.stringify(body, null, 2));
171
+
163
172
  const response = await fetch(url, {
164
173
  method: 'POST',
165
174
  headers: headers,
@@ -90,7 +90,7 @@ export const mcp2llmChunk = (part: any): LanguageModelV2StreamPart | null => {
90
90
  console.error('[ERROR]', part.data);
91
91
  return {
92
92
  type: 'error',
93
- error: new Error(`Coze streaming error: ${JSON.stringify(part.data)}`),
93
+ error: part.data,
94
94
  };
95
95
 
96
96
  default: