(&self, request: ChatRequest)
| 990 | } |
| 991 | |
| 992 | async fn chat(&self, request: ChatRequest) -> Result<ChatResponse, ProviderError> { |
| 993 | // Skip Responses API for OpenAI-compatible providers (non-OpenAI endpoints) |
| 994 | if self.prefers_legacy_route() { |
| 995 | return self.chat_legacy(request).await; |
| 996 | } |
| 997 | |
| 998 | let response_model = self.responses_model(&request.model); |
| 999 | let options = self.responses_generate_options(&request); |
| 1000 | let request_for_primary = request.clone(); |
| 1001 | let model_for_log = request.model.clone(); |
| 1002 | resolve_with_fallback( |
| 1003 | async move { |
| 1004 | response_model |
| 1005 | .do_generate(options) |
| 1006 | .await |
| 1007 | .map(|result| Self::responses_chat_response(&request_for_primary, result)) |
| 1008 | }, |
| 1009 | move |err| async move { |
| 1010 | if get_custom_fetch_proxy("openai").is_some() { |
| 1011 | tracing::warn!( |
| 1012 | model = %model_for_log, |
| 1013 | error = %err, |
| 1014 | "Responses generate failed while custom fetch proxy is active; skipping legacy fallback" |
| 1015 | ); |
| 1016 | return Err(err); |
| 1017 | } |
| 1018 | tracing::warn!( |
| 1019 | model = %model_for_log, |
| 1020 | error = %err, |
| 1021 | "Responses generate failed, falling back to chat completions" |
| 1022 | ); |
| 1023 | self.chat_legacy(request).await |
| 1024 | }, |
| 1025 | ) |
| 1026 | .await |
| 1027 | } |
| 1028 | |
| 1029 | async fn chat_stream(&self, request: ChatRequest) -> Result<StreamResult, ProviderError> { |
| 1030 | // Skip Responses API for OpenAI-compatible providers (non-OpenAI endpoints) |
nothing calls this directly
no test coverage detected