transformrs is an interface to
AI API providers.
Examples
First, set your API key either in an .env
file or as an environment variable.
For example, for DeepInfra, set DEEPINFRA_KEY
in .env
:
DEEPINFRA_KEY=<KEY>
and add the library to your Cargo.toml
:
[dependencies]
futures-util = "0.3" # Only required for `stream_chat_completion`.
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
transformrs = "0.3.0"
Then, you can use the API as follows.
Chat Completion
Tested with: DeepInfra, Google, Hyperbolic, OpenAI
use transformrs::openai;
use transformrs::Message;
use transformrs::Provider;
#[tokio::main]
async fn main() {
let messages = vec![
Message::from_str("system", "You are a helpful assistant."),
Message::from_str("user", "This is a test. Please respond with 'hello world'."),
];
let keys = transformrs::load_keys(".env");
let key = keys.for_provider(&Provider::DeepInfra).unwrap();
let model = "meta-llama/Llama-3.3-70B-Instruct";
// Using the OpenAI-compatible API for chat completions.
let resp = openai::chat_completion(&key, model, &messages)
.await
.unwrap()
.structured()
.unwrap();
println!("{:?}", resp.choices[0].message.content);
}
hello world
Chat Completion with Image
Tested with: DeepInfra, Google, Hyperbolic, OpenAI
use transformrs::openai;
use transformrs::Message;
use transformrs::Provider;
#[tokio::main]
async fn main() {
let messages = vec![
Message::from_str("user", "Describe this image in one sentence."),
// To pass a local image, use `Message::from_image_bytes`, for example:
// Message::from_image_bytes("user", "jpeg", include_bytes!("sunset.jpg")),
Message::from_image_url("user", "https://transformrs.org/sunset.jpg"),
];
let keys = transformrs::load_keys(".env");
let key = keys.for_provider(&Provider::DeepInfra).unwrap();
let model = "meta-llama/Llama-3.2-11B-Vision-Instruct";
// Using the OpenAI-compatible API for chat completions.
let resp = openai::chat_completion(&key, model, &messages)
.await
.unwrap()
.structured()
.unwrap();
println!("{:?}", resp.choices[0].message.content);
}
A sunset over a body of water.
Streaming Chat Completion
Tested with: DeepInfra, Google, Hyperbolic, OpenAI
use futures_util::stream::StreamExt;
use transformrs::openai;
use transformrs::Message;
use transformrs::Provider;
#[tokio::main]
async fn main() {
let messages = vec![
Message::from_str("system", "You are a helpful assistant."),
Message::from_str("user", "This is a test. Please respond with 'hello world'."),
];
let keys = transformrs::load_keys(".env");
let key = keys.for_provider(&Provider::DeepInfra).unwrap();
let model = "meta-llama/Llama-3.3-70B-Instruct";
// Using the OpenAI-compatible API for streaming chat completions.
let mut stream = openai::stream_chat_completion(&key, model, &messages)
.await
.unwrap();
while let Some(resp) = stream.next().await {
println!("{}", resp.choices[0].delta.content.clone().unwrap_or_default());
}
}
hello
world
Text to Speech
Tested with: DeepInfra
use std::fs::File;
use std::io::Write;
use transformrs::Provider;
#[tokio::main]
async fn main() {
let keys = transformrs::load_keys(".env");
let key = keys.for_provider(&Provider::DeepInfra).unwrap();
let mut config = transformrs::text_to_speech::TTSConfig::default();
config.preset_voice = Some("am_echo".to_string());
let msg = "Hello, world! This is a test of the TTS API.";
let model = "hexgrad/Kokoro-82M".to_string();
let resp = transformrs::text_to_speech::tts(&key, config, &model, msg)
.await
.unwrap()
.structured()
.unwrap();
let bytes = resp.base64_decode().unwrap();
let ext = resp.output_format;
let mut file = File::create(format!("test.{ext}")).unwrap();
file.write_all(&bytes).unwrap();
}
Text to Image
Tested with: DeepInfra, Hyperbolic
use std::fs::File;
use std::io::Write;
use transformrs::Provider;
#[tokio::main]
async fn main() {
let keys = transformrs::load_keys(".env");
let key = keys.for_provider(&Provider::Hyperbolic).expect("no key");
let mut config = transformrs::text_to_image::TTIConfig::default();
config.model = "FLUX.1-dev".to_string();
let prompt = "A beautiful sunset over a calm ocean.";
let resp = transformrs::text_to_image::text_to_image(&key, config, prompt)
.await
.unwrap()
.structured()
.unwrap();
let encoded = &resp.images[0];
let image = encoded.base64_decode().unwrap();
let filename = format!("sunset.{}", image.filetype);
let mut file = File::create(filename).unwrap();
file.write_all(&image.image).unwrap();
}