mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-01 17:00:21 +08:00
refactor(claude-code): 移除 TLS 指纹模拟配置,简化上下文构建逻辑
移除 enable_tls_fingerprint 配置项、TLS_PROFILE_CLAUDE_CODE 常量及 resolve_claude_code_tls_profile 函数,TLS profile 改为仅由 fingerprint 的 impersonate 字段决定,简化 build_and_set_claude_code_request_context 返回值为单一 context 对象。
This commit is contained in:
@@ -308,9 +308,6 @@ class ClaudeCodeAdvancedConfig(BaseModel):
|
|||||||
session_idle_timeout_minutes: int | None = Field(
|
session_idle_timeout_minutes: int | None = Field(
|
||||||
None, ge=1, le=1440, description="会话空闲超时(分钟)"
|
None, ge=1, le=1440, description="会话空闲超时(分钟)"
|
||||||
)
|
)
|
||||||
enable_tls_fingerprint: bool = Field(
|
|
||||||
False, description="是否启用 TLS 指纹模拟(模拟 Node.js/Claude Code 客户端)"
|
|
||||||
)
|
|
||||||
session_id_masking_enabled: bool = Field(
|
session_id_masking_enabled: bool = Field(
|
||||||
False, description="是否启用会话 ID 伪装(固定 metadata.user_id 中 session 片段)"
|
False, description="是否启用会话 ID 伪装(固定 metadata.user_id 中 session 片段)"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ DEFAULT_ANTHROPIC_VERSION = "2023-06-01"
|
|||||||
DEFAULT_ACCEPT = "application/json"
|
DEFAULT_ACCEPT = "application/json"
|
||||||
STREAM_HELPER_METHOD = "stream"
|
STREAM_HELPER_METHOD = "stream"
|
||||||
SESSION_ID_MASKING_TTL_SECONDS = 15 * 60
|
SESSION_ID_MASKING_TTL_SECONDS = 15 * 60
|
||||||
# 仅代表“启用 Claude Code TLS 配置”的客户端 profile 标识(best-effort)。
|
|
||||||
TLS_PROFILE_CLAUDE_CODE = "claude_code_nodejs"
|
|
||||||
|
|
||||||
# Claude Code OAuth required betas.
|
# Claude Code OAuth required betas.
|
||||||
BETA_CLAUDE_CODE = "claude-code-20250219"
|
BETA_CLAUDE_CODE = "claude-code-20250219"
|
||||||
@@ -48,5 +46,4 @@ __all__ = [
|
|||||||
"DEFAULT_ANTHROPIC_VERSION",
|
"DEFAULT_ANTHROPIC_VERSION",
|
||||||
"SESSION_ID_MASKING_TTL_SECONDS",
|
"SESSION_ID_MASKING_TTL_SECONDS",
|
||||||
"STREAM_HELPER_METHOD",
|
"STREAM_HELPER_METHOD",
|
||||||
"TLS_PROFILE_CLAUDE_CODE",
|
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ from typing import TYPE_CHECKING, Any
|
|||||||
|
|
||||||
from src.core.logger import logger
|
from src.core.logger import logger
|
||||||
from src.models.admin_requests import ClaudeCodeAdvancedConfig
|
from src.models.admin_requests import ClaudeCodeAdvancedConfig
|
||||||
from src.services.provider.adapters.claude_code.constants import TLS_PROFILE_CLAUDE_CODE
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from src.services.provider.pool.config import PoolConfig
|
from src.services.provider.pool.config import PoolConfig
|
||||||
@@ -22,7 +21,6 @@ class ClaudeCodeRequestContext:
|
|||||||
key_id: str | None = None
|
key_id: str | None = None
|
||||||
max_sessions: int | None = None
|
max_sessions: int | None = None
|
||||||
session_idle_timeout_minutes: int = 5
|
session_idle_timeout_minutes: int = 5
|
||||||
enable_tls_fingerprint: bool = False
|
|
||||||
session_id_masking_enabled: bool = False
|
session_id_masking_enabled: bool = False
|
||||||
cache_ttl_override_enabled: bool = False
|
cache_ttl_override_enabled: bool = False
|
||||||
cache_ttl_override_target: str = "ephemeral"
|
cache_ttl_override_target: str = "ephemeral"
|
||||||
@@ -85,9 +83,6 @@ def build_claude_code_request_context(
|
|||||||
if advanced_config and advanced_config.session_idle_timeout_minutes is not None
|
if advanced_config and advanced_config.session_idle_timeout_minutes is not None
|
||||||
else 5
|
else 5
|
||||||
)
|
)
|
||||||
enable_tls_fingerprint = (
|
|
||||||
bool(advanced_config.enable_tls_fingerprint) if advanced_config else False
|
|
||||||
)
|
|
||||||
session_id_masking_enabled = (
|
session_id_masking_enabled = (
|
||||||
bool(advanced_config.session_id_masking_enabled) if advanced_config else False
|
bool(advanced_config.session_id_masking_enabled) if advanced_config else False
|
||||||
)
|
)
|
||||||
@@ -110,7 +105,6 @@ def build_claude_code_request_context(
|
|||||||
key_id=normalized_key_id,
|
key_id=normalized_key_id,
|
||||||
max_sessions=max_sessions,
|
max_sessions=max_sessions,
|
||||||
session_idle_timeout_minutes=idle_timeout_minutes,
|
session_idle_timeout_minutes=idle_timeout_minutes,
|
||||||
enable_tls_fingerprint=enable_tls_fingerprint,
|
|
||||||
session_id_masking_enabled=session_id_masking_enabled,
|
session_id_masking_enabled=session_id_masking_enabled,
|
||||||
cache_ttl_override_enabled=cache_ttl_override_enabled,
|
cache_ttl_override_enabled=cache_ttl_override_enabled,
|
||||||
cache_ttl_override_target=cache_ttl_override_target,
|
cache_ttl_override_target=cache_ttl_override_target,
|
||||||
@@ -120,22 +114,14 @@ def build_claude_code_request_context(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def resolve_claude_code_tls_profile(
|
|
||||||
ctx: ClaudeCodeRequestContext | None,
|
|
||||||
) -> str | None:
|
|
||||||
if ctx and ctx.enable_tls_fingerprint:
|
|
||||||
return TLS_PROFILE_CLAUDE_CODE
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def build_and_set_claude_code_request_context(
|
def build_and_set_claude_code_request_context(
|
||||||
*,
|
*,
|
||||||
provider_config: Any,
|
provider_config: Any,
|
||||||
key_id: str | None,
|
key_id: str | None,
|
||||||
is_stream: bool,
|
is_stream: bool,
|
||||||
provider_id: str | None = None,
|
provider_id: str | None = None,
|
||||||
) -> tuple[ClaudeCodeRequestContext, str | None]:
|
) -> ClaudeCodeRequestContext:
|
||||||
"""构建并写入 Claude Code 上下文,同时返回对应 TLS profile。"""
|
"""构建并写入 Claude Code 上下文。"""
|
||||||
ctx = build_claude_code_request_context(
|
ctx = build_claude_code_request_context(
|
||||||
provider_config=provider_config,
|
provider_config=provider_config,
|
||||||
key_id=key_id,
|
key_id=key_id,
|
||||||
@@ -143,7 +129,7 @@ def build_and_set_claude_code_request_context(
|
|||||||
provider_id=provider_id,
|
provider_id=provider_id,
|
||||||
)
|
)
|
||||||
set_claude_code_request_context(ctx)
|
set_claude_code_request_context(ctx)
|
||||||
return ctx, resolve_claude_code_tls_profile(ctx)
|
return ctx
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
@@ -151,6 +137,5 @@ __all__ = [
|
|||||||
"build_claude_code_request_context",
|
"build_claude_code_request_context",
|
||||||
"ClaudeCodeRequestContext",
|
"ClaudeCodeRequestContext",
|
||||||
"get_claude_code_request_context",
|
"get_claude_code_request_context",
|
||||||
"resolve_claude_code_tls_profile",
|
|
||||||
"set_claude_code_request_context",
|
"set_claude_code_request_context",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -644,16 +644,16 @@ class ClaudeCodeEnvelope:
|
|||||||
|
|
||||||
set_current_fingerprint(ensure_key_fingerprint(key, persist_if_missing=True))
|
set_current_fingerprint(ensure_key_fingerprint(key, persist_if_missing=True))
|
||||||
|
|
||||||
_ctx, tls_profile = build_and_set_claude_code_request_context(
|
build_and_set_claude_code_request_context(
|
||||||
provider_config=provider_config,
|
provider_config=provider_config,
|
||||||
key_id=key_id,
|
key_id=key_id,
|
||||||
is_stream=is_stream,
|
is_stream=is_stream,
|
||||||
provider_id=provider_id,
|
provider_id=provider_id,
|
||||||
)
|
)
|
||||||
fp = get_current_fingerprint()
|
fp = get_current_fingerprint()
|
||||||
if _ctx.enable_tls_fingerprint and fp:
|
if fp:
|
||||||
return fp.impersonate
|
return fp.impersonate
|
||||||
return tls_profile
|
return None
|
||||||
|
|
||||||
async def post_wrap_request(self, request_body: dict[str, Any]) -> None:
|
async def post_wrap_request(self, request_body: dict[str, Any]) -> None:
|
||||||
await enforce_distributed_session_controls(
|
await enforce_distributed_session_controls(
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ def test_claude_code_prepare_context_prefers_fingerprint_tls_profile() -> None:
|
|||||||
set_current_fingerprint(fp)
|
set_current_fingerprint(fp)
|
||||||
|
|
||||||
tls_profile = claude_code_envelope.prepare_context(
|
tls_profile = claude_code_envelope.prepare_context(
|
||||||
provider_config={"claude_code_advanced": {"enable_tls_fingerprint": True}},
|
provider_config={},
|
||||||
key_id="key-fingerprint-2",
|
key_id="key-fingerprint-2",
|
||||||
is_stream=False,
|
is_stream=False,
|
||||||
provider_id="provider-1",
|
provider_id="provider-1",
|
||||||
|
|||||||
@@ -5,13 +5,11 @@ import uuid
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from src.core.exceptions import ConcurrencyLimitError
|
from src.core.exceptions import ConcurrencyLimitError
|
||||||
from src.services.provider.adapters.claude_code.constants import TLS_PROFILE_CLAUDE_CODE
|
|
||||||
from src.services.provider.adapters.claude_code.context import (
|
from src.services.provider.adapters.claude_code.context import (
|
||||||
ClaudeCodeRequestContext,
|
ClaudeCodeRequestContext,
|
||||||
build_and_set_claude_code_request_context,
|
build_and_set_claude_code_request_context,
|
||||||
build_claude_code_request_context,
|
build_claude_code_request_context,
|
||||||
get_claude_code_request_context,
|
get_claude_code_request_context,
|
||||||
resolve_claude_code_tls_profile,
|
|
||||||
set_claude_code_request_context,
|
set_claude_code_request_context,
|
||||||
)
|
)
|
||||||
from src.services.provider.adapters.claude_code.envelope import claude_code_envelope
|
from src.services.provider.adapters.claude_code.envelope import claude_code_envelope
|
||||||
@@ -35,7 +33,6 @@ def test_build_context_reads_claude_code_advanced_from_provider_config() -> None
|
|||||||
"claude_code_advanced": {
|
"claude_code_advanced": {
|
||||||
"max_sessions": 3,
|
"max_sessions": 3,
|
||||||
"session_idle_timeout_minutes": 7,
|
"session_idle_timeout_minutes": 7,
|
||||||
"enable_tls_fingerprint": True,
|
|
||||||
"session_id_masking_enabled": True,
|
"session_id_masking_enabled": True,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -47,26 +44,23 @@ def test_build_context_reads_claude_code_advanced_from_provider_config() -> None
|
|||||||
assert ctx.key_id == "key-123"
|
assert ctx.key_id == "key-123"
|
||||||
assert ctx.max_sessions == 3
|
assert ctx.max_sessions == 3
|
||||||
assert ctx.session_idle_timeout_minutes == 7
|
assert ctx.session_idle_timeout_minutes == 7
|
||||||
assert ctx.enable_tls_fingerprint is True
|
|
||||||
assert ctx.session_id_masking_enabled is True
|
assert ctx.session_id_masking_enabled is True
|
||||||
|
|
||||||
|
|
||||||
def test_build_and_set_context_returns_tls_profile_when_enabled() -> None:
|
def test_build_and_set_context_stores_context_in_contextvar() -> None:
|
||||||
ctx, tls_profile = build_and_set_claude_code_request_context(
|
ctx = build_and_set_claude_code_request_context(
|
||||||
provider_config={"claude_code_advanced": {"enable_tls_fingerprint": True}},
|
provider_config={},
|
||||||
key_id="key-tls",
|
key_id="key-tls",
|
||||||
is_stream=True,
|
is_stream=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
assert ctx.key_id == "key-tls"
|
assert ctx.key_id == "key-tls"
|
||||||
assert get_claude_code_request_context() == ctx
|
assert get_claude_code_request_context() == ctx
|
||||||
assert tls_profile == TLS_PROFILE_CLAUDE_CODE
|
|
||||||
assert resolve_claude_code_tls_profile(ctx) == TLS_PROFILE_CLAUDE_CODE
|
|
||||||
|
|
||||||
|
|
||||||
def test_get_ssl_context_for_claude_code_profile_is_cached() -> None:
|
def test_get_ssl_context_for_claude_code_profile_is_cached() -> None:
|
||||||
first = get_ssl_context_for_profile(TLS_PROFILE_CLAUDE_CODE)
|
first = get_ssl_context_for_profile("claude_code_nodejs")
|
||||||
second = get_ssl_context_for_profile(TLS_PROFILE_CLAUDE_CODE)
|
second = get_ssl_context_for_profile("claude_code_nodejs")
|
||||||
|
|
||||||
assert first is second
|
assert first is second
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user