use std::env;
use cmt::ai_mod::{ThinkingLevel, PROVIDERS};
use cmt::defaults::{DEFAULT_CLAUDE_MODEL, DEFAULT_GEMINI_MODEL, DEFAULT_OPENAI_MODEL};
use rstructor::{AnthropicClient, GeminiClient, Instructor, LLMClient, OpenAIClient};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Instructor)]
#[llm(description = "A simple test response")]
struct TestResponse {
#[llm(description = "A greeting message")]
message: String,
}
fn require_api_key(key: &str) {
if env::var(key).is_err() {
panic!("{} environment variable not set", key);
}
}
#[tokio::test]
async fn test_claude_with_rstructor() {
require_api_key("ANTHROPIC_API_KEY");
let client = AnthropicClient::from_env()
.expect("Failed to build Claude client")
.model(DEFAULT_CLAUDE_MODEL)
.temperature(0.3);
let result = client
.materialize::<TestResponse>("Say hello in a friendly way")
.await;
match result {
Ok(response) => {
println!("✓ Claude works with rstructor!");
println!(" Message: {}", response.message);
assert!(!response.message.is_empty(), "Message should not be empty");
}
Err(e) => {
panic!(
"Claude with rstructor failed (model: {}): {}",
DEFAULT_CLAUDE_MODEL, e
);
}
}
}
#[tokio::test]
async fn test_openai_with_rstructor() {
require_api_key("OPENAI_API_KEY");
let client = OpenAIClient::from_env()
.expect("Failed to build OpenAI client")
.model(DEFAULT_OPENAI_MODEL)
.temperature(0.3);
let result = client
.materialize::<TestResponse>("Say hello in a friendly way")
.await;
match result {
Ok(response) => {
println!("✓ OpenAI works with rstructor!");
println!(" Message: {}", response.message);
assert!(!response.message.is_empty(), "Message should not be empty");
}
Err(e) => {
panic!(
"OpenAI with rstructor failed (model: {}): {}",
DEFAULT_OPENAI_MODEL, e
);
}
}
}
#[tokio::test]
async fn test_gemini_with_rstructor() {
require_api_key("GEMINI_API_KEY");
let client = GeminiClient::from_env()
.expect("Failed to build Gemini client")
.model(DEFAULT_GEMINI_MODEL)
.temperature(0.3)
.thinking_level(rstructor::ThinkingLevel::Low);
let result = client
.materialize::<TestResponse>("Say hello in a friendly way")
.await;
match result {
Ok(response) => {
println!("✓ Gemini works with rstructor!");
println!(" Message: {}", response.message);
assert!(!response.message.is_empty(), "Message should not be empty");
}
Err(e) => {
panic!(
"Gemini with rstructor failed (model: {}): {}",
DEFAULT_GEMINI_MODEL, e
);
}
}
}
#[test]
fn test_provider_list() {
assert!(PROVIDERS.contains(&"claude"));
assert!(PROVIDERS.contains(&"openai"));
assert!(PROVIDERS.contains(&"gemini"));
}
#[test]
fn test_thinking_level() {
assert_eq!(ThinkingLevel::parse("none"), ThinkingLevel::Off);
assert_eq!(ThinkingLevel::parse("off"), ThinkingLevel::Off);
assert_eq!(ThinkingLevel::parse("minimal"), ThinkingLevel::Minimal);
assert_eq!(ThinkingLevel::parse("low"), ThinkingLevel::Low);
assert_eq!(ThinkingLevel::parse("high"), ThinkingLevel::High);
assert_eq!(ThinkingLevel::parse("unknown"), ThinkingLevel::Low);
}