from django.db import models from django.utils import timezone from apps.users.models import User import uuid class Agent(models.Model): STATUS_CHOICES = [ ('idle', 'Idle'), ('running', 'Running'), ('paused', 'Paused'), ('completed', 'Completed'), ('failed', 'Failed'), ] uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='agents') name = models.CharField(max_length=255) description = models.TextField(blank=True, default="") status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='idle') task_id = models.CharField(max_length=255, blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) started_at = models.DateTimeField(null=True, blank=True) completed_at = models.DateTimeField(null=True, blank=True) def __str__(self) -> str: return f"{self.name} ({self.status})" class Meta: verbose_name = "Agent" verbose_name_plural = "Agents" class AgentExecution(models.Model): uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) agent = models.ForeignKey(Agent, on_delete=models.CASCADE, related_name='executions') user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='agent_executions') status = models.CharField(max_length=20, choices=[ ('queued', 'Queued'), ('running', 'Running'), ('completed', 'Completed'), ('failed', 'Failed'), ], default='queued') input_data = models.JSONField(default=dict) output_data = models.JSONField(default=dict, blank=True) error_message = models.TextField(blank=True, default="") created_at = models.DateTimeField(auto_now_add=True) started_at = models.DateTimeField(null=True, blank=True) completed_at = models.DateTimeField(null=True, blank=True) def __str__(self) -> str: return f"Execution {self.uuid} - {self.agent.name} ({self.status})" class Meta: verbose_name = "Agent Execution" verbose_name_plural = "Agent Executions" class AgentEvent(models.Model): EVENT_TYPES = [ ('started', 'Started'), ('message', 'Message'), ('progress', 'Progress'), ('completed', 'Completed'), ('error', 'Error'), ('step', 'Step'), ] uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) execution = models.ForeignKey(AgentExecution, on_delete=models.CASCADE, related_name='events') event_type = models.CharField(max_length=20, choices=EVENT_TYPES) content = models.JSONField() timestamp = models.DateTimeField(auto_now_add=True) def __str__(self) -> str: return f"{self.id} - {self.event_type} - {self.execution.agent.name}" class Meta: ordering = ['timestamp'] verbose_name = "Agent Event" verbose_name_plural = "Agent Events"