#![warn(missing_docs)]
#![warn(rustdoc::missing_crate_level_docs)]
#![deny(unsafe_code)]
#![cfg_attr(docsrs, feature(doc_cfg))]
pub mod direct;
pub use serdes_ai_core as core;
pub use serdes_ai_agent as agent;
pub use serdes_ai_models as models;
pub use serdes_ai_providers as providers;
pub use serdes_ai_tools as tools;
pub use serdes_ai_toolsets as toolsets;
pub use serdes_ai_output as output;
pub use serdes_ai_streaming as streaming;
pub use serdes_ai_retries as retries;
#[cfg(feature = "mcp")]
#[cfg_attr(docsrs, doc(cfg(feature = "mcp")))]
pub use serdes_ai_mcp as mcp;
#[cfg(feature = "embeddings")]
#[cfg_attr(docsrs, doc(cfg(feature = "embeddings")))]
pub use serdes_ai_embeddings as embeddings;
#[cfg(feature = "graph")]
#[cfg_attr(docsrs, doc(cfg(feature = "graph")))]
pub use serdes_ai_graph as graph;
#[cfg(feature = "evals")]
#[cfg_attr(docsrs, doc(cfg(feature = "evals")))]
pub use serdes_ai_evals as evals;
#[cfg(feature = "macros")]
#[cfg_attr(docsrs, doc(cfg(feature = "macros")))]
pub use serdes_ai_macros::Tool;
#[cfg(feature = "macros")]
#[cfg_attr(docsrs, doc(cfg(feature = "macros")))]
pub use serdes_ai_macros::OutputSchema;
#[cfg(feature = "macros")]
#[cfg_attr(docsrs, doc(cfg(feature = "macros")))]
pub use serdes_ai_macros::tool;
#[cfg(feature = "macros")]
#[cfg_attr(docsrs, doc(cfg(feature = "macros")))]
pub use serdes_ai_macros::agent as agent_macro;
pub use serdes_ai_core::SerdesAiError;
pub use serdes_ai_core::{ConversationId, RunId, ToolCallId};
pub use serdes_ai_core::{
BinaryContent,
BuiltinToolCallPart,
BuiltinToolReturnContent,
BuiltinToolReturnPart,
CodeExecutionResult,
FilePart,
FileSearchResult,
FileSearchResults,
FinishReason,
ModelRequest,
ModelRequestPart,
ModelResponse,
ModelResponsePart,
ModelResponsePartDelta,
ModelResponseStreamEvent,
PartDeltaEvent,
PartEndEvent,
PartStartEvent,
SystemPromptPart,
TextPart,
ThinkingPart,
ToolCallPart,
ToolReturnPart,
UserContent,
WebSearchResult,
WebSearchResults,
};
pub use serdes_ai_core::ModelSettings;
pub use serdes_ai_core::{RequestUsage, RunUsage, UsageLimits};
pub use serdes_ai_core::{
format_as_xml, format_as_xml_with_options, XmlFormatError, XmlFormatOptions,
};
pub use serdes_ai_agent::{
Agent, AgentBuilder, AgentRun, AgentRunResult, AgentStream, AgentStreamEvent, EndStrategy,
ModelConfig, RunContext, RunOptions, StepResult,
};
pub use serdes_ai_models::Model;
pub use serdes_ai_models::{build_model_extended, build_model_with_config, ExtendedModelConfig};
#[cfg(feature = "openai")]
#[cfg_attr(docsrs, doc(cfg(feature = "openai")))]
pub use serdes_ai_models::openai::OpenAIChatModel;
#[cfg(feature = "anthropic")]
#[cfg_attr(docsrs, doc(cfg(feature = "anthropic")))]
pub use serdes_ai_models::anthropic::AnthropicModel;
#[cfg(feature = "gemini")]
#[cfg_attr(docsrs, doc(cfg(feature = "gemini")))]
pub use serdes_ai_models::GeminiModel;
#[cfg(feature = "groq")]
#[cfg_attr(docsrs, doc(cfg(feature = "groq")))]
pub use serdes_ai_models::groq::GroqModel;
#[cfg(feature = "mistral")]
#[cfg_attr(docsrs, doc(cfg(feature = "mistral")))]
pub use serdes_ai_models::mistral::MistralModel;
#[cfg(feature = "ollama")]
#[cfg_attr(docsrs, doc(cfg(feature = "ollama")))]
pub use serdes_ai_models::ollama::OllamaModel;
#[cfg(feature = "bedrock")]
#[cfg_attr(docsrs, doc(cfg(feature = "bedrock")))]
pub use serdes_ai_models::bedrock::BedrockModel;
pub use serdes_ai_tools::{
ObjectJsonSchema, SchemaBuilder, Tool, ToolDefinition, ToolRegistry, ToolResult,
};
pub use serdes_ai_toolsets::{
AbstractToolset, ApprovalRequiredToolset, BoxedToolset, CombinedToolset, DynamicToolset,
ExternalToolset, FilteredToolset, FunctionToolset, PrefixedToolset, PreparedToolset,
RenamedToolset, ToolsetInfo, ToolsetTool, WrapperToolset,
};
pub use serdes_ai_output::{
OutputSchema, StructuredOutputSchema, TextOutputSchema, ValidationResult,
};
pub use serdes_ai_streaming::{ResponseDelta, ResponseStream};
pub use serdes_ai_retries::{
ExponentialBackoff, FixedDelay, LinearBackoff, RetryConfig, RetryStrategy,
};
pub use direct::{
model_request, model_request_stream, model_request_stream_sync, model_request_sync,
DirectError, ModelSpec, StreamedResponseSync,
};
#[cfg(feature = "mcp")]
#[cfg_attr(docsrs, doc(cfg(feature = "mcp")))]
pub use serdes_ai_mcp::{McpClient, McpToolset};
#[cfg(feature = "embeddings")]
#[cfg_attr(docsrs, doc(cfg(feature = "embeddings")))]
pub use serdes_ai_embeddings::{EmbeddingModel, EmbeddingResult};
#[cfg(feature = "graph")]
#[cfg_attr(docsrs, doc(cfg(feature = "graph")))]
pub use serdes_ai_graph::{
BaseNode, Edge, End, Graph, GraphError, GraphExecutor, GraphResult, GraphRunContext,
GraphRunResult, NodeResult,
};
#[cfg(feature = "evals")]
#[cfg_attr(docsrs, doc(cfg(feature = "evals")))]
pub use serdes_ai_evals::{
Case, ContainsScorer, Dataset, EvalCase, EvalRunner, EvalSuite, EvaluationReport,
EvaluationResult, Evaluator, ExactMatchScorer,
};
pub mod prelude {
pub use crate::core::{ConversationId, Result, RunId, SerdesAiError, ToolCallId};
pub use crate::core::{
FinishReason, ModelRequest, ModelResponse, ModelSettings, RequestUsage, RunUsage,
UsageLimits, UserContent,
};
pub use crate::agent::{
Agent, AgentBuilder, AgentRun, AgentRunResult, AgentStream, AgentStreamEvent, EndStrategy,
ModelConfig, RunContext, RunOptions,
};
pub use crate::models::Model;
#[cfg(feature = "openai")]
pub use crate::models::openai::OpenAIChatModel;
#[cfg(feature = "anthropic")]
pub use crate::models::anthropic::AnthropicModel;
pub use crate::tools::{Tool, ToolDefinition, ToolRegistry, ToolResult};
pub use crate::toolsets::{
AbstractToolset, BoxedToolset, CombinedToolset, DynamicToolset, FunctionToolset,
};
pub use crate::output::{
OutputSchema, StructuredOutputSchema, TextOutputSchema, ValidationResult,
};
pub use crate::streaming::{ResponseDelta, ResponseStream};
pub use crate::retries::{ExponentialBackoff, RetryConfig, RetryStrategy};
pub use crate::direct::{model_request, model_request_stream, DirectError, ModelSpec};
pub use crate::core::{format_as_xml, XmlFormatOptions};
#[cfg(feature = "macros")]
pub use crate::{tool, OutputSchema as DeriveOutputSchema, Tool as DeriveTool};
#[cfg(feature = "mcp")]
pub use crate::mcp::{McpClient, McpToolset};
#[cfg(feature = "graph")]
pub use crate::graph::{
BaseNode, End, Graph, GraphError, GraphExecutor, GraphResult, GraphRunContext,
GraphRunResult, NodeResult,
};
#[cfg(feature = "evals")]
pub use crate::evals::{EvalCase, EvalRunner, EvalSuite, Evaluator};
}
pub fn version() -> &'static str {
env!("CARGO_PKG_VERSION")
}
pub fn version_tuple() -> (u32, u32, u32) {
let version = version();
let parts: Vec<&str> = version.split('.').collect();
(
parts.first().and_then(|s| s.parse().ok()).unwrap_or(0),
parts.get(1).and_then(|s| s.parse().ok()).unwrap_or(0),
parts.get(2).and_then(|s| s.parse().ok()).unwrap_or(0),
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_version() {
assert_eq!(version(), env!("CARGO_PKG_VERSION"));
}
#[test]
fn test_version_tuple() {
let (major, minor, patch) = version_tuple();
let expected: Vec<u32> = env!("CARGO_PKG_VERSION")
.split('.')
.map(|s| s.parse::<u32>().unwrap_or(0))
.collect();
assert_eq!(major, *expected.first().unwrap_or(&0));
assert_eq!(minor, *expected.get(1).unwrap_or(&0));
assert_eq!(patch, *expected.get(2).unwrap_or(&0));
}
#[test]
fn test_prelude_imports() {
let _: fn() -> &'static str = crate::version;
}
}