Skip to main content

ai_agents/
lib.rs

1//! # AI Agents Framework
2//!
3//! **One YAML = Any Agent.** A Rust framework for building AI agents from a single YAML
4//! specification. No code required for common use cases.
5//!
6//! # Quick Start
7//!
8//! ### From YAML
9//!
10//! ```rust,ignore
11//! use ai_agents::{Agent, AgentBuilder};
12//!
13//! #[tokio::main]
14//! async fn main() -> ai_agents::Result<()> {
15//!     let agent = AgentBuilder::from_yaml_file("agent.yaml")?
16//!         .auto_configure_llms()?
17//!         .build()?;
18//!
19//!     let response = agent.chat("Hello!").await?;
20//!     println!("{}", response.content);
21//!     Ok(())
22//! }
23//! ```
24//!
25//! ### From Rust API
26//!
27//! ```rust,ignore
28//! use ai_agents::{Agent, AgentBuilder, UnifiedLLMProvider, ProviderType};
29//! use std::sync::Arc;
30//!
31//! #[tokio::main]
32//! async fn main() -> ai_agents::Result<()> {
33//!     let llm = UnifiedLLMProvider::from_env(ProviderType::OpenAI, "gpt-5.4-nano")?;
34//!
35//!     let agent = AgentBuilder::new()
36//!         .system_prompt("You are a helpful assistant.")
37//!         .llm(Arc::new(llm))
38//!         .build()?;
39//!
40//!     let response = agent.chat("Hello!").await?;
41//!     println!("{}", response.content);
42//!     Ok(())
43//! }
44//! ```
45//!
46//! # Modules
47//!
48//! | Module | Description |
49//! |--------|-------------|
50//! | [`agent`] | Agent builder, runtime, streaming, and response types |
51//! | [`llm`] | LLM providers and registry |
52//! | [`memory`] | Conversation memory with compression and token budgeting |
53//! | [`tools`] | Built-in tools and extensible tool registry |
54//! | [`state`] | Hierarchical state machine with LLM-evaluated transitions |
55//! | [`context`] | Dynamic context injection from multiple sources |
56//! | [`skill`] | Reusable workflows with LLM-based intent routing |
57//! | [`hitl`] | Human-in-the-loop approval system |
58//! | [`reasoning`] | Chain-of-thought, ReAct, plan-and-execute modes |
59//! | [`disambiguation`] | Intent ambiguity detection and clarification |
60//! | [`persistence`] | SQLite, Redis, and file storage backends |
61//! | [`process`] | Input/output processing pipeline |
62//! | [`recovery`] | Error recovery with retry and fallback strategies |
63//! | [`hooks`] | Lifecycle event hooks for logging, metrics, monitoring |
64//! | [`spec`] | YAML agent specification types |
65//! | [`template`] | Template loading with Jinja2 rendering and inheritance |
66//! | [`spawner`] | Dynamic agent spawning, registry, and inter-agent messaging |
67//! | [`observability`] | Latency, token, cost, trace, and export metrics |
68//!
69//! # Feature Flags
70//!
71//! | Flag | Description |
72//! |------|-------------|
73//! | `sqlite` | SQLite storage backend |
74//! | `redis-storage` | Redis storage backend |
75//! | `http-context` | HTTP context source for dynamic context injection |
76//! | `full-storage` | All storage backends (`sqlite` + `redis-storage`) |
77//! | `full` | All optional features enabled |
78
79pub mod agent {
80    pub use ai_agents_runtime::{
81        Agent, AgentBuilder, AgentInfo, AgentResponse, AwaitBeforeNextTurn,
82        BackgroundOverflowPolicy, MainResponseDraft, MaintenanceMode, MaintenanceTaskPolicy,
83        ParallelToolsConfig, PostTurnOptimizationConfig, RuntimeAgent, RuntimeBranch,
84        RuntimeBranchOutcome, RuntimeBranchResult, RuntimeBranchStatus, RuntimeCommitBehavior,
85        RuntimeConfig, RuntimeControlHandle, RuntimeOptimizationConfig, RuntimeOptimizationKind,
86        RuntimeTaskPriority, RuntimeTaskPurpose, ScheduledBranchSet, SkillCandidate,
87        StreamBranchBuffer, StreamChunk, StreamingConfig, StreamingDraftResult,
88        StreamingOptimizationPolicy, ToolCall, TurnActorContext, TurnBranchScheduler,
89        TurnOptimizationContext,
90    };
91}
92
93pub mod context {
94    pub use ai_agents_context::{
95        BuiltinSource, ContextManager, ContextProvider, ContextSource, RefreshPolicy,
96        TemplateRenderer,
97    };
98}
99
100pub mod error {
101    pub use ai_agents_core::{AgentError, Result};
102}
103
104pub mod dot_path {
105    pub use ai_agents_core::{get_dot_path, get_dot_path_from_map, set_dot_path};
106}
107
108pub mod hitl {
109    pub use ai_agents_hitl::{
110        ApprovalCondition, ApprovalHandler, ApprovalMessage, ApprovalRequest, ApprovalResult,
111        ApprovalTrigger, AutoApproveHandler, CallbackHandler, HITLCheckResult, HITLConfig,
112        HITLEngine, LlmGenerateConfig, LocalizedHandler, MessageLanguageConfig,
113        MessageLanguageStrategy, MessageResolver, RejectAllHandler, StateApprovalConfig,
114        StateApprovalTrigger, TimeoutAction, ToolApprovalConfig, create_handler,
115        create_localized_handler, resolve_best_language, resolve_tool_message,
116    };
117}
118
119pub mod hooks {
120    pub use ai_agents_hooks::{AgentHooks, CompositeHooks, HookTimer, LoggingHooks, NoopHooks};
121}
122
123pub mod llm {
124    pub use ai_agents_core::{
125        ChatMessage, FinishReason, LLMCapability, LLMChunk, LLMConfig, LLMError, LLMFeature,
126        LLMProvider, LLMResponse, Role, TaskContext, TokenUsage, ToolSelection,
127    };
128    pub use ai_agents_llm::LLMRegistry;
129    pub use ai_agents_llm::multi::MultiLLMRouter;
130
131    pub mod providers {
132        pub use ai_agents_llm::providers::{ProviderBuilder, ProviderType, UnifiedLLMProvider};
133    }
134}
135
136pub mod memory {
137    use std::sync::Arc;
138
139    use ai_agents_core::LLMProvider;
140
141    pub use ai_agents_core::MemorySnapshot;
142    pub use ai_agents_memory::{
143        CompactingMemory, CompactingMemoryConfig, CompressResult, CompressionEvent,
144        ConversationContext, EvictionReason, FactExtractedEvent, InMemoryStore, LLMSummarizer,
145        Memory, MemoryBudgetEvent, MemoryBudgetState, MemoryCompressEvent, MemoryEvictEvent,
146        MemoryTokenBudget, NoopSummarizer, OverflowStrategy, Summarizer, TokenAllocation,
147        estimate_message_tokens, estimate_tokens,
148    };
149    pub use ai_agents_runtime::spec::MemoryConfig;
150
151    pub fn create_memory(memory_type: &str, max_messages: usize) -> Arc<dyn Memory> {
152        match memory_type {
153            "in-memory" => Arc::new(InMemoryStore::new(max_messages)),
154            "compacting" => {
155                let summarizer: Arc<dyn Summarizer> = Arc::new(NoopSummarizer);
156                Arc::new(CompactingMemory::with_default_config(summarizer))
157            }
158            _ => Arc::new(InMemoryStore::new(max_messages)),
159        }
160    }
161
162    pub fn create_memory_from_config(config: &MemoryConfig) -> Arc<dyn Memory> {
163        if config.is_compacting() {
164            let summarizer: Arc<dyn Summarizer> = Arc::new(NoopSummarizer);
165            let compacting_config = config.to_compacting_config();
166            Arc::new(CompactingMemory::new(summarizer, compacting_config))
167        } else {
168            Arc::new(InMemoryStore::new(config.max_messages))
169        }
170    }
171
172    pub fn create_memory_from_config_with_llm(
173        config: &MemoryConfig,
174        llm: Option<Arc<dyn LLMProvider>>,
175    ) -> Arc<dyn Memory> {
176        if config.is_compacting() {
177            let summarizer: Arc<dyn Summarizer> = match llm {
178                Some(provider) => Arc::new(LLMSummarizer::new(provider)),
179                None => Arc::new(NoopSummarizer),
180            };
181            let compacting_config = config.to_compacting_config();
182            Arc::new(CompactingMemory::new(summarizer, compacting_config))
183        } else {
184            Arc::new(InMemoryStore::new(config.max_messages))
185        }
186    }
187
188    pub fn create_compacting_memory(
189        summarizer: Arc<dyn Summarizer>,
190        config: CompactingMemoryConfig,
191    ) -> Arc<dyn Memory> {
192        Arc::new(CompactingMemory::new(summarizer, config))
193    }
194
195    pub fn create_compacting_memory_from_config(
196        summarizer: Arc<dyn Summarizer>,
197        config: &MemoryConfig,
198    ) -> Arc<dyn Memory> {
199        let compacting_config = config.to_compacting_config();
200        Arc::new(CompactingMemory::new(summarizer, compacting_config))
201    }
202}
203
204pub mod persistence {
205    use std::sync::Arc;
206
207    pub use ai_agents_core::{
208        AgentSnapshot, AgentStorage, MemorySnapshot, Result, SpawnedAgentEntry,
209    };
210    #[cfg(feature = "sqlite")]
211    pub use ai_agents_storage::SqliteStorage;
212    pub use ai_agents_storage::{
213        FileStorage, SessionInfo, SessionMetadata, SessionOrderBy, SessionQuery,
214    };
215    #[cfg(feature = "redis-storage")]
216    pub use ai_agents_storage::{RedisSessionMeta, RedisStorage};
217
218    pub async fn create_storage(
219        config: &crate::spec::StorageConfig,
220    ) -> Result<Option<Arc<dyn AgentStorage>>> {
221        let storage_config = match config {
222            crate::spec::StorageConfig::None => ai_agents_storage::StorageConfig::None,
223            crate::spec::StorageConfig::File(fc) => ai_agents_storage::StorageConfig::File {
224                path: fc.path.clone(),
225            },
226            crate::spec::StorageConfig::Sqlite(sc) => ai_agents_storage::StorageConfig::Sqlite {
227                path: sc.path.clone(),
228            },
229            crate::spec::StorageConfig::Redis(rc) => ai_agents_storage::StorageConfig::Redis {
230                url: rc.url.clone(),
231                prefix: rc.prefix.clone(),
232                ttl_seconds: rc.ttl_seconds,
233            },
234        };
235
236        ai_agents_storage::create_storage(&storage_config).await
237    }
238}
239
240pub mod process {
241    pub use ai_agents_process::{ProcessConfig, ProcessData, ProcessProcessor};
242}
243
244pub mod recovery {
245    pub use ai_agents_recovery::{
246        ByRoleFilter, ErrorRecoveryConfig, FilterConfig, KeepRecentFilter, MessageFilter,
247        RecoveryManager, SkipPatternFilter,
248    };
249}
250
251pub mod skill {
252    pub use ai_agents_skills::{
253        SkillContext, SkillDefinition, SkillExecutor, SkillLoader, SkillRef, SkillRouter,
254        SkillStep, StepResult,
255    };
256}
257
258pub mod spec {
259    pub use ai_agents_observability::ObservabilityConfig;
260    pub use ai_agents_runtime::spec::{
261        AgentSpec, BuiltinProviderConfig, CliHitlMetadata, CliHitlStyle, CliMetadata,
262        CliPromptStyle, FileStorageConfig, LLMConfig, LLMSelector, MemoryConfig,
263        ProviderPolicyConfig, ProviderSecurityConfig, ProvidersConfig, RedisStorageConfig,
264        RuntimeConfig, SpawnerConfig, SqliteStorageConfig, StorageConfig, StructuredToolEntry,
265        ToolAliasesConfig, ToolConfig, ToolEntry, ToolPolicyConfig, YamlProviderConfig,
266        YamlToolConfig,
267    };
268}
269
270pub mod state {
271    pub use ai_agents_state::{
272        CompareOp, ContextExtractor, ContextMatcher, DelegateContextMode, GuardConditions,
273        GuardOnlyEvaluator, HandoffStateConfig, LLMTransitionEvaluator, PipelineStageEntry,
274        PipelineStateConfig, PromptMode, StateAction, StateConfig, StateDefinition, StateMachine,
275        StateMachineSnapshot, StateMatcher, StateTransitionEvent, TimeMatcher, ToolCondition,
276        ToolRef, Transition, TransitionContext, TransitionEvaluator, TransitionGuard,
277        TransitionTiming,
278    };
279}
280
281pub mod template {
282    use std::collections::HashMap;
283    use std::path::PathBuf;
284
285    use ai_agents_template::TemplateLoader as InnerTemplateLoader;
286    pub use ai_agents_template::{TemplateInheritance, TemplateRenderer};
287
288    use crate::error::Result;
289    use crate::spec::AgentSpec;
290
291    pub struct TemplateLoader {
292        inner: InnerTemplateLoader,
293    }
294
295    impl TemplateLoader {
296        pub fn new() -> Self {
297            Self {
298                inner: InnerTemplateLoader::new(),
299            }
300        }
301
302        pub fn add_search_path(&mut self, path: impl Into<PathBuf>) -> &mut Self {
303            self.inner.add_search_path(path);
304            self
305        }
306
307        pub fn set_variable(
308            &mut self,
309            key: impl Into<String>,
310            value: impl Into<String>,
311        ) -> &mut Self {
312            self.inner.set_variable(key, value);
313            self
314        }
315
316        pub fn set_variables(&mut self, vars: HashMap<String, String>) -> &mut Self {
317            self.inner.set_variables(vars);
318            self
319        }
320
321        pub fn get_variable(&self, key: &str) -> Option<&str> {
322            self.inner.get_variable(key)
323        }
324
325        pub fn load_template(&self, name: &str) -> Result<String> {
326            self.inner.load_template(name)
327        }
328
329        pub fn template_exists(&self, name: &str) -> bool {
330            self.inner.template_exists(name)
331        }
332
333        pub fn search_paths(&self) -> &[PathBuf] {
334            self.inner.search_paths()
335        }
336
337        pub fn variables(&self) -> &HashMap<String, String> {
338            self.inner.variables()
339        }
340
341        pub fn load_and_parse(&self, template_name: &str) -> Result<AgentSpec> {
342            let renderer = TemplateRenderer::new();
343            let variables = self.variables();
344
345            let load_and_render = |name: &str| -> Result<String> {
346                let content = self.load_template(name)?;
347                renderer.render(&content, variables)
348            };
349
350            let rendered_root = load_and_render(template_name)?;
351            let processed = TemplateInheritance::process(&rendered_root, load_and_render)?;
352            let spec: AgentSpec = serde_yaml::from_str(&processed)?;
353            spec.validate()?;
354
355            Ok(spec)
356        }
357    }
358
359    impl Default for TemplateLoader {
360        fn default() -> Self {
361            Self::new()
362        }
363    }
364
365    impl AsRef<InnerTemplateLoader> for TemplateLoader {
366        fn as_ref(&self) -> &InnerTemplateLoader {
367            &self.inner
368        }
369    }
370
371    impl From<InnerTemplateLoader> for TemplateLoader {
372        fn from(inner: InnerTemplateLoader) -> Self {
373            Self { inner }
374        }
375    }
376}
377
378pub mod persona {
379    pub use ai_agents_persona::{
380        EvolutionConfig, PERSONA_CHANGE_METADATA_KEY, PersonaChange, PersonaConfig,
381        PersonaEvolveTool, PersonaGoals, PersonaIdentity, PersonaManager, PersonaRenderResult,
382        PersonaSecret, PersonaSnapshot, PersonaTemplateRef, PersonaTemplateRegistry, PersonaTraits,
383        SecretRevealCondition, VALID_EVOLVE_PATHS,
384    };
385}
386
387pub mod relationships {
388    pub use ai_agents_relationships::{
389        AutoUpdateConfig, DimensionChange, EventEvictionStrategy, InjectionConfig, InjectionFormat,
390        NotableEventsConfig, PersistenceConfig, ProposedDimensionChange, ProposedRelationshipEvent,
391        Relationship, RelationshipConfig, RelationshipDimensionDefinition,
392        RelationshipDimensionsConfig, RelationshipEvaluation, RelationshipEvaluator,
393        RelationshipEvaluatorTrait, RelationshipEvent, RelationshipManager, RelationshipModel,
394        RelationshipPerspective, RelationshipSnapshot, RelationshipUpdate, format_relationship,
395        relationship_from_value, relationship_to_context_value, relationship_to_value,
396    };
397}
398
399pub mod observability {
400    pub use ai_agents_observability::{
401        AggregatedMetrics, AggregationConfig, AggregationDimension, BufferConfig, CostBreakdown,
402        CostConfig, CostEstimate, CostEstimator, CostSource, CostStats, EventStatus, EventType,
403        ExportConfig, ExportFormat, ExportResult, LanguageConfig, LatencyConfig, LatencyStats,
404        ModelPricing, ObservabilityConfig, ObservabilityHooks, ObservabilityManager,
405        ObservabilityReport, ObservationError, ObservationEvent, ObservationPurpose,
406        ObservationTokenUsage, ObservedLLMProvider, ObservedTool, PrivacyConfig, RawEventsFormat,
407        Redactor, ReportSummary, SpanContext, SpanGuard, TokenBreakdown, TokenConfig, TokenStats,
408        TokenUsageSource, UnknownPricePolicy, current_observation_context,
409        resolve_language_from_context, stable_hash, truncate_chars, with_observation_context,
410        with_observation_purpose, with_updated_observation_context,
411    };
412}
413
414pub mod reasoning {
415    pub use ai_agents_reasoning::{
416        CriterionResult, EvaluationResult, Plan, PlanAction, PlanAvailableActions,
417        PlanReflectionConfig, PlanStatus, PlanStep, PlanningConfig, ReasoningConfig,
418        ReasoningMetadata, ReasoningMode, ReasoningOutput, ReflectionAttempt, ReflectionConfig,
419        ReflectionMetadata, ReflectionMode, StepFailureAction, StepStatus, StringOrList,
420    };
421}
422
423pub mod disambiguation {
424    pub use ai_agents_disambiguation::{
425        AmbiguityAspect, AmbiguityDetectionResult, AmbiguityDetector, AmbiguityType, CacheConfig,
426        ClarificationConfig, ClarificationGenerator, ClarificationOption, ClarificationParseResult,
427        ClarificationQuestion, ClarificationStyle, ContextConfig, DetectionConfig,
428        DisambiguationConfig, DisambiguationContext, DisambiguationManager, DisambiguationResult,
429        MaxAttemptsAction, SkillDisambiguationOverride, SkipCondition, StateDisambiguationOverride,
430    };
431}
432
433pub mod tool_security {
434    pub use ai_agents_tools::{
435        CommandPolicyConfig, CommandRuleConfig, CommandTemplateConfig, DomainPolicyConfig,
436        NoWritePolicyBehavior, OperationPolicyConfig, PathPolicyConfig, SecurityCheckResult,
437        ToolPolicyConfig, ToolSecurityConfig, ToolSecurityEngine,
438    };
439}
440
441pub mod tools {
442    pub use ai_agents_core::{
443        CommandBindingKind, CommandPolicyBinding, DomainPolicyBinding, PathAccessMode,
444        PathBindingKind, PathPolicyBinding, PermissionOutcome, ResultLimitBinding, ResultLimitKind,
445        Tool, ToolActorContext, ToolApprovalRecord, ToolApprovalStatus, ToolCallClassification,
446        ToolCallSource, ToolCancellationToken, ToolExecutionContext, ToolExecutionLimits,
447        ToolExecutionRecord, ToolExecutionRequest, ToolInfo, ToolInvoker, ToolOperationKind,
448        ToolPolicyBindings, ToolPolicyDecisionRecord, ToolResult, ToolSafetyMetadata,
449        ToolSideEffectLevel,
450    };
451    pub use ai_agents_tools::{
452        AskUserTool, CalculatorTool, CommandRequest, CommandResponse, CommandRunner,
453        CommandRunnerSlot, CommandTool, ConditionEvaluator, DateTimeTool, DiagnosticItem,
454        DiagnosticSeverity, DiagnosticsProvider, DiagnosticsProviderSlot, DiagnosticsRequest,
455        DiagnosticsResponse, DiagnosticsTool, EchoTool, EvaluationContext, FileEditTool,
456        FileInfoTool, FileListTool, FileReadTool, FileTool, FileVersionEvidence, FileVersionStore,
457        FileWriteTool, GitDiffTool, GitStatusTool, GlobTool, GrepTool, JsonTool, LLMGetter,
458        MathTool, PatchTool, ProcessCommandRunner, ProviderHealth, QuestionHandler,
459        QuestionHandlerSlot, QuestionRequest, QuestionResponse, RandomTool, ResolvedTool,
460        SimpleLLMGetter, SleepTool, StaticCommandRunner, StaticDiagnosticsProvider, TemplateTool,
461        TextTool, TodoItem, TodoStatus, TodoStore, TodoTool, ToolAliases, ToolCallRecord,
462        ToolContext, ToolDescriptor, ToolIdentity, ToolMetadata, ToolProvider, ToolProviderError,
463        ToolProviderType, ToolRegistry, TrustLevel, UnavailableCommandRunner,
464        UnavailableDiagnosticsProvider, WebFetchTool, create_builtin_registry,
465        file_version_evidence,
466    };
467    pub use ai_agents_tools::{HttpTool, generate_schema};
468}
469
470/// MCP (Model Context Protocol) integration types.
471pub mod mcp {
472    pub use ai_agents_tools::mcp::{
473        MCPViewConfig, MCPViewTool, MCPWrapperConfig, MCPWrapperSecurity, MCPWrapperTool,
474        MCPWrapperTransport,
475    };
476}
477
478/// Dynamic agent spawning, registry, and inter-agent messaging.
479pub mod spawner {
480    pub use ai_agents_runtime::spawner::{
481        AgentRegistry, AgentSpawner, GenerateAgentTool, ListAgentsTool, NamespacedStorage,
482        RegistryHooks, RemoveAgentTool, ResolvedTemplate, SendMessageTool, SpawnedAgent,
483        SpawnedAgentInfo, auto_configure_spawner, configure_spawner_tools, resolve_templates,
484        spawner_from_config,
485    };
486}
487
488// Multi-agent orchestration patterns and tool wrappers.
489/// Key facts extraction and actor memory.
490pub mod facts {
491    pub use ai_agents_core::{SessionFilter, SessionMetadata, SessionSummary};
492    pub use ai_agents_facts::deduplicate_exact;
493    pub use ai_agents_facts::{
494        ActorMemoryConfig, CategoryDefinition, DedupConfig, DedupMethod, FactExtractor, FactStore,
495        FactsConfig, IdentificationConfig, IdentificationMethod, InjectionConfig, InjectionMode,
496        LLMFactExtractor, PrivacyConfig, SessionConfig,
497    };
498    pub use ai_agents_facts::{FactCategory, FactFilter, KeyFact};
499}
500
501pub mod eval {
502    pub use ai_agents_eval::*;
503}
504
505pub mod orchestration {
506    pub use ai_agents_runtime::orchestration::context::prepare_delegate_input;
507    pub use ai_agents_runtime::orchestration::tools::{
508        ConcurrentAskTool, GroupDiscussionTool, HandoffConversationTool, PipelineProcessTool,
509        RouteToAgentTool, configure_orchestration_tools,
510    };
511    pub use ai_agents_runtime::orchestration::types::{
512        AgentResult, ChatTurn, ConcurrentResult, GroupChatResult, HandoffEvent, HandoffResult,
513        PipelineResult, PipelineStage, RouteResult, RoutingMethod, StageOutput,
514    };
515    pub use ai_agents_runtime::orchestration::{concurrent, group_chat, handoff, pipeline, route};
516}
517
518// Top-level re-exports (legacy interface)
519pub use agent::{
520    Agent, AgentBuilder, AgentInfo, AgentResponse, AwaitBeforeNextTurn, BackgroundOverflowPolicy,
521    MainResponseDraft, MaintenanceMode, MaintenanceTaskPolicy, ParallelToolsConfig,
522    PostTurnOptimizationConfig, RuntimeAgent, RuntimeBranch, RuntimeBranchOutcome,
523    RuntimeBranchResult, RuntimeBranchStatus, RuntimeCommitBehavior, RuntimeConfig,
524    RuntimeOptimizationConfig, RuntimeOptimizationKind, RuntimeTaskPriority, RuntimeTaskPurpose,
525    ScheduledBranchSet, SkillCandidate, StreamBranchBuffer, StreamChunk, StreamingConfig,
526    StreamingDraftResult, StreamingOptimizationPolicy, TurnActorContext, TurnBranchScheduler,
527    TurnOptimizationContext,
528};
529pub use error::{AgentError, Result};
530pub use memory::{
531    CompactingMemory, CompactingMemoryConfig, CompressResult, CompressionEvent,
532    ConversationContext, EvictionReason, FactExtractedEvent, InMemoryStore, LLMSummarizer, Memory,
533    MemoryBudgetEvent, MemoryBudgetState, MemoryCompressEvent, MemoryEvictEvent, MemoryTokenBudget,
534    NoopSummarizer, OverflowStrategy, Summarizer, TokenAllocation, create_memory,
535    create_memory_from_config, create_memory_from_config_with_llm, estimate_message_tokens,
536    estimate_tokens,
537};
538pub use skill::{SkillDefinition, SkillExecutor, SkillLoader, SkillRef, SkillRouter, SkillStep};
539pub use spec::{
540    AgentSpec, BuiltinProviderConfig, FileStorageConfig, LLMConfig, LLMSelector, MemoryConfig,
541    ProviderPolicyConfig, ProviderSecurityConfig, ProvidersConfig, RedisStorageConfig,
542    RuntimeConfig as SpecRuntimeConfig, SqliteStorageConfig, StorageConfig, ToolAliasesConfig,
543    ToolConfig, ToolPolicyConfig as SpecToolPolicyConfig, YamlProviderConfig, YamlToolConfig,
544};
545pub use template::TemplateLoader;
546pub use tools::HttpTool;
547pub use tools::{
548    CalculatorTool, DateTimeTool, EchoTool, FileTool, JsonTool, MathTool, RandomTool, TemplateTool,
549    TextTool, Tool, ToolRegistry, ToolResult, create_builtin_registry,
550};
551
552pub use llm::providers::{ProviderType, ProviderType as LLMProviderType, UnifiedLLMProvider};
553pub use llm::{ChatMessage, LLMProvider, LLMRegistry, LLMResponse, MultiLLMRouter, Role};
554
555pub use process::{ProcessConfig, ProcessData, ProcessProcessor};
556pub use recovery::{
557    ByRoleFilter, ErrorRecoveryConfig, FilterConfig, KeepRecentFilter, MessageFilter,
558    RecoveryManager, SkipPatternFilter,
559};
560pub use tool_security::{
561    SecurityCheckResult, ToolPolicyConfig, ToolSecurityConfig, ToolSecurityEngine,
562};
563
564pub use eval::{EvalResult, EvalRunner, EvalRunnerOptions, EvalSettings, EvalSuite};
565pub use observability::{ObservabilityConfig, ObservabilityManager, ObservabilityReport};
566
567pub use context::{
568    BuiltinSource, ContextManager, ContextProvider, ContextSource, RefreshPolicy, TemplateRenderer,
569};
570#[cfg(feature = "sqlite")]
571pub use persistence::SqliteStorage;
572pub use persistence::{
573    AgentSnapshot, AgentStorage, FileStorage, MemorySnapshot, SessionInfo, SessionMetadata,
574    SessionOrderBy, SessionQuery, SpawnedAgentEntry, create_storage,
575};
576#[cfg(feature = "redis-storage")]
577pub use persistence::{RedisSessionMeta, RedisStorage};
578
579pub use state::{
580    CompareOp, ContextExtractor, ContextMatcher, GuardConditions, GuardOnlyEvaluator,
581    LLMTransitionEvaluator, PromptMode, StateAction, StateConfig, StateDefinition, StateMachine,
582    StateMachineSnapshot, StateMatcher, StateTransitionEvent, TimeMatcher, ToolCondition, ToolRef,
583    Transition, TransitionContext, TransitionEvaluator, TransitionGuard, TransitionTiming,
584};
585pub use tools::{
586    ConditionEvaluator, EvaluationContext, LLMGetter, SimpleLLMGetter, ToolCallRecord,
587};
588
589pub use hooks::{AgentHooks, CompositeHooks, HookTimer, LoggingHooks, NoopHooks};
590
591pub use hitl::{
592    ApprovalCondition, ApprovalHandler, ApprovalMessage, ApprovalRequest, ApprovalResult,
593    ApprovalTrigger, AutoApproveHandler, HITLCheckResult, HITLConfig, HITLEngine,
594    LlmGenerateConfig, LocalizedHandler, MessageLanguageConfig, MessageLanguageStrategy,
595    MessageResolver, RejectAllHandler, StateApprovalConfig, StateApprovalTrigger, TimeoutAction,
596    ToolApprovalConfig, create_handler, create_localized_handler, resolve_best_language,
597    resolve_tool_message,
598};
599
600#[cfg(test)]
601mod tests {
602    #[test]
603    fn test_facade_reexports_multi_llm_router() {
604        fn assert_type<T>() {}
605        assert_type::<crate::llm::MultiLLMRouter>();
606        assert_type::<crate::MultiLLMRouter>();
607    }
608}
609
610// Tool Provider System (v0.5.1 - Simplified)
611pub use tools::{
612    ProviderHealth, ToolAliases, ToolContext, ToolDescriptor, ToolMetadata, ToolProvider,
613    ToolProviderError, ToolProviderType, TrustLevel,
614};
615
616// Reasoning & Reflection (v0.5.3)
617pub use reasoning::{
618    CriterionResult, EvaluationResult, Plan, PlanAction, PlanAvailableActions,
619    PlanReflectionConfig, PlanStatus, PlanStep, PlanningConfig, ReasoningConfig, ReasoningMetadata,
620    ReasoningMode, ReasoningOutput, ReflectionAttempt, ReflectionConfig, ReflectionMetadata,
621    ReflectionMode, StepFailureAction, StepStatus, StringOrList,
622};
623
624// Intent Disambiguation (v0.5.4)
625pub use disambiguation::{
626    AmbiguityAspect, AmbiguityDetectionResult, AmbiguityDetector, AmbiguityType, CacheConfig,
627    ClarificationConfig, ClarificationGenerator, ClarificationOption, ClarificationParseResult,
628    ClarificationQuestion, ClarificationStyle, ContextConfig, DetectionConfig,
629    DisambiguationConfig, DisambiguationContext, DisambiguationManager, DisambiguationResult,
630    MaxAttemptsAction, SkillDisambiguationOverride, SkipCondition, StateDisambiguationOverride,
631};