async-openai
Async Rust library for OpenAI
## Overview
`async-openai` is an unofficial Rust library for OpenAI.
- It's based on [OpenAI OpenAPI spec](https://github.com/openai/openai-openapi)
- Current features:
- [x] Assistants (Beta)
- [x] Audio (Whisper/TTS)
- [x] Chat
- [x] Completions (Legacy)
- [x] Edits (Deprecated)
- [x] Embeddings
- [x] Files
- [x] Fine-Tuning
- [x] Fine-Tunes (Deprecated)
- [x] Images
- [x] Microsoft Azure OpenAI Service
- [x] Models
- [x] Moderations
- Support SSE streaming on available APIs
- All requests including form submissions (except SSE streaming) are retried with exponential backoff when [rate limited](https://platform.openai.com/docs/guides/rate-limits) by the API server.
- Ergonomic builder pattern for all request objects.
**Note on Azure OpenAI Service (AOS)**: `async-openai` primarily implements OpenAI spec, and doesn't try to maintain parity with spec of AOS.
## Usage
The library reads [API key](https://platform.openai.com/account/api-keys) from the environment variable `OPENAI_API_KEY`.
```bash
# On macOS/Linux
export OPENAI_API_KEY='sk-...'
```
```powershell
# On Windows Powershell
$Env:OPENAI_API_KEY='sk-...'
```
- Visit [examples](https://github.com/64bit/async-openai/tree/main/examples) directory on how to use `async-openai`.
- Visit [docs.rs/async-openai](https://docs.rs/async-openai) for docs.
## Image Generation Example
```rust
use async_openai::{
types::{CreateImageRequestArgs, ImageSize, ResponseFormat},
Client,
};
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box> {
// create client, reads OPENAI_API_KEY environment variable for API key.
let client = Client::new();
let request = CreateImageRequestArgs::default()
.prompt("cats on sofa and carpet in living room")
.n(2)
.response_format(ResponseFormat::Url)
.size(ImageSize::S256x256)
.user("async-openai")
.build()?;
let response = client.images().create(request).await?;
// Download and save images to ./data directory.
// Each url is downloaded and saved in dedicated Tokio task.
// Directory is created if it doesn't exist.
let paths = response.save("./data").await?;
paths
.iter()
.for_each(|path| println!("Image file path: {}", path.display()));
Ok(())
}
```
Scaled up for README, actual size 256x256
## Contributing
Thank you for your time to contribute and improve the project, I'd be happy to have you!
A good starting point would be existing [open issues](https://github.com/64bit/async-openai/issues).
## License
This project is licensed under [MIT license](https://github.com/64bit/async-openai/blob/main/LICENSE).