From 1cdef8da7e7c377ece1ebb944fa2d8bfec678c29 Mon Sep 17 00:00:00 2001 From: hmo Date: Fri, 24 Jul 2026 09:18:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20SenseNova=E9=AB=98=E9=80=9F=E9=80=9A?= =?UTF-8?q?=E9=81=93(key=E4=BB=8Ehermes=20config=E8=AF=BB,=E4=B8=8D?= =?UTF-8?q?=E8=90=BD=E7=9B=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - token.sensenova.cn托管同款deepseek-v4-flash,实测3.2s vs OCG 45s(开盘高峰) - 通道顺序: sensenova→OCG key池→gateway; 空输出直接切下一通道(SN无pro) --- deploy/profile-scripts/llm_client.py | 38 +++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/deploy/profile-scripts/llm_client.py b/deploy/profile-scripts/llm_client.py index 1f3dface..77b683f0 100644 --- a/deploy/profile-scripts/llm_client.py +++ b/deploy/profile-scripts/llm_client.py @@ -135,6 +135,34 @@ GATEWAY = "http://127.0.0.1:8643/v1/chat/completions" GATEWAY_MODELS = "http://127.0.0.1:8643/v1/models" GATEWAY_AUTH = "Bearer hermes123" +# ── SenseNova 备用通道(2026-07-24 老爸:并发要快)── +# token.sensenova.cn 托管同款 deepseek-v4-flash,实测 3.2s vs OCG 45s(开盘高峰)。 +# 公测免费,与 OCG 不同上游、不共享拥塞。不支持 deepseek-v4-pro 升级(404)。 +# key 从 hermes config 的 sense-nova provider 读取(SSOT,不落盘)。 +SN_URL = "https://token.sensenova.cn/v1/chat/completions" + + +def _load_sn_key(): + """从 hermes config.yaml 读 sense-nova 的 api_key。读不到则禁用该通道。""" + import re + try: + with open(_HERMES_CONFIG, encoding="utf-8") as f: + text = f.read() + m = re.search(r'sense-nova:\s*\n\s*api_key:\s*(\S+)', text) + if m: + return m.group(1) + except Exception: + pass + return None + + +_SN_KEY = _load_sn_key() +SN_HEADERS = { + "Content-Type": "application/json", + "Authorization": f"Bearer {_SN_KEY}", + "User-Agent": "curl/8.5.0", +} if _SN_KEY else None + def _post(url, headers, payload, timeout): """单次 POST,返回 (ok, content_or_error)。""" @@ -205,8 +233,11 @@ def call_llm(prompt, model=None, max_tokens=4096, timeout=150, "max_tokens": max_tokens, }).encode() - # ── 构建通道列表:key池(OCG直连,按/api/keys实时状态排序) → gateway 兜底 ── + # ── 构建通道列表:SenseNova(快,同款model) → key池(OCG直连) → gateway 兜底 ── + # 2026-07-24:OCG开盘高峰45s+/call且空输出高发,SenseNova托管同款deepseek-v4-flash实测3.2s channels = [] + if SN_HEADERS: + channels.append(("sensenova", SN_URL, SN_HEADERS)) pool = _get_key_pool() for kid, key in pool: if key: @@ -235,6 +266,11 @@ def call_llm(prompt, model=None, max_tokens=4096, timeout=150, # ── 空输出视为失败:先同 key 升 FALLBACK_MODEL(pro),仍空则不返回, # 落到外循环切下一个 key(2026-07-22 实测:空输出会"假成功"阻断轮换)── if not result.strip(): + # SenseNova 不托管 deepseek-v4-pro(404),空输出直接切下一通道 + if ch_name == "sensenova": + print(f" [LLM] {ch_name} 空输出视为失败,切换下一通道...", flush=True) + last_err = "empty content" + continue if model_name != FALLBACK_MODEL and ch_name.startswith("ocg"): print(f" [LLM] {ch_name} {model_name} 空输出({elapsed:.1f}s)," f"升级 {FALLBACK_MODEL} 重试...", flush=True)