feat: 格式转换支持三层开关控制(全局/Provider/端点)

- _get_convertible_formats 始终返回所有可转换格式,由下游精确过滤
- get_compatible_provider_formats 增加 Provider 级别 enable_format_conversion 判断
- Provider 设置更新后自动失效相关缓存(模型列表、解析缓存、Provider 缓存)
- 前端 toggleFormatConversion 使用接口返回的完整对象更新本地状态
This commit is contained in:
fawney19
2026-02-06 23:01:56 +08:00
parent a1ea060cd9
commit 18d0af3dbf
5 changed files with 43 additions and 15 deletions

View File

@@ -80,19 +80,15 @@ def _is_format_conversion_enabled(db: Session) -> bool:
return SystemConfigService.is_format_conversion_enabled(db)
def _get_convertible_formats(client_format: str, global_conversion_enabled: bool) -> list[str]:
def _get_convertible_formats(client_format: str) -> list[str]:
"""
获取客户端格式可转换到的所有目标格式列表
当启用格式转换时,返回所有可以转换的格式
否则只返回客户端格式本身(不包括同族的其他格式)
始终返回所有转换的格式(包括客户端格式本身),
由下游 get_compatible_provider_formats 按三层开关(全局/Provider/端点)精确过滤
"""
client_format_norm = normalize_endpoint_signature(client_format)
# 格式转换关闭时,只返回客户端格式本身
if not global_conversion_enabled:
return [client_format_norm]
# 收集所有可转换的格式
register_default_normalizers()
convertible_formats: list[str] = []
@@ -501,7 +497,7 @@ async def list_models(
# 获取可用格式(包括可转换的格式)
global_conversion_enabled = _is_format_conversion_enabled(db)
candidate_formats = _get_convertible_formats(api_format, global_conversion_enabled)
candidate_formats = _get_convertible_formats(api_format)
candidate_formats, empty_response = _filter_formats_by_restrictions(
candidate_formats, restrictions, api_format
)
@@ -605,7 +601,7 @@ async def retrieve_model(
# 获取可用格式(包括可转换的格式)
global_conversion_enabled = _is_format_conversion_enabled(db)
candidate_formats = _get_convertible_formats(api_format, global_conversion_enabled)
candidate_formats = _get_convertible_formats(api_format)
candidate_formats, _ = _filter_formats_by_restrictions(
candidate_formats, restrictions, api_format
)
@@ -688,7 +684,7 @@ async def list_models_gemini(
# 获取可用格式(包括可转换的格式)
global_conversion_enabled = _is_format_conversion_enabled(db)
candidate_formats = _get_convertible_formats(api_format, global_conversion_enabled)
candidate_formats = _get_convertible_formats(api_format)
candidate_formats, empty_response = _filter_formats_by_restrictions(
candidate_formats, restrictions, api_format
)
@@ -767,7 +763,7 @@ async def get_model_gemini(
# 获取可用格式(包括可转换的格式)
global_conversion_enabled = _is_format_conversion_enabled(db)
candidate_formats = _get_convertible_formats(api_format, global_conversion_enabled)
candidate_formats = _get_convertible_formats(api_format)
candidate_formats, _ = _filter_formats_by_restrictions(
candidate_formats, restrictions, api_format
)