feat: add evaluate_flags() API for single-call flag evaluation#137
Open
feat: add evaluate_flags() API for single-call flag evaluation#137
Conversation
Add Client#evaluate_flags(distinct_id, ...) returning a FeatureFlagEvaluations snapshot, and a flags: option on capture so a single /flags call can power both flag branching and event enrichment per request. The snapshot exposes is_enabled, get_flag, get_flag_payload, plus only_accessed / only([keys]) filter helpers. flag_keys: scopes the underlying /flags request itself. is_enabled and get_flag fire $feature_flag_called events with full metadata (id, version, reason, request_id), deduped through the existing per-distinct_id cache. get_flag_payload does not record access or fire an event. The dedup + capture in get_feature_flag_result is extracted into _capture_feature_flag_called_if_needed and shared between the existing path and the snapshot's access-recording. Existing is_feature_enabled, get_feature_flag, get_feature_flag_result, get_feature_flag_payload, and capture(send_feature_flags:) continue to work unchanged. Generated-By: PostHog Code Task-Id: fe67a5bd-7d33-4568-9148-39d181660a5a
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Client#evaluate_flags(distinct_id, …)returning aFeatureFlagEvaluationssnapshot — one/flagsround-trip powers both branching and event enrichment.is_enabled/get_flag/get_flag_payloadfor branching, plusonly_accessed/only([keys])to narrow what gets attached to a captured event.flags:option oncapture— when present, attaches$feature/<key>and$active_feature_flagsfrom the snapshot without any extra/flagscall.flag_keys:onevaluate_flagsscopes the underlying/flagsrequest itself (sent asflag_keys_to_evaluate).is_feature_enabled,get_feature_flag,get_feature_flag_result,get_feature_flag_payload, andcapture(send_feature_flags:)remain unchanged.References
RFC: https://github.com/PostHog/requests-for-comments-internal/pull/1020 · mirrors posthog-python#539 and posthog-js#3476.
Design decisions
is_enabledreturnsfalsefor unknown flags,get_flagreturnsnil— matches the legacy single-flag methods so existing branching code is structurally interchangeable.get_flag_payloaddeliberately does not record access or fire$feature_flag_called— payload-only reads shouldn't count as an exposure.only_accessed()falls back to all flags with a warning when nothing has been accessed; silently dropping every flag from the captured event would be an easy footgun.accessedset, so calls on a clone don't back-propagate exposures into the parent.Hoststruct (two lambdas:capture_flag_called_event_if_needed,log_warning) is passed to the snapshot instead of a back-reference to the fullClient— keeps the snapshot decoupled and testable.locally_evaluated: true, reason"Evaluated locally", and$feature_flag_definitions_loaded_aton emitted events, matching the existing single-flag local path.Phase 2 follow-ups (out of scope here)
is_feature_enabled,get_feature_flag,get_feature_flag_payload, andcapture(send_feature_flags:).Created with PostHog Code