arnaudmoncondhuy / synapse-chat
Composant interface de chat pour Synapse — Contrôleur Stimulus avec streaming, points de terminaison API NDJSON et templates Twig intégrables.
Installs: 2
Dependents: 2
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Language:JavaScript
Type:symfony-bundle
pkg:composer/arnaudmoncondhuy/synapse-chat
Requires
- php: >=8.2
- arnaudmoncondhuy/synapse-core: *@dev
- symfony/asset: ^7.0 || ^8.0
- symfony/asset-mapper: ^7.0 || ^8.0
- symfony/stimulus-bundle: ^2.0
- symfony/twig-bundle: ^7.0 || ^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.93
- symfony/test-pack: ^1.2
This package is auto-updated.
Last update: 2026-02-27 07:19:48 UTC
README
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
Installation
composer require arnaudmoncondhuy/synapse-chat:^0.1
Caractéristiques
💬 Chat UI moderne
- Interface conversationnelle en Twig
- Streaming en temps réel via SSE
- Support des tool calls affichés en live
- Historique conversationnel
⚡ Stimulus Controller
synapse_chat_controller- Gestion du chat interactif- Envoi de messages
- Streaming de réponses
- Display des tool calls
- Gestion d'erreurs gracieuse
🔗 API Endpoints NDJSON
-
POST /api/chat- Envoi de message et streaming- Format :
application/x-ndjson - Response streamée avec Server-Sent Events
- Support du tool use
- Format :
-
POST /api/reset- Réinitialiser la conversation -
POST /api/csrf- Obtenir token CSRF
🎨 Templates Twig
@Synapse/chat/page.html.twig- Page chat complète@Synapse/chat/component.html.twig- Composant embeddable@Synapse/chat/sidebar.html.twig- Historique conversations
Configuration minimale
config/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: PUBLIC_ACCESS } # Chat public - { path: ^/api/reset, roles: ROLE_USER } # Réinitialisation authentifiée
Utilisation basique
Page chat complète
// 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
Composant embeddable
{# 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>
JavaScript Stimulus
Le controller Stimulus gère :
- Écoute du formulaire de chat
- Envoi AJAX vers
/api/chat - Streaming SSE de la réponse
- Affichage des chunks en temps réel
- Gestion des erreurs
// Déclaration automatique via AssetMapper // <div data-controller="synapse--chat">
Format NDJSON
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}
Événements frontend
// 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); }
Intégration avec Synapse Core
Le bundle expose :
- Les routes API du core (ChatApiController)
- Les contrôleurs de conversation
- Gestion des presets depuis la DB
Configuration du preset actif :
synapse_chat: default_preset_name: "default" # Depuis DB
Assets
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' %}
Structure des dépendances
synapse-chat
├── arnaudmoncondhuy/synapse-core
├── symfony/twig-bundle
├── symfony/asset-mapper
├── symfony/stimulus-bundle
└── symfony/asset
Licence
PolyForm Noncommercial 1.0.0 (usage non-commercial uniquement)