Chat UI component for Synapse — Stimulus streaming controller, NDJSON API endpoints, and embeddable Twig templates.
Widget de chat embeddable pour Synapse Core. Composant Stimulus + Twig pour afficher une interface conversationnelle en streaming temps réel.
Dépend de : arnaudmoncondhuy/synapse-core
composer require arnaudmoncondhuy/synapse-chat:^0.1
synapse_chat_controller - Gestion du chat interactif
POST /api/chat - Envoi de message et streaming (NDJSON)POST /api/estimate-cost - Estimation du coût d'un messagePOST /api/reset - Réinitialiser la conversationPOST /api/csrf - Obtenir token CSRF@Synapse/chat/page.html.twig - Page chat complète@Synapse/chat/component.html.twig - Composant embeddable@Synapse/chat/sidebar.html.twig - Historique conversationsconfig/bundles.php :
ArnaudMoncondhuy\SynapseChat\SynapseChatBundle::class => ['all' => true],
config/routes.yaml :
synapse_chat:
resource: '@SynapseChatBundle/config/routes.yaml'
prefix: /api
config/packages/security.yaml :
access_control:
- { path: ^/api/chat, roles: ROLE_USER } # Chat restreint
- { path: ^/api/csrf, roles: PUBLIC_ACCESS }
CSRF (Optionel mais recommandé) :
Le bundle vérifie le header X-CSRF-Token par défaut.
synapse_chat:
api_csrf_enabled: true
// Dans un contrôleur
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class ChatController extends AbstractController {
public function chat() {
return $this->render('@Synapse/chat/page.html.twig');
}
}
# config/routes.yaml
chat_page:
path: /chat
controller: App\Controller\ChatController::chat
{# Dans votre template #}
<div class="my-layout">
<header>Mon application</header>
{% include '@Synapse/chat/component.html.twig' with {
title: 'Assistant IA',
placeholder: 'Posez une question...'
} %}
</div>
Le controller Stimulus gère :
/api/chat// Déclaration automatique via AssetMapper
// <div data-controller="synapse--chat">
Chaque ligne est un objet JSON distinct :
{"text":"Bonjour,","chunk_id":0,"type":"text"}
{"text":" comment","chunk_id":1,"type":"text"}
{"tool_use":{"id":"call_123","name":"calculator","input":{"a":2,"b":3}},"chunk_id":2,"type":"tool_call"}
{"text":"ça donne 5.","chunk_id":3,"type":"text"}
{"usage":{"input_tokens":15,"output_tokens":24},"chunk_id":4,"type":"usage"}
{"final":true,"chunk_id":5}
// Dans votre composant Stimulus
messageReceived(event) {
// Déclenché à chaque chunk reçu
console.log(event.detail.chunk);
}
responseComplete(event) {
// Déclenché à la fin du streaming
console.log(event.detail.fullResponse);
}
Le bundle expose :
Configuration du preset actif :
synapse_chat:
default_preset_name: "default" # Depuis DB
CSS et JS inclusos automatiquement via AssetMapper :
packages/chat/assets/
├── controllers/
│ └── synapse_chat_controller.js
└── styles/
└── synapse.css
À importer dans votre layout Twig :
{% include '@Synapse/chat/assets.html.twig' %}
synapse-chat
├── arnaudmoncondhuy/synapse-core
├── symfony/twig-bundle
├── symfony/asset-mapper
├── symfony/stimulus-bundle
└── symfony/asset
L'interface de chat et les messages d'erreur API sont traduisibles.
synapse_chatHow can I help you explore Laravel packages today?