243 lines
8.4 KiB
Python
243 lines
8.4 KiB
Python
from sqlalchemy import (
|
||
Column, Integer, String, Text, DateTime, Boolean, Float, ForeignKey
|
||
)
|
||
from sqlalchemy.orm import relationship, declarative_base
|
||
from models.user import DjangoUser # 确保导入 DjangoUser
|
||
|
||
Base = declarative_base()
|
||
|
||
|
||
# 状态选择类(示例)
|
||
class CommonStatus:
|
||
DISABLED = 0
|
||
ENABLED = 1
|
||
|
||
@staticmethod
|
||
def choices():
|
||
return [(0, '禁用'), (1, '启用')]
|
||
|
||
|
||
# 平台选择类(示例)
|
||
class PlatformChoices:
|
||
OPENAI = 'openai'
|
||
ALIMNS = 'alimns'
|
||
|
||
@staticmethod
|
||
def choices():
|
||
return [('openai', 'OpenAI'), ('alimns', '阿里云MNS')]
|
||
|
||
|
||
# 消息类型选择类(示例)
|
||
class MessageType:
|
||
TEXT = 'text'
|
||
IMAGE = 'image'
|
||
|
||
@staticmethod
|
||
def choices():
|
||
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'
|
||
|
||
name = Column(String(255), nullable=False)
|
||
platform = Column(String(100), nullable=False)
|
||
api_key = Column(String(255), nullable=False)
|
||
url = Column(String(255), nullable=True)
|
||
status = Column(Integer, default=CommonStatus.DISABLED)
|
||
|
||
def __str__(self):
|
||
return self.name
|
||
|
||
|
||
# AI 模型表
|
||
class AIModel(CoreModel):
|
||
__tablename__ = 'ai_model'
|
||
|
||
name = Column(String(64), nullable=False)
|
||
sort = Column(Integer, default=0)
|
||
status = Column(Integer, default=CommonStatus.DISABLED)
|
||
key_id = Column(Integer, ForeignKey('ai_api_key.id'), nullable=False)
|
||
model_type = Column(String(32), nullable=True)
|
||
platform = Column(String(32), nullable=False)
|
||
model = Column(String(64), nullable=False)
|
||
temperature = Column(Float, nullable=True)
|
||
max_tokens = Column(Integer, nullable=True)
|
||
max_contexts = Column(Integer, nullable=True)
|
||
|
||
key = relationship('AIApiKey', backref='models')
|
||
|
||
def __str__(self):
|
||
return self.name
|
||
|
||
|
||
# AI 工具表
|
||
# class Tool(CoreModel):
|
||
# __tablename__ = 'ai_tool'
|
||
|
||
# name = Column(String(128), nullable=False)
|
||
# description = Column(String(256), nullable=True)
|
||
# status = Column(Integer, default=0)
|
||
|
||
# def __str__(self):
|
||
# return self.name
|
||
|
||
|
||
# AI 知识库表
|
||
# 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)
|
||
|
||
# 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
|
||
|
||
|
||
# AI 知识库文档表
|
||
# 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)
|
||
|
||
# segments = relationship('KnowledgeSegment', backref='document', cascade='all, delete-orphan')
|
||
|
||
# def __str__(self):
|
||
# return self.name
|
||
|
||
|
||
# AI 知识库分段表
|
||
# 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)
|
||
|
||
# def __str__(self):
|
||
# return f"Segment {self.id}"
|
||
|
||
|
||
# AI 聊天角色表
|
||
# 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 已定义并导入
|
||
|
||
# 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'
|
||
|
||
# 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')
|
||
|
||
# def __str__(self):
|
||
# return self.title
|
||
|
||
|
||
# AI 聊天消息表
|
||
# 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)
|
||
|
||
# # user = relationship(DjangoUser, backref='messages') # 正确:DjangoUser 已定义并导入
|
||
# model_rel = relationship('AIModel', backref='messages')
|
||
|
||
# def __str__(self):
|
||
# return self.content[:30]
|
||
|
||
|
||
# # 聊天角色与知识库的关联表
|
||
# 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)
|
||
|
||
|
||
# # 聊天角色与工具的关联表
|
||
# 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) |