@blueking/chat-helper 0.0.1-beta.2 → 0.0.1-beta.21

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