vtcode_config/core/
provider.rs

1use serde::{Deserialize, Serialize};
2
3/// Anthropic-specific provider configuration
4#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
5#[derive(Debug, Clone, Deserialize, Serialize)]
6pub struct AnthropicConfig {
7    /// Enable extended thinking feature for Anthropic models
8    /// When enabled, Claude uses internal reasoning before responding, providing
9    /// enhanced reasoning capabilities for complex tasks.
10    /// Only supported by Claude 4, Claude 4.5, and Claude 3.7 Sonnet models.
11    /// See: https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking
12    #[serde(default = "default_extended_thinking_enabled")]
13    pub extended_thinking_enabled: bool,
14
15    /// Beta header for interleaved thinking feature
16    #[serde(default = "default_interleaved_thinking_beta")]
17    pub interleaved_thinking_beta: String,
18
19    /// Budget tokens for extended thinking (minimum: 1024, recommended: 10000+)
20    /// Larger budgets enable more thorough analysis for complex problems.
21    /// The model may not use the entire budget allocated.
22    #[serde(default = "default_interleaved_thinking_budget_tokens")]
23    pub interleaved_thinking_budget_tokens: u32,
24
25    /// Type value for enabling interleaved thinking
26    #[serde(default = "default_interleaved_thinking_type")]
27    pub interleaved_thinking_type_enabled: String,
28
29    /// Tool search configuration for dynamic tool discovery (advanced-tool-use beta)
30    #[serde(default)]
31    pub tool_search: ToolSearchConfig,
32
33    /// Effort level for token usage (high, medium, low)
34    /// Controls how many tokens Claude uses when responding, trading off between
35    /// response thoroughness and token efficiency.
36    /// Only supported by Claude Opus 4.5 (claude-opus-4-5-20251101)
37    #[serde(default = "default_effort")]
38    pub effort: String,
39
40    /// Enable token counting via the count_tokens endpoint
41    /// When enabled, the agent can estimate input token counts before making API calls
42    /// Useful for proactive management of rate limits and costs
43    #[serde(default)]
44    pub count_tokens_enabled: bool,
45}
46
47impl Default for AnthropicConfig {
48    fn default() -> Self {
49        Self {
50            extended_thinking_enabled: default_extended_thinking_enabled(),
51            interleaved_thinking_beta: default_interleaved_thinking_beta(),
52            interleaved_thinking_budget_tokens: default_interleaved_thinking_budget_tokens(),
53            interleaved_thinking_type_enabled: default_interleaved_thinking_type(),
54            tool_search: ToolSearchConfig::default(),
55            effort: default_effort(),
56            count_tokens_enabled: false,
57        }
58    }
59}
60
61/// Configuration for Anthropic's tool search feature (advanced-tool-use beta)
62/// Enables dynamic tool discovery for large tool catalogs (up to 10k tools)
63#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
64#[derive(Debug, Clone, Deserialize, Serialize)]
65pub struct ToolSearchConfig {
66    /// Enable tool search feature (requires advanced-tool-use-2025-11-20 beta)
67    #[serde(default)]
68    pub enabled: bool,
69
70    /// Search algorithm: "regex" (Python regex patterns) or "bm25" (natural language)
71    #[serde(default = "default_tool_search_algorithm")]
72    pub algorithm: String,
73
74    /// Automatically defer loading of all tools except core tools
75    #[serde(default = "default_defer_by_default")]
76    pub defer_by_default: bool,
77
78    /// Maximum number of tool search results to return
79    #[serde(default = "default_max_results")]
80    pub max_results: u32,
81
82    /// Tool names that should never be deferred (always available)
83    #[serde(default)]
84    pub always_available_tools: Vec<String>,
85}
86
87impl Default for ToolSearchConfig {
88    fn default() -> Self {
89        Self {
90            enabled: false,
91            algorithm: default_tool_search_algorithm(),
92            defer_by_default: default_defer_by_default(),
93            max_results: default_max_results(),
94            always_available_tools: vec![],
95        }
96    }
97}
98
99#[inline]
100fn default_tool_search_algorithm() -> String {
101    "regex".to_string()
102}
103
104#[inline]
105fn default_defer_by_default() -> bool {
106    true
107}
108
109#[inline]
110fn default_max_results() -> u32 {
111    5
112}
113
114#[inline]
115fn default_extended_thinking_enabled() -> bool {
116    true
117}
118
119#[inline]
120fn default_interleaved_thinking_beta() -> String {
121    "interleaved-thinking-2025-05-14".to_string()
122}
123
124#[inline]
125fn default_interleaved_thinking_budget_tokens() -> u32 {
126    12000
127}
128
129#[inline]
130fn default_interleaved_thinking_type() -> String {
131    "enabled".to_string()
132}
133
134#[inline]
135fn default_effort() -> String {
136    "low".to_string()
137}