use siumai::prelude::*;
use std::env;
async fn test_openai_interfaces() {
if env::var("OPENAI_API_KEY").is_err() {
println!("⏭️ Skipping OpenAI interface tests: OPENAI_API_KEY not set");
return;
}
println!("🔧 Testing OpenAI Provider interfaces...");
let api_key = env::var("OPENAI_API_KEY").unwrap();
println!(" 📦 Testing Provider::openai()...");
let mut provider_builder = Provider::openai()
.api_key(&api_key)
.model("gpt-4o-mini")
.temperature(0.7);
if let Ok(base_url) = env::var("OPENAI_BASE_URL") {
provider_builder = provider_builder.base_url(base_url);
}
match provider_builder.build().await {
Ok(provider_client) => {
println!(" ✅ Provider::openai() client created successfully");
let messages = vec![user!("Hello! This is a test of the Provider interface.")];
match provider_client.chat(messages).await {
Ok(response) => {
println!(" ✅ Provider interface chat successful");
println!(
" 📝 Response: {}",
response.content_text().unwrap_or_default().trim()
);
}
Err(e) => {
println!(" ❌ Provider interface chat failed: {}", e);
}
}
println!(" 🎯 Provider-specific features available through this interface");
}
Err(e) => {
println!(" ❌ Failed to create Provider::openai() client: {}", e);
}
}
println!(" 🌐 Testing Siumai::builder().openai()...");
let mut unified_builder = Siumai::builder()
.openai()
.api_key(&api_key)
.model("gpt-4o-mini")
.temperature(0.7);
if let Ok(base_url) = env::var("OPENAI_BASE_URL") {
unified_builder = unified_builder.base_url(base_url);
}
match unified_builder.build().await {
Ok(unified_client) => {
println!(" ✅ Siumai::builder().openai() client created successfully");
let messages = vec![user!("Hello! This is a test of the unified interface.")];
match unified_client.chat(messages).await {
Ok(response) => {
println!(" ✅ Unified interface chat successful");
println!(
" 📝 Response: {}",
response.content_text().unwrap_or_default().trim()
);
}
Err(e) => {
println!(" ❌ Unified interface chat failed: {}", e);
}
}
println!(" 🌐 Unified interface provides provider-agnostic access");
}
Err(e) => {
println!(
" ❌ Failed to create Siumai::builder().openai() client: {}",
e
);
}
}
println!("✅ OpenAI interface testing completed\n");
}
async fn test_anthropic_interfaces() {
if env::var("ANTHROPIC_API_KEY").is_err() {
println!("⏭️ Skipping Anthropic interface tests: ANTHROPIC_API_KEY not set");
return;
}
println!("🤖 Testing Anthropic Provider interfaces...");
let api_key = env::var("ANTHROPIC_API_KEY").unwrap();
println!(" 📦 Testing Provider::anthropic()...");
let mut provider_builder = Provider::anthropic()
.api_key(&api_key)
.model("claude-3-5-haiku-20241022")
.temperature(0.8);
if let Ok(base_url) = env::var("ANTHROPIC_BASE_URL") {
provider_builder = provider_builder.base_url(base_url);
}
match provider_builder.build().await {
Ok(provider_client) => {
println!(" ✅ Provider::anthropic() client created successfully");
let messages = vec![user!("Hello! Test the Anthropic Provider interface.")];
match provider_client.chat(messages).await {
Ok(response) => {
println!(" ✅ Provider interface chat successful");
println!(
" 📝 Response: {}",
response.content_text().unwrap_or_default().trim()
);
}
Err(e) => {
println!(" ❌ Provider interface chat failed: {}", e);
}
}
}
Err(e) => {
println!(
" ❌ Failed to create Provider::anthropic() client: {}",
e
);
}
}
println!(" 🌐 Testing Siumai::builder().anthropic()...");
let mut unified_builder = Siumai::builder()
.anthropic()
.api_key(&api_key)
.model("claude-3-5-haiku-20241022")
.temperature(0.8);
if let Ok(base_url) = env::var("ANTHROPIC_BASE_URL") {
unified_builder = unified_builder.base_url(base_url);
}
match unified_builder.build().await {
Ok(unified_client) => {
println!(" ✅ Siumai::builder().anthropic() client created successfully");
let messages = vec![user!("Hello! Test the unified Anthropic interface.")];
match unified_client.chat(messages).await {
Ok(response) => {
println!(" ✅ Unified interface chat successful");
println!(
" 📝 Response: {}",
response.content_text().unwrap_or_default().trim()
);
}
Err(e) => {
println!(" ❌ Unified interface chat failed: {}", e);
}
}
}
Err(e) => {
println!(
" ❌ Failed to create Siumai::builder().anthropic() client: {}",
e
);
}
}
println!("✅ Anthropic interface testing completed\n");
}
async fn test_gemini_interfaces() {
if env::var("GEMINI_API_KEY").is_err() {
println!("⏭️ Skipping Gemini interface tests: GEMINI_API_KEY not set");
return;
}
println!("💎 Testing Gemini Provider interfaces...");
let api_key = env::var("GEMINI_API_KEY").unwrap();
println!(" 📦 Testing Provider::gemini()...");
match Provider::gemini()
.api_key(&api_key)
.model("gemini-2.5-flash")
.temperature(0.7)
.build()
.await
{
Ok(provider_client) => {
println!(" ✅ Provider::gemini() client created successfully");
let messages = vec![user!("Hello! Test the Gemini Provider interface.")];
match provider_client.chat(messages).await {
Ok(response) => {
println!(" ✅ Provider interface chat successful");
println!(
" 📝 Response: {}",
response.content_text().unwrap_or_default().trim()
);
}
Err(e) => {
println!(" ❌ Provider interface chat failed: {}", e);
}
}
}
Err(e) => {
println!(" ❌ Failed to create Provider::gemini() client: {}", e);
}
}
println!(" 🌐 Testing Siumai::builder().gemini()...");
match Siumai::builder()
.gemini()
.api_key(&api_key)
.model("gemini-2.5-flash")
.temperature(0.7)
.build()
.await
{
Ok(unified_client) => {
println!(" ✅ Siumai::builder().gemini() client created successfully");
let messages = vec![user!("Hello! Test the unified Gemini interface.")];
match unified_client.chat(messages).await {
Ok(response) => {
println!(" ✅ Unified interface chat successful");
println!(
" 📝 Response: {}",
response.content_text().unwrap_or_default().trim()
);
}
Err(e) => {
println!(" ❌ Unified interface chat failed: {}", e);
}
}
}
Err(e) => {
println!(
" ❌ Failed to create Siumai::builder().gemini() client: {}",
e
);
}
}
println!("✅ Gemini interface testing completed\n");
}
async fn test_ollama_interfaces() {
let base_url =
env::var("OLLAMA_BASE_URL").unwrap_or_else(|_| "http://localhost:11434".to_string());
let test_client = reqwest::Client::new();
match test_client
.get(format!("{}/api/tags", base_url))
.send()
.await
{
Ok(response) if response.status().is_success() => {
println!("🦙 Testing Ollama Provider interfaces...");
}
_ => {
println!(
"⏭️ Skipping Ollama interface tests: Ollama not available at {}",
base_url
);
return;
}
}
println!(" 📦 Testing Provider::ollama()...");
match Provider::ollama()
.base_url(&base_url)
.model("llama3.2:3b")
.temperature(0.7)
.build()
.await
{
Ok(provider_client) => {
println!(" ✅ Provider::ollama() client created successfully");
let messages = vec![user!("Hello! Test the Ollama Provider interface.")];
match provider_client.chat(messages).await {
Ok(response) => {
println!(" ✅ Provider interface chat successful");
println!(
" 📝 Response: {}",
response.content_text().unwrap_or_default().trim()
);
}
Err(e) => {
println!(" ❌ Provider interface chat failed: {}", e);
}
}
}
Err(e) => {
println!(" ❌ Failed to create Provider::ollama() client: {}", e);
}
}
println!(" 🌐 Testing Siumai::builder().ollama()...");
match Siumai::builder()
.ollama()
.base_url(&base_url)
.model("llama3.2:3b")
.temperature(0.7)
.build()
.await
{
Ok(unified_client) => {
println!(" ✅ Siumai::builder().ollama() client created successfully");
let messages = vec![user!("Hello! Test the unified Ollama interface.")];
match unified_client.chat(messages).await {
Ok(response) => {
println!(" ✅ Unified interface chat successful");
println!(
" 📝 Response: {}",
response.content_text().unwrap_or_default().trim()
);
}
Err(e) => {
println!(" ❌ Unified interface chat failed: {}", e);
}
}
}
Err(e) => {
println!(
" ❌ Failed to create Siumai::builder().ollama() client: {}",
e
);
}
}
println!("✅ Ollama interface testing completed\n");
}
async fn test_interface_consistency() {
println!("🔄 Testing interface consistency...");
println!(" ✅ Both Provider::* and Siumai::builder() interfaces use the same builder pattern");
println!(" ✅ Both interfaces support the same common parameters");
println!(" ✅ Provider interface provides access to provider-specific features");
println!(" ✅ Unified interface provides provider-agnostic access");
println!("✅ Interface consistency verified\n");
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
#[ignore]
async fn test_openai_provider_interface() {
test_openai_interfaces().await;
}
#[tokio::test]
#[ignore]
async fn test_anthropic_provider_interface() {
test_anthropic_interfaces().await;
}
#[tokio::test]
#[ignore]
async fn test_gemini_provider_interface() {
test_gemini_interfaces().await;
}
#[tokio::test]
#[ignore]
async fn test_ollama_provider_interface() {
test_ollama_interfaces().await;
}
#[tokio::test]
#[ignore]
async fn test_all_provider_interfaces() {
println!("🚀 Running Provider interface tests for all available providers...\n");
test_openai_interfaces().await;
test_anthropic_interfaces().await;
test_gemini_interfaces().await;
test_ollama_interfaces().await;
test_interface_consistency().await;
println!("🎉 All Provider interface testing completed!");
}
#[tokio::test]
async fn test_interface_consistency_unit() {
test_interface_consistency().await;
}
}