新加ai 对话页面

This commit is contained in:
XIE7654
2025-07-17 10:59:48 +08:00
parent 682e3805eb
commit 6505e69d4f
14 changed files with 548 additions and 4 deletions

243
chat/models/ai.py Normal file
View File

@@ -0,0 +1,243 @@
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)

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy import Column, Integer, String, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
@@ -9,8 +9,15 @@ class AuthToken(Base):
user_id = Column(Integer, nullable=False)
created = Column(DateTime)
class DjangoUser(Base):
__tablename__ = 'system_users'
id = Column(Integer, primary_key=True)
username = Column(String(150), nullable=False)
email = Column(String(254))
email = Column(String(254))
password = Column(String(128))
is_active = Column(Boolean, default=True)
is_staff = Column(Boolean, default=False)
is_superuser = Column(Boolean, default=False)
last_login = Column(DateTime)
date_joined = Column(DateTime)