codetether-agent 4.7.0-a-002.4

A2A-native AI coding agent for the CodeTether ecosystem
Documentation
//! Model-list normalization for TetherScript provider hooks.

use anyhow::Result;
use serde_json::Value;

use super::super::ModelInfo;

pub(crate) fn parse_models(mut value: Value, provider: &str) -> Result<Vec<ModelInfo>> {
    add_missing_provider(&mut value, provider);
    serde_json::from_value(value).map_err(Into::into)
}

fn add_missing_provider(value: &mut Value, provider: &str) {
    let Some(models) = value.as_array_mut() else {
        return;
    };
    for model in models.iter_mut().filter(|model| model.is_object()) {
        if model.get("provider").is_none() {
            model["provider"] = Value::String(provider.to_string());
        }
    }
}

#[cfg(test)]
mod tests {
    use super::parse_models;

    #[test]
    fn fills_missing_provider_without_overwriting_existing_values() {
        let models = parse_models(
            serde_json::json!([
                super::super::model_record::without_provider("llama-4"),
                super::super::model_record::with_provider("other", "external")
            ]),
            "cerebras",
        )
        .expect("models should parse");

        assert_eq!(models[0].provider, "cerebras");
        assert_eq!(models[1].provider, "external");
    }
}