diff --git a/crates/brightstaff/src/handlers/function_calling.rs b/crates/brightstaff/src/handlers/function_calling.rs index 8f641df6..163ef6f0 100644 --- a/crates/brightstaff/src/handlers/function_calling.rs +++ b/crates/brightstaff/src/handlers/function_calling.rs @@ -649,6 +649,7 @@ impl ArchFunctionHandler { for (idx, message) in messages.iter().enumerate() { let mut role = message.role.clone(); let mut content = match &message.content { + MessageContent::Null => String::new(), MessageContent::Text(text) => text.clone(), MessageContent::Parts(_) => String::new(), }; diff --git a/crates/hermesllm/src/apis/openai.rs b/crates/hermesllm/src/apis/openai.rs index 834c33ec..278d2053 100644 --- a/crates/hermesllm/src/apis/openai.rs +++ b/crates/hermesllm/src/apis/openai.rs @@ -219,6 +219,7 @@ impl ResponseMessage { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(untagged)] pub enum MessageContent { + Null, Text(String), Parts(Vec), } @@ -227,6 +228,7 @@ pub enum MessageContent { impl ExtractText for MessageContent { fn extract_text(&self) -> String { match self { + MessageContent::Null => String::new(), MessageContent::Text(text) => text.clone(), MessageContent::Parts(parts) => parts.extract_text(), } @@ -248,6 +250,7 @@ impl ExtractText for Vec { impl Display for MessageContent { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { + MessageContent::Null => write!(f, ""), MessageContent::Text(text) => write!(f, "{}", text), MessageContent::Parts(parts) => { let text_parts: Vec = parts @@ -624,6 +627,7 @@ impl ProviderRequest for ChatCompletionsRequest { self.messages.iter().fold(String::new(), |acc, m| { acc + " " + &match &m.content { + MessageContent::Null => String::new(), MessageContent::Text(text) => text.clone(), MessageContent::Parts(parts) => parts .iter() @@ -640,6 +644,7 @@ impl ProviderRequest for ChatCompletionsRequest { fn get_recent_user_message(&self) -> Option { self.messages.last().and_then(|msg| { match &msg.content { + MessageContent::Null => None, MessageContent::Text(text) => Some(text.clone()), MessageContent::Parts(_) => None, // No user message in parts } diff --git a/crates/hermesllm/src/transforms/lib.rs b/crates/hermesllm/src/transforms/lib.rs index a44f8d79..13d2dac3 100644 --- a/crates/hermesllm/src/transforms/lib.rs +++ b/crates/hermesllm/src/transforms/lib.rs @@ -188,6 +188,7 @@ pub fn convert_openai_message_to_anthropic_content( // Handle regular content match &message.content { + MessageContent::Null => {} MessageContent::Text(text) => { if !text.is_empty() { blocks.push(MessagesContentBlock::Text { diff --git a/crates/hermesllm/src/transforms/request/from_openai.rs b/crates/hermesllm/src/transforms/request/from_openai.rs index e39cfed3..0667f53a 100644 --- a/crates/hermesllm/src/transforms/request/from_openai.rs +++ b/crates/hermesllm/src/transforms/request/from_openai.rs @@ -174,10 +174,7 @@ impl TryFrom for Vec { impl From for MessagesSystemPrompt { fn from(val: Message) -> Self { - let system_text = match val.content { - MessageContent::Text(text) => text, - MessageContent::Parts(parts) => parts.extract_text(), - }; + let system_text = val.content.extract_text(); MessagesSystemPrompt::Single(system_text) } } @@ -248,6 +245,7 @@ impl TryFrom for BedrockMessage { Role::User => { // Convert user message content to content blocks match message.content { + MessageContent::Null => {} MessageContent::Text(text) => { if !text.is_empty() { content_blocks.push(ContentBlock::Text { text }); @@ -550,10 +548,7 @@ impl TryFrom for ConverseRequest { for message in req.messages { match message.role { Role::System => { - let system_text = match message.content { - MessageContent::Text(text) => text, - MessageContent::Parts(parts) => parts.extract_text(), - }; + let system_text = message.content.extract_text(); system_messages.push(SystemContentBlock::Text { text: system_text }); } _ => { diff --git a/crates/hermesllm/src/transforms/response/to_openai.rs b/crates/hermesllm/src/transforms/response/to_openai.rs index 9e3276c9..7848e6b9 100644 --- a/crates/hermesllm/src/transforms/response/to_openai.rs +++ b/crates/hermesllm/src/transforms/response/to_openai.rs @@ -209,6 +209,7 @@ impl TryFrom for ChatCompletionsResponse { // Convert MessageContent to String for response let content_string = match content { + MessageContent::Null => None, MessageContent::Text(text) => Some(text), MessageContent::Parts(parts) => { let text = parts.extract_text();