diff --git a/crates/brightstaff/src/handlers/function_calling.rs b/crates/brightstaff/src/handlers/function_calling.rs index 0d6c6d3c..ca4def32 100644 --- a/crates/brightstaff/src/handlers/function_calling.rs +++ b/crates/brightstaff/src/handlers/function_calling.rs @@ -762,7 +762,7 @@ impl ArchFunctionHandler { // Keep system message if present if let Some(first) = messages.first() { - if first.role == Role::System { + if first.role == Role::System || first.role == Role::Developer { if let Some(MessageContent::Text(content)) = &first.content { num_tokens += content.len() / 4; // Approximate 4 chars per token } diff --git a/crates/brightstaff/src/router/orchestrator_model_v1.rs b/crates/brightstaff/src/router/orchestrator_model_v1.rs index c6d3d56d..ec4d2d12 100644 --- a/crates/brightstaff/src/router/orchestrator_model_v1.rs +++ b/crates/brightstaff/src/router/orchestrator_model_v1.rs @@ -183,6 +183,7 @@ impl OrchestratorModel for OrchestratorModelV1 { .iter() .filter(|m| { m.role != Role::System + && m.role != Role::Developer && m.role != Role::Tool && !m.content.extract_text().is_empty() }) diff --git a/crates/brightstaff/src/router/router_model_v1.rs b/crates/brightstaff/src/router/router_model_v1.rs index 82a187fd..e1189c94 100644 --- a/crates/brightstaff/src/router/router_model_v1.rs +++ b/crates/brightstaff/src/router/router_model_v1.rs @@ -80,6 +80,7 @@ impl RouterModel for RouterModelV1 { .iter() .filter(|m| { m.role != Role::System + && m.role != Role::Developer && m.role != Role::Tool && !m.content.extract_text().is_empty() }) diff --git a/crates/hermesllm/src/apis/anthropic.rs b/crates/hermesllm/src/apis/anthropic.rs index 3cb06828..4df4bb00 100644 --- a/crates/hermesllm/src/apis/anthropic.rs +++ b/crates/hermesllm/src/apis/anthropic.rs @@ -572,7 +572,9 @@ impl ProviderRequest for MessagesRequest { let mut regular_messages = Vec::new(); for msg in messages { - if msg.role == crate::apis::openai::Role::System { + if msg.role == crate::apis::openai::Role::System + || msg.role == crate::apis::openai::Role::Developer + { system_messages.push(msg.clone()); } else { regular_messages.push(msg.clone()); diff --git a/crates/hermesllm/src/apis/openai.rs b/crates/hermesllm/src/apis/openai.rs index 33f55b29..d22ff756 100644 --- a/crates/hermesllm/src/apis/openai.rs +++ b/crates/hermesllm/src/apis/openai.rs @@ -150,6 +150,7 @@ pub enum Role { User, Assistant, Tool, + Developer, } #[skip_serializing_none] @@ -736,6 +737,7 @@ impl ProviderStreamResponse for ChatCompletionsStreamResponse { Role::User => "user", Role::Assistant => "assistant", Role::Tool => "tool", + Role::Developer => "developer", }) }) } diff --git a/crates/hermesllm/src/transforms/request/from_openai.rs b/crates/hermesllm/src/transforms/request/from_openai.rs index f2e8ab0d..70e69cb8 100644 --- a/crates/hermesllm/src/transforms/request/from_openai.rs +++ b/crates/hermesllm/src/transforms/request/from_openai.rs @@ -97,7 +97,7 @@ impl TryFrom for Vec { MessageRole::User => Role::User, MessageRole::Assistant => Role::Assistant, MessageRole::System => Role::System, - MessageRole::Developer => Role::System, // Map developer to system + MessageRole::Developer => Role::Developer, MessageRole::Tool => Role::Tool, }; @@ -281,7 +281,7 @@ impl TryFrom for MessagesMessage { ]), }); } - Role::System => { + Role::System | Role::Developer => { return Err(TransformError::UnsupportedConversion( "System messages should be handled separately".to_string(), )); @@ -303,7 +303,7 @@ impl TryFrom for BedrockMessage { Role::User => ConversationRole::User, Role::Assistant => ConversationRole::Assistant, Role::Tool => ConversationRole::User, // Tool results become user messages in Bedrock - Role::System => { + Role::System | Role::Developer => { return Err(TransformError::UnsupportedConversion( "System messages should be handled separately in Bedrock".to_string(), )); @@ -452,7 +452,7 @@ impl TryFrom for BedrockMessage { }, }); } - Role::System => { + Role::System | Role::Developer => { // Already handled above with early return unreachable!() } @@ -706,7 +706,7 @@ impl TryFrom for AnthropicMessagesRequest { for message in req.messages { match message.role { - Role::System => { + Role::System | Role::Developer => { system_prompt = Some(message.into()); } _ => { @@ -755,7 +755,7 @@ impl TryFrom for ConverseRequest { for message in req.messages { match message.role { - Role::System => { + Role::System | Role::Developer => { 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..c6d6f86d 100644 --- a/crates/hermesllm/src/transforms/response/to_openai.rs +++ b/crates/hermesllm/src/transforms/response/to_openai.rs @@ -95,6 +95,7 @@ impl TryFrom for ResponsesAPIResponse { Role::Assistant => "assistant".to_string(), Role::System => "system".to_string(), Role::Tool => "tool".to_string(), + Role::Developer => "developer".to_string(), }, content, });