2025-11-19 12:55:15 +00:00
|
|
|
from django.db import models
|
|
|
|
|
from django.utils import timezone
|
2025-12-17 14:11:23 +00:00
|
|
|
from apps.users.models import User
|
|
|
|
|
import uuid
|
2025-11-19 12:55:15 +00:00
|
|
|
|
|
|
|
|
|
2025-12-17 14:11:23 +00:00
|
|
|
class Agent(models.Model):
|
|
|
|
|
STATUS_CHOICES = [
|
|
|
|
|
('idle', 'Idle'),
|
|
|
|
|
('running', 'Running'),
|
|
|
|
|
('paused', 'Paused'),
|
|
|
|
|
('completed', 'Completed'),
|
|
|
|
|
('failed', 'Failed'),
|
|
|
|
|
]
|
2025-11-19 12:55:15 +00:00
|
|
|
|
2025-12-17 14:11:23 +00:00
|
|
|
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)
|
2025-11-19 12:55:15 +00:00
|
|
|
|
2025-12-17 14:11:23 +00:00
|
|
|
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)
|
2025-11-19 12:55:15 +00:00
|
|
|
|
2025-12-17 14:11:23 +00:00
|
|
|
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"
|
2025-11-19 12:55:15 +00:00
|
|
|
|