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

1""" 

2Compute Config Resolution — Single code path for node compute policy. 

3 

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 

11 

12logger = logging.getLogger('hevolve_social') 

13 

14# ─── Defaults ─── 

15 

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} 

28 

29# ─── Cache ─── 

30 

31_policy_cache = {} # {node_id: (timestamp, policy_dict)} 

32_CACHE_TTL = 30 # seconds 

33 

34 

35def get_compute_policy(node_id: str = None) -> dict: 

36 """Resolve effective compute policy. Precedence: env > DB > defaults. 

37 

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. 

41 

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() 

46 

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 

52 

53 # Start from defaults 

54 policy = dict(_DEFAULTS) 

55 

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}") 

70 

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 

86 

87 # Cache and return 

88 _policy_cache[cache_key] = (now, policy) 

89 return policy 

90 

91 

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() 

98 

99 

100def _parse_bool(val: str) -> bool: 

101 return val.lower() in ('true', '1', 'yes')