@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 +13 -5
- package/dist/agent/use-agent.ts.js +87 -20
- package/dist/event/ag-ui.d.ts +1 -1
- package/dist/event/ag-ui.ts.js +1 -1
- package/dist/http/fetch/fetch.ts.js +22 -6
- package/dist/http/index.d.ts +1 -1
- package/dist/http/module/index.d.ts +1 -1
- package/dist/http/module/message.d.ts +1 -1
- package/dist/http/module/message.ts.js +4 -3
- package/dist/index.d.ts +1 -1
- package/package.json +1 -1
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
|
-
|
|
998
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
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 (
|
|
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 ||
|
|
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
|
-
|
|
351
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
//
|
|
410
|
-
|
|
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
|
-
}
|
|
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
|
};
|
package/dist/event/ag-ui.d.ts
CHANGED
|
@@ -133,7 +133,7 @@ export declare class AGUIProtocol implements ISSEProtocol {
|
|
|
133
133
|
handleTextMessageEndEvent(event: ITextMessageEndEvent): void;
|
|
134
134
|
/**
|
|
135
135
|
* 处理文本消息开始事件
|
|
136
|
-
*
|
|
136
|
+
* 断线续传时会重放缓存事件:同 messageId 已存在则重置内容,避免重复气泡/文本翻倍
|
|
137
137
|
*/
|
|
138
138
|
handleTextMessageStartEvent(event: ITextMessageStartEvent): void;
|
|
139
139
|
/**
|
package/dist/event/ag-ui.ts.js
CHANGED
|
@@ -380,7 +380,7 @@ import { CustomEventName, EventType, FlowTaskState, RunFinishedOutcomeType } fro
|
|
|
380
380
|
}
|
|
381
381
|
/**
|
|
382
382
|
* 处理文本消息开始事件
|
|
383
|
-
*
|
|
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
|
-
|
|
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
|
|
441
|
-
(
|
|
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
|
|
461
|
-
(
|
|
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
|
}
|
package/dist/http/index.d.ts
CHANGED
|
@@ -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>;
|