Skip to main content

codetether_agent/session/helper/
request_state.rs

1use std::path::Path;
2use std::sync::Arc;
3
4use crate::provider::{Provider, ToolDefinition};
5use crate::tool::ToolRegistry;
6
7use super::bootstrap::{inject_tool_prompt, list_tools_bootstrap_definition};
8use super::provider::{prefers_temperature_one, temperature_is_deprecated};
9use super::runtime::{is_interactive_tool, is_local_cuda_provider, local_cuda_light_system_prompt};
10
11pub(crate) struct ProviderStepState {
12    pub tool_registry: Arc<ToolRegistry>,
13    pub tool_definitions: Vec<ToolDefinition>,
14    pub advertised_tool_definitions: Vec<ToolDefinition>,
15    pub temperature: Option<f32>,
16    pub model_supports_tools: bool,
17    pub system_prompt: String,
18}
19
20pub(crate) fn build_provider_step_state(
21    provider: Arc<dyn Provider>,
22    selected_provider: &str,
23    model: &str,
24    cwd: &Path,
25) -> ProviderStepState {
26    let tool_registry = ToolRegistry::with_provider_arc(provider, model.to_string());
27    let tool_definitions: Vec<_> = tool_registry
28        .definitions()
29        .into_iter()
30        .filter(|tool| !is_interactive_tool(&tool.name))
31        .collect();
32
33    let temperature = if temperature_is_deprecated(model) {
34        None
35    } else if prefers_temperature_one(model) {
36        Some(1.0)
37    } else {
38        Some(0.7)
39    };
40
41    let model_supports_tools = !matches!(
42        selected_provider,
43        "gemini-web" | "local-cuda" | "local_cuda" | "localcuda"
44    );
45    let advertised_tool_definitions = if model_supports_tools {
46        tool_definitions.clone()
47    } else {
48        vec![list_tools_bootstrap_definition()]
49    };
50
51    let system_prompt = if is_local_cuda_provider(selected_provider) {
52        local_cuda_light_system_prompt()
53    } else {
54        crate::agent::builtin::build_system_prompt(cwd)
55    };
56    let system_prompt = if !model_supports_tools && !advertised_tool_definitions.is_empty() {
57        inject_tool_prompt(&system_prompt, &advertised_tool_definitions)
58    } else {
59        system_prompt
60    };
61
62    ProviderStepState {
63        tool_registry,
64        tool_definitions,
65        advertised_tool_definitions,
66        temperature,
67        model_supports_tools,
68        system_prompt,
69    }
70}