(
prompt: &str,
model: Option<String>,
agent_name: &str,
)
| 5045 | } |
| 5046 | |
| 5047 | async fn generate_agent_response( |
| 5048 | prompt: &str, |
| 5049 | model: Option<String>, |
| 5050 | agent_name: &str, |
| 5051 | ) -> anyhow::Result<String> { |
| 5052 | let cwd = std::env::current_dir()?; |
| 5053 | let config = load_config(&cwd)?; |
| 5054 | let provider_registry = Arc::new(setup_providers(&config).await?); |
| 5055 | if provider_registry.list().is_empty() { |
| 5056 | anyhow::bail!("No providers configured for GitHub run."); |
| 5057 | } |
| 5058 | |
| 5059 | let tool_registry = Arc::new(create_default_registry().await); |
| 5060 | let agent_registry = AgentRegistry::from_config(&config); |
| 5061 | let mut agent_info = agent_registry |
| 5062 | .get(agent_name) |
| 5063 | .cloned() |
| 5064 | .unwrap_or_else(AgentInfo::build); |
| 5065 | |
| 5066 | let (provider, model_id) = parse_model_and_provider(model); |
| 5067 | if let Some(model_id) = model_id { |
| 5068 | let provider_id = provider.unwrap_or_else(|| { |
| 5069 | if model_id.starts_with("claude") { |
| 5070 | "anthropic".to_string() |
| 5071 | } else { |
| 5072 | "openai".to_string() |
| 5073 | } |
| 5074 | }); |
| 5075 | agent_info = agent_info.with_model(model_id, provider_id); |
| 5076 | } |
| 5077 | |
| 5078 | let mut executor = AgentExecutor::new(agent_info.clone(), provider_registry, tool_registry); |
| 5079 | |
| 5080 | // Build model-specific system prompt + environment context (TS parity) |
| 5081 | { |
| 5082 | let (model_api_id, provider_id) = match &agent_info.model { |
| 5083 | Some(m) => (m.model_id.clone(), m.provider_id.clone()), |
| 5084 | None => ( |
| 5085 | "claude-sonnet-4-20250514".to_string(), |
| 5086 | "anthropic".to_string(), |
| 5087 | ), |
| 5088 | }; |
| 5089 | let cwd = std::env::current_dir().unwrap_or_default(); |
| 5090 | let model_prompt = SystemPrompt::for_model(&model_api_id); |
| 5091 | let env_ctx = EnvironmentContext::from_current( |
| 5092 | &model_api_id, |
| 5093 | &provider_id, |
| 5094 | cwd.to_string_lossy().as_ref(), |
| 5095 | ); |
| 5096 | let env_prompt = SystemPrompt::environment(&env_ctx); |
| 5097 | let full_prompt = format!("{}\n\n{}", model_prompt, env_prompt); |
| 5098 | executor = executor.with_system_prompt(full_prompt); |
| 5099 | } |
| 5100 | |
| 5101 | let stream = executor.execute_streaming(prompt.to_string()).await?; |
| 5102 | let mut stream = std::pin::pin!(stream); |
| 5103 | let mut response = String::new(); |
| 5104 |
no test coverage detected