"""add agent_execution_logs table Revision ID: 015_add_agent_execution_logs Revises: 014_add_schedule_goal_fields Create Date: 2026-05-10 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects.mysql import CHAR revision = "015_add_agent_execution_logs" down_revision = "014_add_schedule_goal_fields" branch_labels = None depends_on = None def upgrade() -> None: op.create_table( "agent_execution_logs", sa.Column("id", CHAR(36), primary_key=True, comment="日志ID"), sa.Column("agent_id", sa.String(36), nullable=True, comment="Agent ID"), sa.Column("agent_name", sa.String(200), nullable=True, comment="Agent 名称"), sa.Column("goal_id", sa.String(36), nullable=True, comment="关联 Goal ID"), sa.Column("task_id", sa.String(36), nullable=True, comment="关联 Task ID"), sa.Column("user_id", sa.String(36), nullable=True, comment="用户 ID"), sa.Column("session_id", sa.String(100), nullable=True, comment="会话标识"), sa.Column("input_text", sa.Text, nullable=True, comment="用户输入文本"), sa.Column("output_text", sa.Text, nullable=True, comment="Agent 输出文本"), sa.Column("output_truncated", sa.Boolean, default=False, comment="输出是否被截断"), sa.Column("success", sa.Boolean, default=True, comment="是否成功"), sa.Column("error_message", sa.Text, nullable=True, comment="错误信息"), sa.Column("latency_ms", sa.Integer, nullable=True, comment="总耗时(ms)"), sa.Column("iterations_used", sa.Integer, default=0, comment="ReAct 迭代次数"), sa.Column("tool_calls_made", sa.Integer, default=0, comment="工具调用总次数"), sa.Column("tool_chain", sa.JSON, nullable=True, comment="工具调用链"), sa.Column("llm_calls", sa.JSON, nullable=True, comment="LLM调用明细"), sa.Column("steps", sa.JSON, nullable=True, comment="执行步骤详情"), sa.Column("model", sa.String(100), nullable=True, comment="使用的模型"), sa.Column("provider", sa.String(50), nullable=True, comment="模型提供商"), sa.Column("user_rating", sa.Integer, nullable=True, comment="用户评分(1-5)"), sa.Column("user_feedback", sa.Text, nullable=True, comment="用户反馈文本"), sa.Column("knowledge_extracted", sa.Boolean, default=False, comment="是否已提取知识"), sa.Column("created_at", sa.DateTime, comment="创建时间"), ) op.create_index("ix_agent_exec_log_agent_id", "agent_execution_logs", ["agent_id"]) op.create_index("ix_agent_exec_log_goal_id", "agent_execution_logs", ["goal_id"]) op.create_index("ix_agent_exec_log_task_id", "agent_execution_logs", ["task_id"]) op.create_index("ix_agent_exec_log_user_id", "agent_execution_logs", ["user_id"]) op.create_index("ix_agent_exec_log_created_at", "agent_execution_logs", ["created_at"]) def downgrade() -> None: op.drop_index("ix_agent_exec_log_created_at", table_name="agent_execution_logs") op.drop_index("ix_agent_exec_log_user_id", table_name="agent_execution_logs") op.drop_index("ix_agent_exec_log_task_id", table_name="agent_execution_logs") op.drop_index("ix_agent_exec_log_goal_id", table_name="agent_execution_logs") op.drop_index("ix_agent_exec_log_agent_id", table_name="agent_execution_logs") op.drop_table("agent_execution_logs")