From f4b2467ae9958e9cfac7ae3359f1048c4d74d5d6 Mon Sep 17 00:00:00 2001 From: hmo Date: Tue, 30 Jun 2026 02:27:52 +0800 Subject: [PATCH] fix: replace hardcoded 192.168.1.122 with node122 (hostname resolves via /etc/hosts to LAN or EasyTier) - mo_config.py: xiaoguo_host=node122, xiaoguo_api_url property - market_screener.py, xiaoguo_scanner.py, xiaoguo_news_processor.py: use mo_config or node122 fallback - scripts/intraday_health_check.py, scripts/ocr_client.py: node122 - EasyTier connects at 10.144.144.2 when off-LAN --- __pycache__/market_screener.cpython-312.pyc | Bin 21373 -> 18783 bytes market_screener.py | 8 +++++++- mo_config.py | 13 ++++++++++++- scripts/intraday_health_check.py | 2 +- scripts/ocr_client.py | 2 +- xiaoguo_news_processor.py | 11 +++++++++-- xiaoguo_scanner.py | 11 +++++++++-- 7 files changed, 39 insertions(+), 8 deletions(-) diff --git a/__pycache__/market_screener.cpython-312.pyc b/__pycache__/market_screener.cpython-312.pyc index 2a5d602483e608f69bf6aae1b84a91229c1fcb50..aa96a2b1e4c3af8a2e7b8162307300c467aaa029 100644 GIT binary patch literal 18783 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 diff --git a/market_screener.py b/market_screener.py index 3ba1332..2c44b4f 100644 --- a/market_screener.py +++ b/market_screener.py @@ -9,13 +9,19 @@ WEB_DASHBOARD_DIR = Path(__file__).resolve().parent.parent.parent / "web-dashboa DATA_DIR = WEB_DASHBOARD_DIR / "data" MARKET_JSON = DATA_DIR / "market.json" POOL_JSON = DATA_DIR / "candidate_pool.json" -XIAOGUO_API = "http://192.168.1.122:18003/v1/chat/completions" XIAOGUO_MODEL = "Qwen3.6-27B-OptiQ-4bit" API_TIMEOUT = 60 MAX_SECTORS = 5 MAX_CANDIDATES_POOL = 60 TENCENT_URL = "http://qt.gtimg.cn/q=" +def _get_xiaoguo_url(): + try: + from mo_config import get_config + return get_config().xiaoguo_api_url + except Exception: + return "http://node122:18003/v1/chat/completions" # legacy fallback + def load_json(path): try: diff --git a/mo_config.py b/mo_config.py index a919578..79d1e60 100644 --- a/mo_config.py +++ b/mo_config.py @@ -87,7 +87,18 @@ class MoConfig: hk_rate_fallback: float = 0.87 # 港币→人民币 fallback 汇率 - # ── 服务配置 ────────────────────────────────────────────────── + # ── 小果 LLM 端点(用机器名,/etc/hosts 自动解析 LAN/EasyTier)─ + # node122 = 192.168.1.122 (LAN) / 10.144.144.2 (EasyTier) + xiaoguo_host: str = "node122" + xiaoguo_port: int = 18003 + + @property + def xiaoguo_url(self) -> str: + return f"http://{self.xiaoguo_host}:{self.xiaoguo_port}" + + @property + def xiaoguo_api_url(self) -> str: + return f"{self.xiaoguo_url}/v1/chat/completions" port: int = field(default_factory=lambda: int(os.environ.get("PORT", "8899"))) diff --git a/scripts/intraday_health_check.py b/scripts/intraday_health_check.py index 88ea124..14af743 100644 --- a/scripts/intraday_health_check.py +++ b/scripts/intraday_health_check.py @@ -68,7 +68,7 @@ def check_xiaoguo(): # 可能是小果离线了,不报严重,记录即可 return # API — 不通时scanner已降级为unknown,不影响 - check_http("http://192.168.1.122:18003/v1/models") + check_http("http://node122:18003/v1/models") PORTFOLIO_PATH = str(DATA / "portfolio.json") diff --git a/scripts/ocr_client.py b/scripts/ocr_client.py index 0a3d79d..9d2ced0 100755 --- a/scripts/ocr_client.py +++ b/scripts/ocr_client.py @@ -13,7 +13,7 @@ import json import base64 import urllib.request -OCR_URL = "http://192.168.1.122:18003/v1/chat/completions" +OCR_URL = "http://node122:18003/v1/chat/completions" OCR_MODEL = "GLM-OCR-8bit" def ocr_image(image_path, prompt="请详细识别这张图片中的所有文字,包括数字、股票名称、金额等。用中文回复。"): diff --git a/xiaoguo_news_processor.py b/xiaoguo_news_processor.py index a29bff2..44c1ae8 100644 --- a/xiaoguo_news_processor.py +++ b/xiaoguo_news_processor.py @@ -25,7 +25,14 @@ except ImportError: DATA_DIR = Path(__file__).parent / "data" DB_PATH = DATA_DIR / "mofin.db" -XIAOGUO_API = "http://192.168.1.122:18003/v1/chat/completions" +XIAOGUO_API = "http://node122:18003/v1/chat/completions" # fallback, /etc/hosts resolves to LAN or EasyTier + +def _get_xiaoguo_url(): + try: + from mo_config import get_config + return get_config().xiaoguo_api_url + except Exception: + return XIAOGUO_API XIAOGUO_MODEL = "Qwen3.6-27B-MTPLX-Optimized-Speed" MAX_ARTICLES = 5 # 每次最多分析篇数(实测5篇12s) @@ -117,7 +124,7 @@ def call_xiaoguo(articles): clean_proxy() opener = urllib.request.build_opener(urllib.request.ProxyHandler({})) req = urllib.request.Request( - XIAOGUO_API, data=payload, + _get_xiaoguo_url(), data=payload, headers={"Content-Type": "application/json"}, method="POST" ) try: diff --git a/xiaoguo_scanner.py b/xiaoguo_scanner.py index e467c61..286ac43 100644 --- a/xiaoguo_scanner.py +++ b/xiaoguo_scanner.py @@ -17,7 +17,14 @@ except ImportError: DATA_DIR = Path(__file__).parent / "data" DB_PATH = DATA_DIR / "mofin.db" -XIAOGUO_API = "http://192.168.1.122:18003/v1/chat/completions" +XIAOGUO_API = "http://node122:18003/v1/chat/completions" # fallback, /etc/hosts resolves to LAN or EasyTier + +def _get_xiaoguo_url(): + try: + from mo_config import get_config + return get_config().xiaoguo_api_url + except Exception: + return XIAOGUO_API XIAOGUO_MODEL = "Qwen3.6-27B-MTPLX-Optimized-Speed" SCAN_INTERVAL = 3600 # 同一只股1小时内不重复搜 MAX_STOCKS_PER_RUN = 15 @@ -221,7 +228,7 @@ def check_stock(code, name, articles): }).encode() opener = urllib.request.build_opener(urllib.request.ProxyHandler({})) - req = urllib.request.Request(XIAOGUO_API, data=payload, + req = urllib.request.Request(_get_xiaoguo_url(), data=payload, headers={"Content-Type": "application/json"}, method="POST") try: resp = opener.open(req, timeout=30)