@baishuyun/coze-provider 0.0.17 → 0.1.1

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,24 @@
1
1
  # @baishuyun/coze-provider
2
2
 
3
+ ## 0.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - update field design style
8
+
9
+ ## 0.1.0
10
+
11
+ ### Minor Changes
12
+
13
+ - widget agent
14
+ - 4acb2cc: widget agent
15
+ - 35058a9: widget agent
16
+
17
+ ### Patch Changes
18
+
19
+ - e5dd21a: widget agent
20
+ - a934bc0: add widget agent
21
+
3
22
  ## 0.0.17
4
23
 
5
24
  ### 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");
@@ -54,30 +54,40 @@ var import_api = require("@coze/api");
54
54
  // src/utils/excel2json.ts
55
55
  var import_xlsx = __toESM(require("xlsx"));
56
56
  var excel2json = (file) => {
57
- const workbook = import_xlsx.default.read(file, {
58
- type: "array",
59
- // 'buffer'
60
- cellStyles: true,
61
- cellFormula: true,
62
- cellDates: true,
63
- cellNF: true,
64
- sheetStubs: true,
65
- bookVBA: true
66
- });
57
+ let workbook;
58
+ try {
59
+ workbook = import_xlsx.default.read(file, {
60
+ type: "array",
61
+ // 或 'buffer'
62
+ cellFormula: false
63
+ });
64
+ } catch (e) {
65
+ return JSON.stringify(null);
66
+ }
67
67
  const result = {
68
68
  sheets: []
69
69
  };
70
70
  workbook.SheetNames.forEach((sheetName) => {
71
71
  const worksheet = workbook.Sheets[sheetName];
72
+ if (!worksheet) {
73
+ return;
74
+ }
75
+ const maxRows = 1e3;
76
+ const ref = worksheet["!ref"] || "A1";
77
+ const range = import_xlsx.default.utils.decode_range(ref);
78
+ const limitedRange = {
79
+ ...range,
80
+ e: { ...range.e, r: Math.min(range.e.r, range.s.r + maxRows - 1) }
81
+ };
72
82
  const data = import_xlsx.default.utils.sheet_to_json(worksheet, {
73
83
  header: 1,
74
84
  // 使用数组格式
75
- defval: null,
76
- // 空单元格默认值
77
- raw: false,
85
+ raw: true,
78
86
  // 格式化值
79
- dateNF: "yyyy-mm-dd"
80
- // 日期格式
87
+ range: limitedRange,
88
+ // 使用限制后的范围
89
+ defval: null
90
+ // 空单元格默认值
81
91
  });
82
92
  result.sheets.push({
83
93
  name: sheetName,
@@ -140,6 +150,62 @@ var convertPromptToMessages = (messages) => {
140
150
  });
141
151
  };
142
152
 
153
+ // src/utils/accumulate-sse-response.ts
154
+ var import_parse_sse = require("parse-sse");
155
+ var import_web = require("stream/web");
156
+ async function accumulateSSEResponse(body) {
157
+ const sseStream = body.pipeThrough(
158
+ new import_web.TextDecoderStream()
159
+ ).pipeThrough(new import_parse_sse.ServerSentEventTransformStream());
160
+ let textContent = "";
161
+ let reasoningContent = "";
162
+ let finishReason = "stop";
163
+ let usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
164
+ const reader = sseStream.getReader();
165
+ try {
166
+ while (true) {
167
+ const { done, value: evt } = await reader.read();
168
+ if (done) break;
169
+ if (!evt) continue;
170
+ let evtData;
171
+ try {
172
+ evtData = JSON.parse(evt.data);
173
+ } catch {
174
+ continue;
175
+ }
176
+ const event = evt.type;
177
+ if (event === "conversation.message.delta") {
178
+ if (evtData.reasoning_content) {
179
+ reasoningContent += evtData.reasoning_content;
180
+ } else if (evtData.content) {
181
+ textContent += evtData.content;
182
+ }
183
+ } else if (event === "conversation.chat.completed" || event === "done") {
184
+ finishReason = "stop";
185
+ if (evtData.usage) {
186
+ usage = {
187
+ inputTokens: evtData.usage.input_count || 0,
188
+ outputTokens: evtData.usage.output_count || 0,
189
+ totalTokens: evtData.usage.total_count || 0
190
+ };
191
+ }
192
+ } else if (event === "error") {
193
+ finishReason = "error";
194
+ }
195
+ }
196
+ } finally {
197
+ reader.releaseLock();
198
+ }
199
+ const content = [];
200
+ if (reasoningContent) {
201
+ content.push({ type: "reasoning", text: reasoningContent });
202
+ }
203
+ if (textContent) {
204
+ content.push({ type: "text", text: textContent });
205
+ }
206
+ return { content, finishReason, usage };
207
+ }
208
+
143
209
  // src/utils/create-error-stream.ts
144
210
  var import_provider_utils = require("@ai-sdk/provider-utils");
145
211
  var createErrorStream = (error) => {
@@ -366,57 +432,6 @@ var LLMPartTrasnformStream = class extends TransformStream {
366
432
  }
367
433
  };
368
434
 
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
435
  // src/utils/build-generate-result-by-chat-res.ts
421
436
  var BuildWarningGenerateResult = (message) => {
422
437
  return {
@@ -441,42 +456,6 @@ var BuildWarningGenerateResult = (message) => {
441
456
  ]
442
457
  };
443
458
  };
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
459
 
481
460
  // src/coze-language-model.ts
482
461
  var CozeLanguageModel = class {
@@ -491,23 +470,59 @@ var CozeLanguageModel = class {
491
470
  this.supportedUrls = config.supportedUrls?.() || {};
492
471
  this.config = config;
493
472
  }
494
- // @not-support
495
- // coze 目前不支持非流式接口,为了兼容接口规范,仍然实现了 doGenerate 方法
496
473
  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");
474
+ const messages = convertPromptToMessages(options.prompt);
475
+ const warnings = [];
476
+ const url = this.config.url({ path: "/chat" });
477
+ const user_id = options.headers ? options.headers["x-user-id"] : "";
478
+ const user_var = options.headers ? options.headers["x-user-var"] : "";
479
+ let customVar;
480
+ if (user_var) {
481
+ try {
482
+ customVar = JSON.parse(user_var);
483
+ } catch (e) {
484
+ console.warn("x-user-var parse error", e);
485
+ }
503
486
  }
504
- const response = await createCozeNonStreamingChat(
505
- botIdFromProvider,
506
- options,
507
- this.config
508
- );
509
- const result = await BuildGenerateResultByChatRes(response, this.config);
510
- return result;
487
+ const body = {
488
+ bot_id: this.config.botId,
489
+ auto_save_history: false,
490
+ user_id: user_id || "7543191937730215936",
491
+ stream: true,
492
+ additional_messages: messages
493
+ };
494
+ if (customVar) {
495
+ body.custom_variables = customVar;
496
+ }
497
+ const headers = this.config.headers();
498
+ const abortSignal = options.abortSignal;
499
+ const response = await fetch(url, {
500
+ method: "POST",
501
+ headers,
502
+ credentials: "include",
503
+ body: JSON.stringify(body),
504
+ signal: abortSignal
505
+ });
506
+ if (!response.ok || !response.body) {
507
+ const rawError = await response.text();
508
+ let errorDetail;
509
+ try {
510
+ errorDetail = JSON.parse(rawError);
511
+ } catch {
512
+ errorDetail = rawError;
513
+ }
514
+ const errorMessage = typeof errorDetail === "object" && errorDetail?.msg ? errorDetail.msg : `Coze API error: ${response.status} ${response.statusText}`;
515
+ return BuildWarningGenerateResult(errorMessage);
516
+ }
517
+ const { content, finishReason, usage } = await accumulateSSEResponse(response.body);
518
+ return {
519
+ content,
520
+ finishReason,
521
+ usage,
522
+ request: { body },
523
+ response: { body: null },
524
+ warnings
525
+ };
511
526
  }
512
527
  isVisibleMsgPart(evtData) {
513
528
  if (evtData.type === "knowledge" && evtData.role === "assistant") {
@@ -521,7 +536,7 @@ var CozeLanguageModel = class {
521
536
  const url = this.config.url({
522
537
  path: "/chat"
523
538
  });
524
- const user_id = (options.headers ? options.headers["x-user-id"] : "") || Date.now().toString();
539
+ const user_id = options.headers ? options.headers["x-user-id"] : "";
525
540
  const user_var = options.headers ? options.headers["x-user-var"] : "";
526
541
  let customVar;
527
542
  if (user_var) {
@@ -531,16 +546,16 @@ var CozeLanguageModel = class {
531
546
  console.warn("x-user-var parse error", e);
532
547
  }
533
548
  }
549
+ console.log("msssage send to coze", JSON.stringify(messages, null, 2));
534
550
  const body = {
535
551
  bot_id: this.config.botId,
536
552
  auto_save_history: false,
537
- user_id: "7543191937730215936",
538
- // user_id,
553
+ user_id: user_id || "7543191937730215936",
539
554
  stream: true,
540
555
  additional_messages: messages
541
556
  };
542
557
  if (customVar) {
543
- body.custom_var = customVar;
558
+ body.custom_variables = customVar;
544
559
  }
545
560
  const headers = this.config.headers();
546
561
  const abortSignal = options.abortSignal;
@@ -572,8 +587,8 @@ var CozeLanguageModel = class {
572
587
  const isBuildStage = stage === "build";
573
588
  const isFillStage = stage === "fill";
574
589
  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());
590
+ new import_web2.TextDecoderStream()
591
+ ).pipeThrough(new import_parse_sse2.ServerSentEventTransformStream()).pipeThrough(new MCPChunkFilterTransformStream(isBuildStage || isFillStage)).pipeThrough(new LLMChunkInjectorTransformStream()).pipeThrough(new LLMPartTrasnformStream());
577
592
  let finalResult = result;
578
593
  if (externalTransformers.length > 0) {
579
594
  finalResult = externalTransformers.reduce(
@@ -1838,10 +1853,12 @@ var rebuildFieldsJsonStructure = (truncatedJson, subItemsOnly = false) => {
1838
1853
  // src/stream-trasnformer/fields-json-transform-stream.ts
1839
1854
  var createFieldsJsonTransformStream = (enableJsonParser) => {
1840
1855
  let parser;
1856
+ let enqueueTextDelta;
1841
1857
  let id;
1842
1858
  let isFirstChunk = true;
1859
+ let passthroughMode = false;
1843
1860
  const chunkGuard = (chunk) => {
1844
- if (!enableJsonParser) {
1861
+ if (!enableJsonParser || passthroughMode) {
1845
1862
  return false;
1846
1863
  }
1847
1864
  if (chunk.type !== "text-delta" || !("delta" in chunk)) {
@@ -1858,7 +1875,7 @@ var createFieldsJsonTransformStream = (enableJsonParser) => {
1858
1875
  }
1859
1876
  },
1860
1877
  transform: (chunk, controller) => {
1861
- if (!parser) {
1878
+ if (!parser && !passthroughMode) {
1862
1879
  return;
1863
1880
  }
1864
1881
  try {
@@ -1887,7 +1904,7 @@ var createFieldsJsonTransformStream = (enableJsonParser) => {
1887
1904
  parser = new import_json.JSONParser({
1888
1905
  paths: ["$.*"]
1889
1906
  });
1890
- const enqueueTextDelta = enableJsonParser ? createTextInfoEnqueuer(controller) : (content) => {
1907
+ enqueueTextDelta = enableJsonParser ? createTextInfoEnqueuer(controller) : (content) => {
1891
1908
  };
1892
1909
  parser.onValue = (parsedInfo) => {
1893
1910
  const value = parsedInfo.value;
@@ -1903,13 +1920,9 @@ var createFieldsJsonTransformStream = (enableJsonParser) => {
1903
1920
  id
1904
1921
  );
1905
1922
  };
1906
- let errorLogged = false;
1907
1923
  parser.onError = (err) => {
1908
- if (!errorLogged) {
1909
- console.log("is enabled", enableJsonParser);
1910
- console.error("JsonWidgetStream: JSON Parsing Error:", err);
1911
- errorLogged = true;
1912
- }
1924
+ console.error("JsonWidgetStream: JSON Parsing Error:", err);
1925
+ passthroughMode = true;
1913
1926
  };
1914
1927
  parser.onEnd = () => {
1915
1928
  enqueueTextDelta(