Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions docs/index.html

Large diffs are not rendered by default.

16 changes: 15 additions & 1 deletion src/mlpa/core/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ class Env(BaseSettings):
USER_FEATURE_BUDGET_S2S_TPM_LIMIT: int = 2000
USER_FEATURE_BUDGET_S2S_BUDGET_DURATION: str = "1d"

# User Feature Budget - S2S Android service type (same values as s2s)
USER_FEATURE_BUDGET_S2S_ANDROID_BUDGET_ID: str = "end-user-budget-s2s-android"
USER_FEATURE_BUDGET_S2S_ANDROID_MAX_BUDGET: float = 0.1
USER_FEATURE_BUDGET_S2S_ANDROID_RPM_LIMIT: int = 40
USER_FEATURE_BUDGET_S2S_ANDROID_TPM_LIMIT: int = 2000
USER_FEATURE_BUDGET_S2S_ANDROID_BUDGET_DURATION: str = "1d"

# User Feature Budget - memories service type
USER_FEATURE_BUDGET_MEMORIES_BUDGET_ID: str = "end-user-budget-memories"
USER_FEATURE_BUDGET_MEMORIES_MAX_BUDGET: float = 0.1
Expand All @@ -53,7 +60,7 @@ class Env(BaseSettings):
def user_feature_budget(self) -> dict[str, dict]:
"""
User feature budget configuration by service type.
Returns a nested dictionary with service types (ai, s2s, memories, ai-dev, memories-dev) as keys.
Returns a nested dictionary with service types (ai, s2s, s2s-android, memories, ai-dev, memories-dev) as keys.
Constructed from individual environment variables.
"""
return {
Expand All @@ -71,6 +78,13 @@ def user_feature_budget(self) -> dict[str, dict]:
"tpm_limit": self.USER_FEATURE_BUDGET_S2S_TPM_LIMIT,
"budget_duration": self.USER_FEATURE_BUDGET_S2S_BUDGET_DURATION,
},
"s2s-android": {
"budget_id": self.USER_FEATURE_BUDGET_S2S_ANDROID_BUDGET_ID,
"max_budget": self.USER_FEATURE_BUDGET_S2S_ANDROID_MAX_BUDGET,
"rpm_limit": self.USER_FEATURE_BUDGET_S2S_ANDROID_RPM_LIMIT,
"tpm_limit": self.USER_FEATURE_BUDGET_S2S_ANDROID_TPM_LIMIT,
"budget_duration": self.USER_FEATURE_BUDGET_S2S_ANDROID_BUDGET_DURATION,
},
"memories": {
"budget_id": self.USER_FEATURE_BUDGET_MEMORIES_BUDGET_ID,
"max_budget": self.USER_FEATURE_BUDGET_MEMORIES_MAX_BUDGET,
Expand Down
2 changes: 1 addition & 1 deletion src/mlpa/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ async def get_metrics():
description="Authorize first using App Attest, Play Integrity, FxA, or dev tier. "
"**Headers:** "
"`Authorization` (required): Bearer token — FxA OAuth token, Play Integrity MLPA token, or App Attest JWT. "
"`service-type` (required): One of `ai`, `s2s`, `memories`, `ai-dev`, `memories-dev` — for tracking and budget. "
"`service-type` (required): One of `ai`, `s2s`, `s2s-android`, `memories`, `ai-dev`, `memories-dev` — for tracking and budget. "
"`x-dev-authorization` (required for `ai-dev`/`memories-dev`): Experimentation token; also requires FxA in Authorization. Dev service types return 401 without it. "
"For App Attest: set `use-app-attest: true`. For Play Integrity: set `use-play-integrity: true`.",
responses=RATE_LIMIT_ERROR_RESPONSE,
Expand Down
14 changes: 11 additions & 3 deletions src/tests/unit/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,16 +84,17 @@ def test_user_feature_budget_dev_service_types_default_values():


def test_valid_service_types_all_service_types():
"""Test that valid_service_types includes all service types (ai, s2s, memories, ai-dev, memories-dev)."""
"""Test that valid_service_types includes all service types (ai, s2s, s2s-android, memories, ai-dev, memories-dev)."""
env = Env()
service_types = env.valid_service_types

assert "ai" in service_types
assert "s2s" in service_types
assert "s2s-android" in service_types
assert "memories" in service_types
assert "ai-dev" in service_types
assert "memories-dev" in service_types
assert len(service_types) == 5
assert len(service_types) == 6


def test_user_feature_budget_structure_consistency():
Expand All @@ -105,7 +106,14 @@ def test_user_feature_budget_structure_consistency():
reference_keys = set(budgets["ai"].keys())

# Verify all service types have the same keys
for service_type in ["ai", "s2s", "memories", "ai-dev", "memories-dev"]:
for service_type in [
"ai",
"s2s",
"s2s-android",
"memories",
"ai-dev",
"memories-dev",
]:
assert service_type in budgets
service_keys = set(budgets[service_type].keys())
assert service_keys == reference_keys, (
Expand Down