pub const ENABLED_PROVIDERS: &str = env!("SIUMAI_ENABLED_PROVIDERS");
pub const PROVIDER_COUNT: &str = env!("SIUMAI_PROVIDER_COUNT");
pub mod analysis;
pub mod benchmarks;
pub mod builder;
pub mod client;
pub mod custom_provider;
pub mod defaults;
pub mod error;
pub mod multimodal;
pub mod params;
pub mod performance;
pub mod provider;
pub mod provider_builders;
pub mod provider_features;
#[cfg(any(
feature = "openai",
feature = "anthropic",
feature = "google",
feature = "ollama",
feature = "xai",
feature = "groq"
))]
pub mod providers;
pub mod request_factory;
pub mod retry;
pub mod retry_api;
pub mod retry_backoff;
#[deprecated(
since = "0.10.2",
note = "Use retry_api facade instead; scheduled for removal in 0.11"
)]
pub mod retry_strategy;
pub mod stream;
pub mod tracing;
pub mod traits;
pub mod types;
pub mod utils;
pub mod web_search;
pub use error::LlmError;
pub use traits::{
AudioCapability, ChatCapability, CompletionCapability, EmbeddingCapability,
FileManagementCapability, ImageGenerationCapability, ModelListingCapability,
ModerationCapability, ProviderCapabilities, RerankCapability, VisionCapability,
};
pub use client::LlmClient;
pub use types::{
ChatMessage, ChatResponse, CommonParams, CompletionRequest, CompletionResponse,
EmbeddingRequest, EmbeddingResponse, FinishReason, HttpConfig, ImageGenerationRequest,
ImageGenerationResponse, MessageContent, MessageRole, ModelInfo, ModerationRequest,
ModerationResponse, ProviderType, ResponseMetadata, Tool, ToolCall, Usage,
};
pub use builder::LlmBuilder;
#[cfg(feature = "anthropic")]
pub use providers::anthropic::AnthropicBuilder;
#[cfg(feature = "google")]
pub use providers::gemini::GeminiBuilder;
#[cfg(feature = "ollama")]
pub use providers::ollama::OllamaBuilder;
#[cfg(feature = "openai")]
pub use providers::openai::OpenAiBuilder;
pub use stream::{ChatStream, ChatStreamEvent};
pub use types::{WebSearchConfig, WebSearchResult};
pub use performance::{PerformanceMetrics, PerformanceMonitor};
#[allow(deprecated)]
#[deprecated(
since = "0.10.2",
note = "Use retry_api::RetryOptions/RetryBackend; will be removed in 0.11"
)]
pub use retry_strategy::RetryStrategy;
pub use retry_api::{RetryBackend, RetryOptions, retry, retry_for_provider, retry_with};
pub use benchmarks::{BenchmarkConfig, BenchmarkResults, BenchmarkRunner};
pub use custom_provider::{CustomProvider, CustomProviderConfig};
pub use provider_features::ProviderFeatures;
pub use types::models::model_constants as models;
pub use types::models::constants;
pub use tracing::{OutputFormat, TracingConfig, init_debug_tracing, init_tracing};
pub mod prelude {
pub use crate::benchmarks::*;
pub use crate::builder::*;
pub use crate::client::*;
pub use crate::custom_provider::*;
pub use crate::error::LlmError;
pub use crate::multimodal::*;
pub use crate::performance::*;
pub use crate::provider::Siumai;
pub use crate::provider::*;
pub use crate::provider_features::*;
pub use crate::retry_api::*;
#[allow(deprecated)]
#[deprecated(since = "0.10.2", note = "Use retry_api::*; will be removed in 0.11")]
pub use crate::retry_strategy::*;
pub use crate::stream::*;
pub use crate::tracing::*;
pub use crate::traits::*;
pub use crate::types::*;
pub use crate::web_search::*;
pub use crate::constants;
pub use crate::models;
pub use crate::{Provider, assistant, provider, system, tool, user, user_with_image};
pub use crate::{conversation, conversation_with_system, messages, quick_chat};
#[cfg(feature = "anthropic")]
pub use crate::{quick_anthropic, quick_anthropic_with_model};
#[cfg(feature = "google")]
pub use crate::{quick_gemini, quick_gemini_with_model};
#[cfg(feature = "groq")]
pub use crate::{quick_groq, quick_groq_with_model};
#[cfg(feature = "openai")]
pub use crate::{quick_openai, quick_openai_with_model};
}
pub struct Provider;
impl Provider {
#[cfg(feature = "openai")]
pub fn openai() -> providers::openai::OpenAiBuilder {
crate::builder::LlmBuilder::new().openai()
}
#[cfg(feature = "anthropic")]
pub fn anthropic() -> providers::anthropic::AnthropicBuilder {
crate::builder::LlmBuilder::new().anthropic()
}
#[cfg(feature = "google")]
pub fn gemini() -> providers::gemini::GeminiBuilder {
crate::builder::LlmBuilder::new().gemini()
}
#[cfg(feature = "ollama")]
pub fn ollama() -> providers::ollama::OllamaBuilder {
crate::builder::LlmBuilder::new().ollama()
}
#[cfg(feature = "xai")]
pub fn xai() -> crate::providers::xai::XaiBuilder {
crate::providers::xai::XaiBuilder::new()
}
#[cfg(feature = "groq")]
pub fn groq() -> crate::providers::groq::GroqBuilder {
crate::providers::groq::GroqBuilder::new()
}
}
impl crate::provider::Siumai {
pub fn builder() -> crate::provider::SiumaiBuilder {
crate::provider::SiumaiBuilder::new()
}
}
#[cfg(feature = "anthropic")]
pub use crate::builder::quick_anthropic;
#[cfg(feature = "anthropic")]
pub use crate::builder::quick_anthropic_with_model;
#[cfg(feature = "google")]
pub use crate::builder::quick_gemini;
#[cfg(feature = "google")]
pub use crate::builder::quick_gemini_with_model;
#[cfg(feature = "groq")]
pub use crate::builder::quick_groq;
#[cfg(feature = "groq")]
pub use crate::builder::quick_groq_with_model;
#[cfg(feature = "openai")]
pub use crate::builder::quick_openai;
#[cfg(feature = "openai")]
pub use crate::builder::quick_openai_with_model;
#[macro_export]
macro_rules! user {
($content:expr) => {
$crate::types::ChatMessage {
role: $crate::types::MessageRole::User,
content: $crate::types::MessageContent::Text($content.into()),
metadata: $crate::types::MessageMetadata::default(),
tool_calls: None,
tool_call_id: None,
}
};
($content:expr, cache: $cache:expr) => {
$crate::types::ChatMessage::user($content)
.cache_control($cache)
.build()
};
}
#[macro_export]
macro_rules! user_builder {
($content:expr) => {
$crate::types::ChatMessage::user($content)
};
}
#[macro_export]
macro_rules! system {
($content:expr) => {
$crate::types::ChatMessage {
role: $crate::types::MessageRole::System,
content: $crate::types::MessageContent::Text($content.into()),
metadata: $crate::types::MessageMetadata::default(),
tool_calls: None,
tool_call_id: None,
}
};
($content:expr, cache: $cache:expr) => {
$crate::types::ChatMessage::system($content)
.cache_control($cache)
.build()
};
}
#[macro_export]
macro_rules! assistant {
($content:expr) => {
$crate::types::ChatMessage {
role: $crate::types::MessageRole::Assistant,
content: $crate::types::MessageContent::Text($content.into()),
metadata: $crate::types::MessageMetadata::default(),
tool_calls: None,
tool_call_id: None,
}
};
($content:expr, tools: $tools:expr) => {
$crate::types::ChatMessage::assistant($content)
.with_tool_calls($tools)
.build()
};
}
#[macro_export]
macro_rules! tool {
($content:expr, id: $id:expr) => {
$crate::types::ChatMessage {
role: $crate::types::MessageRole::Tool,
content: $crate::types::MessageContent::Text($content.into()),
metadata: $crate::types::MessageMetadata::default(),
tool_calls: None,
tool_call_id: Some($id.into()),
}
};
}
#[macro_export]
macro_rules! user_with_image {
($text:expr, $image_url:expr) => {
$crate::types::ChatMessage::user($text)
.with_image($image_url.to_string(), None)
.build()
};
($text:expr, $image_url:expr, detail: $detail:expr) => {
$crate::types::ChatMessage::user($text)
.with_image($image_url.to_string(), Some($detail.to_string()))
.build()
};
}
#[macro_export]
macro_rules! messages {
($($msg:expr),* $(,)?) => {
vec![$($msg),*]
};
}
#[macro_export]
macro_rules! conversation {
($($user:expr => $assistant:expr),* $(,)?) => {
{
let mut msgs = Vec::new();
$(
msgs.push($crate::user!($user));
msgs.push($crate::assistant!($assistant));
)*
msgs
}
};
}
#[macro_export]
macro_rules! conversation_with_system {
($system:expr, $($user:expr => $assistant:expr),* $(,)?) => {
{
let mut msgs = vec![$crate::system!($system)];
$(
msgs.push($crate::user!($user));
msgs.push($crate::assistant!($assistant));
)*
msgs
}
};
}
#[macro_export]
macro_rules! quick_chat {
($msg:expr) => {
vec![$crate::user!($msg)]
};
(system: $system:expr, $msg:expr) => {
vec![$crate::system!($system), $crate::user!($msg)]
};
}
#[cfg(feature = "anthropic")]
pub use providers::convenience::core::anthropic;
#[cfg(feature = "google")]
pub use providers::convenience::core::gemini;
#[cfg(feature = "groq")]
pub use providers::convenience::core::groq;
#[cfg(feature = "ollama")]
pub use providers::convenience::core::ollama;
#[cfg(feature = "openai")]
pub use providers::convenience::core::openai;
#[cfg(feature = "xai")]
pub use providers::convenience::core::xai;
#[cfg(feature = "openai")]
pub use providers::convenience::openai_compatible::*;
#[cfg(test)]
mod tests {
use super::*;
use crate::provider::Siumai;
#[test]
fn test_macros() {
let user_msg = user!("Hello");
assert_eq!(user_msg.role, MessageRole::User);
let system_msg = system!("You are helpful");
assert_eq!(system_msg.role, MessageRole::System);
let assistant_msg = assistant!("I can help");
assert_eq!(assistant_msg.role, MessageRole::Assistant);
match user_msg.content {
MessageContent::Text(text) => assert_eq!(text, "Hello"),
_ => panic!("Expected text content"),
}
}
#[test]
fn test_provider_builder() {
let _openai_builder = Provider::openai();
let _anthropic_builder = Provider::anthropic();
let _siumai_builder = Siumai::builder();
}
}