feat: Yahoo Finance SSH proxy + Xiaomi MiMo LLM support
CI / tests (py3.10) (push) Has been cancelled
CI / tests (py3.11) (push) Has been cancelled
CI / tests (py3.12) (push) Has been cancelled
CI / tests (py3.13) (push) Has been cancelled
CI / clean-install smoke (push) Has been cancelled
CI / ruff (strict, full repo) (push) Has been cancelled

- Add SSH proxy via foreign server for Yahoo Finance bypass
- Add fallback in load_ohlcv and get_YFin_data_online
- Add LLM JSON decode retry (3 attempts) in NormalizedChatOpenAI
- Add yahoo_proxy.py utility module
- Add test_smoke.py and patches/
This commit is contained in:
小钰 committed 2026-07-07 15:30:20 +08:00
1 parent 01477f9afb
commit 51d057e2c9
7 files changed
+824 -26

No files matched your search

+53
View File
@@ -0,0 +1,53 @@
#!/usr/bin/env python3
"""Yahoo Finance proxy via foreign server.
Routes yfinance requests through the foreign server to bypass local IP rate limiting.
"""
import subprocess
import json
import os
import sys
def _get_ssh_config():
"""Load SSH credentials from vault."""
result = subprocess.run(
["bash", "-c", 'source <(bash /root/.openclaw/workspace/scripts/vault.sh decrypt /root/.openclaw/workspace/secrets/credentials.env.enc) && echo "$FOREIGN_HOST $FOREIGN_PORT $FOREIGN_PASS"'],
capture_output=True, text=True, timeout=10
)
parts = result.stdout.strip().split()
if len(parts) != 3:
raise RuntimeError(f"Failed to load SSH config: {result.stderr}")
return parts[0], int(parts[1]), parts[2]
def fetch_yahoo_via_ssh(url: str, timeout: int = 30) -> str:
"""Fetch a Yahoo Finance URL through the foreign server via SSH."""
host, port, password = _get_ssh_config()
cmd = [
"sshpass", "-p", password,
"ssh", "-o", "StrictHostKeyChecking=no",
"-o", f"ConnectTimeout=15",
"-p", str(port), f"root@{host}",
f'curl -s "{url}" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"'
]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
if result.returncode != 0:
raise RuntimeError(f"SSH fetch failed: {result.stderr}")
return result.stdout
def test_connection() -> bool:
"""Test if Yahoo Finance is accessible via foreign server."""
try:
data = fetch_yahoo_via_ssh(
"https://query2.finance.yahoo.com/v8/finance/chart/AAPL?interval=1d&range=5d"
)
parsed = json.loads(data)
return "chart" in parsed and "result" in parsed.get("chart", {})
except Exception as e:
print(f"Connection test failed: {e}", file=sys.stderr)
return False
if __name__ == "__main__":
if test_connection():
print("✅ Yahoo Finance proxy via foreign server: OK")
else:
print("❌ Yahoo Finance proxy via foreign server: FAILED")