From 3c2589f653026bcf7cd979f562d4a28691000403 Mon Sep 17 00:00:00 2001 From: dekun Date: Thu, 30 Jul 2026 13:36:21 +0800 Subject: [PATCH] Fix control status: do not treat /health as fleet (missing positions). Co-authored-by: Cursor --- control/backend/app/api/nodes.py | 12 ++++-------- control/backend/app/proxy.py | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/control/backend/app/api/nodes.py b/control/backend/app/api/nodes.py index e9bfd10..c17c18f 100644 --- a/control/backend/app/api/nodes.py +++ b/control/backend/app/api/nodes.py @@ -51,10 +51,6 @@ def _raise_node_error(code: int, data: Any) -> None: ) -def _health_looks_like_fleet(health: Any) -> bool: - return isinstance(health, dict) and "strategy" in health and "mode" in health - - async def _collect_one_status( node: dict[str, Any], *, @@ -63,10 +59,10 @@ async def _collect_one_status( probe = await probe_health(node, timeout=timeout) item: dict[str, Any] = {**_public_node(node), **probe} if probe.get("online") and node.get("token_sealed"): - health = probe.get("health") - # probe_health 在 /health 失败时可能已用 fleet/status 回填到 health - if _health_looks_like_fleet(health): - code, data = 200, health + # /health 也有 mode+strategy,但不能当 fleet(无持仓详情)。 + # 仅当 probe 已用 fleet 回退时复用,否则必须再拉 /api/fleet/status。 + if probe.get("from_fleet") and isinstance(probe.get("health"), dict): + code, data = 200, probe["health"] else: code, data = await call_node( node, "GET", "/api/fleet/status", timeout=timeout diff --git a/control/backend/app/proxy.py b/control/backend/app/proxy.py index 0fad4ac..4cba0d8 100644 --- a/control/backend/app/proxy.py +++ b/control/backend/app/proxy.py @@ -74,13 +74,23 @@ async def probe_health( node, "GET", "/health", require_token=False, timeout=timeout ) if code == 200 and isinstance(data, dict): - return {"online": True, "health": data, "error": None} + return { + "online": True, + "health": data, + "error": None, + "from_fleet": False, + } # fallback fleet status if health blocked code2, data2 = await call_node( node, "GET", "/api/fleet/status", require_token=True, timeout=timeout ) if code2 == 200 and isinstance(data2, dict): - return {"online": True, "health": data2, "error": None} + return { + "online": True, + "health": data2, + "error": None, + "from_fleet": True, + } detail = "" if isinstance(data, dict): detail = str(data.get("detail") or "") @@ -88,4 +98,5 @@ async def probe_health( "online": False, "health": None, "error": detail or f"HTTP {code}", + "from_fleet": False, }