(&self, request: ChatRequest)
| 474 | } |
| 475 | |
| 476 | async fn chat(&self, request: ChatRequest) -> Result<ChatResponse, ProviderError> { |
| 477 | if select_copilot_route(&request.model) == CopilotRoute::Responses { |
| 478 | let response_model = self.responses_model(&request.model); |
| 479 | let options = self.responses_generate_options(&request); |
| 480 | let request_for_primary = request.clone(); |
| 481 | let model_for_log = request.model.clone(); |
| 482 | return resolve_with_fallback( |
| 483 | async move { |
| 484 | response_model |
| 485 | .do_generate(options) |
| 486 | .await |
| 487 | .map(|result| Self::responses_chat_response(&request_for_primary, result)) |
| 488 | }, |
| 489 | move |err| async move { |
| 490 | if get_custom_fetch_proxy("github-copilot").is_some() { |
| 491 | tracing::warn!( |
| 492 | model = %model_for_log, |
| 493 | error = %err, |
| 494 | "Copilot responses generate failed while custom fetch proxy is active; skipping legacy fallback" |
| 495 | ); |
| 496 | return Err(err); |
| 497 | } |
| 498 | tracing::warn!( |
| 499 | model = %model_for_log, |
| 500 | error = %err, |
| 501 | "Copilot responses generate failed, falling back to chat completions" |
| 502 | ); |
| 503 | self.chat_legacy(request).await |
| 504 | }, |
| 505 | ) |
| 506 | .await; |
| 507 | } |
| 508 | |
| 509 | self.chat_legacy(request).await |
| 510 | } |
| 511 | |
| 512 | async fn chat_stream(&self, request: ChatRequest) -> Result<StreamResult, ProviderError> { |
| 513 | if select_copilot_route(&request.model) == CopilotRoute::Responses { |
nothing calls this directly
no test coverage detected