rainy-sdk

Crates.iorainy-sdk
lib.rsrainy-sdk
version0.3.0
created_at2025-09-05 05:47:29.565844+00
updated_at2025-09-22 05:42:25.080276+00
descriptionOfficial Rust SDK for Rainy API by Enosis Labs v0.3.0 - Full OpenAI compatibility with unified interface for multiple AI providers, intelligent retry, metadata tracking, and comprehensive error handling
homepagehttps://github.com/enosislabs/rainy-sdk
repositoryhttps://github.com/enosislabs/rainy-sdk
max_upload_size
id1825126
size274,459
Fernando J. Albornoz (highinfedilety)

documentation

https://docs.rs/rainy-sdk

README

๐ŸŒง๏ธ Rainy SDK v0.3.0

Crates.io Documentation License Ask DeepWiki

The official Rust SDK for the Rainy API by Enosis Labs - a unified interface for multiple AI providers including OpenAI, Anthropic, Google Gemini, and more.

โœจ Features

  • ๐ŸŽฏ Full OpenAI Compatibility: Compatibility with the OpenAI SDK system.
  • ๐Ÿš€ Unified Multi-Provider API: Single interface for OpenAI, Google Gemini, Groq, Cerebras and others.
  • ๐Ÿ” Type-Safe Authentication: Secure API key management with validation
  • โšก Async/Await: Full async support with Tokio runtime
  • ๐Ÿ“Š Rich Metadata: Response times, provider info, token usage, credit tracking
  • ๐Ÿ›ก๏ธ Enhanced Error Handling: Comprehensive error types with retryability
  • ๐Ÿ”„ Intelligent Retry: Exponential backoff with jitter for resilience
  • ๐Ÿ“ˆ Rate Limiting: Optional governor-based rate limiting
  • ๐Ÿ”ง Advanced Parameters: Support for reasoning_effort, response_format, tools, tool_choice
  • ๐Ÿ“š Rich Documentation: Complete API documentation with practical examples

๐Ÿ“ฆ Installation

Add this to your Cargo.toml:

[dependencies]
rainy-sdk = "0.2.5"
tokio = { version = "1.0", features = ["full"] }

Or installation with cargo:

cargo add rainy-sdk

๐ŸŽฏ OpenAI Compatibility

Rainy SDK v0.3.0 provides 100% OpenAI API compatibility while extending support to additional providers. Use Rainy SDK as a drop-in replacement for the official OpenAI SDK:

use rainy_sdk::{models, ChatCompletionRequest, ChatMessage, RainyClient};

// Works exactly like OpenAI SDK
let client = RainyClient::with_api_key("your-rainy-api-key")?;

let request = ChatCompletionRequest::new(
    models::model_constants::OPENAI_GPT_4O, // or GOOGLE_GEMINI_2_5_PRO
    vec![ChatMessage::user("Hello!")]
)
.with_temperature(0.7)
.with_response_format(models::ResponseFormat::JsonObject);

let (response, metadata) = client.chat_completion(request).await?;

Supported Models (100% OpenAI Compatible)

Provider Models OpenAI Compatibility
OpenAI openai/gpt-4o, openai/gpt-5 โœ… Native
Google google/gemini-2.5-pro, google/gemini-2.5-flash, google/gemini-2.5-flash-lite โœ… Via compatibility layer
Groq groq/llama-3.1-8b-instant โœ… OpenAI-compatible API
Cerebras cerebras/llama3.1-8b โœ… OpenAI-compatible API

Advanced OpenAI Features

  • Tool Calling: Function calling with tools and tool_choice
  • Structured Output: JSON Schema enforcement with response_format
  • Reasoning Control: reasoning_effort parameter for Gemini models
  • Log Probabilities: logprobs and top_logprobs support
  • Streaming: OpenAI-compatible delta format streaming

Optional Features

Enable additional features as needed:

[dependencies]
rainy-sdk = { version = "0.2.5", features = ["rate-limiting", "tracing"] }

Available features:

  • rate-limiting: Built-in rate limiting with the governor crate.
  • tracing: Request/response logging with the tracing crate.

๐Ÿš€ Quick Start

use rainy_sdk::{models, ChatCompletionRequest, ChatMessage, RainyClient};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // Initialize client with your API key from environment variables
    let api_key = std::env::var("RAINY_API_KEY").expect("RAINY_API_KEY not set");
    let client = RainyClient::with_api_key(api_key)?;

    // Simple chat completion
    let response = client
        .simple_chat(
            models::model_constants::GPT_4O,
            "Hello! Tell me a short story.",
        )
        .await?;
    println!("Simple response: {}", response);

    // Advanced usage with metadata
    let request = ChatCompletionRequest::new(
        models::model_constants::CLAUDE_SONNET_4,
        vec![ChatMessage::user("Explain quantum computing in one sentence")],
    )
    .with_temperature(0.7)
    .with_max_tokens(100);

    let (response, metadata) = client.chat_completion(request).await?;
    println!("\nAdvanced response: {}", response.choices[0].message.content);
    println!("Provider: {:?}", metadata.provider.unwrap_or_default());
    println!("Response time: {}ms", metadata.response_time.unwrap_or_default());

    Ok(())
}

๐Ÿ“– API Documentation

Authentication

The SDK uses API key authentication. It's recommended to load the key from an environment variable.

use rainy_sdk::RainyClient;

// Load API key from environment and create client
let api_key = std::env::var("RAINY_API_KEY").expect("RAINY_API_KEY not set");
let client = RainyClient::with_api_key(api_key)?;

Core Operations

Health Check

Verify the API status.

# use rainy_sdk::RainyClient;
# async fn example() -> Result<(), Box<dyn std::error::Error>> {
# let client = RainyClient::with_api_key("dummy")?;
let health = client.health_check().await?;
println!("API Status: {}", health.status);
# Ok(())
# }

Chat Completions

Create a standard chat completion.

# use rainy_sdk::{RainyClient, ChatCompletionRequest, ChatMessage, models};
# async fn example() -> Result<(), Box<dyn std::error::Error>> {
# let client = RainyClient::with_api_key("dummy")?;
let messages = vec![
    ChatMessage::system("You are a helpful assistant."),
    ChatMessage::user("Explain quantum computing in simple terms."),
];

let request = ChatCompletionRequest::new(models::model_constants::GPT_4O, messages)
    .with_max_tokens(500)
    .with_temperature(0.7);

let (response, metadata) = client.chat_completion(request).await?;
if let Some(choice) = response.choices.first() {
    println!("Response: {}", choice.message.content);
}
# Ok(())
# }

Streaming Chat Completions

Receive the response as a stream of events.

# use rainy_sdk::{RainyClient, ChatCompletionRequest, ChatMessage, models};
# use futures::StreamExt;
# async fn example() -> Result<(), Box<dyn std::error::Error>> {
# let client = RainyClient::with_api_key("dummy")?;
let request = ChatCompletionRequest::new(
    models::model_constants::LLAMA_3_1_8B_INSTANT,
    vec![ChatMessage::user("Write a haiku about Rust programming")],
)
.with_stream(true);

let mut stream = client.create_chat_completion_stream(request).await?;

while let Some(chunk) = stream.next().await {
    match chunk {
        Ok(response) => {
            if let Some(choice) = response.choices.first() {
                print!("{}", choice.message.content);
            }
        }
        Err(e) => eprintln!("\nError in stream: {}", e),
    }
}
# Ok(())
# }

Usage Statistics

Get credit and usage statistics.

# use rainy_sdk::RainyClient;
# async fn example() -> Result<(), Box<dyn std::error::Error>> {
# let client = RainyClient::with_api_key("dummy")?;
// Get credit stats
let credits = client.get_credit_stats(None).await?;
println!("Current credits: {}", credits.current_credits);

// Get usage stats for the last 7 days
let usage = client.get_usage_stats(Some(7)).await?;
println!("Total requests (last 7 days): {}", usage.total_requests);
# Ok(())
# }

API Key Management

Manage API keys programmatically.

# use rainy_sdk::RainyClient;
# async fn example() -> Result<(), Box<dyn std::error::Error>> {
# let client = RainyClient::with_api_key("dummy")?;
// List all API keys
let keys = client.list_api_keys().await?;
for key in keys {
    println!("Key ID: {} - Active: {}", key.id, key.is_active);
}

// Create a new API key
let new_key = client.create_api_key("My new key", Some(30)).await?;
println!("Created key: {}", new_key.key);

// Delete the API key
client.delete_api_key(&new_key.id.to_string()).await?;
# Ok(())
# }

๐Ÿงช Examples

Explore the examples/ directory for comprehensive usage examples:

  • Basic Usage (examples/basic_usage.rs): Complete walkthrough of all SDK features.
  • Chat Completion (examples/chat_completion.rs): Advanced chat completion patterns.
  • Error Handling (examples/error_handling.rs): Demonstrates how to handle different error types.

Run examples with:

# Set your API key
export RAINY_API_KEY="your-api-key-here"

# Run basic usage example
cargo run --example basic_usage

# Run chat completion example
cargo run --example chat_completion

๐Ÿ›ก๏ธ Security Considerations

  • API Key Management: This SDK utilizes the secrecy crate to handle the API key, ensuring it is securely stored in memory and zeroed out upon being dropped. However, it is still crucial to manage the RainyClient's lifecycle carefully within your application to minimize exposure.

  • Rate Limiting: The optional rate-limiting feature is intended as a client-side safeguard to prevent accidental overuse and to act as a "good citizen" towards the API. It is not a security mechanism and can be bypassed by a malicious actor. For robust abuse prevention, you must implement server-side monitoring, usage quotas, and API key management through your Enosis Labs dashboard.

  • TLS Configuration: The client is hardened to use modern, secure TLS settings (TLS 1.2+ via the rustls backend) and to only allow HTTPS connections, providing strong protection against network interception.

๐Ÿ—๏ธ Architecture

The SDK is built with a modular architecture:

src/
โ”œโ”€โ”€ client.rs          # Main API client with request handling
โ”œโ”€โ”€ auth.rs            # Authentication and authorization logic
โ”œโ”€โ”€ models.rs          # Data structures and serialization
โ”œโ”€โ”€ error.rs           # Comprehensive error handling
โ”œโ”€โ”€ retry.rs           # Retry logic with exponential backoff
โ”œโ”€โ”€ endpoints/         # API endpoint implementations
โ”‚   โ”œโ”€โ”€ chat.rs        # Chat completion endpoints
โ”‚   โ”œโ”€โ”€ health.rs      # Health check and monitoring
โ”‚   โ”œโ”€โ”€ keys.rs        # API key operations
โ”‚   โ”œโ”€โ”€ usage.rs       # Usage statistics and billing
โ”‚   โ””โ”€โ”€ user.rs        # User account management
โ””โ”€โ”€ lib.rs             # Public API and module exports

๐Ÿค Contributing

We welcome contributions! Please see our Contributing Guide for details on:

  • Setting up your development environment
  • Code style and standards
  • Testing guidelines
  • Submitting pull requests

๐Ÿ“„ License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

๐Ÿ“ž Contact & Support

โš ๏ธ Disclaimer

This SDK is developed by Enosis Labs and is not officially affiliated with any AI provider mentioned (OpenAI, Anthropic, Google, etc.). The Rainy API serves as an independent gateway service that provides unified access to multiple AI providers.


Made with โค๏ธ by Enosis Labs

Commit count: 41

cargo fmt