"""Runtime concurrency coordination configuration.""" from __future__ import annotations from pydantic import BaseModel, Field class RedisConcurrencyConfig(BaseModel): """Optional Redis-backed cross-worker concurrency coordination.""" enabled: bool = Field(default=False, description="Enable Redis-backed global run concurrency coordination.") url: str | None = Field(default=None, description="Redis URL, for example redis://127.0.0.1:6379/0.") password: str | None = Field( default=None, description="Optional Redis password. You may also include credentials directly in url.", ) namespace: str = Field( default="cmzs_deerflow:concurrency", description="Redis key prefix for concurrency leases. Use a deployment/system prefix when Redis is shared.", ) socket_connect_timeout_ms: int = Field(default=80, ge=1, le=10_000) socket_timeout_ms: int = Field(default=80, ge=1, le=10_000) acquire_timeout_ms: int = Field(default=120, ge=1, le=10_000) operation_timeout_ms: int = Field(default=80, ge=1, le=10_000) circuit_breaker_failures: int = Field(default=3, ge=1, le=100) circuit_breaker_cooldown_seconds: int = Field(default=30, ge=1, le=3600) lease_ttl_seconds: int = Field(default=90, ge=10, le=3600) heartbeat_interval_seconds: int = Field(default=20, ge=5, le=600) fail_open: bool = Field( default=True, description="Allow runs to proceed with local-only limits when Redis is unavailable or slow.", ) class ConcurrencyConfig(BaseModel): """Top-level concurrency coordination config.""" redis: RedisConcurrencyConfig = Field(default_factory=RedisConcurrencyConfig)