在前幾天的文章中,我們已經成功讓「AI 酒館」支援多角色切換,並且每個角色都有獨立的記憶。不過,隨著和調酒師 Mark 聊得越來越深入,玩家可能會同時聊多個不同的話題(例如一條聊調酒心得、另一條聊人生哲學)。如果所有對話全都擠在同一個畫面上,不僅雜亂,也失去了分流討論的樂趣。
為了讓酒館的對話管理更有組織,今天的核心任務是實作:多話題清單(Chat Sessions / Threads)管理!
下達 Vibe Coding 需求
我們透過 AI 助手在資料結構中引入 Session 概念,並在側邊欄擴充話題清單的 CRUD(新增、切換、刪除)操作介面。
核心多話題管理邏輯實作
前端處理話題清單與獨立儲存的程式碼概念大致如下:
import { useState, useEffect } from 'react';
export function useChatSessions(characterId: string) {
const sessionsKey = `sessions_${characterId}`;
// 讀取該角色的所有話題清單
const [sessions, setSessions] = useState(() => {
const saved = localStorage.getItem(sessionsKey);
return saved ? JSON.parse(saved) : [{ id: 'default', title: '新的對話', messages: [] }];
});
const [activeSessionId, setActiveSessionId] = useState(sessions[0]?.id || 'default');
// 當 sessions 改變時同步寫入 localStorage
useEffect(() => {
localStorage.setItem(sessionsKey, JSON.stringify(sessions));
}, [sessions, sessionsKey]);
// 新增對話主題
const createNewSession = () => {
const newSession = { id: Date.now().toString(), title: `新對話 ${sessions.length + 1}`, messages: [] };
setSessions([newSession, ...sessions]);
setActiveSessionId(newSession.id);
};
return { sessions, activeSessionId, setActiveSessionId, createNewSession };
}