@baishuyun/coze-provider 0.0.17 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,22 +1,23 @@
1
-
2
- > @baishuyun/coze-provider@0.0.16 build /Users/bbbottle/Code/bs-chat-sdk/packages/coze-provider
3
- > tsup --tsconfig tsconfig.json --clean
4
-
5
- CLI Building entry: src/index.ts
6
- CLI Using tsconfig: tsconfig.json
7
- CLI tsup v8.5.1
8
- CLI Using tsup config: /Users/bbbottle/Code/bs-chat-sdk/packages/coze-provider/tsup.config.ts
9
- CLI Target: es2022
10
- CLI Cleaning output folder
11
- CJS Build start
12
- ESM Build start
13
- ESM dist/index.mjs 48.57 KB
14
- ESM dist/index.mjs.map 93.10 KB
15
- ESM ⚡️ Build success in 44ms
16
- CJS dist/index.js 50.66 KB
17
- CJS dist/index.js.map 93.51 KB
18
- CJS ⚡️ Build success in 45ms
19
- DTS Build start
20
- DTS ⚡️ Build success in 1169ms
21
- DTS dist/index.d.ts 1.57 KB
22
- DTS dist/index.d.mts 1.57 KB
1
+
2
+ 
3
+ > @baishuyun/coze-provider@0.0.17 build /Users/bbbottle/Code/bs-chat-sdk/packages/coze-provider
4
+ > tsup --tsconfig tsconfig.json --clean
5
+
6
+ CLI Building entry: src/index.ts
7
+ CLI Using tsconfig: tsconfig.json
8
+ CLI tsup v8.5.1
9
+ CLI Using tsup config: /Users/bbbottle/Code/bs-chat-sdk/packages/coze-provider/tsup.config.ts
10
+ CLI Target: es2022
11
+ CLI Cleaning output folder
12
+ CJS Build start
13
+ ESM Build start
14
+ CJS dist/index.js 50.91 KB
15
+ CJS dist/index.js.map 94.87 KB
16
+ CJS ⚡️ Build success in 30ms
17
+ ESM dist/index.mjs 48.87 KB
18
+ ESM dist/index.mjs.map 94.55 KB
19
+ ESM ⚡️ Build success in 31ms
20
+ DTS Build start
21
+ DTS ⚡️ Build success in 860ms
22
+ DTS dist/index.d.ts 1.57 KB
23
+ DTS dist/index.d.mts 1.57 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @baishuyun/coze-provider
2
2
 
3
+ ## 0.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - widget agent
8
+ - 4acb2cc: widget agent
9
+ - 35058a9: widget agent
10
+
11
+ ### Patch Changes
12
+
13
+ - e5dd21a: widget agent
14
+ - a934bc0: add widget agent
15
+
3
16
  ## 0.0.17
4
17
 
5
18
  ### Patch Changes
package/dist/index.js CHANGED
@@ -45,8 +45,8 @@ var import_provider_utils2 = require("@ai-sdk/provider-utils");
45
45
  var VERSION = "0.0.1";
46
46
 
47
47
  // src/coze-language-model.ts
48
- var import_parse_sse = require("parse-sse");
49
- var import_web = require("stream/web");
48
+ var import_parse_sse2 = require("parse-sse");
49
+ var import_web2 = require("stream/web");
50
50
 
51
51
  // src/utils/prompt-to-model-msg.ts
52
52
  var import_api = require("@coze/api");
@@ -140,6 +140,62 @@ var convertPromptToMessages = (messages) => {
140
140
  });
141
141
  };
142
142
 
143
+ // src/utils/accumulate-sse-response.ts
144
+ var import_parse_sse = require("parse-sse");
145
+ var import_web = require("stream/web");
146
+ async function accumulateSSEResponse(body) {
147
+ const sseStream = body.pipeThrough(
148
+ new import_web.TextDecoderStream()
149
+ ).pipeThrough(new import_parse_sse.ServerSentEventTransformStream());
150
+ let textContent = "";
151
+ let reasoningContent = "";
152
+ let finishReason = "stop";
153
+ let usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
154
+ const reader = sseStream.getReader();
155
+ try {
156
+ while (true) {
157
+ const { done, value: evt } = await reader.read();
158
+ if (done) break;
159
+ if (!evt) continue;
160
+ let evtData;
161
+ try {
162
+ evtData = JSON.parse(evt.data);
163
+ } catch {
164
+ continue;
165
+ }
166
+ const event = evt.type;
167
+ if (event === "conversation.message.delta") {
168
+ if (evtData.reasoning_content) {
169
+ reasoningContent += evtData.reasoning_content;
170
+ } else if (evtData.content) {
171
+ textContent += evtData.content;
172
+ }
173
+ } else if (event === "conversation.chat.completed" || event === "done") {
174
+ finishReason = "stop";
175
+ if (evtData.usage) {
176
+ usage = {
177
+ inputTokens: evtData.usage.input_count || 0,
178
+ outputTokens: evtData.usage.output_count || 0,
179
+ totalTokens: evtData.usage.total_count || 0
180
+ };
181
+ }
182
+ } else if (event === "error") {
183
+ finishReason = "error";
184
+ }
185
+ }
186
+ } finally {
187
+ reader.releaseLock();
188
+ }
189
+ const content = [];
190
+ if (reasoningContent) {
191
+ content.push({ type: "reasoning", text: reasoningContent });
192
+ }
193
+ if (textContent) {
194
+ content.push({ type: "text", text: textContent });
195
+ }
196
+ return { content, finishReason, usage };
197
+ }
198
+
143
199
  // src/utils/create-error-stream.ts
144
200
  var import_provider_utils = require("@ai-sdk/provider-utils");
145
201
  var createErrorStream = (error) => {
@@ -366,57 +422,6 @@ var LLMPartTrasnformStream = class extends TransformStream {
366
422
  }
367
423
  };
368
424
 
369
- // src/utils/create-coze-non-streaming-chat.ts
370
- var createCozeNonStreamingChat = async (botId, options, chatConfig) => {
371
- const messages = convertPromptToMessages(options.prompt);
372
- const url = chatConfig.url({
373
- path: "/chat"
374
- });
375
- const user_id = (options.headers ? options.headers["x-user-id"] : "") || Date.now().toString();
376
- const user_var = options.headers ? options.headers["x-user-var"] : "";
377
- let customVar;
378
- if (user_var) {
379
- try {
380
- customVar = JSON.parse(user_var);
381
- } catch (e) {
382
- console.warn("x-user-var parse error", e);
383
- }
384
- }
385
- const body = {
386
- bot_id: botId,
387
- auto_save_history: true,
388
- user_id: user_id || "7543191937730215936",
389
- additional_messages: messages,
390
- stream: false
391
- };
392
- if (customVar) {
393
- body.custom_var = customVar;
394
- }
395
- const headers = chatConfig.headers();
396
- const abortSignal = options.abortSignal;
397
- const response = await fetch(url, {
398
- method: "POST",
399
- headers,
400
- credentials: "include",
401
- body: JSON.stringify(body),
402
- signal: abortSignal
403
- });
404
- return response;
405
- };
406
-
407
- // src/utils/get-coze-chat-msg-detail.ts
408
- var getCozeChatMsgDetail = async (conversationId, chatId, chatConfig) => {
409
- const url = chatConfig.url({
410
- path: `/chat/message/list?conversation_id=${conversationId}&chat_id=${chatId}`
411
- });
412
- const response = await fetch(url, {
413
- method: "POST",
414
- headers: chatConfig.headers(),
415
- credentials: "include"
416
- });
417
- return response;
418
- };
419
-
420
425
  // src/utils/build-generate-result-by-chat-res.ts
421
426
  var BuildWarningGenerateResult = (message) => {
422
427
  return {
@@ -441,42 +446,6 @@ var BuildWarningGenerateResult = (message) => {
441
446
  ]
442
447
  };
443
448
  };
444
- var BuildGenerateResultByChatRes = async (response, chatConfig, reqBody) => {
445
- if (!response.ok) {
446
- return Promise.reject(
447
- BuildWarningGenerateResult(`Coze API error: ${response.status} ${response.statusText}`)
448
- );
449
- }
450
- const res = await response.json();
451
- if (res.code !== 0) {
452
- return Promise.reject(BuildWarningGenerateResult(`Coze API error: ${res.code} ${res.msg}`));
453
- }
454
- const msgRes = await getCozeChatMsgDetail(res.data.conversation_id, res.data.id, chatConfig);
455
- if (!msgRes.ok) {
456
- return Promise.reject(
457
- BuildWarningGenerateResult(
458
- `Failed to get message detail: ${msgRes.status} ${msgRes.statusText}`
459
- )
460
- );
461
- }
462
- const msgDetail = await msgRes.json();
463
- return {
464
- content: msgDetail.data.message.content,
465
- finishReason: msgDetail.data.message.status === "finished" ? "stop" : "error",
466
- request: {
467
- body: reqBody
468
- },
469
- usage: {
470
- inputTokens: 0,
471
- outputTokens: 0,
472
- totalTokens: 0
473
- },
474
- response: {
475
- body: msgDetail
476
- },
477
- warnings: []
478
- };
479
- };
480
449
 
481
450
  // src/coze-language-model.ts
482
451
  var CozeLanguageModel = class {
@@ -491,23 +460,59 @@ var CozeLanguageModel = class {
491
460
  this.supportedUrls = config.supportedUrls?.() || {};
492
461
  this.config = config;
493
462
  }
494
- // @not-support
495
- // coze 目前不支持非流式接口,为了兼容接口规范,仍然实现了 doGenerate 方法
496
463
  async doGenerate(options) {
497
- return BuildWarningGenerateResult(
498
- "Coze provider does not support non-streaming calls, please use streaming interface"
499
- );
500
- const botIdFromProvider = options.providerOptions?.bot?.botId;
501
- if (!botIdFromProvider) {
502
- return BuildWarningGenerateResult("bot id missing in provider options");
464
+ const messages = convertPromptToMessages(options.prompt);
465
+ const warnings = [];
466
+ const url = this.config.url({ path: "/chat" });
467
+ const user_id = options.headers ? options.headers["x-user-id"] : "";
468
+ const user_var = options.headers ? options.headers["x-user-var"] : "";
469
+ let customVar;
470
+ if (user_var) {
471
+ try {
472
+ customVar = JSON.parse(user_var);
473
+ } catch (e) {
474
+ console.warn("x-user-var parse error", e);
475
+ }
503
476
  }
504
- const response = await createCozeNonStreamingChat(
505
- botIdFromProvider,
506
- options,
507
- this.config
508
- );
509
- const result = await BuildGenerateResultByChatRes(response, this.config);
510
- return result;
477
+ const body = {
478
+ bot_id: this.config.botId,
479
+ auto_save_history: false,
480
+ user_id: user_id || "7543191937730215936",
481
+ stream: true,
482
+ additional_messages: messages
483
+ };
484
+ if (customVar) {
485
+ body.custom_variables = customVar;
486
+ }
487
+ const headers = this.config.headers();
488
+ const abortSignal = options.abortSignal;
489
+ const response = await fetch(url, {
490
+ method: "POST",
491
+ headers,
492
+ credentials: "include",
493
+ body: JSON.stringify(body),
494
+ signal: abortSignal
495
+ });
496
+ if (!response.ok || !response.body) {
497
+ const rawError = await response.text();
498
+ let errorDetail;
499
+ try {
500
+ errorDetail = JSON.parse(rawError);
501
+ } catch {
502
+ errorDetail = rawError;
503
+ }
504
+ const errorMessage = typeof errorDetail === "object" && errorDetail?.msg ? errorDetail.msg : `Coze API error: ${response.status} ${response.statusText}`;
505
+ return BuildWarningGenerateResult(errorMessage);
506
+ }
507
+ const { content, finishReason, usage } = await accumulateSSEResponse(response.body);
508
+ return {
509
+ content,
510
+ finishReason,
511
+ usage,
512
+ request: { body },
513
+ response: { body: null },
514
+ warnings
515
+ };
511
516
  }
512
517
  isVisibleMsgPart(evtData) {
513
518
  if (evtData.type === "knowledge" && evtData.role === "assistant") {
@@ -521,7 +526,7 @@ var CozeLanguageModel = class {
521
526
  const url = this.config.url({
522
527
  path: "/chat"
523
528
  });
524
- const user_id = (options.headers ? options.headers["x-user-id"] : "") || Date.now().toString();
529
+ const user_id = options.headers ? options.headers["x-user-id"] : "";
525
530
  const user_var = options.headers ? options.headers["x-user-var"] : "";
526
531
  let customVar;
527
532
  if (user_var) {
@@ -534,13 +539,12 @@ var CozeLanguageModel = class {
534
539
  const body = {
535
540
  bot_id: this.config.botId,
536
541
  auto_save_history: false,
537
- user_id: "7543191937730215936",
538
- // user_id,
542
+ user_id: user_id || "7543191937730215936",
539
543
  stream: true,
540
544
  additional_messages: messages
541
545
  };
542
546
  if (customVar) {
543
- body.custom_var = customVar;
547
+ body.custom_variables = customVar;
544
548
  }
545
549
  const headers = this.config.headers();
546
550
  const abortSignal = options.abortSignal;
@@ -572,8 +576,8 @@ var CozeLanguageModel = class {
572
576
  const isBuildStage = stage === "build";
573
577
  const isFillStage = stage === "fill";
574
578
  const result = response.body.pipeThrough(
575
- new import_web.TextDecoderStream()
576
- ).pipeThrough(new import_parse_sse.ServerSentEventTransformStream()).pipeThrough(new MCPChunkFilterTransformStream(isBuildStage || isFillStage)).pipeThrough(new LLMChunkInjectorTransformStream()).pipeThrough(new LLMPartTrasnformStream());
579
+ new import_web2.TextDecoderStream()
580
+ ).pipeThrough(new import_parse_sse2.ServerSentEventTransformStream()).pipeThrough(new MCPChunkFilterTransformStream(isBuildStage || isFillStage)).pipeThrough(new LLMChunkInjectorTransformStream()).pipeThrough(new LLMPartTrasnformStream());
577
581
  let finalResult = result;
578
582
  if (externalTransformers.length > 0) {
579
583
  finalResult = externalTransformers.reduce(
@@ -1838,10 +1842,12 @@ var rebuildFieldsJsonStructure = (truncatedJson, subItemsOnly = false) => {
1838
1842
  // src/stream-trasnformer/fields-json-transform-stream.ts
1839
1843
  var createFieldsJsonTransformStream = (enableJsonParser) => {
1840
1844
  let parser;
1845
+ let enqueueTextDelta;
1841
1846
  let id;
1842
1847
  let isFirstChunk = true;
1848
+ let passthroughMode = false;
1843
1849
  const chunkGuard = (chunk) => {
1844
- if (!enableJsonParser) {
1850
+ if (!enableJsonParser || passthroughMode) {
1845
1851
  return false;
1846
1852
  }
1847
1853
  if (chunk.type !== "text-delta" || !("delta" in chunk)) {
@@ -1858,7 +1864,7 @@ var createFieldsJsonTransformStream = (enableJsonParser) => {
1858
1864
  }
1859
1865
  },
1860
1866
  transform: (chunk, controller) => {
1861
- if (!parser) {
1867
+ if (!parser && !passthroughMode) {
1862
1868
  return;
1863
1869
  }
1864
1870
  try {
@@ -1887,7 +1893,7 @@ var createFieldsJsonTransformStream = (enableJsonParser) => {
1887
1893
  parser = new import_json.JSONParser({
1888
1894
  paths: ["$.*"]
1889
1895
  });
1890
- const enqueueTextDelta = enableJsonParser ? createTextInfoEnqueuer(controller) : (content) => {
1896
+ enqueueTextDelta = enableJsonParser ? createTextInfoEnqueuer(controller) : (content) => {
1891
1897
  };
1892
1898
  parser.onValue = (parsedInfo) => {
1893
1899
  const value = parsedInfo.value;
@@ -1903,13 +1909,9 @@ var createFieldsJsonTransformStream = (enableJsonParser) => {
1903
1909
  id
1904
1910
  );
1905
1911
  };
1906
- let errorLogged = false;
1907
1912
  parser.onError = (err) => {
1908
- if (!errorLogged) {
1909
- console.log("is enabled", enableJsonParser);
1910
- console.error("JsonWidgetStream: JSON Parsing Error:", err);
1911
- errorLogged = true;
1912
- }
1913
+ console.error("JsonWidgetStream: JSON Parsing Error:", err);
1914
+ passthroughMode = true;
1913
1915
  };
1914
1916
  parser.onEnd = () => {
1915
1917
  enqueueTextDelta(