diff --git a/agent_chat/app.py b/agent_chat/app.py index 508d9a541..e98c5d838 100644 --- a/agent_chat/app.py +++ b/agent_chat/app.py @@ -987,7 +987,9 @@ def _try_streaming_server_replay(workflow_id: str, params: Dict[str, Any]) -> Op avec workflow_id et params. Returns: - Réponse du serveur si succès, None si indisponible ou erreur. + dict avec le résultat si succès. + dict avec {"error": ...} si le serveur est UP mais refuse (ex: pas de session). + None si le serveur est injoignable (connexion refusée, timeout). """ try: resp = http_requests.post( @@ -1004,10 +1006,12 @@ def _try_streaming_server_replay(workflow_id: str, params: Dict[str, Any]) -> Op logger.info(f"Workflow {workflow_id} envoyé au streaming server: {data}") return data else: - logger.debug( - f"Streaming server refus (HTTP {resp.status_code}): " - f"{resp.text[:200]}" + # Le serveur est UP mais refuse — renvoyer l'erreur pour éviter le fallback local + error_detail = resp.text[:200] + logger.warning( + f"Streaming server refus (HTTP {resp.status_code}): {error_detail}" ) + return {"error": error_detail, "status_code": resp.status_code} except http_requests.ConnectionError: logger.debug("Streaming server non disponible (connexion refusée)") except http_requests.Timeout: @@ -1088,6 +1092,29 @@ def execute_workflow(match, params): # Tenter l'exécution via le streaming server (Agent V1 distant) replay_result = _try_streaming_server_replay(match.workflow_id, params) if replay_result: + # Vérifier si c'est une erreur du serveur (UP mais pas de session/workflow) + if "error" in replay_result: + error_msg = replay_result["error"] + status_code = replay_result.get("status_code", 0) + if status_code == 404 and "session" in error_msg.lower(): + # Pas de session Agent V1 active — NE PAS faire de fallback local + finish_execution( + match.workflow_name, False, + "Aucun Agent V1 connecté. Lancez l'agent sur le PC cible " + "et démarrez une session d'abord." + ) + elif status_code == 404: + finish_execution( + match.workflow_name, False, + f"Workflow '{match.workflow_id}' non trouvé sur le serveur de streaming." + ) + else: + finish_execution( + match.workflow_name, False, + f"Erreur serveur streaming : {error_msg}" + ) + return + # Le streaming server a accepté le replay total_actions = replay_result.get("total_actions", 1) target_session = replay_result.get("session_id", "?") @@ -1116,8 +1143,8 @@ def execute_workflow(match, params): ) return - # Fallback : exécution locale - logger.info("Streaming server indisponible, exécution locale") + # Fallback : exécution locale (seulement si le streaming server est injoignable) + logger.info("Streaming server injoignable, exécution locale") execution_status["running"] = True execution_status["workflow"] = match.workflow_name @@ -1488,4 +1515,4 @@ if __name__ == '__main__': ╚════════════════════════════════════════════════════════════╝ """) - socketio.run(app, host='127.0.0.1', port=5004, debug=False, allow_unsafe_werkzeug=True) + socketio.run(app, host='0.0.0.0', port=5004, debug=False, allow_unsafe_werkzeug=True)