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