@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.
- package/.turbo/turbo-build.log +23 -22
- package/CHANGELOG.md +19 -0
- package/dist/index.js +147 -134
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +147 -134
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/coze-language-model.ts +68 -23
- package/src/stream-trasnformer/fields-json-transform-stream.ts +11 -19
- package/src/utils/accumulate-sse-response.ts +83 -0
- package/src/utils/excel2json.ts +27 -14
- package/src/utils/prompt-to-model-msg.ts +0 -10
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
DTS
|
|
21
|
-
DTS
|
|
22
|
-
DTS dist/index.d.
|
|
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
|
+
[34mCLI[39m Building entry: src/index.ts
|
|
7
|
+
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
8
|
+
[34mCLI[39m tsup v8.5.1
|
|
9
|
+
[34mCLI[39m Using tsup config: /Users/bbbottle/Code/bs-chat-sdk/packages/coze-provider/tsup.config.ts
|
|
10
|
+
[34mCLI[39m Target: es2022
|
|
11
|
+
[34mCLI[39m Cleaning output folder
|
|
12
|
+
[34mCJS[39m Build start
|
|
13
|
+
[34mESM[39m Build start
|
|
14
|
+
[32mCJS[39m [1mdist/index.js [22m[32m50.91 KB[39m
|
|
15
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m94.87 KB[39m
|
|
16
|
+
[32mCJS[39m ⚡️ Build success in 30ms
|
|
17
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m48.87 KB[39m
|
|
18
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m94.55 KB[39m
|
|
19
|
+
[32mESM[39m ⚡️ 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
|
|
49
|
-
var
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
76
|
-
// 空单元格默认值
|
|
77
|
-
raw: false,
|
|
85
|
+
raw: true,
|
|
78
86
|
// 格式化值
|
|
79
|
-
|
|
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
|
-
|
|
498
|
-
|
|
499
|
-
);
|
|
500
|
-
const
|
|
501
|
-
|
|
502
|
-
|
|
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
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
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 =
|
|
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.
|
|
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
|
|
576
|
-
).pipeThrough(new
|
|
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
|
-
|
|
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
|
-
|
|
1909
|
-
|
|
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(
|