fix(google): preserve thought signatures in streaming responses (#6708)
Signed-off-by: rabi <ramishra@redhat.com>
This commit is contained in:
@@ -252,12 +252,13 @@ pub fn process_response_part(
|
|||||||
part: &Value,
|
part: &Value,
|
||||||
last_signature: &mut Option<String>,
|
last_signature: &mut Option<String>,
|
||||||
) -> Option<MessageContent> {
|
) -> Option<MessageContent> {
|
||||||
// Gemini 2.5 models include thoughtSignature on the first streaming chunk
|
let has_signature = part.get(THOUGHT_SIGNATURE_KEY).is_some();
|
||||||
process_response_part_impl(
|
let handling = if has_signature {
|
||||||
part,
|
SignedTextHandling::SignedTextAsThinking
|
||||||
last_signature,
|
} else {
|
||||||
SignedTextHandling::SignedTextAsRegularText,
|
SignedTextHandling::SignedTextAsRegularText
|
||||||
)
|
};
|
||||||
|
process_response_part_impl(part, last_signature, handling)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process_response_part_non_streaming(
|
fn process_response_part_non_streaming(
|
||||||
@@ -1116,17 +1117,26 @@ mod tests {
|
|||||||
let mut message_stream = std::pin::pin!(response_to_streaming_message(stream));
|
let mut message_stream = std::pin::pin!(response_to_streaming_message(stream));
|
||||||
|
|
||||||
let mut text_parts = Vec::new();
|
let mut text_parts = Vec::new();
|
||||||
|
let mut thinking_parts = Vec::new();
|
||||||
|
|
||||||
while let Some(result) = message_stream.next().await {
|
while let Some(result) = message_stream.next().await {
|
||||||
let (message, _usage) = result.unwrap();
|
let (message, _usage) = result.unwrap();
|
||||||
if let Some(msg) = message {
|
if let Some(msg) = message {
|
||||||
if let Some(MessageContent::Text(text)) = msg.content.first() {
|
match msg.content.first() {
|
||||||
text_parts.push(text.text.clone());
|
Some(MessageContent::Text(text)) => {
|
||||||
|
text_parts.push(text.text.clone());
|
||||||
|
}
|
||||||
|
Some(MessageContent::Thinking(thinking)) => {
|
||||||
|
thinking_parts.push(thinking.thinking.clone());
|
||||||
|
assert_eq!(thinking.signature, "sig123");
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_eq!(text_parts, vec!["Begin", " middle", " end"]);
|
assert_eq!(thinking_parts, vec!["Begin"]);
|
||||||
|
assert_eq!(text_parts, vec![" middle", " end"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
|
|||||||
Reference in New Issue
Block a user