pub struct PawanConfig {Show 34 fields
pub config_version: u32,
pub provider: LlmProvider,
pub model: String,
pub base_url: Option<String>,
pub dry_run: bool,
pub auto_backup: bool,
pub require_git_clean: bool,
pub bash_timeout_secs: u64,
pub tool_call_idle_timeout_secs: u64,
pub max_file_size_kb: usize,
pub max_tool_iterations: usize,
pub max_context_tokens: usize,
pub system_prompt: Option<String>,
pub temperature: f32,
pub top_p: f32,
pub max_tokens: usize,
pub thinking_budget: usize,
pub max_retries: usize,
pub fallback_models: Vec<String>,
pub max_result_chars: usize,
pub reasoning_mode: bool,
pub healing: HealingConfig,
pub targets: HashMap<String, TargetConfig>,
pub tui: TuiConfig,
pub mcp: HashMap<String, McpServerEntry>,
pub permissions: HashMap<String, ToolPermission>,
pub cloud: Option<CloudConfig>,
pub models: ModelRouting,
pub eruka: ErukaConfig,
pub use_ares_backend: bool,
pub use_coordinator: bool,
pub skills_repo: Option<PathBuf>,
pub local_first: bool,
pub local_endpoint: Option<String>,
}Expand description
Main configuration for Pawan
Fields§
§config_version: u32Config version for migration tracking (default: 1)
provider: LlmProviderLLM provider to use
model: StringLLM model to use for coding tasks
base_url: Option<String>Override the API base URL (e.g. “http://localhost:8080/v1” for llama.cpp). Takes priority over OPENAI_API_URL / NVIDIA_API_URL env vars.
dry_run: boolEnable dry-run mode (show changes without applying)
auto_backup: boolCreate backups before editing files
require_git_clean: boolRequire clean git working directory
bash_timeout_secs: u64Timeout for bash commands (seconds)
tool_call_idle_timeout_secs: u64Timeout for tool calls that remain idle (seconds) Default: 300 (5 minutes)
max_file_size_kb: usizeMaximum file size to read (KB)
max_tool_iterations: usizeMaximum tool iterations per request
max_context_tokens: usizeMaximum context tokens before pruning
system_prompt: Option<String>System prompt override
temperature: f32Temperature for LLM responses
top_p: f32Top-p sampling parameter
max_tokens: usizeMaximum tokens in response
thinking_budget: usizeMaximum tokens allowed for reasoning/thinking (0 = unlimited). When set, pawan tracks thinking vs action token usage per call. If thinking exceeds this budget, a warning is logged.
max_retries: usizeMaximum retries for LLM API calls (429 or 5xx errors)
fallback_models: Vec<String>Fallback models to try when primary model fails
max_result_chars: usizeMaximum characters in tool result before truncation
reasoning_mode: boolEnable reasoning/thinking mode (for DeepSeek/Nemotron models)
healing: HealingConfigHealing configuration
targets: HashMap<String, TargetConfig>Target projects
tui: TuiConfigTUI configuration
mcp: HashMap<String, McpServerEntry>MCP server configurations
permissions: HashMap<String, ToolPermission>Tool permission overrides (tool_name -> permission)
cloud: Option<CloudConfig>Cloud fallback: when primary model fails, fall back to cloud provider. Enables hybrid local+cloud routing.
models: ModelRoutingTask-type model routing: use different models for different task categories. If not set, all tasks use the primary model.
eruka: ErukaConfigEruka context engine integration (3-tier memory injection)
use_ares_backend: boolUse ares-server’s LLMClient + ToolCoordinator primitives instead of
pawan’s built-in OpenAI-compatible backend. Requires the ares feature
flag to be enabled when building pawan-core. When true, pawan delegates
LLM generation to ares which provides connection pooling, loop detection,
and unified multi-provider support. Default: false (backwards compatible).
use_coordinator: boolUse the ToolCoordinator for tool-calling loops instead of pawan’s built-in implementation. When true, delegates tool execution to the coordinator which provides parallel execution, timeouts, and consistent error handling. Default: false (backwards compatible).
skills_repo: Option<PathBuf>Optional path to a skills repository (directory of SKILL.md files).
Mirrors the dstack pattern: public repo + private skills linked by config. When set, pawan discovers all SKILL.md files under this path at runtime via thulp-skill-files SkillLoader. Useful for linking private skill libraries without embedding them in the public repo.
Resolution order:
PAWAN_SKILLS_REPOenvironment variableskills_repofield in pawan.toml~/.config/pawan/skillsif it exists- None (no skill discovery beyond the project SKILL.md)
local_first: boolPrefer local inference over cloud when a local model server is reachable.
Before each session pawan probes local_endpoint (or the Ollama default
http://localhost:11434/v1) with a 100 ms TCP timeout.
If the server responds, it is used instead of the configured cloud provider.
If the server is unreachable the configured provider is used as normal.
Default: false (always use configured provider).
local_endpoint: Option<String>Local inference endpoint URL for the local_first probe.
Must be an OpenAI-compatible /v1 endpoint (Ollama, llama.cpp, LM Studio, …).
Defaults to http://localhost:11434/v1 (Ollama) when not set.
Implementations§
Source§impl PawanConfig
impl PawanConfig
Sourcepub fn apply_env_overrides(&mut self)
pub fn apply_env_overrides(&mut self)
Apply environment variable overrides (PAWAN_MODEL, PAWAN_PROVIDER, etc.)
Sourcepub fn get_target(&self, name: &str) -> Option<&TargetConfig>
pub fn get_target(&self, name: &str) -> Option<&TargetConfig>
Get target by name
Sourcepub fn get_system_prompt(&self) -> String
pub fn get_system_prompt(&self) -> String
Get the system prompt, with optional project context injection. Loads from PAWAN.md, AGENTS.md, CLAUDE.md, or .pawan/context.md.
Sourcepub fn resolve_skills_repo(&self) -> Option<PathBuf>
pub fn resolve_skills_repo(&self) -> Option<PathBuf>
Resolve the effective skills repository path using the dstack pattern:
env var > config field > default ~/.config/pawan/skills > None.
Returns Some(path) only if the resolved path exists as a directory.
This allows public pawan repos to link to private skill libraries
without embedding them — the path is configured per-machine.
Sourcepub fn auto_discover_mcp_servers(&mut self) -> Vec<String>
pub fn auto_discover_mcp_servers(&mut self) -> Vec<String>
Auto-discover MCP server binaries in PATH and register any that aren’t already configured. Returns the names of newly-discovered servers.
Supported auto-discovery targets:
eruka-mcp— Eruka context memory (anti-hallucination knowledge store)daedra— web search across 9 backendsdeagle-mcp— deagle code intelligence graph
Existing entries in the mcp HashMap are never overwritten. This makes
the auto-discovery idempotent and safe to call at every agent startup.
Sourcepub fn discover_skills_from_repo(&self) -> Vec<(String, String, PathBuf)>
pub fn discover_skills_from_repo(&self) -> Vec<(String, String, PathBuf)>
Discover all SKILL.md files in the configured skills repository using thulp-skill-files SkillLoader.
Returns a list of (skill_name, description, file_path) tuples. The
caller is responsible for deciding which skills to inject into the
system prompt or present to the user.
The skills repository is never compiled into the pawan binary — this
enables the “public repo links to private skills via config” pattern
used by dstack for dirmacs/skills.
Sourcepub fn use_thinking_mode(&self) -> bool
pub fn use_thinking_mode(&self) -> bool
Check if thinking mode should be enabled. Applicable to DeepSeek, Gemma-4, GLM, Qwen, and Mistral Small 4+ models on NIM.
Trait Implementations§
Source§impl Clone for PawanConfig
impl Clone for PawanConfig
Source§fn clone(&self) -> PawanConfig
fn clone(&self) -> PawanConfig
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PawanConfig
impl Debug for PawanConfig
Source§impl Default for PawanConfig
impl Default for PawanConfig
Source§impl<'de> Deserialize<'de> for PawanConfigwhere
PawanConfig: Default,
impl<'de> Deserialize<'de> for PawanConfigwhere
PawanConfig: Default,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for PawanConfig
impl RefUnwindSafe for PawanConfig
impl Send for PawanConfig
impl Sync for PawanConfig
impl Unpin for PawanConfig
impl UnsafeUnpin for PawanConfig
impl UnwindSafe for PawanConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more