llmshim 0.9.0

Blazing fast LLM API translation layer in pure Rust
Documentation
use llmshim::{provider::Provider, providers::openai::OpenAi, providers::xai::Xai};
use serde_json::json;

#[test]
fn openrouter_nitro_replays_reasoning_without_inventing_a_fixed_price() {
    let p = llmshim::providers::openrouter::OpenRouter::new("test-key".into());
    let model = "x-ai/grok-4.7:nitro";
    let details = json!([{"type":"reasoning.encrypted","id":"rs_synthetic","data":"synthetic-ciphertext+/="}]);
    let result = p.transform_response(model,json!({"choices":[{"message":{"role":"assistant","content":"pong","reasoning_details":details},"finish_reason":"stop"}]})).unwrap();
    let assistant = &result["choices"][0]["message"];
    assert_eq!(assistant["reasoning"][0]["origin"]["family"], "grok");
    assert_eq!(assistant["reasoning"][0]["origin"]["model"], model);
    let req = json!({"messages":[{"role":"user","content":"ping"},assistant,{"role":"user","content":"continue"}]});
    let wire = p.transform_request(model, &req).unwrap();
    assert_eq!(wire.body["model"], model);
    assert_eq!(wire.body["messages"][1]["reasoning_details"], details);
    assert_eq!(llmshim::cost::for_target("openrouter", model), None);
}

#[test]
fn named_tool_selection_is_flat_for_all_accepted_input_dialects() {
    let p = Xai::new("test-key".into());
    for choice in [
        json!({"type":"function","function":{"name":"lookup"}}),
        json!({"type":"function","name":"lookup"}),
        json!({"type":"tool","name":"lookup"}),
    ] {
        let req = json!({"messages":[{"role":"user","content":"lookup"}],"tool_choice":choice});
        assert_eq!(
            p.transform_request("grok-4.7", &req).unwrap().body["tool_choice"],
            json!({"type":"function","name":"lookup"})
        );
    }
}

#[test]
fn ciphertext_survives_4_7_round_trip_without_mutating_history() {
    let p = Xai::new("test-key".into());
    let payload = json!({"type":"reasoning","id":"rs_synthetic","encrypted_content":"synthetic-ciphertext+/=","summary":[]});
    let result = p.transform_response("grok-4.7",json!({"id":"resp_synthetic","status":"completed","output":[payload,{"type":"message","role":"assistant","content":[{"type":"output_text","text":"pong"}]}],"usage":{"input_tokens":1,"output_tokens":2}})).unwrap();
    let assistant = &result["choices"][0]["message"];
    assert_eq!(assistant["reasoning"][0]["origin"]["family"], "grok");
    assert_eq!(assistant["reasoning"][0]["origin"]["model"], "grok-4.7");
    let req = json!({"messages":[{"role":"user","content":"ping"},assistant,{"role":"user","content":"continue"}],"reasoning_effort":"none"});
    let saved = req.clone();
    let wire = p.transform_request("grok-4.7", &req).unwrap();
    assert_eq!(wire.body["reasoning"]["effort"], "low");
    assert_eq!(wire.body["store"], false);
    assert!(wire.body["input"].as_array().unwrap().contains(&payload));
    let foreign = OpenAi::new("other-key".into())
        .transform_request("gpt-6-astra", &req)
        .unwrap();
    assert!(!foreign.body["input"]
        .as_array()
        .unwrap()
        .iter()
        .any(|i| i["type"] == "reasoning"));
    assert_eq!(req, saved);
}

#[test]
fn grok_4_7_effort_mapping_preserves_valid_tiers() {
    let p = Xai::new("test-key".into());
    for (effort, expected) in [
        ("none", "low"),
        ("low", "low"),
        ("medium", "medium"),
        ("high", "high"),
        ("xhigh", "xhigh"),
        ("max", "xhigh"),
    ] {
        let req = json!({"messages":[{"role":"user","content":"ping"}],"reasoning_effort":effort});
        assert_eq!(
            p.transform_request("grok-4.7", &req).unwrap().body["reasoning"]["effort"],
            expected
        );
    }
}