Main Agent 数字员工工厂基础设施: - 新增 Goal 和 Task SQLAlchemy 数据模型 - Agent 模型新增 agent_type / input_schema / output_schema - Execution 模型新增 goal_id 关联 - 新增 Goal/Task CRUD 服务层(含依赖检查、任务树、进度计算) - 新增 /api/v1/goals (9端点) + /api/v1/tasks (8端点) - 数据库迁移 013_add_goals_tasks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
82 lines
3.5 KiB
Python
82 lines
3.5 KiB
Python
"""add goals and tasks tables, agent_type, goal_id
|
|
|
|
Revision ID: 013_add_goals_tasks
|
|
Revises: 012_schedule_fk_set_null
|
|
Create Date: 2026-05-07
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
from sqlalchemy.dialects.mysql import CHAR
|
|
|
|
revision = "013_add_goals_tasks"
|
|
down_revision = "012_schedule_fk_set_null"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# ── goals 表 ──
|
|
op.create_table(
|
|
"goals",
|
|
sa.Column("id", CHAR(36), primary_key=True),
|
|
sa.Column("title", sa.String(500), nullable=False),
|
|
sa.Column("description", sa.Text),
|
|
sa.Column("status", sa.String(20), default="active"),
|
|
sa.Column("priority", sa.Integer, default=5),
|
|
sa.Column("progress", sa.Float, default=0.0),
|
|
sa.Column("plan", sa.JSON),
|
|
sa.Column("autonomy_config", sa.JSON),
|
|
sa.Column("creator_id", CHAR(36), sa.ForeignKey("users.id"), nullable=False),
|
|
sa.Column("main_agent_id", CHAR(36), sa.ForeignKey("agents.id"), nullable=True),
|
|
sa.Column("parent_goal_id", CHAR(36), sa.ForeignKey("goals.id"), nullable=True),
|
|
sa.Column("started_at", sa.DateTime),
|
|
sa.Column("completed_at", sa.DateTime),
|
|
sa.Column("deadline", sa.DateTime),
|
|
sa.Column("created_at", sa.DateTime, server_default=sa.func.now()),
|
|
sa.Column("updated_at", sa.DateTime, server_default=sa.func.now(), onupdate=sa.func.now()),
|
|
)
|
|
|
|
# ── tasks 表 ──
|
|
op.create_table(
|
|
"tasks",
|
|
sa.Column("id", CHAR(36), primary_key=True),
|
|
sa.Column("goal_id", CHAR(36), sa.ForeignKey("goals.id"), nullable=False),
|
|
sa.Column("title", sa.String(500), nullable=False),
|
|
sa.Column("description", sa.Text),
|
|
sa.Column("status", sa.String(20), default="pending"),
|
|
sa.Column("priority", sa.Integer, default=5),
|
|
sa.Column("task_config", sa.JSON),
|
|
sa.Column("parent_task_id", CHAR(36), sa.ForeignKey("tasks.id"), nullable=True),
|
|
sa.Column("depends_on", sa.JSON, default=list),
|
|
sa.Column("result", sa.JSON),
|
|
sa.Column("error_message", sa.Text),
|
|
sa.Column("execution_id", CHAR(36), sa.ForeignKey("executions.id"), nullable=True),
|
|
sa.Column("assigned_agent_id", CHAR(36), sa.ForeignKey("agents.id"), nullable=True),
|
|
sa.Column("assigned_agent_name", sa.String(200)),
|
|
sa.Column("requires_approval", sa.Boolean, default=False),
|
|
sa.Column("approver_id", CHAR(36), sa.ForeignKey("users.id"), nullable=True),
|
|
sa.Column("approval_status", sa.String(20)),
|
|
sa.Column("started_at", sa.DateTime),
|
|
sa.Column("completed_at", sa.DateTime),
|
|
sa.Column("deadline", sa.DateTime),
|
|
sa.Column("created_at", sa.DateTime, server_default=sa.func.now()),
|
|
sa.Column("updated_at", sa.DateTime, server_default=sa.func.now(), onupdate=sa.func.now()),
|
|
)
|
|
|
|
# ── agents 表新增字段 ──
|
|
op.add_column("agents", sa.Column("agent_type", sa.String(20), default="specialist"))
|
|
op.add_column("agents", sa.Column("input_schema", sa.JSON, nullable=True))
|
|
op.add_column("agents", sa.Column("output_schema", sa.JSON, nullable=True))
|
|
|
|
# ── executions 表新增 goal_id ──
|
|
op.add_column("executions", sa.Column("goal_id", CHAR(36), sa.ForeignKey("goals.id"), nullable=True))
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_column("executions", "goal_id")
|
|
op.drop_column("agents", "output_schema")
|
|
op.drop_column("agents", "input_schema")
|
|
op.drop_column("agents", "agent_type")
|
|
op.drop_table("tasks")
|
|
op.drop_table("goals")
|