refactor(proxy): 端点检查统一使用 proxy_config 替代 proxy_param

将 endpoint_checker、handler_adapter_base、gemini adapter 及
provider_query 中的 proxy_param 参数替换为 proxy_config,
通过 build_proxy_client_kwargs 统一构建代理客户端参数,
以支持 tunnel 模式代理。同时清理未使用的 import。
This commit is contained in:
fawney19
2026-02-27 22:41:31 +08:00
parent 8de2f41924
commit 5bfaee47cc
4 changed files with 15 additions and 25 deletions

View File

@@ -9,7 +9,6 @@ import asyncio
import json import json
from typing import Any from typing import Any
import httpx
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel from pydantic import BaseModel
from sqlalchemy.orm import Session, joinedload from sqlalchemy.orm import Session, joinedload
@@ -36,7 +35,7 @@ from src.services.model.upstream_fetcher import (
get_adapter_for_format, get_adapter_for_format,
) )
from src.services.provider.oauth_token import resolve_oauth_access_token from src.services.provider.oauth_token import resolve_oauth_access_token
from src.services.proxy_node.resolver import resolve_effective_proxy, resolve_proxy_param from src.services.proxy_node.resolver import resolve_effective_proxy
from src.utils.auth_utils import get_current_user from src.utils.auth_utils import get_current_user
router = APIRouter(prefix="/api/admin/provider-query", tags=["Provider Query"]) router = APIRouter(prefix="/api/admin/provider-query", tags=["Provider Query"])
@@ -807,7 +806,6 @@ async def test_model(
test_proxy = resolve_effective_proxy( test_proxy = resolve_effective_proxy(
getattr(provider, "proxy", None), getattr(api_key, "proxy", None) getattr(provider, "proxy", None), getattr(api_key, "proxy", None)
) )
test_proxy_param = resolve_proxy_param(test_proxy)
logger.debug("[test-model] 开始端点测试...") logger.debug("[test-model] 开始端点测试...")
@@ -832,7 +830,7 @@ async def test_model(
auth_type=auth_type, auth_type=auth_type,
provider_type=p_type if p_type else None, provider_type=p_type if p_type else None,
decrypted_auth_config=oauth_meta if oauth_meta else None, decrypted_auth_config=oauth_meta if oauth_meta else None,
proxy_param=test_proxy_param, proxy_config=test_proxy,
) )
def _response_has_error(resp: dict) -> bool: def _response_has_error(resp: dict) -> bool:

View File

@@ -32,7 +32,6 @@ from src.core.api_format import (
redact_headers_for_log, redact_headers_for_log,
) )
from src.core.logger import logger from src.core.logger import logger
from src.utils.ssl_utils import get_ssl_context
def _redact_headers(headers: dict[str, str]) -> dict[str, str]: def _redact_headers(headers: dict[str, str]) -> dict[str, str]:
@@ -73,7 +72,7 @@ async def run_endpoint_check(
provider_id: str | None = None, provider_id: str | None = None,
db: Any | None = None, # Session对象需要时才导入 db: Any | None = None, # Session对象需要时才导入
user: Any | None = None, # User对象 user: Any | None = None, # User对象
proxy_param: Any | None = None, # httpx 可接受的代理参数 proxy_config: dict[str, Any] | None = None, # 原始代理配置(支持 tunnel 模式)
) -> dict[str, Any]: ) -> dict[str, Any]:
""" """
执行端点检查(重构版本,使用新的架构): 执行端点检查(重构版本,使用新的架构):
@@ -95,7 +94,7 @@ async def run_endpoint_check(
db=db, db=db,
user=user, user=user,
request_id=str(uuid.uuid4())[:8], request_id=str(uuid.uuid4())[:8],
proxy_param=proxy_param, proxy_config=proxy_config,
) )
# 使用协调器执行检查 # 使用协调器执行检查
@@ -567,7 +566,7 @@ class EndpointCheckRequest:
user: Any | None = None user: Any | None = None
request_id: str | None = None request_id: str | None = None
timeout: float = 30.0 timeout: float = 30.0
proxy_param: Any | None = None # httpx 可接受的代理参数 proxy_config: dict[str, Any] | None = None # 原始代理配置(支持 tunnel 模式)
@dataclass @dataclass
@@ -600,17 +599,10 @@ class HttpRequestExecutor:
try: try:
from src.services.proxy_node.resolver import build_proxy_client_kwargs from src.services.proxy_node.resolver import build_proxy_client_kwargs
if request.proxy_param is not None: # 统一通过 build_proxy_client_kwargs 构建(支持 tunnel 模式 + 普通代理 + 系统默认回退)
# 调用方已提供解析好的代理参数,直接使用(跳过系统默认回退) client_kwargs = build_proxy_client_kwargs(
client_kwargs: dict[str, Any] = { proxy_config=request.proxy_config, timeout=self.timeout
"timeout": self.timeout, )
"verify": get_ssl_context(),
}
if request.proxy_param:
client_kwargs["proxy"] = request.proxy_param
else:
# 未提供代理参数,通过 build_proxy_client_kwargs 统一解析(含系统默认回退)
client_kwargs = build_proxy_client_kwargs(timeout=self.timeout)
async with httpx.AsyncClient(**client_kwargs) as client: async with httpx.AsyncClient(**client_kwargs) as client:
if is_stream: if is_stream:

View File

@@ -338,8 +338,8 @@ class HandlerAdapterBase(ApiAdapter):
auth_type: str | None = None, auth_type: str | None = None,
provider_type: str | None = None, provider_type: str | None = None,
decrypted_auth_config: dict[str, Any] | None = None, decrypted_auth_config: dict[str, Any] | None = None,
# 代理参数 # 代理配置
proxy_param: Any | None = None, proxy_config: dict[str, Any] | None = None,
) -> dict[str, Any]: ) -> dict[str, Any]:
""" """
测试模型连接性(非流式) 测试模型连接性(非流式)
@@ -485,7 +485,7 @@ class HandlerAdapterBase(ApiAdapter):
provider_id=provider_id, provider_id=provider_id,
api_key_id=api_key_id, api_key_id=api_key_id,
model_name=effective_model_name, model_name=effective_model_name,
proxy_param=proxy_param, proxy_config=proxy_config,
) )
# ========================================================================= # =========================================================================

View File

@@ -275,8 +275,8 @@ class GeminiChatAdapter(ChatAdapterBase):
auth_type: str | None = None, auth_type: str | None = None,
provider_type: str | None = None, provider_type: str | None = None,
decrypted_auth_config: dict[str, Any] | None = None, decrypted_auth_config: dict[str, Any] | None = None,
# 代理参数(已解析,直接传递给 run_endpoint_check # 代理配置
proxy_param: Any | None = None, proxy_config: dict[str, Any] | None = None,
) -> dict[str, Any]: ) -> dict[str, Any]:
"""测试 Gemini API 模型连接性(非流式)""" """测试 Gemini API 模型连接性(非流式)"""
from src.api.handlers.base.endpoint_checker import run_endpoint_check from src.api.handlers.base.endpoint_checker import run_endpoint_check
@@ -371,7 +371,7 @@ class GeminiChatAdapter(ChatAdapterBase):
provider_id=provider_id, provider_id=provider_id,
api_key_id=api_key_id, api_key_id=api_key_id,
model_name=effective_model_name, model_name=effective_model_name,
proxy_param=proxy_param, proxy_config=proxy_config,
) )