feat: Add base project structure with API and web components
This commit is contained in:
115
api/app/models/app_model.py
Normal file
115
api/app/models/app_model.py
Normal file
@@ -0,0 +1,115 @@
|
||||
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})>"
|
||||
Reference in New Issue
Block a user