1use std::marker::PhantomData;
19use std::sync::Arc;
20
21use adk_artifact::ArtifactService;
22use adk_core::{Agent, CacheCapable, ContextCacheConfig, Memory, Result, RunConfig};
23use adk_plugin::PluginManager;
24use adk_session::SessionService;
25use tokio_util::sync::CancellationToken;
26
27use crate::runner::{Runner, RunnerConfig};
28
29pub struct NoAppName;
35pub struct HasAppName;
37pub struct NoAgent;
39pub struct HasAgent;
41pub struct NoSessionService;
43pub struct HasSessionService;
45
46pub struct RunnerConfigBuilder<A, G, S> {
55 app_name: Option<String>,
56 agent: Option<Arc<dyn Agent>>,
57 session_service: Option<Arc<dyn SessionService>>,
58 artifact_service: Option<Arc<dyn ArtifactService>>,
59 memory_service: Option<Arc<dyn Memory>>,
60 plugin_manager: Option<Arc<PluginManager>>,
61 run_config: Option<RunConfig>,
62 compaction_config: Option<adk_core::EventsCompactionConfig>,
63 context_cache_config: Option<ContextCacheConfig>,
64 cache_capable: Option<Arc<dyn CacheCapable>>,
65 request_context: Option<adk_core::RequestContext>,
66 cancellation_token: Option<CancellationToken>,
67 intra_compaction_config: Option<adk_core::IntraCompactionConfig>,
68 intra_compaction_summarizer: Option<Arc<dyn adk_core::BaseEventsSummarizer>>,
69 _marker: PhantomData<(A, G, S)>,
70}
71
72impl RunnerConfigBuilder<NoAppName, NoAgent, NoSessionService> {
73 pub fn new() -> Self {
75 Self {
76 app_name: None,
77 agent: None,
78 session_service: None,
79 artifact_service: None,
80 memory_service: None,
81 plugin_manager: None,
82 run_config: None,
83 compaction_config: None,
84 context_cache_config: None,
85 cache_capable: None,
86 request_context: None,
87 cancellation_token: None,
88 intra_compaction_config: None,
89 intra_compaction_summarizer: None,
90 _marker: PhantomData,
91 }
92 }
93}
94
95impl Default for RunnerConfigBuilder<NoAppName, NoAgent, NoSessionService> {
96 fn default() -> Self {
97 Self::new()
98 }
99}
100
101impl<A, G, S> RunnerConfigBuilder<A, G, S> {
106 pub fn app_name(self, name: impl Into<String>) -> RunnerConfigBuilder<HasAppName, G, S> {
108 RunnerConfigBuilder {
109 app_name: Some(name.into()),
110 agent: self.agent,
111 session_service: self.session_service,
112 artifact_service: self.artifact_service,
113 memory_service: self.memory_service,
114 plugin_manager: self.plugin_manager,
115 run_config: self.run_config,
116 compaction_config: self.compaction_config,
117 context_cache_config: self.context_cache_config,
118 cache_capable: self.cache_capable,
119 request_context: self.request_context,
120 cancellation_token: self.cancellation_token,
121 intra_compaction_config: self.intra_compaction_config,
122 intra_compaction_summarizer: self.intra_compaction_summarizer,
123 _marker: PhantomData,
124 }
125 }
126
127 pub fn agent(self, agent: Arc<dyn Agent>) -> RunnerConfigBuilder<A, HasAgent, S> {
129 RunnerConfigBuilder {
130 app_name: self.app_name,
131 agent: Some(agent),
132 session_service: self.session_service,
133 artifact_service: self.artifact_service,
134 memory_service: self.memory_service,
135 plugin_manager: self.plugin_manager,
136 run_config: self.run_config,
137 compaction_config: self.compaction_config,
138 context_cache_config: self.context_cache_config,
139 cache_capable: self.cache_capable,
140 request_context: self.request_context,
141 cancellation_token: self.cancellation_token,
142 intra_compaction_config: self.intra_compaction_config,
143 intra_compaction_summarizer: self.intra_compaction_summarizer,
144 _marker: PhantomData,
145 }
146 }
147
148 pub fn session_service(
150 self,
151 service: Arc<dyn SessionService>,
152 ) -> RunnerConfigBuilder<A, G, HasSessionService> {
153 RunnerConfigBuilder {
154 app_name: self.app_name,
155 agent: self.agent,
156 session_service: Some(service),
157 artifact_service: self.artifact_service,
158 memory_service: self.memory_service,
159 plugin_manager: self.plugin_manager,
160 run_config: self.run_config,
161 compaction_config: self.compaction_config,
162 context_cache_config: self.context_cache_config,
163 cache_capable: self.cache_capable,
164 request_context: self.request_context,
165 cancellation_token: self.cancellation_token,
166 intra_compaction_config: self.intra_compaction_config,
167 intra_compaction_summarizer: self.intra_compaction_summarizer,
168 _marker: PhantomData,
169 }
170 }
171}
172
173impl<A, G, S> RunnerConfigBuilder<A, G, S> {
178 pub fn artifact_service(mut self, service: Arc<dyn ArtifactService>) -> Self {
180 self.artifact_service = Some(service);
181 self
182 }
183
184 pub fn memory_service(mut self, service: Arc<dyn Memory>) -> Self {
186 self.memory_service = Some(service);
187 self
188 }
189
190 pub fn plugin_manager(mut self, manager: Arc<PluginManager>) -> Self {
192 self.plugin_manager = Some(manager);
193 self
194 }
195
196 pub fn run_config(mut self, config: RunConfig) -> Self {
198 self.run_config = Some(config);
199 self
200 }
201
202 pub fn compaction_config(mut self, config: adk_core::EventsCompactionConfig) -> Self {
204 self.compaction_config = Some(config);
205 self
206 }
207
208 pub fn context_cache_config(mut self, config: ContextCacheConfig) -> Self {
210 self.context_cache_config = Some(config);
211 self
212 }
213
214 pub fn cache_capable(mut self, model: Arc<dyn CacheCapable>) -> Self {
216 self.cache_capable = Some(model);
217 self
218 }
219
220 pub fn request_context(mut self, ctx: adk_core::RequestContext) -> Self {
222 self.request_context = Some(ctx);
223 self
224 }
225
226 pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
228 self.cancellation_token = Some(token);
229 self
230 }
231
232 pub fn intra_compaction_config(mut self, config: adk_core::IntraCompactionConfig) -> Self {
234 self.intra_compaction_config = Some(config);
235 self
236 }
237
238 pub fn intra_compaction_summarizer(
240 mut self,
241 summarizer: Arc<dyn adk_core::BaseEventsSummarizer>,
242 ) -> Self {
243 self.intra_compaction_summarizer = Some(summarizer);
244 self
245 }
246}
247
248impl RunnerConfigBuilder<HasAppName, HasAgent, HasSessionService> {
253 pub fn build(self) -> Result<Runner> {
261 let config = RunnerConfig {
262 app_name: self.app_name.expect("typestate guarantees app_name is set"),
264 agent: self.agent.expect("typestate guarantees agent is set"),
265 session_service: self
266 .session_service
267 .expect("typestate guarantees session_service is set"),
268 artifact_service: self.artifact_service,
269 memory_service: self.memory_service,
270 plugin_manager: self.plugin_manager,
271 run_config: self.run_config,
272 compaction_config: self.compaction_config,
273 context_cache_config: self.context_cache_config,
274 cache_capable: self.cache_capable,
275 request_context: self.request_context,
276 cancellation_token: self.cancellation_token,
277 intra_compaction_config: self.intra_compaction_config,
278 intra_compaction_summarizer: self.intra_compaction_summarizer,
279 };
280 Runner::new(config)
281 }
282}