rtb-chat 0.7.3

Unified multi-provider AI chat client for Claude, OpenAI, Gemini, and OpenAI-compatible endpoints. Part of the phpboyscout Rust toolkit.
Documentation

rtb-chat

Part of the phpboyscout Rust toolkit — small, framework-free crates extracted from rust-tool-base.

Unified multi-provider AI chat client. genai covers the mainstream (OpenAI, Gemini, Ollama, OpenAI-compatible); the Anthropic backend drops down to direct Anthropic Messages API calls for prompt caching, extended thinking, and citations. Structured output is JSON-Schema validated before deserialising.

Formerly rtb-ai — renamed at extraction for GTB-family name convergence (Go counterpart: chat.go.phpboyscout.uk). Only the crate identity changed; the API is unchanged.

use rtb_chat::{AiClient, ChatRequest, Config, Message, Provider};
use secrecy::SecretString;

let client = AiClient::new(Config {
    provider: Provider::Anthropic,
    model: "claude-opus-4-7".into(),
    api_key: SecretString::from(std::env::var("ANTHROPIC_API_KEY")?),
    ..Config::default()
})?;
let reply = client.chat(ChatRequest {
    messages: vec![Message::user("Summarise this changelog in one line.")],
    max_tokens: Some(512),
    cache_control: true,
    ..ChatRequest::default()
}).await?;

Config::api_key has no usable default — an empty key is rejected by AiClient::new.

Prompt caching, extended thinking, citations, temperature, max_tokens, timeout and base_url are honoured on the Anthropic backend only. What the other four providers do and do not get is documented in What rtb-chat does not do.

Development

just ci runs the full local gate (fmt, clippy, nextest, doc, deny). The test suite runs entirely against wiremock — no provider API keys are needed. Releases are cut by release-plz from Conventional Commits — do not tag manually.

License

MIT