systemprompt-ai 0.4.0

Provider-agnostic LLM integration for systemprompt.io AI governance — Anthropic, OpenAI, Gemini, and local models unified behind one governed pipeline with cost tracking and audit.
Documentation
use crate::models::ai::{AiMessage, SamplingParams};
use crate::models::providers::gemini::GeminiFunctionCallingMode;
use crate::models::tools::{CallToolResult, McpTool, ToolCall};

#[derive(Debug)]
pub struct ToolRequestParams<'a> {
    pub messages: &'a [AiMessage],
    pub tools: &'a [McpTool],
    pub sampling: Option<&'a SamplingParams>,
    pub max_output_tokens: u32,
    pub model: &'a str,
}

#[derive(Debug)]
pub struct ToolRequestParamsBuilder<'a> {
    messages: &'a [AiMessage],
    tools: &'a [McpTool],
    sampling: Option<&'a SamplingParams>,
    max_output_tokens: u32,
    model: &'a str,
}

impl<'a> ToolRequestParamsBuilder<'a> {
    pub const fn new(
        messages: &'a [AiMessage],
        tools: &'a [McpTool],
        max_output_tokens: u32,
        model: &'a str,
    ) -> Self {
        Self {
            messages,
            tools,
            sampling: None,
            max_output_tokens,
            model,
        }
    }

    pub const fn with_sampling(mut self, sampling: &'a SamplingParams) -> Self {
        self.sampling = Some(sampling);
        self
    }

    pub const fn build(self) -> ToolRequestParams<'a> {
        ToolRequestParams {
            messages: self.messages,
            tools: self.tools,
            sampling: self.sampling,
            max_output_tokens: self.max_output_tokens,
            model: self.model,
        }
    }
}

impl<'a> ToolRequestParams<'a> {
    pub const fn builder(
        messages: &'a [AiMessage],
        tools: &'a [McpTool],
        max_output_tokens: u32,
        model: &'a str,
    ) -> ToolRequestParamsBuilder<'a> {
        ToolRequestParamsBuilder::new(messages, tools, max_output_tokens, model)
    }
}

#[derive(Debug)]
pub struct ToolResultParams<'a> {
    pub conversation_history: &'a [AiMessage],
    pub tool_calls: &'a [ToolCall],
    pub tool_results: &'a [CallToolResult],
    pub sampling: Option<&'a SamplingParams>,
    pub max_output_tokens: u32,
    pub model: &'a str,
}

#[derive(Debug)]
pub struct ToolResultParamsBuilder<'a> {
    conversation_history: &'a [AiMessage],
    tool_calls: &'a [ToolCall],
    tool_results: &'a [CallToolResult],
    sampling: Option<&'a SamplingParams>,
    max_output_tokens: u32,
    model: &'a str,
}

impl<'a> ToolResultParamsBuilder<'a> {
    pub const fn new(
        conversation_history: &'a [AiMessage],
        tool_calls: &'a [ToolCall],
        tool_results: &'a [CallToolResult],
        max_output_tokens: u32,
        model: &'a str,
    ) -> Self {
        Self {
            conversation_history,
            tool_calls,
            tool_results,
            sampling: None,
            max_output_tokens,
            model,
        }
    }

    pub const fn with_sampling(mut self, sampling: &'a SamplingParams) -> Self {
        self.sampling = Some(sampling);
        self
    }

    pub const fn build(self) -> ToolResultParams<'a> {
        ToolResultParams {
            conversation_history: self.conversation_history,
            tool_calls: self.tool_calls,
            tool_results: self.tool_results,
            sampling: self.sampling,
            max_output_tokens: self.max_output_tokens,
            model: self.model,
        }
    }
}

impl<'a> ToolResultParams<'a> {
    pub const fn builder(
        conversation_history: &'a [AiMessage],
        tool_calls: &'a [ToolCall],
        tool_results: &'a [CallToolResult],
        max_output_tokens: u32,
        model: &'a str,
    ) -> ToolResultParamsBuilder<'a> {
        ToolResultParamsBuilder::new(
            conversation_history,
            tool_calls,
            tool_results,
            max_output_tokens,
            model,
        )
    }
}

pub(super) struct ToolConfigParams<'a> {
    pub messages: &'a [AiMessage],
    pub tools: Vec<McpTool>,
    pub sampling: Option<&'a SamplingParams>,
    pub max_output_tokens: u32,
    pub model: &'a str,
    pub function_calling_mode: GeminiFunctionCallingMode,
    pub allowed_function_names: Option<Vec<String>>,
}

impl<'a> ToolConfigParams<'a> {
    pub fn new(base: &ToolRequestParams<'a>) -> Self {
        Self {
            messages: base.messages,
            tools: base.tools.to_vec(),
            sampling: base.sampling,
            max_output_tokens: base.max_output_tokens,
            model: base.model,
            function_calling_mode: GeminiFunctionCallingMode::Auto,
            allowed_function_names: None,
        }
    }
}