From 9803512c0b07a3c503bd0dff40250fc70ba6145a Mon Sep 17 00:00:00 2001 From: Pabloader Date: Fri, 27 Mar 2026 15:41:54 +0000 Subject: [PATCH] Fix prompt message duplication issue. --- .../storywriter/components/chat-sidebar.tsx | 8 ++++++-- src/games/storywriter/utils/prompt.ts | 19 ++++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/games/storywriter/components/chat-sidebar.tsx b/src/games/storywriter/components/chat-sidebar.tsx index bcf93c5..970dc7d 100644 --- a/src/games/storywriter/components/chat-sidebar.tsx +++ b/src/games/storywriter/components/chat-sidebar.tsx @@ -92,10 +92,14 @@ export const ChatSidebar = () => { const countTokens = async () => { try { - const messages: LLM.ChatMessage[] = []; + const messages: ChatMessage[] = []; if (input.trim()) { - messages.push({ role: 'user', content: input.trim() }); + messages.push({ + id: crypto.randomUUID(), + role: 'user', + content: input.trim(), + }); } const chatRequest = Prompt.compilePrompt(appStateRef.current, messages); diff --git a/src/games/storywriter/utils/prompt.ts b/src/games/storywriter/utils/prompt.ts index c9e728e..1e546e1 100644 --- a/src/games/storywriter/utils/prompt.ts +++ b/src/games/storywriter/utils/prompt.ts @@ -1,6 +1,6 @@ import LLM from "./llm"; import Chapters from "./chapters"; -import { type AppState, CharacterRole } from "../contexts/state"; +import { type AppState, CharacterRole, type ChatMessage } from "../contexts/state"; import { Tools } from "./tools"; namespace Prompt { @@ -313,7 +313,7 @@ namespace Prompt { return parts.join('\n\n'); } - export function compilePrompt(state: AppState, newMessages: LLM.ChatMessage[] = []): LLM.ChatCompletionRequest | null { + export function compilePrompt(state: AppState, newMessages: ChatMessage[] = []): LLM.ChatCompletionRequest | null { const { currentStory, model, enableThinking } = state; if (!currentStory || !model) { @@ -332,12 +332,21 @@ namespace Prompt { storyTokenBudget = model.max_context - otherTokens; } - const messages: LLM.ChatMessage[] = [ - { role: 'system', content: formatSystemPrompt(state, storyTokenBudget) }, + const messages: ChatMessage[] = [ + { + id: crypto.randomUUID(), + role: 'system', + content: formatSystemPrompt(state, storyTokenBudget), + }, ...currentStory.chatMessages, ]; - messages.push(...newMessages); + const presentMessages = new Set(messages.map(m => m.id)); + for (const newMessage of newMessages) { + if (!presentMessages.has(newMessage.id)) { + messages.push(newMessage); + } + } return { model: model.id,