Files
JobRadar/agent_runtime/migrations/0001_initial.py
T

136 lines
9.1 KiB
Python

# 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'),
),
]