@tdesign-react/chat 1.0.0 → 1.0.2-alpha.0
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/es/_util/reactify.js +4 -5
- package/es/_util/reactify.js.map +1 -1
- package/es/_util/useDynamicStyle.js +2 -2
- package/es/_util/useDynamicStyle.js.map +1 -1
- package/es/attachments/index.d.ts +5 -0
- package/es/attachments/index.js +26 -0
- package/es/attachments/index.js.map +1 -0
- package/es/chat-actionbar/index.js +2 -2
- package/es/chat-attachments/index.js +1 -3
- package/es/chat-attachments/index.js.map +1 -1
- package/es/chat-engine/components/provider/agent-state.js +2 -2
- package/es/chat-engine/components/toolcall/index.js +2 -2
- package/es/chat-engine/components/toolcall/registry.js +2 -2
- package/es/chat-engine/components/toolcall/render.js +13 -13
- package/es/chat-engine/components/toolcall/render.js.map +1 -1
- package/es/chat-engine/components/toolcall/types.d.ts +12 -4
- package/es/chat-engine/components/toolcall/types.js +2 -2
- package/es/chat-engine/components/toolcall/types.js.map +1 -1
- package/es/chat-engine/hooks/useAgentState.js +2 -2
- package/es/chat-engine/hooks/useAgentState.js.map +1 -1
- package/es/chat-engine/hooks/useAgentToolcall.js +2 -2
- package/es/chat-engine/hooks/useAgentToolcall.js.map +1 -1
- package/es/chat-engine/hooks/useChat.js +2 -2
- package/es/chat-engine/hooks/useChat.js.map +1 -1
- package/es/chat-engine/index.js +2 -2
- package/es/chat-filecard/index.js +2 -2
- package/es/chat-loading/index.js +2 -2
- package/es/chat-markdown/index.js +2 -2
- package/es/chat-message/index.js +2 -2
- package/es/chat-sender/index.js +2 -2
- package/es/chat-thinking/index.js +2 -2
- package/es/chatbot/components/provider/agent-state.d.ts +5 -0
- package/es/chatbot/components/provider/agent-state.js +28 -0
- package/es/chatbot/components/provider/agent-state.js.map +1 -0
- package/es/chatbot/components/toolcall/index.d.ts +3 -0
- package/es/chatbot/components/toolcall/index.js +19 -0
- package/es/chatbot/components/toolcall/index.js.map +1 -0
- package/es/chatbot/components/toolcall/registry.d.ts +35 -0
- package/es/chatbot/components/toolcall/registry.js +75 -0
- package/es/chatbot/components/toolcall/registry.js.map +1 -0
- package/es/chatbot/components/toolcall/render.d.ts +13 -0
- package/es/chatbot/components/toolcall/render.js +207 -0
- package/es/chatbot/components/toolcall/render.js.map +1 -0
- package/es/chatbot/components/toolcall/types.d.ts +57 -0
- package/es/chatbot/components/toolcall/types.js +15 -0
- package/es/chatbot/components/toolcall/types.js.map +1 -0
- package/es/chatbot/hooks/useAgentState.d.ts +40 -0
- package/es/chatbot/hooks/useAgentState.js +76 -0
- package/es/chatbot/hooks/useAgentState.js.map +1 -0
- package/es/chatbot/hooks/useAgentToolcall.d.ts +28 -0
- package/es/chatbot/hooks/useAgentToolcall.js +78 -0
- package/es/chatbot/hooks/useAgentToolcall.js.map +1 -0
- package/es/chatbot/hooks/useChat.d.ts +11 -0
- package/es/chatbot/hooks/useChat.js +66 -0
- package/es/chatbot/hooks/useChat.js.map +1 -0
- package/es/chatbot/index.js +2 -2
- package/es/index.d.ts +1 -2
- package/es/index.js +3 -3
- package/es/style/index.js +2 -2
- package/package.json +4 -5
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 智能体可交互组件的标准 Props 接口
|
|
4
|
+
*/
|
|
5
|
+
export interface ToolcallComponentProps<TArgs extends object = any, TResult = any, TResponse = any> {
|
|
6
|
+
/** 组件的当前渲染状态 */
|
|
7
|
+
status: 'idle' | 'inProgress' | 'executing' | 'complete' | 'error';
|
|
8
|
+
/** Agent 调用时传入的初始参数 */
|
|
9
|
+
args: TArgs;
|
|
10
|
+
/** 当 status 为 'complete' 时,包含 Toolcall 的最终执行结果 */
|
|
11
|
+
result?: TResult;
|
|
12
|
+
/** 当 status 为 'error' 时,包含错误信息 */
|
|
13
|
+
error?: Error;
|
|
14
|
+
/**
|
|
15
|
+
* 【交互核心】一个回调函数,用于将用户的交互结果返回给宿主环境。
|
|
16
|
+
* 仅在"交互式"场景下由宿主提供。
|
|
17
|
+
*/
|
|
18
|
+
respond?: (response: TResponse) => void;
|
|
19
|
+
agentState?: Record<string, any>;
|
|
20
|
+
}
|
|
21
|
+
interface NonInteractiveToolcallConfig<TArgs extends object, TResult> {
|
|
22
|
+
name: string;
|
|
23
|
+
description: string;
|
|
24
|
+
parameters: any[];
|
|
25
|
+
/** 业务逻辑执行器,支持可选的后端结果作为第二个参数 */
|
|
26
|
+
handler: (args: TArgs, backendResult?: any) => Promise<TResult>;
|
|
27
|
+
/** 状态显示组件 */
|
|
28
|
+
component: React.FC<ToolcallComponentProps<TArgs, TResult>>;
|
|
29
|
+
/** 订阅statekey提取函数 */
|
|
30
|
+
subscribeKey?: (props: ToolcallComponentProps<TArgs, TResult>) => string | undefined;
|
|
31
|
+
}
|
|
32
|
+
interface InteractiveToolcallConfig<TArgs extends object, TResult, TResponse> {
|
|
33
|
+
name: string;
|
|
34
|
+
description: string;
|
|
35
|
+
parameters?: any[];
|
|
36
|
+
/** 交互式UI组件 */
|
|
37
|
+
component: React.FC<ToolcallComponentProps<TArgs, TResult, TResponse>>;
|
|
38
|
+
/** handler 属性不存在,以此作为区分标志 */
|
|
39
|
+
handler?: never;
|
|
40
|
+
/** 订阅statekey提取函数 */
|
|
41
|
+
subscribeKey?: (props: ToolcallComponentProps<TArgs, TResult>) => string | undefined;
|
|
42
|
+
}
|
|
43
|
+
export type AgentToolcallConfig<TArgs extends object = any, TResult = any, TResponse = any> = NonInteractiveToolcallConfig<TArgs, TResult> | InteractiveToolcallConfig<TArgs, TResult, TResponse>;
|
|
44
|
+
export declare function isNonInteractive<TArgs extends object, TResult>(config: AgentToolcallConfig<TArgs, TResult, any>): config is NonInteractiveToolcallConfig<TArgs, TResult>;
|
|
45
|
+
export interface AgentToolcallRegistry {
|
|
46
|
+
[ToolcallName: string]: AgentToolcallConfig;
|
|
47
|
+
}
|
|
48
|
+
export interface AgentToolcallState<TArgs extends object = any, TResult = any> {
|
|
49
|
+
status: ToolcallComponentProps['status'];
|
|
50
|
+
args?: TArgs;
|
|
51
|
+
result?: TResult;
|
|
52
|
+
error?: Error;
|
|
53
|
+
}
|
|
54
|
+
export declare const isNonInteractiveConfig: (cfg: AgentToolcallConfig) => cfg is AgentToolcallConfig & {
|
|
55
|
+
handler: Function;
|
|
56
|
+
};
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tdesign v1.0.0-beta.4
|
|
3
|
+
* (c) 2025 tdesign
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
function isNonInteractive(config) {
|
|
8
|
+
return typeof config.handler === "function";
|
|
9
|
+
}
|
|
10
|
+
var isNonInteractiveConfig = function isNonInteractiveConfig(cfg) {
|
|
11
|
+
return typeof cfg.handler === "function";
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { isNonInteractive, isNonInteractiveConfig };
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../../../pro-components/chat/chatbot/components/toolcall/types.ts"],"sourcesContent":["import React from 'react';\n\n/**\n * 智能体可交互组件的标准 Props 接口\n */\nexport interface ToolcallComponentProps<TArgs extends object = any, TResult = any, TResponse = any> {\n /** 组件的当前渲染状态 */\n status: 'idle' | 'inProgress' | 'executing' | 'complete' | 'error';\n /** Agent 调用时传入的初始参数 */\n args: TArgs;\n /** 当 status 为 'complete' 时,包含 Toolcall 的最终执行结果 */\n result?: TResult;\n /** 当 status 为 'error' 时,包含错误信息 */\n error?: Error;\n /**\n * 【交互核心】一个回调函数,用于将用户的交互结果返回给宿主环境。\n * 仅在\"交互式\"场景下由宿主提供。\n */\n respond?: (response: TResponse) => void;\n agentState?: Record<string, any>;\n}\n\n// 场景一:非交互式 Toolcall 的配置 (有 handler)\ninterface NonInteractiveToolcallConfig<TArgs extends object, TResult> {\n name: string;\n description: string;\n parameters: any[];\n /** 业务逻辑执行器,支持可选的后端结果作为第二个参数 */\n handler: (args: TArgs, backendResult?: any) => Promise<TResult>;\n /** 状态显示组件 */\n component: React.FC<ToolcallComponentProps<TArgs, TResult>>;\n /** 订阅statekey提取函数 */\n subscribeKey?: (props: ToolcallComponentProps<TArgs, TResult>) => string | undefined;\n}\n\n// 场景二:交互式 Toolcall 的配置 (无 handler)\ninterface InteractiveToolcallConfig<TArgs extends object, TResult, TResponse> {\n name: string;\n description: string;\n parameters?: any[];\n /** 交互式UI组件 */\n component: React.FC<ToolcallComponentProps<TArgs, TResult, TResponse>>;\n /** handler 属性不存在,以此作为区分标志 */\n handler?: never;\n /** 订阅statekey提取函数 */\n subscribeKey?: (props: ToolcallComponentProps<TArgs, TResult>) => string | undefined;\n}\n\n// 最终的配置类型\nexport type AgentToolcallConfig<TArgs extends object = any, TResult = any, TResponse = any> =\n | NonInteractiveToolcallConfig<TArgs, TResult>\n | InteractiveToolcallConfig<TArgs, TResult, TResponse>;\n\n// 类型守卫:判断是否为非交互式配置\nexport function isNonInteractive<TArgs extends object, TResult>(\n config: AgentToolcallConfig<TArgs, TResult, any>,\n): config is NonInteractiveToolcallConfig<TArgs, TResult> {\n return typeof (config as any).handler === 'function';\n}\n\n// Agent Toolcall 注册表\nexport interface AgentToolcallRegistry {\n [ToolcallName: string]: AgentToolcallConfig;\n}\n\n// 内部状态管理\nexport interface AgentToolcallState<TArgs extends object = any, TResult = any> {\n status: ToolcallComponentProps['status'];\n args?: TArgs;\n result?: TResult;\n error?: Error;\n}\n\n// 类型守卫函数\nexport const isNonInteractiveConfig = (cfg: AgentToolcallConfig): cfg is AgentToolcallConfig & { handler: Function } =>\n typeof (cfg as any).handler === 'function';\n"],"names":["isNonInteractive","config","handler","isNonInteractiveConfig","cfg"],"mappings":";;;;;;AAsDO,SAASA,iBACdC,MACwD,EAAA;AACjD,EAAA,OAAA,OAAQA,OAAeC,OAAY,KAAA,UAAA,CAAA;AAC5C,CAAA;IAgBaC,sBAAyB,GAAA,SAAzBA,sBAAyBA,CAACC,GACrC,EAAA;AAAA,EAAA,OAAA,OAAQA,IAAYF,OAAY,KAAA,UAAA,CAAA;AAAA;;;;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 状态订阅相关类型定义
|
|
3
|
+
*/
|
|
4
|
+
export interface StateActionOptions {
|
|
5
|
+
/**
|
|
6
|
+
* 初始状态
|
|
7
|
+
*/
|
|
8
|
+
initialState?: Record<string, any>;
|
|
9
|
+
/**
|
|
10
|
+
* 只订阅特定key的变化
|
|
11
|
+
*/
|
|
12
|
+
subscribeKey?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface UseStateActionReturn {
|
|
15
|
+
/**
|
|
16
|
+
* 全量状态Map - 包含所有stateKey的状态
|
|
17
|
+
* 格式: { [stateKey]: stateData }
|
|
18
|
+
*/
|
|
19
|
+
stateMap: Record<string, any>;
|
|
20
|
+
/**
|
|
21
|
+
* 当前最新的状态key
|
|
22
|
+
*/
|
|
23
|
+
currentStateKey: string | null;
|
|
24
|
+
/**
|
|
25
|
+
* 设置状态Map,用于加载历史对话消息中的state数据
|
|
26
|
+
*/
|
|
27
|
+
setStateMap: (stateMap: Record<string, any> | ((prev: Record<string, any>) => Record<string, any>)) => void;
|
|
28
|
+
/**
|
|
29
|
+
* 获取当前完整状态的方法
|
|
30
|
+
*/
|
|
31
|
+
getCurrentState: () => Record<string, any>;
|
|
32
|
+
/**
|
|
33
|
+
* 获取特定 key 状态的方法
|
|
34
|
+
*/
|
|
35
|
+
getStateByKey: (key: string) => any;
|
|
36
|
+
}
|
|
37
|
+
export declare const useAgentState: <T = any>(options?: StateActionOptions) => UseStateActionReturn;
|
|
38
|
+
export declare const AgentStateContext: import("react").Context<UseStateActionReturn>;
|
|
39
|
+
export declare const useAgentStateDataByKey: (stateKey?: string) => any;
|
|
40
|
+
export declare const useAgentStateContext: () => UseStateActionReturn;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tdesign v1.0.0-beta.4
|
|
3
|
+
* (c) 2025 tdesign
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
8
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
9
|
+
import { useState, useRef, useEffect, createContext, useContext, useMemo } from 'react';
|
|
10
|
+
import { stateManager } from 'tdesign-web-components/lib/chat-engine';
|
|
11
|
+
|
|
12
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
|
+
var useAgentState = function useAgentState() {
|
|
15
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
16
|
+
var initialState = options.initialState,
|
|
17
|
+
subscribeKey = options.subscribeKey;
|
|
18
|
+
var _useState = useState(initialState || {}),
|
|
19
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
20
|
+
stateMap = _useState2[0],
|
|
21
|
+
setStateMap = _useState2[1];
|
|
22
|
+
var _useState3 = useState(null),
|
|
23
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
24
|
+
currentStateKey = _useState4[0],
|
|
25
|
+
setCurrentStateKey = _useState4[1];
|
|
26
|
+
var stateMapRef = useRef(stateMap);
|
|
27
|
+
stateMapRef.current = stateMap;
|
|
28
|
+
useEffect(function () {
|
|
29
|
+
return stateManager.subscribeToLatest(function (newState, newStateKey) {
|
|
30
|
+
if (subscribeKey && newStateKey !== subscribeKey) {
|
|
31
|
+
stateMapRef.current = _objectSpread(_objectSpread({}, stateMapRef.current), {}, _defineProperty({}, newStateKey, newState));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
setStateMap(function (prev) {
|
|
35
|
+
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, newStateKey, newState));
|
|
36
|
+
});
|
|
37
|
+
setCurrentStateKey(newStateKey);
|
|
38
|
+
});
|
|
39
|
+
}, [subscribeKey]);
|
|
40
|
+
return {
|
|
41
|
+
stateMap: stateMapRef.current,
|
|
42
|
+
currentStateKey: currentStateKey,
|
|
43
|
+
setStateMap: setStateMap,
|
|
44
|
+
getCurrentState: function getCurrentState() {
|
|
45
|
+
return stateMapRef.current;
|
|
46
|
+
},
|
|
47
|
+
getStateByKey: function getStateByKey(key) {
|
|
48
|
+
return stateMapRef.current[key];
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
var AgentStateContext = /*#__PURE__*/createContext(null);
|
|
53
|
+
var useAgentStateDataByKey = function useAgentStateDataByKey(stateKey) {
|
|
54
|
+
var contextState = useContext(AgentStateContext);
|
|
55
|
+
var independentState = useAgentState({
|
|
56
|
+
subscribeKey: stateKey
|
|
57
|
+
});
|
|
58
|
+
return useMemo(function () {
|
|
59
|
+
if (contextState) {
|
|
60
|
+
var stateMap2 = contextState.stateMap;
|
|
61
|
+
return stateKey ? stateMap2[stateKey] : stateMap2;
|
|
62
|
+
}
|
|
63
|
+
var stateMap = independentState.stateMap;
|
|
64
|
+
return stateKey ? stateMap[stateKey] : stateMap;
|
|
65
|
+
}, [stateKey, contextState && (stateKey ? contextState.stateMap[stateKey] : JSON.stringify(contextState.stateMap)), independentState && (stateKey ? independentState.stateMap[stateKey] : JSON.stringify(independentState.stateMap))]);
|
|
66
|
+
};
|
|
67
|
+
var useAgentStateContext = function useAgentStateContext() {
|
|
68
|
+
var context = useContext(AgentStateContext);
|
|
69
|
+
if (!context) {
|
|
70
|
+
throw new Error("useAgentState must be used within AgentStateProvider");
|
|
71
|
+
}
|
|
72
|
+
return context;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export { AgentStateContext, useAgentState, useAgentStateContext, useAgentStateDataByKey };
|
|
76
|
+
//# sourceMappingURL=useAgentState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAgentState.js","sources":["../../../../pro-components/chat/chatbot/hooks/useAgentState.ts"],"sourcesContent":["import { useState, useEffect, useRef, createContext, useContext, useMemo } from 'react';\nimport { stateManager } from 'tdesign-web-components/lib/chat-engine';\n\n/**\n * 状态订阅相关类型定义\n */\n\nexport interface StateActionOptions {\n /**\n * 初始状态\n */\n initialState?: Record<string, any>;\n /**\n * 只订阅特定key的变化\n */\n subscribeKey?: string;\n}\n\nexport interface UseStateActionReturn {\n /**\n * 全量状态Map - 包含所有stateKey的状态\n * 格式: { [stateKey]: stateData }\n */\n stateMap: Record<string, any>;\n /**\n * 当前最新的状态key\n */\n currentStateKey: string | null;\n /**\n * 设置状态Map,用于加载历史对话消息中的state数据\n */\n setStateMap: (stateMap: Record<string, any> | ((prev: Record<string, any>) => Record<string, any>)) => void;\n /**\n * 获取当前完整状态的方法\n */\n getCurrentState: () => Record<string, any>;\n /**\n * 获取特定 key 状态的方法\n */\n getStateByKey: (key: string) => any;\n}\n\nexport const useAgentState = <T = any>(options: StateActionOptions = {}): UseStateActionReturn => {\n const { initialState, subscribeKey } = options;\n const [stateMap, setStateMap] = useState<Record<string, any>>(initialState || {});\n const [currentStateKey, setCurrentStateKey] = useState<string | null>(null);\n\n // 使用 ref 来避免不必要的重新渲染\n const stateMapRef = useRef(stateMap);\n stateMapRef.current = stateMap;\n\n useEffect(\n () =>\n stateManager.subscribeToLatest((newState: T, newStateKey: string) => {\n // 如果指定了 subscribeKey,只有匹配时才更新状态\n if (subscribeKey && newStateKey !== subscribeKey) {\n // 仍然更新内部状态,但不触发重新渲染\n stateMapRef.current = {\n ...stateMapRef.current,\n [newStateKey]: newState,\n };\n return;\n }\n\n setStateMap((prev) => ({\n ...prev,\n [newStateKey]: newState,\n }));\n setCurrentStateKey(newStateKey);\n }),\n [subscribeKey],\n );\n\n return {\n stateMap: stateMapRef.current,\n currentStateKey,\n setStateMap,\n getCurrentState: () => stateMapRef.current,\n getStateByKey: (key: string) => stateMapRef.current[key],\n };\n};\n\n// 创建 AgentState Context\nexport const AgentStateContext = createContext<UseStateActionReturn | null>(null);\n\n// 简化的状态选择器\nexport const useAgentStateDataByKey = (stateKey?: string) => {\n const contextState = useContext(AgentStateContext);\n const independentState = useAgentState({ subscribeKey: stateKey });\n\n return useMemo(() => {\n if (contextState) {\n // 有 Provider,使用 Context 状态\n const { stateMap } = contextState;\n return stateKey ? stateMap[stateKey] : stateMap;\n }\n\n // 没有 Provider,使用独立状态\n const { stateMap } = independentState;\n return stateKey ? stateMap[stateKey] : stateMap;\n }, [\n stateKey,\n // 关键:添加和 useAgentStateByKey 相同的深度依赖逻辑\n contextState && (stateKey ? contextState.stateMap[stateKey] : JSON.stringify(contextState.stateMap)),\n independentState && (stateKey ? independentState.stateMap[stateKey] : JSON.stringify(independentState.stateMap)),\n ]);\n};\n\n// 导出 Context Hook\nexport const useAgentStateContext = (): UseStateActionReturn => {\n const context = useContext(AgentStateContext);\n\n if (!context) {\n throw new Error('useAgentState must be used within AgentStateProvider');\n }\n\n return context;\n};\n"],"names":["useAgentState","options","arguments","length","undefined","initialState","subscribeKey","_useState","useState","_useState2","_slicedToArray","stateMap","setStateMap","_useState3","_useState4","currentStateKey","setCurrentStateKey","stateMapRef","useRef","current","useEffect","stateManager","subscribeToLatest","newState","newStateKey","_objectSpread","_defineProperty","prev","getCurrentState","getStateByKey","key","AgentStateContext","createContext","useAgentStateDataByKey","stateKey","contextState","useContext","independentState","useMemo","JSON","stringify","useAgentStateContext","context","Error"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AgentToolcallConfig, ToolcallComponentProps } from '../components/toolcall/types';
|
|
2
|
+
export interface UseAgentToolcallReturn {
|
|
3
|
+
register: (config: AgentToolcallConfig | AgentToolcallConfig[]) => void;
|
|
4
|
+
unregister: (names: string | string[]) => void;
|
|
5
|
+
isRegistered: (name: string) => boolean;
|
|
6
|
+
getRegistered: () => string[];
|
|
7
|
+
config: any;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 统一的、智能的 Agent Toolcall 适配器 Hook,
|
|
11
|
+
* 注册管理:负责工具配置的注册、取消注册、状态跟踪;生命周期管理:自动清理、防止内存泄漏
|
|
12
|
+
* 支持两种使用模式:
|
|
13
|
+
* 1. 自动注册模式:传入配置,自动注册和清理
|
|
14
|
+
* 2. 手动注册模式:不传配置或传入null,返回注册方法由业务控制
|
|
15
|
+
*/
|
|
16
|
+
export declare function useAgentToolcall<TArgs extends object = any, TResult = any, TResponse = any>(config?: AgentToolcallConfig<TArgs, TResult, TResponse> | AgentToolcallConfig<TArgs, TResult, TResponse>[] | null | undefined): UseAgentToolcallReturn;
|
|
17
|
+
export interface ToolConfigWithStateOptions<TArgs extends object = any, TResult = any> {
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
parameters: Array<{
|
|
21
|
+
name: string;
|
|
22
|
+
type: string;
|
|
23
|
+
}>;
|
|
24
|
+
subscribeKey?: (props: ToolcallComponentProps<TArgs, TResult>) => string | undefined;
|
|
25
|
+
component: React.ComponentType<ToolcallComponentProps<TArgs, TResult> & {
|
|
26
|
+
agentState?: Record<string, any>;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tdesign v1.0.0-beta.4
|
|
3
|
+
* (c) 2025 tdesign
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
|
|
8
|
+
import { useRef, useCallback, useEffect } from 'react';
|
|
9
|
+
import { agentToolcallRegistry } from '../components/toolcall/registry.js';
|
|
10
|
+
import '@babel/runtime/helpers/classCallCheck';
|
|
11
|
+
import '@babel/runtime/helpers/createClass';
|
|
12
|
+
import '@babel/runtime/helpers/defineProperty';
|
|
13
|
+
|
|
14
|
+
function useAgentToolcall(config) {
|
|
15
|
+
var registeredNamesRef = useRef(/* @__PURE__ */new Set());
|
|
16
|
+
var autoRegisteredNamesRef = useRef(/* @__PURE__ */new Set());
|
|
17
|
+
var configRef = useRef(config);
|
|
18
|
+
var register = useCallback(function (newConfig) {
|
|
19
|
+
if (!newConfig) {
|
|
20
|
+
console.warn("[useAgentToolcall] \u914D\u7F6E\u4E3A\u7A7A\uFF0C\u8DF3\u8FC7\u6CE8\u518C");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
var configs = Array.isArray(newConfig) ? newConfig : [newConfig];
|
|
24
|
+
configs.forEach(function (cfg) {
|
|
25
|
+
if (agentToolcallRegistry.get(cfg.name)) {
|
|
26
|
+
console.warn("[useAgentToolcall] \u914D\u7F6E\u540D\u79F0 \"".concat(cfg.name, "\" \u5DF2\u5B58\u5728\u4E8E\u6CE8\u518C\u8868\u4E2D\uFF0C\u5C06\u88AB\u8986\u76D6"));
|
|
27
|
+
}
|
|
28
|
+
agentToolcallRegistry.register(cfg);
|
|
29
|
+
registeredNamesRef.current.add(cfg.name);
|
|
30
|
+
});
|
|
31
|
+
}, []);
|
|
32
|
+
var unregister = useCallback(function (names) {
|
|
33
|
+
var nameArray = Array.isArray(names) ? names : [names];
|
|
34
|
+
nameArray.forEach(function (name) {
|
|
35
|
+
agentToolcallRegistry.unregister(name);
|
|
36
|
+
registeredNamesRef.current["delete"](name);
|
|
37
|
+
autoRegisteredNamesRef.current["delete"](name);
|
|
38
|
+
});
|
|
39
|
+
}, []);
|
|
40
|
+
var isRegistered = useCallback(function (name) {
|
|
41
|
+
return registeredNamesRef.current.has(name) || autoRegisteredNamesRef.current.has(name);
|
|
42
|
+
}, []);
|
|
43
|
+
var getRegistered = useCallback(function () {
|
|
44
|
+
return Array.from(/* @__PURE__ */new Set([].concat(_toConsumableArray(registeredNamesRef.current), _toConsumableArray(autoRegisteredNamesRef.current))));
|
|
45
|
+
}, []);
|
|
46
|
+
useEffect(function () {
|
|
47
|
+
if (!config) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
var configs = Array.isArray(config) ? config : [config];
|
|
51
|
+
configs.forEach(function (cfg) {
|
|
52
|
+
if (agentToolcallRegistry.get(cfg.name)) {
|
|
53
|
+
console.warn("[useAgentToolcall] \u914D\u7F6E\u540D\u79F0 \"".concat(cfg.name, "\" \u5DF2\u5B58\u5728\u4E8E\u6CE8\u518C\u8868\u4E2D\uFF0C\u5C06\u88AB\u8986\u76D6"));
|
|
54
|
+
}
|
|
55
|
+
agentToolcallRegistry.register(cfg);
|
|
56
|
+
autoRegisteredNamesRef.current.add(cfg.name);
|
|
57
|
+
});
|
|
58
|
+
return function () {
|
|
59
|
+
configs.forEach(function (cfg) {
|
|
60
|
+
agentToolcallRegistry.unregister(cfg.name);
|
|
61
|
+
autoRegisteredNamesRef.current["delete"](cfg.name);
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
}, [config]);
|
|
65
|
+
useEffect(function () {
|
|
66
|
+
configRef.current = config;
|
|
67
|
+
}, [config]);
|
|
68
|
+
return {
|
|
69
|
+
register: register,
|
|
70
|
+
unregister: unregister,
|
|
71
|
+
isRegistered: isRegistered,
|
|
72
|
+
getRegistered: getRegistered,
|
|
73
|
+
config: configRef.current
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export { useAgentToolcall };
|
|
78
|
+
//# sourceMappingURL=useAgentToolcall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAgentToolcall.js","sources":["../../../../pro-components/chat/chatbot/hooks/useAgentToolcall.ts"],"sourcesContent":["import { useCallback, useRef, useEffect } from 'react';\nimport type { AgentToolcallConfig, ToolcallComponentProps } from '../components/toolcall/types';\nimport { agentToolcallRegistry } from '../components/toolcall/registry';\n\nexport interface UseAgentToolcallReturn {\n register: (config: AgentToolcallConfig | AgentToolcallConfig[]) => void;\n unregister: (names: string | string[]) => void;\n isRegistered: (name: string) => boolean;\n getRegistered: () => string[];\n config: any;\n}\n\n/**\n * 统一的、智能的 Agent Toolcall 适配器 Hook,\n * 注册管理:负责工具配置的注册、取消注册、状态跟踪;生命周期管理:自动清理、防止内存泄漏\n * 支持两种使用模式:\n * 1. 自动注册模式:传入配置,自动注册和清理\n * 2. 手动注册模式:不传配置或传入null,返回注册方法由业务控制\n */\nexport function useAgentToolcall<TArgs extends object = any, TResult = any, TResponse = any>(\n config?:\n | AgentToolcallConfig<TArgs, TResult, TResponse>\n | AgentToolcallConfig<TArgs, TResult, TResponse>[]\n | null\n | undefined,\n): UseAgentToolcallReturn {\n const registeredNamesRef = useRef<Set<string>>(new Set());\n const autoRegisteredNamesRef = useRef<Set<string>>(new Set());\n const configRef = useRef(config);\n\n // 手动注册方法\n const register = useCallback((newConfig: AgentToolcallConfig | AgentToolcallConfig[]) => {\n if (!newConfig) {\n console.warn('[useAgentToolcall] 配置为空,跳过注册');\n return;\n }\n\n const configs = Array.isArray(newConfig) ? newConfig : [newConfig];\n\n configs.forEach((cfg) => {\n if (agentToolcallRegistry.get(cfg.name)) {\n console.warn(`[useAgentToolcall] 配置名称 \"${cfg.name}\" 已存在于注册表中,将被覆盖`);\n }\n\n agentToolcallRegistry.register(cfg);\n registeredNamesRef.current.add(cfg.name);\n });\n }, []);\n\n // 手动取消注册方法\n const unregister = useCallback((names: string | string[]) => {\n const nameArray = Array.isArray(names) ? names : [names];\n\n nameArray.forEach((name) => {\n agentToolcallRegistry.unregister(name);\n registeredNamesRef.current.delete(name);\n autoRegisteredNamesRef.current.delete(name);\n });\n }, []);\n\n // 检查是否已注册\n const isRegistered = useCallback(\n (name: string) => registeredNamesRef.current.has(name) || autoRegisteredNamesRef.current.has(name),\n [],\n );\n\n // 获取所有已注册的配置名称\n const getRegistered = useCallback(\n () => Array.from(new Set([...registeredNamesRef.current, ...autoRegisteredNamesRef.current])),\n [],\n );\n\n // 自动注册逻辑(当传入配置时)\n useEffect(() => {\n if (!config) {\n return;\n }\n\n const configs = Array.isArray(config) ? config : [config];\n configs.forEach((cfg) => {\n if (agentToolcallRegistry.get(cfg.name)) {\n console.warn(`[useAgentToolcall] 配置名称 \"${cfg.name}\" 已存在于注册表中,将被覆盖`);\n }\n\n agentToolcallRegistry.register(cfg);\n autoRegisteredNamesRef.current.add(cfg.name);\n });\n\n // 清理函数:取消注册自动注册的配置\n return () => {\n configs.forEach((cfg) => {\n agentToolcallRegistry.unregister(cfg.name);\n autoRegisteredNamesRef.current.delete(cfg.name);\n });\n };\n }, [config]);\n\n // 更新配置引用\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n return {\n register,\n unregister,\n isRegistered,\n getRegistered,\n config: configRef.current,\n };\n}\n\n// 创建带状态感知的工具配置(带状态变化事件),状态注入,自动为组件注入 agentState\nexport interface ToolConfigWithStateOptions<TArgs extends object = any, TResult = any> {\n name: string;\n description: string;\n parameters: Array<{ name: string; type: string }>;\n subscribeKey?: (props: ToolcallComponentProps<TArgs, TResult>) => string | undefined;\n component: React.ComponentType<ToolcallComponentProps<TArgs, TResult> & { agentState?: Record<string, any> }>;\n}\n"],"names":["useAgentToolcall","config","registeredNamesRef","useRef","Set","autoRegisteredNamesRef","configRef","register","useCallback","newConfig","console","warn","configs","Array","isArray","forEach","cfg","agentToolcallRegistry","get","name","concat","current","add","unregister","names","nameArray","isRegistered","has","getRegistered","from","_toConsumableArray","useEffect"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import ChatEngine from 'tdesign-web-components/lib/chat-engine';
|
|
2
|
+
import type { ChatMessagesData, ChatServiceConfig, ChatStatus } from 'tdesign-web-components/lib/chat-engine';
|
|
3
|
+
export type IUseChat = {
|
|
4
|
+
defaultMessages: ChatMessagesData[];
|
|
5
|
+
chatServiceConfig: ChatServiceConfig;
|
|
6
|
+
};
|
|
7
|
+
export declare const useChat: ({ defaultMessages: initialMessages, chatServiceConfig }: IUseChat) => {
|
|
8
|
+
chatEngine: ChatEngine;
|
|
9
|
+
messages: ChatMessagesData[];
|
|
10
|
+
status: ChatStatus;
|
|
11
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tdesign v1.0.0-beta.4
|
|
3
|
+
* (c) 2025 tdesign
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
8
|
+
import { useRef, useState, useEffect } from 'react';
|
|
9
|
+
import ChatEngine__default from 'tdesign-web-components/lib/chat-engine';
|
|
10
|
+
|
|
11
|
+
var useChat = function useChat(_ref) {
|
|
12
|
+
var initialMessages = _ref.defaultMessages,
|
|
13
|
+
chatServiceConfig = _ref.chatServiceConfig;
|
|
14
|
+
var chatEngineRef = useRef(new ChatEngine__default());
|
|
15
|
+
var _useState = useState([]),
|
|
16
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
17
|
+
messages = _useState2[0],
|
|
18
|
+
setMessage = _useState2[1];
|
|
19
|
+
var _useState3 = useState("idle"),
|
|
20
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
21
|
+
status = _useState4[0],
|
|
22
|
+
setStatus = _useState4[1];
|
|
23
|
+
var msgSubscribeRef = useRef(null);
|
|
24
|
+
var prevInitialMessagesRef = useRef([]);
|
|
25
|
+
var chatEngine = chatEngineRef.current;
|
|
26
|
+
var syncState = function syncState(state) {
|
|
27
|
+
var _state$at;
|
|
28
|
+
setMessage(state);
|
|
29
|
+
setStatus(((_state$at = state.at(-1)) === null || _state$at === void 0 ? void 0 : _state$at.status) || "idle");
|
|
30
|
+
};
|
|
31
|
+
var subscribeToChat = function subscribeToChat() {
|
|
32
|
+
var _msgSubscribeRef$curr;
|
|
33
|
+
(_msgSubscribeRef$curr = msgSubscribeRef.current) === null || _msgSubscribeRef$curr === void 0 || _msgSubscribeRef$curr.call(msgSubscribeRef);
|
|
34
|
+
msgSubscribeRef.current = chatEngine.messageStore.subscribe(function (state) {
|
|
35
|
+
syncState(state.messages);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
var initChat = function initChat() {
|
|
39
|
+
chatEngine.init(chatServiceConfig, initialMessages);
|
|
40
|
+
syncState(initialMessages);
|
|
41
|
+
subscribeToChat();
|
|
42
|
+
};
|
|
43
|
+
useEffect(function () {
|
|
44
|
+
initChat();
|
|
45
|
+
return function () {
|
|
46
|
+
var _msgSubscribeRef$curr2;
|
|
47
|
+
return (_msgSubscribeRef$curr2 = msgSubscribeRef.current) === null || _msgSubscribeRef$curr2 === void 0 ? void 0 : _msgSubscribeRef$curr2.call(msgSubscribeRef);
|
|
48
|
+
};
|
|
49
|
+
}, []);
|
|
50
|
+
useEffect(function () {
|
|
51
|
+
var hasChanged = JSON.stringify(prevInitialMessagesRef.current) !== JSON.stringify(initialMessages);
|
|
52
|
+
if (hasChanged && initialMessages && initialMessages.length > 0) {
|
|
53
|
+
prevInitialMessagesRef.current = initialMessages;
|
|
54
|
+
chatEngine.setMessages(initialMessages, "replace");
|
|
55
|
+
syncState(initialMessages);
|
|
56
|
+
}
|
|
57
|
+
}, [initialMessages, chatEngine]);
|
|
58
|
+
return {
|
|
59
|
+
chatEngine: chatEngine,
|
|
60
|
+
messages: messages,
|
|
61
|
+
status: status
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export { useChat };
|
|
66
|
+
//# sourceMappingURL=useChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChat.js","sources":["../../../../pro-components/chat/chatbot/hooks/useChat.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport ChatEngine from 'tdesign-web-components/lib/chat-engine';\nimport type { ChatMessagesData, ChatServiceConfig, ChatStatus } from 'tdesign-web-components/lib/chat-engine';\n\nexport type IUseChat = {\n defaultMessages: ChatMessagesData[];\n chatServiceConfig: ChatServiceConfig;\n};\n\nexport const useChat = ({ defaultMessages: initialMessages, chatServiceConfig }: IUseChat) => {\n const chatEngineRef = useRef<ChatEngine>(new ChatEngine());\n const [messages, setMessage] = useState<ChatMessagesData[]>([]);\n const [status, setStatus] = useState<ChatStatus>('idle');\n const msgSubscribeRef = useRef<null | (() => void)>(null);\n const prevInitialMessagesRef = useRef<ChatMessagesData[]>([]);\n\n const chatEngine = chatEngineRef.current;\n\n const syncState = (state: ChatMessagesData[]) => {\n setMessage(state);\n setStatus(state.at(-1)?.status || 'idle');\n };\n\n const subscribeToChat = () => {\n // 清理之前的订阅\n msgSubscribeRef.current?.();\n\n msgSubscribeRef.current = chatEngine.messageStore.subscribe((state) => {\n syncState(state.messages);\n });\n };\n\n const initChat = () => {\n // @ts-ignore\n chatEngine.init(chatServiceConfig, initialMessages);\n // @ts-ignore\n syncState(initialMessages);\n subscribeToChat();\n };\n\n // 初始化聊天引擎\n useEffect(() => {\n initChat();\n return () => msgSubscribeRef.current?.();\n }, []);\n\n // 监听 defaultMessages 变化\n useEffect(() => {\n // 检查 initialMessages 是否真的发生了变化\n const hasChanged = JSON.stringify(prevInitialMessagesRef.current) !== JSON.stringify(initialMessages);\n\n if (hasChanged && initialMessages && initialMessages.length > 0) {\n // 更新引用\n prevInitialMessagesRef.current = initialMessages;\n\n // 重新初始化聊天引擎或更新消息\n chatEngine.setMessages(initialMessages, 'replace');\n\n // 同步状态\n syncState(initialMessages);\n }\n }, [initialMessages, chatEngine]);\n\n return {\n chatEngine,\n messages,\n status,\n };\n};\n"],"names":["useChat","initialMessages","_ref","defaultMessages","chatServiceConfig","chatEngineRef","useRef","ChatEngine","_useState","useState","_useState2","_slicedToArray","messages","setMessage","_useState3","_useState4","status","setStatus","msgSubscribeRef","prevInitialMessagesRef","chatEngine","current","syncState","state","_state$at","at","subscribeToChat","_msgSubscribeRef$curr","call","messageStore","subscribe","initChat","init","useEffect","_msgSubscribeRef$curr2","hasChanged","JSON","stringify","length","setMessages"],"mappings":"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"}
|
package/es/chatbot/index.js
CHANGED
package/es/index.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
export * from './chatbot';
|
|
2
2
|
export * from './chat-engine';
|
|
3
3
|
export * from './chat-actionbar';
|
|
4
|
-
export * from './
|
|
4
|
+
export * from './attachments';
|
|
5
5
|
export * from './chat-filecard';
|
|
6
6
|
export * from './chat-loading';
|
|
7
7
|
export * from './chat-markdown';
|
|
8
8
|
export * from './chat-message';
|
|
9
9
|
export * from './chat-sender';
|
|
10
10
|
export * from './chat-thinking';
|
|
11
|
-
export * from './chat-markdown';
|
package/es/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* tdesign v1.0.0
|
|
3
|
-
* (c)
|
|
2
|
+
* tdesign v1.0.2-alpha.0
|
|
3
|
+
* (c) 2026 tdesign
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
export { ChatBot, ChatList, ChatSearchContent, ChatSuggestionContent } from './chatbot/index.js';
|
|
8
8
|
import './chat-engine/index.js';
|
|
9
9
|
export { ChatActionBar } from './chat-actionbar/index.js';
|
|
10
|
-
export { Attachments } from './
|
|
10
|
+
export { Attachments } from './attachments/index.js';
|
|
11
11
|
export { Filecard } from './chat-filecard/index.js';
|
|
12
12
|
export { ChatLoading } from './chat-loading/index.js';
|
|
13
13
|
export { ChatMarkdown, MarkdownEngine } from './chat-markdown/index.js';
|
package/es/style/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tdesign-react/chat",
|
|
3
|
-
"version": "1.0.0",
|
|
3
|
+
"version": "1.0.2-alpha.0",
|
|
4
4
|
"title": "@tdesign-react/chat",
|
|
5
5
|
"description": "TDesign Pro Component for AIGC",
|
|
6
6
|
"module": "es/index.js",
|
|
@@ -25,8 +25,7 @@
|
|
|
25
25
|
"prebuild": "rimraf es/*",
|
|
26
26
|
"build": "cross-env NODE_ENV=production rollup -c script/rollup.config.js && npm run build:tsc",
|
|
27
27
|
"build:tsc": "run-p build:tsc-*",
|
|
28
|
-
"build:tsc-es": "tsc --emitDeclarationOnly -d -p ./tsconfig.build.json --outDir es/"
|
|
29
|
-
"build:jsx-demo": "npm run generate:jsx-demo && npm run format:jsx-demo"
|
|
28
|
+
"build:tsc-es": "tsc --emitDeclarationOnly -d -p ./tsconfig.build.json --outDir es/"
|
|
30
29
|
},
|
|
31
30
|
"config": {
|
|
32
31
|
"commitizen": {
|
|
@@ -51,7 +50,7 @@
|
|
|
51
50
|
},
|
|
52
51
|
"dependencies": {
|
|
53
52
|
"@babel/runtime": "~7.26.7",
|
|
54
|
-
"tdesign-web-components": "1.2.
|
|
53
|
+
"tdesign-web-components": "1.2.11-alpha.0",
|
|
55
54
|
"classnames": "~2.5.1",
|
|
56
55
|
"lodash-es": "^4.17.21",
|
|
57
56
|
"zod": "^3.24.2",
|
|
@@ -60,7 +59,7 @@
|
|
|
60
59
|
"devDependencies": {
|
|
61
60
|
"cors": "^2.8.5",
|
|
62
61
|
"tdesign-icons-react": "0.5.0",
|
|
63
|
-
"tdesign-react": "
|
|
62
|
+
"tdesign-react": "workspace:^",
|
|
64
63
|
"tvision-charts-react": "^3.3.12",
|
|
65
64
|
"express": "^4.17.3"
|
|
66
65
|
}
|