@ai-group/chat-sdk 3.0.5 → 3.0.7
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/XAdkChatbot/XAdkChatbot.stories.js +10 -0
- package/dist/cjs/components/XAdkChatbot/XAdkChatbot.stories.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +1 -0
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +2 -0
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +7 -1
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +18 -1
- package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/XAdkProvider.stories.js +2 -2
- package/dist/cjs/components/XAdkProvider/XAdkProvider.stories.js.map +1 -1
- package/dist/cjs/components/XAdkProvider/compound/Messages.js +63 -9
- package/dist/cjs/components/XAdkProvider/compound/Messages.js.map +3 -3
- package/dist/cjs/components/XAdkProvider/context/ChatActionContext.d.ts +5 -0
- package/dist/cjs/components/XAdkProvider/context/ChatActionContext.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/context/ChatStateContext.d.ts +2 -0
- package/dist/cjs/components/XAdkProvider/context/ChatStateContext.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/index.d.ts +1 -1
- package/dist/cjs/components/XAdkProvider/index.js +13 -7
- package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
- package/dist/cjs/components/XAdkSender/XAdkSender.stories.d.ts +2 -2
- package/dist/cjs/components/XAdkSender/XAdkSender.stories.js.map +2 -2
- package/dist/cjs/hooks/useADKChat.d.ts +4 -0
- package/dist/cjs/hooks/useADKChat.js +24 -2
- package/dist/cjs/hooks/useADKChat.js.map +2 -2
- package/dist/cjs/types/ChatHook.d.ts +6 -1
- package/dist/cjs/types/ChatHook.js.map +1 -1
- package/dist/cjs/types/XAdkChatbot.d.ts +1 -1
- package/dist/cjs/types/XAdkChatbot.js.map +1 -1
- package/dist/cjs/types/XAdkProvider.d.ts +6 -1
- package/dist/cjs/types/XAdkProvider.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.js +8 -0
- package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +1 -0
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +2 -0
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +1 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.js +26 -5
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkProvider/XAdkProvider.stories.js +2 -2
- package/dist/esm/components/XAdkProvider/XAdkProvider.stories.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/Messages.js +124 -11
- package/dist/esm/components/XAdkProvider/compound/Messages.js.map +1 -1
- package/dist/esm/components/XAdkProvider/context/ChatActionContext.d.ts +5 -0
- package/dist/esm/components/XAdkProvider/context/ChatActionContext.js.map +1 -1
- package/dist/esm/components/XAdkProvider/context/ChatStateContext.d.ts +2 -0
- package/dist/esm/components/XAdkProvider/context/ChatStateContext.js.map +1 -1
- package/dist/esm/components/XAdkProvider/index.d.ts +1 -1
- package/dist/esm/components/XAdkProvider/index.js +26 -7
- package/dist/esm/components/XAdkProvider/index.js.map +1 -1
- package/dist/esm/components/XAdkSender/XAdkSender.stories.d.ts +2 -2
- package/dist/esm/components/XAdkSender/XAdkSender.stories.js +13 -13
- package/dist/esm/components/XAdkSender/XAdkSender.stories.js.map +1 -1
- package/dist/esm/hooks/useADKChat.d.ts +4 -0
- package/dist/esm/hooks/useADKChat.js +79 -28
- package/dist/esm/hooks/useADKChat.js.map +1 -1
- package/dist/esm/types/ChatHook.d.ts +6 -1
- package/dist/esm/types/ChatHook.js.map +1 -1
- package/dist/esm/types/XAdkChatbot.d.ts +1 -1
- package/dist/esm/types/XAdkChatbot.js.map +1 -1
- package/dist/esm/types/XAdkProvider.d.ts +6 -1
- package/dist/esm/types/XAdkProvider.js.map +1 -1
- package/dist/umd/chat-sdk.min.css +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -32,7 +32,12 @@ __export(Messages_exports, {
|
|
|
32
32
|
default: () => Messages_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(Messages_exports);
|
|
35
|
+
var import_react = require("react");
|
|
36
|
+
var import_antd = require("antd");
|
|
37
|
+
var import_icons = require("@ant-design/icons");
|
|
38
|
+
var import_copy_to_clipboard = __toESM(require("copy-to-clipboard"));
|
|
35
39
|
var import_XAdkChatbot = __toESM(require("../../XAdkChatbot"));
|
|
40
|
+
var import_DislikeFeedBack = __toESM(require("./DislikeFeedBack"));
|
|
36
41
|
var import_ChatStateContext = require("../context/ChatStateContext");
|
|
37
42
|
var import_ChatActionContext = require("../context/ChatActionContext");
|
|
38
43
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -41,8 +46,62 @@ var Messages = ({
|
|
|
41
46
|
className,
|
|
42
47
|
style
|
|
43
48
|
}) => {
|
|
44
|
-
const { messages, loading, prologue, suggestions } = (0, import_ChatStateContext.useChatState)();
|
|
45
|
-
const { suggestChat, reChat } = (0, import_ChatActionContext.useChatActions)();
|
|
49
|
+
const { messages, loading, prologue, suggestions, initialized, showFeedback, appInfo } = (0, import_ChatStateContext.useChatState)();
|
|
50
|
+
const { suggestChat, reChat, likeMessage } = (0, import_ChatActionContext.useChatActions)();
|
|
51
|
+
const primaryColor = (appInfo == null ? void 0 : appInfo.appTheme) || "#1677ff";
|
|
52
|
+
const defaultActions = (0, import_react.useCallback)(({ message: group, isLastBotMsg }) => {
|
|
53
|
+
const lastMsg = group.msgs[group.msgs.length - 1];
|
|
54
|
+
const invocationId = lastMsg == null ? void 0 : lastMsg.invocationId;
|
|
55
|
+
const isLikeVal = group.isLike ?? 0;
|
|
56
|
+
const fullText = group.msgs.filter((m) => !m.functionCall && !m.functionResponse).map((m) => m.text || "").join("");
|
|
57
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_antd.Flex, { gap: 16, align: "center", style: { padding: "4px 0", color: "#81858c" }, children: [
|
|
58
|
+
isLastBotMsg && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: "重新生成", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.ReloadOutlined, { style: { cursor: "pointer" }, onClick: reChat }) }),
|
|
59
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: "复制内容", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
60
|
+
import_icons.CopyOutlined,
|
|
61
|
+
{
|
|
62
|
+
style: { cursor: "pointer" },
|
|
63
|
+
onClick: () => {
|
|
64
|
+
(0, import_copy_to_clipboard.default)(fullText);
|
|
65
|
+
import_antd.message.success("复制成功");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
) }),
|
|
69
|
+
showFeedback && invocationId && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
70
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: "赞", children: isLikeVal === 1 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.LikeFilled, { style: { color: primaryColor, cursor: "pointer" } }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
71
|
+
import_icons.LikeOutlined,
|
|
72
|
+
{
|
|
73
|
+
style: { cursor: "pointer" },
|
|
74
|
+
onClick: async () => {
|
|
75
|
+
if (isLikeVal !== 0) {
|
|
76
|
+
import_antd.message.warning("已收到您的反馈,无需重复提交");
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const ok = await likeMessage(invocationId, 1);
|
|
80
|
+
if (ok)
|
|
81
|
+
import_antd.message.success("感谢您的反馈");
|
|
82
|
+
else
|
|
83
|
+
import_antd.message.error("反馈失败,请稍后再试");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
) }),
|
|
87
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
88
|
+
import_DislikeFeedBack.default,
|
|
89
|
+
{
|
|
90
|
+
msg: group,
|
|
91
|
+
activeColor: primaryColor,
|
|
92
|
+
onSubmit: async (formData) => {
|
|
93
|
+
const ok = await likeMessage(invocationId, -1, formData);
|
|
94
|
+
if (ok)
|
|
95
|
+
import_antd.message.success("已收到您的反馈,我们会努力做得更好");
|
|
96
|
+
else
|
|
97
|
+
import_antd.message.error("反馈失败,请稍后再试");
|
|
98
|
+
return ok;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
] })
|
|
103
|
+
] });
|
|
104
|
+
}, [reChat, likeMessage, showFeedback, primaryColor]);
|
|
46
105
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
47
106
|
import_XAdkChatbot.default,
|
|
48
107
|
{
|
|
@@ -51,16 +110,11 @@ var Messages = ({
|
|
|
51
110
|
prologue,
|
|
52
111
|
suggestions,
|
|
53
112
|
onSuggest: suggestChat,
|
|
54
|
-
|
|
55
|
-
showCopy: true,
|
|
56
|
-
showLog: false,
|
|
57
|
-
onRetry: reChat,
|
|
58
|
-
onShowLog: () => {
|
|
59
|
-
},
|
|
60
|
-
actions,
|
|
113
|
+
actions: actions ?? defaultActions,
|
|
61
114
|
enableGrouping: true,
|
|
62
115
|
enableProcessParsing: true,
|
|
63
116
|
parseOptions: { mode: "comment" },
|
|
117
|
+
initialized,
|
|
64
118
|
className,
|
|
65
119
|
style
|
|
66
120
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/XAdkProvider/compound/Messages.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from \"react\";\nimport XAdkChatbot from \"../../XAdkChatbot\";\nimport { useChatState } from \"../context/ChatStateContext\";\nimport { useChatActions } from \"../context/ChatActionContext\";\nimport type { ActionProps } from \"@/types\";\n\nexport interface XAdkMessagesProps {\n /** 自定义操作栏渲染 */\n actions?: ActionProps;\n /** 类名 */\n className?: string;\n /** 样式 */\n style?: React.CSSProperties;\n}\n\n/**\n * Messages - XAdkProvider 的消息展示组件\n *\n * 使用 XAdkChatbot 渲染消息列表\n */\nconst Messages: React.FC<XAdkMessagesProps> = ({\n actions,\n className,\n style,\n}) => {\n const { messages, loading, prologue, suggestions } = useChatState();\n const { suggestChat, reChat } = useChatActions();\n\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
6
|
-
"names": ["XAdkChatbot"]
|
|
4
|
+
"sourcesContent": ["import React, { useCallback } from \"react\";\nimport { message, Tooltip, Flex } from \"antd\";\nimport { LikeFilled, LikeOutlined, ReloadOutlined, CopyOutlined } from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport XAdkChatbot from \"../../XAdkChatbot\";\nimport DislikeFeedback from \"./DislikeFeedBack\";\nimport { useChatState } from \"../context/ChatStateContext\";\nimport { useChatActions } from \"../context/ChatActionContext\";\nimport type { ActionProps } from \"@/types\";\n\nexport interface XAdkMessagesProps {\n /** 自定义操作栏渲染 */\n actions?: ActionProps;\n /** 类名 */\n className?: string;\n /** 样式 */\n style?: React.CSSProperties;\n}\n\n/**\n * Messages - XAdkProvider 的消息展示组件\n *\n * 使用 XAdkChatbot 渲染消息列表\n */\nconst Messages: React.FC<XAdkMessagesProps> = ({\n actions,\n className,\n style,\n}) => {\n const { messages, loading, prologue, suggestions, initialized, showFeedback, appInfo } = useChatState();\n const { suggestChat, reChat, likeMessage } = useChatActions();\n\n const primaryColor = appInfo?.appTheme || \"#1677ff\";\n\n const defaultActions = useCallback<ActionProps>(({ message: group, isLastBotMsg }) => {\n // 取该组最后一条 bot 消息的 invocationId 和 isLike 状态\n const lastMsg = group.msgs[group.msgs.length - 1];\n const invocationId = lastMsg?.invocationId;\n const isLikeVal = group.isLike ?? 0;\n\n const fullText = group.msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n return (\n <Flex gap={16} align=\"center\" style={{ padding: \"4px 0\", color: \"#81858c\" }}>\n {isLastBotMsg && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined style={{ cursor: \"pointer\" }} onClick={reChat} />\n </Tooltip>\n )}\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n copy(fullText);\n message.success(\"复制成功\");\n }}\n />\n </Tooltip>\n {showFeedback && invocationId && (\n <>\n <Tooltip title=\"赞\">\n {isLikeVal === 1 ? (\n <LikeFilled style={{ color: primaryColor, cursor: \"pointer\" }} />\n ) : (\n <LikeOutlined\n style={{ cursor: \"pointer\" }}\n onClick={async () => {\n if (isLikeVal !== 0) {\n message.warning(\"已收到您的反馈,无需重复提交\");\n return;\n }\n const ok = await likeMessage(invocationId, 1);\n if (ok) message.success(\"感谢您的反馈\");\n else message.error(\"反馈失败,请稍后再试\");\n }}\n />\n )}\n </Tooltip>\n <DislikeFeedback\n msg={group}\n activeColor={primaryColor}\n onSubmit={async (formData) => {\n const ok = await likeMessage(invocationId, -1, formData);\n if (ok) message.success(\"已收到您的反馈,我们会努力做得更好\");\n else message.error(\"反馈失败,请稍后再试\");\n return ok;\n }}\n />\n </>\n )}\n </Flex>\n );\n }, [reChat, likeMessage, showFeedback, primaryColor]);\n\n return (\n <XAdkChatbot\n messages={messages}\n loading={loading}\n prologue={prologue}\n suggestions={suggestions}\n onSuggest={suggestChat}\n // 操作栏:使用外部传入的 actions,否则用内置默认 actions\n actions={actions ?? defaultActions}\n // 启用分组和解析\n enableGrouping={true}\n enableProcessParsing={true}\n // 使用注释模式解析\n parseOptions={{ mode: \"comment\" }}\n initialized={initialized}\n // 样式\n className={className}\n style={style}\n />\n );\n};\n\nexport default Messages;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAmC;AACnC,kBAAuC;AACvC,mBAAuE;AACvE,+BAAiB;AACjB,yBAAwB;AACxB,6BAA4B;AAC5B,8BAA6B;AAC7B,+BAA+B;AA0CnB;AAzBZ,IAAM,WAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,UAAU,SAAS,UAAU,aAAa,aAAa,cAAc,QAAQ,QAAI,sCAAa;AACtG,QAAM,EAAE,aAAa,QAAQ,YAAY,QAAI,yCAAe;AAE5D,QAAM,gBAAe,mCAAS,aAAY;AAE1C,QAAM,qBAAiB,0BAAyB,CAAC,EAAE,SAAS,OAAO,aAAa,MAAM;AAEpF,UAAM,UAAU,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC;AAChD,UAAM,eAAe,mCAAS;AAC9B,UAAM,YAAY,MAAM,UAAU;AAElC,UAAM,WAAW,MAAM,KACpB,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,EACpD,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EACvB,KAAK,EAAE;AAEV,WACE,6CAAC,oBAAK,KAAK,IAAI,OAAM,UAAS,OAAO,EAAE,SAAS,SAAS,OAAO,UAAU,GACvE;AAAA,sBACC,4CAAC,uBAAQ,OAAM,QACb,sDAAC,+BAAe,OAAO,EAAE,QAAQ,UAAU,GAAG,SAAS,QAAQ,GACjE;AAAA,MAEF,4CAAC,uBAAQ,OAAM,QACb;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,QAAQ,UAAU;AAAA,UAC3B,SAAS,MAAM;AACb,yCAAAA,SAAK,QAAQ;AACb,gCAAQ,QAAQ,MAAM;AAAA,UACxB;AAAA;AAAA,MACF,GACF;AAAA,MACC,gBAAgB,gBACf,4EACE;AAAA,oDAAC,uBAAQ,OAAM,KACZ,wBAAc,IACb,4CAAC,2BAAW,OAAO,EAAE,OAAO,cAAc,QAAQ,UAAU,GAAG,IAE/D;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,QAAQ,UAAU;AAAA,YAC3B,SAAS,YAAY;AACnB,kBAAI,cAAc,GAAG;AACnB,oCAAQ,QAAQ,gBAAgB;AAChC;AAAA,cACF;AACA,oBAAM,KAAK,MAAM,YAAY,cAAc,CAAC;AAC5C,kBAAI;AAAI,oCAAQ,QAAQ,QAAQ;AAAA;AAC3B,oCAAQ,MAAM,YAAY;AAAA,YACjC;AAAA;AAAA,QACF,GAEJ;AAAA,QACA;AAAA,UAAC,uBAAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,aAAa;AAAA,YACb,UAAU,OAAO,aAAa;AAC5B,oBAAM,KAAK,MAAM,YAAY,cAAc,IAAI,QAAQ;AACvD,kBAAI;AAAI,oCAAQ,QAAQ,mBAAmB;AAAA;AACtC,oCAAQ,MAAM,YAAY;AAC/B,qBAAO;AAAA,YACT;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OAEJ;AAAA,EAEJ,GAAG,CAAC,QAAQ,aAAa,cAAc,YAAY,CAAC;AAEpD,SACE;AAAA,IAAC,mBAAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MAEX,SAAS,WAAW;AAAA,MAEpB,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,MAEtB,cAAc,EAAE,MAAM,UAAU;AAAA,MAChC;AAAA,MAEA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,mBAAQ;",
|
|
6
|
+
"names": ["copy", "DislikeFeedback", "XAdkChatbot"]
|
|
7
7
|
}
|
|
@@ -20,6 +20,11 @@ export interface ChatActionContextType {
|
|
|
20
20
|
confirmFnCall: (fnCall: FunctionCall, confirmed: boolean) => void;
|
|
21
21
|
/** 设置消息列表 */
|
|
22
22
|
setMessages: React.Dispatch<React.SetStateAction<IMessage[]>>;
|
|
23
|
+
/** 点赞/点踩消息 */
|
|
24
|
+
likeMessage: (invocationId: string, isLike: 1 | -1, feedbackData?: {
|
|
25
|
+
feedbackTags?: string;
|
|
26
|
+
feedbackDescription?: string;
|
|
27
|
+
}) => Promise<boolean>;
|
|
23
28
|
}
|
|
24
29
|
export declare const ChatActionContext: import("react").Context<ChatActionContextType | null>;
|
|
25
30
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/XAdkProvider/context/ChatActionContext.tsx"],
|
|
4
|
-
"sourcesContent": ["import { createContext, useContext } from 'react';\nimport type { SendContent, FunctionCall, IMessage } from '@/types';\n\n/**\n * 聊天动作 Context\n * 只包含操作方法,不包含状态数据\n * 与 ChatStateContext 分离可以优化性能\n */\nexport interface ChatActionContextType {\n /** 发送消息 */\n chat: (content: SendContent) => void;\n /** 停止聊天 */\n stopChat: () => void;\n /** 清空/重置聊天 */\n clearChat: () => void;\n /** 重新发送 */\n reChat: () => void;\n /** 使用建议问题 */\n suggestChat: (text: string) => void;\n /** 确认函数调用 */\n confirmFnCall: (fnCall: FunctionCall, confirmed: boolean) => void;\n /** 设置消息列表 */\n setMessages: React.Dispatch<React.SetStateAction<IMessage[]>>;\n}\n\nexport const ChatActionContext = createContext<ChatActionContextType | null>(null);\n\n/**\n * 使用聊天动作 Hook\n * @returns ChatActionContextType\n * @throws Error 如果在 XAdkProvider 外部使用\n */\nexport const useChatActions = () => {\n const context = useContext(ChatActionContext);\n if (!context) {\n throw new Error('useChatActions must be used within XAdkProvider');\n }\n return context;\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0C;
|
|
4
|
+
"sourcesContent": ["import { createContext, useContext } from 'react';\nimport type { SendContent, FunctionCall, IMessage } from '@/types';\n\n/**\n * 聊天动作 Context\n * 只包含操作方法,不包含状态数据\n * 与 ChatStateContext 分离可以优化性能\n */\nexport interface ChatActionContextType {\n /** 发送消息 */\n chat: (content: SendContent) => void;\n /** 停止聊天 */\n stopChat: () => void;\n /** 清空/重置聊天 */\n clearChat: () => void;\n /** 重新发送 */\n reChat: () => void;\n /** 使用建议问题 */\n suggestChat: (text: string) => void;\n /** 确认函数调用 */\n confirmFnCall: (fnCall: FunctionCall, confirmed: boolean) => void;\n /** 设置消息列表 */\n setMessages: React.Dispatch<React.SetStateAction<IMessage[]>>;\n /** 点赞/点踩消息 */\n likeMessage: (\n invocationId: string,\n isLike: 1 | -1,\n feedbackData?: { feedbackTags?: string; feedbackDescription?: string },\n ) => Promise<boolean>;\n}\n\nexport const ChatActionContext = createContext<ChatActionContextType | null>(null);\n\n/**\n * 使用聊天动作 Hook\n * @returns ChatActionContextType\n * @throws Error 如果在 XAdkProvider 外部使用\n */\nexport const useChatActions = () => {\n const context = useContext(ChatActionContext);\n if (!context) {\n throw new Error('useChatActions must be used within XAdkProvider');\n }\n return context;\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0C;AA+BnC,IAAM,wBAAoB,4BAA4C,IAAI;AAO1E,IAAM,iBAAiB,MAAM;AAClC,QAAM,cAAU,yBAAW,iBAAiB;AAC5C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -25,6 +25,8 @@ export interface ChatStateContextType {
|
|
|
25
25
|
appInfo: ChatConfig | null;
|
|
26
26
|
/** 是否已初始化 */
|
|
27
27
|
initialized: boolean;
|
|
28
|
+
/** 是否展示点赞/点踩 */
|
|
29
|
+
showFeedback: boolean;
|
|
28
30
|
}
|
|
29
31
|
export declare const ChatStateContext: import("react").Context<ChatStateContextType | null>;
|
|
30
32
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/XAdkProvider/context/ChatStateContext.tsx"],
|
|
4
|
-
"sourcesContent": ["import { createContext, useContext } from \"react\";\nimport type { IMessage } from \"@/types\";\nimport type { ChatConfig } from \"@/services/api\";\n\n/**\n * 聊天状态 Context\n * 只包含状态数据,不包含操作方法\n * 这样可以避免不必要的 rerender\n */\nexport interface ChatStateContextType {\n /** 请求地址 */\n url: string;\n /** 会话令牌 */\n token: string;\n /** 消息列表 */\n messages: IMessage[];\n /** 加载状态 */\n loading: boolean;\n /** 当前会话 ID */\n currentSessionId: string;\n /** 开场白 */\n prologue: string;\n /** 建议问题列表 */\n suggestions: string[];\n /** 应用配置信息 */\n appInfo: ChatConfig | null;\n /** 是否已初始化 */\n initialized: boolean;\n}\n\nexport const ChatStateContext = createContext<ChatStateContextType | null>(\n null,\n);\n\n/**\n * 使用聊天状态 Hook\n * @returns ChatStateContextType\n * @throws Error 如果在 XAdkProvider 外部使用\n */\nexport const useChatState = () => {\n const context = useContext(ChatStateContext);\n if (!context) {\n throw new Error(\"useChatState must be used within XAdkProvider\");\n }\n return context;\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0C;
|
|
4
|
+
"sourcesContent": ["import { createContext, useContext } from \"react\";\nimport type { IMessage } from \"@/types\";\nimport type { ChatConfig } from \"@/services/api\";\n\n/**\n * 聊天状态 Context\n * 只包含状态数据,不包含操作方法\n * 这样可以避免不必要的 rerender\n */\nexport interface ChatStateContextType {\n /** 请求地址 */\n url: string;\n /** 会话令牌 */\n token: string;\n /** 消息列表 */\n messages: IMessage[];\n /** 加载状态 */\n loading: boolean;\n /** 当前会话 ID */\n currentSessionId: string;\n /** 开场白 */\n prologue: string;\n /** 建议问题列表 */\n suggestions: string[];\n /** 应用配置信息 */\n appInfo: ChatConfig | null;\n /** 是否已初始化 */\n initialized: boolean;\n /** 是否展示点赞/点踩 */\n showFeedback: boolean;\n}\n\nexport const ChatStateContext = createContext<ChatStateContextType | null>(\n null,\n);\n\n/**\n * 使用聊天状态 Hook\n * @returns ChatStateContextType\n * @throws Error 如果在 XAdkProvider 外部使用\n */\nexport const useChatState = () => {\n const context = useContext(ChatStateContext);\n if (!context) {\n throw new Error(\"useChatState must be used within XAdkProvider\");\n }\n return context;\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0C;AAgCnC,IAAM,uBAAmB;AAAA,EAC9B;AACF;AAOO,IAAM,eAAe,MAAM;AAChC,QAAM,cAAU,yBAAW,gBAAgB;AAC3C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -50,7 +50,7 @@ var import_DefaultLayout = __toESM(require("./compound/DefaultLayout"));
|
|
|
50
50
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
51
51
|
var XAdkProviderComponent = (0, import_react.forwardRef)(
|
|
52
52
|
({
|
|
53
|
-
url,
|
|
53
|
+
url = window.location.origin,
|
|
54
54
|
token,
|
|
55
55
|
config,
|
|
56
56
|
chatData,
|
|
@@ -63,7 +63,7 @@ var XAdkProviderComponent = (0, import_react.forwardRef)(
|
|
|
63
63
|
children
|
|
64
64
|
}, ref) => {
|
|
65
65
|
const internalData = (0, import_useADKChat.default)({
|
|
66
|
-
url
|
|
66
|
+
url,
|
|
67
67
|
token: token || "",
|
|
68
68
|
config: config || {},
|
|
69
69
|
onError,
|
|
@@ -93,8 +93,10 @@ var XAdkProviderComponent = (0, import_react.forwardRef)(
|
|
|
93
93
|
suggestions,
|
|
94
94
|
initialized,
|
|
95
95
|
setCurrentSessionDetail,
|
|
96
|
-
setMessages
|
|
96
|
+
setMessages,
|
|
97
|
+
likeMessage = async () => false
|
|
97
98
|
} = data;
|
|
99
|
+
const showFeedback = (config == null ? void 0 : config.showFeedback) ?? true;
|
|
98
100
|
(0, import_react.useImperativeHandle)(
|
|
99
101
|
ref,
|
|
100
102
|
() => ({
|
|
@@ -136,7 +138,8 @@ var XAdkProviderComponent = (0, import_react.forwardRef)(
|
|
|
136
138
|
appInfo,
|
|
137
139
|
initialized,
|
|
138
140
|
url,
|
|
139
|
-
token
|
|
141
|
+
token,
|
|
142
|
+
showFeedback
|
|
140
143
|
}),
|
|
141
144
|
[
|
|
142
145
|
messages,
|
|
@@ -145,7 +148,8 @@ var XAdkProviderComponent = (0, import_react.forwardRef)(
|
|
|
145
148
|
prologue,
|
|
146
149
|
suggestions,
|
|
147
150
|
appInfo,
|
|
148
|
-
initialized
|
|
151
|
+
initialized,
|
|
152
|
+
showFeedback
|
|
149
153
|
]
|
|
150
154
|
);
|
|
151
155
|
const chatActionValue = (0, import_react.useMemo)(
|
|
@@ -156,7 +160,8 @@ var XAdkProviderComponent = (0, import_react.forwardRef)(
|
|
|
156
160
|
reChat,
|
|
157
161
|
suggestChat,
|
|
158
162
|
confirmFnCall,
|
|
159
|
-
setMessages
|
|
163
|
+
setMessages,
|
|
164
|
+
likeMessage
|
|
160
165
|
}),
|
|
161
166
|
[
|
|
162
167
|
startChat,
|
|
@@ -165,7 +170,8 @@ var XAdkProviderComponent = (0, import_react.forwardRef)(
|
|
|
165
170
|
reChat,
|
|
166
171
|
suggestChat,
|
|
167
172
|
confirmFnCall,
|
|
168
|
-
setMessages
|
|
173
|
+
setMessages,
|
|
174
|
+
likeMessage
|
|
169
175
|
]
|
|
170
176
|
);
|
|
171
177
|
const sessionValue = (0, import_react.useMemo)(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAdkProvider/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { forwardRef, useImperativeHandle, useMemo } from \"react\";\nimport { ConfigProvider } from \"antd\";\nimport { XProvider } from \"@ant-design/x\";\nimport { ChatStateContext } from \"./context/ChatStateContext\";\nimport { ChatActionContext } from \"./context/ChatActionContext\";\nimport { SessionContext } from \"./context/SessionContext\";\nimport useADKChat from \"@/hooks/useADKChat\";\nimport { primaryBlue } from \"@/styles/common\";\nimport type {\n XAdkProviderProps,\n XAdkProviderHandle,\n} from \"@/types/XAdkProvider\";\nimport type { ChatHookResult } from \"@/types/ChatHook\";\n\n/**\n * XAdkProvider Props (扩展版)\n *\n * 支持两种使用方式:\n * 1. 标准协议: 提供 url/token/config,使用内置 useADKChat\n * 2. 自定义协议: 提供 chatData,使用自己的 Hook\n */\nexport interface XAdkProviderPropsExtended extends Omit<\n XAdkProviderProps,\n \"url\" | \"token\" | \"config\"\n> {\n /**\n * 选项 A: 使用标准协议 (内置 useADKChat)\n */\n url
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAgE;AAChE,kBAA+B;AAC/B,eAA0B;AAC1B,8BAAiC;AACjC,+BAAkC;AAClC,4BAA+B;AAC/B,wBAAuB;AACvB,oBAA4B;
|
|
4
|
+
"sourcesContent": ["import React, { forwardRef, useImperativeHandle, useMemo } from \"react\";\nimport { ConfigProvider } from \"antd\";\nimport { XProvider } from \"@ant-design/x\";\nimport { ChatStateContext } from \"./context/ChatStateContext\";\nimport { ChatActionContext } from \"./context/ChatActionContext\";\nimport { SessionContext } from \"./context/SessionContext\";\nimport useADKChat from \"@/hooks/useADKChat\";\nimport { primaryBlue } from \"@/styles/common\";\nimport type {\n XAdkProviderProps,\n XAdkProviderHandle,\n} from \"@/types/XAdkProvider\";\nimport type { ChatHookResult } from \"@/types/ChatHook\";\n\n/**\n * XAdkProvider Props (扩展版)\n *\n * 支持两种使用方式:\n * 1. 标准协议: 提供 url/token/config,使用内置 useADKChat\n * 2. 自定义协议: 提供 chatData,使用自己的 Hook\n */\nexport interface XAdkProviderPropsExtended extends Omit<\n XAdkProviderProps,\n \"url\" | \"token\" | \"config\"\n> {\n /**\n * 选项 A: 使用标准协议 (内置 useADKChat)\n */\n url?: string;\n token: string;\n config?: any;\n\n /**\n * 选项 B: 使用自定义 Hook 数据\n * 如果提供此参数,将忽略 url/token/config\n *\n * @example\n * // GraphQL 协议\n * const chatData = useMyGraphQLChat({ endpoint: '...' });\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n *\n * @example\n * // WebSocket 协议\n * const chatData = useWebSocketChat({ url: 'ws://...' });\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n */\n chatData?: ChatHookResult;\n\n children: React.ReactNode;\n}\n\n/**\n * XAdkProvider - AI 聊天 SDK 核心 Provider\n *\n * 采用 Compound Components 架构:\n * - 只负责数据和状态管理\n * - 不包含 UI 布局\n * - 通过 Context 向子组件提供数据\n * - 支持完全自定义的组件组合\n * - 支持协议解耦,可使用自定义 Hook\n *\n * @example\n * // 基础用法 - 标准协议\n * <XAdkProvider url=\"...\" token=\"...\" config={...}>\n * <XAdkProvider.Chatbot />\n * </XAdkProvider>\n *\n * @example\n * // 自定义协议 - GraphQL\n * function App() {\n * const chatData = useMyGraphQLChat({ endpoint: '...' });\n * return (\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n * );\n * }\n *\n * @example\n * // 自定义布局\n * <XAdkProvider url=\"...\" token=\"...\">\n * <div style={{ display: 'flex' }}>\n * <XAdkProvider.Sidebar />\n * <div>\n * <XAdkProvider.Messages />\n * <XAdkProvider.Sender />\n * </div>\n * </div>\n * </XAdkProvider>\n */\nconst XAdkProviderComponent = forwardRef<\n XAdkProviderHandle,\n XAdkProviderPropsExtended\n>(\n (\n {\n url = window.location.origin,\n token,\n config,\n chatData, // 自定义 Hook 数据\n providerId = \"defaultId\",\n onSuccess,\n onError,\n onMessage,\n onStream,\n children,\n },\n ref,\n ) => {\n // 内置 Hook 数据 (仅在没有提供 chatData 时调用)\n const internalData = useADKChat({\n url,\n token: token || \"\",\n config: config || {},\n onError,\n onSuccess,\n onMessage,\n onStream,\n // 仅在提供了 url 和 token 时才初始化\n enabled: !chatData && !!url && !!token,\n });\n\n // 使用外部数据或内部数据\n const data = chatData || internalData;\n\n // 解构数据\n const {\n appInfo,\n startChat,\n stopChat,\n reChat,\n clearChat,\n suggestChat,\n confirmFnCall,\n deleteSession,\n updateSession,\n currentSessionId,\n sessionPagination,\n sessionList,\n messages,\n loading,\n prologue,\n suggestions,\n initialized,\n setCurrentSessionDetail,\n setMessages,\n likeMessage = async () => false,\n } = data;\n\n const showFeedback = config?.showFeedback ?? true;\n\n // 暴露 API 给 ref\n useImperativeHandle(\n ref,\n () => ({\n startChat,\n stopChat,\n reChat,\n clearChat,\n suggestChat,\n deleteSession,\n updateSession,\n getAppInfo: () => appInfo,\n getMessages: () => messages,\n getSessions: () => sessionList,\n setMessages,\n setCurrentSessionDetail,\n }),\n [\n appInfo,\n messages,\n sessionList,\n startChat,\n stopChat,\n reChat,\n clearChat,\n suggestChat,\n deleteSession,\n updateSession,\n setMessages,\n setCurrentSessionDetail,\n ],\n );\n\n // 状态 Context Value - 使用 useMemo 避免不必要的 rerender\n const chatStateValue = useMemo(\n () => ({\n messages,\n loading,\n currentSessionId,\n prologue,\n suggestions,\n appInfo,\n initialized,\n url,\n token,\n showFeedback,\n }),\n [\n messages,\n loading,\n currentSessionId,\n prologue,\n suggestions,\n appInfo,\n initialized,\n showFeedback,\n ],\n );\n\n // 动作 Context Value - 函数引用稳定,不需要每次都创建新对象\n const chatActionValue = useMemo(\n () => ({\n chat: startChat,\n stopChat,\n clearChat,\n reChat,\n suggestChat,\n confirmFnCall,\n setMessages,\n likeMessage,\n }),\n [\n startChat,\n stopChat,\n clearChat,\n reChat,\n suggestChat,\n confirmFnCall,\n setMessages,\n likeMessage,\n ],\n );\n\n // 会话 Context Value\n const sessionValue = useMemo(\n () => ({\n sessionList,\n sessionPagination,\n deleteSession,\n updateSession,\n setCurrentSessionDetail,\n }),\n [\n sessionList,\n sessionPagination,\n deleteSession,\n updateSession,\n setCurrentSessionDetail,\n ],\n );\n\n return (\n <ConfigProvider\n theme={{\n token: {\n colorPrimary: appInfo?.appTheme || primaryBlue,\n },\n }}\n >\n <XProvider>\n <ChatStateContext.Provider value={chatStateValue}>\n <ChatActionContext.Provider value={chatActionValue}>\n <SessionContext.Provider value={sessionValue}>\n <div\n style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n }}\n >\n {children}\n </div>\n </SessionContext.Provider>\n </ChatActionContext.Provider>\n </ChatStateContext.Provider>\n </XProvider>\n </ConfigProvider>\n );\n },\n);\n\nXAdkProviderComponent.displayName = \"XAdkProvider\";\n\n// 导入 Compound Components\nimport Header from \"./compound/Header\";\nimport Sidebar from \"./compound/Sidebar\";\nimport Messages from \"./compound/Messages\";\nimport Sender from \"./compound/Sender\";\nimport Chatbot from \"./compound/Chatbot\";\nimport Welcome from \"./compound/Welcome\";\nimport DefaultLayout from \"./compound/DefaultLayout\";\n\n// 导出时会挂载 Compound Components\nconst XAdkProvider = XAdkProviderComponent as typeof XAdkProviderComponent & {\n Header: typeof Header;\n Sidebar: typeof Sidebar;\n Messages: typeof Messages;\n Sender: typeof Sender;\n Chatbot: typeof Chatbot;\n Welcome: typeof Welcome;\n DefaultLayout: typeof DefaultLayout;\n};\n\n// 挂载 Compound Components\nXAdkProvider.Header = Header;\nXAdkProvider.Sidebar = Sidebar;\nXAdkProvider.Messages = Messages;\nXAdkProvider.Sender = Sender;\nXAdkProvider.Chatbot = Chatbot;\nXAdkProvider.DefaultLayout = DefaultLayout;\nXAdkProvider.Welcome = Welcome;\n\nexport default XAdkProvider;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAgE;AAChE,kBAA+B;AAC/B,eAA0B;AAC1B,8BAAiC;AACjC,+BAAkC;AAClC,4BAA+B;AAC/B,wBAAuB;AACvB,oBAA4B;AA2R5B,oBAAmB;AACnB,qBAAoB;AACpB,sBAAqB;AACrB,oBAAmB;AACnB,qBAAoB;AACpB,qBAAoB;AACpB,2BAA0B;AA5BV;AA9KhB,IAAM,4BAAwB;AAAA,EAI5B,CACE;AAAA,IACE,MAAM,OAAO,SAAS;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GACA,QACG;AAEH,UAAM,mBAAe,kBAAAA,SAAW;AAAA,MAC9B;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,QAAQ,UAAU,CAAC;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC;AAAA,IACnC,CAAC;AAGD,UAAM,OAAO,YAAY;AAGzB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,YAAY;AAAA,IAC5B,IAAI;AAEJ,UAAM,gBAAe,iCAAQ,iBAAgB;AAG7C;AAAA,MACE;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,MAAM;AAAA,QAClB,aAAa,MAAM;AAAA,QACnB,aAAa,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,qBAAiB;AAAA,MACrB,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,sBAAkB;AAAA,MACtB,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,mBAAe;AAAA,MACnB,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,YACL,eAAc,mCAAS,aAAY;AAAA,UACrC;AAAA,QACF;AAAA,QAEA,sDAAC,sBACC,sDAAC,yCAAiB,UAAjB,EAA0B,OAAO,gBAChC,sDAAC,2CAAkB,UAAlB,EAA2B,OAAO,iBACjC,sDAAC,qCAAe,UAAf,EAAwB,OAAO,cAC9B;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,UAAU;AAAA,YACZ;AAAA,YAEC;AAAA;AAAA,QACH,GACF,GACF,GACF,GACF;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,sBAAsB,cAAc;AAYpC,IAAM,eAAe;AAWrB,aAAa,SAAS,cAAAC;AACtB,aAAa,UAAU,eAAAC;AACvB,aAAa,WAAW,gBAAAC;AACxB,aAAa,SAAS,cAAAC;AACtB,aAAa,UAAU,eAAAC;AACvB,aAAa,gBAAgB,qBAAAC;AAC7B,aAAa,UAAU,eAAAC;AAEvB,IAAO,uBAAQ;",
|
|
6
6
|
"names": ["useADKChat", "Header", "Sidebar", "Messages", "Sender", "Chatbot", "DefaultLayout", "Welcome"]
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from
|
|
2
|
-
import XAdkSender from
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import XAdkSender from ".";
|
|
3
3
|
declare const meta: Meta<typeof XAdkSender>;
|
|
4
4
|
export default meta;
|
|
5
5
|
type Story = StoryObj<typeof meta>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAdkSender/XAdkSender.stories.tsx"],
|
|
4
|
-
"sourcesContent": ["import { useState } from
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAyB;AAGzB,eAAuB;AAoDjB;AAlDN,IAAM,OAAgC;AAAA,EACpC,OAAO;AAAA,EACP,WAAW,SAAAA;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,CAAC,UAAU;AAAA,EACjB,UAAU,CAAC;AACb;AAEA,IAAO,6BAAQ;AAIf,IAAM,kBAAkB,MAAM;AAC5B,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,EAAE;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAG5C,QAAM,eAAe,CAAC,SAAc;AAClC,YAAQ,KAAK,UAAU,IAAI;AAAA,EAC7B;AAEA,QAAM,cAAc,MAAM;AACxB,YAAQ,KAAK,OAAO;AAAA,EACtB;AAGA,QAAM,aAAa,MAAM;AACvB,YAAQ,KAAK,MAAM;AAAA,EACrB;AAGA,QAAM,eAAe,CAAC,SAAiB;AACrC,eAAW,IAAI;AAAA,EACjB;AAGA,QAAM,oBAAoB,CAAC,QAAa;AACtC,eAAW,IAAI;AACf,eAAW,MAAM;AACf,iBAAW,EAAE;AACb,eAAS,CAAC,CAAC;AACX,iBAAW,KAAK;AAAA,IAClB,GAAG,GAAI;AAAA,EACT;AAEA,SACE,4CAAC,SAAI,OAAO,EAAE,OAAO,KAAK,QAAQ,kBAAkB,SAAS,GAAG,GAC9D;AAAA,IAAC,SAAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,MACb,eAAe,OAAO,EAAE,MAAM,YAAY,WAAW,QAAQ,MAAM;AACjE,YAAI;AAEF,gBAAM,WAAW,IAAI,SAAS;AAC9B,mBAAS,OAAO,QAAQ,IAAI;AAG5B,cAAI,WAAW;AACf,gBAAM,WAAW,YAAY,MAAM;AACjC,wBAAY;AACZ,qDAAa,EAAE,SAAS,SAAS;AAEjC,gBAAI,YAAY,KAAK;AACnB,4BAAc,QAAQ;AAEtB,oBAAM,eAAe;AAAA,gBACnB,MAAM;AAAA,gBACN,MAAM;AAAA,kBACJ,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,GAAI,IAAI;AAAA,kBAC3C,SAAS,+BAA+B,KAAK;AAAA,kBAC7C,UAAU,KAAK;AAAA,kBACf,UAAU,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,gBAC1C;AAAA,cACF;AACA,qDAAY;AAAA,YACd;AAAA,UACF,GAAG,GAAG;AAAA,
|
|
4
|
+
"sourcesContent": ["import { useState } from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\nimport type { Attachment } from \"@ant-design/x/es/attachments\";\nimport XAdkSender from \".\";\n\nconst meta: Meta<typeof XAdkSender> = {\n title: \"AI组件/XAdkSender 输入框\",\n component: XAdkSender,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n argTypes: {},\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// 基础用法\nconst BasicUsageStory = () => {\n const [files, setFiles] = useState<Attachment[]>([]);\n const [content, setContent] = useState(\"\");\n const [loading, setLoading] = useState(false);\n\n // 模拟清空数据\n const handleSubmit = (data: any) => {\n console.info(\"submit\", data);\n };\n\n const handleClear = () => {\n console.info(\"clear\");\n };\n\n // 模拟停止发送\n const handleStop = () => {\n console.info(\"stop\");\n };\n\n // 模拟输入\n const handleChange = (text: string) => {\n setContent(text);\n };\n\n // 模拟快捷短语点击\n const handleSendMessage = (obj: any) => {\n setLoading(true);\n setTimeout(() => {\n setContent(\"\");\n setFiles([]);\n setLoading(false);\n }, 2000);\n };\n\n return (\n <div style={{ width: 800, border: \"1px solid #eee\", padding: 20 }}>\n <XAdkSender\n loading={loading}\n clearBtnShow={true}\n allowUpload={true}\n uploadRequest={async ({ file, onProgress, onSuccess, onError }) => {\n try {\n // 创建 FormData\n const formData = new FormData();\n formData.append(\"file\", file);\n\n // 模拟上传进度\n let progress = 0;\n const interval = setInterval(() => {\n progress += 10;\n onProgress?.({ percent: progress });\n\n if (progress >= 100) {\n clearInterval(interval);\n // 模拟成功响应\n const mockResponse = {\n code: 200,\n data: {\n fileId: Math.floor(Math.random() * 1000) + 1,\n tempUrl: `https://example.com/uploads/${file.name}`,\n fileName: file.name,\n fileType: file.name.split(\".\").pop() || \"\",\n },\n };\n onSuccess?.(mockResponse);\n }\n }, 100);\n } catch (error) {\n onError?.(error as Error);\n }\n }}\n onSubmit={handleSubmit}\n onClear={handleClear}\n onStop={handleStop}\n />\n </div>\n );\n};\n\nexport const 基础用法: Story = {\n render: BasicUsageStory,\n args: {},\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAyB;AAGzB,eAAuB;AAoDjB;AAlDN,IAAM,OAAgC;AAAA,EACpC,OAAO;AAAA,EACP,WAAW,SAAAA;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,CAAC,UAAU;AAAA,EACjB,UAAU,CAAC;AACb;AAEA,IAAO,6BAAQ;AAIf,IAAM,kBAAkB,MAAM;AAC5B,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,EAAE;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAG5C,QAAM,eAAe,CAAC,SAAc;AAClC,YAAQ,KAAK,UAAU,IAAI;AAAA,EAC7B;AAEA,QAAM,cAAc,MAAM;AACxB,YAAQ,KAAK,OAAO;AAAA,EACtB;AAGA,QAAM,aAAa,MAAM;AACvB,YAAQ,KAAK,MAAM;AAAA,EACrB;AAGA,QAAM,eAAe,CAAC,SAAiB;AACrC,eAAW,IAAI;AAAA,EACjB;AAGA,QAAM,oBAAoB,CAAC,QAAa;AACtC,eAAW,IAAI;AACf,eAAW,MAAM;AACf,iBAAW,EAAE;AACb,eAAS,CAAC,CAAC;AACX,iBAAW,KAAK;AAAA,IAClB,GAAG,GAAI;AAAA,EACT;AAEA,SACE,4CAAC,SAAI,OAAO,EAAE,OAAO,KAAK,QAAQ,kBAAkB,SAAS,GAAG,GAC9D;AAAA,IAAC,SAAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,MACb,eAAe,OAAO,EAAE,MAAM,YAAY,WAAW,QAAQ,MAAM;AACjE,YAAI;AAEF,gBAAM,WAAW,IAAI,SAAS;AAC9B,mBAAS,OAAO,QAAQ,IAAI;AAG5B,cAAI,WAAW;AACf,gBAAM,WAAW,YAAY,MAAM;AACjC,wBAAY;AACZ,qDAAa,EAAE,SAAS,SAAS;AAEjC,gBAAI,YAAY,KAAK;AACnB,4BAAc,QAAQ;AAEtB,oBAAM,eAAe;AAAA,gBACnB,MAAM;AAAA,gBACN,MAAM;AAAA,kBACJ,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,GAAI,IAAI;AAAA,kBAC3C,SAAS,+BAA+B,KAAK;AAAA,kBAC7C,UAAU,KAAK;AAAA,kBACf,UAAU,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,gBAC1C;AAAA,cACF;AACA,qDAAY;AAAA,YACd;AAAA,UACF,GAAG,GAAG;AAAA,QACR,SAAS,OAAP;AACA,6CAAU;AAAA,QACZ;AAAA,MACF;AAAA,MACA,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQ;AAAA;AAAA,EACV,GACF;AAEJ;AAEO,IAAM,OAAc;AAAA,EACzB,QAAQ;AAAA,EACR,MAAM,CAAC;AACT;",
|
|
6
6
|
"names": ["XAdkSender"]
|
|
7
7
|
}
|
|
@@ -31,5 +31,9 @@ onError, onMessage, onSuccess, onStream, }: DebugOptions): {
|
|
|
31
31
|
setMessages: import("react").Dispatch<import("react").SetStateAction<IMessage[]>>;
|
|
32
32
|
storeEvents: (part: Part | null, event: any) => void;
|
|
33
33
|
storeMessage: (part: Part | null, event: Event, role: "user" | "bot") => void;
|
|
34
|
+
likeMessage: (invocationId: string, isLike: 1 | -1, feedbackData?: {
|
|
35
|
+
feedbackTags?: string;
|
|
36
|
+
feedbackDescription?: string;
|
|
37
|
+
}) => Promise<boolean>;
|
|
34
38
|
};
|
|
35
39
|
export default useADKChat;
|
|
@@ -49,7 +49,7 @@ var combineTextParts = (parts) => {
|
|
|
49
49
|
return result;
|
|
50
50
|
};
|
|
51
51
|
function useADKChat({
|
|
52
|
-
url,
|
|
52
|
+
url = window.location.origin,
|
|
53
53
|
token,
|
|
54
54
|
config = {},
|
|
55
55
|
type = "agentDebug",
|
|
@@ -677,6 +677,27 @@ function useADKChat({
|
|
|
677
677
|
import_antd.message.error("删除会话失败");
|
|
678
678
|
}
|
|
679
679
|
};
|
|
680
|
+
const likeMessage = async (invocationId, isLike, feedbackData) => {
|
|
681
|
+
if (!appNo || !invocationId)
|
|
682
|
+
return false;
|
|
683
|
+
const { result } = await (0, import_api.addFeedback)({
|
|
684
|
+
url,
|
|
685
|
+
appNo,
|
|
686
|
+
token,
|
|
687
|
+
requestId: invocationId,
|
|
688
|
+
isLike,
|
|
689
|
+
...feedbackData
|
|
690
|
+
});
|
|
691
|
+
if ((result == null ? void 0 : result.code) === import_constants.API_SUCCESS_CODE) {
|
|
692
|
+
setMessages(
|
|
693
|
+
(prev) => prev.map(
|
|
694
|
+
(m) => m.invocationId === invocationId ? { ...m, isLike } : m
|
|
695
|
+
)
|
|
696
|
+
);
|
|
697
|
+
return true;
|
|
698
|
+
}
|
|
699
|
+
return false;
|
|
700
|
+
};
|
|
680
701
|
const updateSession = async (sessionId, title) => {
|
|
681
702
|
if (!sessionId && !title)
|
|
682
703
|
return;
|
|
@@ -752,7 +773,8 @@ function useADKChat({
|
|
|
752
773
|
setCurrentSessionDetail,
|
|
753
774
|
setMessages,
|
|
754
775
|
storeEvents,
|
|
755
|
-
storeMessage
|
|
776
|
+
storeMessage,
|
|
777
|
+
likeMessage
|
|
756
778
|
};
|
|
757
779
|
}
|
|
758
780
|
var useADKChat_default = useADKChat;
|