Files
MemoryBear/api/app/models/app_model.py

115 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import datetime
from enum import StrEnum
from re import LOCALE
import uuid
from sqlalchemy import Column, String, Boolean, DateTime, ForeignKey
from sqlalchemy.dialects.postgresql import UUID, JSON
from sqlalchemy.orm import relationship
from app.db import Base
class IconType(StrEnum):
"""图标类型枚举"""
LOCALE = "locale"
REMOTE = "remote"
# 可见性private | workspace | public
class AppVisibility(StrEnum):
"""可见性枚举"""
PRIVATE = "private"
WORKSPACE = "workspace"
PUBLIC = "public"
# 应用类型agent | workflow | multi_agent
class AppType(StrEnum):
"""应用类型枚举"""
AGENT = "agent"
WORKFLOW = "workflow"
MULTI_AGENT = "multi_agent"
# 应用状态draft | active | archived
class AppStatus(StrEnum):
"""应用状态枚举"""
DRAFT = "draft"
ACTIVE = "active"
ARCHIVED = "archived"
class App(Base):
__tablename__ = "apps"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
workspace_id = Column(UUID(as_uuid=True), nullable=False, comment="workspaces.id")
created_by = Column(UUID(as_uuid=True), nullable=False, comment="users.id")
name = Column(String, index=True, nullable=False)
description = Column(String, nullable=True)
icon = Column(String, nullable=True)
icon_type = Column(String, nullable=True)
# 应用类型agent | workflow 等
type = Column(String, index=True, nullable=False)
# 可见性private | workspace | public
visibility = Column(String, default="workspace")
# 状态draft | active | archived
status = Column(String, default="draft")
# 标签或扩展元数据
tags = Column(JSON, default=list)
# 当前已发布版本指针(发布后指向快照,不受编辑影响)
current_release_id = Column(
UUID(as_uuid=True),
ForeignKey("app_releases.id", use_alter=True, name="fk_apps_current_release_id"),
nullable=True,
index=True,
)
is_active = Column(Boolean, default=True, nullable=False)
created_at = Column(DateTime, default=datetime.datetime.now)
updated_at = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now)
# 一对一Agent 配置(仅当 type=agent 时有效)
agent_config = relationship(
"AgentConfig",
back_populates="app",
uselist=False,
cascade="all, delete-orphan",
)
# 一对一:多 Agent 配置(仅当 type=multi_agent 时有效)
multi_agent_config = relationship(
"MultiAgentConfig",
back_populates="app",
uselist=False,
cascade="all, delete-orphan",
)
# 发布版本关联
current_release = relationship("AppRelease", foreign_keys=[current_release_id])
# 指定外键以避免与 current_release_id 造成歧义
releases = relationship(
"AppRelease",
back_populates="app",
cascade="all, delete-orphan",
foreign_keys="AppRelease.app_id",
)
# 会话关联
conversations = relationship(
"Conversation",
back_populates="app",
cascade="all, delete-orphan"
)
# 与 EndUser 的反向关系
end_users = relationship(
"EndUser",
back_populates="app",
cascade="all, delete-orphan",
)
def __repr__(self):
return f"<App(id={self.id}, name={self.name}, type={self.type})>"