Pular para conteúdo

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:

  1. Arquivo recebido via multipart/form-data
  2. Texto extraido via chats/file_processor.py
  3. Conteudo adicionado ao prompt como contexto
  4. ChatAttachment criado com extracted_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:

data: {"chunk": "parte da resposta"}

data: {"done": true, "message_id": 42, "credits": {...}}

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:

if not subscription.can_use_model(model_name):
    return JsonResponse({'error': '...'}, status=403)