Skip to main content

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    /// DEPRECATED: Model name validation has been removed. The Anthropic API validates
8    /// model names directly, avoiding maintenance burden and allowing flexibility.
9    /// This field is kept for backward compatibility but has no effect.
10    #[deprecated(
11        since = "0.75.0",
12        note = "Model validation removed. API validates model names directly."
13    )]
14    #[serde(default)]
15    pub skip_model_validation: bool,
16
17    /// Enable extended thinking feature for Anthropic models
18    /// When enabled, Claude uses internal reasoning before responding, providing
19    /// enhanced reasoning capabilities for complex tasks.
20    /// Only supported by Claude 4, Claude 4.5, and Claude 3.7 Sonnet models.
21    /// Claude 4.6 uses adaptive thinking instead of extended thinking.
22    /// Note: Extended thinking is now auto-enabled by default (31,999 tokens).
23    /// Set MAX_THINKING_TOKENS=63999 environment variable for 2x budget on 64K models.
24    /// See: https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking
25    #[serde(default = "default_extended_thinking_enabled")]
26    pub extended_thinking_enabled: bool,
27
28    /// Beta header for interleaved thinking feature
29    #[serde(default = "default_interleaved_thinking_beta")]
30    pub interleaved_thinking_beta: String,
31
32    /// Budget tokens for extended thinking (minimum: 1024, default: 31999)
33    /// On 64K output models (Opus 4.5, Sonnet 4.5, Haiku 4.5): default 31,999, max 63,999
34    /// On 32K output models (Opus 4): max 31,999
35    /// Use MAX_THINKING_TOKENS environment variable to override.
36    #[serde(default = "default_interleaved_thinking_budget_tokens")]
37    pub interleaved_thinking_budget_tokens: u32,
38
39    /// Type value for enabling interleaved thinking
40    #[serde(default = "default_interleaved_thinking_type")]
41    pub interleaved_thinking_type_enabled: String,
42
43    /// Tool search configuration for dynamic tool discovery (advanced-tool-use beta)
44    #[serde(default)]
45    pub tool_search: ToolSearchConfig,
46
47    /// Effort level for token usage (high, medium, low)
48    /// Controls how many tokens Claude uses when responding, trading off between
49    /// response thoroughness and token efficiency.
50    /// Supported by Claude Opus 4.5/4.6 (4.5 requires effort beta header)
51    #[serde(default = "default_effort")]
52    pub effort: String,
53
54    /// Enable token counting via the count_tokens endpoint
55    /// When enabled, the agent can estimate input token counts before making API calls
56    /// Useful for proactive management of rate limits and costs
57    #[serde(default)]
58    pub count_tokens_enabled: bool,
59}
60
61#[allow(deprecated)]
62impl Default for AnthropicConfig {
63    fn default() -> Self {
64        Self {
65            skip_model_validation: false,
66            extended_thinking_enabled: default_extended_thinking_enabled(),
67            interleaved_thinking_beta: default_interleaved_thinking_beta(),
68            interleaved_thinking_budget_tokens: default_interleaved_thinking_budget_tokens(),
69            interleaved_thinking_type_enabled: default_interleaved_thinking_type(),
70            tool_search: ToolSearchConfig::default(),
71            effort: default_effort(),
72            count_tokens_enabled: false,
73        }
74    }
75}
76
77/// Configuration for Anthropic's tool search feature (advanced-tool-use beta)
78/// Enables dynamic tool discovery for large tool catalogs (up to 10k tools)
79#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
80#[derive(Debug, Clone, Deserialize, Serialize)]
81pub struct ToolSearchConfig {
82    /// Enable tool search feature (requires advanced-tool-use-2025-11-20 beta)
83    #[serde(default)]
84    pub enabled: bool,
85
86    /// Search algorithm: "regex" (Python regex patterns) or "bm25" (natural language)
87    #[serde(default = "default_tool_search_algorithm")]
88    pub algorithm: String,
89
90    /// Automatically defer loading of all tools except core tools
91    #[serde(default = "default_defer_by_default")]
92    pub defer_by_default: bool,
93
94    /// Maximum number of tool search results to return
95    #[serde(default = "default_max_results")]
96    pub max_results: u32,
97
98    /// Tool names that should never be deferred (always available)
99    #[serde(default)]
100    pub always_available_tools: Vec<String>,
101}
102
103impl Default for ToolSearchConfig {
104    fn default() -> Self {
105        Self {
106            enabled: false,
107            algorithm: default_tool_search_algorithm(),
108            defer_by_default: default_defer_by_default(),
109            max_results: default_max_results(),
110            always_available_tools: vec![],
111        }
112    }
113}
114
115#[inline]
116fn default_tool_search_algorithm() -> String {
117    "regex".to_string()
118}
119
120#[inline]
121fn default_defer_by_default() -> bool {
122    true
123}
124
125#[inline]
126fn default_max_results() -> u32 {
127    5
128}
129
130#[inline]
131fn default_extended_thinking_enabled() -> bool {
132    true
133}
134
135#[inline]
136fn default_interleaved_thinking_beta() -> String {
137    "interleaved-thinking-2025-05-14".to_string()
138}
139
140#[inline]
141fn default_interleaved_thinking_budget_tokens() -> u32 {
142    31999
143}
144
145#[inline]
146fn default_interleaved_thinking_type() -> String {
147    "enabled".to_string()
148}
149
150#[inline]
151fn default_effort() -> String {
152    "low".to_string()
153}