Merge pull request #751 from ZYDMYHZ/feat/api-key-header

feat(llmcore): support api_key_header override for NativeClaudeSession
This commit is contained in:
LJQ authored and GitHub committed 2026-08-20 10:52:02 +08:00
commit f6928e0101
2 files changed
+24 -1

No files matched your search

+4 -1
View File
@@ -762,6 +762,7 @@ class NativeClaudeSession(BaseSession):
self._device_id = uuid.uuid4().hex + uuid.uuid4().hex[:32]
self.tools = None
if self.user_agent == self.default_ua: self.user_agent = self.native_ua
self.api_key_header = str(cfg.get('api_key_header', 'auto')).strip().lower()
def raw_ask(self, messages):
if self.max_tokens is None: self.max_tokens = 8192
model = self.model
@@ -775,7 +776,9 @@ class NativeClaudeSession(BaseSession):
"anthropic-beta": ",".join(beta_parts), "anthropic-dangerous-direct-browser-access": "true",
"user-agent": self.user_agent, "x-app": "cli"}
headers.update({"Accept": "application/json", "X-Claude-Code-Session-Id": self._session_id, "X-Stainless-Arch": "x64", "X-Stainless-Lang": "js", "X-Stainless-OS": "Windows", "X-Stainless-Package-Version": "0.94.0", "X-Stainless-Retry-Count": "0", "X-Stainless-Runtime": "node", "X-Stainless-Runtime-Version": "v24.3.0", "X-Stainless-Timeout": "600"})
if self.api_key.startswith("sk-ant-"): headers["x-api-key"] = self.api_key
if self.api_key_header == 'x-api-key': headers["x-api-key"] = self.api_key
elif self.api_key_header == 'bearer': headers["authorization"] = f"Bearer {self.api_key}"
elif self.api_key.startswith("sk-ant-"): headers["x-api-key"] = self.api_key
else: headers["authorization"] = f"Bearer {self.api_key}"
payload = {"model": model, "messages": messages, "max_tokens": self.max_tokens, "stream": self.stream}
#if self.fake_cc_system_prompt: payload["max_tokens"] = 64000
+20
View File
@@ -189,6 +189,26 @@ mixin_config = {
# # 'fake_cc_system_prompt': False, # bool 默认 False;真 Anthropic 端点不需开
# }
# ── 1b′. Anthropic Messages 端点 + 手动指定鉴权头(api_key_header)──────────────
# 某些中转渠道(如 opencode.ai)提供 Anthropic /v1/messages 端点,但 apikey 非
# sk-ant- 前缀。NativeClaudeSession 对非 sk-ant- 的 key 默认发 Authorization: Bearer;
# 若目标端点只接受 x-api-key(如 opencode.ai 的 /v1/messages 只认 x-api-key,
# Bearer 会返回 401 Missing API key),用 api_key_header 手动强制鉴权头。
# api_key_header 合法值: 'auto'(默认,按 sk-ant- 前缀自动判断)
# / 'x-api-key'(强制 x-api-key 头)
# / 'bearer'(强制 Authorization: Bearer 头)
# native_claude_config_opencode = {
# 'name': 'opencode-deepseek-native',
# 'apikey': '<your-key>', # 非 sk-ant- 前缀
# 'apibase': 'https://opencode.ai/zen/go/v1',
# 'model': 'deepseek-v4-flash',
# 'api_key_header': 'x-api-key', # ← 强制 x-api-key(否则 auto 发 Bearer→401)
# 'thinking_type': 'adaptive',
# 'reasoning_effort': 'low',
# 'max_retries': 5,
# 'read_timeout': 180,
# }
# ── 1c. CRS 反代 Claude Max ─────────────────────────────────────────────────
# CRS 需要 fake_cc_system_prompt=True
# native_claude_config_crs = {