ollama-sdk 0.2.2

An idiomatic, unofficial Rust client for the Ollama API with support for streaming, tool calling, and custom transports.
Documentation

Ollama-sdk

An idiomatic Rust library for interacting with the Ollama API, focusing on streaming, tool calling, and ease of use.

[!NOTE] This is not an official Ollama SDK.

[!WARNING] This library is currently in pre-alpha so don't use it in production. Only generation and chat completions are implemented.

Features

  • Idiomatic Rust API: Designed with Rust's best practices in mind.
  • Streaming Responses: Efficiently handle streaming responses from the Ollama API.
  • Configurable Transport: Uses reqwest by default, with an extensible Transport trait for custom implementations.
  • Robust Error Handling: Comprehensive error types for predictable error management.
  • Observability: Optional tracing for detailed logging and metrics for performance monitoring.

Installation

Add ollama-sdk to your Cargo.toml file:

[dependencies]
ollama-sdk = "0.2.2"

To enable optional features like tracing or metrics:

[dependencies]
ollama-sdk = { version = "0.2.2", features = ["tracing", "metrics"] }

Usage

Basic Generation (non-streaming)

use ollama_sdk::OllamaClient;
use ollama_sdk::types::generate::SimpleGenerateRequest;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = OllamaClient::builder().build()?;

    let generate_request = SimpleGenerateRequest {
        model: "llama3.2:3b".to_string(),
        prompt: "Tell me a story about a Rust programmer.".to_string().into(),
        ..Default::default()
    };

    let generate_response = client.generate_simple(generate_request).await?;

    println!("Response: {}", generate_response.response);

    Ok(())
}

Streaming Generation

use futures::StreamExt;
use ollama_sdk::OllamaClient;
use ollama_sdk::types::generate::GenerateStreamEvent;
use ollama_sdk::types::generate::StreamingGenerateRequest;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = OllamaClient::builder().build()?;

    let generate_request = StreamingGenerateRequest {
        model: "llama3.2:3b".to_string(),
        prompt: "Tell me a story about a Rust programmer.".to_string().into(),
        ..Default::default()
    };

    let mut stream = client.generate_stream(generate_request).await?;

    while let Some(event) = stream.next().await {
        match event {
            Ok(val) => match val {
                GenerateStreamEvent::MessageChunk(chunk) => print!("{}", chunk.response),
                GenerateStreamEvent::Error(error) => println!("\nError Chunk: {}", error),
                _ => continue,
            },
            Err(e) => eprintln!("Chat Error: {}", e),
        }
    }
    println!();

    Ok(())
}

Basic Chat (non-streaming)

use ollama_sdk::OllamaClient;
use ollama_sdk::types::chat::ChatRequestMessage;
use ollama_sdk::types::chat::SimpleChatRequest;
use ollama_sdk::types::Role;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = OllamaClient::builder().build()?;

    let messages = vec![ChatRequestMessage {
        role: Role::User,
        content: "What is the capital of France".to_string(),
    }];

    let chat_request = SimpleChatRequest {
        model: "llama3.2:3b".to_string(),
        messages,
        ..Default::default()
    };

    let chat_response = client.chat_simple(chat_request).await?;
    let message = chat_response.message;

    println!("Response: {}", message.content);

    Ok(())
}

Streaming Chat

use ollama_sdk::OllamaClient;
use ollama_sdk::types::chat::ChatRequestMessage;
use ollama_sdk::types::chat::ChatStreamEvent;
use ollama_sdk::types::chat::StreamingChatRequest;
use ollama_sdk::types::Role;
use futures::StreamExt;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = OllamaClient::builder().build()?;

    let messages = vec![ChatRequestMessage {
        role: Role::User,
        content: "Tell me a story about a Rust programmer.".to_string(),
        ..Default::default()
    }];
    
    let chat_request = StreamingChatRequest {
        model: "llama3.2:3b".to_string(),
        messages,
        ..Default::default()
    };

    let mut stream = client.chat_stream(chat_request).await?;

    while let Some(event) = stream.next().await {
        match event {
            Ok(val) => match val {
                ChatStreamEvent::Message(response) => print!("{}", response.message.content),
                ChatStreamEvent::Error(error) => println!("\nError Chunk: {}", error),
                _ => continue,
            },
            Err(e) => eprintln!("Chat Error: {}", e),
        }
    }
    println!();

    Ok(())
}

Contributing

We welcome contributions! Please see our CONTRIBUTING.md for more details.

License

This project is licensed under the MIT License. See the LICENSE file for details.