修复机构落地页构建失败并恢复 Polymarket 市场扫描

InstitutionalLandingPage.tsx 补充 "use client" 指令以通过 Next.js 15 构建。
polymarket_readonly.py 集成 WebSocket 报价缓存加速价格获取。
city_payloads.py 复用 Polymarket 层构建真实市场扫描数据替代空返回。

Constraint: 市场扫描需在无 Polymarket 价格 UI 的前提下提供数据
Tested: npm run build 通过
This commit is contained in:
2569718930@qq.com
2026-05-25 00:41:56 +08:00
parent b6d7b07708
commit e9cc9a5eb1
3 changed files with 70 additions and 5 deletions
+55 -5
View File
@@ -8,6 +8,26 @@ from web.core import _is_excluded_model_name
TURKISH_MGM_CITIES = {"ankara", "istanbul"}
_polymarket_layer = None
def _get_polymarket_layer():
global _polymarket_layer
if _polymarket_layer is None:
from src.data_collection.polymarket_readonly import PolymarketReadOnlyLayer
_polymarket_layer = PolymarketReadOnlyLayer()
return _polymarket_layer
def _top_probability_bucket(distribution: Any) -> Optional[Dict[str, Any]]:
if not isinstance(distribution, list):
return None
candidates = [row for row in distribution if isinstance(row, dict)]
if not candidates:
return None
return max(candidates, key=lambda row: float(row.get("probability") or -1.0))
def build_city_summary_payload(data: Dict[str, Any]) -> Dict[str, Any]:
return {
@@ -46,11 +66,41 @@ def build_city_market_scan_payload(
requested_date = str(target_date or "").strip()
selected_date = requested_date or local_date
return {
"market_scan": {"available": False},
"selected_date": selected_date,
"fetched_at": data.get("updated_at"),
}
try:
layer = _get_polymarket_layer()
probabilities = data.get("probabilities") or {}
distribution = probabilities.get("distribution") or []
top_bucket = _top_probability_bucket(distribution)
model_probability = (
float(top_bucket.get("probability"))
if (isinstance(top_bucket, dict) and top_bucket.get("probability") is not None)
else None
)
scan = layer.build_market_scan(
city=data.get("name"),
target_date=selected_date,
temperature_bucket=top_bucket,
model_probability=model_probability,
probability_distribution=distribution,
temp_symbol=str(data.get("temp_symbol") or ""),
forced_market_slug=market_slug,
include_related_buckets=not lite,
scan_filters=scan_filters,
)
return {
"market_scan": scan,
"selected_date": selected_date,
"fetched_at": data.get("updated_at"),
}
except Exception:
import traceback
traceback.print_exc()
return {
"market_scan": {"available": False},
"selected_date": selected_date,
"fetched_at": data.get("updated_at"),
}
def build_city_detail_payload(