diff --git a/src/audio/guild-voice-session.ts b/src/audio/guild-voice-session.ts index 78bf6e7..30517d3 100644 --- a/src/audio/guild-voice-session.ts +++ b/src/audio/guild-voice-session.ts @@ -361,7 +361,6 @@ export class GuildVoiceSession extends EventEmitter { }; this.options.logger.info("Transcript committed", this.guildId, hydratedUtterance.speakerName, hydratedUtterance.text); - this.memory.addUserTurn(hydratedUtterance); if (this.options.config.DEBUG_TEXT_EVENTS) { await this.announce(`πŸ—£οΈ ${hydratedUtterance.speakerName}: ${hydratedUtterance.text}`); @@ -375,6 +374,7 @@ export class GuildVoiceSession extends EventEmitter { reply = "μ§€κΈˆμ€ λ‹΅λ³€ 생성에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. μž μ‹œ ν›„ λ‹€μ‹œ 말씀해 μ£Όμ„Έμš”."; } + this.memory.addUserTurn(hydratedUtterance); this.memory.addAssistantTurn(reply); if (this.options.config.DEBUG_TEXT_EVENTS) { await this.announce(`πŸ€– ${reply}`); diff --git a/src/audio/local-voice-session.ts b/src/audio/local-voice-session.ts index 90ad305..d15c64f 100644 --- a/src/audio/local-voice-session.ts +++ b/src/audio/local-voice-session.ts @@ -362,7 +362,6 @@ export class LocalVoiceSession { } utterance.text = transcript.trim(); - this.memory.addUserTurn(utterance); this.options.logger.info("Local transcript", utterance.text); if (this.options.config.DEBUG_TEXT_EVENTS) { console.log(`\n[you] ${utterance.text}`); @@ -376,6 +375,7 @@ export class LocalVoiceSession { reply = "μ§€κΈˆμ€ λ‹΅λ³€ 생성에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. μž μ‹œ ν›„ λ‹€μ‹œ 말씀해 μ£Όμ„Έμš”."; } + this.memory.addUserTurn(utterance); this.memory.addAssistantTurn(reply); this.options.logger.info("Local reply", reply); if (this.options.config.DEBUG_TEXT_EVENTS) { diff --git a/src/services/conversation.ts b/src/services/conversation.ts index f3cdb9d..de209af 100644 --- a/src/services/conversation.ts +++ b/src/services/conversation.ts @@ -12,6 +12,14 @@ export interface UserUtterance { text: string; } +function renderSpeakerLabel(speakerName?: string): string { + const normalized = speakerName?.trim(); + if (!normalized || normalized === "unknown" || normalized === "local-user") { + return "μ‚¬μš©μž"; + } + return `μ‚¬μš©μž(${normalized})`; +} + export class ConversationMemory { private readonly turns: ConversationTurn[] = []; @@ -50,9 +58,9 @@ export class ConversationMemory { .slice(-this.maxTurns) .map((turn) => { if (turn.role === "assistant") { - return `[assistant]\n${turn.text}`; + return `λΉ„μ„œ: ${turn.text}`; } - return `[user speaker_id=${turn.speakerId ?? "unknown"} speaker_name=${turn.speakerName ?? "unknown"}]\n${turn.text}`; + return `${renderSpeakerLabel(turn.speakerName)}: ${turn.text}`; }) .join("\n\n"); @@ -62,9 +70,10 @@ export class ConversationMemory { "졜근 λŒ€ν™”:", historyBlock, "", - "이번 λ°œν™”:", - `[user speaker_id=${currentUtterance.speakerId} speaker_name=${currentUtterance.speakerName}]`, - currentUtterance.text, + "μ§€κΈˆ 방금 듀은 말:", + `${renderSpeakerLabel(currentUtterance.speakerName)}: ${currentUtterance.text}`, + "", + "μœ„ λ§ˆμ§€λ§‰ 말에 μžμ—°μŠ€λŸ½κ²Œ λ°”λ‘œ 닡변해라. speaker_idλ‚˜ speaker_name 같은 메타 정보λ₯Ό μžκΈ°μ†Œκ°œμ²˜λŸΌ λ°˜λ³΅ν•˜μ§€ 마라.", ].join("\n"); } diff --git a/src/services/ollama-llm.ts b/src/services/ollama-llm.ts index 869247b..519a5c0 100644 --- a/src/services/ollama-llm.ts +++ b/src/services/ollama-llm.ts @@ -8,6 +8,8 @@ const ASSISTANT_INSTRUCTIONS = [ "기본은 ν•œ λ¬Έμž₯, 길어도 두 λ¬Έμž₯을 λ„˜κΈ°μ§€ μ•ŠλŠ”λ‹€.", "λ§νˆ¬λŠ” μžμ—°μŠ€λŸ¬μš΄ ν•œκ΅­μ–΄λ‘œ μœ μ§€ν•œλ‹€.", "speaker_id와 speaker_name은 ν™”μž κ΅¬λΆ„μš©μ΄λ―€λ‘œ ν•„μš”ν•  λ•Œλ§Œ μžμ—°μŠ€λŸ½κ²Œ λ°˜μ˜ν•œλ‹€.", + "μžκΈ°μ†Œκ°œλ₯Ό λ°˜λ³΅ν•˜μ§€ 말고, μ‚¬μš©μžκ°€ 정체λ₯Ό λ¬Όμ—ˆμ„ λ•Œλ§Œ 짧게 μ†Œκ°œν•œλ‹€.", + "\"μ €λŠ” ν™”μžμž…λ‹ˆλ‹€\" 같은 μ–΄μƒ‰ν•œ 메타 응닡은 ν•˜μ§€ μ•ŠλŠ”λ‹€.", "잘 λͺ» λ“€μ—ˆκ±°λ‚˜ μ˜λ―Έκ°€ 뢈λͺ…ν™•ν•˜λ©΄ 짧게 λ‹€μ‹œ λ¬Όμ–΄λ³Έλ‹€.", "λͺ©λ‘, λ§ˆν¬λ‹€μš΄, μ½”λ“œλΈ”λ‘μ€ μ“°μ§€ μ•ŠλŠ”λ‹€.", "생각 과정을 λ“œλŸ¬λ‚΄μ§€ 말고 μ΅œμ’… λ‹΅λ³€λ§Œ λ§ν•œλ‹€.",