pub(crate) fn ensure_openrouter_require_parameters(body: &mut serde_json::Value) {
match body.get_mut("provider") {
Some(serde_json::Value::Object(provider)) => {
provider
.entry("require_parameters".to_string())
.or_insert_with(|| serde_json::json!(true));
}
Some(_) => {}
None => {
body["provider"] = serde_json::json!({"require_parameters": true});
}
}
}
pub(crate) fn apply_openrouter_route_denylist(body: &mut serde_json::Value, deny: &[String]) {
if deny.is_empty() {
return;
}
if !body.is_object() {
return;
}
let provider = body
.as_object_mut()
.expect("body is an object")
.entry("provider".to_string())
.or_insert_with(|| serde_json::json!({}));
let Some(provider_obj) = provider.as_object_mut() else {
return;
};
let ignore = provider_obj
.entry("ignore".to_string())
.or_insert_with(|| serde_json::Value::Array(Vec::new()));
let Some(ignore_arr) = ignore.as_array_mut() else {
return;
};
for name in deny {
let already_present = ignore_arr
.iter()
.any(|existing| existing.as_str() == Some(name.as_str()));
if !already_present {
ignore_arr.push(serde_json::Value::String(name.clone()));
}
}
}
pub(crate) fn apply_openrouter_provider_order(body: &mut serde_json::Value, order: &[String]) {
if order.is_empty() {
return;
}
if !body.is_object() {
return;
}
let provider = body
.as_object_mut()
.expect("body is an object")
.entry("provider".to_string())
.or_insert_with(|| serde_json::json!({}));
let Some(provider_obj) = provider.as_object_mut() else {
return;
};
if !provider_obj.contains_key("order") {
provider_obj.insert(
"order".to_string(),
serde_json::Value::Array(
order
.iter()
.map(|name| serde_json::Value::String(name.clone()))
.collect(),
),
);
}
provider_obj.insert(
"allow_fallbacks".to_string(),
serde_json::Value::Bool(false),
);
}