Sistema de Chat¶
Fluxo de uma Mensagem¶
sequenceDiagram
participant A as Aluno
participant V as MessageSendView
participant S as Subscription
participant C as StudentCredit (por agente)
participant SK as SkillsEngine
participant E as ChatEngine
participant O as OpenAI API
A->>V: POST /dashboard/chat/sessao/{session_id}/enviar/
V->>S: can_send_message()?
S-->>V: True/False
V->>C: is_exhausted? (agent-specific)
C-->>V: False
V->>V: Processar arquivo anexado (se houver)
V->>V: Salvar ChatMessage do usuario + ChatAttachment
V->>SK: build_tools_for_agent(agent, student)
SK-->>V: [tools]
V->>E: generate_streaming_response(tools=tools)
E->>O: ChatOpenAI stream (com tools)
O-->>E: chunks
E-->>A: SSE: data: {"chunk": "..."}
E-->>V: resposta completa
V->>V: Salvar ChatMessage do assistente + custo
V-->>A: SSE: data: {"done": true} Verificacao de Creditos por Agente¶
O sistema verifica creditos por agente especifico:
credit = get_or_create_student_credit(student, school, agent=agent)
if credit.is_exhausted:
return JsonResponse({'credits_exhausted': True, ...}, status=403)
Quando os creditos de um agente esgotam, o aluno ainda pode conversar com outros agentes.
Integracao com Skills e MCPs¶
Antes de gerar a resposta, o sistema monta as tools disponiveis:
from agents.skills_engine import build_tools_for_agent
agent_tools = build_tools_for_agent(agent, student)
As tools incluem: - Skills do agente (respeitando overrides do aluno via StudentSkillOverride) - Skills personalizadas do aluno (StudentSkill) - MCP Servers do agente (AgentMCPServer) - MCP Servers do aluno (StudentMCPServer)
Upload de Arquivos (ChatAttachment)¶
O aluno pode anexar arquivos na mensagem:
- Arquivo recebido via multipart/form-data
- Texto extraido via
chats/file_processor.py - Conteudo adicionado ao prompt como contexto
ChatAttachmentcriado comextracted_text(primeiros 5000 caracteres)
Tipos suportados: PDF, TXT, MD, CSV, XLSX, SRT. Limite: 10 MB.
Streaming com SSE¶
O chat usa Server-Sent Events para streaming. Cada chunk da resposta e enviado como:
Contagem de Tokens e Custos¶
Cada ChatMessage armazena: - token_count -- tokens estimados via tiktoken - message_cost -- custo em USD = tokens x custo_por_1M / 1_000_000 - estimated_time_saved_minutes -- tempo economizado = tokens x minutos_por_100 / 100
Selecao de Modelo¶
O aluno escolhe o modelo disponivel no plano da escola. A view valida: