From 1755b67937c07670bef0f4c2daed564f3c57b4e9 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Mon, 22 Sep 2025 16:40:56 -0400 Subject: [PATCH] language_models: Treat a `block_reason` from Gemini as a refusal (#38670) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR updates the Gemini provider to treat a `prompt_feedback.block_reason` as a refusal, as Gemini does not seem to return a `stop_reason` to use in this case. Screenshot 2025-09-22 at 4 23 15 PM Previously this would just result in no feedback to the user. Release Notes: - Added an error message when a Gemini response contains a `block_reason`. --- crates/language_models/src/provider/google.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/crates/language_models/src/provider/google.rs b/crates/language_models/src/provider/google.rs index 140968b917db497a04c4185857d6a44da0003a65..8046c769c426670fee8220a0f59ed2dd2b5c5b58 100644 --- a/crates/language_models/src/provider/google.rs +++ b/crates/language_models/src/provider/google.rs @@ -637,6 +637,24 @@ impl GoogleEventMapper { convert_usage(&self.usage), ))) } + + if let Some(prompt_feedback) = event.prompt_feedback + && let Some(block_reason) = prompt_feedback.block_reason.as_deref() + { + self.stop_reason = match block_reason { + "SAFETY" | "OTHER" | "BLOCKLIST" | "PROHIBITED_CONTENT" | "IMAGE_SAFETY" => { + StopReason::Refusal + } + _ => { + log::error!("Unexpected Google block_reason: {block_reason}"); + StopReason::Refusal + } + }; + events.push(Ok(LanguageModelCompletionEvent::Stop(self.stop_reason))); + + return events; + } + if let Some(candidates) = event.candidates { for candidate in candidates { if let Some(finish_reason) = candidate.finish_reason.as_deref() {