@@ -340,6 +340,9 @@ def evaluate_flags_with_dependencies(
340340 properties : Dict ,
341341 cohort_properties : Optional [Dict ] = None ,
342342 requested_flag_keys : Optional [Set [str ]] = None ,
343+ groups : Optional [Dict ] = None ,
344+ group_properties : Optional [Dict ] = None ,
345+ group_type_mapping : Optional [Dict ] = None ,
343346) -> Dict [str , FlagValue ]:
344347 """
345348 Evaluate feature flags with dependency support.
@@ -353,6 +356,9 @@ def evaluate_flags_with_dependencies(
353356 properties: Properties for evaluation
354357 cohort_properties: Cohort properties for evaluation
355358 requested_flag_keys: Set of flag keys to evaluate (None for all)
359+ groups: Group information for group-level flag evaluation
360+ group_properties: Group properties for group-level flag evaluation
361+ group_type_mapping: Mapping from group type index to group name
356362
357363 Returns:
358364 Dict[str, FlagValue]: Map of flag keys to their evaluation results
@@ -389,14 +395,43 @@ def evaluate_flags_with_dependencies(
389395 continue
390396
391397 try :
392- result = match_feature_flag_properties (
393- flag_def ,
394- distinct_id ,
395- properties ,
396- cohort_properties ,
397- dependency_graph ,
398- id_to_key ,
399- )
398+ # Check if this is a group-level flag
399+ flag_filters = flag_def .get ("filters" , {})
400+ aggregation_group_type_index = flag_filters .get ("aggregation_group_type_index" )
401+
402+ if aggregation_group_type_index is not None :
403+ # This is a group-level flag
404+ _groups = groups or {}
405+ _group_properties = group_properties or {}
406+ _group_type_mapping = group_type_mapping or {}
407+
408+ group_name = _group_type_mapping .get (str (aggregation_group_type_index ))
409+ if not group_name or group_name not in _groups :
410+ # Can't evaluate group flag without proper group info
411+ results [flag_key ] = False
412+ dependency_graph .cache_result (flag_key , False )
413+ continue
414+
415+ focused_group_properties = _group_properties .get (group_name , {})
416+ result = match_feature_flag_properties (
417+ flag_def ,
418+ _groups [group_name ],
419+ focused_group_properties ,
420+ cohort_properties ,
421+ dependency_graph ,
422+ id_to_key ,
423+ )
424+ else :
425+ # Person-level flag
426+ result = match_feature_flag_properties (
427+ flag_def ,
428+ distinct_id ,
429+ properties ,
430+ cohort_properties ,
431+ dependency_graph ,
432+ id_to_key ,
433+ )
434+
400435 results [flag_key ] = result
401436 dependency_graph .cache_result (flag_key , result )
402437 except InconclusiveMatchError :
0 commit comments