fix(agent-chat): ne plus fallback local quand streaming server refuse

- Distinguer serveur injoignable (fallback local OK) vs serveur UP mais
  refus (pas de session Agent V1, workflow inconnu) → message d'erreur
  explicite au lieu d'ouvrir un navigateur sur Linux
- _try_streaming_server_replay retourne {"error": ...} au lieu de None
  quand le serveur répond avec un code d'erreur HTTP

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dom
2026-03-14 18:20:07 +01:00
parent 599dd02399
commit 7df01f2642

View File

@@ -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)