39 lines
1.7 KiB
Python
39 lines
1.7 KiB
Python
"""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)
|