modelrelay 6.5.0

Rust SDK for the ModelRelay API
Documentation
# Blocking usage

Enable the blocking client when you do not want to pull in Tokio (perfect for small CLIs):

```toml
[dependencies]
modelrelay = { version = "0.46.2", default-features = false, features = ["blocking"] }
# add streaming support without Tokio:
# modelrelay = { version = "0.46.2", default-features = false, features = ["blocking", "streaming"] }
```

## Non-streaming

```rust
use modelrelay::{BlockingClient, BlockingConfig, ResponseBuilder};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = BlockingClient::new(BlockingConfig {
        api_key: Some(std::env::var("MODELRELAY_API_KEY")?),
        ..Default::default()
    })?;

    let response = ResponseBuilder::new()
        .model("gpt-4o-mini")
        .user("Write a short greeting.")
        .request_id("blocking-1")
        .send_blocking(&client.responses())?;

    println!("response {}: {:?}", response.id, response.output);
    Ok(())
}
```

## Streaming

```rust
use modelrelay::{BlockingClient, BlockingConfig, ResponseBuilder};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = BlockingClient::new(BlockingConfig {
        api_key: Some(std::env::var("MODELRELAY_API_KEY")?),
        ..Default::default()
    })?;

    let iter = ResponseBuilder::new()
        .model("gpt-4o-mini")
        .user("Stream a 2-line poem about ferris the crab.")
        .request_id("blocking-stream-1")
        .stream_deltas_blocking(&client.responses())?;

    for delta in iter {
        print!("{}", delta?);
    }
    Ok(())
}
```