1818from posthog .exception_utils import exc_info_from_error , exceptions_from_error_tuple , handle_in_app
1919from posthog .feature_flags import InconclusiveMatchError , match_feature_flag_properties
2020from posthog .poller import Poller
21- from posthog .request import DEFAULT_HOST , APIError , batch_post , decide , determine_server_host , get , remote_config
21+ from posthog .request import DEFAULT_HOST , APIError , batch_post , decide , determine_server_host , get , remote_config , normalize_decide_response , DecideResponse
2222from posthog .utils import SizeLimitedDict , clean , guess_timezone , remove_trailing_slash
2323from posthog .version import VERSION
2424
@@ -230,21 +230,21 @@ def get_feature_variants(
230230 self , distinct_id , groups = None , person_properties = None , group_properties = None , disable_geoip = None
231231 ):
232232 resp_data = self .get_decide (distinct_id , groups , person_properties , group_properties , disable_geoip )
233- return resp_data [ "featureFlags" ]
233+ return self . to_variants ( resp_data )
234234
235235 def get_feature_payloads (
236236 self , distinct_id , groups = None , person_properties = None , group_properties = None , disable_geoip = None
237237 ):
238238 resp_data = self .get_decide (distinct_id , groups , person_properties , group_properties , disable_geoip )
239- return resp_data [ "featureFlagPayloads" ]
239+ return self . to_payloads ( resp_data )
240240
241241 def get_feature_flags_and_payloads (
242242 self , distinct_id , groups = None , person_properties = None , group_properties = None , disable_geoip = None
243243 ):
244244 resp_data = self .get_decide (distinct_id , groups , person_properties , group_properties , disable_geoip )
245245 return {
246- "featureFlags" : resp_data [ "featureFlags" ] ,
247- "featureFlagPayloads" : resp_data [ "featureFlagPayloads" ] ,
246+ "featureFlags" : self . to_variants ( resp_data ) ,
247+ "featureFlagPayloads" : self . to_payloads ( resp_data ) ,
248248 }
249249
250250 def get_decide (self , distinct_id , groups = None , person_properties = None , group_properties = None , disable_geoip = None ):
@@ -267,7 +267,7 @@ def get_decide(self, distinct_id, groups=None, person_properties=None, group_pro
267267 }
268268 resp_data = decide (self .api_key , self .host , timeout = self .feature_flags_request_timeout_seconds , ** request_data )
269269
270- return resp_data
270+ return normalize_decide_response ( resp_data )
271271
272272 def capture (
273273 self ,
@@ -967,16 +967,17 @@ def get_all_flags(
967967 group_properties = {},
968968 only_evaluate_locally = False ,
969969 disable_geoip = None ,
970- ):
971- flags = self .get_all_flags_and_payloads (
970+ ) -> dict [ str , bool | str ] :
971+ response = self .get_all_flags_and_payloads (
972972 distinct_id ,
973973 groups = groups ,
974974 person_properties = person_properties ,
975975 group_properties = group_properties ,
976976 only_evaluate_locally = only_evaluate_locally ,
977977 disable_geoip = disable_geoip ,
978978 )
979- return flags ["featureFlags" ]
979+
980+ return self .to_variants (response )
980981
981982 def get_all_flags_and_payloads (
982983 self ,
@@ -987,7 +988,7 @@ def get_all_flags_and_payloads(
987988 group_properties = {},
988989 only_evaluate_locally = False ,
989990 disable_geoip = None ,
990- ):
991+ ) -> DecideResponse :
991992 if self .disabled :
992993 return {"featureFlags" : None , "featureFlagPayloads" : None }
993994
@@ -998,7 +999,8 @@ def get_all_flags_and_payloads(
998999 flags , payloads , fallback_to_decide = self ._get_all_flags_and_payloads_locally (
9991000 distinct_id , groups = groups , person_properties = person_properties , group_properties = group_properties
10001001 )
1001- response = {"featureFlags" : flags , "featureFlagPayloads" : payloads }
1002+
1003+ response = normalize_decide_response ({"featureFlags" : flags , "featureFlagPayloads" : payloads })
10021004
10031005 if fallback_to_decide and not only_evaluate_locally :
10041006 try :
@@ -1069,6 +1071,18 @@ def _add_local_person_and_group_properties(self, distinct_id, groups, person_pro
10691071
10701072 return all_person_properties , all_group_properties
10711073
1074+ def to_variants (self , response : any ) -> dict [str , bool | str ]:
1075+ if "flags" not in response :
1076+ return None
1077+
1078+ return {key : value .get_value () for key , value in response .get ("flags" , {}).items ()}
1079+
1080+ def to_payloads (self , response : any ) -> dict [str , str ]:
1081+ if "flags" not in response :
1082+ return None
1083+
1084+ return {key : value .metadata .payload for key , value in response .get ("flags" , {}).items () if value .enabled }
1085+
10721086
10731087def require (name , field , data_type ):
10741088 """Require that the named `field` has the right `data_type`"""
0 commit comments