| use std::sync::Arc; |
|
|
| use anyhow::Result; |
| use forge_domain::{AgentId, ModelId, Provider}; |
|
|
| use crate::{AgentRegistry, AppConfigService, ProviderAuthService, ProviderService}; |
|
|
| |
| |
| pub struct AgentProviderResolver<S>(Arc<S>); |
|
|
| impl<S> AgentProviderResolver<S> { |
| |
| pub fn new(services: Arc<S>) -> Self { |
| Self(services) |
| } |
| } |
|
|
| impl<S> AgentProviderResolver<S> |
| where |
| S: AgentRegistry + ProviderService + AppConfigService + ProviderAuthService, |
| { |
| |
| |
| |
| pub async fn get_provider(&self, agent_id: Option<AgentId>) -> Result<Provider<url::Url>> { |
| let provider_id = if let Some(agent_id) = agent_id { |
| |
|
|
| if let Some(agent) = self.0.get_agent(&agent_id).await? { |
| |
| agent.provider |
| } else { |
| |
| |
| self.0 |
| .get_session_config() |
| .await |
| .map(|c| c.provider) |
| .ok_or_else(|| forge_domain::Error::NoDefaultSession)? |
| } |
| } else { |
| self.0 |
| .get_session_config() |
| .await |
| .map(|c| c.provider) |
| .ok_or_else(|| forge_domain::Error::NoDefaultSession)? |
| }; |
|
|
| let provider = self.0.get_provider(provider_id).await?; |
| Ok(provider) |
| } |
|
|
| |
| |
| pub async fn get_model(&self, agent_id: Option<AgentId>) -> Result<ModelId> { |
| if let Some(agent_id) = agent_id { |
| if let Some(agent) = self.0.get_agent(&agent_id).await? { |
| Ok(agent.model) |
| } else { |
| |
| |
| self.0 |
| .get_session_config() |
| .await |
| .map(|c| c.model) |
| .ok_or_else(|| forge_domain::Error::NoDefaultSession.into()) |
| } |
| } else { |
| self.0 |
| .get_session_config() |
| .await |
| .map(|c| c.model) |
| .ok_or_else(|| forge_domain::Error::NoDefaultSession.into()) |
| } |
| } |
| } |
|
|