diff --git a/app/components/Messages.tsx b/app/components/Messages.tsx index bf49e51d..4afed363 100644 --- a/app/components/Messages.tsx +++ b/app/components/Messages.tsx @@ -38,7 +38,13 @@ export const Messages = () => {
{SYSTEM_MESSAGE} - {settings.systemMessage?.content && system: {settings.systemMessage.content}} + {[...(settings.systemMessage ? [settings.systemMessage] : []), ...(settings.prefixMessages ?? [])].map( + (message, index) => ( + + {message.role}: {message.content} + + ), + )} {messages.map((message, index) => ( ))} diff --git a/app/components/Settings.tsx b/app/components/Settings.tsx index 7d6deee1..a810eb44 100644 --- a/app/components/Settings.tsx +++ b/app/components/Settings.tsx @@ -37,13 +37,13 @@ export const Settings = () => { setSettings({ maxHistoryLength: Number(e.target.value) })} /> - {settings.maxHistoryLength ?? 5} + {settings.maxHistoryLength}
温度: @@ -115,8 +115,29 @@ export const Settings = () => { setSettings({ systemMessage: { role: Role.system, content: e.target.value } })} + value={settings.systemMessage?.content ?? ''} + onChange={(e) => { + if (e.target.value === '') { + setSettings({ systemMessage: undefined }); + } else { + setSettings({ systemMessage: { role: Role.system, content: e.target.value } }); + } + }} + /> +
+
+ 前置消息: + { + if (e.target.value === '') { + setSettings({ prefixMessages: undefined }); + } else { + setSettings({ prefixMessages: [{ role: Role.user, content: e.target.value }] }); + } + }} />
resetSettings()} value="重置所有配置" /> diff --git a/app/context/ChatContext.tsx b/app/context/ChatContext.tsx index 302aead8..37ab543b 100644 --- a/app/context/ChatContext.tsx +++ b/app/context/ChatContext.tsx @@ -108,17 +108,21 @@ export const ChatProvider: FC<{ children: ReactNode }> = ({ children }) => { const fetchApiChatMessages = newMessages // 过滤掉 isError 的消息 .filter((message) => !(message as Message).isError) - .slice(-(settings.maxHistoryLength * 2 + 1)) + .slice(-(settings.maxHistoryLength + 1)) .map((message) => { return isMessage(message) ? message : message.choices[0].message; }); + // 如果有前置消息,则写入到最前面 + if (settings.prefixMessages && settings.prefixMessages.length > 0) { + fetchApiChatMessages.unshift(...settings.prefixMessages); + } // 如果有系统消息,则写入到最前面 if (settings.systemMessage) { fetchApiChatMessages.unshift(settings.systemMessage); } // TODO 收到完整消息后,写入 cache 中 const fullContent = await fetchApiChat({ - ...omit(settings, 'maxHistoryLength', 'systemMessage', 'availableModels'), + ...omit(settings, 'maxHistoryLength', 'systemMessage', 'prefixMessages', 'availableModels'), messages: fetchApiChatMessages, stream: true, onMessage: (content) => { diff --git a/app/context/SettingsContext.tsx b/app/context/SettingsContext.tsx index a760fda4..297e56e6 100644 --- a/app/context/SettingsContext.tsx +++ b/app/context/SettingsContext.tsx @@ -11,12 +11,13 @@ import { AllModels, MAX_TOKENS, Model } from '@/utils/constants'; export interface SettingsState extends Omit { maxHistoryLength: number; systemMessage?: Message; + prefixMessages?: Message[]; availableModels: Model[]; } const INITIAL_SETTINGS: SettingsState = { model: Model['gpt-3.5-turbo'], - maxHistoryLength: 5, + maxHistoryLength: 6, availableModels: [Model['gpt-3.5-turbo'], Model['gpt-3.5-turbo-0613']], }; diff --git a/app/utils/message.ts b/app/utils/message.ts index 6bdaa363..1a593d62 100644 --- a/app/utils/message.ts +++ b/app/utils/message.ts @@ -4,7 +4,7 @@ import type { ChatResponse, Message } from './constants'; * 判断传入的 message 是简单的 Message 还是完整的 ChatResponse */ export function isMessage(message: Message | ChatResponse): message is Message { - if ((message as Message).content) { + if ((message as Message).content !== undefined) { return true; } return false;