Coverage for little_loops / config / orchestration.py: 88%
33 statements
« prev ^ index » next coverage.py v7.12.0, created at 2026-06-15 17:27 -0500
« prev ^ index » next coverage.py v7.12.0, created at 2026-06-15 17:27 -0500
1"""Orchestration configuration dataclass.
3Covers host CLI selection and related orchestration settings.
4"""
6from __future__ import annotations
8from dataclasses import dataclass, field
9from typing import Any
12@dataclass
13class ComposerAdaptiveConfig:
14 """Tuning knobs for the adaptive loop-composer-adaptive built-in loop."""
16 enabled: bool = False
17 max_replans: int = 2
18 reassess_min_confidence: float = 0.6
20 @classmethod
21 def from_dict(cls, data: dict[str, Any]) -> ComposerAdaptiveConfig:
22 """Create ComposerAdaptiveConfig from dictionary."""
23 return cls(
24 enabled=data.get("enabled", False),
25 max_replans=data.get("max_replans", 2),
26 reassess_min_confidence=data.get("reassess_min_confidence", 0.6),
27 )
30@dataclass
31class ClusterConfig:
32 """Settings for the goal-cluster multi-goal orchestration loop."""
34 max_batch_size: int = 5
35 enable_dedup: bool = True
36 propagate_context: bool = True
38 @classmethod
39 def from_dict(cls, data: dict[str, Any]) -> ClusterConfig:
40 """Create ClusterConfig from dictionary."""
41 return cls(
42 max_batch_size=data.get("max_batch_size", 5),
43 enable_dedup=data.get("enable_dedup", True),
44 propagate_context=data.get("propagate_context", True),
45 )
48@dataclass
49class ComposerConfig:
50 """Settings for the loop-composer built-in orchestration loop."""
52 adaptive: ComposerAdaptiveConfig = field(default_factory=ComposerAdaptiveConfig)
54 @classmethod
55 def from_dict(cls, data: dict[str, Any]) -> ComposerConfig:
56 """Create ComposerConfig from dictionary."""
57 return cls(
58 adaptive=ComposerAdaptiveConfig.from_dict(data.get("adaptive", {})),
59 )
62@dataclass
63class OrchestrationConfig:
64 """Orchestration settings, primarily host CLI selection.
66 ``host_cli`` mirrors the ``LL_HOST_CLI`` environment variable and is used
67 by :func:`~little_loops.host_runner.apply_host_cli_from_config` to export
68 the config value into the environment before :func:`~little_loops.host_runner.resolve_host`
69 runs. The env var takes precedence if already set.
70 """
72 host_cli: str | None = None
73 composer: ComposerConfig = field(default_factory=ComposerConfig)
74 cluster: ClusterConfig = field(default_factory=ClusterConfig)
76 @classmethod
77 def from_dict(cls, data: dict[str, Any]) -> OrchestrationConfig:
78 """Create OrchestrationConfig from dictionary."""
79 return cls(
80 host_cli=data.get("host_cli"),
81 composer=ComposerConfig.from_dict(data.get("composer", {})),
82 cluster=ClusterConfig.from_dict(data.get("cluster", {})),
83 )