优化model

This commit is contained in:
XIE7654
2025-07-17 16:17:57 +08:00
parent 9b30115444
commit 6ed606f7a4
11 changed files with 316 additions and 193 deletions

View File

@@ -2,11 +2,11 @@ from sqlalchemy import (
Column, Integer, String, Text, DateTime, Boolean, Float, ForeignKey
)
from sqlalchemy.orm import relationship, declarative_base
from db.session import Base
from models.base import CoreModel
from models.user import DjangoUser # 确保导入 DjangoUser
Base = declarative_base()
# 状态选择类(示例)
class CommonStatus:
DISABLED = 0
@@ -37,16 +37,6 @@ class MessageType:
return [('text', '文本'), ('image', '图片')]
# 基础模型类
class CoreModel(Base):
__abstract__ = True
id = Column(Integer, primary_key=True, autoincrement=True)
create_time = Column(DateTime)
update_time = Column(DateTime)
is_deleted = Column(Boolean, default=False)
# AI API 密钥表
class AIApiKey(CoreModel):
__tablename__ = 'ai_api_key'
@@ -83,161 +73,160 @@ class AIModel(CoreModel):
# AI 工具表
# class Tool(CoreModel):
# __tablename__ = 'ai_tool'
class Tool(CoreModel):
__tablename__ = 'ai_tool'
# name = Column(String(128), nullable=False)
# description = Column(String(256), nullable=True)
# status = Column(Integer, default=0)
name = Column(String(128), nullable=False)
description = Column(String(256), nullable=True)
status = Column(Integer, default=0)
# def __str__(self):
# return self.name
def __str__(self):
return self.name
# AI 知识库表
# class Knowledge(CoreModel):
# __tablename__ = 'ai_knowledge'
class Knowledge(CoreModel):
__tablename__ = 'ai_knowledge'
# name = Column(String(255), nullable=False)
# description = Column(Text, nullable=True)
# embedding_model_id = Column(Integer, ForeignKey('ai_model.id'), nullable=False)
# embedding_model = Column(String(32), nullable=False)
# top_k = Column(Integer, default=0)
# similarity_threshold = Column(Float, nullable=False)
# status = Column(Integer, default=CommonStatus.DISABLED)
name = Column(String(255), nullable=False)
description = Column(Text, nullable=True)
embedding_model_id = Column(Integer, ForeignKey('ai_model.id'), nullable=False)
embedding_model = Column(String(32), nullable=False)
top_k = Column(Integer, default=0)
similarity_threshold = Column(Float, nullable=False)
status = Column(Integer, default=CommonStatus.DISABLED)
# embedding_model_rel = relationship('AIModel', backref='knowledges')
# documents = relationship('KnowledgeDocument', backref='knowledge', cascade='all, delete-orphan')
# segments = relationship('KnowledgeSegment', backref='knowledge', cascade='all, delete-orphan')
# roles = relationship('ChatRole', secondary='ai_chat_role_knowledge', backref='knowledges')
embedding_model_rel = relationship('AIModel', backref='knowledges')
documents = relationship('KnowledgeDocument', backref='knowledge', cascade='all, delete-orphan')
segments = relationship('KnowledgeSegment', backref='knowledge', cascade='all, delete-orphan')
roles = relationship('ChatRole', secondary='ai_chat_role_knowledge', backref='knowledges')
# def __str__(self):
# return self.name
def __str__(self):
return self.name
# AI 知识库文档表
# class KnowledgeDocument(CoreModel):
# __tablename__ = 'ai_knowledge_document'
class KnowledgeDocument(CoreModel):
__tablename__ = 'ai_knowledge_document'
# knowledge_id = Column(Integer, ForeignKey('ai_knowledge.id'), nullable=False)
# name = Column(String(255), nullable=False)
# url = Column(String(1024), nullable=False)
# content = Column(Text, nullable=False)
# content_length = Column(Integer, nullable=False)
# tokens = Column(Integer, nullable=False)
# segment_max_tokens = Column(Integer, nullable=False)
# retrieval_count = Column(Integer, default=0)
# status = Column(Integer, default=CommonStatus.DISABLED)
knowledge_id = Column(Integer, ForeignKey('ai_knowledge.id'), nullable=False)
name = Column(String(255), nullable=False)
url = Column(String(1024), nullable=False)
content = Column(Text, nullable=False)
content_length = Column(Integer, nullable=False)
tokens = Column(Integer, nullable=False)
segment_max_tokens = Column(Integer, nullable=False)
retrieval_count = Column(Integer, default=0)
status = Column(Integer, default=CommonStatus.DISABLED)
# segments = relationship('KnowledgeSegment', backref='document', cascade='all, delete-orphan')
segments = relationship('KnowledgeSegment', backref='document', cascade='all, delete-orphan')
# def __str__(self):
# return self.name
def __str__(self):
return self.name
# AI 知识库分段表
# class KnowledgeSegment(CoreModel):
# __tablename__ = 'ai_knowledge_segment'
class KnowledgeSegment(CoreModel):
__tablename__ = 'ai_knowledge_segment'
# knowledge_id = Column(Integer, ForeignKey('ai_knowledge.id'), nullable=False)
# document_id = Column(Integer, ForeignKey('ai_knowledge_document.id'), nullable=False)
# content = Column(Text, nullable=False)
# content_length = Column(Integer, nullable=False)
# tokens = Column(Integer, nullable=False)
# vector_id = Column(String(100), nullable=True)
# retrieval_count = Column(Integer, default=0)
# status = Column(Integer, default=CommonStatus.DISABLED)
knowledge_id = Column(Integer, ForeignKey('ai_knowledge.id'), nullable=False)
document_id = Column(Integer, ForeignKey('ai_knowledge_document.id'), nullable=False)
content = Column(Text, nullable=False)
content_length = Column(Integer, nullable=False)
tokens = Column(Integer, nullable=False)
vector_id = Column(String(100), nullable=True)
retrieval_count = Column(Integer, default=0)
status = Column(Integer, default=CommonStatus.DISABLED)
# def __str__(self):
# return f"Segment {self.id}"
def __str__(self):
return f"Segment {self.id}"
# AI 聊天角色表
# class ChatRole(CoreModel):
# __tablename__ = 'ai_chat_role'
class ChatRole(CoreModel):
__tablename__ = 'ai_chat_role'
# name = Column(String(128), nullable=False)
# avatar = Column(String(256), nullable=False)
# description = Column(String(256), nullable=True)
# status = Column(Integer, default=CommonStatus.DISABLED)
# sort = Column(Integer, default=0)
# public_status = Column(Boolean, default=False)
# category = Column(String(32), nullable=True)
# model_id = Column(Integer, ForeignKey('ai_model.id'), nullable=False)
# system_message = Column(String(1024), nullable=True)
# user_id = Column(
# Integer,
# ForeignKey('system_users.id'), # 假设DjangoUser表名是system_users
# nullable=True # 允许为空(如匿名角色)
# )
# user = relationship(DjangoUser, backref='chat_roles') # 正确DjangoUser 已定义并导入
name = Column(String(128), nullable=False)
avatar = Column(String(256), nullable=False)
description = Column(String(256), nullable=True)
status = Column(Integer, default=CommonStatus.DISABLED)
sort = Column(Integer, default=0)
public_status = Column(Boolean, default=False)
category = Column(String(32), nullable=True)
model_id = Column(Integer, ForeignKey('ai_model.id'), nullable=False)
system_message = Column(String(1024), nullable=True)
user_id = Column(
Integer,
ForeignKey('system_users.id'), # 假设DjangoUser表名是system_users
nullable=True # 允许为空(如匿名角色)
)
user = relationship(DjangoUser, backref='chat_roles') # 正确DjangoUser 已定义并导入
# model = relationship('AIModel', backref='chat_roles')
# tools = relationship('Tool', secondary='ai_chat_role_tool', backref='roles')
# # conversations = relationship('ChatConversation', backref='role', cascade='all, delete-orphan')
# # messages = relationship('ChatMessage', backref='role', cascade='all, delete-orphan')
# def __str__(self):
# return self.name
model = relationship('AIModel', backref='chat_roles')
tools = relationship('Tool', secondary='ai_chat_role_tool', backref='roles')
# conversations = relationship('ChatConversation', backref='role', cascade='all, delete-orphan')
# messages = relationship('ChatMessage', backref='role', cascade='all, delete-orphan')
def __str__(self):
return self.name
# AI 聊天对话表
# class ChatConversation(CoreModel):
# __tablename__ = 'ai_chat_conversation'
class ChatConversation(CoreModel):
__tablename__ = 'ai_chat_conversation'
# title = Column(String(256), nullable=False)
# pinned = Column(Boolean, default=False)
# pinned_time = Column(DateTime, nullable=True)
# # user_id = Column(Integer, ForeignKey('system_users.id'), nullable=True)
# role_id = Column(Integer, ForeignKey('ai_chat_role.id'), nullable=True)
# model_id = Column(Integer, ForeignKey('ai_model.id'), nullable=False)
# model = Column(String(32), nullable=False)
# system_message = Column(String(1024), nullable=True)
# temperature = Column(Float, nullable=False)
# max_tokens = Column(Integer, nullable=False)
# max_contexts = Column(Integer, nullable=False)
# # user = relationship(DjangoUser, backref='conversations') # 正确DjangoUser 已定义并导入
title = Column(String(256), nullable=False)
pinned = Column(Boolean, default=False)
pinned_time = Column(DateTime, nullable=True)
user_id = Column(Integer, ForeignKey('system_users.id'), nullable=True)
role_id = Column(Integer, ForeignKey('ai_chat_role.id'), nullable=True)
model_id = Column(Integer, ForeignKey('ai_model.id'), nullable=False)
model = Column(String(32), nullable=False)
system_message = Column(String(1024), nullable=True)
temperature = Column(Float, nullable=False)
max_tokens = Column(Integer, nullable=False)
max_contexts = Column(Integer, nullable=False)
user = relationship(DjangoUser, backref='conversations') # 正确DjangoUser 已定义并导入
# model_rel = relationship('AIModel', backref='conversations')
# messages = relationship('ChatMessage', backref='conversation', cascade='all, delete-orphan')
model_rel = relationship('AIModel', backref='conversations')
messages = relationship('ChatMessage', backref='conversation', cascade='all, delete-orphan')
# def __str__(self):
# return self.title
def __str__(self):
return self.title
# AI 聊天消息表
# class ChatMessage(CoreModel):
# __tablename__ = 'ai_chat_message'
class ChatMessage(CoreModel):
__tablename__ = 'ai_chat_message'
# conversation_id = Column(Integer, nullable=False)
# # user_id = Column(Integer, ForeignKey('system_users.id'), nullable=True)
# role_id = Column(Integer, ForeignKey('ai_chat_role.id'), nullable=True)
# model = Column(String(32), nullable=False)
# model_id = Column(Integer, ForeignKey('ai_model.id'), nullable=False)
# type = Column(String(16), nullable=False)
# reply_id = Column(Integer, nullable=True)
# content = Column(String(2048), nullable=False)
# use_context = Column(Boolean, default=False)
# segment_ids = Column(String(2048), nullable=True)
conversation_id = Column(Integer, ForeignKey('ai_chat_conversation.id'), nullable=False)
user_id = Column(Integer, ForeignKey('system_users.id'), nullable=True)
role_id = Column(Integer, ForeignKey('ai_chat_role.id'), nullable=True)
model = Column(String(32), nullable=False)
model_id = Column(Integer, ForeignKey('ai_model.id'), nullable=False)
type = Column(String(16), nullable=False)
reply_id = Column(Integer, nullable=True)
content = Column(String(2048), nullable=False)
use_context = Column(Boolean, default=False)
segment_ids = Column(String(2048), nullable=True)
# # user = relationship(DjangoUser, backref='messages') # 正确DjangoUser 已定义并导入
# model_rel = relationship('AIModel', backref='messages')
user = relationship(DjangoUser, backref='messages') # 正确DjangoUser 已定义并导入
model_rel = relationship('AIModel', backref='messages')
# def __str__(self):
# return self.content[:30]
def __str__(self):
return self.content[:30]
# # 聊天角色与知识库的关联表
# class ChatRoleKnowledge(Base):
# __tablename__ = 'ai_chat_role_knowledge'
# 聊天角色与知识库的关联表
class ChatRoleKnowledge(Base):
__tablename__ = 'ai_chat_role_knowledge'
# chat_role_id = Column(Integer, ForeignKey('ai_chat_role.id'), primary_key=True)
# knowledge_id = Column(Integer, ForeignKey('ai_knowledge.id'), primary_key=True)
chat_role_id = Column(Integer, ForeignKey('ai_chat_role.id'), primary_key=True)
knowledge_id = Column(Integer, ForeignKey('ai_knowledge.id'), primary_key=True)
# # 聊天角色与工具的关联表
# class ChatRoleTool(Base):
# __tablename__ = 'ai_chat_role_tool'
# 聊天角色与工具的关联表
class ChatRoleTool(Base):
__tablename__ = 'ai_chat_role_tool'
# chat_role_id = Column(Integer, ForeignKey('ai_chat_role.id'), primary_key=True)
# tool_id = Column(Integer, ForeignKey('ai_tool.id'), primary_key=True)
chat_role_id = Column(Integer, ForeignKey('ai_chat_role.id'), primary_key=True)
tool_id = Column(Integer, ForeignKey('ai_tool.id'), primary_key=True)

13
chat/models/base.py Normal file
View File

@@ -0,0 +1,13 @@
from db.session import Base
from sqlalchemy import (
Column, Integer, String, Text, DateTime, Boolean, Float, ForeignKey
)
# 基础模型类
class CoreModel(Base):
__abstract__ = True
id = Column(Integer, primary_key=True, autoincrement=True)
create_time = Column(DateTime)
update_time = Column(DateTime)
is_deleted = Column(Boolean, default=False)

View File

@@ -1,7 +1,7 @@
from sqlalchemy import Column, Integer, String, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from db.session import Base
class AuthToken(Base):
__tablename__ = 'authtoken_token'
@@ -12,6 +12,7 @@ class AuthToken(Base):
class DjangoUser(Base):
__tablename__ = 'system_users'
id = Column(Integer, primary_key=True)
username = Column(String(150), nullable=False)
email = Column(String(254))