in lambda/api/lambda_invoke.py [0:0]
def get_user_variant(endpoint_name: str, user_id: str):
# Get the variants metrics (this will fail if endpoint doesn't exist)
strategy, epsilon, warmup, variant_metrics = exp_metrics.get_variant_metrics(
endpoint_name
)
# Get the configuration for the endpoint name
logger.info(f"Getting variant for user: {user_id}")
user_variant = exp_assignment.get_assignment(
user_id=user_id, endpoint_name=endpoint_name
)
# Ensure that our user variant is still in current metrics
target_variant = user_variant
if user_variant is not None:
user_match = [v for v in variant_metrics if v["variant_name"] == user_variant]
if len(user_match) == 0:
logger.info(f"User variant {user_variant} not in endpoint variants")
target_variant = None
# Get the new target variant if not assigned
status_code = 200
if target_variant is None:
# See if all variants have invocation metrics
with_invocations = [
v for v in variant_metrics if v["invocation_count"] > warmup
]
if len(with_invocations) < len(variant_metrics):
strategy = WeightedSampling.STRATEGY_NAME
algo = WeightedSampling(variant_metrics)
elif strategy == WeightedSampling.STRATEGY_NAME:
algo = WeightedSampling(variant_metrics)
elif strategy == ThompsonSampling.STRATEGY_NAME:
algo = ThompsonSampling(variant_metrics)
elif strategy == EpsilonGreedy.STRATEGY_NAME:
algo = EpsilonGreedy(variant_metrics, epsilon)
elif strategy == UCB1.STRATEGY_NAME:
algo = UCB1(variant_metrics)
else:
raise Exception(f"Strategy {strategy} not supported")
target_variant = algo.select_variant()
status_code = 201
# Assign the target variant to the user
if user_variant != target_variant:
logger.info(f"Set target variant: {target_variant} for user: {user_id}")
exp_assignment.put_assignment(
user_id=user_id, endpoint_name=endpoint_name, variant_name=target_variant
)
# Return the result
return strategy, target_variant, status_code