""" AI 工作流模型 """ from sqlalchemy import Column, String, Text, Integer, Boolean, DateTime, JSON, Index from app.base_model import BaseModel class AIWorkflow(BaseModel): """ AI 工作流定义 独立于 AIApp 的工作流定义,可以被多个应用引用 """ __tablename__ = "ai_workflow" application_id = Column(String(21), nullable=True, index=True, comment="所属应用ID(逻辑外键关联core_application)") is_global = Column(Boolean, default=False, comment="是否在子应用中可见") name = Column(String(100), nullable=False, comment="工作流名称") code = Column(String(100), unique=True, nullable=False, comment="工作流编码") workflow_type = Column(String(30), default="general", comment="工作流类型: general/application/form/report/data_process/automation") description = Column(Text, default="", comment="描述") status = Column(String(20), default="draft", comment="状态: draft/published/disabled") version = Column(Integer, default=1, comment="当前草稿版本号") published_version = Column(Integer, nullable=True, comment="已发布的版本号") published_at = Column(DateTime, nullable=True, comment="最后发布时间") published_definition = Column(JSON, default=dict, comment="已发布版本的工作流定义") definition = Column(JSON, default=dict, comment="工作流定义(草稿)") input_variables = Column(JSON, default=list, comment="输入变量定义") output_variables = Column(JSON, default=list, comment="输出变量定义") run_count = Column(Integer, default=0, comment="运行次数") success_count = Column(Integer, default=0, comment="成功次数") class AIWorkflowVersion(BaseModel): """ AI 工作流版本历史 每次发布时创建一条版本记录 """ __tablename__ = "ai_workflow_version" workflow_id = Column(String(21), nullable=False, index=True, comment="工作流ID(逻辑外键关联ai_workflow)") version = Column(Integer, nullable=False, comment="版本号") definition = Column(JSON, default=dict, comment="该版本的工作流定义") description = Column(Text, default="", comment="版本说明") published_by_id = Column(String(21), nullable=True, comment="发布人ID(逻辑外键关联core_user)") published_at = Column(DateTime, nullable=True, comment="发布时间") run_count = Column(Integer, default=0, comment="运行次数") success_count = Column(Integer, default=0, comment="成功次数") class AIWorkflowRun(BaseModel): """ AI 工作流运行记录 """ __tablename__ = "ai_workflow_run" workflow_id = Column(String(21), nullable=False, index=True, comment="工作流ID(逻辑外键关联ai_workflow)") app_id = Column(String(21), nullable=True, index=True, comment="关联应用ID(逻辑外键关联ai_app)") conversation_id = Column(String(21), nullable=True, comment="关联对话ID(逻辑外键关联ai_conversation)") user_id = Column(String(21), nullable=True, index=True, comment="执行用户ID(逻辑外键关联core_user)") status = Column(String(20), default="pending", comment="状态: pending/running/waiting/completed/failed/stopped") trigger_type = Column(String(30), default="api", comment="触发来源: editor_draft/editor_published/agent/api/form_button") use_draft = Column(Boolean, default=False, comment="是否使用草稿定义执行") workflow_version = Column(Integer, nullable=True, comment="执行时发布版本号,草稿运行为空") definition_snapshot = Column(JSON, default=dict, comment="运行开始时的工作流定义快照") inputs = Column(JSON, default=dict, comment="输入数据") outputs = Column(JSON, default=dict, comment="输出数据") execution_log = Column(JSON, default=list, comment="执行日志") current_node_id = Column(String(100), default="", comment="当前节点 ID") waiting_config = Column(JSON, default=dict, comment="等待用户输入的配置") error_message = Column(Text, default="", comment="错误信息") total_tokens = Column(Integer, default=0, comment="总 Token 数") total_steps = Column(Integer, default=0, comment="总步骤数") elapsed_time = Column(Integer, default=0, comment="总耗时(毫秒)") started_at = Column(DateTime, nullable=True, comment="开始时间") completed_at = Column(DateTime, nullable=True, comment="完成时间") __table_args__ = ( Index("ix_ai_workflow_run_workflow_status", "workflow_id", "status"), Index("ix_ai_workflow_run_user_status", "user_id", "status"), )