@blueking/chat-helper 0.0.12-beta.2 → 0.0.12-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.
@@ -276,7 +276,12 @@ export class FetchClient {
276
276
  var _this = this;
277
277
  return _async_to_generator(function*() {
278
278
  const { url, fetchConfig, requestConfig, controller } = _this.prepareRequest(config);
279
- const timeoutId = requestConfig.timeout && requestConfig.timeout > 0 ? setTimeout(()=>controller.abort(), requestConfig.timeout) : undefined;
279
+ // 超时与用户主动取消共用同一个 AbortController,需靠此标记区分
280
+ let timedOut = false;
281
+ const timeoutId = requestConfig.timeout && requestConfig.timeout > 0 ? setTimeout(()=>{
282
+ timedOut = true;
283
+ controller.abort();
284
+ }, requestConfig.timeout) : undefined;
280
285
  try {
281
286
  const fetchResponse = yield fetch(url, fetchConfig);
282
287
  if (timeoutId) {
@@ -319,9 +324,8 @@ export class FetchClient {
319
324
  };
320
325
  const validateStatus = requestConfig.validateStatus || _this.defaults.validateStatus;
321
326
  if (!validateStatus(fetchResponse.status)) {
322
- var _response_data_error, _response_data;
323
- 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}`;
324
- throw createError(message, requestConfig, `ERR_BAD_RESPONSE`, response);
327
+ const { code, message } = resolveErrorPayload(response.data, `Request failed with status code ${fetchResponse.status}`);
328
+ throw createError(message, requestConfig, code, response);
325
329
  }
326
330
  let finalResponse = response;
327
331
  _this.interceptors.response.forEach((interceptor)=>{
@@ -341,23 +345,28 @@ export class FetchClient {
341
345
  }
342
346
  // 检查业务状态码(区别于 HTTP 状态码)
343
347
  const apiResponse = finalResponse.data;
348
+ // 无响应体(如 204 或空 body)时没有业务码可校验,直接放行
349
+ if (!apiResponse) {
350
+ return undefined;
351
+ }
344
352
  if (![
345
353
  0,
346
354
  'success'
347
355
  ].includes(apiResponse.code)) {
348
- throw createError(apiResponse.message, requestConfig, apiResponse.code, finalResponse);
356
+ const { code, message } = resolveErrorPayload(apiResponse, `Request failed with code ${apiResponse.code}`);
357
+ throw createError(message, requestConfig, code, finalResponse);
349
358
  }
350
359
  return apiResponse.data;
351
360
  } catch (error) {
352
361
  if (timeoutId) {
353
362
  clearTimeout(timeoutId);
354
363
  }
355
- if (error instanceof Error && error.name === 'AbortError') {
356
- const requestError = createError('Request timeout', requestConfig, 'ECONNABORTED', undefined);
357
- _this.dispatchError(requestError);
358
- throw _this.applyResponseErrorInterceptors(requestError);
364
+ // 用户手动取消请求;超时同样表现为 AbortError,需作为异常上报
365
+ if (error instanceof Error && error.name === 'AbortError' && !timedOut) {
366
+ console.warn('User canceled request', error.message);
367
+ return;
359
368
  }
360
- const requestError = error.isAxiosError === true ? error : createError(error.message, requestConfig, error.code, undefined);
369
+ const requestError = timedOut ? createError(`timeout of ${requestConfig.timeout}ms exceeded`, requestConfig, 'ECONNABORTED', undefined) : error.isAxiosError === true ? error : createError(error.message, requestConfig, error.code, undefined);
361
370
  _this.dispatchError(requestError);
362
371
  throw _this.applyResponseErrorInterceptors(requestError);
363
372
  }
@@ -390,33 +399,44 @@ export class FetchClient {
390
399
  const wrappedConfig = _object_spread_props(_object_spread({}, config), {
391
400
  onError: wrappedOnError
392
401
  });
393
- 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
+ };
394
408
  try {
395
409
  var _wrappedConfig_onStart, _fetchResponse_body;
396
410
  const fetchResponse = yield fetch(url, fetchConfig);
397
411
  const validateStatus = requestConfig.validateStatus || _this.defaults.validateStatus;
398
412
  if (!validateStatus(fetchResponse.status)) {
399
- let message = `Request failed with status code ${fetchResponse.status}`;
413
+ let errorData = null;
400
414
  try {
401
- var _errorData_error;
402
- const errorData = yield fetchResponse.json();
403
- if (errorData === null || errorData === void 0 ? void 0 : (_errorData_error = errorData.error) === null || _errorData_error === void 0 ? void 0 : _errorData_error.message) {
404
- message = errorData.error.message;
405
- }
415
+ errorData = yield fetchResponse.json();
406
416
  } catch (_error) {
407
- message = `Request failed with status code ${fetchResponse.status}`;
417
+ errorData = null;
408
418
  }
409
- const error = createError(message, requestConfig, `ERR_BAD_RESPONSE`, undefined);
419
+ const { code, message } = resolveErrorPayload(errorData, `Request failed with status code ${fetchResponse.status}`);
420
+ const error = createError(message, requestConfig, code, undefined);
410
421
  wrappedOnError(error);
411
422
  return;
412
423
  }
413
424
  (_wrappedConfig_onStart = wrappedConfig.onStart) === null || _wrappedConfig_onStart === void 0 ? void 0 : _wrappedConfig_onStart.call(wrappedConfig);
414
- 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();
415
426
  if (!reader) {
416
427
  const error = new Error('IResponse body is not readable');
417
428
  wrappedOnError(error);
418
429
  return;
419
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
+ }
420
440
  // 缓存跨行分片数据
421
441
  let temp = '';
422
442
  const isJson = (str)=>{
@@ -431,8 +451,8 @@ export class FetchClient {
431
451
  while(true){
432
452
  const { value, done } = yield reader.read();
433
453
  if (done) {
434
- var _wrappedConfig_onDone;
435
- (_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);
436
456
  break;
437
457
  }
438
458
  const values = (temp + value.toString()).split('\n');
@@ -451,13 +471,15 @@ export class FetchClient {
451
471
  } catch (error) {
452
472
  if (error instanceof Error) {
453
473
  if (error.name === 'AbortError') {
454
- var _wrappedConfig_onDone1;
455
- (_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);
456
476
  return;
457
477
  }
458
478
  wrappedOnError(error);
459
479
  }
460
480
  throw error;
481
+ } finally{
482
+ controller.signal.removeEventListener('abort', cancelReaderOnAbort);
461
483
  }
462
484
  })();
463
485
  }
@@ -503,6 +525,64 @@ function buildURL(url, params) {
503
525
  }
504
526
  return url;
505
527
  }
528
+ /**
529
+ * 从错误响应体中解析业务错误信息
530
+ *
531
+ * 后端错误体存在多种形态,需逐一兼容:
532
+ * - 新版网关 / aidev 插件:`{ error: { code, message, data } }`
533
+ * - 旧版蓝鲸标准(如 blueapps 登录态失效):`{ result, code, message, data }`
534
+ * - DRF 原生异常:`{ detail }`
535
+ */ function resolveErrorPayload(body, fallbackMessage) {
536
+ var _record_error;
537
+ const fallbackCode = 'ERR_BAD_RESPONSE';
538
+ if (!body || typeof body !== 'object') {
539
+ return {
540
+ code: fallbackCode,
541
+ message: fallbackMessage
542
+ };
543
+ }
544
+ const record = body;
545
+ if ((_record_error = record.error) === null || _record_error === void 0 ? void 0 : _record_error.message) {
546
+ var _record_error_code;
547
+ return {
548
+ code: (_record_error_code = record.error.code) !== null && _record_error_code !== void 0 ? _record_error_code : fallbackCode,
549
+ data: record.error.data,
550
+ message: stringifyErrorMessage(record.error.message, fallbackMessage)
551
+ };
552
+ }
553
+ if (record.message) {
554
+ var _record_code;
555
+ return {
556
+ code: (_record_code = record.code) !== null && _record_code !== void 0 ? _record_code : fallbackCode,
557
+ data: record.data,
558
+ message: stringifyErrorMessage(record.message, fallbackMessage)
559
+ };
560
+ }
561
+ if (record.detail) {
562
+ var _record_code1;
563
+ return {
564
+ code: (_record_code1 = record.code) !== null && _record_code1 !== void 0 ? _record_code1 : fallbackCode,
565
+ data: record.data,
566
+ message: stringifyErrorMessage(record.detail, fallbackMessage)
567
+ };
568
+ }
569
+ var _record_code2;
570
+ return {
571
+ code: (_record_code2 = record.code) !== null && _record_code2 !== void 0 ? _record_code2 : fallbackCode,
572
+ data: record.data,
573
+ message: fallbackMessage
574
+ };
575
+ }
576
+ /** 错误 message 可能是字符串以外的结构(如字段校验字典),统一转成可读文案 */ function stringifyErrorMessage(message, fallbackMessage) {
577
+ if (typeof message === 'string') {
578
+ return message || fallbackMessage;
579
+ }
580
+ try {
581
+ return JSON.stringify(message) || fallbackMessage;
582
+ } catch (_error) {
583
+ return fallbackMessage;
584
+ }
585
+ }
506
586
  function createError(message, config, code, response) {
507
587
  const error = new Error(message);
508
588
  error.config = config;
@@ -12,10 +12,16 @@ export declare const useHttp: (options: IUseChatHelperOptions) => {
12
12
  onError: (handler: import("./fetch").GlobalErrorHandler, options?: import("./fetch").ErrorHandlerOptions) => void;
13
13
  agent: {
14
14
  getAgentInfo: (config?: import("./fetch").IRequestConfig) => Promise<import("..").IAgentInfo>;
15
+ getLlms: (params?: import("..").ILlmListQuery, config?: import("./fetch").IRequestConfig) => Promise<import("..").ILlmItem[]>;
15
16
  };
16
17
  session: {
17
18
  clearSession: (sessionCode: string, config?: import("./fetch").IRequestConfig) => Promise<unknown>;
18
- getSessions: (config?: import("./fetch").IRequestConfig) => Promise<import("..").ISession<unknown, unknown>[]>;
19
+ getSessions: (params?: import("..").ISessionListParams, config?: import("./fetch").IRequestConfig) => Promise<{
20
+ page: number;
21
+ numPages: number;
22
+ count: number;
23
+ results: import("..").ISession<unknown, unknown>[];
24
+ }>;
19
25
  plusSession: (data: import("..").ISession, config?: import("./fetch").IRequestConfig) => Promise<import("..").ISession<unknown, unknown>>;
20
26
  modifySession: (data: import("..").ISession, config?: import("./fetch").IRequestConfig) => Promise<import("..").ISession<unknown, unknown>>;
21
27
  deleteSession: (sessionCode: string, config?: import("./fetch").IRequestConfig) => Promise<unknown>;
@@ -33,17 +39,22 @@ export declare const useHttp: (options: IUseChatHelperOptions) => {
33
39
  uploadFile: (sessionCode: string, file: File, config?: import("./fetch").IRequestConfig) => Promise<{
34
40
  download_url?: string;
35
41
  }>;
42
+ getPvFileDownloadUrl: (sessionCode: string, path: string, options?: import("..").GetPvFileDownloadUrlOptions, config?: import("./fetch").IRequestConfig) => Promise<import("..").IPvFileDownloadUrlResult>;
43
+ isResumeSession: (sessionCode: string, config?: import("./fetch").IRequestConfig) => Promise<boolean>;
36
44
  };
37
45
  message: {
38
- getMessages: (sessionCode: string, limit?: number, config?: import("./fetch").IRequestConfig) => Promise<import("..").IMessage[]>;
39
- 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>;
40
- 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>;
46
+ getMessages: (sessionCode: string, limit?: number, config?: import("./fetch").IRequestConfig, fuzzy?: string) => Promise<import("..").IMessage[]>;
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
+ 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>;
41
49
  deleteMessage: (id: string, config?: import("./fetch").IRequestConfig) => Promise<import("..").IMessage>;
42
50
  batchDeleteMessages: (ids: string[], config?: import("./fetch").IRequestConfig) => Promise<number>;
43
51
  shareMessages: (sessionCode: string, contentIds: string[], expiredAt?: number, config?: import("./fetch").IRequestConfig) => Promise<import("./module/message").IShareMessagesResponse>;
44
52
  stopChat: (sessionCode: string, config?: import("./fetch").IRequestConfig) => Promise<void>;
45
53
  getFlowAgentTaskInfo: (taskId: number, config?: import("./fetch").IRequestConfig) => Promise<unknown>;
46
54
  getFlowAgentTaskNodeInfo: (taskId: number, nodeId: string, config?: import("./fetch").IRequestConfig) => Promise<import("..").IFlowAgentTaskNodeInfo>;
55
+ retryFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: import("./fetch").IRequestConfig) => Promise<void>;
56
+ skipFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: import("./fetch").IRequestConfig) => Promise<void>;
57
+ userOperation: (sessionCode: string, operation: import("..").UserOperation, payload: import("..").IUserOperationPayload, config?: import("./fetch").IRequestConfig) => Promise<void>;
47
58
  };
48
59
  fetchClient: import("./fetch").FetchClient;
49
60
  };
@@ -1,3 +1,4 @@
1
+ import type { ILlmItem, ILlmListQuery } from '../../agent/type';
1
2
  import type { FetchClient, IRequestConfig } from '../fetch';
2
3
  /**
3
4
  * agent 相关 http 接口
@@ -6,4 +7,5 @@ import type { FetchClient, IRequestConfig } from '../fetch';
6
7
  */
7
8
  export declare const useAgent: (fetchClient: FetchClient) => {
8
9
  getAgentInfo: (config?: IRequestConfig) => Promise<import("../../agent/type").IAgentInfo>;
10
+ getLlms: (params?: ILlmListQuery, config?: IRequestConfig) => Promise<ILlmItem[]>;
9
11
  };
@@ -22,7 +22,7 @@
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
- */ import { transferAgentInfoApi2AgentInfo } from '../transform/agent.ts.js';
25
+ */ import { transferAgentInfoApi2AgentInfo, transferLlmListApi2LlmItems } from '../transform/agent.ts.js';
26
26
  /**
27
27
  * agent 相关 http 接口
28
28
  * @param fetchClient - 请求客户端
@@ -30,7 +30,24 @@
30
30
  */ export const useAgent = (fetchClient)=>{
31
31
  // 获取 agent 信息
32
32
  const getAgentInfo = (config)=>fetchClient.get('agent/info/', undefined, config).then(transferAgentInfoApi2AgentInfo);
33
+ /**
34
+ * 获取当前空间可用模型列表(公开 + 空间授权 + 用户权限交集)
35
+ * @param params 查询参数;未传 llm_type 时默认 chat.completion
36
+ */ const getLlms = (params, config)=>{
37
+ var _params_llm_type;
38
+ const query = {
39
+ llm_type: (_params_llm_type = params === null || params === void 0 ? void 0 : params.llm_type) !== null && _params_llm_type !== void 0 ? _params_llm_type : 'chat.completion'
40
+ };
41
+ if (params === null || params === void 0 ? void 0 : params.fuzzy) {
42
+ query.fuzzy = params.fuzzy;
43
+ }
44
+ if (params === null || params === void 0 ? void 0 : params.supports) {
45
+ query.supports = params.supports;
46
+ }
47
+ return fetchClient.get('llms/', query, config).then(transferLlmListApi2LlmItems);
48
+ };
33
49
  return {
34
- getAgentInfo
50
+ getAgentInfo,
51
+ getLlms
35
52
  };
36
53
  };
@@ -7,10 +7,16 @@ import type { FetchClient } from '../fetch';
7
7
  export declare const useModule: (fetchClient: FetchClient) => {
8
8
  agent: {
9
9
  getAgentInfo: (config?: import("../fetch").IRequestConfig) => Promise<import("../..").IAgentInfo>;
10
+ getLlms: (params?: import("../..").ILlmListQuery, config?: import("../fetch").IRequestConfig) => Promise<import("../..").ILlmItem[]>;
10
11
  };
11
12
  session: {
12
13
  clearSession: (sessionCode: string, config?: import("../fetch").IRequestConfig) => Promise<unknown>;
13
- getSessions: (config?: import("../fetch").IRequestConfig) => Promise<import("../..").ISession<unknown, unknown>[]>;
14
+ getSessions: (params?: import("../..").ISessionListParams, config?: import("../fetch").IRequestConfig) => Promise<{
15
+ page: number;
16
+ numPages: number;
17
+ count: number;
18
+ results: import("../..").ISession<unknown, unknown>[];
19
+ }>;
14
20
  plusSession: (data: import("../..").ISession, config?: import("../fetch").IRequestConfig) => Promise<import("../..").ISession<unknown, unknown>>;
15
21
  modifySession: (data: import("../..").ISession, config?: import("../fetch").IRequestConfig) => Promise<import("../..").ISession<unknown, unknown>>;
16
22
  deleteSession: (sessionCode: string, config?: import("../fetch").IRequestConfig) => Promise<unknown>;
@@ -28,17 +34,22 @@ export declare const useModule: (fetchClient: FetchClient) => {
28
34
  uploadFile: (sessionCode: string, file: File, config?: import("../fetch").IRequestConfig) => Promise<{
29
35
  download_url?: string;
30
36
  }>;
37
+ getPvFileDownloadUrl: (sessionCode: string, path: string, options?: import("../..").GetPvFileDownloadUrlOptions, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IPvFileDownloadUrlResult>;
38
+ isResumeSession: (sessionCode: string, config?: import("../fetch").IRequestConfig) => Promise<boolean>;
31
39
  };
32
40
  message: {
33
- getMessages: (sessionCode: string, limit?: number, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IMessage[]>;
34
- 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>;
35
- 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>;
41
+ getMessages: (sessionCode: string, limit?: number, config?: import("../fetch").IRequestConfig, fuzzy?: string) => Promise<import("../..").IMessage[]>;
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
+ 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>;
36
44
  deleteMessage: (id: string, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IMessage>;
37
45
  batchDeleteMessages: (ids: string[], config?: import("../fetch").IRequestConfig) => Promise<number>;
38
46
  shareMessages: (sessionCode: string, contentIds: string[], expiredAt?: number, config?: import("../fetch").IRequestConfig) => Promise<import("./message").IShareMessagesResponse>;
39
47
  stopChat: (sessionCode: string, config?: import("../fetch").IRequestConfig) => Promise<void>;
40
48
  getFlowAgentTaskInfo: (taskId: number, config?: import("../fetch").IRequestConfig) => Promise<unknown>;
41
49
  getFlowAgentTaskNodeInfo: (taskId: number, nodeId: string, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IFlowAgentTaskNodeInfo>;
50
+ retryFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: import("../fetch").IRequestConfig) => Promise<void>;
51
+ skipFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: import("../fetch").IRequestConfig) => Promise<void>;
52
+ userOperation: (sessionCode: string, operation: import("../..").UserOperation, payload: import("../..").IUserOperationPayload, config?: import("../fetch").IRequestConfig) => Promise<void>;
42
53
  };
43
54
  fetchClient: FetchClient;
44
55
  };
@@ -1,4 +1,4 @@
1
- import type { IFlowAgentTaskNodeInfo, IMessage } from '../../message/type';
1
+ import type { IFlowAgentTaskNodeInfo, IMessage, IUserOperationPayload, UserOperation } from '../../message/type';
2
2
  import type { FetchClient, IRequestConfig } from '../fetch';
3
3
  /**
4
4
  * 分享消息接口返回数据
@@ -19,13 +19,16 @@ 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[]>;
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>;
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>;
22
+ getMessages: (sessionCode: string, limit?: number, config?: IRequestConfig, fuzzy?: string) => Promise<IMessage[]>;
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
+ 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>;
26
26
  batchDeleteMessages: (ids: string[], config?: IRequestConfig) => Promise<number>;
27
27
  shareMessages: (sessionCode: string, contentIds: string[], expiredAt?: number, config?: IRequestConfig) => Promise<IShareMessagesResponse>;
28
28
  stopChat: (sessionCode: string, config?: IRequestConfig) => Promise<void>;
29
29
  getFlowAgentTaskInfo: (taskId: number, config?: IRequestConfig) => Promise<unknown>;
30
30
  getFlowAgentTaskNodeInfo: (taskId: number, nodeId: string, config?: IRequestConfig) => Promise<IFlowAgentTaskNodeInfo>;
31
+ retryFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: IRequestConfig) => Promise<void>;
32
+ skipFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: IRequestConfig) => Promise<void>;
33
+ userOperation: (sessionCode: string, operation: UserOperation, payload: IUserOperationPayload, config?: IRequestConfig) => Promise<void>;
31
34
  };
@@ -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);
@@ -86,6 +87,20 @@ import { transferMessage2MessageApi, transferMessageApi2Message } from '../trans
86
87
  const getFlowAgentTaskInfo = (taskId, config)=>fetchClient.get(`flow_agent/${taskId}/task_info/`, undefined, config);
87
88
  // 获取流程引擎任务节点详情
88
89
  const getFlowAgentTaskNodeInfo = (taskId, nodeId, config)=>fetchClient.get(`flow_agent/${taskId}/task_node_info/${nodeId}/`, undefined, config);
90
+ // 重试流程引擎任务节点
91
+ const retryFlowAgentTaskNode = (sessionCode, nodeId, taskId, config)=>fetchClient.post(`flow_agent/${sessionCode}/node/${nodeId}/retry/`, {
92
+ task_id: taskId
93
+ }, config);
94
+ // 跳过流程引擎任务节点
95
+ const skipFlowAgentTaskNode = (sessionCode, nodeId, taskId, config)=>fetchClient.post(`flow_agent/${sessionCode}/node/${nodeId}/skip/`, {
96
+ task_id: taskId
97
+ }, config);
98
+ // 用户操作
99
+ const userOperation = (sessionCode, operation, payload, config)=>fetchClient.post(`user_operation/`, {
100
+ session_code: sessionCode,
101
+ operation,
102
+ payload
103
+ }, config);
89
104
  return {
90
105
  getMessages,
91
106
  plusMessage,
@@ -95,6 +110,9 @@ import { transferMessage2MessageApi, transferMessageApi2Message } from '../trans
95
110
  shareMessages,
96
111
  stopChat,
97
112
  getFlowAgentTaskInfo,
98
- getFlowAgentTaskNodeInfo
113
+ getFlowAgentTaskNodeInfo,
114
+ retryFlowAgentTaskNode,
115
+ skipFlowAgentTaskNode,
116
+ userOperation
99
117
  };
100
118
  };
@@ -1,4 +1,4 @@
1
- import type { ISession, ISessionFeedback } from '../../session/type';
1
+ import type { GetPvFileDownloadUrlOptions, IPvFileDownloadUrlResult, ISession, ISessionFeedback, ISessionListParams } from '../../session/type';
2
2
  import type { FetchClient, IRequestConfig } from '../fetch';
3
3
  /**
4
4
  * session 相关 http 接口
@@ -7,7 +7,12 @@ import type { FetchClient, IRequestConfig } from '../fetch';
7
7
  */
8
8
  export declare const useSession: (fetchClient: FetchClient) => {
9
9
  clearSession: (sessionCode: string, config?: IRequestConfig) => Promise<unknown>;
10
- getSessions: (config?: IRequestConfig) => Promise<ISession<unknown, unknown>[]>;
10
+ getSessions: (params?: ISessionListParams, config?: IRequestConfig) => Promise<{
11
+ page: number;
12
+ numPages: number;
13
+ count: number;
14
+ results: ISession<unknown, unknown>[];
15
+ }>;
11
16
  plusSession: (data: ISession, config?: IRequestConfig) => Promise<ISession<unknown, unknown>>;
12
17
  modifySession: (data: ISession, config?: IRequestConfig) => Promise<ISession<unknown, unknown>>;
13
18
  deleteSession: (sessionCode: string, config?: IRequestConfig) => Promise<unknown>;
@@ -25,4 +30,6 @@ export declare const useSession: (fetchClient: FetchClient) => {
25
30
  uploadFile: (sessionCode: string, file: File, config?: IRequestConfig) => Promise<{
26
31
  download_url?: string;
27
32
  }>;
33
+ getPvFileDownloadUrl: (sessionCode: string, path: string, options?: GetPvFileDownloadUrlOptions, config?: IRequestConfig) => Promise<IPvFileDownloadUrlResult>;
34
+ isResumeSession: (sessionCode: string, config?: IRequestConfig) => Promise<boolean>;
28
35
  };
@@ -77,6 +77,32 @@ function _object_spread_props(target, source) {
77
77
  import { transferSession2SessionApi, transferSessionApi2Session, transferSessionFeedback2SessionFeedbackApi, transferSessionFeedbackApi2SessionFeedback } from '../transform/session.ts.js';
78
78
  import { resolveRequestValue } from '../fetch/index.ts.js';
79
79
  /** 上传接口传输用文件名前缀,与原始展示名解耦 */ const UPLOAD_FILE_NAME_PREFIX = 'upload_file';
80
+ /** 会话列表默认每页条数 */ const DEFAULT_PAGE_SIZE = 20;
81
+ const DEFAULT_PV_FILE_DOWNLOAD_EXPIRES_IN = 600;
82
+ const DEFAULT_PV_FILE_DOWNLOAD_TIMEOUT = 20000;
83
+ /**
84
+ * 将会话列表接口响应统一为分页结构。
85
+ * 兼容两类后台:
86
+ * 1. 分页:`{ page, num_pages, count, results }`
87
+ * 2. 未分页(旧接口):直接返回 `ISessionApi[]`
88
+ */ const normalizeSessionListResponse = (res)=>{
89
+ if (Array.isArray(res)) {
90
+ return {
91
+ page: 1,
92
+ numPages: 1,
93
+ count: res.length,
94
+ results: res.map(transferSessionApi2Session)
95
+ };
96
+ }
97
+ const results = Array.isArray(res === null || res === void 0 ? void 0 : res.results) ? res.results : [];
98
+ var _res_page, _res_num_pages, _res_count;
99
+ return {
100
+ page: (_res_page = res === null || res === void 0 ? void 0 : res.page) !== null && _res_page !== void 0 ? _res_page : 1,
101
+ numPages: (_res_num_pages = res === null || res === void 0 ? void 0 : res.num_pages) !== null && _res_num_pages !== void 0 ? _res_num_pages : 1,
102
+ count: (_res_count = res === null || res === void 0 ? void 0 : res.count) !== null && _res_count !== void 0 ? _res_count : results.length,
103
+ results: results.map(transferSessionApi2Session)
104
+ };
105
+ };
80
106
  /** 从原始文件名提取 ASCII 安全扩展名,用于保留文件类型 */ const getSafeFileExtension = (fileName)=>{
81
107
  const extension = fileName.split('.').pop();
82
108
  if (!extension || extension === fileName) {
@@ -103,8 +129,14 @@ import { resolveRequestValue } from '../fetch/index.ts.js';
103
129
  */ export const useSession = (fetchClient)=>{
104
130
  // 清除聊天上下文
105
131
  const clearSession = (sessionCode, config)=>fetchClient.post(`chat_completion/${sessionCode}/clear/`, undefined, config);
106
- // 获取会话列表
107
- const getSessions = (config)=>fetchClient.get(`session/`, undefined, config).then((res)=>res.map(transferSessionApi2Session));
132
+ // 获取会话列表(分页;兼容未支持分页的后台返回数组)
133
+ const getSessions = (params, config)=>{
134
+ var _params_page, _params_page_size;
135
+ return fetchClient.get(`session/`, {
136
+ page: (_params_page = params === null || params === void 0 ? void 0 : params.page) !== null && _params_page !== void 0 ? _params_page : 1,
137
+ page_size: (_params_page_size = params === null || params === void 0 ? void 0 : params.page_size) !== null && _params_page_size !== void 0 ? _params_page_size : DEFAULT_PAGE_SIZE
138
+ }, config).then(normalizeSessionListResponse);
139
+ };
108
140
  // 新增会话
109
141
  const plusSession = (data, config)=>fetchClient.post(`session/`, transferSession2SessionApi(data), config).then((res)=>transferSessionApi2Session(res));
110
142
  // 修改会话
@@ -137,6 +169,24 @@ import { resolveRequestValue } from '../fetch/index.ts.js';
137
169
  })
138
170
  })));
139
171
  };
172
+ /**
173
+ * 签发会话 PV 文件的临时 download_url / preview_url。
174
+ * path 为文件相对路径(artifacts 的 outputId);URLSearchParams 会自动编码,勿二次 encode。
175
+ */ const getPvFileDownloadUrl = (sessionCode, path, options, config)=>{
176
+ var _options_expiresIn;
177
+ const expiresIn = (_options_expiresIn = options === null || options === void 0 ? void 0 : options.expiresIn) !== null && _options_expiresIn !== void 0 ? _options_expiresIn : DEFAULT_PV_FILE_DOWNLOAD_EXPIRES_IN;
178
+ var _options_timeout;
179
+ const timeout = (_options_timeout = options === null || options === void 0 ? void 0 : options.timeout) !== null && _options_timeout !== void 0 ? _options_timeout : DEFAULT_PV_FILE_DOWNLOAD_TIMEOUT;
180
+ var _config_timeout;
181
+ return fetchClient.get(`session/${sessionCode}/pv_files/download_url/`, {
182
+ expires_in: expiresIn,
183
+ path
184
+ }, _object_spread_props(_object_spread({}, config), {
185
+ timeout: (_config_timeout = config === null || config === void 0 ? void 0 : config.timeout) !== null && _config_timeout !== void 0 ? _config_timeout : timeout
186
+ }));
187
+ };
188
+ // 轮询接口,判断是否可以继续聊天
189
+ const isResumeSession = (sessionCode, config)=>fetchClient.get(`session/${sessionCode}/is_resume/`, undefined, config);
140
190
  return {
141
191
  clearSession,
142
192
  getSessions,
@@ -148,6 +198,8 @@ import { resolveRequestValue } from '../fetch/index.ts.js';
148
198
  postSessionFeedback,
149
199
  getSessionFeedbackReasons,
150
200
  renameSession,
151
- uploadFile
201
+ uploadFile,
202
+ getPvFileDownloadUrl,
203
+ isResumeSession
152
204
  };
153
205
  };
@@ -1,7 +1,15 @@
1
- import type { IAgentInfo, IAgentInfoApi } from '../../agent/type';
1
+ import type { IAgentInfo, IAgentInfoApi, ILlmItem, ILlmItemApi } from '../../agent/type';
2
2
  /**
3
3
  * 将 API 返回的 agent 信息数据转换为前端使用的 agent 信息数据
4
4
  * @param data API 返回的 agent 信息数据
5
5
  * @returns 前端使用的 agent 信息数据
6
6
  */
7
7
  export declare const transferAgentInfoApi2AgentInfo: (data: IAgentInfoApi) => IAgentInfo;
8
+ /**
9
+ * 将 llms/ 接口单项规范化为前端 ILlmItem(补齐缺省字段,避免 UI 崩溃)
10
+ */
11
+ export declare const transferLlmApi2LlmItem: (data: ILlmItemApi) => ILlmItem;
12
+ /**
13
+ * 将 llms/ 列表响应规范化为 ILlmItem[]
14
+ */
15
+ export declare const transferLlmListApi2LlmItems: (data: ILlmItemApi[] | null | undefined) => ILlmItem[];
@@ -79,3 +79,30 @@
79
79
  resources: data === null || data === void 0 ? void 0 : data.resources
80
80
  };
81
81
  };
82
+ /**
83
+ * 将 llms/ 接口单项规范化为前端 ILlmItem(补齐缺省字段,避免 UI 崩溃)
84
+ */ export const transferLlmApi2LlmItem = (data)=>{
85
+ var _data_id, _data_llm_type, _data_icon, _data_description, _data_max_token_size, _data_property, _data_space_auth_mode, _data_user_auth_mode;
86
+ return {
87
+ id: (_data_id = data.id) !== null && _data_id !== void 0 ? _data_id : 0,
88
+ llm_code: data.llm_code,
89
+ llm_name: data.llm_name,
90
+ llm_type: (_data_llm_type = data.llm_type) !== null && _data_llm_type !== void 0 ? _data_llm_type : 'chat.completion',
91
+ icon: (_data_icon = data.icon) !== null && _data_icon !== void 0 ? _data_icon : '',
92
+ description: (_data_description = data.description) !== null && _data_description !== void 0 ? _data_description : '',
93
+ base_model: data.base_model,
94
+ max_token_size: (_data_max_token_size = data.max_token_size) !== null && _data_max_token_size !== void 0 ? _data_max_token_size : 0,
95
+ property: (_data_property = data.property) !== null && _data_property !== void 0 ? _data_property : {},
96
+ space_auth_mode: (_data_space_auth_mode = data.space_auth_mode) !== null && _data_space_auth_mode !== void 0 ? _data_space_auth_mode : '',
97
+ user_auth_mode: (_data_user_auth_mode = data.user_auth_mode) !== null && _data_user_auth_mode !== void 0 ? _data_user_auth_mode : '',
98
+ tag_names: data.tag_names
99
+ };
100
+ };
101
+ /**
102
+ * 将 llms/ 列表响应规范化为 ILlmItem[]
103
+ */ export const transferLlmListApi2LlmItems = (data)=>{
104
+ if (!Array.isArray(data)) {
105
+ return [];
106
+ }
107
+ return data.map(transferLlmApi2LlmItem);
108
+ };