💾 尝试修改为数据库存储

This commit is contained in:
KawakazeNotFound 2025-11-07 15:35:46 +08:00
parent a6290ca7bf
commit 59b4f3c2a3
4 changed files with 610 additions and 72 deletions

View file

@ -0,0 +1,102 @@
"""
Tortoise ORM 模型定义
用于存储聊天历史和群组/私聊状态
"""
import json
from datetime import datetime
from typing import Optional
from tortoise import fields
from tortoise.models import Model
class GroupChatState(Model):
"""群组聊天状态"""
id = fields.IntField(pk=True)
group_id = fields.BigIntField(unique=True, description="群号")
preset_name = fields.CharField(max_length=50, description="当前使用的 API 预设名")
group_prompt = fields.TextField(null=True, description="群组自定义提示词")
output_reasoning_content = fields.BooleanField(default=False, description="是否输出推理内容")
random_trigger_prob = fields.FloatField(default=0.05, description="随机触发概率")
last_active = fields.DatetimeField(auto_now=True, description="最后活跃时间")
created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")
class Meta:
table = "llmchat_group_state"
description = "群组聊天状态表"
class PrivateChatState(Model):
"""私聊状态"""
id = fields.IntField(pk=True)
user_id = fields.BigIntField(unique=True, description="用户 QQ")
preset_name = fields.CharField(max_length=50, description="当前使用的 API 预设名")
user_prompt = fields.TextField(null=True, description="用户自定义提示词")
output_reasoning_content = fields.BooleanField(default=False, description="是否输出推理内容")
last_active = fields.DatetimeField(auto_now=True, description="最后活跃时间")
created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")
class Meta:
table = "llmchat_private_state"
description = "私聊状态表"
class ChatMessage(Model):
"""聊天消息历史"""
id = fields.IntField(pk=True)
group_id = fields.BigIntField(null=True, description="群号(私聊时为 NULL")
user_id = fields.BigIntField(null=True, description="用户 QQ私聊时有值")
is_private = fields.BooleanField(default=False, description="是否为私聊")
role = fields.CharField(
max_length=20,
description="消息角色: user/assistant/system/tool",
)
content = fields.TextField(description="消息内容JSON 序列化)")
created_at = fields.DatetimeField(auto_now_add=True, description="消息时间")
class Meta:
table = "llmchat_message"
description = "聊天消息历史表"
indexes = [
("group_id", "is_private", "created_at"), # 复合索引用于快速查询
("user_id", "is_private", "created_at"),
]
@staticmethod
def serialize_content(content) -> str:
"""将内容序列化为 JSON 字符串"""
return json.dumps(content, ensure_ascii=False)
@staticmethod
def deserialize_content(content_str: str):
"""从 JSON 字符串反序列化内容"""
return json.loads(content_str)
class ChatHistory(Model):
"""聊天历史快照(用于快速加载)"""
id = fields.IntField(pk=True)
group_id = fields.BigIntField(null=True, unique=True, description="群号(私聊时为 NULL")
user_id = fields.BigIntField(null=True, unique=True, description="用户 QQ私聊时有值")
is_private = fields.BooleanField(default=False, description="是否为私聊")
# 存储最近 history_size*2 条消息的 JSON 数组
messages_json = fields.TextField(description="消息历史JSON 数组)")
last_update = fields.DatetimeField(auto_now=True, description="最后更新时间")
class Meta:
table = "llmchat_history"
description = "聊天历史快照表(用于快速加载)"
@staticmethod
def serialize_messages(messages_list) -> str:
"""将消息列表序列化为 JSON 字符串"""
return json.dumps(messages_list, ensure_ascii=False)
@staticmethod
def deserialize_messages(messages_json: str):
"""从 JSON 字符串反序列化消息列表"""
return json.loads(messages_json)