use rucora_core::provider::types::FinishReason;
use serde_json::{Map, Value, json};
pub fn parse_finish_reason(reason: &str) -> FinishReason {
match reason.to_lowercase().as_str() {
"stop" | "end_turn" => FinishReason::Stop,
"length" | "max_tokens" => FinishReason::Length,
"tool_calls" | "function_call" | "tool_use" => FinishReason::ToolCall,
_ => FinishReason::Other,
}
}
#[allow(clippy::too_many_arguments)]
pub fn apply_sampling_params(
map: &mut Map<String, Value>,
temperature: Option<f32>,
top_p: Option<f32>,
top_k: Option<u32>,
max_tokens: Option<u32>,
frequency_penalty: Option<f32>,
presence_penalty: Option<f32>,
stop: Option<&Vec<String>>,
extra: Option<&Value>,
) {
if let Some(v) = temperature {
map.insert("temperature".to_string(), json!(v));
}
if let Some(v) = top_p {
map.insert("top_p".to_string(), json!(v));
}
if let Some(v) = top_k {
map.insert("top_k".to_string(), json!(v));
}
if let Some(v) = max_tokens {
map.insert("max_tokens".to_string(), json!(v));
}
if let Some(v) = frequency_penalty {
map.insert("frequency_penalty".to_string(), json!(v));
}
if let Some(v) = presence_penalty {
map.insert("presence_penalty".to_string(), json!(v));
}
if let Some(v) = stop
&& !v.is_empty()
{
map.insert("stop".to_string(), json!(v));
}
if let Some(Value::Object(extra_map)) = extra {
for (key, value) in extra_map {
map.insert(key.clone(), value.clone());
}
}
}