| """ |
| ChatSession and ChatMessage models. |
| |
| Maps to AGENT.md DBML: `chat_sessions` (Lines 526-534) and `chat_messages` (Lines 536-543). |
| """ |
| from django.conf import settings |
| from django.db import models |
|
|
| from core.models import BaseModel |
|
|
|
|
| class ChatSession(BaseModel): |
| """A conversation session between a user and an AI model.""" |
|
|
| user = models.ForeignKey( |
| settings.AUTH_USER_MODEL, |
| on_delete=models.CASCADE, |
| related_name="chat_sessions", |
| ) |
| org = models.ForeignKey( |
| "organizations.Organization", |
| on_delete=models.SET_NULL, |
| null=True, |
| blank=True, |
| related_name="chat_sessions", |
| ) |
| title = models.CharField(max_length=255, blank=True, default="") |
| model = models.ForeignKey( |
| "intelligence.AIModel", |
| on_delete=models.SET_NULL, |
| null=True, |
| blank=True, |
| related_name="sessions", |
| ) |
| system_prompt_snapshot = models.TextField(blank=True, default="") |
|
|
| class Meta: |
| db_table = "chat_sessions" |
| ordering = ["-created_at"] |
|
|
| def __str__(self) -> str: |
| return self.title or f"Session {self.pk}" |
|
|
|
|
| class ChatMessage(BaseModel): |
| """A single message in a chat session.""" |
|
|
| class Role(models.TextChoices): |
| USER = "user", "User" |
| ASSISTANT = "assistant", "Assistant" |
| SYSTEM = "system", "System" |
|
|
| session = models.ForeignKey( |
| ChatSession, |
| on_delete=models.CASCADE, |
| related_name="messages", |
| ) |
| role = models.CharField(max_length=20, choices=Role.choices) |
| content = models.TextField() |
| tokens_used = models.PositiveIntegerField(default=0) |
|
|
| class Meta: |
| db_table = "chat_messages" |
| ordering = ["created_at"] |
|
|
| def __str__(self) -> str: |
| return f"{self.get_role_display()}: {self.content[:50]}" |
|
|