serdes_ai_toolsets/lib.rs
1//! # serdes-ai-toolsets
2//!
3//! Toolset abstractions for grouping and managing tools.
4//!
5//! This crate provides the infrastructure for organizing tools into logical
6//! groups with shared configuration, lifecycle management, and composition.
7//!
8//! ## Core Concepts
9//!
10//! - **[`AbstractToolset`]**: Base trait for all toolsets
11//! - **[`FunctionToolset`]**: Wrap function-based tools
12//! - **[`CombinedToolset`]**: Merge multiple toolsets
13//! - **[`DynamicToolset`]**: Runtime tool management
14//!
15//! ## Toolset Wrappers
16//!
17//! - **[`FilteredToolset`]**: Filter tools by predicate
18//! - **[`PrefixedToolset`]**: Add name prefixes
19//! - **[`RenamedToolset`]**: Rename specific tools
20//! - **[`PreparedToolset`]**: Runtime tool modification
21//! - **[`ApprovalRequiredToolset`]**: Require approval
22//! - **[`WrapperToolset`]**: Pre/post processing hooks
23//! - **[`ExternalToolset`]**: External tool execution
24//!
25//! ## Example
26//!
27//! ```rust
28//! use serdes_ai_toolsets::{FunctionToolset, CombinedToolset, PrefixedToolset, AbstractToolset};
29//! use serdes_ai_tools::{Tool, ToolDefinition, RunContext, ToolReturn, ToolError};
30//! use async_trait::async_trait;
31//!
32//! struct SearchTool;
33//!
34//! #[async_trait]
35//! impl Tool for SearchTool {
36//! fn definition(&self) -> ToolDefinition {
37//! ToolDefinition::new("search", "Search for items")
38//! }
39//!
40//! async fn call(&self, _ctx: &RunContext, _args: serde_json::Value) -> Result<ToolReturn, ToolError> {
41//! Ok(ToolReturn::text("results"))
42//! }
43//! }
44//!
45//! // Create toolsets
46//! let web_tools = FunctionToolset::new().with_id("web").tool(SearchTool);
47//! let local_tools = FunctionToolset::new().with_id("local").tool(SearchTool);
48//!
49//! // Prefix to avoid conflicts
50//! let prefixed_web = PrefixedToolset::new(web_tools, "web");
51//! let prefixed_local = PrefixedToolset::new(local_tools, "local");
52//!
53//! // Combine into one
54//! let all_tools = CombinedToolset::new()
55//! .with_toolset(prefixed_web)
56//! .with_toolset(prefixed_local);
57//! ```
58
59#![warn(missing_docs)]
60#![deny(unsafe_code)]
61
62pub mod abstract_toolset;
63pub mod approval;
64pub mod combined;
65pub mod dynamic;
66pub mod external;
67pub mod filtered;
68pub mod function;
69pub mod prefixed;
70pub mod prepared;
71pub mod renamed;
72pub mod wrapper;
73
74// Re-exports
75pub use abstract_toolset::{
76 AbstractToolset, BoxedToolset, ToolsetInfo, ToolsetResult, ToolsetTool,
77};
78pub use approval::{checkers as approval_checkers, ApprovalRequiredToolset};
79pub use combined::CombinedToolset;
80pub use dynamic::DynamicToolset;
81pub use external::ExternalToolset;
82pub use filtered::{filters, FilteredToolset};
83pub use function::{AsyncFnTool, FunctionToolset};
84pub use prefixed::PrefixedToolset;
85pub use prepared::{preparers, PreparedToolset};
86pub use renamed::RenamedToolset;
87pub use wrapper::{LoggingWrapper, WrapperToolset};
88
89/// Prelude for common imports.
90pub mod prelude {
91 pub use crate::{
92 AbstractToolset, ApprovalRequiredToolset, BoxedToolset, CombinedToolset, DynamicToolset,
93 ExternalToolset, FilteredToolset, FunctionToolset, PrefixedToolset, PreparedToolset,
94 RenamedToolset, ToolsetInfo, ToolsetResult, ToolsetTool, WrapperToolset,
95 };
96}