mirror of
https://github.com/FuQuan233/nonebot-plugin-llmchat.git
synced 2026-02-05 11:38:05 +00:00
102 lines
4 KiB
Python
102 lines
4 KiB
Python
"""
|
||
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)
|