sa2kit 3.4.0 → 3.6.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.
Files changed (129) hide show
  1. package/dist/{chunk-KVYHCGRY.js → chunk-7Z3XR2Y4.js} +552 -263
  2. package/dist/chunk-7Z3XR2Y4.js.map +1 -0
  3. package/dist/chunk-XPY45Y75.js +1143 -0
  4. package/dist/chunk-XPY45Y75.js.map +1 -0
  5. package/dist/{chunk-YIRPPMCN.mjs → chunk-XSTMLLJV.mjs} +474 -198
  6. package/dist/chunk-XSTMLLJV.mjs.map +1 -0
  7. package/dist/chunk-ZJLS5JU5.mjs +1090 -0
  8. package/dist/chunk-ZJLS5JU5.mjs.map +1 -0
  9. package/dist/common/aiApi/client/index.d.mts +71 -0
  10. package/dist/common/aiApi/client/index.d.ts +71 -0
  11. package/dist/common/aiApi/client/index.js +165 -0
  12. package/dist/common/aiApi/client/index.js.map +1 -0
  13. package/dist/common/aiApi/client/index.mjs +151 -0
  14. package/dist/common/aiApi/client/index.mjs.map +1 -0
  15. package/dist/common/aiApi/index.d.mts +184 -0
  16. package/dist/common/aiApi/index.d.ts +184 -0
  17. package/dist/common/aiApi/index.js +217 -0
  18. package/dist/common/aiApi/index.mjs +4 -0
  19. package/dist/common/aiApi/server/index.d.mts +3 -0
  20. package/dist/common/aiApi/server/index.d.ts +3 -0
  21. package/dist/common/aiApi/server/index.js +217 -0
  22. package/dist/common/aiApi/server/index.mjs +4 -0
  23. package/dist/common/components/index.js +176 -177
  24. package/dist/common/components/index.mjs +1 -2
  25. package/dist/common/index.js +2 -3
  26. package/dist/common/index.mjs +1 -2
  27. package/dist/index.d.mts +314 -154
  28. package/dist/index.d.ts +314 -154
  29. package/dist/index.js +1055 -369
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +1005 -360
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/types-CiqMQ-uu.d.mts +166 -0
  34. package/dist/types-CiqMQ-uu.d.ts +166 -0
  35. package/package.json +15 -50
  36. package/dist/chunk-3R6JHA6D.js +0 -120
  37. package/dist/chunk-3R6JHA6D.js.map +0 -1
  38. package/dist/chunk-4PJM4752.js +0 -4
  39. package/dist/chunk-4PJM4752.js.map +0 -1
  40. package/dist/chunk-7PMT4L4I.js +0 -324
  41. package/dist/chunk-7PMT4L4I.js.map +0 -1
  42. package/dist/chunk-FY2X3LYR.mjs +0 -3
  43. package/dist/chunk-FY2X3LYR.mjs.map +0 -1
  44. package/dist/chunk-GS4SAW25.mjs +0 -116
  45. package/dist/chunk-GS4SAW25.mjs.map +0 -1
  46. package/dist/chunk-HL4H2HF6.js +0 -279
  47. package/dist/chunk-HL4H2HF6.js.map +0 -1
  48. package/dist/chunk-IJIQUMAK.mjs +0 -272
  49. package/dist/chunk-IJIQUMAK.mjs.map +0 -1
  50. package/dist/chunk-KVYHCGRY.js.map +0 -1
  51. package/dist/chunk-MMDSZIXD.mjs +0 -286
  52. package/dist/chunk-MMDSZIXD.mjs.map +0 -1
  53. package/dist/chunk-N2O3OX5Y.mjs +0 -243
  54. package/dist/chunk-N2O3OX5Y.mjs.map +0 -1
  55. package/dist/chunk-RRQ2X26Z.js +0 -106
  56. package/dist/chunk-RRQ2X26Z.js.map +0 -1
  57. package/dist/chunk-RVNQI6BI.js +0 -249
  58. package/dist/chunk-RVNQI6BI.js.map +0 -1
  59. package/dist/chunk-UJUWDF7M.mjs +0 -336
  60. package/dist/chunk-UJUWDF7M.mjs.map +0 -1
  61. package/dist/chunk-VCKXK6V5.js +0 -345
  62. package/dist/chunk-VCKXK6V5.js.map +0 -1
  63. package/dist/chunk-VIEXDTNF.mjs +0 -100
  64. package/dist/chunk-VIEXDTNF.mjs.map +0 -1
  65. package/dist/chunk-YIRPPMCN.mjs.map +0 -1
  66. package/dist/common/ai/llm/core/index.d.mts +0 -70
  67. package/dist/common/ai/llm/core/index.d.ts +0 -70
  68. package/dist/common/ai/llm/core/index.js +0 -54
  69. package/dist/common/ai/llm/core/index.mjs +0 -5
  70. package/dist/common/ai/llm/electron/index.d.mts +0 -6
  71. package/dist/common/ai/llm/electron/index.d.ts +0 -6
  72. package/dist/common/ai/llm/electron/index.js +0 -67
  73. package/dist/common/ai/llm/electron/index.mjs +0 -10
  74. package/dist/common/ai/llm/index.d.mts +0 -3
  75. package/dist/common/ai/llm/index.d.ts +0 -3
  76. package/dist/common/ai/llm/index.js +0 -54
  77. package/dist/common/ai/llm/index.js.map +0 -1
  78. package/dist/common/ai/llm/index.mjs +0 -5
  79. package/dist/common/ai/llm/index.mjs.map +0 -1
  80. package/dist/common/ai/llm/miniapp/index.d.mts +0 -6
  81. package/dist/common/ai/llm/miniapp/index.d.ts +0 -6
  82. package/dist/common/ai/llm/miniapp/index.js +0 -59
  83. package/dist/common/ai/llm/miniapp/index.js.map +0 -1
  84. package/dist/common/ai/llm/miniapp/index.mjs +0 -6
  85. package/dist/common/ai/llm/miniapp/index.mjs.map +0 -1
  86. package/dist/common/ai/llm/rn/index.d.mts +0 -6
  87. package/dist/common/ai/llm/rn/index.d.ts +0 -6
  88. package/dist/common/ai/llm/rn/index.js +0 -59
  89. package/dist/common/ai/llm/rn/index.js.map +0 -1
  90. package/dist/common/ai/llm/rn/index.mjs +0 -6
  91. package/dist/common/ai/llm/rn/index.mjs.map +0 -1
  92. package/dist/common/ai/llm/ui/electron/index.d.mts +0 -5
  93. package/dist/common/ai/llm/ui/electron/index.d.ts +0 -5
  94. package/dist/common/ai/llm/ui/electron/index.js +0 -22
  95. package/dist/common/ai/llm/ui/electron/index.js.map +0 -1
  96. package/dist/common/ai/llm/ui/electron/index.mjs +0 -9
  97. package/dist/common/ai/llm/ui/electron/index.mjs.map +0 -1
  98. package/dist/common/ai/llm/ui/miniapp/index.d.mts +0 -9
  99. package/dist/common/ai/llm/ui/miniapp/index.d.ts +0 -9
  100. package/dist/common/ai/llm/ui/miniapp/index.js +0 -14
  101. package/dist/common/ai/llm/ui/miniapp/index.js.map +0 -1
  102. package/dist/common/ai/llm/ui/miniapp/index.mjs +0 -5
  103. package/dist/common/ai/llm/ui/miniapp/index.mjs.map +0 -1
  104. package/dist/common/ai/llm/ui/rn/index.d.mts +0 -9
  105. package/dist/common/ai/llm/ui/rn/index.d.ts +0 -9
  106. package/dist/common/ai/llm/ui/rn/index.js +0 -14
  107. package/dist/common/ai/llm/ui/rn/index.js.map +0 -1
  108. package/dist/common/ai/llm/ui/rn/index.mjs +0 -5
  109. package/dist/common/ai/llm/ui/rn/index.mjs.map +0 -1
  110. package/dist/common/ai/llm/ui/web/index.d.mts +0 -15
  111. package/dist/common/ai/llm/ui/web/index.d.ts +0 -15
  112. package/dist/common/ai/llm/ui/web/index.js +0 -21
  113. package/dist/common/ai/llm/ui/web/index.js.map +0 -1
  114. package/dist/common/ai/llm/ui/web/index.mjs +0 -8
  115. package/dist/common/ai/llm/ui/web/index.mjs.map +0 -1
  116. package/dist/common/ai/llm/web/index.d.mts +0 -6
  117. package/dist/common/ai/llm/web/index.d.ts +0 -6
  118. package/dist/common/ai/llm/web/index.js +0 -66
  119. package/dist/common/ai/llm/web/index.js.map +0 -1
  120. package/dist/common/ai/llm/web/index.mjs +0 -9
  121. package/dist/common/ai/llm/web/index.mjs.map +0 -1
  122. package/dist/types-B2rs_jq1.d.mts +0 -38
  123. package/dist/types-DgACCUpT.d.ts +0 -122
  124. package/dist/types-DwS2Eg0q.d.ts +0 -38
  125. package/dist/types-LU_BGSzk.d.mts +0 -122
  126. /package/dist/common/{ai/llm/core → aiApi}/index.js.map +0 -0
  127. /package/dist/common/{ai/llm/core → aiApi}/index.mjs.map +0 -0
  128. /package/dist/common/{ai/llm/electron → aiApi/server}/index.js.map +0 -0
  129. /package/dist/common/{ai/llm/electron → aiApi/server}/index.mjs.map +0 -0
@@ -1,106 +0,0 @@
1
- 'use strict';
2
-
3
- var chunk3R6JHA6D_js = require('./chunk-3R6JHA6D.js');
4
- var React = require('react');
5
- var components = require('@tarojs/components');
6
-
7
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
-
9
- var React__default = /*#__PURE__*/_interopDefault(React);
10
-
11
- var AiChatDialog = ({
12
- open,
13
- onOpenChange,
14
- client,
15
- title = "AI \u5BF9\u8BDD",
16
- placeholder = "\u8F93\u5165\u4F60\u60F3\u54A8\u8BE2\u7684\u95EE\u9898...",
17
- systemPrompt,
18
- template,
19
- templateVariables,
20
- initialMessages,
21
- requestOptions,
22
- onResponse,
23
- onError
24
- }) => {
25
- const { messages, sendMessage, isLoading, error } = chunk3R6JHA6D_js.useAiChat({
26
- client,
27
- systemPrompt,
28
- template,
29
- initialMessages
30
- });
31
- const [input, setInput] = React.useState("");
32
- const helperText = React.useMemo(() => {
33
- return template ? "\u6A21\u677F\u5DF2\u542F\u7528\uFF0C\u652F\u6301 {{input}} \u53D8\u91CF\u3002" : "\u76F4\u63A5\u8F93\u5165\u5373\u53EF\u5F00\u59CB\u5BF9\u8BDD\u3002";
34
- }, [template]);
35
- React.useEffect(() => {
36
- if (!open) {
37
- setInput("");
38
- }
39
- }, [open]);
40
- const handleSend = async () => {
41
- const content = input.trim();
42
- if (!content || isLoading) return;
43
- setInput("");
44
- try {
45
- const response = await sendMessage(content, {
46
- ...requestOptions,
47
- template,
48
- variables: templateVariables
49
- });
50
- onResponse?.(response);
51
- } catch (err) {
52
- const nextError = err instanceof Error ? err : new Error(String(err));
53
- onError?.(nextError);
54
- }
55
- };
56
- if (!open) {
57
- return null;
58
- }
59
- return /* @__PURE__ */ React__default.default.createElement(components.View, { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/40 px-4" }, /* @__PURE__ */ React__default.default.createElement(components.View, { className: "w-full max-w-[640px] rounded-2xl bg-white p-4 shadow-lg" }, /* @__PURE__ */ React__default.default.createElement(components.View, { className: "flex items-center justify-between" }, /* @__PURE__ */ React__default.default.createElement(components.Text, { className: "text-base font-semibold text-slate-900" }, title), /* @__PURE__ */ React__default.default.createElement(
60
- components.Text,
61
- {
62
- className: "text-xs text-slate-500",
63
- onClick: () => onOpenChange?.(false)
64
- },
65
- "\u5173\u95ED"
66
- )), /* @__PURE__ */ React__default.default.createElement(
67
- components.ScrollView,
68
- {
69
- scrollY: true,
70
- className: "mt-3 max-h-[60vh] rounded-xl border border-slate-100 bg-slate-50/60 p-3"
71
- },
72
- messages.length === 0 && /* @__PURE__ */ React__default.default.createElement(components.View, { className: "flex flex-col items-center justify-center py-8 text-xs text-slate-400" }, /* @__PURE__ */ React__default.default.createElement(components.Text, null, "\u6682\u65E0\u5BF9\u8BDD\u5185\u5BB9"), /* @__PURE__ */ React__default.default.createElement(components.Text, null, "\u8F93\u5165\u6D88\u606F\u5F00\u59CB\u4F53\u9A8C AI \u5BF9\u8BDD\u3002")),
73
- /* @__PURE__ */ React__default.default.createElement(components.View, { className: "flex flex-col gap-3" }, messages.map((message, index) => {
74
- const isUser = message.role === "user";
75
- return /* @__PURE__ */ React__default.default.createElement(
76
- components.View,
77
- {
78
- key: `${message.role}-${index}`,
79
- className: `max-w-[85%] rounded-2xl px-3 py-2 text-xs leading-relaxed ${isUser ? "ml-auto bg-slate-900 text-white" : "mr-auto border border-slate-200 bg-white text-slate-800"}`
80
- },
81
- /* @__PURE__ */ React__default.default.createElement(components.Text, null, message.content)
82
- );
83
- }), isLoading && /* @__PURE__ */ React__default.default.createElement(components.View, { className: "mr-auto max-w-[70%] rounded-2xl border border-slate-200 bg-white px-3 py-2 text-xs text-slate-500" }, /* @__PURE__ */ React__default.default.createElement(components.Text, null, "AI \u6B63\u5728\u601D\u8003...")))
84
- ), /* @__PURE__ */ React__default.default.createElement(components.View, { className: "mt-3 rounded-xl border border-slate-100 bg-white p-3" }, /* @__PURE__ */ React__default.default.createElement(
85
- components.Textarea,
86
- {
87
- value: input,
88
- onInput: (event) => setInput(event.detail.value),
89
- placeholder,
90
- className: "min-h-[88px] w-full rounded-lg border border-slate-200 px-3 py-2 text-xs"
91
- }
92
- ), /* @__PURE__ */ React__default.default.createElement(components.View, { className: "mt-2 flex items-center justify-between" }, /* @__PURE__ */ React__default.default.createElement(components.Text, { className: "text-[10px] text-slate-400" }, helperText), /* @__PURE__ */ React__default.default.createElement(
93
- components.Button,
94
- {
95
- size: "mini",
96
- className: "bg-slate-900 text-white",
97
- disabled: !input.trim() || isLoading,
98
- onClick: handleSend
99
- },
100
- isLoading ? "\u53D1\u9001\u4E2D..." : "\u53D1\u9001"
101
- )), error && /* @__PURE__ */ React__default.default.createElement(components.View, { className: "mt-2 rounded-md border border-rose-200 bg-rose-50 px-2 py-1 text-[10px] text-rose-600" }, /* @__PURE__ */ React__default.default.createElement(components.Text, null, error.message || "\u5BF9\u8BDD\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\u3002")))));
102
- };
103
-
104
- exports.AiChatDialog = AiChatDialog;
105
- //# sourceMappingURL=chunk-RRQ2X26Z.js.map
106
- //# sourceMappingURL=chunk-RRQ2X26Z.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/ai/llm/ui/miniapp/components/AiChatDialog.tsx"],"names":["useAiChat","useState","useMemo","useEffect","View","React","Text","ScrollView","Textarea","Button"],"mappings":"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","file":"chunk-RRQ2X26Z.js","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, ScrollView, Text, Textarea, View } from '@tarojs/components';\nimport { useAiChat } from '../../../hooks/useAiChat';\nimport type { AiChatDialogProps } from '../../types';\n\nexport const AiChatDialog: React.FC<AiChatDialogProps> = ({\n open,\n onOpenChange,\n client,\n title = 'AI 对话',\n placeholder = '输入你想咨询的问题...',\n systemPrompt,\n template,\n templateVariables,\n initialMessages,\n requestOptions,\n onResponse,\n onError,\n}) => {\n const { messages, sendMessage, isLoading, error } = useAiChat({\n client,\n systemPrompt,\n template,\n initialMessages,\n });\n const [input, setInput] = useState('');\n\n const helperText = useMemo(() => {\n return template ? '模板已启用,支持 {{input}} 变量。' : '直接输入即可开始对话。';\n }, [template]);\n\n useEffect(() => {\n if (!open) {\n setInput('');\n }\n }, [open]);\n\n const handleSend = async () => {\n const content = input.trim();\n if (!content || isLoading) return;\n setInput('');\n try {\n const response = await sendMessage(content, {\n ...requestOptions,\n template,\n variables: templateVariables,\n });\n onResponse?.(response);\n } catch (err) {\n const nextError = err instanceof Error ? err : new Error(String(err));\n onError?.(nextError);\n }\n };\n\n if (!open) {\n return null;\n }\n\n return (\n <View className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/40 px-4\">\n <View className=\"w-full max-w-[640px] rounded-2xl bg-white p-4 shadow-lg\">\n <View className=\"flex items-center justify-between\">\n <Text className=\"text-base font-semibold text-slate-900\">{title}</Text>\n <Text\n className=\"text-xs text-slate-500\"\n onClick={() => onOpenChange?.(false)}\n >\n 关闭\n </Text>\n </View>\n\n <ScrollView\n scrollY\n className=\"mt-3 max-h-[60vh] rounded-xl border border-slate-100 bg-slate-50/60 p-3\"\n >\n {messages.length === 0 && (\n <View className=\"flex flex-col items-center justify-center py-8 text-xs text-slate-400\">\n <Text>暂无对话内容</Text>\n <Text>输入消息开始体验 AI 对话。</Text>\n </View>\n )}\n <View className=\"flex flex-col gap-3\">\n {messages.map((message, index) => {\n const isUser = message.role === 'user';\n return (\n <View\n key={`${message.role}-${index}`}\n className={`max-w-[85%] rounded-2xl px-3 py-2 text-xs leading-relaxed ${\n isUser\n ? 'ml-auto bg-slate-900 text-white'\n : 'mr-auto border border-slate-200 bg-white text-slate-800'\n }`}\n >\n <Text>{message.content}</Text>\n </View>\n );\n })}\n {isLoading && (\n <View className=\"mr-auto max-w-[70%] rounded-2xl border border-slate-200 bg-white px-3 py-2 text-xs text-slate-500\">\n <Text>AI 正在思考...</Text>\n </View>\n )}\n </View>\n </ScrollView>\n\n <View className=\"mt-3 rounded-xl border border-slate-100 bg-white p-3\">\n <Textarea\n value={input}\n onInput={(event: { detail: { value: string } }) => setInput(event.detail.value)}\n placeholder={placeholder}\n className=\"min-h-[88px] w-full rounded-lg border border-slate-200 px-3 py-2 text-xs\"\n />\n <View className=\"mt-2 flex items-center justify-between\">\n <Text className=\"text-[10px] text-slate-400\">{helperText}</Text>\n <Button\n size=\"mini\"\n className=\"bg-slate-900 text-white\"\n disabled={!input.trim() || isLoading}\n onClick={handleSend}\n >\n {isLoading ? '发送中...' : '发送'}\n </Button>\n </View>\n {error && (\n <View className=\"mt-2 rounded-md border border-rose-200 bg-rose-50 px-2 py-1 text-[10px] text-rose-600\">\n <Text>{error.message || '对话出错,请重试。'}</Text>\n </View>\n )}\n </View>\n </View>\n </View>\n );\n};\n"]}
@@ -1,249 +0,0 @@
1
- 'use strict';
2
-
3
- var chunk3R6JHA6D_js = require('./chunk-3R6JHA6D.js');
4
- var chunkNSBPE2FW_js = require('./chunk-NSBPE2FW.js');
5
- var React = require('react');
6
-
7
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
-
9
- var React__default = /*#__PURE__*/_interopDefault(React);
10
-
11
- var ReactNative = chunkNSBPE2FW_js.__require("react-native");
12
- var {
13
- Modal,
14
- View,
15
- Text,
16
- TextInput,
17
- Pressable,
18
- ScrollView,
19
- SafeAreaView,
20
- KeyboardAvoidingView,
21
- Platform,
22
- StyleSheet
23
- } = ReactNative;
24
- var styles = StyleSheet.create({
25
- overlay: {
26
- flex: 1,
27
- backgroundColor: "rgba(15, 23, 42, 0.45)",
28
- justifyContent: "center",
29
- padding: 16
30
- },
31
- container: {
32
- backgroundColor: "#ffffff",
33
- borderRadius: 16,
34
- maxHeight: "90%",
35
- overflow: "hidden"
36
- },
37
- header: {
38
- paddingHorizontal: 16,
39
- paddingVertical: 12,
40
- borderBottomWidth: 1,
41
- borderBottomColor: "#e2e8f0",
42
- flexDirection: "row",
43
- justifyContent: "space-between",
44
- alignItems: "center"
45
- },
46
- title: {
47
- fontSize: 16,
48
- fontWeight: "600",
49
- color: "#0f172a"
50
- },
51
- closeText: {
52
- fontSize: 12,
53
- color: "#64748b"
54
- },
55
- list: {
56
- paddingHorizontal: 16,
57
- paddingVertical: 12
58
- },
59
- placeholder: {
60
- alignItems: "center",
61
- paddingVertical: 24
62
- },
63
- placeholderText: {
64
- fontSize: 12,
65
- color: "#94a3b8"
66
- },
67
- bubbleUser: {
68
- alignSelf: "flex-end",
69
- backgroundColor: "#0f172a",
70
- borderRadius: 16,
71
- paddingHorizontal: 12,
72
- paddingVertical: 8,
73
- marginBottom: 8
74
- },
75
- bubbleAssistant: {
76
- alignSelf: "flex-start",
77
- backgroundColor: "#ffffff",
78
- borderWidth: 1,
79
- borderColor: "#e2e8f0",
80
- borderRadius: 16,
81
- paddingHorizontal: 12,
82
- paddingVertical: 8,
83
- marginBottom: 8
84
- },
85
- bubbleTextUser: {
86
- color: "#ffffff",
87
- fontSize: 12
88
- },
89
- bubbleText: {
90
- color: "#1f2937",
91
- fontSize: 12
92
- },
93
- loadingText: {
94
- color: "#64748b",
95
- fontSize: 12
96
- },
97
- inputContainer: {
98
- padding: 12,
99
- borderTopWidth: 1,
100
- borderTopColor: "#e2e8f0"
101
- },
102
- textInput: {
103
- minHeight: 96,
104
- borderWidth: 1,
105
- borderColor: "#e2e8f0",
106
- borderRadius: 12,
107
- padding: 10,
108
- textAlignVertical: "top",
109
- fontSize: 12,
110
- color: "#0f172a"
111
- },
112
- helperRow: {
113
- flexDirection: "row",
114
- alignItems: "center",
115
- justifyContent: "space-between",
116
- marginTop: 8
117
- },
118
- helperText: {
119
- flex: 1,
120
- fontSize: 10,
121
- color: "#94a3b8",
122
- paddingRight: 8
123
- },
124
- sendButton: {
125
- backgroundColor: "#0f172a",
126
- paddingHorizontal: 14,
127
- paddingVertical: 8,
128
- borderRadius: 12
129
- },
130
- sendButtonDisabled: {
131
- backgroundColor: "#94a3b8"
132
- },
133
- sendButtonText: {
134
- color: "#ffffff",
135
- fontSize: 12,
136
- fontWeight: "600"
137
- },
138
- error: {
139
- marginTop: 8,
140
- borderWidth: 1,
141
- borderColor: "#fecdd3",
142
- backgroundColor: "#fff1f2",
143
- padding: 8,
144
- borderRadius: 8
145
- },
146
- errorText: {
147
- color: "#e11d48",
148
- fontSize: 10
149
- }
150
- });
151
- var AiChatDialog = ({
152
- open,
153
- onOpenChange,
154
- client,
155
- title = "AI \u5BF9\u8BDD",
156
- placeholder = "\u8F93\u5165\u4F60\u60F3\u54A8\u8BE2\u7684\u95EE\u9898...",
157
- systemPrompt,
158
- template,
159
- templateVariables,
160
- initialMessages,
161
- requestOptions,
162
- onResponse,
163
- onError
164
- }) => {
165
- const { messages, sendMessage, isLoading, error } = chunk3R6JHA6D_js.useAiChat({
166
- client,
167
- systemPrompt,
168
- template,
169
- initialMessages
170
- });
171
- const [input, setInput] = React.useState("");
172
- const helperText = React.useMemo(() => {
173
- return template ? "\u6A21\u677F\u5DF2\u542F\u7528\uFF0C\u652F\u6301 {{input}} \u53D8\u91CF\u3002" : "\u76F4\u63A5\u8F93\u5165\u5373\u53EF\u5F00\u59CB\u5BF9\u8BDD\u3002";
174
- }, [template]);
175
- React.useEffect(() => {
176
- if (!open) {
177
- setInput("");
178
- }
179
- }, [open]);
180
- const handleSend = async () => {
181
- const content = input.trim();
182
- if (!content || isLoading) return;
183
- setInput("");
184
- try {
185
- const response = await sendMessage(content, {
186
- ...requestOptions,
187
- template,
188
- variables: templateVariables
189
- });
190
- onResponse?.(response);
191
- } catch (err) {
192
- const nextError = err instanceof Error ? err : new Error(String(err));
193
- onError?.(nextError);
194
- }
195
- };
196
- return /* @__PURE__ */ React__default.default.createElement(
197
- Modal,
198
- {
199
- visible: open,
200
- transparent: true,
201
- animationType: "fade",
202
- onRequestClose: () => onOpenChange?.(false)
203
- },
204
- /* @__PURE__ */ React__default.default.createElement(SafeAreaView, { style: styles.overlay }, /* @__PURE__ */ React__default.default.createElement(
205
- KeyboardAvoidingView,
206
- {
207
- behavior: Platform.OS === "ios" ? "padding" : void 0,
208
- style: styles.container
209
- },
210
- /* @__PURE__ */ React__default.default.createElement(View, { style: styles.header }, /* @__PURE__ */ React__default.default.createElement(Text, { style: styles.title }, title), /* @__PURE__ */ React__default.default.createElement(Pressable, { onPress: () => onOpenChange?.(false) }, /* @__PURE__ */ React__default.default.createElement(Text, { style: styles.closeText }, "\u5173\u95ED"))),
211
- /* @__PURE__ */ React__default.default.createElement(ScrollView, { contentContainerStyle: styles.list }, messages.length === 0 && /* @__PURE__ */ React__default.default.createElement(View, { style: styles.placeholder }, /* @__PURE__ */ React__default.default.createElement(Text, { style: styles.placeholderText }, "\u6682\u65E0\u5BF9\u8BDD\u5185\u5BB9"), /* @__PURE__ */ React__default.default.createElement(Text, { style: styles.placeholderText }, "\u8F93\u5165\u6D88\u606F\u5F00\u59CB\u4F53\u9A8C AI \u5BF9\u8BDD\u3002")), messages.map((message, index) => {
212
- const isUser = message.role === "user";
213
- return /* @__PURE__ */ React__default.default.createElement(
214
- View,
215
- {
216
- key: `${message.role}-${index}`,
217
- style: isUser ? styles.bubbleUser : styles.bubbleAssistant
218
- },
219
- /* @__PURE__ */ React__default.default.createElement(Text, { style: isUser ? styles.bubbleTextUser : styles.bubbleText }, message.content)
220
- );
221
- }), isLoading && /* @__PURE__ */ React__default.default.createElement(View, { style: styles.bubbleAssistant }, /* @__PURE__ */ React__default.default.createElement(Text, { style: styles.loadingText }, "AI \u6B63\u5728\u601D\u8003..."))),
222
- /* @__PURE__ */ React__default.default.createElement(View, { style: styles.inputContainer }, /* @__PURE__ */ React__default.default.createElement(
223
- TextInput,
224
- {
225
- value: input,
226
- onChangeText: setInput,
227
- placeholder,
228
- multiline: true,
229
- style: styles.textInput
230
- }
231
- ), /* @__PURE__ */ React__default.default.createElement(View, { style: styles.helperRow }, /* @__PURE__ */ React__default.default.createElement(Text, { style: styles.helperText }, helperText), /* @__PURE__ */ React__default.default.createElement(
232
- Pressable,
233
- {
234
- onPress: handleSend,
235
- disabled: !input.trim() || isLoading,
236
- style: [
237
- styles.sendButton,
238
- (!input.trim() || isLoading) && styles.sendButtonDisabled
239
- ]
240
- },
241
- /* @__PURE__ */ React__default.default.createElement(Text, { style: styles.sendButtonText }, isLoading ? "\u53D1\u9001\u4E2D..." : "\u53D1\u9001")
242
- )), error && /* @__PURE__ */ React__default.default.createElement(View, { style: styles.error }, /* @__PURE__ */ React__default.default.createElement(Text, { style: styles.errorText }, error.message || "\u5BF9\u8BDD\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\u3002")))
243
- ))
244
- );
245
- };
246
-
247
- exports.AiChatDialog = AiChatDialog;
248
- //# sourceMappingURL=chunk-RVNQI6BI.js.map
249
- //# sourceMappingURL=chunk-RVNQI6BI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/ai/llm/ui/rn/components/AiChatDialog.tsx"],"names":["__require","useAiChat","useState","useMemo","useEffect","React"],"mappings":"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","file":"chunk-RVNQI6BI.js","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { useAiChat } from '../../../hooks/useAiChat';\nimport type { AiChatDialogProps } from '../../types';\n\n// @ts-ignore - react-native will be provided at runtime in RN environment\nconst ReactNative = require('react-native') as any;\nconst {\n Modal,\n View,\n Text,\n TextInput,\n Pressable,\n ScrollView,\n SafeAreaView,\n KeyboardAvoidingView,\n Platform,\n StyleSheet,\n} = ReactNative;\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(15, 23, 42, 0.45)',\n justifyContent: 'center',\n padding: 16,\n },\n container: {\n backgroundColor: '#ffffff',\n borderRadius: 16,\n maxHeight: '90%',\n overflow: 'hidden',\n },\n header: {\n paddingHorizontal: 16,\n paddingVertical: 12,\n borderBottomWidth: 1,\n borderBottomColor: '#e2e8f0',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n color: '#0f172a',\n },\n closeText: {\n fontSize: 12,\n color: '#64748b',\n },\n list: {\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n placeholder: {\n alignItems: 'center',\n paddingVertical: 24,\n },\n placeholderText: {\n fontSize: 12,\n color: '#94a3b8',\n },\n bubbleUser: {\n alignSelf: 'flex-end',\n backgroundColor: '#0f172a',\n borderRadius: 16,\n paddingHorizontal: 12,\n paddingVertical: 8,\n marginBottom: 8,\n },\n bubbleAssistant: {\n alignSelf: 'flex-start',\n backgroundColor: '#ffffff',\n borderWidth: 1,\n borderColor: '#e2e8f0',\n borderRadius: 16,\n paddingHorizontal: 12,\n paddingVertical: 8,\n marginBottom: 8,\n },\n bubbleTextUser: {\n color: '#ffffff',\n fontSize: 12,\n },\n bubbleText: {\n color: '#1f2937',\n fontSize: 12,\n },\n loadingText: {\n color: '#64748b',\n fontSize: 12,\n },\n inputContainer: {\n padding: 12,\n borderTopWidth: 1,\n borderTopColor: '#e2e8f0',\n },\n textInput: {\n minHeight: 96,\n borderWidth: 1,\n borderColor: '#e2e8f0',\n borderRadius: 12,\n padding: 10,\n textAlignVertical: 'top',\n fontSize: 12,\n color: '#0f172a',\n },\n helperRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginTop: 8,\n },\n helperText: {\n flex: 1,\n fontSize: 10,\n color: '#94a3b8',\n paddingRight: 8,\n },\n sendButton: {\n backgroundColor: '#0f172a',\n paddingHorizontal: 14,\n paddingVertical: 8,\n borderRadius: 12,\n },\n sendButtonDisabled: {\n backgroundColor: '#94a3b8',\n },\n sendButtonText: {\n color: '#ffffff',\n fontSize: 12,\n fontWeight: '600',\n },\n error: {\n marginTop: 8,\n borderWidth: 1,\n borderColor: '#fecdd3',\n backgroundColor: '#fff1f2',\n padding: 8,\n borderRadius: 8,\n },\n errorText: {\n color: '#e11d48',\n fontSize: 10,\n },\n});\n\nexport const AiChatDialog: React.FC<AiChatDialogProps> = ({\n open,\n onOpenChange,\n client,\n title = 'AI 对话',\n placeholder = '输入你想咨询的问题...',\n systemPrompt,\n template,\n templateVariables,\n initialMessages,\n requestOptions,\n onResponse,\n onError,\n}) => {\n const { messages, sendMessage, isLoading, error } = useAiChat({\n client,\n systemPrompt,\n template,\n initialMessages,\n });\n const [input, setInput] = useState('');\n\n const helperText = useMemo(() => {\n return template ? '模板已启用,支持 {{input}} 变量。' : '直接输入即可开始对话。';\n }, [template]);\n\n useEffect(() => {\n if (!open) {\n setInput('');\n }\n }, [open]);\n\n const handleSend = async () => {\n const content = input.trim();\n if (!content || isLoading) return;\n setInput('');\n try {\n const response = await sendMessage(content, {\n ...requestOptions,\n template,\n variables: templateVariables,\n });\n onResponse?.(response);\n } catch (err) {\n const nextError = err instanceof Error ? err : new Error(String(err));\n onError?.(nextError);\n }\n };\n\n return (\n <Modal\n visible={open}\n transparent\n animationType=\"fade\"\n onRequestClose={() => onOpenChange?.(false)}\n >\n <SafeAreaView style={styles.overlay}>\n <KeyboardAvoidingView\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n style={styles.container}\n >\n <View style={styles.header}>\n <Text style={styles.title}>{title}</Text>\n <Pressable onPress={() => onOpenChange?.(false)}>\n <Text style={styles.closeText}>关闭</Text>\n </Pressable>\n </View>\n\n <ScrollView contentContainerStyle={styles.list}>\n {messages.length === 0 && (\n <View style={styles.placeholder}>\n <Text style={styles.placeholderText}>暂无对话内容</Text>\n <Text style={styles.placeholderText}>输入消息开始体验 AI 对话。</Text>\n </View>\n )}\n {messages.map((message, index) => {\n const isUser = message.role === 'user';\n return (\n <View\n key={`${message.role}-${index}`}\n style={isUser ? styles.bubbleUser : styles.bubbleAssistant}\n >\n <Text style={isUser ? styles.bubbleTextUser : styles.bubbleText}>\n {message.content}\n </Text>\n </View>\n );\n })}\n {isLoading && (\n <View style={styles.bubbleAssistant}>\n <Text style={styles.loadingText}>AI 正在思考...</Text>\n </View>\n )}\n </ScrollView>\n\n <View style={styles.inputContainer}>\n <TextInput\n value={input}\n onChangeText={setInput}\n placeholder={placeholder}\n multiline\n style={styles.textInput}\n />\n <View style={styles.helperRow}>\n <Text style={styles.helperText}>{helperText}</Text>\n <Pressable\n onPress={handleSend}\n disabled={!input.trim() || isLoading}\n style={[\n styles.sendButton,\n (!input.trim() || isLoading) && styles.sendButtonDisabled,\n ]}\n >\n <Text style={styles.sendButtonText}>{isLoading ? '发送中...' : '发送'}</Text>\n </Pressable>\n </View>\n {error && (\n <View style={styles.error}>\n <Text style={styles.errorText}>{error.message || '对话出错,请重试。'}</Text>\n </View>\n )}\n </View>\n </KeyboardAvoidingView>\n </SafeAreaView>\n </Modal>\n );\n};\n"]}