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;