@baishuyun/coze-provider 0.0.16 → 0.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.
@@ -6,6 +6,7 @@ import { rebuildFieldsJsonStructure } from '../utils/fields-json-rebuild';
6
6
  export const createFieldsJsonTransformStream = (enableJsonParser: boolean) => {
7
7
  let parser: JSONParser;
8
8
  let id: string;
9
+ let isFirstChunk = true;
9
10
 
10
11
  const chunkGuard = (chunk: LanguageModelV2StreamPart): boolean => {
11
12
  if (!enableJsonParser) {
@@ -42,12 +43,21 @@ export const createFieldsJsonTransformStream = (enableJsonParser: boolean) => {
42
43
  if (chunkGuard(chunk)) {
43
44
  if ('id' in chunk && 'delta' in chunk) {
44
45
  id = chunk.id;
45
- parser.write(chunk.delta);
46
+ let delta = chunk.delta;
47
+ if (isFirstChunk) {
48
+ delta = delta.replace(/^\uFEFF/, '');
49
+ isFirstChunk = false;
50
+ }
51
+ parser.write(delta);
52
+ } else {
53
+ console.warn('Unexpected chunk format for JSON parsing:', chunk);
54
+ controller.enqueue(chunk);
46
55
  }
47
56
  } else {
48
57
  controller.enqueue(chunk);
49
58
  }
50
59
  } catch (e) {
60
+ console.log('write or enqueue error', e);
51
61
  controller.error(e);
52
62
  }
53
63
  },
@@ -82,19 +92,15 @@ export const createFieldsJsonTransformStream = (enableJsonParser: boolean) => {
82
92
 
83
93
  let errorLogged = false;
84
94
  parser.onError = (err: any) => {
85
- // controller.enqueue({
86
- // type: "error",
87
- // error: "JsonWidgetStream: JSON Parsing Error:" + err.message,
88
- // });
89
95
  if (!errorLogged) {
96
+ console.log('is enabled', enableJsonParser);
90
97
  console.error('JsonWidgetStream: JSON Parsing Error:', err);
91
98
  errorLogged = true;
99
+ // enqueueTextDelta('error', {
100
+ // type: 'agent-error',
101
+ // error: '操作超时,请刷新重试',
102
+ // });
92
103
  }
93
-
94
- enqueueTextDelta('error', {
95
- type: 'agent-error',
96
- error: '操作超时,请刷新重试',
97
- });
98
104
  };
99
105
 
100
106
  parser.onEnd = () => {
package/src/types.ts CHANGED
@@ -1,6 +1,16 @@
1
- import { LanguageModelV2, LanguageModelV2StreamPart } from '@ai-sdk/provider';
1
+ import {
2
+ LanguageModelV2,
3
+ LanguageModelV2CallWarning,
4
+ LanguageModelV2Content,
5
+ LanguageModelV2FinishReason,
6
+ LanguageModelV2ResponseMetadata,
7
+ LanguageModelV2StreamPart,
8
+ LanguageModelV2Usage,
9
+ SharedV2Headers,
10
+ SharedV2ProviderMetadata,
11
+ } from '@ai-sdk/provider';
2
12
  import { FetchFunction } from '@ai-sdk/provider-utils';
3
- import { ChatEventType } from '@coze/api';
13
+ import { ChatEventType, CreateChatData } from '@coze/api';
4
14
 
5
15
  export type CozeChatModelId = 'chat';
6
16
 
@@ -24,3 +34,16 @@ export interface McpSSE {
24
34
  type: string;
25
35
  data: string;
26
36
  }
37
+
38
+ export interface IGenerateResult {
39
+ content: Array<LanguageModelV2Content>;
40
+ finishReason: LanguageModelV2FinishReason;
41
+ usage: LanguageModelV2Usage;
42
+ providerMetadata?: SharedV2ProviderMetadata;
43
+ request?: { body?: unknown };
44
+ response?: LanguageModelV2ResponseMetadata & {
45
+ headers?: SharedV2Headers;
46
+ body?: unknown;
47
+ };
48
+ warnings: Array<LanguageModelV2CallWarning>;
49
+ }
@@ -0,0 +1,71 @@
1
+ import { CreateChatRes } from '@coze/api';
2
+ import { CozeChatConfig, IGenerateResult } from '../types';
3
+ import { getCozeChatMsgDetail } from './get-coze-chat-msg-detail';
4
+
5
+ export const BuildWarningGenerateResult = (message: string): IGenerateResult => {
6
+ return {
7
+ content: [],
8
+ finishReason: 'error',
9
+ request: {
10
+ body: null,
11
+ },
12
+ usage: {
13
+ inputTokens: 0,
14
+ outputTokens: 0,
15
+ totalTokens: 0,
16
+ },
17
+ response: {
18
+ body: null,
19
+ },
20
+ warnings: [
21
+ {
22
+ type: 'other',
23
+ message,
24
+ },
25
+ ],
26
+ };
27
+ };
28
+
29
+ export const BuildGenerateResultByChatRes = async (
30
+ response: Response,
31
+ chatConfig: CozeChatConfig,
32
+ reqBody?: unknown
33
+ ): Promise<IGenerateResult> => {
34
+ if (!response.ok) {
35
+ return Promise.reject(
36
+ BuildWarningGenerateResult(`Coze API error: ${response.status} ${response.statusText}`)
37
+ );
38
+ }
39
+
40
+ const res = (await response.json()) as CreateChatRes;
41
+ if (res.code !== 0) {
42
+ return Promise.reject(BuildWarningGenerateResult(`Coze API error: ${res.code} ${res.msg}`));
43
+ }
44
+
45
+ const msgRes = await getCozeChatMsgDetail(res.data.conversation_id, res.data.id, chatConfig);
46
+ if (!msgRes.ok) {
47
+ return Promise.reject(
48
+ BuildWarningGenerateResult(
49
+ `Failed to get message detail: ${msgRes.status} ${msgRes.statusText}`
50
+ )
51
+ );
52
+ }
53
+ const msgDetail = await msgRes.json();
54
+
55
+ return {
56
+ content: msgDetail.data.message.content,
57
+ finishReason: msgDetail.data.message.status === 'finished' ? 'stop' : 'error',
58
+ request: {
59
+ body: reqBody,
60
+ },
61
+ usage: {
62
+ inputTokens: 0,
63
+ outputTokens: 0,
64
+ totalTokens: 0,
65
+ },
66
+ response: {
67
+ body: msgDetail,
68
+ },
69
+ warnings: [],
70
+ };
71
+ };
@@ -0,0 +1,54 @@
1
+ import { LanguageModelV2CallOptions, LanguageModelV2CallWarning } from '@ai-sdk/provider';
2
+ import { CozeChatConfig } from '../types';
3
+ import { convertPromptToMessages } from './prompt-to-model-msg';
4
+
5
+ export const createCozeNonStreamingChat = async (
6
+ botId: string,
7
+ options: LanguageModelV2CallOptions,
8
+ chatConfig: CozeChatConfig
9
+ ) => {
10
+ const messages = convertPromptToMessages(options.prompt);
11
+
12
+ const url = chatConfig.url({
13
+ path: '/chat',
14
+ });
15
+
16
+ const user_id = (options.headers ? options.headers['x-user-id'] : '') || Date.now().toString();
17
+ const user_var = options.headers ? options.headers['x-user-var'] : '';
18
+
19
+ let customVar;
20
+ if (user_var) {
21
+ try {
22
+ customVar = JSON.parse(user_var);
23
+ } catch (e) {
24
+ console.warn('x-user-var parse error', e);
25
+ }
26
+ }
27
+
28
+ const body = {
29
+ bot_id: botId,
30
+ auto_save_history: true,
31
+ user_id: user_id || '7543191937730215936',
32
+ additional_messages: messages,
33
+ stream: false,
34
+ };
35
+
36
+ if (customVar) {
37
+ (body as any).custom_var = customVar;
38
+ }
39
+
40
+ const headers = chatConfig.headers();
41
+
42
+ // Support abort signal for proper cancellation when clients disconnect
43
+ const abortSignal = options.abortSignal;
44
+
45
+ const response = await fetch(url, {
46
+ method: 'POST',
47
+ headers: headers,
48
+ credentials: 'include',
49
+ body: JSON.stringify(body),
50
+ signal: abortSignal,
51
+ });
52
+
53
+ return response;
54
+ };
@@ -55,6 +55,9 @@ const RebuilderMap: Record<FieldType, (origin: unknown) => unknown> = {
55
55
  dept: rebuildDept,
56
56
  sn: rebuildSn,
57
57
  deptgroup: rebuildDeptGroup,
58
+ flowState: defaultBuilder,
59
+ flowstate: defaultBuilder,
60
+ formula: defaultBuilder,
58
61
  unknown: defaultBuilder,
59
62
  };
60
63
 
@@ -0,0 +1,19 @@
1
+ import { CozeChatConfig } from '../types';
2
+
3
+ export const getCozeChatMsgDetail = async (
4
+ conversationId: string,
5
+ chatId: string,
6
+ chatConfig: CozeChatConfig
7
+ ) => {
8
+ const url = chatConfig.url({
9
+ path: `/chat/message/list?conversation_id=${conversationId}&chat_id=${chatId}`,
10
+ });
11
+
12
+ const response = await fetch(url, {
13
+ method: 'POST',
14
+ headers: chatConfig.headers(),
15
+ credentials: 'include',
16
+ });
17
+
18
+ return response;
19
+ };