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    /// Beta header for interleaved thinking feature
8    #[serde(default = "default_interleaved_thinking_beta")]
9    pub interleaved_thinking_beta: String,
10
11    /// Budget tokens for interleaved thinking
12    #[serde(default = "default_interleaved_thinking_budget_tokens")]
13    pub interleaved_thinking_budget_tokens: u32,
14
15    /// Type value for enabling interleaved thinking
16    #[serde(default = "default_interleaved_thinking_type")]
17    pub interleaved_thinking_type_enabled: String,
18
19    /// Tool search configuration for dynamic tool discovery (advanced-tool-use beta)
20    #[serde(default)]
21    pub tool_search: ToolSearchConfig,
22
23    /// Effort level for token usage (high, medium, low)
24    /// Controls how many tokens Claude uses when responding, trading off between
25    /// response thoroughness and token efficiency.
26    /// Only supported by Claude Opus 4.5 (claude-opus-4-5-20251101)
27    #[serde(default = "default_effort")]
28    pub effort: String,
29}
30
31impl Default for AnthropicConfig {
32    fn default() -> Self {
33        Self {
34            interleaved_thinking_beta: default_interleaved_thinking_beta(),
35            interleaved_thinking_budget_tokens: default_interleaved_thinking_budget_tokens(),
36            interleaved_thinking_type_enabled: default_interleaved_thinking_type(),
37            tool_search: ToolSearchConfig::default(),
38            effort: default_effort(),
39        }
40    }
41}
42
43/// Configuration for Anthropic's tool search feature (advanced-tool-use beta)
44/// Enables dynamic tool discovery for large tool catalogs (up to 10k tools)
45#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
46#[derive(Debug, Clone, Deserialize, Serialize)]
47pub struct ToolSearchConfig {
48    /// Enable tool search feature (requires advanced-tool-use-2025-11-20 beta)
49    #[serde(default)]
50    pub enabled: bool,
51
52    /// Search algorithm: "regex" (Python regex patterns) or "bm25" (natural language)
53    #[serde(default = "default_tool_search_algorithm")]
54    pub algorithm: String,
55
56    /// Automatically defer loading of all tools except core tools
57    #[serde(default = "default_defer_by_default")]
58    pub defer_by_default: bool,
59
60    /// Maximum number of tool search results to return
61    #[serde(default = "default_max_results")]
62    pub max_results: u32,
63
64    /// Tool names that should never be deferred (always available)
65    #[serde(default)]
66    pub always_available_tools: Vec<String>,
67}
68
69impl Default for ToolSearchConfig {
70    fn default() -> Self {
71        Self {
72            enabled: false,
73            algorithm: default_tool_search_algorithm(),
74            defer_by_default: default_defer_by_default(),
75            max_results: default_max_results(),
76            always_available_tools: vec![],
77        }
78    }
79}
80
81#[inline]
82fn default_tool_search_algorithm() -> String {
83    "regex".to_string()
84}
85
86#[inline]
87fn default_defer_by_default() -> bool {
88    true
89}
90
91#[inline]
92fn default_max_results() -> u32 {
93    5
94}
95
96#[inline]
97fn default_interleaved_thinking_beta() -> String {
98    "interleaved-thinking-2025-05-14".to_string()
99}
100
101#[inline]
102fn default_interleaved_thinking_budget_tokens() -> u32 {
103    12000
104}
105
106#[inline]
107fn default_interleaved_thinking_type() -> String {
108    "enabled".to_string()
109}
110
111#[inline]
112fn default_effort() -> String {
113    "low".to_string()
114}