1use std::path::PathBuf;
2use std::sync::Arc;
3use std::time::Duration;
4
5use serde_json::Value;
6
7use crate::approval::{ApprovalBroker, ApprovalProvider};
8use crate::context_providers::ContextProvider;
9use crate::event_store::RunEventStore;
10use crate::execution_mode::ExecutionMode;
11use crate::memory::MemoryProvider;
12use crate::model::{ModelProvider, ModelRef};
13use crate::model_settings::ModelSettings;
14use crate::runtime::backends::RuntimeExecutionBackend;
15use crate::runtime::{CancellationToken, RuntimeHook};
16use crate::sessions::Session;
17use crate::tools::ToolPolicy;
18use crate::tracing::TraceSink;
19use crate::types::Metadata;
20use crate::workspace::WorkspaceBackend;
21
22#[derive(Clone, Default)]
23pub struct RunConfig {
24 pub model: Option<ModelRef>,
25 pub model_provider: Option<Arc<dyn ModelProvider>>,
26 pub model_settings: Option<ModelSettings>,
27 pub workspace: Option<PathBuf>,
28 pub workspace_backend: Option<Arc<dyn WorkspaceBackend>>,
29 pub session: Option<Arc<dyn Session>>,
30 pub max_cycles: Option<u32>,
31 pub tool_policy: ToolPolicy,
32 pub execution_backend: Option<RuntimeExecutionBackend>,
33 pub cancellation_token: Option<CancellationToken>,
34 pub hooks: Vec<Arc<dyn RuntimeHook>>,
35 pub trace_sink: Option<Arc<dyn TraceSink>>,
36 pub event_store: Option<Arc<dyn RunEventStore>>,
37 pub event_store_fail_closed: bool,
38 pub approval_provider: Option<Arc<dyn ApprovalProvider>>,
39 pub approval_timeout: Option<Duration>,
40 pub approval_broker: Option<ApprovalBroker>,
41 pub context_providers: Vec<Arc<dyn ContextProvider>>,
42 pub max_context_chars: Option<usize>,
43 pub memory_providers: Vec<Arc<dyn MemoryProvider>>,
44 pub app_state: Option<Arc<dyn std::any::Any + Send + Sync>>,
45 pub metadata: Metadata,
46}
47
48impl RunConfig {
49 pub fn builder() -> RunConfigBuilder {
50 RunConfigBuilder::default()
51 }
52}
53
54#[derive(Default)]
55pub struct RunConfigBuilder {
56 config: RunConfig,
57}
58
59impl RunConfigBuilder {
60 pub fn model(mut self, model: ModelRef) -> Self {
61 self.config.model = Some(model);
62 self
63 }
64
65 pub fn model_provider(mut self, provider: impl ModelProvider + 'static) -> Self {
66 self.config.model_provider = Some(Arc::new(provider));
67 self
68 }
69
70 pub fn model_provider_arc(mut self, provider: Arc<dyn ModelProvider>) -> Self {
71 self.config.model_provider = Some(provider);
72 self
73 }
74
75 pub fn model_settings(mut self, settings: ModelSettings) -> Self {
76 self.config.model_settings = Some(settings);
77 self
78 }
79
80 pub fn workspace(mut self, workspace: impl Into<PathBuf>) -> Self {
81 self.config.workspace = Some(workspace.into());
82 self
83 }
84
85 pub fn workspace_backend(mut self, backend: Arc<dyn WorkspaceBackend>) -> Self {
86 self.config.workspace_backend = Some(backend);
87 self
88 }
89
90 pub fn session(mut self, session: impl Session + 'static) -> Self {
91 self.config.session = Some(Arc::new(session));
92 self
93 }
94
95 pub fn session_arc(mut self, session: Arc<dyn Session>) -> Self {
96 self.config.session = Some(session);
97 self
98 }
99
100 pub fn max_cycles(mut self, max_cycles: u32) -> Self {
101 self.config.max_cycles = Some(max_cycles);
102 self
103 }
104
105 pub fn tool_policy(mut self, tool_policy: ToolPolicy) -> Self {
106 self.config.tool_policy = tool_policy;
107 self
108 }
109
110 pub fn execution_backend(mut self, execution_backend: RuntimeExecutionBackend) -> Self {
111 self.config.execution_backend = Some(execution_backend);
112 self
113 }
114
115 pub fn execution_mode(mut self, execution_mode: ExecutionMode) -> Self {
116 self.config.execution_backend = Some(execution_mode.into());
117 self
118 }
119
120 pub fn cancellation_token(mut self, cancellation_token: CancellationToken) -> Self {
121 self.config.cancellation_token = Some(cancellation_token);
122 self
123 }
124
125 pub fn hook(mut self, hook: Arc<dyn RuntimeHook>) -> Self {
126 self.config.hooks.push(hook);
127 self
128 }
129
130 pub fn trace_sink(mut self, sink: Arc<dyn TraceSink>) -> Self {
131 self.config.trace_sink = Some(sink);
132 self
133 }
134
135 pub fn event_store(mut self, store: Arc<dyn RunEventStore>) -> Self {
136 self.config.event_store = Some(store);
137 self
138 }
139
140 pub fn event_store_fail_closed(mut self, fail_closed: bool) -> Self {
141 self.config.event_store_fail_closed = fail_closed;
142 self
143 }
144
145 pub fn approval_provider(mut self, provider: Arc<dyn ApprovalProvider>) -> Self {
146 self.config.approval_provider = Some(provider);
147 self
148 }
149
150 pub fn approval_timeout(mut self, timeout: Duration) -> Self {
151 self.config.approval_timeout = Some(timeout);
152 self
153 }
154
155 pub fn approval_broker(mut self, broker: ApprovalBroker) -> Self {
156 self.config.approval_broker = Some(broker);
157 self
158 }
159
160 pub fn context_provider(mut self, provider: Arc<dyn ContextProvider>) -> Self {
161 self.config.context_providers.push(provider);
162 self
163 }
164
165 pub fn max_context_chars(mut self, max_chars: usize) -> Self {
166 self.config.max_context_chars = Some(max_chars);
167 self
168 }
169
170 pub fn memory_provider(mut self, provider: Arc<dyn MemoryProvider>) -> Self {
171 self.config.memory_providers.push(provider);
172 self
173 }
174
175 pub fn metadata(mut self, key: impl Into<String>, value: Value) -> Self {
176 self.config.metadata.insert(key.into(), value);
177 self
178 }
179
180 pub fn build(self) -> RunConfig {
181 self.config
182 }
183}