Cœur de la passerelle
Responsabilité
La passerelle est le pont entre l'agent et le monde extérieur : elle reçoit les messages des plateformes (Telegram/Discord/Slack/Signal/WeChat…) et les transforme en un MessageEvent unifié qui alimente l'agent ; elle retransforme la sortie en streaming de l'agent en actions d'envoi propres à chaque plateforme. gateway/run.py est le processus principal de cette couche (GatewayRunner), qui coordonne plusieurs sous-systèmes : adaptateurs, sessions, consommation en streaming, registre de livraison, hooks, heartbeat cron…
Fichiers clés
class GatewayRunner:3029— classe principale de la passerelle, mixe les capacités d'autorisation / Kanban / Slash_handle_message:9947— entrée de distribution des messages entrants_handle_message_with_agent:11956— confie un message à l'agent pour un tour_start_one_profile_adapter / _start_secondary:9389-9947— démarre les adaptateurs de plateforme pour chaque profil_start_stream_consumer:21218— démarre le consommateur de streaming_start_gateway_housekeeping:22246— ronde périodique (60 s)_start_cron_ticker:22335— heartbeat cron (60 s)def main:22965— entrée du processus passerelleexceptions et masquage:276-340—_gateway_loop_exception_handler/_redact_gateway_user_facing_secretsPlatformEntry:39-162— dataclass de l'entrée de plateformeclass PlatformRegistry:162-260— registre (register / register_deferred / unregister)
Flux de données
main()(gateway/run.py:22965) démarreGatewayRunner._start_one_profile_adapter:9389lance un par un les adaptateurs de plateforme (voir Adaptateurs de plateforme).- L'adaptateur reçoit l'événement brut de la plateforme et le transforme en
MessageEventunifié (voirgateway/platforms/base.py:1759). _handle_message(gateway/run.py:9947) distribue : vérification d'autorisation, résolution de session, routage des slash commands, ou délégation à_handle_message_with_agent(gateway/run.py:11956).- Ce dernier appelle
run_conversation:588de l'agent, et branche le callback de streaming surGatewayStreamConsumer:83. - La sortie en streaming édite progressivement le message de la plateforme via le consommateur ; l'état final est comptabilisé par
delivery_ledger, pour éviter qu'un crash ne perde la réponse finale. - La ronde de housekeeping et le heartbeat cron tournent en arrière-plan à 60 s (
gateway/run.py:22246/gateway/run.py:22335).
Résumé
Le cœur de la passerelle est un « bus d'événements + pont de streaming » : l'abstraction unifiée MessageEvent masque les différences de plateforme, le GatewayStreamConsumer traduit le callback synchrone de l'agent en livraison asynchrone à la plateforme, le delivery_ledger garantit que l'état final n'est pas perdu. Il est découplé de l'agent — l'agent se contente de tourner sa boucle, les détails de livraison restent côté passerelle.