diff --git a/src/llm/bedrock.rs b/src/llm/bedrock.rs index c8143d01..25bac21b 100644 --- a/src/llm/bedrock.rs +++ b/src/llm/bedrock.rs @@ -59,7 +59,17 @@ impl BedrockClient { let mut messages_limited = Vec::new(); if let Some(msg_array) = raw_messages.as_array() { for msg in msg_array { - messages_limited.push(msg.clone()); + let role = msg.get("role").and_then(|r| r.as_str()).unwrap_or("user"); + let normalized_role = match role { + "user" | "assistant" | "system" | "developer" | "tool" => role, + "episodic" | "compact" => "system", + _ => "user", + }; + let mut new_msg = msg.clone(); + if let Some(obj) = new_msg.as_object_mut() { + obj.insert("role".to_string(), serde_json::json!(normalized_role)); + } + messages_limited.push(new_msg); } } Value::Array(messages_limited) diff --git a/src/llm/vertex.rs b/src/llm/vertex.rs index 7ba5e9ea..3cbd739e 100644 --- a/src/llm/vertex.rs +++ b/src/llm/vertex.rs @@ -231,8 +231,10 @@ impl VertexClient { let content = msg.get("content").and_then(|c| c.as_str()).unwrap_or(""); let gemini_role = match role { + "user" => "user", "assistant" => "model", - "system" => "user", // Gemini doesn't have system role in 'contents' by default, often wrapped in systemInstruction + "system" | "episodic" | "compact" => "user", + "tool" => "user", _ => "user", };