Coverage for integrations / agent_engine / compute_config.py: 87.5%
40 statements
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
1"""
2Compute Config Resolution — Single code path for node compute policy.
4Resolves effective compute policy with precedence: env vars > DB > defaults.
5Provider identity (electricity_rate_kwh, cause_alignment) lives on PeerNode,
6not here — this module only handles local policy settings.
7"""
8import logging
9import os
10import time
12logger = logging.getLogger('hevolve_social')
14# ─── Defaults ───
16_DEFAULTS = {
17 'compute_policy': 'local_preferred', # local_only | local_preferred | any
18 'hive_compute_policy': 'local_preferred',
19 'max_hive_gpu_pct': 50,
20 'allow_metered_for_hive': False,
21 'metered_daily_limit_usd': 0.0,
22 'offered_gpu_hours_per_day': 0.0,
23 'accept_thought_experiments': True,
24 'accept_frontier_training': False,
25 'auto_settle': True,
26 'min_settlement_spark': 10,
27}
29# ─── Cache ───
31_policy_cache = {} # {node_id: (timestamp, policy_dict)}
32_CACHE_TTL = 30 # seconds
35def get_compute_policy(node_id: str = None) -> dict:
36 """Resolve effective compute policy. Precedence: env > DB > defaults.
38 Returns dict with: compute_policy, hive_compute_policy, allow_metered_for_hive,
39 metered_daily_limit_usd, max_hive_gpu_pct, offered_gpu_hours_per_day,
40 accept_thought_experiments, accept_frontier_training, auto_settle, min_settlement_spark.
42 NOTE: electricity_rate_kwh and cause_alignment come from PeerNode, not here.
43 """
44 cache_key = node_id or '__default__'
45 now = time.time()
47 # Check cache
48 if cache_key in _policy_cache:
49 cached_ts, cached_policy = _policy_cache[cache_key]
50 if now - cached_ts < _CACHE_TTL:
51 return cached_policy
53 # Start from defaults
54 policy = dict(_DEFAULTS)
56 # Layer 2: DB (NodeComputeConfig row, if exists)
57 if node_id:
58 try:
59 from integrations.social.models import db_session, NodeComputeConfig
60 with db_session() as db:
61 config = db.query(NodeComputeConfig).filter_by(
62 node_id=node_id).first()
63 if config:
64 for key in _DEFAULTS:
65 val = getattr(config, key, None)
66 if val is not None:
67 policy[key] = val
68 except Exception as e:
69 logger.debug(f"compute_config: DB lookup skipped: {e}")
71 # Layer 3: Env vars (highest precedence)
72 env_map = {
73 'HEVOLVE_COMPUTE_POLICY': ('compute_policy', str),
74 'HEVOLVE_HIVE_COMPUTE_POLICY': ('hive_compute_policy', str),
75 'HEVOLVE_MAX_HIVE_GPU_PCT': ('max_hive_gpu_pct', int),
76 'HEVOLVE_ALLOW_METERED_HIVE': ('allow_metered_for_hive', _parse_bool),
77 'HEVOLVE_METERED_DAILY_LIMIT': ('metered_daily_limit_usd', float),
78 }
79 for env_var, (key, converter) in env_map.items():
80 val = os.environ.get(env_var)
81 if val is not None:
82 try:
83 policy[key] = converter(val)
84 except (ValueError, TypeError):
85 pass
87 # Cache and return
88 _policy_cache[cache_key] = (now, policy)
89 return policy
92def invalidate_cache(node_id: str = None):
93 """Invalidate cached policy for a node (or all if None)."""
94 if node_id:
95 _policy_cache.pop(node_id, None)
96 else:
97 _policy_cache.clear()
100def _parse_bool(val: str) -> bool:
101 return val.lower() in ('true', '1', 'yes')