@blueking/chat-helper 0.0.12-beta.17 → 0.0.12-beta.19

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/README.md CHANGED
@@ -324,6 +324,17 @@ http.message; // Message API
324
324
 
325
325
  一般情况下,您不需要直接使用 `http` 模块,因为 `agent`、`session` 和 `message` 模块已经封装了常用的业务逻辑。
326
326
 
327
+ **`http.message.getMessages`(可单独使用)**:
328
+
329
+ ```typescript
330
+ // (sessionCode: string, limit?: number, config?: IRequestConfig, fuzzy?: string) => Promise<IMessage[]>
331
+ // GET session_content/content/ — 支持可选 fuzzy 模糊检索
332
+ const messages = await http.message.getMessages(sessionCode);
333
+ const filtered = await http.message.getMessages(sessionCode, undefined, undefined, '关键词');
334
+ ```
335
+
336
+ > 业务层 `message.getMessages(sessionCode)` 未透传 `fuzzy`。需要模糊检索时请直接调用 `http.message.getMessages`。`fuzzy` 位于参数末尾,不影响既有 `limit` / `config` 调用。
337
+
327
338
  ## 配置选项
328
339
 
329
340
  ### requestData(必需)
@@ -416,7 +427,6 @@ useChatHelper({
416
427
  **拦截器使用场景**:
417
428
 
418
429
  1. **请求拦截器**:
419
-
420
430
  - 添加认证 token
421
431
  - 添加请求时间戳
422
432
  - 添加请求 ID
@@ -994,8 +1004,8 @@ class SafeProtocol extends AGUIProtocol {
994
1004
  mode.value === 'creative'
995
1005
  ? 'chat_completion_creative/'
996
1006
  : mode.value === 'precise'
997
- ? 'chat_completion_precise/'
998
- : undefined;
1007
+ ? 'chat_completion_precise/'
1008
+ : undefined;
999
1009
 
1000
1010
  // 自定义请求参数
1001
1011
  agent.chat(userInput.value, session.current.sessionCode, endpoint, {
@@ -1555,13 +1565,11 @@ interface IToolMessage {
1555
1565
  **参数:**
1556
1566
 
1557
1567
  - `options.requestData` (必需)
1558
-
1559
1568
  - `urlPrefix: string` - API 基础路径
1560
1569
  - `data?: Record<string, unknown> | (() => Record<string, unknown>)` - 额外的请求数据
1561
1570
  - `headers?: Record<string, string> | (() => Record<string, string>)` - 额外的请求头
1562
1571
 
1563
1572
  - `options.interceptors` (可选)
1564
-
1565
1573
  - `request?: (config: IRequestConfig) => IRequestConfig` - 请求拦截器
1566
1574
  - `response?: (response: IResponse) => IResponse` - 响应拦截器
1567
1575
 
@@ -79,6 +79,30 @@ function _object_spread(target) {
79
79
  }
80
80
  return target;
81
81
  }
82
+ function ownKeys(object, enumerableOnly) {
83
+ var keys = Object.keys(object);
84
+ if (Object.getOwnPropertySymbols) {
85
+ var symbols = Object.getOwnPropertySymbols(object);
86
+ if (enumerableOnly) {
87
+ symbols = symbols.filter(function(sym) {
88
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
89
+ });
90
+ }
91
+ keys.push.apply(keys, symbols);
92
+ }
93
+ return keys;
94
+ }
95
+ function _object_spread_props(target, source) {
96
+ source = source != null ? source : {};
97
+ if (Object.getOwnPropertyDescriptors) {
98
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
99
+ } else {
100
+ ownKeys(Object(source)).forEach(function(key) {
101
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
102
+ });
103
+ }
104
+ return target;
105
+ }
82
106
  import { ref } from 'vue';
83
107
  import { AGUIProtocol, ApprovalInterruptTicketStatus, EventType, ResumeStatus, RunFinishedOutcomeType } from '../event/index.ts.js';
84
108
  import { MessageRole, MessageStatus, UserOperation } from '../message/index.ts.js';
@@ -129,6 +153,7 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
129
153
  /** 用户主动中止(abortChat),禁止自动重连 */ let manualAbort = false;
130
154
  /** 当前轮次已静默重连次数 */ let reconnectAttempt = 0;
131
155
  /** 本轮流是否已收到 RUN_FINISHED */ let runFinished = false;
156
+ /** 流世代号:新开流时递增,用于忽略已被替换的旧 SSE 回调 */ let activeStreamId = 0;
132
157
  let reconnectTimer = null;
133
158
  let reconnectWaitResolve = null;
134
159
  let activeStreamContext = null;
@@ -221,7 +246,7 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
221
246
  runFinished = false;
222
247
  clearReconnectTimer(false);
223
248
  };
224
- /** 裁掉尾部尚未完成的非用户消息,避免 DLQ 重放时重复气泡 */ const pruneTrailingIncompleteMessages = ()=>{
249
+ /** 裁掉尾部尚未完成的非用户消息,避免断线重放时重复气泡 */ const pruneTrailingIncompleteMessages = ()=>{
225
250
  var _mediator_message;
226
251
  const list = (_mediator_message = mediator.message) === null || _mediator_message === void 0 ? void 0 : _mediator_message.list.value;
227
252
  if (!(list === null || list === void 0 ? void 0 : list.length)) {
@@ -245,11 +270,13 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
245
270
  };
246
271
  /**
247
272
  * 尝试静默重连。
273
+ * @param streamId - 发起重连的流世代;任一 await 后若已被新流/abort 取代则立即退出,避免 abort 掉更新流
248
274
  * @returns reconnected | finished(服务端已结束)| failed(需对外报错或中止)
249
275
  */ const attemptSilentReconnect = function() {
250
- var _ref = _async_to_generator(function*(sessionCode) {
276
+ var _ref = _async_to_generator(function*(sessionCode, streamId) {
251
277
  var _mediator_session_current_value, _mediator_session, _mediator_session_current_value1, _mediator_session1, _mediator_message_list_value_at, _mediator_message;
252
- if (manualAbort || !isSameActiveSession(sessionCode)) {
278
+ const isOwnerStream = ()=>streamId === activeStreamId && !manualAbort;
279
+ if (!isOwnerStream() || !isSameActiveSession(sessionCode)) {
253
280
  return 'failed';
254
281
  }
255
282
  try {
@@ -258,7 +285,7 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
258
285
  } catch (e) {
259
286
  // 状态刷新失败时沿用本地 session.status
260
287
  }
261
- if (manualAbort || !isSameActiveSession(sessionCode)) {
288
+ if (!isOwnerStream() || !isSameActiveSession(sessionCode)) {
262
289
  return 'failed';
263
290
  }
264
291
  if (((_mediator_session = mediator.session) === null || _mediator_session === void 0 ? void 0 : (_mediator_session_current_value = _mediator_session.current.value) === null || _mediator_session_current_value === void 0 ? void 0 : _mediator_session_current_value.status) !== SessionStatus.Running) {
@@ -272,12 +299,16 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
272
299
  isChatting.value = true;
273
300
  const delayMs = getReconnectDelayMs(reconnectAttempt);
274
301
  const waited = yield waitForReconnectDelay(delayMs);
275
- if (!waited || manualAbort || !isSameActiveSession(sessionCode)) {
302
+ if (!waited || !isOwnerStream() || !isSameActiveSession(sessionCode)) {
276
303
  return 'failed';
277
304
  }
278
305
  if (((_mediator_session1 = mediator.session) === null || _mediator_session1 === void 0 ? void 0 : (_mediator_session_current_value1 = _mediator_session1.current.value) === null || _mediator_session_current_value1 === void 0 ? void 0 : _mediator_session_current_value1.status) !== SessionStatus.Running) {
279
306
  return 'finished';
280
307
  }
308
+ // 发起新流前再校验一次:防止 await 后窗口期被新用户请求抢走 activeStreamId
309
+ if (!isOwnerStream()) {
310
+ return 'failed';
311
+ }
281
312
  pruneTrailingIncompleteMessages();
282
313
  const lastMessageId = (_mediator_message = mediator.message) === null || _mediator_message === void 0 ? void 0 : (_mediator_message_list_value_at = _mediator_message.list.value.at(-1)) === null || _mediator_message_list_value_at === void 0 ? void 0 : _mediator_message_list_value_at.id;
283
314
  const ctx = activeStreamContext;
@@ -291,13 +322,13 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
291
322
  });
292
323
  return 'reconnected';
293
324
  });
294
- return function attemptSilentReconnect(sessionCode) {
325
+ return function attemptSilentReconnect(sessionCode, streamId) {
295
326
  return _ref.apply(this, arguments);
296
327
  };
297
328
  }();
298
329
  const streamRequest = function() {
299
330
  var _ref = _async_to_generator(function*({ sessionCode, model, url, config, resume, input, lastMessageId, isReconnect = false }) {
300
- var _mediator_http;
331
+ var _previousController_abort, _mediator_http;
301
332
  if (!isReconnect) {
302
333
  resetStreamReconnectState();
303
334
  }
@@ -307,6 +338,12 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
307
338
  url,
308
339
  config
309
340
  };
341
+ // 先递增世代再 abort 旧连接,避免旧流 onDone 误触发二次重连
342
+ const streamId = ++activeStreamId;
343
+ const previousController = chatAbortController;
344
+ chatAbortController = new AbortController();
345
+ previousController === null || previousController === void 0 ? void 0 : (_previousController_abort = previousController.abort) === null || _previousController_abort === void 0 ? void 0 : _previousController_abort.call(previousController);
346
+ const isActiveStream = ()=>streamId === activeStreamId;
310
347
  // ag-ui 协议需要注入消息模块
311
348
  if (usedProtocol instanceof AGUIProtocol) {
312
349
  usedProtocol.injectMessageModule(mediator.message);
@@ -323,6 +360,9 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
323
360
  }
324
361
  const finishSuccessfully = ()=>{
325
362
  var _usedProtocol_onDone;
363
+ if (!isActiveStream()) {
364
+ return;
365
+ }
326
366
  isChatting.value = false;
327
367
  (_usedProtocol_onDone = usedProtocol.onDone) === null || _usedProtocol_onDone === void 0 ? void 0 : _usedProtocol_onDone.call(usedProtocol);
328
368
  if (input) {
@@ -342,18 +382,30 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
342
382
  };
343
383
  const failWithError = (error)=>{
344
384
  var _usedProtocol_onError;
385
+ if (!isActiveStream()) {
386
+ return;
387
+ }
345
388
  isChatting.value = false;
346
389
  (_usedProtocol_onError = usedProtocol.onError) === null || _usedProtocol_onError === void 0 ? void 0 : _usedProtocol_onError.call(usedProtocol, error);
347
390
  };
348
391
  // 事件代理
349
392
  const onDone = ()=>{
350
- // 用户 abort:FetchClient 将 AbortError 转为 onDone,不重连
351
- if (manualAbort || runFinished) {
393
+ if (!isActiveStream()) {
394
+ return;
395
+ }
396
+ // 用户 abort:本地状态已在 abortChat 结算,勿走 completion/poll
397
+ if (manualAbort) {
398
+ return;
399
+ }
400
+ if (runFinished) {
352
401
  finishSuccessfully();
353
402
  return;
354
403
  }
355
- // 连接被干净掐断且未收到 RUN_FINISHED:尝试静默重连
356
- void attemptSilentReconnect(sessionCode).then((result)=>{
404
+ // 连接被干净掐断且未收到终端事件(RUN_FINISHED / RUN_ERROR):尝试静默重连
405
+ void attemptSilentReconnect(sessionCode, streamId).then((result)=>{
406
+ if (!isActiveStream()) {
407
+ return;
408
+ }
357
409
  if (result === 'reconnected') {
358
410
  // 保持 isChatting=true,不展示错误
359
411
  return;
@@ -371,14 +423,17 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
371
423
  });
372
424
  };
373
425
  const onError = (error)=>{
374
- if (manualAbort) {
426
+ if (!isActiveStream() || manualAbort) {
375
427
  return;
376
428
  }
377
429
  if (!isRecoverableStreamError(error)) {
378
430
  failWithError(error);
379
431
  return;
380
432
  }
381
- void attemptSilentReconnect(sessionCode).then((result)=>{
433
+ void attemptSilentReconnect(sessionCode, streamId).then((result)=>{
434
+ if (!isActiveStream()) {
435
+ return;
436
+ }
382
437
  if (result === 'reconnected') {
383
438
  return;
384
439
  }
@@ -395,21 +450,27 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
395
450
  };
396
451
  const onMessage = (event)=>{
397
452
  var _usedProtocol_onMessage;
453
+ if (!isActiveStream()) {
454
+ return;
455
+ }
398
456
  const typedEvent = event;
399
- if ((typedEvent === null || typedEvent === void 0 ? void 0 : typedEvent.type) === EventType.RunFinished) {
457
+ // RUN_FINISHED / RUN_ERROR 均为终端事件:关流后走正常收尾,勿静默重连
458
+ // (用户 stop 后后端推 RUN_ERROR「用户已取消」,而非 RUN_FINISHED)
459
+ if ((typedEvent === null || typedEvent === void 0 ? void 0 : typedEvent.type) === EventType.RunFinished || (typedEvent === null || typedEvent === void 0 ? void 0 : typedEvent.type) === EventType.RunError) {
400
460
  runFinished = true;
401
461
  }
402
462
  (_usedProtocol_onMessage = usedProtocol.onMessage) === null || _usedProtocol_onMessage === void 0 ? void 0 : _usedProtocol_onMessage.call(usedProtocol, event);
403
463
  };
404
464
  const onStart = ()=>{
405
465
  var _usedProtocol_onStart;
466
+ if (!isActiveStream()) {
467
+ return;
468
+ }
406
469
  isChatting.value = true;
407
470
  (_usedProtocol_onStart = usedProtocol.onStart) === null || _usedProtocol_onStart === void 0 ? void 0 : _usedProtocol_onStart.call(usedProtocol);
408
471
  };
409
- // 创建 AbortController
410
- chatAbortController = new AbortController();
411
- // 发起聊天
412
- void ((_mediator_http = mediator.http) === null || _mediator_http === void 0 ? void 0 : _mediator_http.fetchClient.streamRequest(_object_spread({
472
+ // 发起聊天(controller / 回调必须在 ...config 之后,防止被覆盖)
473
+ void ((_mediator_http = mediator.http) === null || _mediator_http === void 0 ? void 0 : _mediator_http.fetchClient.streamRequest(_object_spread_props(_object_spread({
413
474
  url: url || 'chat_completion/',
414
475
  method: 'POST',
415
476
  data: {
@@ -422,13 +483,14 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
422
483
  last_message_id: lastMessageId,
423
484
  resume
424
485
  }
425
- },
486
+ }
487
+ }, config), {
426
488
  controller: chatAbortController,
427
489
  onDone,
428
490
  onError,
429
491
  onMessage,
430
492
  onStart
431
- }, config)).catch(()=>{
493
+ })).catch(()=>{
432
494
  // 非 abort 错误已通过 onError 回调处理;abort 为正常结束
433
495
  }));
434
496
  });
@@ -546,10 +608,15 @@ const getReconnectDelayMs = (attempt)=>Math.min(RECONNECT_BASE_DELAY_MS * Math.p
546
608
  };
547
609
  /**
548
610
  * 中止聊天(纯前端中止,后端继续处理)
611
+ * 会使当前流世代失效,避免 abort 后的 onDone 误触发 finishSuccessfully / pollResumeSession
549
612
  */ const abortChat = ()=>{
550
613
  var _chatAbortController_abort;
551
614
  manualAbort = true;
615
+ // 先失效世代,再 abort:FetchClient 同步触发的 onDone 会因 isActiveStream=false 直接返回
616
+ activeStreamId += 1;
552
617
  clearReconnectTimer(false);
618
+ clearLongPollTimer();
619
+ isChatting.value = false;
553
620
  chatAbortController === null || chatAbortController === void 0 ? void 0 : (_chatAbortController_abort = chatAbortController.abort) === null || _chatAbortController_abort === void 0 ? void 0 : _chatAbortController_abort.call(chatAbortController);
554
621
  chatAbortController = null;
555
622
  };
@@ -133,7 +133,7 @@ export declare class AGUIProtocol implements ISSEProtocol {
133
133
  handleTextMessageEndEvent(event: ITextMessageEndEvent): void;
134
134
  /**
135
135
  * 处理文本消息开始事件
136
- * 断线续传时 DLQ 会重放事件:同 messageId 已存在则重置内容,避免重复气泡/文本翻倍
136
+ * 断线续传时会重放缓存事件:同 messageId 已存在则重置内容,避免重复气泡/文本翻倍
137
137
  */
138
138
  handleTextMessageStartEvent(event: ITextMessageStartEvent): void;
139
139
  /**
@@ -380,7 +380,7 @@ import { CustomEventName, EventType, FlowTaskState, RunFinishedOutcomeType } fro
380
380
  }
381
381
  /**
382
382
  * 处理文本消息开始事件
383
- * 断线续传时 DLQ 会重放事件:同 messageId 已存在则重置内容,避免重复气泡/文本翻倍
383
+ * 断线续传时会重放缓存事件:同 messageId 已存在则重置内容,避免重复气泡/文本翻倍
384
384
  */ handleTextMessageStartEvent(event) {
385
385
  const existing = this.messageModule.getMessageByMessageId(event.messageId);
386
386
  if (existing) {
@@ -399,7 +399,12 @@ export class FetchClient {
399
399
  const wrappedConfig = _object_spread_props(_object_spread({}, config), {
400
400
  onError: wrappedOnError
401
401
  });
402
- const { url, fetchConfig, requestConfig } = _this.prepareRequest(wrappedConfig, true);
402
+ const { url, fetchConfig, requestConfig, controller } = _this.prepareRequest(wrappedConfig, true);
403
+ let reader;
404
+ const cancelReaderOnAbort = ()=>{
405
+ // pipeThrough(TextDecoderStream) 后,仅 abort fetch signal 在部分环境下不会立刻打断 reader.read()
406
+ void (reader === null || reader === void 0 ? void 0 : reader.cancel().catch(()=>{}));
407
+ };
403
408
  try {
404
409
  var _wrappedConfig_onStart, _fetchResponse_body;
405
410
  const fetchResponse = yield fetch(url, fetchConfig);
@@ -417,12 +422,21 @@ export class FetchClient {
417
422
  return;
418
423
  }
419
424
  (_wrappedConfig_onStart = wrappedConfig.onStart) === null || _wrappedConfig_onStart === void 0 ? void 0 : _wrappedConfig_onStart.call(wrappedConfig);
420
- const reader = (_fetchResponse_body = fetchResponse.body) === null || _fetchResponse_body === void 0 ? void 0 : _fetchResponse_body.pipeThrough(new window.TextDecoderStream()).getReader();
425
+ reader = (_fetchResponse_body = fetchResponse.body) === null || _fetchResponse_body === void 0 ? void 0 : _fetchResponse_body.pipeThrough(new window.TextDecoderStream()).getReader();
421
426
  if (!reader) {
422
427
  const error = new Error('IResponse body is not readable');
423
428
  wrappedOnError(error);
424
429
  return;
425
430
  }
431
+ controller.signal.addEventListener('abort', cancelReaderOnAbort, {
432
+ once: true
433
+ });
434
+ if (controller.signal.aborted) {
435
+ var _wrappedConfig_onDone;
436
+ cancelReaderOnAbort();
437
+ (_wrappedConfig_onDone = wrappedConfig.onDone) === null || _wrappedConfig_onDone === void 0 ? void 0 : _wrappedConfig_onDone.call(wrappedConfig);
438
+ return;
439
+ }
426
440
  // 缓存跨行分片数据
427
441
  let temp = '';
428
442
  const isJson = (str)=>{
@@ -437,8 +451,8 @@ export class FetchClient {
437
451
  while(true){
438
452
  const { value, done } = yield reader.read();
439
453
  if (done) {
440
- var _wrappedConfig_onDone;
441
- (_wrappedConfig_onDone = wrappedConfig.onDone) === null || _wrappedConfig_onDone === void 0 ? void 0 : _wrappedConfig_onDone.call(wrappedConfig);
454
+ var _wrappedConfig_onDone1;
455
+ (_wrappedConfig_onDone1 = wrappedConfig.onDone) === null || _wrappedConfig_onDone1 === void 0 ? void 0 : _wrappedConfig_onDone1.call(wrappedConfig);
442
456
  break;
443
457
  }
444
458
  const values = (temp + value.toString()).split('\n');
@@ -457,13 +471,15 @@ export class FetchClient {
457
471
  } catch (error) {
458
472
  if (error instanceof Error) {
459
473
  if (error.name === 'AbortError') {
460
- var _wrappedConfig_onDone1;
461
- (_wrappedConfig_onDone1 = wrappedConfig.onDone) === null || _wrappedConfig_onDone1 === void 0 ? void 0 : _wrappedConfig_onDone1.call(wrappedConfig);
474
+ var _wrappedConfig_onDone2;
475
+ (_wrappedConfig_onDone2 = wrappedConfig.onDone) === null || _wrappedConfig_onDone2 === void 0 ? void 0 : _wrappedConfig_onDone2.call(wrappedConfig);
462
476
  return;
463
477
  }
464
478
  wrappedOnError(error);
465
479
  }
466
480
  throw error;
481
+ } finally{
482
+ controller.signal.removeEventListener('abort', cancelReaderOnAbort);
467
483
  }
468
484
  })();
469
485
  }
@@ -43,7 +43,7 @@ export declare const useHttp: (options: IUseChatHelperOptions) => {
43
43
  isResumeSession: (sessionCode: string, config?: import("./fetch").IRequestConfig) => Promise<boolean>;
44
44
  };
45
45
  message: {
46
- getMessages: (sessionCode: string, limit?: number, config?: import("./fetch").IRequestConfig) => Promise<import("..").IMessage[]>;
46
+ getMessages: (sessionCode: string, limit?: number, config?: import("./fetch").IRequestConfig, fuzzy?: string) => Promise<import("..").IMessage[]>;
47
47
  plusMessage: (data: import("..").IMessage, config?: import("./fetch").IRequestConfig) => Promise<import("..").IActivityMessage | import("..").IAssistantMessage | import("..").IDeveloperMessage | import("..").IGuideMessage | import("..").IHiddenAssistantMessage | import("..").IHiddenGuideMessage | import("..").IHiddenMessage | import("..").IHiddenSystemMessage | import("..").IHiddenUserMessage | import("..").IInfoMessage | import("..").IPauseMessage | import("..").IPlaceholderMessage | import("..").IReasoningMessage | import("..").ISystemMessage | import("..").ITemplateAssistantMessage | import("..").ITemplateGuideMessage | import("..").ITemplateHiddenMessage | import("..").ITemplateSystemMessage | import("..").ITemplateUserMessage | import("..").IToolMessage | import("..").IUserMessage | import("..").IInterruptMessage>;
48
48
  modifyMessage: (data: import("..").IMessage, config?: import("./fetch").IRequestConfig) => Promise<import("..").IActivityMessage | import("..").IAssistantMessage | import("..").IDeveloperMessage | import("..").IGuideMessage | import("..").IHiddenAssistantMessage | import("..").IHiddenGuideMessage | import("..").IHiddenMessage | import("..").IHiddenSystemMessage | import("..").IHiddenUserMessage | import("..").IInfoMessage | import("..").IPauseMessage | import("..").IPlaceholderMessage | import("..").IReasoningMessage | import("..").ISystemMessage | import("..").ITemplateAssistantMessage | import("..").ITemplateGuideMessage | import("..").ITemplateHiddenMessage | import("..").ITemplateSystemMessage | import("..").ITemplateUserMessage | import("..").IToolMessage | import("..").IUserMessage | import("..").IInterruptMessage>;
49
49
  deleteMessage: (id: string, config?: import("./fetch").IRequestConfig) => Promise<import("..").IMessage>;
@@ -38,7 +38,7 @@ export declare const useModule: (fetchClient: FetchClient) => {
38
38
  isResumeSession: (sessionCode: string, config?: import("../fetch").IRequestConfig) => Promise<boolean>;
39
39
  };
40
40
  message: {
41
- getMessages: (sessionCode: string, limit?: number, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IMessage[]>;
41
+ getMessages: (sessionCode: string, limit?: number, config?: import("../fetch").IRequestConfig, fuzzy?: string) => Promise<import("../..").IMessage[]>;
42
42
  plusMessage: (data: import("../..").IMessage, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IActivityMessage | import("../..").IAssistantMessage | import("../..").IDeveloperMessage | import("../..").IGuideMessage | import("../..").IHiddenAssistantMessage | import("../..").IHiddenGuideMessage | import("../..").IHiddenMessage | import("../..").IHiddenSystemMessage | import("../..").IHiddenUserMessage | import("../..").IInfoMessage | import("../..").IPauseMessage | import("../..").IPlaceholderMessage | import("../..").IReasoningMessage | import("../..").ISystemMessage | import("../..").ITemplateAssistantMessage | import("../..").ITemplateGuideMessage | import("../..").ITemplateHiddenMessage | import("../..").ITemplateSystemMessage | import("../..").ITemplateUserMessage | import("../..").IToolMessage | import("../..").IUserMessage | import("../..").IInterruptMessage>;
43
43
  modifyMessage: (data: import("../..").IMessage, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IActivityMessage | import("../..").IAssistantMessage | import("../..").IDeveloperMessage | import("../..").IGuideMessage | import("../..").IHiddenAssistantMessage | import("../..").IHiddenGuideMessage | import("../..").IHiddenMessage | import("../..").IHiddenSystemMessage | import("../..").IHiddenUserMessage | import("../..").IInfoMessage | import("../..").IPauseMessage | import("../..").IPlaceholderMessage | import("../..").IReasoningMessage | import("../..").ISystemMessage | import("../..").ITemplateAssistantMessage | import("../..").ITemplateGuideMessage | import("../..").ITemplateHiddenMessage | import("../..").ITemplateSystemMessage | import("../..").ITemplateUserMessage | import("../..").IToolMessage | import("../..").IUserMessage | import("../..").IInterruptMessage>;
44
44
  deleteMessage: (id: string, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IMessage>;
@@ -19,7 +19,7 @@ export interface IShareMessagesResponse {
19
19
  * @returns message 相关 http 接口
20
20
  */
21
21
  export declare const useMessage: (fetchClient: FetchClient) => {
22
- getMessages: (sessionCode: string, limit?: number, config?: IRequestConfig) => Promise<IMessage[]>;
22
+ getMessages: (sessionCode: string, limit?: number, config?: IRequestConfig, fuzzy?: string) => Promise<IMessage[]>;
23
23
  plusMessage: (data: IMessage, config?: IRequestConfig) => Promise<import("../../message/type").IActivityMessage | import("../../message/type").IAssistantMessage | import("../../message/type").IDeveloperMessage | import("../../message/type").IGuideMessage | import("../../message/type").IHiddenAssistantMessage | import("../../message/type").IHiddenGuideMessage | import("../../message/type").IHiddenMessage | import("../../message/type").IHiddenSystemMessage | import("../../message/type").IHiddenUserMessage | import("../../message/type").IInfoMessage | import("../../message/type").IPauseMessage | import("../../message/type").IPlaceholderMessage | import("../../message/type").IReasoningMessage | import("../../message/type").ISystemMessage | import("../../message/type").ITemplateAssistantMessage | import("../../message/type").ITemplateGuideMessage | import("../../message/type").ITemplateHiddenMessage | import("../../message/type").ITemplateSystemMessage | import("../../message/type").ITemplateUserMessage | import("../../message/type").IToolMessage | import("../../message/type").IUserMessage | import("../../message/type").IInterruptMessage>;
24
24
  modifyMessage: (data: IMessage, config?: IRequestConfig) => Promise<import("../../message/type").IActivityMessage | import("../../message/type").IAssistantMessage | import("../../message/type").IDeveloperMessage | import("../../message/type").IGuideMessage | import("../../message/type").IHiddenAssistantMessage | import("../../message/type").IHiddenGuideMessage | import("../../message/type").IHiddenMessage | import("../../message/type").IHiddenSystemMessage | import("../../message/type").IHiddenUserMessage | import("../../message/type").IInfoMessage | import("../../message/type").IPauseMessage | import("../../message/type").IPlaceholderMessage | import("../../message/type").IReasoningMessage | import("../../message/type").ISystemMessage | import("../../message/type").ITemplateAssistantMessage | import("../../message/type").ITemplateGuideMessage | import("../../message/type").ITemplateHiddenMessage | import("../../message/type").ITemplateSystemMessage | import("../../message/type").ITemplateUserMessage | import("../../message/type").IToolMessage | import("../../message/type").IUserMessage | import("../../message/type").IInterruptMessage>;
25
25
  deleteMessage: (id: string, config?: IRequestConfig) => Promise<IMessage>;
@@ -56,10 +56,11 @@ import { transferMessage2MessageApi, transferMessageApi2Message } from '../trans
56
56
  * @param fetchClient - 请求客户端
57
57
  * @returns message 相关 http 接口
58
58
  */ export const useMessage = (fetchClient)=>{
59
- // 获取会话内容列表
60
- const getMessages = (sessionCode, limit, config)=>fetchClient.get(`session_content/content/`, {
59
+ // 获取会话内容列表(fuzzy 置于末尾,避免影响既有 limit/config 调用)
60
+ const getMessages = (sessionCode, limit, config, fuzzy)=>fetchClient.get(`session_content/content/`, {
61
61
  session_code: sessionCode,
62
- limit
62
+ limit,
63
+ fuzzy
63
64
  }, config).then((res)=>res.map(transferMessageApi2Message));
64
65
  // 新增会话内容
65
66
  const plusMessage = (data, config)=>fetchClient.post(`session_content/`, transferMessage2MessageApi(data), config).then(transferMessageApi2Message);
package/dist/index.d.ts CHANGED
@@ -13380,7 +13380,7 @@ export declare const useChatHelper: (options: IUseChatHelperOptions) => {
13380
13380
  isResumeSession: (sessionCode: string, config?: import("./http").IRequestConfig) => Promise<boolean>;
13381
13381
  };
13382
13382
  message: {
13383
- getMessages: (sessionCode: string, limit?: number, config?: import("./http").IRequestConfig) => Promise<import("./message").IMessage[]>;
13383
+ getMessages: (sessionCode: string, limit?: number, config?: import("./http").IRequestConfig, fuzzy?: string) => Promise<import("./message").IMessage[]>;
13384
13384
  plusMessage: (data: import("./message").IMessage, config?: import("./http").IRequestConfig) => Promise<import("./message").IActivityMessage | import("./message").IAssistantMessage | import("./message").IDeveloperMessage | import("./message").IGuideMessage | import("./message").IHiddenAssistantMessage | import("./message").IHiddenGuideMessage | import("./message").IHiddenMessage | import("./message").IHiddenSystemMessage | import("./message").IHiddenUserMessage | import("./message").IInfoMessage | import("./message").IPauseMessage | import("./message").IPlaceholderMessage | import("./message").IReasoningMessage | import("./message").ISystemMessage | import("./message").ITemplateAssistantMessage | import("./message").ITemplateGuideMessage | import("./message").ITemplateHiddenMessage | import("./message").ITemplateSystemMessage | import("./message").ITemplateUserMessage | import("./message").IToolMessage | import("./message").IUserMessage | import("./message").IInterruptMessage>;
13385
13385
  modifyMessage: (data: import("./message").IMessage, config?: import("./http").IRequestConfig) => Promise<import("./message").IActivityMessage | import("./message").IAssistantMessage | import("./message").IDeveloperMessage | import("./message").IGuideMessage | import("./message").IHiddenAssistantMessage | import("./message").IHiddenGuideMessage | import("./message").IHiddenMessage | import("./message").IHiddenSystemMessage | import("./message").IHiddenUserMessage | import("./message").IInfoMessage | import("./message").IPauseMessage | import("./message").IPlaceholderMessage | import("./message").IReasoningMessage | import("./message").ISystemMessage | import("./message").ITemplateAssistantMessage | import("./message").ITemplateGuideMessage | import("./message").ITemplateHiddenMessage | import("./message").ITemplateSystemMessage | import("./message").ITemplateUserMessage | import("./message").IToolMessage | import("./message").IUserMessage | import("./message").IInterruptMessage>;
13386
13386
  deleteMessage: (id: string, config?: import("./http").IRequestConfig) => Promise<import("./message").IMessage>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blueking/chat-helper",
3
- "version": "0.0.12-beta.17",
3
+ "version": "0.0.12-beta.19",
4
4
  "description": "",
5
5
  "main": "./dist/index.ts.js",
6
6
  "types": "./dist/index.d.ts",