# Generated by Django 6.0.8 on 2026-09-09 02:53 import django.db.models.deletion import uuid from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='AgentRun', fields=[ ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('title', models.CharField(max_length=160, verbose_name='标题')), ('status', models.CharField(choices=[('pending', '等待'), ('running', '运行中'), ('waiting_approval', '等待确认'), ('succeeded', '成功'), ('failed', '失败'), ('cancelled', '已取消')], default='pending', max_length=32, verbose_name='状态')), ('lock_version', models.PositiveBigIntegerField(default=0, verbose_name='锁版本')), ('input_summary', models.JSONField(default=dict, verbose_name='输入摘要')), ('output_summary', models.JSONField(blank=True, null=True, verbose_name='输出摘要')), ('agent_name', models.CharField(default='job_research', max_length=100, verbose_name='Agent 名称')), ('agent_version', models.CharField(blank=True, max_length=40, verbose_name='Agent 版本')), ('instruction_version', models.CharField(blank=True, max_length=40, verbose_name='指令版本')), ('toolset_version', models.CharField(blank=True, max_length=40, verbose_name='工具集版本')), ('model_name', models.CharField(blank=True, max_length=100, verbose_name='模型名称')), ('trace_id', models.CharField(blank=True, max_length=128, verbose_name='追踪标识')), ('started_at', models.DateTimeField(blank=True, null=True, verbose_name='开始时间')), ('finished_at', models.DateTimeField(blank=True, null=True, verbose_name='结束时间')), ('duration_ms', models.PositiveBigIntegerField(blank=True, null=True, verbose_name='耗时毫秒')), ('input_tokens', models.PositiveBigIntegerField(blank=True, null=True, verbose_name='输入 Token')), ('output_tokens', models.PositiveBigIntegerField(blank=True, null=True, verbose_name='输出 Token')), ('estimated_cost', models.DecimalField(blank=True, decimal_places=6, max_digits=12, null=True, verbose_name='估算费用')), ('error_code', models.CharField(blank=True, max_length=80, verbose_name='错误码')), ('error_summary', models.TextField(blank=True, verbose_name='错误摘要')), ('owner', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='%(app_label)s_%(class)s_items', to=settings.AUTH_USER_MODEL, verbose_name='所属用户')), ], options={ 'ordering': ('-created_at',), }, ), migrations.CreateModel( name='AgentRunEvent', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('sequence', models.PositiveBigIntegerField(verbose_name='事件序号')), ('event_type', models.CharField(max_length=64, verbose_name='事件类型')), ('summary', models.CharField(max_length=240, verbose_name='摘要')), ('payload_summary', models.JSONField(default=dict, verbose_name='数据摘要')), ('occurred_at', models.DateTimeField(verbose_name='发生时间')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='记录时间')), ('run', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='events', to='agent_runtime.agentrun')), ], options={ 'ordering': ('sequence',), }, ), migrations.CreateModel( name='HumanApproval', fields=[ ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('request_key', models.CharField(max_length=128, verbose_name='请求键')), ('approval_type', models.CharField(max_length=64, verbose_name='确认类型')), ('status', models.CharField(choices=[('pending', '待处理'), ('approved', '已通过'), ('rejected', '已拒绝'), ('expired', '已过期'), ('cancelled', '已取消')], default='pending', max_length=20, verbose_name='状态')), ('request_summary', models.JSONField(default=dict, verbose_name='请求摘要')), ('decision_summary', models.JSONField(blank=True, null=True, verbose_name='处理摘要')), ('requested_at', models.DateTimeField(verbose_name='请求时间')), ('resolved_at', models.DateTimeField(blank=True, null=True, verbose_name='处理时间')), ('resolved_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='resolved_agent_approvals', to=settings.AUTH_USER_MODEL)), ('run', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='approvals', to='agent_runtime.agentrun')), ], ), migrations.CreateModel( name='ToolCall', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), ('call_id', models.CharField(max_length=128, verbose_name='调用标识')), ('tool_name', models.CharField(max_length=100, verbose_name='工具名称')), ('tool_version', models.CharField(blank=True, max_length=40, verbose_name='工具版本')), ('idempotency_key', models.CharField(blank=True, max_length=128, verbose_name='幂等键')), ('status', models.CharField(choices=[('started', '已开始'), ('succeeded', '成功'), ('failed', '失败')], default='started', max_length=20, verbose_name='状态')), ('arguments_summary', models.JSONField(default=dict, verbose_name='参数摘要')), ('result_summary', models.JSONField(blank=True, null=True, verbose_name='结果摘要')), ('error_code', models.CharField(blank=True, max_length=80, verbose_name='错误码')), ('error_summary', models.TextField(blank=True, verbose_name='错误摘要')), ('started_at', models.DateTimeField(verbose_name='开始时间')), ('finished_at', models.DateTimeField(blank=True, null=True, verbose_name='结束时间')), ('duration_ms', models.PositiveBigIntegerField(blank=True, null=True, verbose_name='耗时毫秒')), ('run', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='tool_calls', to='agent_runtime.agentrun')), ], ), migrations.AddIndex( model_name='agentrun', index=models.Index(fields=['owner', 'created_at'], name='run_owner_created_idx'), ), migrations.AddConstraint( model_name='agentrun', constraint=models.CheckConstraint(condition=models.Q(('lock_version__gte', 0)), name='run_lock_nonnegative'), ), migrations.AddConstraint( model_name='agentrunevent', constraint=models.UniqueConstraint(fields=('run', 'sequence'), name='event_run_sequence_uniq'), ), migrations.AddIndex( model_name='humanapproval', index=models.Index(fields=['status', 'requested_at'], name='approval_status_time_idx'), ), migrations.AddConstraint( model_name='humanapproval', constraint=models.UniqueConstraint(fields=('run', 'request_key'), name='approval_run_key_uniq'), ), migrations.AddIndex( model_name='toolcall', index=models.Index(fields=['run', 'started_at'], name='tool_run_started_idx'), ), migrations.AddConstraint( model_name='toolcall', constraint=models.UniqueConstraint(fields=('run', 'call_id'), name='tool_run_call_uniq'), ), migrations.AddConstraint( model_name='toolcall', constraint=models.UniqueConstraint(condition=models.Q(('idempotency_key', ''), _negated=True), fields=('run', 'idempotency_key'), name='tool_run_idempotency_uniq'), ), ]