Skip to content

Core Types

This document describes the fundamental types used throughout optillm-rs.

Solution

The primary result type from optimization techniques.

Rust
pub struct Solution {
    pub agent_id: String,
    pub reasoning: String,
    pub answer: String,
    pub temperature: f32,
    pub token_count: usize,
    pub is_verified: bool,
    pub verification_score: f32,
    pub phase: GenerationPhase,
}

Creating a Solution

Rust
let solution = Solution::new(
    "agent-1".to_string(),
    "Because...".to_string(),
    "The answer is 42".to_string(),
    0.7,  // temperature
    1200, // token_count
);

Solution Phase

Rust
pub enum GenerationPhase {
    Initial,
    Improved,
    Verified,
    Aggregated,
}

Prompt

Represents a request to an LLM provider.

Rust
pub struct Prompt {
    pub input: Vec<ResponseItem>,
    pub base_instructions_override: Option<String>,
    pub log_tag: Option<String>,
}

Building a Prompt

Rust
let mut prompt = Prompt::default();

// Add message
prompt.input = vec![ResponseItem::Message {
    id: None,
    role: "user".to_string(),
    content: vec![ContentItem::InputText {
        text: "Hello, world!".to_string(),
    }],
}];

// Override system prompt
prompt.base_instructions_override = Some(
    "You are a helpful assistant.".to_string()
);

// Add logging tag
prompt.set_log_tag("my-optimization");

ResponseItem

Items in a prompt's conversation.

Rust
pub enum ResponseItem {
    Message {
        id: Option<String>,
        role: String,
        content: Vec<ContentItem>,
    }
}

Roles typically include: - "system" - System instructions - "user" - User message - "assistant" - Assistant response

ContentItem

Content within a message.

Rust
pub enum ContentItem {
    /// User input text
    InputText { text: String },

    /// Assistant response text
    Text { text: String },
}

ResponseEvent

Events streamed from the LLM.

Rust
pub enum ResponseEvent {
    /// Text chunk from streaming response
    OutputTextDelta { delta: String },

    /// Response completed
    Completed { token_usage: Option<TokenUsage> },
}

Handling Events

Rust
let mut stream = client.stream(&prompt);

while let Some(event) = stream.next().await {
    match event? {
        ResponseEvent::OutputTextDelta { delta } => {
            print!("{}", delta);
            total_text.push_str(&delta);
        }
        ResponseEvent::Completed { token_usage } => {
            if let Some(usage) = token_usage {
                println!("\nTokens: {} in, {} out",
                    usage.input_tokens,
                    usage.output_tokens);
            }
        }
    }
}

TokenUsage

Tracks token consumption.

Rust
pub struct TokenUsage {
    pub input_tokens: usize,
    pub output_tokens: usize,
}

impl TokenUsage {
    pub fn total_tokens(&self) -> usize {
        self.input_tokens + self.output_tokens
    }
}

OptillmError

Unified error type.

Rust
pub enum OptillmError {
    InvalidConfiguration(String),
    ClientError(String),
    ParsingError(String),
    // ... more variants
}

Result Type Alias

Rust
pub type Result<T> = std::result::Result<T, OptillmError>;

Usage:

Rust
pub async fn my_function() -> Result<Solution> {
    // Returns Result<Solution, OptillmError>
}

Type Relationships

Text Only
Optimizer
├── accepts ModelClient
├── accepts Prompt
├── returns Solution
│   ├── contains reasoning: String
│   ├── contains answer: String
│   └── tracks phase: GenerationPhase
└── uses streaming
    └── receives ResponseEvent
        └── references TokenUsage

ModelClient
└── streams ResponseEvent items
    └── references TokenUsage

Serialization

Most types implement serde::Serialize and Deserialize:

Rust
use serde::{Serialize, Deserialize};

let solution = Solution::new(/* ... */);
let json = serde_json::to_string(&solution)?;
let restored: Solution = serde_json::from_str(&json)?;

See Error Handling for comprehensive error handling patterns.