Skip to content
Extensões

Chat IA

Assistente de inteligencia artificial integrado como React Island com suporte a streaming de respostas token-a-token.

Extensao: src/extensions/chat-ia.css + islands/src/islands/ChatIA/

Uso

O Chat IA e uma React Island (Tier 3) que roda como componente React isolado dentro do monolito PHP. Suporta:

  • Streaming de respostas via SSE/ReadableStream (token-a-token)
  • Formato OpenAI (choices[0].delta.content) e formatos customizados
  • Sugestoes iniciais como chips clicaveis
  • Auto-scroll com botao "ir ao final"
  • Retry de mensagens com erro
  • Indicador de digitacao animado
  • Dark mode automatico
O Chat IA requer o bundle arenito-islands.js carregado na pagina. Sem o bundle, apenas o CSS e aplicado (fallback estatico).

Exemplos

Demonstracoes interativas do componente.

Carregando exemplo...

Anatomia

ParteElementoDescricao
Container.ia-chat-islandWrapper principal da React Island
Header.ia-chat-headerCabecalho com titulo e status
Status.status-dotIndicador verde de conexao
Messages.ia-chat-messagesArea scrollavel de mensagens
Msg User.msg.msg-userBolha de mensagem do usuario
Msg IA.msg.msg-iaBolha de mensagem do assistente
Avatar.msg-avatarIcone do remetente
Bubble.msg-bubbleConteudo da mensagem
Cursor.msg-cursorCursor piscante durante streaming
Typing.typing-dotsIndicador de digitacao (3 pontos)
Suggestions.ia-chat-suggestionsContainer dos chips de sugestao
Chip.ia-chat-suggestionChip de sugestao individual
Input.ia-chat-inputArea de input com textarea e botao
Textarea.ia-chat-textareaCampo de texto com auto-resize
Send.ia-chat-sendBotao circular de enviar
Scroll.ia-chat-scroll-btnBotao para voltar ao final

Propriedades

PropriedadeTipoDefaultDescrição
titlestring"Assistente IA"
subtitlestring"Online"
placeholderstring"Digite sua mensagem..."
apiEndpointstring
apiHeadersobject{}
apiMessageFieldstring"message"
apiResponseFieldstring"content"
streamingbooleantrue
suggestionsSuggestionChip[][]
welcomeMessagestring
onSendfunction
onResponsefunction

Tipo SuggestionChip

typescript
interface SuggestionChip {
  label: string;   // Texto exibido no chip
  prompt: string;  // Texto inserido no input ao clicar
}

Codigo

Via data-attributes (auto-init)

html
<div data-island="chat-ia" data-props='{
  "title": "Assistente SIDASP",
  "subtitle": "Online",
  "apiEndpoint": "/api/ia/chat",
  "welcomeMessage": "Ola! Como posso ajudar?",
  "suggestions": [
    {"label": "Cadastrar produtor", "prompt": "Como cadastrar um produtor?"},
    {"label": "Emitir GTA", "prompt": "Como emitir uma GTA?"}
  ]
}'></div>
<script defer src="arenito-islands.js"></script>

Via JavaScript programatico

javascript
window.ArenitoIslands.mount(element, 'chat-ia', {
  title: 'Assistente SIDASP',
  apiEndpoint: '/api/ia/chat',
  apiHeaders: { 'Authorization': 'Bearer token' },
  streaming: true,
  welcomeMessage: 'Ola! Como posso ajudar?',
  suggestions: [
    { label: 'Cadastrar produtor', prompt: 'Como cadastrar um produtor?' }
  ],
  onSend: (msg) => console.log('Enviado:', msg),
  onResponse: (msg) => console.log('Resposta:', msg)
});

Via Factory (definicao de dominio)

javascript
ArenitoFactory.create('chat-ia', element, {
  datasource: {
    endpoint: '/api/ia/chat',
    headers: { 'Authorization': 'Bearer token' },
    streaming: true,
    messageField: 'message',
    responseField: 'content'
  },
  display: {
    title: 'Assistente SIDASP',
    subtitle: 'Online',
    welcomeMessage: 'Ola! Como posso ajudar?',
    suggestions: [
      { label: 'Cadastrar produtor', prompt: 'Como cadastrar um produtor?' }
    ]
  }
});

Streaming

O Chat IA suporta streaming de respostas em dois formatos:

SSE (Server-Sent Events)

data: {"content": "Ola"}
data: {"content": ", como"}
data: {"content": " posso"}
data: {"content": " ajudar?"}
data: [DONE]

Formato OpenAI

data: {"choices": [{"delta": {"content": "Ola"}}]}
data: {"choices": [{"delta": {"content": ", como"}}]}
data: [DONE]

Sem streaming

Se streaming: false, a resposta e esperada como JSON completo:

json
{ "content": "Ola, como posso ajudar?" }

O campo de resposta e configuravel via apiResponseField. Fallbacks automaticos: contenttextmessageresponse.

Eventos Customizados

EventoDetalheDescricao
arenito:chat:message-sent{ message: string }Disparado quando o usuario envia mensagem
arenito:chat:response-complete{ message: string }Disparado quando a resposta do IA finaliza
javascript
document.addEventListener('arenito:chat:message-sent', (e) => {
  console.log('Usuario perguntou:', e.detail.message);
});

document.addEventListener('arenito:chat:response-complete', (e) => {
  console.log('IA respondeu:', e.detail.message);
});

Integracao com Navbar

O CSS inclui estilos para o botao trigger (.ia-chat-btn) e dropdown (.ia-chat-dropdown) para integracao na navbar do SIDASP:

html
<!-- Botao na navbar -->
<button class="ia-chat-btn" onclick="toggleChat()">
  <svg class="ia-chat-icon">...</svg>
  <span class="ia-label">IA</span>
</button>

<!-- Dropdown com a Island dentro -->
<div class="ia-chat-dropdown" id="chatDropdown">
  <div data-island="chat-ia" data-props='...'></div>
</div>

<script>
function toggleChat() {
  document.getElementById('chatDropdown').classList.toggle('active');
}
</script>

Dark Mode

ElementoLightDark
Header--accent-300 (azul)--accent-400 (azul escuro)
Messages bg--surface-base-neutral-page-defaultInvertido automaticamente
Bubble IAContainer default + bordaInvertido automaticamente
Bubble User--accent-300Mantido
InputContainer defaultInvertido automaticamente

Design System interno do GALES