@deepracticex/conversation-storage
DeeChat 对话存储管理包 - 纯存储层实现
设计原则
职责边界
- ✅ 数据存储和检索 - 会话和消息的CRUD操作
- ✅ 数据库管理 - SQLite数据库初始化和迁移
- ✅ 类型定义 - 存储相关的TypeScript类型
- ❌ 业务逻辑 - 由 ConversationDomain 负责
- ❌ AI集成 - 由 ConversationDomain 负责
- ❌ 流式处理 - 由 ConversationDomain 负责
架构分层
ConversationDomain (业务层)
↓ 依赖注入
conversation-storage (存储层)
↓ 持久化
SQLite 数据库
核心实体
ConversationSession (会话)
interface ConversationSession {
id: string
title: string
ai_config_name: string
created_at: string
updated_at: string
message_count: number
}
ConversationMessage (消息)
interface ConversationMessage {
id: string
session_id: string
role: 'user' | 'assistant' | 'system'
content: string
timestamp: string
token_usage?: TokenUsage
}
API 设计
会话管理
createSession(data: CreateSessionData): Promise<ConversationSession>
getSession(sessionId: string): Promise<ConversationSession | null>
getSessions(): Promise<ConversationSession[]>
updateSession(sessionId: string, updates: Partial<SessionData>): Promise<void>
deleteSession(sessionId: string): Promise<void>
消息管理
saveMessage(data: CreateMessageData): Promise<ConversationMessage>
getMessageHistory(sessionId: string): Promise<ConversationMessage[]>
deleteMessagesBySession(sessionId: string): Promise<void>
updateMessageCount(sessionId: string): Promise<void>
数据库设计
sessions 表
CREATE TABLE sessions (
id TEXT PRIMARY KEY,
title TEXT NOT NULL,
ai_config_name TEXT NOT NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
message_count INTEGER DEFAULT 0
);
messages 表
CREATE TABLE messages (
id TEXT PRIMARY KEY,
session_id TEXT NOT NULL,
role TEXT NOT NULL CHECK(role IN ('user', 'assistant', 'system')),
content TEXT NOT NULL,
timestamp TEXT NOT NULL,
token_usage TEXT,
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
);
索引设计
CREATE INDEX idx_messages_session_id ON messages(session_id);
CREATE INDEX idx_messages_timestamp ON messages(timestamp);
CREATE INDEX idx_sessions_updated_at ON sessions(updated_at);
集成方式
ConversationDomain 中的使用
export class ConversationDomain implements IDomain {
private conversationStorage: ConversationStorage
constructor(
private aiConfigDomain: AIConfigurationDomain,
conversationStorage: ConversationStorage
) {
this.conversationStorage = conversationStorage
}
async createSession(input: CreateSessionInput): Promise<ConversationSession> {
const aiConfig = await this.aiConfigDomain.getUserConfiguration(input.ai_config_name)
if (!aiConfig) {
throw new Error(`AI配置 '${input.ai_config_name}' 不存在`)
}
return await this.conversationStorage.createSession({
title: input.title || `对话 ${new Date().toLocaleString()}`,
ai_config_name: input.ai_config_name
})
}
}
参考设计
参照 @deepracticex/ai-config 包的设计模式:
- 简洁的API设计
- 统一的错误处理
- 遵循"如非必要,勿增实体"原则
- 纯粹的存储职责
开发计划
- Phase 1: 基础包结构和类型定义
- Phase 2: SQLite存储实现
- Phase 3: 集成到ConversationDomain
- Phase 4: 测试和优化