Dynavera/apps/agents/models.py
2025-12-17 14:11:23 +00:00

88 lines
2.7 KiB
Python

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"