reagent-rs 0.2.9

A Rust library for building AI agents with MCP, custom tools and skills
Documentation
use std::collections::HashMap;

use crate::{
    services::llm::{InferenceClient, InferenceClientError},
    Provider,
};

#[derive(Debug, Clone, Default)]
pub struct ClientConfig {
    pub provider: Option<Provider>,
    pub base_url: Option<String>,
    pub api_key: Option<String>,
    pub organization: Option<String>,
    pub extra_headers: Option<std::collections::HashMap<String, String>>,
}

pub trait ClientBuilder {
    fn provider(self, provider: Option<Provider>) -> Self;
    fn base_url(self, base_url: Option<impl Into<String>>) -> Self;
    fn api_key(self, api_key: Option<impl Into<String>>) -> Self;
    fn organization(self, organization: Option<impl Into<String>>) -> Self;
    fn extra_headers(self, extra_headers: Option<HashMap<String, String>>) -> Self;
    fn build(self) -> Result<InferenceClient, InferenceClientError>;
}

impl ClientBuilder for ClientConfig {
    fn provider(mut self, provider: Option<Provider>) -> Self {
        self.provider = provider;
        self
    }

    fn base_url(mut self, base_url: Option<impl Into<String>>) -> Self {
        self.base_url = base_url.map(|s| s.into());
        self
    }

    fn api_key(mut self, api_key: Option<impl Into<String>>) -> Self {
        self.api_key = api_key.map(|s| s.into());
        self
    }

    fn organization(mut self, organization: Option<impl Into<String>>) -> Self {
        self.organization = organization.map(|s| s.into());
        self
    }

    fn extra_headers(mut self, extra_headers: Option<HashMap<String, String>>) -> Self {
        self.extra_headers = extra_headers;
        self
    }

    fn build(self) -> Result<InferenceClient, InferenceClientError> {
        InferenceClient::try_from(ClientConfig {
            provider: self.provider.or(Some(Provider::Ollama)),
            base_url: self.base_url,
            api_key: self.api_key,
            organization: self.organization,
            extra_headers: self.extra_headers,
        })
    }
}