tinyagents 0.1.0

A Rust LLM orchestration library inspired by LangChain and LangGraph.
Documentation
use async_trait::async_trait;
use serde::{Deserialize, Serialize};

use crate::{Result, chat::ChatMessage};

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct ModelRequest {
    pub messages: Vec<ChatMessage>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub temperature: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub max_tokens: Option<u32>,
}

impl ModelRequest {
    pub fn new(messages: Vec<ChatMessage>) -> Self {
        Self {
            messages,
            temperature: None,
            max_tokens: None,
        }
    }

    pub fn temperature(mut self, temperature: f64) -> Self {
        self.temperature = Some(temperature);
        self
    }

    pub fn max_tokens(mut self, max_tokens: u32) -> Self {
        self.max_tokens = Some(max_tokens);
        self
    }
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ModelResponse {
    pub message: ChatMessage,
}

impl ModelResponse {
    pub fn assistant(content: impl Into<String>) -> Self {
        Self {
            message: ChatMessage::assistant(content),
        }
    }
}

#[async_trait]
pub trait ChatModel<State>: Send + Sync {
    async fn invoke(&self, state: &State, request: ModelRequest) -> Result<ModelResponse>;
}