@lobehub/ui 1.6.1 → 1.7.2

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 (109) hide show
  1. package/es/Chat/const.d.ts +1 -0
  2. package/es/Chat/const.js +1 -0
  3. package/es/Chat/index.d.ts +2 -0
  4. package/es/Chat/index.js +2 -0
  5. package/es/Chat/store/index.d.ts +20 -0
  6. package/es/Chat/store/index.js +16 -0
  7. package/es/Chat/store/initialState.d.ts +28 -0
  8. package/es/Chat/store/initialState.js +9 -0
  9. package/es/Chat/store/messageReducer.d.ts +37 -0
  10. package/es/Chat/store/messageReducer.js +67 -0
  11. package/es/Chat/store/selectors.d.ts +9 -0
  12. package/es/Chat/store/selectors.js +44 -0
  13. package/es/Chat/store/store.d.ts +34 -0
  14. package/es/Chat/store/store.js +240 -0
  15. package/es/Chat/types.d.ts +77 -0
  16. package/es/Chat/types.js +1 -0
  17. package/es/Chat/utils/fetch.d.ts +11 -0
  18. package/es/Chat/utils/fetch.js +100 -0
  19. package/es/Conversation/App.d.ts +13 -0
  20. package/es/Conversation/App.js +43 -0
  21. package/es/Conversation/ChatList/MessageItem/Content.d.ts +8 -0
  22. package/es/Conversation/ChatList/MessageItem/Content.js +103 -0
  23. package/es/Conversation/ChatList/MessageItem/Toolbar.d.ts +10 -0
  24. package/es/Conversation/ChatList/MessageItem/Toolbar.js +94 -0
  25. package/es/Conversation/ChatList/MessageItem/index.d.ts +9 -0
  26. package/es/Conversation/ChatList/MessageItem/index.js +126 -0
  27. package/es/Conversation/ChatList/index.d.ts +14 -0
  28. package/es/Conversation/ChatList/index.js +62 -0
  29. package/es/Conversation/InputArea/ActionBar.d.ts +4 -0
  30. package/es/Conversation/InputArea/ActionBar.js +71 -0
  31. package/es/Conversation/InputArea/index.d.ts +4 -0
  32. package/es/Conversation/InputArea/index.js +101 -0
  33. package/es/Conversation/StoreUpdater.d.ts +7 -0
  34. package/es/Conversation/StoreUpdater.js +27 -0
  35. package/es/Conversation/index.d.ts +8 -0
  36. package/es/Conversation/index.js +28 -0
  37. package/es/EditableMessageList/index.d.ts +9 -0
  38. package/es/EditableMessageList/index.js +101 -0
  39. package/es/EditableText/index.d.ts +1 -1
  40. package/es/EditableText/index.js +1 -1
  41. package/es/Highlighter/SyntaxHighlighter/style.js +1 -1
  42. package/es/Highlighter/style.js +1 -1
  43. package/es/Logo/style.js +1 -1
  44. package/es/Markdown/style.js +1 -1
  45. package/es/Snippet/style.js +1 -1
  46. package/es/StroyBook/style.js +3 -3
  47. package/es/ThemeProvider/GlobalStyle.js +4 -3
  48. package/es/Tooltip/style.js +1 -1
  49. package/es/index.d.ts +3 -0
  50. package/es/index.js +2 -0
  51. package/es/styles/customStylish.js +4 -4
  52. package/es/styles/theme/base.js +6 -2
  53. package/lib/Chat/const.d.ts +1 -0
  54. package/lib/Chat/const.js +29 -0
  55. package/lib/Chat/index.d.ts +2 -0
  56. package/lib/Chat/index.js +31 -0
  57. package/lib/Chat/store/index.d.ts +20 -0
  58. package/lib/Chat/store/index.js +44 -0
  59. package/lib/Chat/store/initialState.d.ts +28 -0
  60. package/lib/Chat/store/initialState.js +37 -0
  61. package/lib/Chat/store/messageReducer.d.ts +37 -0
  62. package/lib/Chat/store/messageReducer.js +82 -0
  63. package/lib/Chat/store/selectors.d.ts +9 -0
  64. package/lib/Chat/store/selectors.js +53 -0
  65. package/lib/Chat/store/store.d.ts +34 -0
  66. package/lib/Chat/store/store.js +119 -0
  67. package/lib/Chat/types.d.ts +77 -0
  68. package/lib/Chat/types.js +17 -0
  69. package/lib/Chat/utils/fetch.d.ts +11 -0
  70. package/lib/Chat/utils/fetch.js +72 -0
  71. package/lib/Conversation/App.d.ts +13 -0
  72. package/lib/Conversation/App.js +53 -0
  73. package/lib/Conversation/ChatList/MessageItem/Content.d.ts +8 -0
  74. package/lib/Conversation/ChatList/MessageItem/Content.js +104 -0
  75. package/lib/Conversation/ChatList/MessageItem/Toolbar.d.ts +10 -0
  76. package/lib/Conversation/ChatList/MessageItem/Toolbar.js +110 -0
  77. package/lib/Conversation/ChatList/MessageItem/index.d.ts +9 -0
  78. package/lib/Conversation/ChatList/MessageItem/index.js +164 -0
  79. package/lib/Conversation/ChatList/index.d.ts +14 -0
  80. package/lib/Conversation/ChatList/index.js +61 -0
  81. package/lib/Conversation/InputArea/ActionBar.d.ts +4 -0
  82. package/lib/Conversation/InputArea/ActionBar.js +97 -0
  83. package/lib/Conversation/InputArea/index.d.ts +4 -0
  84. package/lib/Conversation/InputArea/index.js +149 -0
  85. package/lib/Conversation/StoreUpdater.d.ts +7 -0
  86. package/lib/Conversation/StoreUpdater.js +54 -0
  87. package/lib/Conversation/index.d.ts +8 -0
  88. package/lib/Conversation/index.js +45 -0
  89. package/lib/EditableMessageList/index.d.ts +9 -0
  90. package/lib/EditableMessageList/index.js +124 -0
  91. package/lib/EditableText/index.d.ts +1 -1
  92. package/lib/EditableText/index.js +1 -1
  93. package/lib/Highlighter/SyntaxHighlighter/style.js +4 -1
  94. package/lib/Highlighter/style.js +11 -13
  95. package/lib/Logo/style.js +1 -1
  96. package/lib/Markdown/style.js +27 -37
  97. package/lib/Snippet/style.js +16 -12
  98. package/lib/StroyBook/style.js +5 -2
  99. package/lib/ThemeProvider/GlobalStyle.js +23 -9
  100. package/lib/Tooltip/style.js +8 -5
  101. package/lib/{EditableText → components}/ControlInput.js +1 -1
  102. package/lib/index.d.ts +3 -0
  103. package/lib/index.js +6 -0
  104. package/lib/styles/customStylish.js +6 -5
  105. package/lib/styles/theme/base.js +6 -2
  106. package/package.json +16 -3
  107. /package/es/{EditableText → components}/ControlInput.d.ts +0 -0
  108. /package/es/{EditableText → components}/ControlInput.js +0 -0
  109. /package/lib/{EditableText → components}/ControlInput.d.ts +0 -0
@@ -0,0 +1 @@
1
+ export declare const LOADING_FLAT = "...";
@@ -0,0 +1 @@
1
+ export var LOADING_FLAT = '...';
@@ -0,0 +1,2 @@
1
+ export { messagesReducer } from './store';
2
+ export * from './types';
@@ -0,0 +1,2 @@
1
+ export { messagesReducer } from "./store";
2
+ export * from "./types";
@@ -0,0 +1,20 @@
1
+ /// <reference types="react" />
2
+ import { StoreApi } from 'zustand';
3
+ import { ChatStore } from './store';
4
+ export declare const createChatStore: (showDevtools?: boolean) => import("zustand").UseBoundStore<Omit<StoreApi<ChatStore>, "setState"> & {
5
+ setState<A extends string | {
6
+ type: unknown;
7
+ }>(partial: ChatStore | Partial<ChatStore> | ((state: ChatStore) => ChatStore | Partial<ChatStore>), replace?: boolean | undefined, action?: A | undefined): void;
8
+ }>;
9
+ export declare const Provider: ({ createStore, children }: {
10
+ createStore: () => StoreApi<ChatStore>;
11
+ children: any;
12
+ }) => import("react").FunctionComponentElement<import("react").ProviderProps<StoreApi<ChatStore> | undefined>>, useStore: import("zustand-utils").UseContextStore<StoreApi<ChatStore>>, useStoreApi: () => {
13
+ setState: (partial: ChatStore | Partial<ChatStore> | ((state: ChatStore) => ChatStore | Partial<ChatStore>), replace?: boolean | undefined) => void;
14
+ getState: () => ChatStore;
15
+ subscribe: (listener: (state: ChatStore, prevState: ChatStore) => void) => () => void;
16
+ destroy: () => void;
17
+ };
18
+ export { messagesReducer, type MessageDispatch } from './messageReducer';
19
+ export * from './selectors';
20
+ export type { ChatStore } from './store';
@@ -0,0 +1,16 @@
1
+ import { create } from 'zustand';
2
+ import { createContext, optionalDevtools } from 'zustand-utils';
3
+ import { createStore } from "./store";
4
+ export var createChatStore = function createChatStore() {
5
+ var showDevtools = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
6
+ return create()(optionalDevtools(showDevtools)(createStore, {
7
+ name: 'CHAT_COMPONENT'
8
+ }));
9
+ };
10
+ var _createContext = createContext(),
11
+ Provider = _createContext.Provider,
12
+ useStore = _createContext.useStore,
13
+ useStoreApi = _createContext.useStoreApi;
14
+ export { Provider, useStore, useStoreApi };
15
+ export { messagesReducer } from "./messageReducer";
16
+ export * from "./selectors";
@@ -0,0 +1,28 @@
1
+ import { ChatMessage, InternalChatContext, OpenAIRequestParams } from '../types';
2
+ export interface ChatState extends InternalChatContext {
3
+ /**
4
+ * @title 消息
5
+ * @type {string}
6
+ */
7
+ message: string;
8
+ /**
9
+ * @title 加载状态
10
+ * @type {boolean}
11
+ */
12
+ loading: boolean;
13
+ /**
14
+ * @title 改变系统角色状态
15
+ * @type {boolean}
16
+ */
17
+ changingSystemRole: boolean;
18
+ /**
19
+ * 编辑中的消息 id
20
+ */
21
+ editingMessageId?: number | null;
22
+ onMessagesChange?: (messages: ChatMessage[]) => void;
23
+ onResponseStart?: (messages: ChatMessage[]) => Promise<void>;
24
+ onResponseFinished?: (session: any) => void;
25
+ onAgentChange?: (agent: any, type: 'update' | 'remove') => void;
26
+ request?: (params: OpenAIRequestParams) => Promise<Response>;
27
+ }
28
+ export declare const initialState: ChatState;
@@ -0,0 +1,9 @@
1
+ export var initialState = {
2
+ message: '',
3
+ messages: [],
4
+ loading: false,
5
+ changingSystemRole: false,
6
+ editingMessageId: null,
7
+ createAt: -1,
8
+ updateAt: -1
9
+ };
@@ -0,0 +1,37 @@
1
+ import { ChatMessage, ChatMessageError, MessageRoleType } from '../types';
2
+ export declare type MessageDispatch = {
3
+ type: 'addMessage';
4
+ message: ChatMessage;
5
+ } | {
6
+ type: 'insertMessage';
7
+ message: ChatMessage;
8
+ index: number;
9
+ } | {
10
+ type: 'deleteMessage';
11
+ index: number;
12
+ } | {
13
+ type: 'resetMessages';
14
+ } | {
15
+ type: 'updateMessage';
16
+ index: number;
17
+ message: string;
18
+ } | {
19
+ type: 'updateMessageRole';
20
+ index: number;
21
+ role: MessageRoleType;
22
+ } | {
23
+ type: 'addUserMessage';
24
+ message: string;
25
+ } | {
26
+ type: 'updateLatestBotMessage';
27
+ responseStream: string[];
28
+ } | {
29
+ type: 'updateMessageChoice';
30
+ message: string;
31
+ index: number;
32
+ } | {
33
+ type: 'setErrorMessage';
34
+ index: number;
35
+ error: ChatMessageError | undefined;
36
+ };
37
+ export declare const messagesReducer: (state: ChatMessage[], payload: MessageDispatch) => ChatMessage[];
@@ -0,0 +1,67 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import { produce } from 'immer';
3
+ export var messagesReducer = function messagesReducer(state, payload) {
4
+ switch (payload.type) {
5
+ case 'addMessage':
6
+ return [].concat(_toConsumableArray(state), [payload.message]);
7
+ case 'insertMessage':
8
+ return produce(state, function (draftState) {
9
+ draftState.splice(payload.index, 0, payload.message);
10
+ });
11
+ case 'deleteMessage':
12
+ return state.filter(function (_, i) {
13
+ return i !== payload.index;
14
+ });
15
+ case 'resetMessages':
16
+ return [];
17
+ case 'updateMessage':
18
+ return produce(state, function (draftState) {
19
+ var index = payload.index,
20
+ message = payload.message;
21
+ draftState[index].content = message;
22
+ });
23
+ case 'updateMessageRole':
24
+ return produce(state, function (draftState) {
25
+ var index = payload.index,
26
+ role = payload.role;
27
+ draftState[index].role = role;
28
+ });
29
+ case 'addUserMessage':
30
+ return produce(state, function (draftState) {
31
+ draftState.push({
32
+ role: 'user',
33
+ content: payload.message
34
+ });
35
+ });
36
+ case 'updateLatestBotMessage':
37
+ return produce(state, function () {
38
+ var responseStream = payload.responseStream;
39
+ var newMessage = {
40
+ role: 'assistant',
41
+ content: responseStream.join('')
42
+ };
43
+ return [].concat(_toConsumableArray(state.slice(0, -1)), [newMessage]);
44
+ });
45
+ case 'setErrorMessage':
46
+ return produce(state, function (draftState) {
47
+ var index = payload.index,
48
+ error = payload.error;
49
+ draftState[index].error = error;
50
+ });
51
+ case 'updateMessageChoice':
52
+ return produce(state, function (draftState) {
53
+ var index = payload.index,
54
+ message = payload.message;
55
+ var botMessage = draftState[index];
56
+ var prevMsg = botMessage.content;
57
+ botMessage.content = message;
58
+ if (botMessage.choices) {
59
+ botMessage.choices.push(prevMsg);
60
+ } else {
61
+ botMessage.choices = [prevMsg];
62
+ }
63
+ });
64
+ default:
65
+ throw Error('暂未实现的 type,请检查 reducer');
66
+ }
67
+ };
@@ -0,0 +1,9 @@
1
+ import type { ChatStore } from './store';
2
+ export declare const chatSelectors: {
3
+ totalTokenCount: (s: ChatStore) => number;
4
+ agentTokenCount: (s: ChatStore) => number;
5
+ messagesTokenCount: (s: ChatStore) => number;
6
+ totalTokens: (s: ChatStore) => number[];
7
+ messagesTokens: (s: ChatStore) => number[];
8
+ disableInput: (s: ChatStore) => boolean;
9
+ };
@@ -0,0 +1,44 @@
1
+ import { get_encoding } from '@dqbd/tiktoken';
2
+ var tiktoken = get_encoding('cl100k_base');
3
+ var encode = function encode(text) {
4
+ if (!text) return [];
5
+ var tokens = tiktoken.encode(text);
6
+ return tokens;
7
+ };
8
+ var disableInputSel = function disableInputSel(s) {
9
+ return s.changingSystemRole;
10
+ };
11
+ var messagesTokens = function messagesTokens(s) {
12
+ return encode(s.messages.map(function (m) {
13
+ return m.content;
14
+ }).join(''));
15
+ };
16
+ var agentContentTokens = function agentContentTokens(s) {
17
+ return encode(s.messages.filter(function (s) {
18
+ return s.role === 'system';
19
+ }).map(function (c) {
20
+ return c.content;
21
+ }).join('') || '');
22
+ };
23
+ var totalTokens = function totalTokens(s) {
24
+ return encode(s.messages.map(function (m) {
25
+ return m.content;
26
+ }).join(''));
27
+ };
28
+ var totalTokenCount = function totalTokenCount(s) {
29
+ return totalTokens(s).length;
30
+ };
31
+ var agentTokenCount = function agentTokenCount(s) {
32
+ return agentContentTokens(s).length;
33
+ };
34
+ var messagesTokenCount = function messagesTokenCount(s) {
35
+ return messagesTokens(s).length;
36
+ };
37
+ export var chatSelectors = {
38
+ totalTokenCount: totalTokenCount,
39
+ agentTokenCount: agentTokenCount,
40
+ messagesTokenCount: messagesTokenCount,
41
+ totalTokens: totalTokens,
42
+ messagesTokens: messagesTokens,
43
+ disableInput: disableInputSel
44
+ };
@@ -0,0 +1,34 @@
1
+ import { StateCreator } from 'zustand/vanilla';
2
+ import { ChatMessage } from '../types';
3
+ import { FetchSSEOptions } from '../utils/fetch';
4
+ import { ChatState } from './initialState';
5
+ import { MessageDispatch } from './messageReducer';
6
+ interface ChatAction {
7
+ /**
8
+ * @title 发送消息
9
+ * @returns Promise<void>
10
+ */
11
+ sendMessage: () => Promise<void>;
12
+ /**
13
+ * @title 重发消息
14
+ * @param index - 消息索引
15
+ * @returns Promise<void>
16
+ */
17
+ resendMessage: (index: number) => Promise<void>;
18
+ generateMessage: (message: string, messages: ChatMessage[], options: FetchSSEOptions) => Promise<void>;
19
+ /**
20
+ * @title 派发消息
21
+ * @param payload - 消息分发
22
+ * @returns void
23
+ */
24
+ dispatchMessage: (payload: MessageDispatch) => void;
25
+ /**
26
+ * @title 处理消息编辑
27
+ * @param index - 消息索引或空
28
+ * @returns void
29
+ */
30
+ handleMessageEditing: (index?: number | null) => void;
31
+ }
32
+ export declare type ChatStore = ChatAction & ChatState;
33
+ export declare const createStore: StateCreator<ChatStore, [['zustand/devtools', never]]>;
34
+ export {};
@@ -0,0 +1,240 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
4
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
5
+ var _excluded = ["type"];
6
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
8
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
9
+ import { fetchSSE } from "../utils/fetch";
10
+ import { LOADING_FLAT } from "../const";
11
+ import { initialState } from "./initialState";
12
+ import { messagesReducer } from "./messageReducer";
13
+ export var createStore = function createStore(set, get) {
14
+ return _objectSpread(_objectSpread({}, initialState), {}, {
15
+ dispatchMessage: function dispatchMessage(payload) {
16
+ var _get$onMessagesChange, _get;
17
+ var type = payload.type,
18
+ res = _objectWithoutProperties(payload, _excluded);
19
+ var messages = messagesReducer(get().messages, payload);
20
+ set({
21
+ messages: messages
22
+ }, false, {
23
+ type: "dispatchMessage/".concat(type),
24
+ payload: res
25
+ });
26
+ (_get$onMessagesChange = (_get = get()).onMessagesChange) === null || _get$onMessagesChange === void 0 ? void 0 : _get$onMessagesChange.call(_get, messages);
27
+ },
28
+ handleMessageEditing: function handleMessageEditing(index) {
29
+ set({
30
+ editingMessageId: index
31
+ });
32
+ },
33
+ generateMessage: function () {
34
+ var _generateMessage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(message, messages, options) {
35
+ var _get2, onResponseStart, request, onResponseFinished, fetcher;
36
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
37
+ while (1) switch (_context.prev = _context.next) {
38
+ case 0:
39
+ _get2 = get(), onResponseStart = _get2.onResponseStart, request = _get2.request, onResponseFinished = _get2.onResponseFinished;
40
+ if (request) {
41
+ _context.next = 3;
42
+ break;
43
+ }
44
+ return _context.abrupt("return");
45
+ case 3:
46
+ _context.next = 5;
47
+ return onResponseStart === null || onResponseStart === void 0 ? void 0 : onResponseStart(get().messages);
48
+ case 5:
49
+ set({
50
+ loading: true
51
+ });
52
+ fetcher = function fetcher() {
53
+ return request({
54
+ messages: messages
55
+ });
56
+ };
57
+ _context.next = 9;
58
+ return fetchSSE(fetcher, options);
59
+ case 9:
60
+ set({
61
+ loading: false
62
+ });
63
+ onResponseFinished === null || onResponseFinished === void 0 ? void 0 : onResponseFinished({
64
+ messages: get().messages
65
+ });
66
+ case 11:
67
+ case "end":
68
+ return _context.stop();
69
+ }
70
+ }, _callee);
71
+ }));
72
+ function generateMessage(_x, _x2, _x3) {
73
+ return _generateMessage.apply(this, arguments);
74
+ }
75
+ return generateMessage;
76
+ }(),
77
+ sendMessage: function () {
78
+ var _sendMessage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
79
+ var _get3, message, dispatchMessage, generateMessage, messages, currentResponse;
80
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
81
+ while (1) switch (_context2.prev = _context2.next) {
82
+ case 0:
83
+ _get3 = get(), message = _get3.message, dispatchMessage = _get3.dispatchMessage, generateMessage = _get3.generateMessage, messages = _get3.messages;
84
+ if (message) {
85
+ _context2.next = 3;
86
+ break;
87
+ }
88
+ return _context2.abrupt("return");
89
+ case 3:
90
+ set({
91
+ message: ''
92
+ });
93
+ dispatchMessage({
94
+ type: 'addUserMessage',
95
+ message: message
96
+ });
97
+
98
+ // 添加一个空的信息用于放置 ai 响应
99
+ dispatchMessage({
100
+ type: 'addMessage',
101
+ message: {
102
+ role: 'assistant',
103
+ content: LOADING_FLAT
104
+ }
105
+ });
106
+ currentResponse = []; // 生成 messages
107
+ _context2.next = 9;
108
+ return generateMessage(message, messages, {
109
+ onMessageHandle: function onMessageHandle(text) {
110
+ currentResponse = [].concat(_toConsumableArray(currentResponse), [text]);
111
+ dispatchMessage({
112
+ type: 'updateLatestBotMessage',
113
+ responseStream: currentResponse
114
+ });
115
+
116
+ // 滚动到最后一条消息
117
+ var item = document.getElementById('for-loading');
118
+ if (!item) return;
119
+ item.scrollIntoView({
120
+ behavior: 'smooth'
121
+ });
122
+ },
123
+ onErrorHandle: function onErrorHandle(error) {
124
+ dispatchMessage({
125
+ type: 'setErrorMessage',
126
+ error: error,
127
+ index: get().messages.length - 1
128
+ });
129
+ }
130
+ });
131
+ case 9:
132
+ case "end":
133
+ return _context2.stop();
134
+ }
135
+ }, _callee2);
136
+ }));
137
+ function sendMessage() {
138
+ return _sendMessage.apply(this, arguments);
139
+ }
140
+ return sendMessage;
141
+ }(),
142
+ resendMessage: function () {
143
+ var _resendMessage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(index) {
144
+ var _contextMessages$at;
145
+ var _get4, dispatchMessage, sendMessage, generateMessage, messages, lastMessage, contextMessages, userMessage, targetMsg, botPrevMsg, currentResponse;
146
+ return _regeneratorRuntime.wrap(function _callee3$(_context3) {
147
+ while (1) switch (_context3.prev = _context3.next) {
148
+ case 0:
149
+ _get4 = get(), dispatchMessage = _get4.dispatchMessage, sendMessage = _get4.sendMessage, generateMessage = _get4.generateMessage, messages = _get4.messages;
150
+ lastMessage = messages.at(-1); // 用户通过手动删除,造成了他的问题是最后一条消息
151
+ // 这种情况下,相当于用户重新发送消息
152
+ if (!(messages.length === index && (lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.role) === 'user')) {
153
+ _context3.next = 8;
154
+ break;
155
+ }
156
+ dispatchMessage({
157
+ type: 'deleteMessage',
158
+ index: index - 1
159
+ });
160
+ set({
161
+ message: lastMessage.content
162
+ });
163
+ _context3.next = 7;
164
+ return sendMessage();
165
+ case 7:
166
+ return _context3.abrupt("return");
167
+ case 8:
168
+ // 上下文消息就是当前消息之前的消息
169
+ contextMessages = get().messages.slice(0, index); // 上下文消息中最后一条消息
170
+ userMessage = (_contextMessages$at = contextMessages.at(-1)) === null || _contextMessages$at === void 0 ? void 0 : _contextMessages$at.content;
171
+ if (userMessage) {
172
+ _context3.next = 12;
173
+ break;
174
+ }
175
+ return _context3.abrupt("return");
176
+ case 12:
177
+ targetMsg = messages[index]; // 如果不是 assistant 的消息,那么需要额外插入一条消息
178
+ if (targetMsg.role !== 'assistant') {
179
+ dispatchMessage({
180
+ type: 'insertMessage',
181
+ index: index,
182
+ message: {
183
+ role: 'assistant',
184
+ content: LOADING_FLAT
185
+ }
186
+ });
187
+ } else {
188
+ botPrevMsg = targetMsg.content; // 保存之前的消息为历史消息
189
+ dispatchMessage({
190
+ type: 'updateMessageChoice',
191
+ message: botPrevMsg,
192
+ index: index
193
+ });
194
+ dispatchMessage({
195
+ type: 'updateMessage',
196
+ message: LOADING_FLAT,
197
+ index: index
198
+ });
199
+ }
200
+
201
+ // 重置错误信息
202
+ dispatchMessage({
203
+ type: 'setErrorMessage',
204
+ error: undefined,
205
+ index: index
206
+ });
207
+
208
+ // 开始更新消息
209
+ currentResponse = [];
210
+ _context3.next = 18;
211
+ return generateMessage(userMessage, contextMessages, {
212
+ onMessageHandle: function onMessageHandle(text) {
213
+ currentResponse = [].concat(_toConsumableArray(currentResponse), [text]);
214
+ dispatchMessage({
215
+ type: 'updateMessage',
216
+ message: currentResponse.join(''),
217
+ index: index
218
+ });
219
+ },
220
+ onErrorHandle: function onErrorHandle(error) {
221
+ dispatchMessage({
222
+ type: 'setErrorMessage',
223
+ error: error,
224
+ index: index
225
+ });
226
+ }
227
+ });
228
+ case 18:
229
+ case "end":
230
+ return _context3.stop();
231
+ }
232
+ }, _callee3);
233
+ }));
234
+ function resendMessage(_x4) {
235
+ return _resendMessage.apply(this, arguments);
236
+ }
237
+ return resendMessage;
238
+ }()
239
+ });
240
+ };
@@ -0,0 +1,77 @@
1
+ export declare type InternalChatContext = Omit<ChatContext, 'id'>;
2
+ export declare type MessageRoleType = 'user' | 'system' | 'assistant';
3
+ /**
4
+ * 聊天消息错误对象
5
+ */
6
+ export interface ChatMessageError {
7
+ /**
8
+ * 错误信息
9
+ */
10
+ message: string;
11
+ /**
12
+ * 错误状态码
13
+ */
14
+ status: number;
15
+ /**
16
+ * 错误类型
17
+ * @enum ["chatbot", "openai"]
18
+ * @enumNames ["聊天机器人", "开放AI"]
19
+ */
20
+ type: 'chatbot' | 'openai';
21
+ }
22
+ /**
23
+ * @title ChatGPTMessage 聊天消息
24
+ * @category Model
25
+ */
26
+ export interface ChatMessage {
27
+ /**
28
+ * @title 角色
29
+ * @description 消息发送者的角色
30
+ * @enum {MessageRoleType} ChatGPTAgent
31
+ */
32
+ role: MessageRoleType;
33
+ /**
34
+ * @title 内容
35
+ * @description 消息内容
36
+ */
37
+ content: string;
38
+ /**
39
+ * 其余生成项
40
+ */
41
+ choices?: string[];
42
+ /**
43
+ * 如果存在错误消息
44
+ */
45
+ error?: ChatMessageError;
46
+ }
47
+ export interface ChatContext {
48
+ id: string;
49
+ /**
50
+ * @title 会话标题
51
+ */
52
+ title?: string;
53
+ /**
54
+ * @title 会话描述
55
+ * @description 用户设置的会话描述
56
+ * @type {string}
57
+ */
58
+ description?: string;
59
+ /**
60
+ * @title 消息列表
61
+ * @description 聊天室中的所有消息
62
+ * @type {ChatMessage[]}
63
+ */
64
+ messages: ChatMessage[];
65
+ createAt: number;
66
+ updateAt: number;
67
+ }
68
+ export declare type ChatContextMap = Record<string, Omit<ChatContext, 'systemRole'>>;
69
+ /**
70
+ * 请求数据类型
71
+ */
72
+ export interface OpenAIRequestParams {
73
+ /**
74
+ * 中间的聊天记录
75
+ */
76
+ messages?: ChatMessage[];
77
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { ChatMessageError } from '../types';
2
+ export interface FetchSSEOptions {
3
+ onMessageHandle?: (text: string) => void;
4
+ onErrorHandle?: (error: ChatMessageError) => void;
5
+ }
6
+ /**
7
+ * 使用流式方法获取数据
8
+ * @param fetchFn
9
+ * @param options
10
+ */
11
+ export declare const fetchSSE: (fetchFn: () => Promise<Response>, options?: FetchSSEOptions) => Promise<Response | undefined>;