@ai-group/chat-sdk 0.2.9 → 0.3.1
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/XAiChatbot/XAiChatbot.stories.js +76 -63
- package/dist/cjs/components/XAiChatbot/XAiChatbot.stories.js.map +2 -2
- package/dist/cjs/components/XAiChatbot/index.js +35 -9
- package/dist/cjs/components/XAiChatbot/index.js.map +2 -2
- package/dist/cjs/components/XAiProvider/index.js +1 -1
- package/dist/cjs/components/XAiProvider/index.js.map +2 -2
- package/dist/cjs/hooks/useAgentGenerator.js +79 -69
- package/dist/cjs/hooks/useAgentGenerator.js.map +2 -2
- package/dist/cjs/styles/markdown.js +140 -138
- package/dist/cjs/styles/markdown.js.map +2 -2
- package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js +28 -14
- package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js.map +1 -1
- package/dist/esm/components/XAiChatbot/index.js +45 -11
- package/dist/esm/components/XAiChatbot/index.js.map +1 -1
- package/dist/esm/components/XAiProvider/index.js +2 -1
- package/dist/esm/components/XAiProvider/index.js.map +1 -1
- package/dist/esm/hooks/useAgentGenerator.js +146 -136
- package/dist/esm/hooks/useAgentGenerator.js.map +1 -1
- package/dist/esm/styles/markdown.js +1 -1
- package/dist/esm/styles/markdown.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -38,153 +38,155 @@ var MarkdownGlobalStyle = () => /* @__PURE__ */ import_react.default.createEleme
|
|
|
38
38
|
import_react2.Global,
|
|
39
39
|
{
|
|
40
40
|
styles: import_react2.css`
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
41
|
+
#x-ai-chatbot {
|
|
42
|
+
.markdown-body {
|
|
43
|
+
box-sizing: border-box;
|
|
44
|
+
min-width: 200px;
|
|
45
|
+
margin: 0 auto;
|
|
46
|
+
background: none !important;
|
|
47
|
+
}
|
|
48
|
+
.markdown-body p {
|
|
49
|
+
margin: 0;
|
|
50
|
+
}
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
52
|
+
.markdown-body h1,
|
|
53
|
+
.markdown-body h2,
|
|
54
|
+
.markdown-body h3,
|
|
55
|
+
.markdown-body h4,
|
|
56
|
+
.markdown-body h5,
|
|
57
|
+
.markdown-body h6 {
|
|
58
|
+
font-weight: bold;
|
|
59
|
+
margin: 0.1em 0;
|
|
60
|
+
line-height: 1.4;
|
|
61
|
+
}
|
|
62
|
+
.markdown-body h1 { font-size: 2em; }
|
|
63
|
+
.markdown-body h2 { font-size: 1.5em; }
|
|
64
|
+
.markdown-body h3 { font-size: 1.2em; }
|
|
65
|
+
.markdown-body h4 { font-size: 1em; }
|
|
66
|
+
.markdown-body h5 { font-size: 0.9em; }
|
|
67
|
+
.markdown-body h6 { font-size: 0.8em; }
|
|
67
68
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
69
|
+
.markdown-body ul,
|
|
70
|
+
.markdown-body ol {
|
|
71
|
+
margin: 0 0 1em 1.5em;
|
|
72
|
+
padding: 0;
|
|
73
|
+
}
|
|
74
|
+
.markdown-body li {
|
|
75
|
+
margin: 0.2em 0;
|
|
76
|
+
}
|
|
76
77
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
78
|
+
.markdown-body blockquote {
|
|
79
|
+
margin: 1em 0;
|
|
80
|
+
padding: 0.5em 1em;
|
|
81
|
+
color: #666;
|
|
82
|
+
border-left: 4px solid #e0e0e0;
|
|
83
|
+
background: #fafafa;
|
|
84
|
+
}
|
|
84
85
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
86
|
+
.markdown-body code {
|
|
87
|
+
background: #f5f5f5;
|
|
88
|
+
border-radius: 3px;
|
|
89
|
+
padding: 2px 4px;
|
|
90
|
+
font-size: 95%;
|
|
91
|
+
font-family: 'Fira Mono', 'Menlo', 'Consolas', monospace;
|
|
92
|
+
}
|
|
92
93
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
94
|
+
.markdown-body pre {
|
|
95
|
+
background: #f5f5f5;
|
|
96
|
+
border-radius: 4px;
|
|
97
|
+
padding: 12px;
|
|
98
|
+
overflow-x: auto;
|
|
99
|
+
font-size: 14px;
|
|
100
|
+
margin: 16px 0;
|
|
101
|
+
}
|
|
101
102
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
.markdown-body a {
|
|
104
|
+
color: #1677ff;
|
|
105
|
+
text-decoration: underline;
|
|
106
|
+
word-break: break-all;
|
|
107
|
+
}
|
|
107
108
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
109
|
+
/* 表格容器 */
|
|
110
|
+
.markdown-body table {
|
|
111
|
+
display: block;
|
|
112
|
+
overflow-x: auto;
|
|
113
|
+
border-collapse: collapse;
|
|
114
|
+
width: max-content;
|
|
115
|
+
min-width: 100%;
|
|
116
|
+
margin: 16px 0;
|
|
117
|
+
font-size: 14px;
|
|
118
|
+
/* 防止表格被父容器裁剪 */
|
|
119
|
+
max-width: 100%;
|
|
120
|
+
}
|
|
121
|
+
.markdown-body th,
|
|
122
|
+
.markdown-body td {
|
|
123
|
+
border: 1px solid #e0e0e0;
|
|
124
|
+
padding: 8px 12px;
|
|
125
|
+
text-align: left;
|
|
126
|
+
min-width: 120px; /* 设置最小宽度,可根据实际调整 */
|
|
127
|
+
white-space: nowrap; /* 防止内容换行 */
|
|
128
|
+
}
|
|
129
|
+
.markdown-body th {
|
|
130
|
+
background: #f5f5f5;
|
|
131
|
+
font-weight: bold;
|
|
132
|
+
}
|
|
132
133
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
134
|
+
.message-chatgpt p,
|
|
135
|
+
.message-chatgpt pre[class*='language-'] {
|
|
136
|
+
white-space: pre-wrap;
|
|
137
|
+
}
|
|
138
|
+
.message-chatgpt p:first-child {
|
|
139
|
+
margin-top: 0;
|
|
140
|
+
}
|
|
141
|
+
.message-chatgpt pre[class*='language-'],
|
|
142
|
+
.message-chatgpt code[class*='language-'] {
|
|
143
|
+
text-shadow: none;
|
|
144
|
+
}
|
|
145
|
+
.message-chatgpt pre[class*='language-'] {
|
|
146
|
+
font-size: 14px;
|
|
147
|
+
border-radius: 0.25rem;
|
|
148
|
+
position: relative;
|
|
149
|
+
}
|
|
149
150
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
151
|
+
|
|
152
|
+
.message-chatgpt a:-webkit-any-link {
|
|
153
|
+
cursor: pointer;
|
|
154
|
+
text-decoration: underline;
|
|
155
|
+
}
|
|
156
|
+
.message-chatgpt .prism-title {
|
|
157
|
+
position: sticky;
|
|
158
|
+
left: 0;
|
|
159
|
+
right: 0;
|
|
160
|
+
width: 100%;
|
|
161
|
+
padding: 0.75rem;
|
|
162
|
+
margin-bottom: 15px;
|
|
163
|
+
border-radius: 4px;
|
|
164
|
+
background-color: #343540;
|
|
165
|
+
display: flex;
|
|
166
|
+
justify-content: space-between;
|
|
167
|
+
align-items: center;
|
|
168
|
+
}
|
|
169
|
+
.message-chatgpt .prism-title.dark {
|
|
170
|
+
background-color: #1f2937;
|
|
171
|
+
color: #6b7280;
|
|
172
|
+
}
|
|
173
|
+
.message-chatgpt .prism-copy {
|
|
174
|
+
float: right;
|
|
175
|
+
cursor: pointer;
|
|
176
|
+
color: inherit;
|
|
177
|
+
}
|
|
178
|
+
.message-chatgpt .prism-copy:hover {
|
|
179
|
+
color: #9df69b;
|
|
180
|
+
}
|
|
181
|
+
.message-chatgpt .prism-copy.dark:hover {
|
|
182
|
+
color: #d1d5db;
|
|
183
|
+
}
|
|
184
|
+
.copy-disable {
|
|
185
|
+
-webkit-user-select: none;
|
|
186
|
+
-moz-user-select: none;
|
|
187
|
+
-ms-user-select: none;
|
|
188
|
+
user-select: none;
|
|
189
|
+
}
|
|
188
190
|
}
|
|
189
191
|
`
|
|
190
192
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/styles/markdown.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from 'react';\nimport { Global, css } from '@emotion/react';\n\nconst MarkdownGlobalStyle: React.FC = () => (\n <Global\n styles={css`\n .markdown-body {\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAClB,IAAAA,gBAA4B;AAE5B,IAAM,sBAAgC,MACpC,6BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import React from 'react';\nimport { Global, css } from '@emotion/react';\n\nconst MarkdownGlobalStyle: React.FC = () => (\n <Global\n styles={css`\n #x-ai-chatbot {\n .markdown-body {\n box-sizing: border-box;\n min-width: 200px;\n margin: 0 auto;\n background: none !important;\n }\n .markdown-body p {\n margin: 0;\n }\n\n .markdown-body h1,\n .markdown-body h2,\n .markdown-body h3,\n .markdown-body h4,\n .markdown-body h5,\n .markdown-body h6 {\n font-weight: bold;\n margin: 0.1em 0;\n line-height: 1.4;\n }\n .markdown-body h1 { font-size: 2em; }\n .markdown-body h2 { font-size: 1.5em; }\n .markdown-body h3 { font-size: 1.2em; }\n .markdown-body h4 { font-size: 1em; }\n .markdown-body h5 { font-size: 0.9em; }\n .markdown-body h6 { font-size: 0.8em; }\n\n .markdown-body ul,\n .markdown-body ol {\n margin: 0 0 1em 1.5em;\n padding: 0;\n }\n .markdown-body li {\n margin: 0.2em 0;\n }\n\n .markdown-body blockquote {\n margin: 1em 0;\n padding: 0.5em 1em;\n color: #666;\n border-left: 4px solid #e0e0e0;\n background: #fafafa;\n }\n\n .markdown-body code {\n background: #f5f5f5;\n border-radius: 3px;\n padding: 2px 4px;\n font-size: 95%;\n font-family: 'Fira Mono', 'Menlo', 'Consolas', monospace;\n }\n\n .markdown-body pre {\n background: #f5f5f5;\n border-radius: 4px;\n padding: 12px;\n overflow-x: auto;\n font-size: 14px;\n margin: 16px 0;\n }\n\n .markdown-body a {\n color: #1677ff;\n text-decoration: underline;\n word-break: break-all;\n }\n\n /* 表格容器 */\n .markdown-body table {\n display: block;\n overflow-x: auto;\n border-collapse: collapse;\n width: max-content;\n min-width: 100%;\n margin: 16px 0;\n font-size: 14px;\n /* 防止表格被父容器裁剪 */\n max-width: 100%;\n }\n .markdown-body th,\n .markdown-body td {\n border: 1px solid #e0e0e0;\n padding: 8px 12px;\n text-align: left;\n min-width: 120px; /* 设置最小宽度,可根据实际调整 */\n white-space: nowrap; /* 防止内容换行 */\n }\n .markdown-body th {\n background: #f5f5f5;\n font-weight: bold;\n }\n\n .message-chatgpt p,\n .message-chatgpt pre[class*='language-'] {\n white-space: pre-wrap;\n }\n .message-chatgpt p:first-child {\n margin-top: 0;\n }\n .message-chatgpt pre[class*='language-'],\n .message-chatgpt code[class*='language-'] {\n text-shadow: none;\n }\n .message-chatgpt pre[class*='language-'] {\n font-size: 14px;\n border-radius: 0.25rem;\n position: relative;\n }\n\n \n .message-chatgpt a:-webkit-any-link {\n cursor: pointer;\n text-decoration: underline;\n }\n .message-chatgpt .prism-title {\n position: sticky;\n left: 0;\n right: 0;\n width: 100%;\n padding: 0.75rem;\n margin-bottom: 15px;\n border-radius: 4px;\n background-color: #343540;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n .message-chatgpt .prism-title.dark {\n background-color: #1f2937;\n color: #6b7280;\n }\n .message-chatgpt .prism-copy {\n float: right;\n cursor: pointer;\n color: inherit;\n }\n .message-chatgpt .prism-copy:hover {\n color: #9df69b;\n }\n .message-chatgpt .prism-copy.dark:hover {\n color: #d1d5db;\n }\n .copy-disable {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n }\n `}\n />\n);\n\nexport default MarkdownGlobalStyle;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAClB,IAAAA,gBAA4B;AAE5B,IAAM,sBAAgC,MACpC,6BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwJV;AAGF,IAAO,mBAAQ;",
|
|
6
6
|
"names": ["import_react", "React"]
|
|
7
7
|
}
|
|
@@ -29,18 +29,6 @@ var meta = {
|
|
|
29
29
|
export default meta;
|
|
30
30
|
// mock 消息数据,严格符合 Messages 类型
|
|
31
31
|
var mockMessages = [{
|
|
32
|
-
id: '0',
|
|
33
|
-
type: 'TextMessage',
|
|
34
|
-
createdAt: new Date(),
|
|
35
|
-
status: MessageStatus.done,
|
|
36
|
-
role: MessageRole.assistant,
|
|
37
|
-
content: {
|
|
38
|
-
text: "\n# \u9879\u76EE\u5F00\u53D1\u8BA1\u5212\n\n\u672C\u6587\u6863\u6982\u8FF0\u4E86 2025 \u5E74\u7B2C\u4E09\u5B63\u5EA6\u7684\u4EA7\u54C1\u5F00\u53D1\u8BA1\u5212\uFF0C\u5305\u62EC\u76EE\u6807\u3001\u91CC\u7A0B\u7891\u3001\u56E2\u961F\u5206\u5DE5\u548C\u98CE\u9669\u9884\u6848\u3002\n\n---\n\n## \uD83C\uDFAF \u6838\u5FC3\u76EE\u6807\n\n- \u63D0\u5347\u7528\u6237\u7559\u5B58\u7387\u81F3 **45%**\n- \u5B8C\u6210 Web \u7AEF\u65B0\u7248\u4E0A\u7EBF\n- \u5EFA\u7ACB AI \u63A8\u8350\u6A21\u5757 MVP\n- \u4F18\u5316\u6570\u636E\u5E93\u8BBF\u95EE\u6027\u80FD\n\n---\n\n## \uD83D\uDCC5 \u5173\u952E\u65F6\u95F4\u8282\u70B9\n\n| \u91CC\u7A0B\u7891 | \u622A\u6B62\u65E5\u671F | \u8D1F\u8D23\u4EBA | \u4EE3\u7406\u4EBA | \u622A\u6B62\u65E5\u671F | \u8D1F\u8D23\u4EBA |\n|------------------|--------------|----------|------------------|--------------|----------|\n| \u4EA7\u54C1\u9700\u6C42\u51BB\u7ED3 | 2025-08-01 | Alice | \u4EA7\u54C1\u9700\u6C42\u51BB\u7ED3 | 2025-08-01 | Alice |\n| UI \u8BBE\u8BA1\u5B9A\u7A3F | 2025-08-10 | Bob | \u4EA7\u54C1\u9700\u6C42\u51BB\u7ED3 | 2025-08-01 | Alice |\n| \u5F00\u53D1\u5B8C\u6210\uFF08\u5185\u6D4B\uFF09 | 2025-09-15 | Charlie | \u4EA7\u54C1\u9700\u6C42\u51BB\u7ED3 | 2025-08-01 | Alice |\n| \u6B63\u5F0F\u4E0A\u7EBF | 2025-09-30 | Diana | \u4EA7\u54C1\u9700\u6C42\u51BB\u7ED3 | 2025-08-01 | Alice |\n\n---\n\n## \uD83D\uDEE0\uFE0F \u6280\u672F\u65B9\u6848\u7B80\u8FF0\n\n\u6211\u4EEC\u5C06\u4F7F\u7528\u4EE5\u4E0B\u6280\u672F\u6808\uFF1A\n\n- \u524D\u7AEF\uFF1AReact + Vite + Zustand\n- \u540E\u7AEF\uFF1ANode.js + PostgreSQL\n- \u6570\u636E\u5206\u6790\uFF1APython + Pandas\n- \u90E8\u7F72\u73AF\u5883\uFF1AKubernetes on AWS\n\n---\n\n## \uD83D\uDCA1 \u793A\u4F8B\u4EE3\u7801\u7247\u6BB5\n\n\u4EE5\u4E0B\u662F\u4E00\u4E2A\u7528\u4E8E\u751F\u6210\u552F\u4E00 ID \u7684\u51FD\u6570\u793A\u4F8B\uFF1A\n\n~~~ts\nimport { nanoid } from 'nanoid'\n\nexport function generateSessionId() {\n return `sess-${nanoid()}`\n}\n~~~\n"
|
|
39
|
-
},
|
|
40
|
-
extra: {
|
|
41
|
-
noFooter: true
|
|
42
|
-
}
|
|
43
|
-
}, {
|
|
44
32
|
id: '1',
|
|
45
33
|
type: 'TextMessage',
|
|
46
34
|
createdAt: new Date(),
|
|
@@ -56,10 +44,24 @@ var mockMessages = [{
|
|
|
56
44
|
status: MessageStatus.done,
|
|
57
45
|
role: MessageRole.user,
|
|
58
46
|
content: {
|
|
59
|
-
text: '
|
|
47
|
+
text: '检索从北京到上海的车票数据给我'
|
|
60
48
|
},
|
|
61
49
|
parentMessageId: '1'
|
|
62
|
-
},
|
|
50
|
+
},
|
|
51
|
+
// {
|
|
52
|
+
// id: '22',
|
|
53
|
+
// type: 'TextMessage',
|
|
54
|
+
// createdAt: new Date(),
|
|
55
|
+
// status: MessageStatus.done,
|
|
56
|
+
// role: MessageRole.assistant,
|
|
57
|
+
// content: {
|
|
58
|
+
// text: '{"data":"车次 | 出发站 -> 到达站 | 出发时间 -> 到达时间 | 历时\\nC406(实际车次train_no: 560000C40603) 杭州东(telecode: HGH) -> 上海南(telecode: SNH) 20:01 -> 21:50 历时:01:49\\n- 二等座: 有票 47元\\n- 一等座: 有票 75元\\n- 无座: 有票 47元\\nC412(实际车次train_no: 560000C41202) 杭州东(telecode: HGH) -> 上海南(telecode: SNH) 18:21 -> 20:08 历时:01:47\\n- 二等座: 无票 47元\\n- 一等座: 无票 75元\\n- 无座: 有票 47元\\nG7360(实际车次train_no: 56000G736081) 杭州(telecode: HZH) -> 上海(telecode: SHH) 20:00 -> 21:39 历时:01:39\\n- 商务座: 剩余16张票 278元\\n- 一等座: 有票 149元\\n- 二等座: 有票 93元\\n- 无座: 有票 93元\\nC482(实际车次train_no: 560000C48220) 杭州(telecode: HZH) -> 上海南(telecode: SNH) 19:42 -> 21:20 历时:01:38\\n- 二等座: 有票 49元\\n- 一等座: 有票 77元\\n- 无座: 有票 49元\\nG8358(实际车次train_no: 56000G835800) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 18:11 -> 19:38 历时:01:27\\n- 商务座: 剩余11张票 357元\\n- 一等座: 有票 163元\\n- 二等座: 有票 103元\\n- 无座: 有票 103元\\nG1440(实际车次train_no: 57000G144005) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 20:55 -> 22:21 历时:01:26\\n- 商务座: 剩余17张票 320元\\n- 一等座: 有票 147元\\n- 二等座: 有票 92元\\n- 优选一等座: 有票 202元\\n- 无座: 有票 92元\\nC406(实际车次train_no: 560000C40603) 杭州东(telecode: HGH) -> 上海松江(telecode: IMH) 20:01 -> 21:25 历时:01:24\\n- 二等座: 有票 40元\\n- 一等座: 有票 63元\\n- 无座: 有票 40元\\nC3050(实际车次train_no: 52000C305000) 杭州西(telecode: HVU) -> 上海南(telecode: SNH) 19:34 -> 20:58 历时:01:24\\n- 商务座: 无票 351元\\n- 一等座: 剩余13张票 161元\\n- 二等座: 有票 101元\\n- 无座: 有票 101元\\nG7360(实际车次train_no: 56000G736081) 杭州(telecode: HZH) -> 上海西(telecode: SXH) 20:00 -> 21:23 历时:01:23\\n- 商务座: 剩余16张票 271元\\n- 一等座: 有票 144元\\n- 二等座: 有票 90元\\n- 无座: 有票 90元\\nG7140(实际车次train_no: 56000G714000) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 18:38 -> 20:01 历时:01:23\\n- 商务座: 剩余3张票 357元\\n- 一等座: 剩余18张票 163元\\n- 二等座: 有票 103元\\n- 无座: 有票 103元\\nG8386(实际车次train_no: 54000G838601) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 18:25 -> 19:48 历时:01:23\\n- 商务座: 剩余1张票 357元\\n- 一等座: 剩余18张票 163元\\n- 二等座: 有票 103元\\n- 无座: 有票 103元\\nC412(实际车次train_no: 560000C41202) 杭州东(telecode: HGH) -> 上海松江(telecode: IMH) 18:21 -> 19:42 历时:01:21\\n- 二等座: 无票 40元\\n- 一等座: 无票 63元\\n- 无座: 有票 40元\\nG7124(实际车次train_no: 56000G712400) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 18:03 -> 19:24 历时:01:21\\n- 商务座: 剩余5张票 357元\\n- 一等座: 剩余5张票 163元\\n- 二等座: 有票 103元\\n- 无座: 有票 103元\\nG3092(实际车次train_no: 5n000G309205) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 20:40 -> 21:59 历时:01:19\\n- 商务座: 剩余10张票 332元\\n- 一等座: 有票 152元\\n- 二等座: 有票 95元\\n- 无座: 有票 95元\\nG7112(实际车次train_no: 54000G711200) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 20:12 -> 21:31 历时:01:19\\n- 二等座: 有票 110元\\n- 一等座: 有票 174元\\n- 无座: 有票 110元\\nG7584(实际车次train_no: 5e000G758405) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 17:51 -> 19:10 历时:01:19\\n- 商务座: 无票 263元\\n- 一等座: 无票 140元\\n- 二等座: 无票 87元\\n- 无座: 有票 87元\\nG7432(实际车次train_no: 5j000G743252) 杭州南(telecode: XHH) -> 上海虹桥(telecode: AOH) 17:55 -> 19:13 历时:01:18\\n- 商务座: 无票 298元\\n- 一等座: 无票 158元\\n- 二等座: 无票 98元\\n- 无座: 无票 98元\\nG7600(实际车次train_no: 5e000G760030) 杭州南(telecode: XHH) -> 上海南(telecode: SNH) 19:34 -> 20:50 历时:01:16\\n- 商务座: 剩余9张票 248元\\n- 一等座: 有票 132元\\n- 二等座: 有票 82元\\n- 无座: 有票 82元\\nG3078(实际车次train_no: 65000G307810) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 21:12 -> 22:26 历时:01:14\\n- 商务座: 有票 320元\\n- 一等座: 有票 147元\\n- 二等座: 有票 92元\\n- 无座: 有票 92元\\nG8304(实际车次train_no: 56000G830410) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 19:59 -> 21:11 历时:01:12\\n- 二等座: 有票 103元\\n- 一等座: 有票 163元\\n- 无座: 有票 103元\\nG8360(实际车次train_no: 5j000G836002) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 19:15 -> 20:27 历时:01:12\\n- 商务座: 剩余2张票 405元\\n- 一等座: 无票 185元\\n- 二等座: 有票 116元\\n- 无座: 有票 116元\\nG7550(实际车次train_no: 5j000G755060) 杭州南(telecode: XHH) -> 上海虹桥(telecode: AOH) 18:35 -> 19:47 历时:01:12\\n- 商务座: 无票 298元\\n- 一等座: 无票 158元\\n- 二等座: 无票 98元\\n- 无座: 无票 98元\\nG100(实际车次train_no: 6x0000G1000A) 杭州西(telecode: HVU) -> 上海虹桥(telecode: AOH) 18:31 -> 19:43 历时:01:12\\n- 商务座: 剩余7张票 405元\\n- 一等座: 剩余19张票 185元\\n- 二等座: 有票 116元\\nG1306(实际车次train_no: 65000G130601) 杭州西(telecode: HVU) -> 上海南(telecode: SNH) 21:39 -> 22:49 历时:01:10\\n- 商务座: 剩余8张票 279元\\n- 一等座: 剩余15张票 128元\\n- 二等座: 有票 81元\\n- 无座: 有票 81元\\nG1372(实际车次train_no: 80000G13720S) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 21:02 -> 22:12 历时:01:10\\n- 商务座: 剩余12张票 219元\\n- 一等座: 有票 105元\\n- 二等座: 有票 65元\\n- 无座: 无票 65元\\nG7314(实际车次train_no: 52000G731401) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 19:18 -> 20:27 历时:01:09\\n- 商务座: 无票 242元\\n- 一等座: 无票 129元\\n- 二等座: 剩余5张票 80元\\n- 无座: 有票 80元\\nG7522(实际车次train_no: 5e000G752290) 杭州东(telecode: HGH) -> 上海南(telecode: SNH) 18:34 -> 19:41 历时:01:07\\n- 商务座: 剩余5张票 239元\\n- 一等座: 有票 127元\\n- 二等座: 有票 79元\\n- 无座: 有票 79元\\nG7310(实际车次train_no: 5a000G731004) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 17:47 -> 18:54 历时:01:07\\n- 商务座: 无票 263元\\n- 一等座: 无票 140元\\n- 二等座: 无票 87元\\n- 无座: 有票 87元\\nG7432(实际车次train_no: 5j000G743252) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 18:07 -> 19:13 历时:01:06\\n- 商务座: 无票 263元\\n- 一等座: 无票 140元\\n- 二等座: 无票 87元\\n- 无座: 无票 87元\\nG1388(实际车次train_no: 57000G138800) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 21:52 -> 22:56 历时:01:04\\n- 商务座: 剩余11张票 242元\\n- 一等座: 有票 117元\\n- 二等座: 有票 73元\\n- 无座: 有票 73元\\nG998(实际车次train_no: 6i0000G99800) 杭州西(telecode: HVU) -> 上海南(telecode: SNH) 21:24 -> 22:27 历时:01:03\\n- 商务座: 剩余4张票 315元\\n- 一等座: 剩余11张票 145元\\n- 二等座: 有票 91元\\n- 无座: 有票 91元\\nG1316(实际车次train_no: 5n000G131600) 杭州西(telecode: HVU) -> 上海南(telecode: SNH) 21:01 -> 22:04 历时:01:03\\n- 商务座: 剩余6张票 374元\\n- 一等座: 剩余6张票 172元\\n- 二等座: 有票 108元\\n- 无座: 有票 108元\\nG7338(实际车次train_no: 5j000G733831) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 20:25 -> 21:27 历时:01:02\\n- 商务座: 剩余9张票 219元\\n- 一等座: 有票 117元\\n- 二等座: 有票 73元\\n- 无座: 有票 73元\\nG1510(实际车次train_no: 4z000G15100D) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 18:01 -> 19:03 历时:01:02\\n- 商务座: 无票 263元\\n- 一等座: 无票 140元\\n- 二等座: 无票 87元\\n- 无座: 无票 87元\\nG7600(实际车次train_no: 5e000G760030) 杭州东(telecode: HGH) -> 上海南(telecode: SNH) 19:49 -> 20:50 历时:01:01\\n- 商务座: 剩余9张票 216元\\n- 一等座: 有票 115元\\n- 二等座: 有票 72元\\n- 无座: 有票 72元\\nG7360(实际车次train_no: 56000G736081) 杭州(telecode: HZH) -> 上海虹桥(telecode: AOH) 20:00 -> 21:00 历时:01:00\\n- 商务座: 剩余19张票 232元\\n- 一等座: 有票 124元\\n- 二等座: 有票 78元\\n- 无座: 有票 78元\\nG1350(实际车次train_no: 62000G135002) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 22:02 -> 23:01 历时:00:59\\n- 商务座: 剩余7张票 219元\\n- 一等座: 有票 105元\\n- 二等座: 有票 65元\\n- 无座: 有票 65元\\nG1506(实际车次train_no: 71000G150632) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 21:48 -> 22:47 历时:00:59\\n- 商务座: 剩余19张票 219元\\n- 一等座: 有票 105元\\n- 二等座: 有票 65元\\n- 无座: 有票 65元\\nG1334(实际车次train_no: 77000G13350F) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 19:57 -> 20:56 历时:00:59\\n- 商务座: 剩余14张票 242元\\n- 一等座: 剩余1张票 129元\\n- 二等座: 有票 80元\\n- 无座: 有票 80元\\nG1378(实际车次train_no: 80000G13780O) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 18:19 -> 19:18 历时:00:59\\n- 商务座: 无票 263元\\n- 一等座: 无票 140元\\n- 二等座: 无票 87元\\n- 无座: 无票 87元\\nG7600(实际车次train_no: 5e000G760030) 杭州南(telecode: XHH) -> 上海松江(telecode: IMH) 19:34 -> 20:32 历时:00:58\\n- 商务座: 剩余9张票 208元\\n- 一等座: 有票 111元\\n- 二等座: 有票 68元\\n- 无座: 有票 68元\\nG1302(实际车次train_no: 6e000G130206) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 20:50 -> 21:47 历时:00:57\\n- 商务座: 剩余14张票 263元\\n- 一等座: 有票 129元\\n- 二等座: 有票 80元\\n- 无座: 有票 80元\\nG7366(实际车次train_no: 56000G736606) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 20:14 -> 21:11 历时:00:57\\n- 商务座: 剩余4张票 242元\\n- 一等座: 有票 129元\\n- 二等座: 有票 80元\\n- 无座: 有票 80元\\nG7584(实际车次train_no: 5e000G758405) 杭州东(telecode: HGH) -> 上海松江(telecode: IMH) 17:51 -> 18:48 历时:00:57\\n- 商务座: 剩余2张票 212元\\n- 一等座: 剩余1张票 113元\\n- 二等座: 无票 70元\\n- 无座: 有票 70元\\nG7340(实际车次train_no: 5j000G734003) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 20:54 -> 21:50 历时:00:56\\n- 商务座: 剩余14张票 219元\\n- 一等座: 有票 117元\\n- 二等座: 有票 73元\\n- 无座: 有票 73元\\nG1638(实际车次train_no: 5n000G163800) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 21:45 -> 22:40 历时:00:55\\n- 商务座: 剩余9张票 219元\\n- 一等座: 有票 105元\\n- 二等座: 有票 65元\\n- 无座: 有票 65元\\nG7350(实际车次train_no: 5j000G735074) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 20:40 -> 21:35 历时:00:55\\n- 商务座: 剩余7张票 263元\\n- 一等座: 有票 140元\\n- 二等座: 有票 87元\\n- 无座: 有票 87元\\nG1328(实际车次train_no: 78000G13280E) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 20:35 -> 21:30 历时:00:55\\n- 商务座: 剩余6张票 242元\\n- 一等座: 剩余9张票 129元\\n- 二等座: 有票 80元\\n- 无座: 有票 80元\\nG7550(实际车次train_no: 5j000G755060) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 18:52 -> 19:47 历时:00:55\\n- 商务座: 无票 263元\\n- 一等座: 剩余1张票 140元\\n- 二等座: 无票 87元\\n- 无座: 无票 87元\\nG7528(实际车次train_no: 5j000G752802) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 21:27 -> 22:21 历时:00:54\\n- 商务座: 剩余12张票 219元\\n- 一等座: 剩余8张票 117元\\n- 二等座: 有票 73元\\n- 无座: 有票 73元\\nG7588(实际车次train_no: 5j000G758802) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 19:05 -> 19:59 历时:00:54\\n- 商务座: 无票 263元\\n- 一等座: 无票 140元\\n- 二等座: 无票 87元\\n- 无座: 剩余1张票 87元\\nG3060(实际车次train_no: 5n000G306000) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 20:10 -> 21:03 历时:00:53\\n- 商务座: 剩余2张票 242元\\n- 一等座: 有票 129元\\n- 二等座: 有票 80元\\n- 无座: 有票 80元\\nG7566(实际车次train_no: 5j000G756606) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 19:09 -> 20:02 历时:00:53\\n- 商务座: 剩余1张票 263元\\n- 一等座: 剩余3张票 140元\\n- 二等座: 无票 87元\\n- 无座: 有票 87元\\nG1640(实际车次train_no: 5n000G164000) 杭州东(telecode: HGH) -> 上海南(telecode: SNH) 22:38 -> 23:30 历时:00:52\\n- 商务座: 剩余12张票 216元\\n- 一等座: 有票 104元\\n- 二等座: 有票 65元\\n- 无座: 有票 65元\\nG1390(实际车次train_no: 5w000G139010) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 22:34 -> 23:26 历时:00:52\\n- 商务座: 有票 219元\\n- 一等座: 有票 105元\\n- 二等座: 有票 65元\\n- 无座: 有票 65元\\nG2190(实际车次train_no: 76000G21910F) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 21:35 -> 22:27 历时:00:52\\n- 商务座: 剩余17张票 219元\\n- 一等座: 有票 117元\\n- 二等座: 有票 73元\\n- 无座: 有票 73元\\nG1616(实际车次train_no: 71000G161602) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 18:29 -> 19:21 历时:00:52\\n- 商务座: 无票 242元\\n- 一等座: 无票 105元\\n- 二等座: 无票 65元\\n- 无座: 无票 65元\\nG7522(实际车次train_no: 5e000G752290) 杭州东(telecode: HGH) -> 上海松江(telecode: IMH) 18:34 -> 19:25 历时:00:51\\n- 商务座: 剩余8张票 194元\\n- 一等座: 有票 104元\\n- 二等座: 有票 64元\\n- 无座: 有票 64元\\nG7310(实际车次train_no: 5a000G731004) 杭州东(telecode: HGH) -> 上海松江(telecode: IMH) 17:47 -> 18:37 历时:00:50\\n- 商务座: 无票 212元\\n- 一等座: 无票 113元\\n- 二等座: 无票 70元\\n- 无座: 有票 70元\\nG7550(实际车次train_no: 5j000G755060) 杭州南(telecode: XHH) -> 金山北(telecode: EGH) 18:35 -> 19:24 历时:00:49\\n- 商务座: 无票 219元\\n- 一等座: 剩余2张票 116元\\n- 二等座: 无票 72元\\n- 无座: 有票 72元\\nG820(实际车次train_no: 6c0000G82002) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 21:07 -> 21:54 历时:00:47\\n- 商务座: 剩余11张票 242元\\n- 一等座: 有票 129元\\n- 二等座: 有票 80元\\n- 优选一等座: 有票 177元\\n- 无座: 有票 80元\\nG470(实际车次train_no: 640000G47100) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 21:11 -> 21:57 历时:00:46\\n- 商务座: 剩余19张票 242元\\n- 一等座: 有票 129元\\n- 二等座: 有票 80元\\n- 无座: 有票 80元\\nG240(实际车次train_no: 800000G24000) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 19:34 -> 20:20 历时:00:46\\n- 商务座: 剩余5张票 263元\\n- 一等座: 剩余3张票 140元\\n- 二等座: 有票 87元\\n- 无座: 有票 87元\\nG7312(实际车次train_no: 52000G731207) 杭州东(telecode: HGH) -> 上海南(telecode: SNH) 19:24 -> 20:10 历时:00:46\\n- 商务座: 剩余3张票 239元\\n- 一等座: 剩余4张票 127元\\n- 二等座: 有票 79元\\n- 无座: 有票 79元\\nG1386(实际车次train_no: 5u000G138620) 杭州东(telecode: HGH) -> 上海南(telecode: SNH) 19:01 -> 19:47 历时:00:46\\n- 商务座: 有票 239元\\n- 一等座: 有票 127元\\n- 二等座: 有票 79元\\n- 无座: 有票 79元\\nG7584(实际车次train_no: 5e000G758405) 杭州东(telecode: HGH) -> 金山北(telecode: EGH) 17:51 -> 18:37 历时:00:46\\n- 商务座: 剩余6张票 184元\\n- 一等座: 剩余17张票 98元\\n- 二等座: 剩余2张票 61元\\n- 无座: 有票 61元\\nG4918(实际车次train_no: 57000G49184G) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 23:20 -> 00:05 历时:00:45\\n- 商务座: 剩余7张票 242元\\n- 一等座: 剩余12张票 129元\\n- 二等座: 有票 80元\\n- 无座: 有票 80元\\nG1374(实际车次train_no: 80000G137410) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 22:30 -> 23:15 历时:00:45\\n- 商务座: 剩余18张票 219元\\n- 一等座: 有票 117元\\n- 二等座: 有票 73元\\n- 无座: 无票 73元\\nG7536(实际车次train_no: 5j000G753603) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 22:22 -> 23:07 历时:00:45\\n- 商务座: 剩余6张票 219元\\n- 一等座: 剩余11张票 105元\\n- 二等座: 有票 65元\\n- 无座: 有票 65元\\nG358(实际车次train_no: 780000G35800) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 22:19 -> 23:04 历时:00:45\\n- 商务座: 剩余17张票 242元\\n- 一等座: 有票 129元\\n- 二等座: 有票 80元\\n- 无座: 有票 80元\\nG822(实际车次train_no: 6c0000G82200) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 21:58 -> 22:43 历时:00:45\\n- 商务座: 剩余9张票 263元\\n- 一等座: 有票 140元\\n- 二等座: 有票 87元\\n- 无座: 有票 87元\\nG356(实际车次train_no: 780000G35600) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 21:16 -> 22:01 历时:00:45\\n- 商务座: 剩余18张票 263元\\n- 一等座: 有票 140元\\n- 二等座: 有票 87元\\n- 无座: 有票 87元\\nG7562(实际车次train_no: 5e000G756250) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 19:38 -> 20:23 历时:00:45\\n- 商务座: 有票 263元\\n- 一等座: 有票 140元\\n- 二等座: 有票 87元\\n- 无座: 有票 87元\\nG416(实际车次train_no: 5n0000G41600) 杭州东(telecode: HGH) -> 上海南(telecode: SNH) 19:30 -> 20:15 历时:00:45\\n- 商务座: 剩余6张票 239元\\n- 一等座: 剩余3张票 127元\\n- 二等座: 有票 79元\\n- 无座: 有票 79元\\nG500(实际车次train_no: 710000G50000) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 18:45 -> 19:30 历时:00:45\\n- 商务座: 剩余6张票 219元\\n- 一等座: 剩余6张票 117元\\n- 二等座: 剩余1张票 73元\\n- 无座: 有票 73元\\nG800(实际车次train_no: 650000G80000) 杭州东(telecode: HGH) -> 上海虹桥(telecode: AOH) 18:40 -> 19:25 历时:00:45\\n- 商务座: 剩余4张票 242元\\n- 一等座: 剩余18张票 129元\\n- 二等座: 有票 80元\\n- 无座: 有票 80元\\nG7600(实际车次train_no: 5e000G760030) 杭州东(telecode: HGH) -> 上海松江(telecode: IMH) 19:49 -> 20:32 历时:00:43\\n- 商务座: 剩余9张票 176元\\n- 一等座: 有票 94元\\n- 二等座: 有票 58元\\n- 无座: 有票 58元\\nG7338(实际车次train_no: 5j000G733831) 杭州东(telecode: HGH) -> 金山北(telecode: EGH) 20:25 -> 21:07 历时:00:42\\n- 商务座: 剩余9张票 153元\\n- 一等座: 有票 82元\\n- 二等座: 有票 51元\\n- 无座: 有票 51元\\nG1334(实际车次train_no: 77000G13350F) 杭州东(telecode: HGH) -> 金山北(telecode: EGH) 19:57 -> 20:36 历时:00:39\\n- 商务座: 剩余18张票 169元\\n- 一等座: 剩余4张票 90元\\n- 二等座: 有票 56元\\n- 无座: 有票 56元\\nG7550(实际车次train_no: 5j000G755060) 杭州东(telecode: HGH) -> 金山北(telecode: EGH) 18:52 -> 19:24 历时:00:32\\n- 商务座: 无票 184元\\n- 一等座: 剩余5张票 98元\\n- 二等座: 有票 61元\\n- 无座: 有票 61元\\n"}',
|
|
59
|
+
// },
|
|
60
|
+
// extra: {
|
|
61
|
+
// noFooter: true,
|
|
62
|
+
// },
|
|
63
|
+
// },
|
|
64
|
+
{
|
|
63
65
|
id: '3',
|
|
64
66
|
type: 'ImageMessage',
|
|
65
67
|
createdAt: new Date(),
|
|
@@ -144,6 +146,18 @@ var mockMessages = [{
|
|
|
144
146
|
content: {
|
|
145
147
|
text: '能否生成一段明年的产品计划开发计划文档给我'
|
|
146
148
|
}
|
|
149
|
+
}, {
|
|
150
|
+
id: '0',
|
|
151
|
+
type: 'TextMessage',
|
|
152
|
+
createdAt: new Date(),
|
|
153
|
+
status: MessageStatus.done,
|
|
154
|
+
role: MessageRole.assistant,
|
|
155
|
+
content: {
|
|
156
|
+
text: "\n# \u9879\u76EE\u5F00\u53D1\u8BA1\u5212\n\n\u672C\u6587\u6863\u6982\u8FF0\u4E86 2025 \u5E74\u7B2C\u4E09\u5B63\u5EA6\u7684\u4EA7\u54C1\u5F00\u53D1\u8BA1\u5212\uFF0C\u5305\u62EC\u76EE\u6807\u3001\u91CC\u7A0B\u7891\u3001\u56E2\u961F\u5206\u5DE5\u548C\u98CE\u9669\u9884\u6848\u3002\n\n---\n\n## \uD83C\uDFAF \u6838\u5FC3\u76EE\u6807\n\n- \u63D0\u5347\u7528\u6237\u7559\u5B58\u7387\u81F3 **45%**\n- \u5B8C\u6210 Web \u7AEF\u65B0\u7248\u4E0A\u7EBF\n- \u5EFA\u7ACB AI \u63A8\u8350\u6A21\u5757 MVP\n- \u4F18\u5316\u6570\u636E\u5E93\u8BBF\u95EE\u6027\u80FD\n\n---\n\n## \uD83D\uDCC5 \u5173\u952E\u65F6\u95F4\u8282\u70B9\n\n| \u91CC\u7A0B\u7891 | \u622A\u6B62\u65E5\u671F | \u8D1F\u8D23\u4EBA | \u4EE3\u7406\u4EBA | \u622A\u6B62\u65E5\u671F | \u8D1F\u8D23\u4EBA |\n|------------------|--------------|----------|------------------|--------------|----------|\n| \u4EA7\u54C1\u9700\u6C42\u51BB\u7ED3 | 2025-08-01 | Alice | \u4EA7\u54C1\u9700\u6C42\u51BB\u7ED3 | 2025-08-01 | Alice |\n| UI \u8BBE\u8BA1\u5B9A\u7A3F | 2025-08-10 | Bob | \u4EA7\u54C1\u9700\u6C42\u51BB\u7ED3 | 2025-08-01 | Alice |\n| \u5F00\u53D1\u5B8C\u6210\uFF08\u5185\u6D4B\uFF09 | 2025-09-15 | Charlie | \u4EA7\u54C1\u9700\u6C42\u51BB\u7ED3 | 2025-08-01 | Alice |\n| \u6B63\u5F0F\u4E0A\u7EBF | 2025-09-30 | Diana | \u4EA7\u54C1\u9700\u6C42\u51BB\u7ED3 | 2025-08-01 | Alice |\n\n---\n\n## \uD83D\uDEE0\uFE0F \u6280\u672F\u65B9\u6848\u7B80\u8FF0\n\n\u6211\u4EEC\u5C06\u4F7F\u7528\u4EE5\u4E0B\u6280\u672F\u6808\uFF1A\n\n- \u524D\u7AEF\uFF1AReact + Vite + Zustand\n- \u540E\u7AEF\uFF1ANode.js + PostgreSQL\n- \u6570\u636E\u5206\u6790\uFF1APython + Pandas\n- \u90E8\u7F72\u73AF\u5883\uFF1AKubernetes on AWS\n\n---\n\n## \uD83D\uDCA1 \u793A\u4F8B\u4EE3\u7801\u7247\u6BB5\n\n\u4EE5\u4E0B\u662F\u4E00\u4E2A\u7528\u4E8E\u751F\u6210\u552F\u4E00 ID \u7684\u51FD\u6570\u793A\u4F8B\uFF1A\n\n~~~ts\nimport { nanoid } from 'nanoid'\n\nexport function generateSessionId() {\n return `sess-${nanoid()}`\n}\n~~~\n"
|
|
157
|
+
},
|
|
158
|
+
extra: {
|
|
159
|
+
noFooter: true
|
|
160
|
+
}
|
|
147
161
|
}, {
|
|
148
162
|
id: '11',
|
|
149
163
|
type: 'SuggestionMessage',
|