use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
use typed_builder::TypedBuilder;
use super::agents::{AgentDefinition, SettingSource};
use super::mcp::McpServerConfig;
use super::plugins::SdkPluginConfig;
use super::sandbox::SandboxSettings;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum ToolsOption {
List(Vec<String>),
Preset(ToolsPreset),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ToolsPreset {
#[serde(rename = "type")]
pub preset_type: String,
pub preset: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum ThinkingConfig {
Adaptive,
Enabled {
budget_tokens: u32,
},
Disabled,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum Effort {
Low,
Medium,
High,
Max,
}
impl std::fmt::Display for Effort {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Effort::Low => write!(f, "low"),
Effort::Medium => write!(f, "medium"),
Effort::High => write!(f, "high"),
Effort::Max => write!(f, "max"),
}
}
}
#[derive(Debug, Clone, TypedBuilder, Default)]
#[builder(field_defaults(default, setter(into)))]
pub struct ClaudeAgentOptions {
pub tools: Option<ToolsOption>,
pub allowed_tools: Vec<String>,
pub disallowed_tools: Vec<String>,
pub system_prompt: Option<SystemPrompt>,
#[builder(default)]
pub mcp_servers: HashMap<String, McpServerConfig>,
pub permission_mode: Option<PermissionMode>,
pub max_turns: Option<u32>,
pub max_budget_usd: Option<f64>,
pub model: Option<String>,
pub fallback_model: Option<String>,
#[builder(default)]
pub betas: Vec<String>,
pub permission_prompt_tool_name: Option<String>,
pub cwd: Option<PathBuf>,
pub cli_path: Option<PathBuf>,
pub settings: Option<String>,
#[builder(default)]
pub add_dirs: Vec<PathBuf>,
#[builder(default)]
pub env: HashMap<String, String>,
#[builder(default)]
pub extra_args: HashMap<String, Option<String>>,
pub max_buffer_size: Option<usize>,
#[builder(default)]
pub continue_conversation: bool,
pub resume: Option<String>,
pub session_id: Option<String>,
#[builder(default)]
pub include_partial_messages: bool,
#[builder(default)]
pub fork_session: bool,
pub setting_sources: Option<Vec<SettingSource>>,
pub agents: Option<HashMap<String, AgentDefinition>>,
#[builder(default)]
pub plugins: Vec<SdkPluginConfig>,
pub sandbox: Option<SandboxSettings>,
pub max_thinking_tokens: Option<u32>,
pub thinking: Option<ThinkingConfig>,
pub effort: Option<Effort>,
pub output_format: Option<serde_json::Value>,
#[builder(default)]
pub enable_file_checkpointing: bool,
pub user: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum SystemPrompt {
Text(String),
Preset(SystemPromptPreset),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SystemPromptPreset {
#[serde(rename = "type")]
pub preset_type: String,
pub preset: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub append: Option<String>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub enum PermissionMode {
Default,
AcceptEdits,
Plan,
BypassPermissions,
}
impl std::fmt::Display for PermissionMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PermissionMode::Default => write!(f, "default"),
PermissionMode::AcceptEdits => write!(f, "acceptEdits"),
PermissionMode::Plan => write!(f, "plan"),
PermissionMode::BypassPermissions => write!(f, "bypassPermissions"),
}
}
}