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