182 lines
8.5 KiB
Python
182 lines
8.5 KiB
Python
from sqlalchemy import Column, Integer, String, Float, Text, Boolean, DateTime, ForeignKey, JSON
|
||
from sqlalchemy.orm import relationship
|
||
from sqlalchemy.sql import func
|
||
|
||
from app.models.database import Base
|
||
|
||
|
||
class Algorithm(Base):
|
||
"""算法模型"""
|
||
__tablename__ = "algorithms"
|
||
|
||
id = Column(String, primary_key=True, index=True)
|
||
name = Column(String, nullable=False, index=True)
|
||
description = Column(Text, nullable=False)
|
||
type = Column(String, nullable=False, index=True) # computer_vision, nlp, ml, edge_computing, medical, autonomous_driving等
|
||
tech_category = Column(String, nullable=False, default="computer_vision") # 技术分类:计算机视觉、视频处理、自然语言处理等
|
||
output_type = Column(String, nullable=False, default="image") # 输出类型:图片、视频、文本、JSON等
|
||
status = Column(String, default="active", index=True)
|
||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||
|
||
# 关系
|
||
versions = relationship("AlgorithmVersion", back_populates="algorithm", cascade="all, delete-orphan")
|
||
calls = relationship("AlgorithmCall", back_populates="algorithm")
|
||
|
||
|
||
class AlgorithmVersion(Base):
|
||
"""算法版本模型"""
|
||
__tablename__ = "algorithm_versions"
|
||
|
||
id = Column(String, primary_key=True, index=True)
|
||
algorithm_id = Column(String, ForeignKey("algorithms.id"), nullable=False, index=True)
|
||
version = Column(String, nullable=False)
|
||
url = Column(String, nullable=False) # 算法API地址
|
||
params = Column(JSON, default=dict) # 算法参数配置
|
||
input_schema = Column(JSON, default=dict) # 输入数据格式
|
||
output_schema = Column(JSON, default=dict) # 输出数据格式
|
||
code = Column(Text, default='') # Python算法代码
|
||
model_name = Column(String, default='') # API训练后的模型名字
|
||
model_file = Column(String, default='') # 模型文件路径
|
||
api_doc = Column(Text, default='') # 模型的API用法文档
|
||
is_default = Column(Boolean, default=False) # 是否为默认版本
|
||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||
|
||
# 关系
|
||
algorithm = relationship("Algorithm", back_populates="versions")
|
||
calls = relationship("AlgorithmCall", back_populates="version")
|
||
|
||
|
||
class Role(Base):
|
||
"""角色模型"""
|
||
__tablename__ = "roles"
|
||
|
||
id = Column(String, primary_key=True, index=True)
|
||
name = Column(String, unique=True, nullable=False, index=True) # admin, user
|
||
description = Column(Text, default="")
|
||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||
|
||
# 关系
|
||
users = relationship("User", back_populates="role")
|
||
|
||
|
||
class User(Base):
|
||
"""用户模型"""
|
||
__tablename__ = "users"
|
||
|
||
id = Column(String, primary_key=True, index=True)
|
||
username = Column(String, unique=True, nullable=False, index=True)
|
||
email = Column(String, unique=True, nullable=False, index=True)
|
||
password_hash = Column(String, nullable=False)
|
||
role_id = Column(String, ForeignKey("roles.id"), nullable=False, index=True)
|
||
status = Column(String, default="active", index=True)
|
||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||
|
||
# 关系
|
||
calls = relationship("AlgorithmCall", back_populates="user")
|
||
role = relationship("Role", back_populates="users")
|
||
|
||
|
||
|
||
|
||
|
||
class AlgorithmCall(Base):
|
||
"""算法调用记录模型"""
|
||
__tablename__ = "algorithm_calls"
|
||
|
||
id = Column(String, primary_key=True, index=True)
|
||
user_id = Column(String, ForeignKey("users.id"), nullable=False, index=True)
|
||
algorithm_id = Column(String, ForeignKey("algorithms.id"), nullable=False, index=True)
|
||
version_id = Column(String, ForeignKey("algorithm_versions.id"), nullable=False, index=True)
|
||
input_data = Column(JSON, nullable=False) # 输入数据
|
||
params = Column(JSON, default=dict) # 调用参数
|
||
output_data = Column(JSON, default=dict) # 输出数据
|
||
status = Column(String, default="pending", index=True) # pending, running, success, failed
|
||
response_time = Column(Float, nullable=True) # 响应时间(秒)
|
||
error_message = Column(Text, nullable=True) # 错误信息
|
||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||
|
||
# 关系
|
||
user = relationship("User", back_populates="calls")
|
||
algorithm = relationship("Algorithm", back_populates="calls")
|
||
version = relationship("AlgorithmVersion", back_populates="calls")
|
||
|
||
|
||
class GiteaConfig(Base):
|
||
"""Gitea配置模型"""
|
||
__tablename__ = "gitea_configs"
|
||
|
||
id = Column(String, primary_key=True, index=True)
|
||
server_url = Column(String, nullable=False) # Gitea服务器URL
|
||
access_token = Column(String, nullable=False) # 访问令牌
|
||
default_owner = Column(String, nullable=False) # 默认组织/用户
|
||
repo_prefix = Column(String, default="") # 仓库前缀
|
||
status = Column(String, default="active") # 状态
|
||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||
|
||
|
||
class AlgorithmRepository(Base):
|
||
"""算法仓库模型"""
|
||
__tablename__ = "algorithm_repositories"
|
||
|
||
id = Column(String, primary_key=True, index=True)
|
||
algorithm_id = Column(String, ForeignKey("algorithms.id"), nullable=True, index=True) # 关联的算法ID
|
||
name = Column(String, nullable=False, index=True) # 仓库名称
|
||
description = Column(Text, default="") # 仓库描述
|
||
type = Column(String, default="code") # 仓库类型:code, model, hybrid
|
||
repo_url = Column(String, nullable=False) # Git仓库URL
|
||
branch = Column(String, default="main") # 分支名称
|
||
local_path = Column(String, default="") # 本地存储路径
|
||
status = Column(String, default="active", index=True) # 状态
|
||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||
|
||
# 关系
|
||
algorithm = relationship("Algorithm", back_populates="repository", uselist=False)
|
||
|
||
|
||
class AlgorithmService(Base):
|
||
"""算法服务模型"""
|
||
__tablename__ = "algorithm_services"
|
||
|
||
id = Column(String, primary_key=True, index=True)
|
||
service_id = Column(String, unique=True, nullable=False, index=True) # 服务ID
|
||
name = Column(String, nullable=False, index=True) # 服务名称
|
||
algorithm_name = Column(String, nullable=False) # 算法名称
|
||
version = Column(String, nullable=False) # 版本
|
||
tech_category = Column(String, nullable=False, default="computer_vision") # 技术分类:计算机视觉、视频处理、自然语言处理等
|
||
output_type = Column(String, nullable=False, default="image") # 输出类型:图片、视频、文本、JSON等
|
||
host = Column(String, nullable=False) # 主机地址
|
||
port = Column(Integer, nullable=False) # 端口
|
||
api_url = Column(String, nullable=False) # API地址
|
||
status = Column(String, default="stopped", index=True) # 状态:running, stopped, error, restarting
|
||
config = Column(JSON, default=dict) # 服务配置
|
||
start_time = Column(DateTime(timezone=True), nullable=True) # 启动时间
|
||
last_heartbeat = Column(DateTime(timezone=True), nullable=True) # 最后心跳时间
|
||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||
|
||
|
||
# 添加Algorithm模型的repository关系
|
||
Algorithm.repository = relationship("AlgorithmRepository", back_populates="algorithm", uselist=False)
|
||
|
||
|
||
class ServiceConfig(Base):
|
||
"""服务配置模型"""
|
||
__tablename__ = "service_configs"
|
||
|
||
id = Column(String, primary_key=True, index=True)
|
||
config_key = Column(String, nullable=False, unique=True, index=True) # 配置键
|
||
config_value = Column(JSON, nullable=False) # 配置值(JSON格式)
|
||
config_type = Column(String, nullable=False) # 配置类型:system, service, user
|
||
service_id = Column(String, nullable=True, index=True) # 服务ID(可为空,系统配置)
|
||
description = Column(Text, default="") # 配置描述
|
||
status = Column(String, default="active") # 状态
|
||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|