generated from coulomb/repo-seed
57 lines
2.0 KiB
Python
57 lines
2.0 KiB
Python
"""
|
|
Basic usage example for feature-control-sdk.
|
|
|
|
This demonstrates the thin wrapper + local provider for development.
|
|
|
|
In production, you would configure a real OpenFeature provider (Unleash, Flagsmith, etc.)
|
|
behind the scenes. The consuming repo only sees standard OpenFeature calls.
|
|
|
|
See:
|
|
- specs/UseCaseCatalog.md (UC-A1, UC-A2)
|
|
- docs/canon-mapping.md for context projection from canon models.
|
|
"""
|
|
|
|
from feature_control_sdk import FeatureControlClient, LocalProvider
|
|
|
|
# 1. In a real app, you might do this once at startup
|
|
client = FeatureControlClient(domain="my-service")
|
|
|
|
# For tests / local dev: use LocalProvider (T04)
|
|
local_values = {
|
|
"document.ocr.compute_heavy_path": False,
|
|
"agent.invoice_classifier.extract_recipient": True,
|
|
"tenant.preview.feature": "variant-a",
|
|
}
|
|
client.set_provider(LocalProvider(local_values))
|
|
|
|
# 2. Evaluation context (built from canon facts: actor, tenant, etc.)
|
|
# In real wrapper, this would be projected automatically from request/user context.
|
|
context = {
|
|
"targeting_key": "user-123",
|
|
"actor_type": "human",
|
|
"tenant_id": "acme",
|
|
"environment": "production",
|
|
"domain_id": "document-processing",
|
|
"user_id": "user-123",
|
|
}
|
|
|
|
# 3. Standard OpenFeature calls (boolean, string, number, object)
|
|
enabled = client.get_boolean_value(
|
|
"document.ocr.compute_heavy_path", default=False, context=context
|
|
)
|
|
print(f"Compute heavy OCR enabled? {enabled}") # False (from local)
|
|
|
|
agent_cap = client.get_boolean_value(
|
|
"agent.invoice_classifier.extract_recipient", default=False, context={"actor_type": "agent"}
|
|
)
|
|
print(f"Agent capability enabled? {agent_cap}") # True
|
|
|
|
variant = client.get_string_value("tenant.preview.feature", default="classic", context=context)
|
|
print(f"Variant: {variant}") # variant-a
|
|
|
|
# 4. Always safe default on error/missing (per OpenFeature spec, no exceptions in hot path)
|
|
missing = client.get_boolean_value("does.not.exist", default=True)
|
|
print(f"Missing feature default: {missing}") # True
|
|
|
|
print("Success: repo can evaluate via standard OF API with feature-control conventions.")
|