From 5fbb7b0d40c636f19fe912fb873866cab45b1527 Mon Sep 17 00:00:00 2001 From: Umesh Yadav <23421535+imumesh18@users.noreply.github.com> Date: Sat, 28 Jun 2025 01:07:26 +0530 Subject: [PATCH] copilot: Only set Copilot-Vision-Request header for vision requests (#33552) Closes #31951 The fix is copied and translated from copilot chat actual implementation code: https://github.com/microsoft/vscode-copilot-chat/blob/ad7cbcae9a964e8efb869bf1426999e56ea63cf0/src/platform/openai/node/fetch.ts#L493C1-L495C3 Release Notes: - Fix copilot failing due to missing `Copilot-Vision-Request` from request. --- crates/copilot/src/copilot_chat.rs | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/crates/copilot/src/copilot_chat.rs b/crates/copilot/src/copilot_chat.rs index 19cff56c911b2d85f91b5075f238f8320f846e3f..b1fa1565f30ed79fdff763964708fe01c62d023f 100644 --- a/crates/copilot/src/copilot_chat.rs +++ b/crates/copilot/src/copilot_chat.rs @@ -698,16 +698,16 @@ async fn stream_completion( completion_url: Arc, request: Request, ) -> Result>> { - let is_vision_request = request.messages.last().map_or(false, |message| match message { - ChatMessage::User { content } - | ChatMessage::Assistant { content, .. } - | ChatMessage::Tool { content, .. } => { - matches!(content, ChatMessageContent::Multipart(parts) if parts.iter().any(|part| matches!(part, ChatMessagePart::Image { .. }))) - } - _ => false, - }); - - let request_builder = HttpRequest::builder() + let is_vision_request = request.messages.iter().any(|message| match message { + ChatMessage::User { content } + | ChatMessage::Assistant { content, .. } + | ChatMessage::Tool { content, .. } => { + matches!(content, ChatMessageContent::Multipart(parts) if parts.iter().any(|part| matches!(part, ChatMessagePart::Image { .. }))) + } + _ => false, + }); + + let mut request_builder = HttpRequest::builder() .method(Method::POST) .uri(completion_url.as_ref()) .header( @@ -719,8 +719,12 @@ async fn stream_completion( ) .header("Authorization", format!("Bearer {}", api_key)) .header("Content-Type", "application/json") - .header("Copilot-Integration-Id", "vscode-chat") - .header("Copilot-Vision-Request", is_vision_request.to_string()); + .header("Copilot-Integration-Id", "vscode-chat"); + + if is_vision_request { + request_builder = + request_builder.header("Copilot-Vision-Request", is_vision_request.to_string()); + } let is_streaming = request.stream;