Resolve context from all providers for a given prompt Returns aggregated context results from all configured providers.
(
&self,
prompt: &str,
session_id: Option<&str>,
)
| 219 | /// |
| 220 | /// Returns aggregated context results from all configured providers. |
| 221 | pub(super) async fn resolve_context( |
| 222 | &self, |
| 223 | prompt: &str, |
| 224 | session_id: Option<&str>, |
| 225 | ) -> Vec<ContextResult> { |
| 226 | if self.config.context_providers.is_empty() { |
| 227 | return Vec::new(); |
| 228 | } |
| 229 | |
| 230 | let query = ContextQuery::new(prompt).with_session_id(session_id.unwrap_or("")); |
| 231 | |
| 232 | let futures = self |
| 233 | .config |
| 234 | .context_providers |
| 235 | .iter() |
| 236 | .map(|p| p.query(&query)); |
| 237 | let outcomes = join_all(futures).await; |
| 238 | |
| 239 | outcomes |
| 240 | .into_iter() |
| 241 | .enumerate() |
| 242 | .filter_map(|(i, r)| match r { |
| 243 | Ok(result) if !result.is_empty() => Some(result), |
| 244 | Ok(_) => None, |
| 245 | Err(e) => { |
| 246 | tracing::warn!( |
| 247 | "Context provider '{}' failed: {}", |
| 248 | self.config.context_providers[i].name(), |
| 249 | e |
| 250 | ); |
| 251 | None |
| 252 | } |
| 253 | }) |
| 254 | .collect() |
| 255 | } |
| 256 | |
| 257 | /// Detect if context perception is needed based on user prompt. |
| 258 | /// |