@ai-group/chat-sdk 3.4.6 → 3.5.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/dist/cjs/components/FolderTree/styles.js +2 -1
- package/dist/cjs/components/FolderTree/styles.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.d.ts +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +415 -389
- package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
- package/dist/cjs/components/XAdkThoughtChain/styles.d.ts +0 -1
- package/dist/cjs/components/XAdkThoughtChain/styles.js +0 -9
- package/dist/cjs/components/XAdkThoughtChain/styles.js.map +2 -2
- package/dist/cjs/hooks/useADKChat.js +2 -0
- package/dist/cjs/hooks/useADKChat.js.map +2 -2
- package/dist/cjs/presets/xGroupAdk.js +0 -1
- package/dist/cjs/presets/xGroupAdk.js.map +2 -2
- package/dist/cjs/types/XAdkChatbot.d.ts +12 -0
- package/dist/cjs/types/XAdkChatbot.js.map +1 -1
- package/dist/cjs/utils/umdEntry.d.ts +25 -1
- package/dist/cjs/utils/umdEntry.js +126 -41
- package/dist/cjs/utils/umdEntry.js.map +3 -3
- package/dist/esm/components/FolderTree/styles.js +1 -1
- package/dist/esm/components/FolderTree/styles.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.d.ts +2 -2
- package/dist/esm/components/XAdkChatbot/index.js +40 -9
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkThoughtChain/styles.d.ts +0 -1
- package/dist/esm/components/XAdkThoughtChain/styles.js +19 -20
- package/dist/esm/components/XAdkThoughtChain/styles.js.map +1 -1
- package/dist/esm/hooks/useADKChat.js +10 -6
- package/dist/esm/hooks/useADKChat.js.map +1 -1
- package/dist/esm/presets/xGroupAdk.js +0 -1
- package/dist/esm/presets/xGroupAdk.js.map +1 -1
- package/dist/esm/types/XAdkChatbot.d.ts +12 -0
- package/dist/esm/types/XAdkChatbot.js.map +1 -1
- package/dist/esm/utils/umdEntry.d.ts +25 -1
- package/dist/esm/utils/umdEntry.js +162 -70
- package/dist/esm/utils/umdEntry.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/types/XAdkChatbot.ts"],
|
|
4
|
-
"sourcesContent": ["import type { CSSProperties, JSX, ReactNode } from \"react\";\nimport { type XAdkSenderProps } from \"./XAdkSender\";\nimport { type SendContent } from \"./XAiSender\";\nimport { type FileItem } from \"./FileGallery\";\nimport { type ToolRenderKind } from \"./FunctionCallRender\";\nimport { type ChatPresetInput, type ChatStrategies } from \"./ChatStrategies\";\n\n/**\n * 消息分组接口\n */\nexport interface ChatGroup {\n id: string;\n role: \"user\" | \"bot\";\n msgs: IMessage[];\n invocationId?: string;\n allFiles: any[];\n /** 点赞状态: 1=赞, -1=踩, 0=未反馈 */\n isLike?: number;\n}\n\nexport interface IInvocation {\n id: string;\n name: string;\n spanId: string;\n traceId: string;\n parentSpanId: string;\n startTime: number;\n endTime: number;\n sessionId: string;\n invocationId: string;\n duration: number;\n attributes: Record<string, string>;\n botName: string;\n workspaceNo: string;\n status: number;\n agentName: string;\n agentNo: string;\n agentVersionNo: string;\n userId: string;\n}\n\nexport interface AgentRunRequest {\n stream?: boolean;\n sessionId: string | undefined;\n content: {\n parts: Array<{\n text?: string;\n functionResponse?: {\n id?: string;\n name?: string;\n response?: any;\n };\n }>;\n role: string;\n };\n files?: Array<{\n fileName: string;\n fileId?: string;\n tempUrl: string;\n type?: string;\n mimeType: string;\n }>;\n stateDelta?: any;\n}\nexport interface Blob {\n displayName?: string;\n mimeType?: string;\n data: string;\n}\n\nexport interface FunctionCall {\n id?: string;\n name: string;\n args: { [key: string]: any };\n}\n\nexport interface FunctionResponse {\n id?: string;\n name: string;\n response: { [key: string]: any };\n}\n\nexport interface FileData {\n displayName: string;\n mimeType: string;\n fileUri: string;\n}\n\nexport interface ExecutableCode {\n language: \"UNKNOWN\" | \"PYTHON\";\n code: string;\n}\n\nexport interface CodeExecutionResult {\n outcome: \"UNKNOWN\" | \"OK\" | \"FAILED\" | \"DEADLINE_EXCEEDED\";\n output: string;\n}\n\nexport interface Part {\n text?: string;\n inlineData?: Blob;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n thought?: boolean;\n fileData?: FileData;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n errorMessage?: string;\n}\n\nexport interface GenAiContent {\n role: string;\n parts: Part[];\n}\n\nexport interface LlmRequest {\n contents: GenAiContent[];\n}\n\nexport interface LlmResponse {\n partial?: boolean;\n content: GenAiContent;\n error?: string;\n errorMessage?: string;\n errorCode?: string;\n longRunningToolIds?: string[];\n}\n\nexport interface UsageMetadata {\n candidatesTokenCount?: number;\n promptTokenCount?: number;\n totalTokenCount?: number;\n [key: string]: any;\n}\n\nexport interface EventActions {\n message?: string;\n artifactDelta?: any;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n finishReason?: string;\n}\n\nexport interface Event extends LlmResponse {\n id?: string;\n author?: string;\n modelCode?: string;\n invocationId?: string;\n actions?: EventActions;\n longRunningToolIds?: string[];\n branch?: string;\n timestamp?: number;\n finishReason?: string;\n usageMetadata?: UsageMetadata;\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n groundingMetadata?: {\n searchEntryPoint?: {\n renderedContent?: any;\n };\n };\n isLike?: number;\n sessionId?: string;\n}\n\nexport interface SessionState {\n [key: string]: unknown;\n}\n\nexport interface Session {\n id?: string;\n appName?: string;\n userId?: string;\n state?: SessionState;\n events?: Event[];\n lastUpdateTime?: number;\n}\n\nexport interface TimeTick {\n position: number;\n label: string;\n}\n\nexport interface IMessage {\n /** 前端生成的唯一标识 */\n id: string;\n /** 单次请求的唯一标识 */\n invocationId?: string;\n /** 单个Event的唯一标识,一个event里有可能有多个parts的消息 */\n eventId?: string;\n /** 消息发起人:智能体名称、user */\n author?: string;\n role: \"bot\" | \"user\";\n /** 时间戳 */\n timestamp?: number;\n isLoading?: boolean;\n /** 函数调用 */\n functionCall?: FunctionCall;\n /** 函数调用结果 */\n functionResponse?: FunctionResponse;\n /** 文件上传 */\n inlineData?: Blob;\n /** 文本消息 */\n text?: string;\n /** 文件信息 */\n fileData?: FileData[];\n /** 思考 */\n thought?: boolean;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n renderedContent?: any;\n /** 原始数据 */\n raw?: any;\n /** 模型编码,通常来自 stream 事件或历史消息 */\n modelCode?: string;\n /** 事件级 token 使用量等模型调用元数据 */\n usageMetadata?: UsageMetadata;\n /** 结束原因,通常来自最后一条 stream 事件 */\n finishReason?: string;\n // 下面暂时没有用到\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n invocationIndex?: any;\n finalResponsePartIndex?: any;\n toolUseIndex?: any;\n /** 是否赞/踩 */\n isLike?: number;\n}\n\nexport type ActionProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => JSX.Element | null;\n\nexport type ActionExtraProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => ReactNode;\n\n/**\n * 自定义工具调用渲染函数\n * - 返回 ReactNode:使用自定义渲染\n * - 返回 null:降级使用默认渲染\n *\n * @example\n * renderFunctionCall={(msg) => {\n * if (msg.functionCall?.name === 'my_tool') return <MyToolRender msg={msg} />;\n * return null; // 其他工具使用默认渲染\n * }}\n */\nexport type RenderFunctionCall = (msg: IMessage) => ReactNode | null;\n\nexport interface XAdkChatbotProps extends Partial<XAdkSenderProps> {\n /**\n * 自定义工具调用渲染函数\n * 返回 null 则降级使用默认渲染\n */\n renderFunctionCall?: RenderFunctionCall;\n /**\n * 工具名 → 渲染类型的解析策略,默认使用 defaultToolKindResolver\n */\n toolKindResolver?: (name: string | undefined) => ToolRenderKind;\n /**\n * 聊天策略,可由 Provider preset 自动下发,也可在组件局部覆盖。\n */\n strategies?: ChatStrategies;\n /**\n * 组件直用时的协议预设。默认沿用 xgroup-adk 以兼容既有业务接入;\n * 需要中立行为时可传入 base。\n */\n preset?: ChatPresetInput;\n className?: string;\n style?: CSSProperties;\n // 加载状态\n loading?: boolean;\n /** 消息列表 */\n messages: IMessage[];\n /** 开场白 */\n prologue?: string;\n /** 建议回复 */\n suggestions?: string[];\n /** 欢迎页面 */\n welcome?: ReactNode;\n /** 显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 是否初始化完成,初始化完成后自动滚动到最新消息 */\n initialized?: boolean;\n /** 提交回调 */\n onSubmit?: ({ text, files }: SendContent) => void;\n /** 函数调用确认回调 */\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n /** 停止回调 */\n onStop?: () => void;\n /** 清除回调 */\n onClear?: () => void;\n /** 建议回复回调 */\n onSuggest?: (text: string) => void;\n\n // ========== 新增功能 ==========\n\n /** Agent 名称 (欢迎页面) */\n agentName?: string;\n /** Agent 图标 (欢迎页面) */\n agentIcon?: string;\n /** Agent 描述 (欢迎页面) */\n description?: string;\n\n /** 是否显示重试按钮 */\n showRetry?: boolean;\n /** 是否显示复制按钮 */\n showCopy?: boolean;\n /** 是否显示日志按钮 */\n showLog?: boolean;\n\n /** 重试回调 */\n onRetry?: () => void;\n /** 复制回调 */\n onCopy?: (text: string) => void;\n /** 查看日志回调 */\n onShowLog?: (invocationId: string, timestamp?: number) => void;\n\n /** 是否启用消息分组 (默认 true) */\n enableGrouping?: boolean;\n\n /** 是否自动解析 process 内容并展示思维链 (默认 true) */\n enableProcessParsing?: boolean;\n\n /** 消息功能区 */\n actions?: ActionProps;\n /** 追加在消息功能区之后的内容,适合展示 token 消耗等业务扩展信息 */\n actionsExtra?: ActionExtraProps;\n\n /**\n * Process 解析选项\n * @example\n * // 业务项目格式 (注释模式)\n * parseOptions={{ mode: 'comment' }}\n *\n * @example\n * // 自定义格式\n * parseOptions={{\n * mode: 'custom',\n * customPatterns: [\n * { regex: /\\[REASONING\\]([\\s\\S]*?)\\[\\/REASONING\\]/g, type: 'reasoning' }\n * ]\n * }}\n */\n parseOptions?: {\n mode?: \"xml\" | \"comment\" | \"custom\";\n customPatterns?: Array<{ regex: RegExp; type: string }>;\n finalMarker?: string;\n };\n\n /** 是否禁用输入 */\n disabled?: boolean;\n\n /** 是否流式响应 */\n stream?: boolean;\n\n /** 点击对话中附件卡片的回调(非图片、非音视频文件) */\n onFileClick?: (file: FileItem) => void;\n}\n"],
|
|
4
|
+
"sourcesContent": ["import type { CSSProperties, JSX, ReactNode } from \"react\";\nimport { type XAdkSenderProps } from \"./XAdkSender\";\nimport { type SendContent } from \"./XAiSender\";\nimport { type FileItem } from \"./FileGallery\";\nimport { type ToolRenderKind } from \"./FunctionCallRender\";\nimport { type ChatPresetInput, type ChatStrategies } from \"./ChatStrategies\";\n\n/**\n * XAdkChatbot 命令式 API\n */\nexport interface XAdkChatbotHandle {\n /** 手动滚动到底部 */\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n}\n\n/**\n * 消息分组接口\n */\nexport interface ChatGroup {\n id: string;\n role: \"user\" | \"bot\";\n msgs: IMessage[];\n invocationId?: string;\n allFiles: any[];\n /** 点赞状态: 1=赞, -1=踩, 0=未反馈 */\n isLike?: number;\n}\n\nexport interface IInvocation {\n id: string;\n name: string;\n spanId: string;\n traceId: string;\n parentSpanId: string;\n startTime: number;\n endTime: number;\n sessionId: string;\n invocationId: string;\n duration: number;\n attributes: Record<string, string>;\n botName: string;\n workspaceNo: string;\n status: number;\n agentName: string;\n agentNo: string;\n agentVersionNo: string;\n userId: string;\n}\n\nexport interface AgentRunRequest {\n stream?: boolean;\n sessionId: string | undefined;\n content: {\n parts: Array<{\n text?: string;\n functionResponse?: {\n id?: string;\n name?: string;\n response?: any;\n };\n }>;\n role: string;\n };\n files?: Array<{\n fileName: string;\n fileId?: string;\n tempUrl: string;\n type?: string;\n mimeType: string;\n }>;\n stateDelta?: any;\n}\nexport interface Blob {\n displayName?: string;\n mimeType?: string;\n data: string;\n}\n\nexport interface FunctionCall {\n id?: string;\n name: string;\n args: { [key: string]: any };\n}\n\nexport interface FunctionResponse {\n id?: string;\n name: string;\n response: { [key: string]: any };\n}\n\nexport interface FileData {\n displayName: string;\n mimeType: string;\n fileUri: string;\n}\n\nexport interface ExecutableCode {\n language: \"UNKNOWN\" | \"PYTHON\";\n code: string;\n}\n\nexport interface CodeExecutionResult {\n outcome: \"UNKNOWN\" | \"OK\" | \"FAILED\" | \"DEADLINE_EXCEEDED\";\n output: string;\n}\n\nexport interface Part {\n text?: string;\n inlineData?: Blob;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n thought?: boolean;\n fileData?: FileData;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n errorMessage?: string;\n}\n\nexport interface GenAiContent {\n role: string;\n parts: Part[];\n}\n\nexport interface LlmRequest {\n contents: GenAiContent[];\n}\n\nexport interface LlmResponse {\n partial?: boolean;\n content: GenAiContent;\n error?: string;\n errorMessage?: string;\n errorCode?: string;\n longRunningToolIds?: string[];\n}\n\nexport interface UsageMetadata {\n candidatesTokenCount?: number;\n promptTokenCount?: number;\n totalTokenCount?: number;\n [key: string]: any;\n}\n\nexport interface EventActions {\n message?: string;\n artifactDelta?: any;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n finishReason?: string;\n}\n\nexport interface Event extends LlmResponse {\n id?: string;\n author?: string;\n modelCode?: string;\n invocationId?: string;\n actions?: EventActions;\n longRunningToolIds?: string[];\n branch?: string;\n timestamp?: number;\n finishReason?: string;\n usageMetadata?: UsageMetadata;\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n groundingMetadata?: {\n searchEntryPoint?: {\n renderedContent?: any;\n };\n };\n isLike?: number;\n sessionId?: string;\n}\n\nexport interface SessionState {\n [key: string]: unknown;\n}\n\nexport interface Session {\n id?: string;\n appName?: string;\n userId?: string;\n state?: SessionState;\n events?: Event[];\n lastUpdateTime?: number;\n}\n\nexport interface TimeTick {\n position: number;\n label: string;\n}\n\nexport interface IMessage {\n /** 前端生成的唯一标识 */\n id: string;\n /** 单次请求的唯一标识 */\n invocationId?: string;\n /** 单个Event的唯一标识,一个event里有可能有多个parts的消息 */\n eventId?: string;\n /** 消息发起人:智能体名称、user */\n author?: string;\n role: \"bot\" | \"user\";\n /** 时间戳 */\n timestamp?: number;\n isLoading?: boolean;\n /** 函数调用 */\n functionCall?: FunctionCall;\n /** 函数调用结果 */\n functionResponse?: FunctionResponse;\n /** 文件上传 */\n inlineData?: Blob;\n /** 文本消息 */\n text?: string;\n /** 文件信息 */\n fileData?: FileData[];\n /** 思考 */\n thought?: boolean;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n renderedContent?: any;\n /** 原始数据 */\n raw?: any;\n /** 模型编码,通常来自 stream 事件或历史消息 */\n modelCode?: string;\n /** 事件级 token 使用量等模型调用元数据 */\n usageMetadata?: UsageMetadata;\n /** 结束原因,通常来自最后一条 stream 事件 */\n finishReason?: string;\n // 下面暂时没有用到\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n invocationIndex?: any;\n finalResponsePartIndex?: any;\n toolUseIndex?: any;\n /** 是否赞/踩 */\n isLike?: number;\n}\n\nexport type ActionProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => JSX.Element | null;\n\nexport type ActionExtraProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => ReactNode;\n\n/**\n * 自定义工具调用渲染函数\n * - 返回 ReactNode:使用自定义渲染\n * - 返回 null:降级使用默认渲染\n *\n * @example\n * renderFunctionCall={(msg) => {\n * if (msg.functionCall?.name === 'my_tool') return <MyToolRender msg={msg} />;\n * return null; // 其他工具使用默认渲染\n * }}\n */\nexport type RenderFunctionCall = (msg: IMessage) => ReactNode | null;\n\nexport interface XAdkChatbotProps extends Partial<XAdkSenderProps> {\n /**\n * 自定义工具调用渲染函数\n * 返回 null 则降级使用默认渲染\n */\n renderFunctionCall?: RenderFunctionCall;\n /**\n * 工具名 → 渲染类型的解析策略,默认使用 defaultToolKindResolver\n */\n toolKindResolver?: (name: string | undefined) => ToolRenderKind;\n /**\n * 聊天策略,可由 Provider preset 自动下发,也可在组件局部覆盖。\n */\n strategies?: ChatStrategies;\n /**\n * 组件直用时的协议预设。默认沿用 xgroup-adk 以兼容既有业务接入;\n * 需要中立行为时可传入 base。\n */\n preset?: ChatPresetInput;\n className?: string;\n style?: CSSProperties;\n // 加载状态\n loading?: boolean;\n /** 消息列表 */\n messages: IMessage[];\n /** 开场白 */\n prologue?: string;\n /** 建议回复 */\n suggestions?: string[];\n /** 欢迎页面 */\n welcome?: ReactNode;\n /** 显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 是否初始化完成,初始化完成后自动滚动到最新消息 */\n initialized?: boolean;\n /**\n * 当前会话 ID,切换时自动重置滚动状态并置底。\n * 不传则退化为仅依赖 initialized 的单次置底行为。\n */\n sessionId?: string;\n /** 提交回调 */\n onSubmit?: ({ text, files }: SendContent) => void;\n /** 函数调用确认回调 */\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n /** 停止回调 */\n onStop?: () => void;\n /** 清除回调 */\n onClear?: () => void;\n /** 建议回复回调 */\n onSuggest?: (text: string) => void;\n\n // ========== 新增功能 ==========\n\n /** Agent 名称 (欢迎页面) */\n agentName?: string;\n /** Agent 图标 (欢迎页面) */\n agentIcon?: string;\n /** Agent 描述 (欢迎页面) */\n description?: string;\n\n /** 是否显示重试按钮 */\n showRetry?: boolean;\n /** 是否显示复制按钮 */\n showCopy?: boolean;\n /** 是否显示日志按钮 */\n showLog?: boolean;\n\n /** 重试回调 */\n onRetry?: () => void;\n /** 复制回调 */\n onCopy?: (text: string) => void;\n /** 查看日志回调 */\n onShowLog?: (invocationId: string, timestamp?: number) => void;\n\n /** 是否启用消息分组 (默认 true) */\n enableGrouping?: boolean;\n\n /** 是否自动解析 process 内容并展示思维链 (默认 true) */\n enableProcessParsing?: boolean;\n\n /** 消息功能区 */\n actions?: ActionProps;\n /** 追加在消息功能区之后的内容,适合展示 token 消耗等业务扩展信息 */\n actionsExtra?: ActionExtraProps;\n\n /**\n * Process 解析选项\n * @example\n * // 业务项目格式 (注释模式)\n * parseOptions={{ mode: 'comment' }}\n *\n * @example\n * // 自定义格式\n * parseOptions={{\n * mode: 'custom',\n * customPatterns: [\n * { regex: /\\[REASONING\\]([\\s\\S]*?)\\[\\/REASONING\\]/g, type: 'reasoning' }\n * ]\n * }}\n */\n parseOptions?: {\n mode?: \"xml\" | \"comment\" | \"custom\";\n customPatterns?: Array<{ regex: RegExp; type: string }>;\n finalMarker?: string;\n };\n\n /** 是否禁用输入 */\n disabled?: boolean;\n\n /** 是否流式响应 */\n stream?: boolean;\n\n /** 点击对话中附件卡片的回调(非图片、非音视频文件) */\n onFileClick?: (file: FileItem) => void;\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { XAdkSDKProps, XAdkProviderHandle, IMessage } from "../types";
|
|
3
3
|
import { SendContent } from "../types";
|
|
4
|
+
/**
|
|
5
|
+
* 内部包装组件:管理 token 状态,支持运行时动态更新
|
|
6
|
+
*/
|
|
7
|
+
interface WrapperHandle extends XAdkProviderHandle {
|
|
8
|
+
setToken: (token: string) => void;
|
|
9
|
+
}
|
|
4
10
|
/**
|
|
5
11
|
* XAiWebSDK - UMD 入口类
|
|
6
12
|
*
|
|
@@ -20,6 +26,9 @@ import { SendContent } from "../types";
|
|
|
20
26
|
* }
|
|
21
27
|
* }
|
|
22
28
|
* });
|
|
29
|
+
*
|
|
30
|
+
* // token 过期后动态更新
|
|
31
|
+
* sdk.setToken('new-token');
|
|
23
32
|
* </script>
|
|
24
33
|
* ```
|
|
25
34
|
*/
|
|
@@ -27,7 +36,7 @@ declare class XAiWebSDK {
|
|
|
27
36
|
container: HTMLElement;
|
|
28
37
|
props: XAdkSDKProps;
|
|
29
38
|
root: any;
|
|
30
|
-
|
|
39
|
+
wrapperRef: import("react").RefObject<WrapperHandle | null>;
|
|
31
40
|
onError?: (error: any) => void;
|
|
32
41
|
onSuccess?: (appInfo: any) => void;
|
|
33
42
|
onMessage?: (content: string, data: IMessage) => void;
|
|
@@ -69,6 +78,21 @@ declare class XAiWebSDK {
|
|
|
69
78
|
* @deprecated 使用 initChatbot 替代
|
|
70
79
|
*/
|
|
71
80
|
static create(props: XAdkSDKProps): XAiWebSDK;
|
|
81
|
+
/**
|
|
82
|
+
* 动态更新认证 token
|
|
83
|
+
*
|
|
84
|
+
* 用于 token 过期后刷新,更新后后续的 API 请求将使用新 token,无需重新初始化 SDK。
|
|
85
|
+
*
|
|
86
|
+
* @param token - 新的认证 token
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```javascript
|
|
90
|
+
* // 监听到 token 过期后
|
|
91
|
+
* const newToken = await refreshToken();
|
|
92
|
+
* sdk.setToken(newToken);
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
setToken(token: string): void;
|
|
72
96
|
/**
|
|
73
97
|
* 获取当前数据(聚合方法)
|
|
74
98
|
* @returns 应用信息、消息列表、会话列表
|
|
@@ -36,9 +36,88 @@ var import_react = require("react");
|
|
|
36
36
|
var import_client = __toESM(require("react-dom/client"));
|
|
37
37
|
var import_XAdkProvider = __toESM(require("../components/XAdkProvider"));
|
|
38
38
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
39
|
+
var SDKWrapper = (0, import_react.forwardRef)(
|
|
40
|
+
({
|
|
41
|
+
token: initialToken,
|
|
42
|
+
showSessionList,
|
|
43
|
+
allowUpload,
|
|
44
|
+
draggable,
|
|
45
|
+
clearBtnShow,
|
|
46
|
+
...rest
|
|
47
|
+
}, ref) => {
|
|
48
|
+
const [token, setToken] = (0, import_react.useState)(initialToken);
|
|
49
|
+
const providerRef = (0, import_react.createRef)();
|
|
50
|
+
(0, import_react.useImperativeHandle)(
|
|
51
|
+
ref,
|
|
52
|
+
() => ({
|
|
53
|
+
setToken,
|
|
54
|
+
startChat: (content) => {
|
|
55
|
+
var _a;
|
|
56
|
+
return (_a = providerRef.current) == null ? void 0 : _a.startChat(content);
|
|
57
|
+
},
|
|
58
|
+
stopChat: () => {
|
|
59
|
+
var _a;
|
|
60
|
+
return (_a = providerRef.current) == null ? void 0 : _a.stopChat();
|
|
61
|
+
},
|
|
62
|
+
reChat: () => {
|
|
63
|
+
var _a;
|
|
64
|
+
return (_a = providerRef.current) == null ? void 0 : _a.reChat();
|
|
65
|
+
},
|
|
66
|
+
clearChat: () => {
|
|
67
|
+
var _a;
|
|
68
|
+
return (_a = providerRef.current) == null ? void 0 : _a.clearChat();
|
|
69
|
+
},
|
|
70
|
+
deleteSession: (id) => {
|
|
71
|
+
var _a;
|
|
72
|
+
return (_a = providerRef.current) == null ? void 0 : _a.deleteSession(id);
|
|
73
|
+
},
|
|
74
|
+
updateSession: (id, title) => {
|
|
75
|
+
var _a;
|
|
76
|
+
return (_a = providerRef.current) == null ? void 0 : _a.updateSession(id, title);
|
|
77
|
+
},
|
|
78
|
+
getAppInfo: () => {
|
|
79
|
+
var _a;
|
|
80
|
+
return (_a = providerRef.current) == null ? void 0 : _a.getAppInfo();
|
|
81
|
+
},
|
|
82
|
+
getMessages: () => {
|
|
83
|
+
var _a;
|
|
84
|
+
return ((_a = providerRef.current) == null ? void 0 : _a.getMessages()) ?? [];
|
|
85
|
+
},
|
|
86
|
+
getSessions: () => {
|
|
87
|
+
var _a;
|
|
88
|
+
return ((_a = providerRef.current) == null ? void 0 : _a.getSessions()) ?? [];
|
|
89
|
+
},
|
|
90
|
+
setMessages: (msgs) => {
|
|
91
|
+
var _a;
|
|
92
|
+
return (_a = providerRef.current) == null ? void 0 : _a.setMessages(msgs);
|
|
93
|
+
},
|
|
94
|
+
setCurrentSession: (id) => {
|
|
95
|
+
var _a;
|
|
96
|
+
return (_a = providerRef.current) == null ? void 0 : _a.setCurrentSession(id);
|
|
97
|
+
},
|
|
98
|
+
setStateDelta: (delta) => {
|
|
99
|
+
var _a;
|
|
100
|
+
return (_a = providerRef.current) == null ? void 0 : _a.setStateDelta(delta);
|
|
101
|
+
}
|
|
102
|
+
}),
|
|
103
|
+
[providerRef]
|
|
104
|
+
);
|
|
105
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_XAdkProvider.default, { ref: providerRef, ...rest, token, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
106
|
+
import_XAdkProvider.default.DefaultLayout,
|
|
107
|
+
{
|
|
108
|
+
showSessionList,
|
|
109
|
+
allowUpload,
|
|
110
|
+
draggable,
|
|
111
|
+
clearBtnShow,
|
|
112
|
+
showFnCallDetail: true
|
|
113
|
+
}
|
|
114
|
+
) });
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
SDKWrapper.displayName = "SDKWrapper";
|
|
39
118
|
var XAiWebSDK = class {
|
|
40
119
|
constructor(container, props) {
|
|
41
|
-
this.
|
|
120
|
+
this.wrapperRef = (0, import_react.createRef)();
|
|
42
121
|
this.container = container;
|
|
43
122
|
this.props = props;
|
|
44
123
|
this.onError = props.onError;
|
|
@@ -53,34 +132,22 @@ var XAiWebSDK = class {
|
|
|
53
132
|
const allowUpload = config.allowUpload ?? false;
|
|
54
133
|
const draggable = config.draggable ?? true;
|
|
55
134
|
const clearBtnShow = ((_b = config.chatProps) == null ? void 0 : _b.clearBtnShow) ?? true;
|
|
135
|
+
const element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
136
|
+
SDKWrapper,
|
|
137
|
+
{
|
|
138
|
+
ref: this.wrapperRef,
|
|
139
|
+
...this.props,
|
|
140
|
+
showSessionList,
|
|
141
|
+
allowUpload,
|
|
142
|
+
draggable,
|
|
143
|
+
clearBtnShow
|
|
144
|
+
}
|
|
145
|
+
) });
|
|
56
146
|
if (import_client.default.createRoot) {
|
|
57
147
|
this.root = import_client.default.createRoot(this.container);
|
|
58
|
-
this.root.render(
|
|
59
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_XAdkProvider.default, { ref: this.providerRef, ...this.props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
60
|
-
import_XAdkProvider.default.DefaultLayout,
|
|
61
|
-
{
|
|
62
|
-
showSessionList,
|
|
63
|
-
allowUpload,
|
|
64
|
-
draggable,
|
|
65
|
-
clearBtnShow,
|
|
66
|
-
showFnCallDetail: true
|
|
67
|
-
}
|
|
68
|
-
) }) })
|
|
69
|
-
);
|
|
148
|
+
this.root.render(element);
|
|
70
149
|
} else {
|
|
71
|
-
import_client.default.render(
|
|
72
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_XAdkProvider.default, { ref: this.providerRef, ...this.props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
73
|
-
import_XAdkProvider.default.DefaultLayout,
|
|
74
|
-
{
|
|
75
|
-
showSessionList,
|
|
76
|
-
allowUpload,
|
|
77
|
-
draggable,
|
|
78
|
-
clearBtnShow,
|
|
79
|
-
showFnCallDetail: true
|
|
80
|
-
}
|
|
81
|
-
) }) }),
|
|
82
|
-
this.container
|
|
83
|
-
);
|
|
150
|
+
import_client.default.render(element, this.container);
|
|
84
151
|
}
|
|
85
152
|
}
|
|
86
153
|
unmount() {
|
|
@@ -151,6 +218,24 @@ var XAiWebSDK = class {
|
|
|
151
218
|
return this.initChatbot(props);
|
|
152
219
|
}
|
|
153
220
|
// ————对外暴露的方法————
|
|
221
|
+
/**
|
|
222
|
+
* 动态更新认证 token
|
|
223
|
+
*
|
|
224
|
+
* 用于 token 过期后刷新,更新后后续的 API 请求将使用新 token,无需重新初始化 SDK。
|
|
225
|
+
*
|
|
226
|
+
* @param token - 新的认证 token
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```javascript
|
|
230
|
+
* // 监听到 token 过期后
|
|
231
|
+
* const newToken = await refreshToken();
|
|
232
|
+
* sdk.setToken(newToken);
|
|
233
|
+
* ```
|
|
234
|
+
*/
|
|
235
|
+
setToken(token) {
|
|
236
|
+
var _a;
|
|
237
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.setToken(token);
|
|
238
|
+
}
|
|
154
239
|
/**
|
|
155
240
|
* 获取当前数据(聚合方法)
|
|
156
241
|
* @returns 应用信息、消息列表、会话列表
|
|
@@ -158,9 +243,9 @@ var XAiWebSDK = class {
|
|
|
158
243
|
getData() {
|
|
159
244
|
var _a, _b, _c;
|
|
160
245
|
return {
|
|
161
|
-
appInfo: (_a = this.
|
|
162
|
-
messages: (_b = this.
|
|
163
|
-
sessions: (_c = this.
|
|
246
|
+
appInfo: (_a = this.wrapperRef.current) == null ? void 0 : _a.getAppInfo(),
|
|
247
|
+
messages: (_b = this.wrapperRef.current) == null ? void 0 : _b.getMessages(),
|
|
248
|
+
sessions: (_c = this.wrapperRef.current) == null ? void 0 : _c.getSessions()
|
|
164
249
|
};
|
|
165
250
|
}
|
|
166
251
|
/**
|
|
@@ -169,7 +254,7 @@ var XAiWebSDK = class {
|
|
|
169
254
|
*/
|
|
170
255
|
getAppInfo() {
|
|
171
256
|
var _a;
|
|
172
|
-
return (_a = this.
|
|
257
|
+
return (_a = this.wrapperRef.current) == null ? void 0 : _a.getAppInfo();
|
|
173
258
|
}
|
|
174
259
|
/**
|
|
175
260
|
* 获取当前会话的消息列表
|
|
@@ -177,7 +262,7 @@ var XAiWebSDK = class {
|
|
|
177
262
|
*/
|
|
178
263
|
getMessages() {
|
|
179
264
|
var _a;
|
|
180
|
-
return (_a = this.
|
|
265
|
+
return (_a = this.wrapperRef.current) == null ? void 0 : _a.getMessages();
|
|
181
266
|
}
|
|
182
267
|
/**
|
|
183
268
|
* 获取会话列表
|
|
@@ -185,7 +270,7 @@ var XAiWebSDK = class {
|
|
|
185
270
|
*/
|
|
186
271
|
getSessions() {
|
|
187
272
|
var _a;
|
|
188
|
-
return (_a = this.
|
|
273
|
+
return (_a = this.wrapperRef.current) == null ? void 0 : _a.getSessions();
|
|
189
274
|
}
|
|
190
275
|
/**
|
|
191
276
|
* 设置消息列表
|
|
@@ -193,7 +278,7 @@ var XAiWebSDK = class {
|
|
|
193
278
|
*/
|
|
194
279
|
setMessages(msgs) {
|
|
195
280
|
var _a;
|
|
196
|
-
(_a = this.
|
|
281
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.setMessages(msgs);
|
|
197
282
|
}
|
|
198
283
|
/**
|
|
199
284
|
* 发送消息
|
|
@@ -206,28 +291,28 @@ var XAiWebSDK = class {
|
|
|
206
291
|
*/
|
|
207
292
|
startChat(content) {
|
|
208
293
|
var _a;
|
|
209
|
-
(_a = this.
|
|
294
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.startChat(content);
|
|
210
295
|
}
|
|
211
296
|
/**
|
|
212
297
|
* 停止当前消息生成
|
|
213
298
|
*/
|
|
214
299
|
stopChat() {
|
|
215
300
|
var _a;
|
|
216
|
-
(_a = this.
|
|
301
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.stopChat();
|
|
217
302
|
}
|
|
218
303
|
/**
|
|
219
304
|
* 重新生成最后一条回复
|
|
220
305
|
*/
|
|
221
306
|
reChat() {
|
|
222
307
|
var _a;
|
|
223
|
-
(_a = this.
|
|
308
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.reChat();
|
|
224
309
|
}
|
|
225
310
|
/**
|
|
226
311
|
* 清空当前会话
|
|
227
312
|
*/
|
|
228
313
|
clearChat() {
|
|
229
314
|
var _a;
|
|
230
|
-
(_a = this.
|
|
315
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.clearChat();
|
|
231
316
|
}
|
|
232
317
|
/**
|
|
233
318
|
* 切换到指定会话
|
|
@@ -235,7 +320,7 @@ var XAiWebSDK = class {
|
|
|
235
320
|
*/
|
|
236
321
|
setCurrentSession(sessionId) {
|
|
237
322
|
var _a;
|
|
238
|
-
(_a = this.
|
|
323
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.setCurrentSession(sessionId);
|
|
239
324
|
}
|
|
240
325
|
/**
|
|
241
326
|
* 删除指定会话
|
|
@@ -243,7 +328,7 @@ var XAiWebSDK = class {
|
|
|
243
328
|
*/
|
|
244
329
|
deleteSession(sessionId) {
|
|
245
330
|
var _a;
|
|
246
|
-
(_a = this.
|
|
331
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.deleteSession(sessionId);
|
|
247
332
|
}
|
|
248
333
|
/**
|
|
249
334
|
* 更新会话标题
|
|
@@ -252,7 +337,7 @@ var XAiWebSDK = class {
|
|
|
252
337
|
*/
|
|
253
338
|
updateSession(sessionId, title) {
|
|
254
339
|
var _a;
|
|
255
|
-
(_a = this.
|
|
340
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.updateSession(sessionId, title);
|
|
256
341
|
}
|
|
257
342
|
/**
|
|
258
343
|
* 设置自定义业务参数 (stateDelta)
|
|
@@ -261,7 +346,7 @@ var XAiWebSDK = class {
|
|
|
261
346
|
*/
|
|
262
347
|
setStateDelta(delta) {
|
|
263
348
|
var _a;
|
|
264
|
-
(_a = this.
|
|
349
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.setStateDelta(delta);
|
|
265
350
|
}
|
|
266
351
|
};
|
|
267
352
|
window.XAiWebSDK = XAiWebSDK;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/utils/umdEntry.tsx"],
|
|
4
|
-
"sourcesContent": ["import { createRef } from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { XAdkSDKProps, XAdkProviderHandle, IMessage } from \"@/types\";\nimport XAdkProvider from \"@/components/XAdkProvider\";\nimport { SendContent } from \"@/types\";\n\n/**\n * XAiWebSDK - UMD 入口类\n *\n * 用于通过 <script> 标签引入 SDK 的场景\n *\n * @example\n * ```html\n * <script src=\"chat-sdk.min.js\"></script>\n * <script>\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true\n * }\n * }\n * });\n * </script>\n * ```\n */\nclass XAiWebSDK {\n container: HTMLElement;\n\n props: XAdkSDKProps;\n\n root: any;\n\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["import { createRef, useState, useImperativeHandle, forwardRef } from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { XAdkSDKProps, XAdkProviderHandle, IMessage } from \"@/types\";\nimport XAdkProvider from \"@/components/XAdkProvider\";\nimport { SendContent } from \"@/types\";\n\n/**\n * 内部包装组件:管理 token 状态,支持运行时动态更新\n */\ninterface WrapperHandle extends XAdkProviderHandle {\n setToken: (token: string) => void;\n}\n\ninterface WrapperProps extends Omit<XAdkSDKProps, \"children\"> {\n showSessionList: boolean;\n allowUpload: boolean;\n draggable: boolean;\n clearBtnShow: boolean;\n}\n\nconst SDKWrapper = forwardRef<WrapperHandle, WrapperProps>(\n (\n {\n token: initialToken,\n showSessionList,\n allowUpload,\n draggable,\n clearBtnShow,\n ...rest\n },\n ref,\n ) => {\n const [token, setToken] = useState(initialToken);\n const providerRef = createRef<XAdkProviderHandle>();\n\n useImperativeHandle(\n ref,\n () => ({\n setToken,\n startChat: (content: SendContent) =>\n providerRef.current?.startChat(content),\n stopChat: () => providerRef.current?.stopChat(),\n reChat: () => providerRef.current?.reChat(),\n clearChat: () => providerRef.current?.clearChat(),\n deleteSession: (id: string) =>\n providerRef.current?.deleteSession(id),\n updateSession: (id: string, title: string) =>\n providerRef.current?.updateSession(id, title),\n getAppInfo: () => providerRef.current?.getAppInfo(),\n getMessages: () => providerRef.current?.getMessages() ?? [],\n getSessions: () => providerRef.current?.getSessions() ?? [],\n setMessages: (msgs: IMessage[]) =>\n providerRef.current?.setMessages(msgs),\n setCurrentSession: (id: string) =>\n providerRef.current?.setCurrentSession(id),\n setStateDelta: (delta: Record<string, any> | undefined) =>\n providerRef.current?.setStateDelta(delta),\n }),\n [providerRef],\n );\n\n return (\n <XAdkProvider ref={providerRef} {...rest} token={token}>\n <XAdkProvider.DefaultLayout\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n draggable={draggable}\n clearBtnShow={clearBtnShow}\n showFnCallDetail={true}\n />\n </XAdkProvider>\n );\n },\n);\n\nSDKWrapper.displayName = \"SDKWrapper\";\n\n/**\n * XAiWebSDK - UMD 入口类\n *\n * 用于通过 <script> 标签引入 SDK 的场景\n *\n * @example\n * ```html\n * <script src=\"chat-sdk.min.js\"></script>\n * <script>\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true\n * }\n * }\n * });\n *\n * // token 过期后动态更新\n * sdk.setToken('new-token');\n * </script>\n * ```\n */\nclass XAiWebSDK {\n container: HTMLElement;\n\n props: XAdkSDKProps;\n\n root: any;\n\n wrapperRef = createRef<WrapperHandle>();\n\n // ———— hook ————\n onError?: (error: any) => void;\n\n onSuccess?: (appInfo: any) => void;\n\n onMessage?: (content: string, data: IMessage) => void;\n\n constructor(container: HTMLElement, props: XAdkSDKProps) {\n this.container = container;\n this.props = props;\n this.onError = props.onError;\n this.onSuccess = props.onSuccess;\n this.onMessage = props.onMessage;\n this.mount();\n }\n\n mount() {\n // 提取配置\n const { config = {} } = this.props;\n const showSessionList = config.session?.showSessionList ?? false;\n const allowUpload = config.allowUpload ?? false;\n const draggable = config.draggable ?? true;\n const clearBtnShow = config.chatProps?.clearBtnShow ?? true;\n\n const element = (\n <div style={{ width: \"100%\", height: \"100%\" }}>\n <SDKWrapper\n ref={this.wrapperRef}\n {...this.props}\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n draggable={draggable}\n clearBtnShow={clearBtnShow}\n />\n </div>\n );\n\n if (ReactDOM.createRoot) {\n this.root = ReactDOM.createRoot(this.container);\n this.root.render(element);\n } else {\n // 兼容 React 17\n // @ts-ignore\n ReactDOM.render(element, this.container);\n }\n }\n\n unmount() {\n if (this.root && this.root.unmount) {\n this.root.unmount();\n }\n }\n\n /**\n * 初始化聊天机器人(推荐方式)\n *\n * @param props - SDK 配置参数\n * @returns XAiWebSDK 实例\n *\n * @example\n * ```javascript\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true // 显示会话列表\n * },\n * allowUpload: true, // 允许文件上传\n * chatProps: {\n * clearBtnShow: false // 隐藏清空按钮\n * }\n * },\n * componentProps: {\n * id: 'my-chatbot', // 容器 ID\n * width: '100%',\n * height: '600px'\n * }\n * });\n * ```\n */\n static initChatbot(props: XAdkSDKProps): XAiWebSDK {\n let container: HTMLElement;\n\n // 检查是否有指定的 componentProps.id\n if (props.componentProps?.id) {\n const existingContainer = document.getElementById(\n props.componentProps.id,\n );\n if (existingContainer) {\n container = existingContainer;\n } else {\n // 如果指定的 ID 不存在,创建新元素\n container = document.createElement(\"div\");\n container.id = props.componentProps.id;\n }\n } else {\n // 没有指定 ID,创建默认容器\n container = document.createElement(\"div\");\n container.id = \"xai-chatbot-container\";\n }\n\n // 设置容器样式 - 将除了 id 以外的所有属性都应用到容器\n if (props.componentProps) {\n const { id, ...styleProps } = props.componentProps;\n Object.assign(container.style, styleProps);\n }\n\n // 如果容器不在 DOM 中,添加到 body\n if (!container.parentNode) {\n document.body.appendChild(container);\n }\n\n return new XAiWebSDK(container, props);\n }\n\n /**\n * 兼容旧版本的静态方法\n * @deprecated 使用 initChatbot 替代\n */\n static create(props: XAdkSDKProps): XAiWebSDK {\n return this.initChatbot(props);\n }\n\n // ————对外暴露的方法————\n\n /**\n * 动态更新认证 token\n *\n * 用于 token 过期后刷新,更新后后续的 API 请求将使用新 token,无需重新初始化 SDK。\n *\n * @param token - 新的认证 token\n *\n * @example\n * ```javascript\n * // 监听到 token 过期后\n * const newToken = await refreshToken();\n * sdk.setToken(newToken);\n * ```\n */\n setToken(token: string) {\n this.wrapperRef.current?.setToken(token);\n }\n\n /**\n * 获取当前数据(聚合方法)\n * @returns 应用信息、消息列表、会话列表\n */\n getData() {\n return {\n appInfo: this.wrapperRef.current?.getAppInfo(),\n messages: this.wrapperRef.current?.getMessages(),\n sessions: this.wrapperRef.current?.getSessions(),\n };\n }\n\n /**\n * 获取应用信息\n * @returns 应用信息\n */\n getAppInfo() {\n return this.wrapperRef.current?.getAppInfo();\n }\n\n /**\n * 获取当前会话的消息列表\n * @returns 消息列表\n */\n getMessages() {\n return this.wrapperRef.current?.getMessages();\n }\n\n /**\n * 获取会话列表\n * @returns 会话列表\n */\n getSessions() {\n return this.wrapperRef.current?.getSessions();\n }\n\n /**\n * 设置消息列表\n * @param msgs - 要设置的消息数组\n */\n setMessages(msgs: IMessage[]) {\n this.wrapperRef.current?.setMessages(msgs);\n }\n\n /**\n * 发送消息\n * @param content - 消息内容\n *\n * @example\n * ```javascript\n * sdk.startChat({ text: 'Hello!' });\n * ```\n */\n startChat(content: SendContent) {\n this.wrapperRef.current?.startChat(content);\n }\n\n /**\n * 停止当前消息生成\n */\n stopChat() {\n this.wrapperRef.current?.stopChat();\n }\n\n /**\n * 重新生成最后一条回复\n */\n reChat() {\n this.wrapperRef.current?.reChat();\n }\n\n /**\n * 清空当前会话\n */\n clearChat() {\n this.wrapperRef.current?.clearChat();\n }\n\n /**\n * 切换到指定会话\n * @param sessionId - 会话 ID\n */\n setCurrentSession(sessionId: string) {\n this.wrapperRef.current?.setCurrentSession(sessionId);\n }\n\n /**\n * 删除指定会话\n * @param sessionId - 会话 ID\n */\n deleteSession(sessionId: string) {\n this.wrapperRef.current?.deleteSession(sessionId);\n }\n\n /**\n * 更新会话标题\n * @param sessionId - 会话 ID\n * @param title - 新标题\n */\n updateSession(sessionId: string, title: string) {\n this.wrapperRef.current?.updateSession(sessionId, title);\n }\n\n /**\n * 设置自定义业务参数 (stateDelta)\n * 设置后每次发送消息时会自动携带至后端\n * @param delta - 自定义参数,传入 undefined 可清除\n */\n setStateDelta(delta: Record<string, any> | undefined) {\n this.wrapperRef.current?.setStateDelta(delta);\n }\n}\n\n// 兼容 window 方式,也支持 new\n// @ts-ignore\nwindow.XAiWebSDK = XAiWebSDK;\n\n// 支持 ESModule/UMD 直接 import\nexport default XAiWebSDK;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["XAdkProvider", "ReactDOM"]
|
|
7
7
|
}
|
|
@@ -15,7 +15,7 @@ export var useStyles = withBasicStyles(function () {
|
|
|
15
15
|
emptyContainer: css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
|
|
16
16
|
loadingContainer: css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
|
|
17
17
|
treeNodeTitle: css(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n "]))),
|
|
18
|
-
moreIcon: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n opacity: 0;\n cursor: pointer;\n padding:
|
|
18
|
+
moreIcon: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n border-radius: 4px;\n color: #999;\n font-size: 14px;\n transition: all 0.2s;\n &:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n "]))),
|
|
19
19
|
treeNodeTitleHover: css(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n "]))),
|
|
20
20
|
copyBtn: css(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n "])))
|
|
21
21
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","containerNoPreview","_templateObject2","directoryPanel","_templateObject3","directoryTitle","_templateObject4","directoryTreeContent","_templateObject5","previewPanel","_templateObject6","previewTitle","_templateObject7","previewContent","_templateObject8","emptyContainer","_templateObject9","loadingContainer","_templateObject10","treeNodeTitle","_templateObject11","moreIcon","_templateObject12","treeNodeTitleHover","_templateObject13","copyBtn","_templateObject14"],"sources":["../../../../src/components/FolderTree/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n `,\n containerNoPreview: css`\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n `,\n directoryPanel: css`\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n `,\n directoryTitle: css`\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n `,\n directoryTreeContent: css`\n padding: 4px 0;\n .ant-tree {\n background: transparent;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n }\n .ant-tree-directory .ant-tree-treenode {\n &::before {\n border-radius: 4px;\n }\n }\n /* 拖拽指示线:蓝色虚线 */\n .ant-tree .ant-tree-drop-indicator {\n background: transparent !important;\n border: 1px dashed #1677ff;\n height: 2px;\n }\n /* 拖拽悬停目标:蓝色虚线边框 */\n .ant-tree .ant-tree-treenode.drag-over > .ant-tree-node-content-wrapper {\n outline: 1px dashed #1677ff;\n outline-offset: -1px;\n border-radius: 4px;\n }\n /* 拖拽中的节点半透明 */\n .ant-tree .ant-tree-treenode-dragging {\n opacity: 0.4;\n }\n `,\n previewPanel: css`\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `,\n previewTitle: css`\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n `,\n previewContent: css`\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n `,\n emptyContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n loadingContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n treeNodeTitle: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n `,\n moreIcon: css`\n opacity: 0;\n cursor: pointer;\n padding:
|
|
1
|
+
{"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","containerNoPreview","_templateObject2","directoryPanel","_templateObject3","directoryTitle","_templateObject4","directoryTreeContent","_templateObject5","previewPanel","_templateObject6","previewTitle","_templateObject7","previewContent","_templateObject8","emptyContainer","_templateObject9","loadingContainer","_templateObject10","treeNodeTitle","_templateObject11","moreIcon","_templateObject12","treeNodeTitleHover","_templateObject13","copyBtn","_templateObject14"],"sources":["../../../../src/components/FolderTree/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n `,\n containerNoPreview: css`\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n `,\n directoryPanel: css`\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n `,\n directoryTitle: css`\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n `,\n directoryTreeContent: css`\n padding: 4px 0;\n .ant-tree {\n background: transparent;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n }\n .ant-tree-directory .ant-tree-treenode {\n &::before {\n border-radius: 4px;\n }\n }\n /* 拖拽指示线:蓝色虚线 */\n .ant-tree .ant-tree-drop-indicator {\n background: transparent !important;\n border: 1px dashed #1677ff;\n height: 2px;\n }\n /* 拖拽悬停目标:蓝色虚线边框 */\n .ant-tree .ant-tree-treenode.drag-over > .ant-tree-node-content-wrapper {\n outline: 1px dashed #1677ff;\n outline-offset: -1px;\n border-radius: 4px;\n }\n /* 拖拽中的节点半透明 */\n .ant-tree .ant-tree-treenode-dragging {\n opacity: 0.4;\n }\n `,\n previewPanel: css`\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `,\n previewTitle: css`\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n `,\n previewContent: css`\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n `,\n emptyContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n loadingContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n treeNodeTitle: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n `,\n moreIcon: css`\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n border-radius: 4px;\n color: #999;\n font-size: 14px;\n transition: all 0.2s;\n &:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n `,\n treeNodeTitleHover: css`\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n `,\n copyBtn: css`\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n `,\n}));\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,6KAQb;IACDC,kBAAkB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,oIAOtB;IACDG,cAAc,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,qJAKlB;IACDK,cAAc,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,2IAMlB;IACDO,oBAAoB,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,4mCAwCxB;IACDS,YAAY,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,mHAMhB;IACDW,YAAY,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,qPAUhB;IACDa,cAAc,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,gHAMlB;IACDe,cAAc,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,2GAKlB;IACDiB,gBAAgB,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,2GAKpB;IACDmB,aAAa,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,wHAKjB;IACDqB,QAAQ,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,wQAaZ;IACDuB,kBAAkB,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,4EAItB;IACDyB,OAAO,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA;EAQd,CAAC;AAAA,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import type { XAdkChatbotProps } from "../../types";
|
|
2
|
+
import type { XAdkChatbotProps, XAdkChatbotHandle } from "../../types";
|
|
3
3
|
/**
|
|
4
4
|
* XAdkChatbot - 增强版聊天组件
|
|
5
5
|
*
|
|
@@ -10,5 +10,5 @@ import type { XAdkChatbotProps } from "../../types";
|
|
|
10
10
|
* - ✅ 操作栏 (重试/复制/日志)
|
|
11
11
|
* - ✅ 欢迎页面 (agentName/agentIcon/description)
|
|
12
12
|
*/
|
|
13
|
-
declare const XAdkChatbot: React.
|
|
13
|
+
declare const XAdkChatbot: React.ForwardRefExoticComponent<XAdkChatbotProps & React.RefAttributes<XAdkChatbotHandle>>;
|
|
14
14
|
export default XAdkChatbot;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
2
|
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
3
|
-
import React, { useMemo, useCallback, useEffect, useRef } from "react";
|
|
3
|
+
import React, { useMemo, useCallback, useEffect, useRef, useImperativeHandle, forwardRef } from "react";
|
|
4
4
|
import { Button, Flex, Tooltip, message as antdMessage } from "antd";
|
|
5
5
|
import clsx from "clsx";
|
|
6
6
|
import { SwapRightOutlined, ReloadOutlined, CopyOutlined, InfoCircleOutlined } from "@ant-design/icons";
|
|
@@ -28,7 +28,7 @@ var scrollThreshold = 10;
|
|
|
28
28
|
* - ✅ 操作栏 (重试/复制/日志)
|
|
29
29
|
* - ✅ 欢迎页面 (agentName/agentIcon/description)
|
|
30
30
|
*/
|
|
31
|
-
var XAdkChatbot = function
|
|
31
|
+
var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
32
32
|
var _mergedStrategies$par;
|
|
33
33
|
var _ref$loading = _ref.loading,
|
|
34
34
|
loading = _ref$loading === void 0 ? false : _ref$loading,
|
|
@@ -55,6 +55,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
55
55
|
parseOptions = _ref.parseOptions,
|
|
56
56
|
_ref$initialized = _ref.initialized,
|
|
57
57
|
initialized = _ref$initialized === void 0 ? false : _ref$initialized,
|
|
58
|
+
sessionId = _ref.sessionId,
|
|
58
59
|
onFileClick = _ref.onFileClick,
|
|
59
60
|
renderFunctionCall = _ref.renderFunctionCall,
|
|
60
61
|
toolKindResolver = _ref.toolKindResolver,
|
|
@@ -66,6 +67,21 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
66
67
|
var userHasScrolledRef = useRef(false);
|
|
67
68
|
var messagesEndRef = useRef(null);
|
|
68
69
|
var prevInitializedRef = useRef(false);
|
|
70
|
+
var prevSessionIdRef = useRef(sessionId);
|
|
71
|
+
|
|
72
|
+
// 暴露命令式 API
|
|
73
|
+
var scrollToBottom = useCallback(function () {
|
|
74
|
+
var _messagesEndRef$curre;
|
|
75
|
+
var behavior = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "auto";
|
|
76
|
+
(_messagesEndRef$curre = messagesEndRef.current) === null || _messagesEndRef$curre === void 0 || _messagesEndRef$curre.scrollIntoView({
|
|
77
|
+
behavior: behavior
|
|
78
|
+
});
|
|
79
|
+
}, []);
|
|
80
|
+
useImperativeHandle(ref, function () {
|
|
81
|
+
return {
|
|
82
|
+
scrollToBottom: scrollToBottom
|
|
83
|
+
};
|
|
84
|
+
}, [scrollToBottom]);
|
|
69
85
|
var mergedStrategies = useMemo(function () {
|
|
70
86
|
return mergeChatStrategies(preset, strategies);
|
|
71
87
|
}, [preset, strategies]);
|
|
@@ -86,8 +102,8 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
86
102
|
prevInitializedRef.current = true;
|
|
87
103
|
// 推迟到浏览器完成 paint 后执行,确保 DOM 高度已撑开
|
|
88
104
|
var timer = setTimeout(function () {
|
|
89
|
-
var _messagesEndRef$
|
|
90
|
-
(_messagesEndRef$
|
|
105
|
+
var _messagesEndRef$curre2;
|
|
106
|
+
(_messagesEndRef$curre2 = messagesEndRef.current) === null || _messagesEndRef$curre2 === void 0 || _messagesEndRef$curre2.scrollIntoView({
|
|
91
107
|
behavior: "auto"
|
|
92
108
|
});
|
|
93
109
|
}, 0);
|
|
@@ -96,12 +112,21 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
96
112
|
};
|
|
97
113
|
}, [initialized, messages]);
|
|
98
114
|
|
|
115
|
+
// 会话切换时重置滚动状态,允许重新触发初始化置底
|
|
116
|
+
useEffect(function () {
|
|
117
|
+
if (sessionId === undefined) return; // 未传 sessionId 不处理
|
|
118
|
+
if (prevSessionIdRef.current === sessionId) return; // 同一会话不处理
|
|
119
|
+
prevSessionIdRef.current = sessionId;
|
|
120
|
+
prevInitializedRef.current = false;
|
|
121
|
+
userHasScrolledRef.current = false;
|
|
122
|
+
}, [sessionId]);
|
|
123
|
+
|
|
99
124
|
// 流式输出时滚动到底部
|
|
100
125
|
useEffect(function () {
|
|
101
|
-
var _messagesEndRef$
|
|
126
|
+
var _messagesEndRef$curre3;
|
|
102
127
|
if (!loading) return;
|
|
103
128
|
if (userHasScrolledRef.current) return;
|
|
104
|
-
(_messagesEndRef$
|
|
129
|
+
(_messagesEndRef$curre3 = messagesEndRef.current) === null || _messagesEndRef$curre3 === void 0 || _messagesEndRef$curre3.scrollIntoView({
|
|
105
130
|
behavior: "smooth"
|
|
106
131
|
});
|
|
107
132
|
}, [loading, messages]);
|
|
@@ -338,17 +363,22 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
338
363
|
var actionExtraNode = actionsExtra === null || actionsExtra === void 0 ? void 0 : actionsExtra(actionProps);
|
|
339
364
|
|
|
340
365
|
// 4. 渲染
|
|
366
|
+
var lastProcessIdx = nodes.findLastIndex(function (n) {
|
|
367
|
+
return n.type === "process";
|
|
368
|
+
});
|
|
341
369
|
return /*#__PURE__*/_jsxs("div", {
|
|
342
370
|
className: styles.botMsg,
|
|
343
371
|
children: [nodes.map(function (node, idx) {
|
|
344
372
|
if (node.type === "process") {
|
|
373
|
+
// 只有最后一个 process node 跟随 loading 状态,已完成的思维链不应显示 loading
|
|
374
|
+
var isLastProcess = idx === lastProcessIdx;
|
|
345
375
|
return /*#__PURE__*/_jsx(XAdkThoughtChain, {
|
|
346
|
-
loading: isGroupLoading,
|
|
376
|
+
loading: isLastProcess && isGroupLoading,
|
|
347
377
|
title: "\u601D\u7EF4\u94FE\u5DF2\u5B8C\u6210",
|
|
348
378
|
items: node.items,
|
|
349
379
|
showFnCallDetail: showFnCallDetail,
|
|
350
380
|
onConfirm: onConfirm,
|
|
351
|
-
defaultOpen: isGroupLoading,
|
|
381
|
+
defaultOpen: isLastProcess && isGroupLoading,
|
|
352
382
|
renderFunctionCall: renderFunctionCall,
|
|
353
383
|
toolKindResolver: function toolKindResolver(name) {
|
|
354
384
|
return resolveToolKind(name);
|
|
@@ -525,6 +555,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
525
555
|
})]
|
|
526
556
|
})
|
|
527
557
|
});
|
|
528
|
-
};
|
|
558
|
+
});
|
|
559
|
+
XAdkChatbot.displayName = "XAdkChatbot";
|
|
529
560
|
export default XAdkChatbot;
|
|
530
561
|
//# sourceMappingURL=index.js.map
|