nonebot-plugin-llmchat/nonebot_plugin_llmchat/models.py
2025-11-07 15:35:46 +08:00

102 lines
4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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)