1mod builder;
2mod failure;
3mod prompt;
4mod reasoning;
5mod runtime;
6#[cfg(test)]
7mod tests;
8mod tool_execution;
9
10pub use builder::{
11 AgentRunTimeBuilder, AgentRuntimeConfig, AgentRuntimeConfigInput, AgentRuntimeOptions,
12 AgentRuntimeStorage,
13};
14pub use failure::{AgentFailure, FailureKind};
15
16use crate::{
17 checkpoint::CheckpointStorage,
18 error::StorageError,
19 messages::MessageChannel,
20 middleware::MiddlewareChain,
21 providers::LlmProvider,
22 sandbox::Sandbox,
23 shared::{ToolCall, UserInteraction},
24 skills::SkillManager,
25 state::AgentState,
26 tools::ToolRegistry,
27 transcript::TranscriptStorage,
28};
29use prompt::PromptComposer;
30use serde::{Deserialize, Serialize};
31use std::time::Duration;
32use std::{
33 collections::HashMap,
34 sync::{Arc, Weak},
35};
36use tokio::sync::Mutex;
37
38#[derive(Debug, Serialize, Deserialize)]
39pub enum Agent {
40 Ready(AgentState),
41 Reasoning(AgentState),
42 ToolExecuting(AgentState, ToolRunState),
43 WaitingForUser(AgentState, UserInteraction),
44 Success(AgentState),
45 Interrupted(AgentState),
46 Fail(AgentState, AgentFailure),
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct ToolRunState {
51 pub calls: Vec<ToolCall>,
52 pub cursor: usize,
53}
54
55impl ToolRunState {
56 pub fn new(calls: Vec<ToolCall>) -> Self {
57 Self { calls, cursor: 0 }
58 }
59}
60
61pub struct AgentRunTime {
62 pub(crate) provider: Arc<dyn LlmProvider>,
63 pub(crate) max_iter: u32,
64 pub(crate) max_consecutive_fail_count: u32,
65 pub(crate) model: String,
66 pub(crate) system_prompt: Option<String>,
67 pub(crate) temperature: Option<f32>,
68 pub(crate) max_tokens: Option<u32>,
69 pub(crate) checkpoint_storage: Arc<dyn CheckpointStorage>,
70 pub(crate) transcript_storage: Arc<dyn TranscriptStorage>,
71 pub(crate) sandbox: Arc<dyn Sandbox>,
72 pub(crate) tools: ToolRegistry,
73 pub(crate) skills: Option<Arc<SkillManager>>,
74 pub(crate) prompt_composer: PromptComposer,
75 pub(crate) middleware: MiddlewareChain,
76 pub(crate) messages: MessageChannel,
78 pub(crate) tasks: crate::tasks::TaskManager,
80 pub(crate) retry_backoff: Duration,
82 pub(crate) tool_timeout: Duration,
84 pub(crate) session_locks: Mutex<HashMap<String, Weak<Mutex<()>>>>,
85}
86
87#[derive(Debug, Default)]
88pub(crate) struct PendingToolCall {
89 pub(crate) id: Option<String>,
90 pub(crate) name: Option<String>,
91 pub(crate) arguments: String,
92}
93
94pub(crate) fn storage_failure(ctx: AgentState, error: StorageError) -> Agent {
95 Agent::Fail(
96 ctx,
97 AgentFailure::new(FailureKind::Storage, error.to_string()),
98 )
99}