harn-vm 0.10.49

Async bytecode virtual machine for the Harn programming language
Documentation
use super::*;

#[test]
fn gpt_5_6_catalog_exports_current_openai_and_openrouter_economics() {
    llm_config::clear_user_overrides();
    let catalog = artifact();

    for (
        model_id,
        input,
        output,
        cache_read,
        cache_write,
        fast_input,
        fast_output,
        fast_cache_read,
        fast_cache_write,
        flex_input,
        flex_output,
        flex_cache_read,
        flex_cache_write,
    ) in [
        (
            "gpt-5.6-terra",
            2.0,
            12.0,
            0.2,
            2.5,
            4.0,
            24.0,
            0.4,
            5.0,
            1.0,
            6.0,
            0.1,
            1.25,
        ),
        (
            "gpt-5.6-luna",
            0.2,
            1.2,
            0.02,
            0.25,
            0.4,
            2.4,
            0.04,
            0.5,
            0.1,
            0.6,
            0.01,
            0.125,
        ),
    ] {
        let model = catalog
            .models
            .iter()
            .find(|model| model.provider == "openai" && model.id == model_id)
            .unwrap_or_else(|| panic!("missing OpenAI {model_id} catalog row"));
        let pricing = model.pricing.as_ref().expect("standard pricing");
        assert_eq!(pricing.input_per_mtok, input);
        assert_eq!(pricing.output_per_mtok, output);
        assert_eq!(pricing.cache_read_per_mtok, Some(cache_read));
        assert_eq!(pricing.cache_write_per_mtok, Some(cache_write));
        assert_eq!(pricing.input_token_bands[0].minimum_input_tokens, 272_001);
        assert_eq!(pricing.input_token_bands[0].input_multiplier, 2.0);
        assert_eq!(pricing.input_token_bands[0].output_multiplier, 1.5);

        let fast = model
            .serving_tiers
            .iter()
            .find(|tier| tier.id == "fast")
            .expect("Fast mode tier");
        let request = fast.request.as_ref().expect("Fast mode request knob");
        assert_eq!(request.param, "service_tier");
        assert_eq!(request.value, "fast");
        assert_eq!(request.response_values, ["fast", "priority"]);
        let fast_pricing = fast.pricing.as_ref().expect("Fast mode pricing");
        assert_eq!(fast_pricing.input_per_mtok, fast_input);
        assert_eq!(fast_pricing.output_per_mtok, fast_output);
        assert_eq!(fast_pricing.cache_read_per_mtok, Some(fast_cache_read));
        assert_eq!(fast_pricing.cache_write_per_mtok, Some(fast_cache_write));

        let flex = model
            .serving_tiers
            .iter()
            .find(|tier| tier.id == "flex")
            .expect("Flex processing tier");
        assert_eq!(flex.status.as_deref(), Some("beta"));
        assert_eq!(flex.discount_percent, Some(50));
        let flex_pricing = flex.pricing.as_ref().expect("Flex pricing");
        assert_eq!(flex_pricing.input_per_mtok, flex_input);
        assert_eq!(flex_pricing.output_per_mtok, flex_output);
        assert_eq!(flex_pricing.cache_read_per_mtok, Some(flex_cache_read));
        assert_eq!(flex_pricing.cache_write_per_mtok, Some(flex_cache_write));
    }

    for (model_id, input, output) in [
        ("openai/gpt-5.6-terra", 2.0, 12.0),
        ("openai/gpt-5.6-terra-pro", 2.0, 12.0),
        ("openai/gpt-5.6-luna", 0.2, 1.2),
        ("openai/gpt-5.6-luna-pro", 0.2, 1.2),
    ] {
        let model = catalog
            .models
            .iter()
            .find(|model| model.provider == "openrouter" && model.id == model_id)
            .unwrap_or_else(|| panic!("missing OpenRouter {model_id} catalog row"));
        let pricing = model.pricing.as_ref().expect("OpenRouter pricing");
        assert_eq!(pricing.input_per_mtok, input);
        assert_eq!(pricing.output_per_mtok, output);
    }
}

#[test]
fn serving_tier_response_values_surface_in_generated_contracts() {
    let schema = schema_value();
    assert_eq!(
        schema["$defs"]["serving_tier_request"]["properties"]["response_values"]["uniqueItems"],
        true
    );

    let typescript = typescript_declarations();
    assert!(typescript.contains("response_values?: string[]"));

    let swift = swift_binding().expect("Swift binding renders");
    assert!(swift.contains("public let responseValues: [String]?"));
}