use serde::{Deserialize, Serialize};
fn default_max_concurrent_inferences() -> Option<usize> {
Some(8)
}
fn default_default_max_iterations() -> Option<usize> {
Some(50)
}
fn default_max_concurrent_tools() -> usize {
8
}
fn default_script_shell_timeout_secs() -> u64 {
60
}
fn default_stall_timeout_secs() -> u64 {
leviath_runtime::pipeline::DEFAULT_STALL_TIMEOUT_SECS
}
fn default_dead_cycles_before_relief() -> u32 {
leviath_runtime::host::DEFAULT_DEAD_CYCLES_BEFORE_RELIEF
}
pub(crate) fn default_mcp_idle_disconnect_secs() -> u64 {
crate::daemon::mcp_pool::DEFAULT_MCP_IDLE_DISCONNECT_SECS
}
fn default_finished_retention_secs() -> u64 {
leviath_runtime::host::DEFAULT_FINISHED_RETENTION_SECS
}
fn default_wedge_timeout_secs() -> u64 {
leviath_runtime::pipeline::DEFAULT_WEDGE_TIMEOUT_SECS
}
fn default_provider_failures_before_open() -> u32 {
leviath_runtime::pipeline::DEFAULT_FAILURES_BEFORE_OPEN
}
fn default_provider_circuit_cooldown_secs() -> u64 {
leviath_runtime::pipeline::DEFAULT_CIRCUIT_COOLDOWN_SECS
}
fn default_interaction_timeout_secs() -> u64 {
leviath_runtime::interaction_hub::DEFAULT_INTERACTION_TIMEOUT_SECS
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LimitsConfig {
#[serde(default = "default_max_concurrent_inferences")]
pub max_concurrent_inferences: Option<usize>,
#[serde(default = "default_max_concurrent_tools")]
pub max_concurrent_tools: usize,
#[serde(default = "default_default_max_iterations")]
pub default_max_iterations: Option<usize>,
#[serde(default)]
pub exact_token_counting: bool,
#[serde(default = "default_script_shell_timeout_secs")]
pub script_shell_timeout_secs: u64,
#[serde(default = "default_stall_timeout_secs")]
pub stall_timeout_secs: u64,
#[serde(default = "default_dead_cycles_before_relief")]
pub dead_cycles_before_relief: u32,
#[serde(default = "default_finished_retention_secs")]
pub finished_retention_secs: u64,
#[serde(default = "default_mcp_idle_disconnect_secs")]
pub mcp_idle_disconnect_secs: u64,
#[serde(default = "default_wedge_timeout_secs")]
pub wedge_timeout_secs: u64,
#[serde(default = "default_provider_failures_before_open")]
pub provider_failures_before_open: u32,
#[serde(default = "default_provider_circuit_cooldown_secs")]
pub provider_circuit_cooldown_secs: u64,
#[serde(default = "default_interaction_timeout_secs")]
pub interaction_timeout_secs: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_tool_call_write_bytes: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_run_write_bytes: Option<u64>,
}
impl LimitsConfig {
pub fn write_limits(&self) -> leviath_core::write_limits::WriteLimits {
leviath_core::write_limits::WriteLimits {
per_call: self.max_tool_call_write_bytes,
per_run: self.max_run_write_bytes,
}
}
}
impl Default for LimitsConfig {
fn default() -> Self {
Self {
max_concurrent_inferences: default_max_concurrent_inferences(),
max_concurrent_tools: default_max_concurrent_tools(),
default_max_iterations: default_default_max_iterations(),
exact_token_counting: false,
script_shell_timeout_secs: default_script_shell_timeout_secs(),
stall_timeout_secs: default_stall_timeout_secs(),
dead_cycles_before_relief: default_dead_cycles_before_relief(),
finished_retention_secs: default_finished_retention_secs(),
mcp_idle_disconnect_secs: default_mcp_idle_disconnect_secs(),
wedge_timeout_secs: default_wedge_timeout_secs(),
provider_failures_before_open: default_provider_failures_before_open(),
provider_circuit_cooldown_secs: default_provider_circuit_cooldown_secs(),
interaction_timeout_secs: default_interaction_timeout_secs(),
max_tool_call_write_bytes: None,
max_run_write_bytes: None,
}
}
}
fn default_webhook_max_retries() -> u32 {
3
}
fn default_webhook_base_delay_ms() -> u64 {
500
}
fn default_webhook_max_delay_ms() -> u64 {
30_000
}
fn default_webhook_timeout_secs() -> u64 {
10
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebhookConfig {
#[serde(default = "default_webhook_max_retries")]
pub max_retries: u32,
#[serde(default = "default_webhook_base_delay_ms")]
pub base_delay_ms: u64,
#[serde(default = "default_webhook_max_delay_ms")]
pub max_delay_ms: u64,
#[serde(default = "default_webhook_timeout_secs")]
pub timeout_secs: u64,
}
impl Default for WebhookConfig {
fn default() -> Self {
Self {
max_retries: default_webhook_max_retries(),
base_delay_ms: default_webhook_base_delay_ms(),
max_delay_ms: default_webhook_max_delay_ms(),
timeout_secs: default_webhook_timeout_secs(),
}
}
}