llm 1.3.8

A Rust library unifying multiple LLM backends.
Documentation
use llm::builder::{LLMBackend, LLMBuilder};
use llm::LLMProvider;

use crate::provider::error::ProviderBuildError;

use super::ResolvedConfig;

pub(super) fn build_provider(
    backend: &LLMBackend,
    resolved: &ResolvedConfig,
    tool_builders: Vec<llm::builder::FunctionBuilder>,
) -> Result<Box<dyn LLMProvider>, ProviderBuildError> {
    let builder = LLMBuilder::new().backend(backend.clone());
    let builder = resolved.apply(builder);
    let builder = apply_tools(builder, tool_builders);
    builder
        .build()
        .map_err(|err| ProviderBuildError::Build(err.to_string()))
}

impl ResolvedConfig {
    fn apply(&self, mut builder: LLMBuilder) -> LLMBuilder {
        if let Some(value) = self.model.clone() {
            builder = builder.model(value);
        }
        if let Some(value) = self.system.clone() {
            builder = builder.system(value);
        }
        if let Some(value) = self.api_key.clone() {
            builder = builder.api_key(value);
        }
        if let Some(value) = self.base_url.clone() {
            builder = builder.base_url(value);
        }
        if let Some(value) = self.temperature {
            builder = builder.temperature(value);
        }
        if let Some(value) = self.max_tokens {
            builder = builder.max_tokens(value);
        }
        if let Some(value) = self.timeout_seconds {
            builder = builder.timeout_seconds(value);
        }
        builder
    }
}

fn apply_tools(
    mut builder: LLMBuilder,
    tool_builders: Vec<llm::builder::FunctionBuilder>,
) -> LLMBuilder {
    for tool in tool_builders {
        builder = builder.function(tool);
    }
    builder
}