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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user