#![deny(missing_docs)]
#![deny(unsafe_code)]
pub mod coercion;
pub mod error;
pub mod message;
pub mod provider;
pub mod request;
pub mod response;
pub mod telemetry;
pub mod tool;
pub mod validation;
pub use error::{HealingError, ProviderError, Result, SimpleAgentsError, ValidationError};
pub use telemetry::{ApiFormat, OtelProtocol, TelemetryConfig, TraceContext};
pub mod prelude {
pub use crate::message::{
mime, ContentPart, ImageUrlContent, MediaContent, Message, MessageContent, Role,
};
pub use crate::request::{CompletionRequest, CompletionRequestBuilder};
pub use crate::response::{
ChoiceDelta, CompletionChoice, CompletionChunk, CompletionResponse, FinishReason,
MessageDelta, Usage,
};
pub use crate::error::{
HealingError, ProviderError, Result, SimpleAgentsError, ValidationError,
};
pub use crate::validation::ApiKey;
pub use crate::coercion::{CoercionFlag, CoercionResult};
pub use crate::tool::{
ToolCall, ToolCallFunction, ToolChoice, ToolChoiceFunction, ToolChoiceMode, ToolChoiceTool,
ToolDefinition, ToolFunction, ToolType,
};
pub use crate::provider::Provider;
pub use crate::provider::{ProviderRequest, ProviderResponse};
}
#[cfg(test)]
mod tests {
use super::prelude::*;
#[test]
fn test_prelude_imports() {
let _msg = Message::user("test");
let _request = CompletionRequest::builder()
.model("test")
.message(Message::user("test"))
.build()
.unwrap();
}
#[test]
fn test_error_conversion() {
let validation_err = ValidationError::new("test");
let _agents_err: SimpleAgentsError = validation_err.into();
}
#[test]
fn test_api_key_security() {
let key = ApiKey::new("sk-1234567890abcdef1234567890").unwrap();
let debug = format!("{:?}", key);
assert!(debug.contains("REDACTED"));
}
#[test]
fn test_coercion_transparency() {
let result = CoercionResult::new(42).with_flag(CoercionFlag::StrippedMarkdown);
assert!(result.was_coerced());
assert_eq!(result.flags.len(), 1);
}
#[test]
fn test_builder_pattern() {
let request = CompletionRequest::builder()
.model("gpt-4")
.message(Message::user("Hello"))
.temperature(0.7)
.build()
.unwrap();
assert_eq!(request.model, "gpt-4");
assert_eq!(request.temperature, Some(0.7));
}
#[test]
fn test_response_helper() {
let response = CompletionResponse {
id: "resp_123".to_string(),
model: "gpt-4".to_string(),
choices: vec![CompletionChoice {
index: 0,
message: Message::assistant("Hello!"),
finish_reason: FinishReason::Stop,
logprobs: None,
}],
usage: Usage::new(10, 5),
created: None,
provider: None,
healing_metadata: None,
};
assert_eq!(response.content(), Some("Hello!"));
}
#[test]
fn test_all_types_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<Message>();
assert_send_sync::<CompletionRequest>();
assert_send_sync::<CompletionResponse>();
assert_send_sync::<CoercionFlag>();
assert_send_sync::<CoercionResult<String>>();
assert_send_sync::<ProviderRequest>();
assert_send_sync::<ProviderResponse>();
}
}