Files
aiagent/backend/alembic/versions/013_add_goals_tasks.py
renjianbo 02d7cf8f62 feat: add Goal/Task data models, service layer, and API routes (Phase 1)
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>
2026-05-08 19:50:16 +08:00

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")