codetether-agent 4.6.1

A2A-native AI coding agent for the CodeTether ecosystem
Documentation
use std::path::Path;
use std::sync::Arc;

use crate::provider::{Provider, ToolDefinition};
use crate::tool::ToolRegistry;

use super::bootstrap::{inject_tool_prompt, list_tools_bootstrap_definition};
use super::provider::{prefers_temperature_one, temperature_is_deprecated};
use super::runtime::{is_interactive_tool, is_local_cuda_provider, local_cuda_light_system_prompt};

pub(crate) struct ProviderStepState {
    pub tool_registry: Arc<ToolRegistry>,
    pub tool_definitions: Vec<ToolDefinition>,
    pub advertised_tool_definitions: Vec<ToolDefinition>,
    pub temperature: Option<f32>,
    pub model_supports_tools: bool,
    pub system_prompt: String,
}

pub(crate) fn build_provider_step_state(
    provider: Arc<dyn Provider>,
    selected_provider: &str,
    model: &str,
    cwd: &Path,
) -> ProviderStepState {
    let tool_registry = ToolRegistry::with_provider_arc(provider, model.to_string());
    let tool_definitions: Vec<_> = tool_registry
        .definitions()
        .into_iter()
        .filter(|tool| !is_interactive_tool(&tool.name))
        .collect();

    let temperature = if temperature_is_deprecated(model) {
        None
    } else if prefers_temperature_one(model) {
        Some(1.0)
    } else {
        Some(0.7)
    };

    let model_supports_tools = !matches!(
        selected_provider,
        "gemini-web" | "local-cuda" | "local_cuda" | "localcuda"
    );
    let advertised_tool_definitions = if model_supports_tools {
        tool_definitions.clone()
    } else {
        vec![list_tools_bootstrap_definition()]
    };

    let system_prompt = if is_local_cuda_provider(selected_provider) {
        local_cuda_light_system_prompt()
    } else {
        crate::agent::builtin::build_system_prompt(cwd)
    };
    let system_prompt = if !model_supports_tools && !advertised_tool_definitions.is_empty() {
        inject_tool_prompt(&system_prompt, &advertised_tool_definitions)
    } else {
        system_prompt
    };

    ProviderStepState {
        tool_registry,
        tool_definitions,
        advertised_tool_definitions,
        temperature,
        model_supports_tools,
        system_prompt,
    }
}