agents_runtime/agent/
api.rs

1//! Public API functions that mirror the Python SDK exactly
2//!
3//! This module provides the main entry points for creating Deep Agents,
4//! matching the Python `create_deep_agent()` and `async_create_deep_agent()` functions.
5
6use super::builder::ConfigurableAgentBuilder;
7use super::config::{CreateDeepAgentParams, DeepAgentConfig};
8use super::runtime::DeepAgent;
9use crate::providers::{AnthropicConfig, AnthropicMessagesModel};
10use agents_core::llm::LanguageModel;
11use std::sync::Arc;
12
13/// Returns the default language model configured
14/// Uses Claude Sonnet 4 with 64000 max tokens, mirroring the Python SDK defaults.
15//todo: mograte this to OpenaI using gpt-5-mini
16pub fn get_default_model() -> anyhow::Result<Arc<dyn LanguageModel>> {
17    let config = AnthropicConfig {
18        api_key: std::env::var("ANTHROPIC_API_KEY")
19            .map_err(|_| anyhow::anyhow!("ANTHROPIC_API_KEY environment variable is required"))?,
20        model: "claude-sonnet-4-20250514".to_string(),
21        max_output_tokens: 64000,
22        api_url: None,
23        api_version: None,
24    };
25    let model: Arc<dyn LanguageModel> = Arc::new(AnthropicMessagesModel::new(config)?);
26    Ok(model)
27}
28
29/// Create a deep agent - matches Python create_deep_agent() API exactly
30///
31/// This is the main entry point that mirrors the Python SDK:
32/// ```python
33/// agent = create_deep_agent(
34///     tools=[internet_search],
35///     instructions="You are an expert researcher...",
36///     model=model,
37///     subagents=subagents,
38///     checkpointer=checkpointer,
39///     tool_configs=tool_configs
40/// )
41/// ```
42pub fn create_deep_agent(params: CreateDeepAgentParams) -> anyhow::Result<DeepAgent> {
43    let CreateDeepAgentParams {
44        tools,
45        instructions,
46        middleware,
47        model,
48        subagents,
49        context_schema,
50        checkpointer,
51        tool_configs,
52    } = params;
53
54    if context_schema.is_some() {
55        tracing::warn!(
56            "context_schema parameter for create_deep_agent is not yet supported in Rust SDK"
57        );
58    }
59
60    if !middleware.is_empty() {
61        tracing::warn!("middleware parameter for create_deep_agent is not yet supported in Rust SDK ({} entries)", middleware.len());
62    }
63
64    let mut builder = ConfigurableAgentBuilder::new(instructions);
65
66    let model = match model {
67        Some(model) => model,
68        None => get_default_model()?,
69    };
70    builder = builder.with_model(model);
71
72    if !tools.is_empty() {
73        builder = builder.with_tools(tools);
74    }
75
76    if !subagents.is_empty() {
77        builder = builder.with_subagent_config(subagents);
78    }
79
80    if let Some(checkpointer) = checkpointer {
81        builder = builder.with_checkpointer(checkpointer);
82    }
83
84    if !tool_configs.is_empty() {
85        for (tool, policy) in tool_configs {
86            builder = builder.with_tool_interrupt(tool, policy);
87        }
88    }
89
90    builder.build()
91}
92
93/// Async constructor alias to mirror the Python API surface.
94///
95/// The underlying runtime already executes every tool and planner call asynchronously,
96/// so this currently delegates to `create_deep_agent`.
97///
98/// Mirrors Python's `async_create_deep_agent()` function.
99pub fn create_async_deep_agent(params: CreateDeepAgentParams) -> anyhow::Result<DeepAgent> {
100    create_deep_agent(params)
101}
102
103/// Internal function used by the builder - creates agent from config
104pub(crate) fn create_deep_agent_from_config(config: DeepAgentConfig) -> DeepAgent {
105    super::runtime::create_deep_agent_from_config(config)
106}
107
108/// Internal async alias used by the builder
109pub(crate) fn create_async_deep_agent_from_config(config: DeepAgentConfig) -> DeepAgent {
110    super::runtime::create_deep_agent_from_config(config)
111}