llm 1.3.8

A Rust library unifying multiple LLM backends.
Documentation
use crate::{
    chat::{Tool, ToolChoice},
    error::LLMError,
    LLMProvider,
};

use super::super::helpers;
use crate::builder::state::BuilderState;

#[cfg(feature = "azure_openai")]
pub(super) fn build_azure_openai(
    state: &mut BuilderState,
    tools: Option<Vec<Tool>>,
    tool_choice: Option<ToolChoice>,
) -> Result<Box<dyn LLMProvider>, LLMError> {
    let endpoint = state.base_url.take().ok_or_else(|| {
        LLMError::InvalidRequest("No API endpoint provided for Azure OpenAI".into())
    })?;
    let api_key = helpers::require_api_key(state, "Azure OpenAI")?;
    let deployment = state.deployment_id.take().ok_or_else(|| {
        LLMError::InvalidRequest("No deployment ID provided for Azure OpenAI".into())
    })?;

    let timeout = helpers::timeout_or_default(state);
    let provider = crate::backends::azure_openai::AzureOpenAI::new(
        api_key,
        state.api_version.clone(),
        deployment,
        endpoint,
        state.model.take(),
        state.max_tokens,
        state.temperature,
        timeout,
        state.system.take(),
        state.top_p,
        state.top_k,
        state.embedding_encoding_format.take(),
        state.embedding_dimensions,
        tools,
        tool_choice,
        state.reasoning_effort.take(),
        state.json_schema.take(),
    );

    Ok(Box::new(provider))
}

#[cfg(not(feature = "azure_openai"))]
pub(super) fn build_azure_openai(
    _state: &mut BuilderState,
    _tools: Option<Vec<Tool>>,
    _tool_choice: Option<ToolChoice>,
) -> Result<Box<dyn LLMProvider>, LLMError> {
    Err(LLMError::InvalidRequest(
        "OpenAI feature not enabled".to_string(),
    ))
}

#[cfg(feature = "bedrock")]
pub(super) fn build_bedrock(
    state: &mut BuilderState,
    tools: Option<Vec<Tool>>,
    tool_choice: Option<ToolChoice>,
) -> Result<Box<dyn LLMProvider>, LLMError> {
    let region = state
        .base_url
        .take()
        .ok_or_else(|| LLMError::InvalidRequest("No region provided for AWS Bedrock".into()))?;
    let timeout = helpers::timeout_or_default(state);

    let provider = crate::backends::aws::BedrockBackend::new(
        region,
        state.model.take(),
        state.max_tokens,
        state.temperature,
        timeout,
        state.system.take(),
        state.top_p,
        state.top_k,
        tools,
        tool_choice,
        state.reasoning_effort.take(),
        state.json_schema.take(),
    )?;

    Ok(Box::new(provider))
}

#[cfg(not(feature = "bedrock"))]
pub(super) fn build_bedrock(
    _state: &mut BuilderState,
    _tools: Option<Vec<Tool>>,
    _tool_choice: Option<ToolChoice>,
) -> Result<Box<dyn LLMProvider>, LLMError> {
    Err(LLMError::InvalidRequest(
        "AWS Bedrock feature not enabled".to_string(),
    ))
}