@blueking/chat-helper 0.0.1-beta.3 → 0.0.1-beta.30

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.
Files changed (43) hide show
  1. package/README.md +962 -63
  2. package/dist/agent/type.d.ts +27 -2
  3. package/dist/agent/type.ts.js +1 -1
  4. package/dist/agent/use-agent.d.ts +506 -436
  5. package/dist/agent/use-agent.ts.js +224 -25
  6. package/dist/event/ag-ui.d.ts +27 -7
  7. package/dist/event/ag-ui.ts.js +180 -150
  8. package/dist/event/type.d.ts +36 -108
  9. package/dist/event/type.ts.js +9 -11
  10. package/dist/http/fetch/fetch.d.ts +40 -36
  11. package/dist/http/fetch/fetch.ts.js +59 -32
  12. package/dist/http/fetch/index.d.ts +1 -0
  13. package/dist/http/fetch/index.ts.js +17 -1
  14. package/dist/http/index.d.ts +24 -16
  15. package/dist/http/index.ts.js +60 -3
  16. package/dist/http/module/agent.d.ts +2 -2
  17. package/dist/http/module/index.d.ts +22 -16
  18. package/dist/http/module/index.ts.js +2 -1
  19. package/dist/http/module/message.d.ts +22 -7
  20. package/dist/http/module/message.ts.js +49 -7
  21. package/dist/http/module/session.d.ts +14 -11
  22. package/dist/http/module/session.ts.js +66 -4
  23. package/dist/http/transform/agent.ts.js +11 -8
  24. package/dist/http/transform/message.d.ts +6 -6
  25. package/dist/http/transform/message.ts.js +542 -118
  26. package/dist/http/transform/session.ts.js +9 -1
  27. package/dist/index.d.ts +2926 -2631
  28. package/dist/index.ts.js +26 -5
  29. package/dist/mediator/index.d.ts +2 -0
  30. package/dist/mediator/index.ts.js +26 -0
  31. package/dist/mediator/type.d.ts +50 -0
  32. package/dist/mediator/type.ts.js +28 -0
  33. package/dist/mediator/use-mediator.d.ts +7 -0
  34. package/dist/mediator/use-mediator.ts.js +47 -0
  35. package/dist/message/type.d.ts +239 -142
  36. package/dist/message/type.ts.js +15 -15
  37. package/dist/message/use-message.d.ts +817 -754
  38. package/dist/message/use-message.ts.js +226 -28
  39. package/dist/session/type.d.ts +10 -0
  40. package/dist/session/use-session.d.ts +1881 -1729
  41. package/dist/session/use-session.ts.js +198 -33
  42. package/dist/type.d.ts +4 -4
  43. package/package.json +2 -1
@@ -1,6 +1,11 @@
1
- import type { IMessageApi } from '../message/type';
2
- export declare enum CustomEventType {
3
- ReferenceDocument = "reference_document"
1
+ import { type IMessageApi, type MessageRole, type MessageStatus } from '../message/type';
2
+ export declare enum CustomEventName {
3
+ KnowledgeRagEnd = "knowledge_rag_end",
4
+ KnowledgeRagResult = "knowledge_rag_result",
5
+ KnowledgeRagStart = "knowledge_rag_start",
6
+ KnowledgeRagTextContent = "knowledge_rag_text_content",
7
+ ReferenceDocument = "reference_document",
8
+ TempMessage = "temp_message"
4
9
  }
5
10
  export declare enum EventType {
6
11
  ActivityDelta = "ACTIVITY_DELTA",
@@ -30,23 +35,11 @@ export declare enum EventType {
30
35
  ToolCallResult = "TOOL_CALL_RESULT",
31
36
  ToolCallStart = "TOOL_CALL_START"
32
37
  }
33
- export declare enum TextMessageRole {
34
- ASSISTANT = "assistant",
35
- SYSTEM = "system",
36
- TOOL = "tool",
37
- USER = "user"
38
- }
39
38
  /**
40
39
  * Activity 代表 Agent 执行过程中的活动/动作/任务,可能包含结构化数据
41
40
  * 活动状态的增量更新
42
41
  * 记录活动类型 activityType
43
42
  * 使用 JSON Patch (RFC 6902) 格式增量更新 Activity 数据
44
- *
45
- * @example ActivityDeltaEvent {
46
- * activityType: "file_processing",
47
- * messageId: "123",
48
- * patch: [{ op: "add", path: "/title", value: "分析需求" }]
49
- * }
50
43
  */
51
44
  export interface IActivityDeltaEvent extends IBaseEvent {
52
45
  activityType: string;
@@ -59,17 +52,6 @@ export interface IActivityDeltaEvent extends IBaseEvent {
59
52
  * 活动状态的快照
60
53
  * 记录活动类型 activityType
61
54
  * 使用 JSON 格式存储 Activity 数据
62
- *
63
- * @example ActivitySnapshotEvent {
64
- * activityType: "file_processing",
65
- * messageId: "123",
66
- * content: {
67
- * title: "分析需求",
68
- * status: "pending",
69
- * progress: 0.5,
70
- * },
71
- * replace: true,
72
- * }
73
55
  */
74
56
  export interface IActivitySnapshotEvent extends IBaseEvent {
75
57
  activityType: string;
@@ -78,10 +60,6 @@ export interface IActivitySnapshotEvent extends IBaseEvent {
78
60
  replace?: boolean;
79
61
  type: EventType.ActivitySnapshot;
80
62
  }
81
- export interface IBaseCustomEvent {
82
- timestamp?: number;
83
- type: CustomEventType;
84
- }
85
63
  export interface IBaseEvent {
86
64
  timestamp?: number;
87
65
  type: EventType;
@@ -89,26 +67,24 @@ export interface IBaseEvent {
89
67
  /**
90
68
  * 自定义事件
91
69
  * 用于发送自定义事件到客户端
92
- *
93
- * @example CustomEvent {
94
- * name: "custom_event",
95
- * value: { type: CustomEventType.ReferenceDocument, data: { ... } }
96
- * }
97
70
  */
98
71
  export interface ICustomEvent extends IBaseEvent {
99
- name: string;
72
+ name: CustomEventName;
100
73
  type: EventType.Custom;
101
- value: IReferenceDocumentCustomEvent;
74
+ value: IKnowledgeRagResultCustomValue | IKnowledgeRagTextContentCustomValue | IReferenceDocumentCustomValue | ITempMessageCustomValue;
102
75
  }
103
76
  export type IEvent = IActivityDeltaEvent | IActivitySnapshotEvent | ICustomEvent | IMessagesSnapshotEvent | IRawEvent | IRunErrorEvent | IRunFinishedEvent | IRunStartedEvent | IStateDeltaEvent | IStateSnapshotEvent | IStepFinishedEvent | IStepStartedEvent | ITextMessageChunkEvent | ITextMessageContentEvent | ITextMessageEndEvent | ITextMessageStartEvent | IThinkingEndEvent | IThinkingStartEvent | IThinkingTextMessageContentEvent | IThinkingTextMessageEndEvent | IThinkingTextMessageStartEvent | IToolCallArgsEvent | IToolCallChunkEvent | IToolCallEndEvent | IToolCallResultEvent | IToolCallStartEvent;
77
+ export type IKnowledgeRagResultCustomValue = IReferenceDocumentCustomValue;
78
+ export interface IKnowledgeRagTextContentCustomValue {
79
+ cover: boolean;
80
+ chunk: {
81
+ content: string;
82
+ };
83
+ }
104
84
  /**
105
85
  * 消息快照事件
106
86
  * 用于记录当前时刻的完整消息状态
107
87
  * 同步多端消息状态
108
- *
109
- * @example MessagesSnapshotEvent {
110
- * messages: [{ ... }, { ... }]
111
- * }
112
88
  */
113
89
  export interface IMessagesSnapshotEvent extends IBaseEvent {
114
90
  messages: IMessageApi[];
@@ -117,32 +93,17 @@ export interface IMessagesSnapshotEvent extends IBaseEvent {
117
93
  /**
118
94
  * 透传底层原始事件数据
119
95
  * 保留完整的原始事件信息,不做解析
120
- *
121
- * // 同时对接多个 AI 服务
122
- * @example RawEvent {
123
- * event: { Claude 原始响应 },
124
- * source: "anthropic"
125
- * }
126
- *
127
- * @example RawEvent {
128
- * event: { OpenAI 原始响应 },
129
- * source: "openai"
130
- * }
131
96
  */
132
97
  export interface IRawEvent extends IBaseEvent {
133
98
  event: unknown;
134
99
  source?: string;
135
100
  type: EventType.Raw;
136
101
  }
137
- export interface IReferenceDocumentCustomEvent extends IBaseCustomEvent {
138
- type: CustomEventType.ReferenceDocument;
139
- data: {
140
- icon?: string;
141
- originFileUrl?: string;
142
- title: string;
143
- url: string;
144
- }[];
145
- }
102
+ export type IReferenceDocumentCustomValue = {
103
+ name: string;
104
+ originFileUrl?: string;
105
+ url: string;
106
+ }[];
146
107
  export interface IRunErrorEvent extends IBaseEvent {
147
108
  code?: string;
148
109
  message: string;
@@ -164,13 +125,6 @@ export interface IRunFinishedEvent extends IBaseEvent {
164
125
  * 关联会话线程 threadId
165
126
  * 可以记录初始输入 input
166
127
  * 支持嵌套运行(parentRunId 用于子 Agent 调用)
167
- *
168
- * @example RunStartedEvent {
169
- * runId: 123,
170
- * threadId: "thread_123",
171
- * parentRunId: undefined,
172
- * input: { messages: [...] },
173
- * }
174
128
  */
175
129
  export interface IRunStartedEvent extends IBaseEvent {
176
130
  input?: unknown;
@@ -183,10 +137,6 @@ export interface IRunStartedEvent extends IBaseEvent {
183
137
  * 状态增量更新事件
184
138
  * 用于更新客户端状态
185
139
  * 以 JSON Patch 格式增量更新状态
186
- *
187
- * @example StateDeltaEvent {
188
- * delta: [{ op: "add", path: "/title", value: "分析需求" }]
189
- * }
190
140
  */
191
141
  export interface IStateDeltaEvent extends IBaseEvent {
192
142
  delta: unknown;
@@ -196,10 +146,6 @@ export interface IStateDeltaEvent extends IBaseEvent {
196
146
  * 状态快照事件
197
147
  * 用于初始化或重置客户端状态
198
148
  * 提供当前时刻的完整状态视图
199
- *
200
- * @example StateSnapshotEvent {
201
- * snapshot: { ... }
202
- * }
203
149
  */
204
150
  export interface IStateSnapshotEvent extends IBaseEvent {
205
151
  snapshot: unknown;
@@ -220,45 +166,40 @@ export interface IStepStartedEvent extends IBaseEvent {
220
166
  stepName: string;
221
167
  type: EventType.StepStarted;
222
168
  }
169
+ export interface ITempMessageCustomValue {
170
+ message: string;
171
+ status: MessageStatus;
172
+ }
223
173
  export interface ITextMessageChunkEvent extends IBaseEvent {
224
174
  delta?: string;
225
- messageId: number;
226
- role?: TextMessageRole;
175
+ messageId: string;
176
+ role?: MessageRole;
227
177
  type: EventType.TextMessageChunk;
228
178
  }
229
179
  export interface ITextMessageContentEvent extends IBaseEvent {
230
180
  delta: string;
231
- messageId: number;
181
+ messageId: string;
232
182
  type: EventType.TextMessageContent;
233
183
  }
234
184
  export interface ITextMessageEndEvent extends IBaseEvent {
235
- messageId: number;
185
+ messageId: string;
236
186
  type: EventType.TextMessageEnd;
237
187
  }
238
188
  export interface ITextMessageStartEvent extends IBaseEvent {
239
- messageId: number;
240
- role: TextMessageRole;
189
+ messageId: string;
190
+ role: MessageRole;
241
191
  type: EventType.TextMessageStart;
242
192
  }
243
193
  /**
244
194
  * 思考结束事件
245
- *
246
- * @example ThinkingEndEvent {
247
- * timestamp: 1734902400000,
248
- * type: EventType.ThinkingEnd,
249
- * }
250
195
  */
251
196
  export interface IThinkingEndEvent extends IBaseEvent {
197
+ duration?: number;
252
198
  type: EventType.ThinkingEnd;
253
199
  }
254
200
  /**
255
201
  * 思考开始事件
256
202
  * 记录思考的标题 title
257
- *
258
- * @example ThinkingStartEvent {
259
- * title: "分析需求"
260
- * type: EventType.ThinkingStart,
261
- * }
262
203
  */
263
204
  export interface IThinkingStartEvent extends IBaseEvent {
264
205
  title?: string;
@@ -266,12 +207,6 @@ export interface IThinkingStartEvent extends IBaseEvent {
266
207
  }
267
208
  /**
268
209
  * 思考文本消息内容事件
269
- *
270
- * @example ThinkingTextMessageContentEvent {
271
- * timestamp: 1734902400000,
272
- * type: EventType.ThinkingTextMessageContent,
273
- * delta: "思考中..."
274
- * }
275
210
  */
276
211
  export interface IThinkingTextMessageContentEvent extends IBaseEvent {
277
212
  delta: string;
@@ -279,22 +214,12 @@ export interface IThinkingTextMessageContentEvent extends IBaseEvent {
279
214
  }
280
215
  /**
281
216
  * 思考文本消息结束事件
282
- *
283
- * @example ThinkingTextMessageEndEvent {
284
- * timestamp: 1734902400000,
285
- * type: EventType.ThinkingTextMessageEnd,
286
- * }
287
217
  */
288
218
  export interface IThinkingTextMessageEndEvent extends IBaseEvent {
289
219
  type: EventType.ThinkingTextMessageEnd;
290
220
  }
291
221
  /**
292
222
  * 思考文本消息开始事件
293
- *
294
- * @example ThinkingTextMessageStartEvent {
295
- * timestamp: 1734902400000,
296
- * type: EventType.ThinkingTextMessageStart,
297
- * }
298
223
  */
299
224
  export interface IThinkingTextMessageStartEvent extends IBaseEvent {
300
225
  type: EventType.ThinkingTextMessageStart;
@@ -317,11 +242,14 @@ export interface IToolCallEndEvent extends IBaseEvent {
317
242
  }
318
243
  export interface IToolCallResultEvent extends IBaseEvent {
319
244
  content: string;
245
+ duration?: number;
320
246
  messageId: string;
321
247
  toolCallId: string;
322
248
  type: EventType.ToolCallResult;
323
249
  }
324
250
  export interface IToolCallStartEvent extends IBaseEvent {
251
+ description?: string;
252
+ mcpName?: string;
325
253
  parentMessageId?: string;
326
254
  toolCallId: string;
327
255
  toolCallName: string;
@@ -22,10 +22,15 @@
22
22
  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
23
23
  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24
24
  * IN THE SOFTWARE.
25
- */ export var CustomEventType;
26
- (function(CustomEventType) {
27
- CustomEventType["ReferenceDocument"] = "reference_document";
28
- })(CustomEventType || (CustomEventType = {}));
25
+ */ export var CustomEventName;
26
+ (function(CustomEventName) {
27
+ CustomEventName["KnowledgeRagEnd"] = "knowledge_rag_end";
28
+ CustomEventName["KnowledgeRagResult"] = "knowledge_rag_result";
29
+ CustomEventName["KnowledgeRagStart"] = "knowledge_rag_start";
30
+ CustomEventName["KnowledgeRagTextContent"] = "knowledge_rag_text_content";
31
+ CustomEventName["ReferenceDocument"] = "reference_document";
32
+ CustomEventName["TempMessage"] = "temp_message";
33
+ })(CustomEventName || (CustomEventName = {}));
29
34
  export var EventType;
30
35
  (function(EventType) {
31
36
  EventType["ActivityDelta"] = "ACTIVITY_DELTA";
@@ -55,10 +60,3 @@ export var EventType;
55
60
  EventType["ToolCallResult"] = "TOOL_CALL_RESULT";
56
61
  EventType["ToolCallStart"] = "TOOL_CALL_START";
57
62
  })(EventType || (EventType = {}));
58
- export var TextMessageRole;
59
- (function(TextMessageRole) {
60
- TextMessageRole["ASSISTANT"] = "assistant";
61
- TextMessageRole["SYSTEM"] = "system";
62
- TextMessageRole["TOOL"] = "tool";
63
- TextMessageRole["USER"] = "user";
64
- })(TextMessageRole || (TextMessageRole = {}));
@@ -3,13 +3,7 @@ export interface ApiResponse<T = unknown> {
3
3
  data: T;
4
4
  message: string;
5
5
  }
6
- export interface ISSEProtocol {
7
- onDone?: () => void;
8
- onError?: (error: Error) => void;
9
- onMessage?: (event: unknown) => void;
10
- onStart?: () => void;
11
- }
12
- export interface RequestConfig {
6
+ export interface IRequestConfig {
13
7
  baseURL?: string;
14
8
  controller?: AbortController;
15
9
  credentials?: 'include' | 'omit' | 'same-origin';
@@ -25,24 +19,28 @@ export interface RequestConfig {
25
19
  transformResponse?: (data: unknown) => unknown;
26
20
  validateStatus?: (status: number) => boolean;
27
21
  }
28
- export interface RequestError extends Error {
22
+ export interface IRequestError extends Error {
29
23
  code?: string;
30
- config: RequestConfig;
24
+ config: IRequestConfig;
31
25
  isAxiosError: boolean;
32
- request?: Request;
33
- response?: Response;
26
+ response?: IResponse;
34
27
  }
35
- export interface Response<T = unknown> {
36
- config: RequestConfig;
28
+ export interface IResponse<T = unknown> {
29
+ config: IRequestConfig;
37
30
  data: T;
38
31
  headers: Headers;
39
- request?: Request;
40
32
  status: number;
41
33
  statusText: string;
42
34
  }
43
- export interface SSEConfig extends ISSEProtocol, Omit<RequestConfig, 'responseType'> {
35
+ export interface ISSEConfig extends ISSEProtocol, Omit<IRequestConfig, 'responseType'> {
36
+ }
37
+ export interface ISSEProtocol {
38
+ onDone?: () => void;
39
+ onError?: (error: Error) => void;
40
+ onMessage?: (event: unknown) => void;
41
+ onStart?: () => void;
44
42
  }
45
- interface Interceptor<T> {
43
+ interface IInterceptor<T> {
46
44
  fulfilled?: (value: T) => T;
47
45
  rejected?: (error: unknown) => unknown;
48
46
  }
@@ -50,35 +48,41 @@ declare class InterceptorManager<T> {
50
48
  private handlers;
51
49
  clear(): void;
52
50
  eject(id: number): void;
53
- forEach(fn: (interceptor: Interceptor<T>) => void): void;
51
+ forEach(fn: (interceptor: IInterceptor<T>) => void): void;
54
52
  use(fulfilled?: (value: T) => T, rejected?: (error: unknown) => unknown): number;
55
53
  }
56
54
  export declare class FetchClient {
57
- defaults: RequestConfig;
55
+ defaults: IRequestConfig;
58
56
  interceptors: {
59
- request: InterceptorManager<RequestConfig>;
60
- response: InterceptorManager<Response>;
57
+ request: InterceptorManager<IRequestConfig>;
58
+ response: InterceptorManager<IResponse>;
61
59
  };
62
- constructor(config?: RequestConfig);
60
+ constructor(config?: IRequestConfig);
63
61
  applyResponseErrorInterceptors(error: unknown): unknown;
64
- create(config?: RequestConfig): FetchClient;
65
- delete<T = unknown>(url: string, params?: Record<string, unknown>, config?: RequestConfig): Promise<T>;
66
- get<T = unknown>(url: string, params?: Record<string, unknown>, config?: RequestConfig): Promise<T>;
67
- head<T = unknown>(url: string, params?: Record<string, unknown>, config?: RequestConfig): Promise<T>;
68
- options<T = unknown>(url: string, params?: Record<string, unknown>, config?: RequestConfig): Promise<T>;
69
- patch<T = unknown>(url: string, data?: unknown, config?: RequestConfig): Promise<T>;
70
- post<T = unknown>(url: string, data?: unknown, config?: RequestConfig): Promise<T>;
71
- prepareRequest(config: RequestConfig, isStream?: boolean): {
62
+ create(config?: IRequestConfig): FetchClient;
63
+ delete<T = unknown>(url: string, params?: Record<string, unknown>, config?: IRequestConfig): Promise<T>;
64
+ get<T = unknown>(url: string, params?: Record<string, unknown>, config?: IRequestConfig): Promise<T>;
65
+ head<T = unknown>(url: string, params?: Record<string, unknown>, config?: IRequestConfig): Promise<T>;
66
+ options<T = unknown>(url: string, params?: Record<string, unknown>, config?: IRequestConfig): Promise<T>;
67
+ patch<T = unknown>(url: string, data?: unknown, config?: IRequestConfig): Promise<T>;
68
+ post<T = unknown>(url: string, data?: unknown, config?: IRequestConfig): Promise<T>;
69
+ prepareRequest(config: IRequestConfig, isStream?: boolean): {
72
70
  url: string;
73
- headers: Headers;
74
- body: BodyInit;
75
- requestConfig: RequestConfig;
71
+ requestConfig: IRequestConfig;
72
+ fetchConfig: {
73
+ method: string;
74
+ credentials: "include" | "omit" | "same-origin";
75
+ mode: "same-origin" | "cors" | "no-cors";
76
+ headers: Headers;
77
+ body: BodyInit;
78
+ signal: AbortSignal;
79
+ };
76
80
  controller: AbortController;
77
81
  };
78
- put<T = unknown>(url: string, data?: unknown, config?: RequestConfig): Promise<T>;
79
- request<T = unknown>(config: RequestConfig): Promise<T>;
80
- stream(url: string, config?: SSEConfig): Promise<void>;
81
- streamRequest(config: SSEConfig): Promise<void>;
82
+ put<T = unknown>(url: string, data?: unknown, config?: IRequestConfig): Promise<T>;
83
+ request<T = unknown>(config: IRequestConfig): Promise<T>;
84
+ stream(url: string, config?: ISSEConfig): Promise<void>;
85
+ streamRequest(config: ISSEConfig): Promise<void>;
82
86
  }
83
87
  declare const fetchClient: FetchClient;
84
88
  export default fetchClient;
@@ -192,8 +192,9 @@ export class FetchClient {
192
192
  prepareRequest(config, isStream = false) {
193
193
  // 合并配置
194
194
  const mergedConfig = mergeConfig(this.defaults, config);
195
- // 应用请求拦截器
195
+ // 总的请求配置
196
196
  let requestConfig = mergedConfig;
197
+ // 应用请求拦截器
197
198
  this.interceptors.request.forEach((interceptor)=>{
198
199
  if (interceptor.fulfilled) {
199
200
  try {
@@ -208,7 +209,7 @@ export class FetchClient {
208
209
  });
209
210
  // 构建完整 URL
210
211
  let url = requestConfig.url || '';
211
- if (requestConfig.baseURL) {
212
+ if (requestConfig.baseURL && !url.startsWith('http')) {
212
213
  url = requestConfig.baseURL + url;
213
214
  }
214
215
  url = buildURL(url, requestConfig.params);
@@ -219,6 +220,7 @@ export class FetchClient {
219
220
  if (isStream && !headers.has('Accept')) {
220
221
  headers.set('Accept', 'text/event-stream');
221
222
  }
223
+ // 处理请求体
222
224
  if (body !== undefined && body !== null) {
223
225
  var _headers_get;
224
226
  if (requestConfig.transformRequest) {
@@ -229,11 +231,19 @@ export class FetchClient {
229
231
  }
230
232
  // 创建 AbortController
231
233
  const controller = requestConfig.controller ? requestConfig.controller : new AbortController();
232
- return {
233
- url,
234
+ // 请求配置
235
+ const fetchConfig = {
236
+ method: requestConfig.method,
237
+ credentials: requestConfig.credentials,
238
+ mode: requestConfig.mode,
234
239
  headers,
235
240
  body,
241
+ signal: controller.signal
242
+ };
243
+ return {
244
+ url,
236
245
  requestConfig,
246
+ fetchConfig,
237
247
  controller
238
248
  };
239
249
  }
@@ -248,17 +258,12 @@ export class FetchClient {
248
258
  var _this = this;
249
259
  return _async_to_generator(function*() {
250
260
  // 准备请求
251
- const { url, headers, body, requestConfig, controller } = _this.prepareRequest(config);
261
+ const { url, fetchConfig, requestConfig, controller } = _this.prepareRequest(config);
252
262
  // 创建超时控制
253
263
  const timeoutId = requestConfig.timeout && requestConfig.timeout > 0 ? setTimeout(()=>controller.abort(), requestConfig.timeout) : undefined;
254
264
  try {
255
265
  // 发送请求
256
- const request = new Request(url, _object_spread_props(_object_spread({}, requestConfig), {
257
- headers,
258
- body,
259
- signal: controller.signal
260
- }));
261
- const fetchResponse = yield fetch(request);
266
+ const fetchResponse = yield fetch(url, fetchConfig);
262
267
  // 清除超时定时器
263
268
  if (timeoutId) {
264
269
  clearTimeout(timeoutId);
@@ -299,13 +304,14 @@ export class FetchClient {
299
304
  status: fetchResponse.status,
300
305
  statusText: fetchResponse.statusText,
301
306
  headers: fetchResponse.headers,
302
- config: requestConfig,
303
- request
307
+ config: requestConfig
304
308
  };
305
309
  // 验证状态码
306
310
  const validateStatus = requestConfig.validateStatus || _this.defaults.validateStatus;
307
311
  if (!validateStatus(fetchResponse.status)) {
308
- throw createError(`Request failed with status code ${fetchResponse.status}`, requestConfig, `ERR_BAD_RESPONSE`, request, response);
312
+ var _response_data_error, _response_data;
313
+ const message = ((_response_data = response.data) === null || _response_data === void 0 ? void 0 : (_response_data_error = _response_data.error) === null || _response_data_error === void 0 ? void 0 : _response_data_error.message) || `Request failed with status code ${fetchResponse.status}`;
314
+ throw createError(message, requestConfig, `ERR_BAD_RESPONSE`, response);
309
315
  }
310
316
  // 应用响应拦截器
311
317
  let finalResponse = response;
@@ -331,7 +337,7 @@ export class FetchClient {
331
337
  0,
332
338
  'success'
333
339
  ].includes(apiResponse.code)) {
334
- throw createError(apiResponse.message, requestConfig, apiResponse.code, request, finalResponse);
340
+ throw createError(apiResponse.message, requestConfig, apiResponse.code, finalResponse);
335
341
  }
336
342
  return apiResponse.data;
337
343
  } catch (error) {
@@ -341,11 +347,11 @@ export class FetchClient {
341
347
  }
342
348
  // 处理中断错误
343
349
  if (error instanceof Error && error.name === 'AbortError') {
344
- const requestError = createError('Request timeout', requestConfig, 'ECONNABORTED', undefined, undefined);
350
+ const requestError = createError('Request timeout', requestConfig, 'ECONNABORTED', undefined);
345
351
  throw _this.applyResponseErrorInterceptors(requestError);
346
352
  }
347
353
  // 处理其他错误
348
- const requestError = error.isAxiosError === true ? error : createError(error.message, requestConfig, error.code, undefined, undefined);
354
+ const requestError = error.isAxiosError === true ? error : createError(error.message, requestConfig, error.code, undefined);
349
355
  throw _this.applyResponseErrorInterceptors(requestError);
350
356
  }
351
357
  })();
@@ -361,22 +367,27 @@ export class FetchClient {
361
367
  var _this = this;
362
368
  return _async_to_generator(function*() {
363
369
  // 准备请求(标记为流式请求)
364
- const { url, headers, body, requestConfig, controller } = _this.prepareRequest(config, true);
365
- // 发送请求
366
- const request = new Request(url, _object_spread_props(_object_spread({}, requestConfig), {
367
- headers,
368
- body,
369
- signal: controller.signal
370
- }));
370
+ const { url, fetchConfig, requestConfig } = _this.prepareRequest(config, true);
371
371
  try {
372
372
  var // 触发 onStart 回调
373
373
  _config_onStart, _fetchResponse_body;
374
- const fetchResponse = yield fetch(request);
374
+ // 发送请求
375
+ const fetchResponse = yield fetch(url, fetchConfig);
375
376
  // 验证状态码
376
377
  const validateStatus = requestConfig.validateStatus || _this.defaults.validateStatus;
377
378
  if (!validateStatus(fetchResponse.status)) {
378
379
  var _config_onError;
379
- const error = createError(`Request failed with status code ${fetchResponse.status}`, requestConfig, `ERR_BAD_RESPONSE`, request, undefined);
380
+ let message = `Request failed with status code ${fetchResponse.status}`;
381
+ try {
382
+ var _errorData_error;
383
+ const errorData = yield fetchResponse.json();
384
+ if (errorData === null || errorData === void 0 ? void 0 : (_errorData_error = errorData.error) === null || _errorData_error === void 0 ? void 0 : _errorData_error.message) {
385
+ message = errorData.error.message;
386
+ }
387
+ } catch (_error) {
388
+ message = `Request failed with status code ${fetchResponse.status}`;
389
+ }
390
+ const error = createError(message, requestConfig, `ERR_BAD_RESPONSE`, undefined);
380
391
  (_config_onError = config.onError) === null || _config_onError === void 0 ? void 0 : _config_onError.call(config, error);
381
392
  return;
382
393
  }
@@ -385,12 +396,21 @@ export class FetchClient {
385
396
  const reader = (_fetchResponse_body = fetchResponse.body) === null || _fetchResponse_body === void 0 ? void 0 : _fetchResponse_body.pipeThrough(new window.TextDecoderStream()).getReader();
386
397
  if (!reader) {
387
398
  var _config_onError1;
388
- const error = new Error('Response body is not readable');
399
+ const error = new Error('IResponse body is not readable');
389
400
  (_config_onError1 = config.onError) === null || _config_onError1 === void 0 ? void 0 : _config_onError1.call(config, error);
390
401
  return;
391
402
  }
392
403
  // 临时存储数据
393
404
  let temp = '';
405
+ // 判断是否为 JSON 字符串
406
+ const isJson = (str)=>{
407
+ try {
408
+ JSON.parse(str);
409
+ return true;
410
+ } catch (_error) {
411
+ return false;
412
+ }
413
+ };
394
414
  // eslint-disable-next-line no-constant-condition
395
415
  while(true){
396
416
  const { value, done } = yield reader.read();
@@ -403,10 +423,11 @@ export class FetchClient {
403
423
  const values = (temp + value.toString()).split('\n');
404
424
  values.forEach((value)=>{
405
425
  const item = value.replace('data:', '').trim();
406
- if (item.endsWith('}')) {
426
+ if (isJson(item)) {
407
427
  var _config_onMessage;
408
428
  const json = JSON.parse(item);
409
429
  (_config_onMessage = config.onMessage) === null || _config_onMessage === void 0 ? void 0 : _config_onMessage.call(config, json);
430
+ temp = '';
410
431
  } else if (item) {
411
432
  temp = item;
412
433
  }
@@ -429,7 +450,7 @@ export class FetchClient {
429
450
  constructor(config = {}){
430
451
  _define_property(this, "defaults", void 0);
431
452
  _define_property(this, "interceptors", void 0);
432
- this.defaults = _object_spread({
453
+ this.defaults = mergeConfig({
433
454
  method: 'GET',
434
455
  headers: {
435
456
  'Content-Type': 'application/json'
@@ -468,11 +489,10 @@ function buildURL(url, params) {
468
489
  return url;
469
490
  }
470
491
  // 创建错误对象
471
- function createError(message, config, code, request, response) {
492
+ function createError(message, config, code, response) {
472
493
  const error = new Error(message);
473
494
  error.config = config;
474
495
  error.code = String(code);
475
- error.request = request;
476
496
  error.response = response;
477
497
  error.isAxiosError = true;
478
498
  return error;
@@ -481,12 +501,19 @@ function createError(message, config, code, request, response) {
481
501
  function getValue(value) {
482
502
  return typeof value === 'function' ? value() : value;
483
503
  }
504
+ // 判断是否是普通对象(排除类实例如 AbortController、Headers 等)
505
+ function isPlainObject(value) {
506
+ if (!value || typeof value !== 'object') return false;
507
+ const proto = Object.getPrototypeOf(value);
508
+ return proto === Object.prototype || proto === null;
509
+ }
484
510
  // 合并配置
485
511
  function mergeConfig(config1, config2) {
486
512
  const output = _object_spread({}, config1);
487
513
  for(const key in config2){
488
514
  const value2 = config2[key];
489
- if (value2 && typeof value2 === 'object' && !Array.isArray(value2)) {
515
+ // 只对普通对象进行深度合并,类实例(如 AbortController)直接赋值
516
+ if (isPlainObject(value2)) {
490
517
  const value1 = config1[key];
491
518
  output[key] = mergeConfig(value1 || {}, value2);
492
519
  } else {
@@ -3,4 +3,5 @@ import type { IUseChatHelperOptions } from '../../type';
3
3
  export type * from './fetch';
4
4
  export declare const useFetch: (options: IUseChatHelperOptions) => {
5
5
  fetchClient: FetchClient;
6
+ reset: (newOptions: IUseChatHelperOptions) => void;
6
7
  };