转换 OpenAI 请求为上游格式。
(
self,
request: OpenAIRequest,
excluded_tokens: Optional[Set[str]] = None,
excluded_guest_user_ids: Optional[Set[str]] = None,
)
| 1298 | return None |
| 1299 | |
| 1300 | async def transform_request( |
| 1301 | self, |
| 1302 | request: OpenAIRequest, |
| 1303 | excluded_tokens: Optional[Set[str]] = None, |
| 1304 | excluded_guest_user_ids: Optional[Set[str]] = None, |
| 1305 | ) -> Dict[str, Any]: |
| 1306 | """转换 OpenAI 请求为上游格式。""" |
| 1307 | self.logger.info(f"🔄 转换 OpenAI 请求到上游格式: {request.model}") |
| 1308 | |
| 1309 | raw_messages = [ |
| 1310 | message.model_dump(exclude_none=True) |
| 1311 | for message in request.messages |
| 1312 | ] |
| 1313 | normalized_messages = _preprocess_openai_messages(raw_messages) |
| 1314 | |
| 1315 | auth_info = await self.get_auth_info( |
| 1316 | excluded_tokens=excluded_tokens, |
| 1317 | excluded_guest_user_ids=excluded_guest_user_ids, |
| 1318 | ) |
| 1319 | token = str(auth_info.get("token") or "") |
| 1320 | if not token: |
| 1321 | raise RuntimeError("无法获取上游认证令牌") |
| 1322 | |
| 1323 | user_id = str(auth_info.get("user_id") or _extract_user_id_from_token(token)) |
| 1324 | auth_mode = str(auth_info.get("auth_mode") or "authenticated") |
| 1325 | token_source = str(auth_info.get("token_source") or "unknown") |
| 1326 | guest_user_id = auth_info.get("guest_user_id") |
| 1327 | # 确定请求的模型特性 |
| 1328 | last_user_text = _extract_last_user_text(raw_messages) |
| 1329 | requested_model = request.model |
| 1330 | is_thinking_model = "-thinking" in requested_model.casefold() |
| 1331 | is_search_model = "-search" in requested_model.casefold() |
| 1332 | is_advanced_search = requested_model == settings.GLM47_ADVANCED_SEARCH_MODEL |
| 1333 | upstream_model_id = self.model_mapping.get(requested_model, "0727-360B-API") |
| 1334 | tools = request.tools if settings.TOOL_SUPPORT and request.tools else None |
| 1335 | tool_choice = getattr(request, "tool_choice", None) |
| 1336 | model_profile = self._get_model_request_profile(upstream_model_id) |
| 1337 | enable_thinking = request.enable_thinking |
| 1338 | if enable_thinking is None: |
| 1339 | default_enable_thinking = model_profile["default_enable_thinking"] |
| 1340 | enable_thinking = ( |
| 1341 | default_enable_thinking |
| 1342 | if default_enable_thinking is not None |
| 1343 | else is_thinking_model |
| 1344 | ) |
| 1345 | |
| 1346 | web_search = request.web_search |
| 1347 | if web_search is None: |
| 1348 | web_search = is_search_model or is_advanced_search |
| 1349 | |
| 1350 | use_persisted_chat = bool(model_profile["use_persisted_chat"]) |
| 1351 | preview_mode = bool(model_profile["preview_mode"]) |
| 1352 | feature_entries = list(model_profile["feature_entries"]) |
| 1353 | persisted_user_message_id = generate_uuid() if use_persisted_chat else None |
| 1354 | persisted_assistant_message_id = generate_uuid() if use_persisted_chat else None |
| 1355 | |
| 1356 | mcp_servers = list(model_profile["mcp_servers"]) |
| 1357 | if is_advanced_search and "advanced-search" not in mcp_servers: |