feat: SenseNova高速通道(key从hermes config读,不落盘)

- token.sensenova.cn托管同款deepseek-v4-flash,实测3.2s vs OCG 45s(开盘高峰)
- 通道顺序: sensenova→OCG key池→gateway; 空输出直接切下一通道(SN无pro)
This commit is contained in:
hmo
2026-07-24 09:18:15 +08:00
parent a559fc84dd
commit 1cdef8da7e
+37 -1
View File
@@ -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-24OCG开盘高峰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-pro404),空输出直接切下一通道
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)