@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.
- package/.turbo/turbo-build.log +23 -22
- package/CHANGELOG.md +13 -0
- package/dist/index.js +121 -119
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +121 -119
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/coze-language-model.ts +67 -23
- package/src/stream-trasnformer/fields-json-transform-stream.ts +11 -19
- package/src/utils/accumulate-sse-response.ts +83 -0
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,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
|
|
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");
|
|
@@ -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
|
-
|
|
498
|
-
|
|
499
|
-
);
|
|
500
|
-
const
|
|
501
|
-
|
|
502
|
-
|
|
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
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
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 =
|
|
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.
|
|
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
|
|
576
|
-
).pipeThrough(new
|
|
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
|
-
|
|
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
|
-
|
|
1909
|
-
|
|
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(
|