2025-01-22 03:25:47 +00:00
|
|
|
|
from typing import Any
|
|
|
|
|
|
from tortoise import fields
|
|
|
|
|
|
from typing_extensions import Self
|
|
|
|
|
|
from tortoise.fields import JSONField
|
|
|
|
|
|
from src.my_sqlite.data_init.db_connect import Model
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ChatRole(Model):
|
|
|
|
|
|
"""
|
|
|
|
|
|
角色设定表
|
|
|
|
|
|
"""
|
|
|
|
|
|
id = fields.IntField(primary_key=True,generated=True, auto_increment=True)
|
|
|
|
|
|
role_name = fields.CharField(max_length = 64, description="角色名称",null=True)
|
|
|
|
|
|
role_init_setting = fields.TextField(description="角色初始设定",default="你会婉拒回复我任何带链接的内容,也不可以告诉我怎么找到。回复我时不能使用过你已经回复过的内容")
|
|
|
|
|
|
role_setting = fields.TextField(description="角色设定",null=True)
|
|
|
|
|
|
class Meta:
|
|
|
|
|
|
# 指定表名
|
|
|
|
|
|
table = "chat_role"
|
|
|
|
|
|
table_description = "角色设定表"
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def get_role_list(cls) -> list[str] | None:
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取角色列表
|
|
|
|
|
|
:return:
|
|
|
|
|
|
"""
|
|
|
|
|
|
roles = await cls.all().values_list('role_name', flat=True)
|
|
|
|
|
|
print(roles)
|
|
|
|
|
|
if roles is None:
|
|
|
|
|
|
return None
|
|
|
|
|
|
else:
|
|
|
|
|
|
return list(roles)
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def get_role_setting(cls,role_name: str | None) -> str | None:
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取角色设定
|
|
|
|
|
|
:param role_name: 角色名称
|
|
|
|
|
|
:return: 角色的初始设定和当前设定拼接成的字符串,如果角色不存在则返回 None
|
|
|
|
|
|
"""
|
|
|
|
|
|
role = await cls.filter(role_name=role_name).first()
|
|
|
|
|
|
if role is None:
|
|
|
|
|
|
return None
|
|
|
|
|
|
else:
|
|
|
|
|
|
return f"{role.role_init_setting},{role.role_setting}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def insert_role_setting(cls, role_name: str | None,role_setting: str | None) -> str | None:
|
|
|
|
|
|
"""
|
|
|
|
|
|
插入角色设定
|
|
|
|
|
|
:param role_name:
|
|
|
|
|
|
:param role_setting:
|
|
|
|
|
|
:return:
|
|
|
|
|
|
"""
|
|
|
|
|
|
role = await cls.get_or_none(role_name=role_name)
|
|
|
|
|
|
if role is None:
|
|
|
|
|
|
await cls.create(role_name=role_name, role_setting=role_setting)
|
|
|
|
|
|
return "角色添加成功"
|
|
|
|
|
|
else:
|
|
|
|
|
|
return "角色已存在"
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def update_role_setting(cls, role_name: str | None, new_setting: str | None ) -> str | None:
|
|
|
|
|
|
"""
|
|
|
|
|
|
更新角色设定
|
|
|
|
|
|
:param role_name:
|
|
|
|
|
|
:param new_setting:
|
|
|
|
|
|
:return:
|
|
|
|
|
|
"""
|
|
|
|
|
|
role = await cls.get_or_none(role_name=role_name)
|
|
|
|
|
|
if role is None:
|
|
|
|
|
|
return "角色不存在"
|
|
|
|
|
|
else:
|
|
|
|
|
|
role.role_setting = new_setting
|
|
|
|
|
|
await role.save()
|
|
|
|
|
|
return "角色设定更新成功"
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def delete_role(cls, role_name: str | None) -> str | None:
|
|
|
|
|
|
"""
|
|
|
|
|
|
删除角色
|
|
|
|
|
|
:param role_name:
|
|
|
|
|
|
:return:
|
|
|
|
|
|
"""
|
|
|
|
|
|
role = await cls.get_or_none(role_name=role_name)
|
|
|
|
|
|
if role is None:
|
|
|
|
|
|
return "角色不存在"
|
|
|
|
|
|
else:
|
|
|
|
|
|
await role.delete()
|
|
|
|
|
|
return "角色删除成功"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GroupChatRole(Model):
|
|
|
|
|
|
"""
|
|
|
|
|
|
群ai聊天角色
|
|
|
|
|
|
"""
|
|
|
|
|
|
id = fields.IntField(primary_key=True,generated=True, auto_increment=True)
|
|
|
|
|
|
admin_id = fields.JSONField(description="管理员列表", default=list)
|
|
|
|
|
|
group_id = fields.CharField(max_length = 128,description="群聊ID")
|
|
|
|
|
|
is_on_chat = fields.BooleanField(default=True,description="是否开启ai聊天")
|
|
|
|
|
|
role_name = fields.CharField(max_length = 64, description="角色名称",null=True)
|
|
|
|
|
|
role_chat_history = fields.JSONField(description="角色聊天上下文",null=True)
|
|
|
|
|
|
class Meta:
|
|
|
|
|
|
# 指定表名
|
|
|
|
|
|
table = "group_chat_role"
|
|
|
|
|
|
table_description = "群聊ai对应的角色设定"
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2025-01-22 10:29:44 +00:00
|
|
|
|
async def blind_admin(cls ,admin_list: list | None,group_id: str | None) -> str | None:
|
2025-01-22 03:25:47 +00:00
|
|
|
|
"""
|
|
|
|
|
|
初次绑定ai
|
|
|
|
|
|
:param admin_list:
|
|
|
|
|
|
:param group_id: 群聊ID
|
|
|
|
|
|
:return: 无
|
|
|
|
|
|
"""
|
|
|
|
|
|
# 创建初始化的角色设定
|
|
|
|
|
|
existing_record = await cls.filter(group_id=group_id).first()
|
|
|
|
|
|
if existing_record:
|
2025-01-22 10:29:44 +00:00
|
|
|
|
if admin_list[0] in existing_record.admin_id:
|
|
|
|
|
|
return "您已经是管理员,请勿重复注册"
|
|
|
|
|
|
existing_record.admin_id.append(admin_list[0])
|
2025-01-22 03:25:47 +00:00
|
|
|
|
await existing_record.save()
|
|
|
|
|
|
else:
|
|
|
|
|
|
role_name = '初始模型'
|
|
|
|
|
|
await cls.create(admin_id=admin_list, group_id=group_id, role_name=role_name)
|
|
|
|
|
|
return "注册成功"
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2025-01-22 09:27:48 +00:00
|
|
|
|
async def remove_admin(cls ,admin_list: str | None,group_id: str | None) -> str | None:
|
2025-01-22 03:25:47 +00:00
|
|
|
|
"""
|
|
|
|
|
|
初次绑定ai
|
|
|
|
|
|
:param admin_list:
|
|
|
|
|
|
:param group_id: 群聊ID
|
|
|
|
|
|
:return: 无
|
|
|
|
|
|
"""
|
|
|
|
|
|
# 创建初始化的角色设定
|
|
|
|
|
|
existing_record = await cls.filter(group_id=group_id).first()
|
|
|
|
|
|
if existing_record:
|
2025-01-22 09:27:48 +00:00
|
|
|
|
existing_record.admin_id.remove(admin_list)
|
2025-01-22 03:25:47 +00:00
|
|
|
|
await existing_record.save()
|
|
|
|
|
|
return "已经创建"
|
|
|
|
|
|
else:
|
|
|
|
|
|
await cls.create(admin_id=admin_list, group_id=group_id)
|
|
|
|
|
|
return "绑定成功"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def get_admin_list(cls, group_id: str | None, member_openid : str | None )-> bool | None:
|
|
|
|
|
|
"""
|
|
|
|
|
|
判断是不是管理员
|
|
|
|
|
|
|
|
|
|
|
|
:param group_id: 群聊ID
|
|
|
|
|
|
:param member_openid: 管理员列表
|
|
|
|
|
|
:return: 无
|
|
|
|
|
|
"""
|
|
|
|
|
|
existing_record = await cls.filter(group_id=group_id).first()
|
|
|
|
|
|
if existing_record:
|
|
|
|
|
|
return member_openid in existing_record.admin_id
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def is_on(cls, group_id: str | None)-> bool | None:
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取当前群聊是否有开启ai聊天的权限
|
|
|
|
|
|
|
|
|
|
|
|
:param group_id: 群聊ID
|
|
|
|
|
|
:return: 无
|
|
|
|
|
|
"""
|
|
|
|
|
|
existing_record = await cls.filter(group_id=group_id).first()
|
|
|
|
|
|
if existing_record:
|
|
|
|
|
|
return existing_record.is_on_chat
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def ai_switch(cls, group_id: str | None)-> Self | None:
|
|
|
|
|
|
"""
|
|
|
|
|
|
开关ai
|
|
|
|
|
|
|
|
|
|
|
|
:param group_id: 群聊ID
|
|
|
|
|
|
:return: 无
|
|
|
|
|
|
"""
|
|
|
|
|
|
existing_record = await cls.filter(group_id=group_id).first()
|
|
|
|
|
|
if existing_record.is_on_chat:
|
|
|
|
|
|
existing_record.is_on_chat = False
|
|
|
|
|
|
else:
|
|
|
|
|
|
existing_record.is_on_chat = True
|
|
|
|
|
|
return await existing_record.save()
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def set_chat_role(cls, group_id: str | None,role_name: str | None) -> str | None:
|
|
|
|
|
|
"""
|
|
|
|
|
|
设定对应群的角色
|
|
|
|
|
|
|
|
|
|
|
|
:param group_id: 群聊ID
|
|
|
|
|
|
:param role_name: 角色名称
|
|
|
|
|
|
:return: 无
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
# 创建初始化的角色设定
|
|
|
|
|
|
existing_record = await cls.filter(group_id=group_id).first()
|
|
|
|
|
|
|
|
|
|
|
|
if existing_record.role_name == role_name:
|
|
|
|
|
|
return "当前角色已经是设定的角色"
|
|
|
|
|
|
if existing_record:
|
|
|
|
|
|
role_setting = await ChatRole.get_role_setting(role_name=role_name)
|
|
|
|
|
|
if role_setting:
|
|
|
|
|
|
existing_record.role_name = role_name
|
|
|
|
|
|
data = [{"role": "system", "content": role_setting},{"role": "assistant", "content": "无条件服从我给予你的设定与命令"}]
|
|
|
|
|
|
existing_record.role_chat_history = data
|
|
|
|
|
|
await existing_record.save()
|
|
|
|
|
|
return "设定成功"
|
|
|
|
|
|
else:
|
|
|
|
|
|
return "设定失败,角色设定不存在"
|
|
|
|
|
|
else:
|
|
|
|
|
|
return "切换失败,群聊未绑定角色"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def save_chat_history(cls, group_id: str | None,content: dict[str, str | Any] | None):
|
|
|
|
|
|
"""
|
|
|
|
|
|
保存聊天上下文
|
|
|
|
|
|
|
|
|
|
|
|
:param group_id: 群聊的ID。
|
|
|
|
|
|
:param content: 要保存的内容。
|
|
|
|
|
|
"""
|
|
|
|
|
|
history = await cls.filter(group_id=group_id).first()
|
|
|
|
|
|
if history.role_chat_history is None:
|
|
|
|
|
|
history.role_chat_history = [content]
|
|
|
|
|
|
await history.save()
|
|
|
|
|
|
else:
|
|
|
|
|
|
history.role_chat_history.append(content)
|
|
|
|
|
|
await history.save()
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
async def get_chat_history(cls, group_id: str | None)-> JSONField[Any]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
返回聊天上下文
|
|
|
|
|
|
|
|
|
|
|
|
:param group_id: 群聊的ID。
|
|
|
|
|
|
"""
|
|
|
|
|
|
history = await cls.filter(group_id=group_id).first()
|
|
|
|
|
|
return history.role_chat_history
|