diff --git a/crates/language_models/src/provider/mistral.rs b/crates/language_models/src/provider/mistral.rs index 6af66f4e9a9d257b385c84a6c0c6d989f04c013f..338931cf7ca902225e10a7d09c9e7528128f1491 100644 --- a/crates/language_models/src/provider/mistral.rs +++ b/crates/language_models/src/provider/mistral.rs @@ -512,6 +512,13 @@ pub fn into_mistral( model: model.id().to_string(), messages, stream, + stream_options: if stream { + Some(mistral::StreamOptions { + stream_tool_calls: Some(true), + }) + } else { + None + }, max_tokens: max_output_tokens, temperature: request.temperature, response_format: None, @@ -620,12 +627,16 @@ impl MistralEventMapper { for tool_call in tool_calls { let entry = self.tool_calls_by_index.entry(tool_call.index).or_default(); - if let Some(tool_id) = tool_call.id.clone() { + if let Some(tool_id) = tool_call.id.clone() + && !tool_id.is_empty() + { entry.id = tool_id; } if let Some(function) = tool_call.function.as_ref() { - if let Some(name) = function.name.clone() { + if let Some(name) = function.name.clone() + && !name.is_empty() + { entry.name = name; } diff --git a/crates/mistral/src/mistral.rs b/crates/mistral/src/mistral.rs index cc9f94304d989c69c3f5a4bd3763704314564a19..0244f904468a5eb3e03b520a2687b31a1168f52b 100644 --- a/crates/mistral/src/mistral.rs +++ b/crates/mistral/src/mistral.rs @@ -233,6 +233,8 @@ pub struct Request { pub messages: Vec, pub stream: bool, #[serde(default, skip_serializing_if = "Option::is_none")] + pub stream_options: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] pub max_tokens: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub temperature: Option, @@ -246,6 +248,12 @@ pub struct Request { pub tools: Vec, } +#[derive(Debug, Serialize, Deserialize)] +pub struct StreamOptions { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub stream_tool_calls: Option, +} + #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum ResponseFormat {