Compare commits

...

4 Commits

Author SHA1 Message Date
Evan Lohn
96bf9230f1 potential fix for usage limits 2026-01-05 18:57:19 -08:00
Evan Lohn
d402186326 more logs 2026-01-05 18:27:09 -08:00
Evan Lohn
9048691cc8 skip flaky test 2026-01-05 18:11:41 -08:00
Evan Lohn
78f65c97fe chore: add logs to tenant overrides 2026-01-05 17:38:47 -08:00
4 changed files with 29 additions and 6 deletions

View File

@@ -32,12 +32,12 @@ def fetch_usage_limit_overrides() -> dict[str, TenantUsageLimitOverrides]:
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
data = response.json()
tenant_overrides = data.get("tenant_overrides", {})
tenant_overrides = response.json()
# Parse each tenant's overrides
result: dict[str, TenantUsageLimitOverrides] = {}
for tenant_id, override_data in tenant_overrides.items():
for override_data in tenant_overrides:
tenant_id = override_data["tenant_id"]
try:
result[tenant_id] = TenantUsageLimitOverrides(**override_data)
except Exception as e:
@@ -66,6 +66,9 @@ def load_usage_limit_overrides() -> dict[str, TenantUsageLimitOverrides]:
logger.info("Loading tenant usage limit overrides from control plane...")
overrides = fetch_usage_limit_overrides()
_tenant_usage_limit_overrides = overrides
logger.debug(
"Loaded usage limit overrides for %s tenants: %s", len(overrides), overrides
)
if overrides:
logger.info(f"Loaded usage limit overrides for {len(overrides)} tenants")

View File

@@ -34,6 +34,8 @@ class TenantUsageLimitOverrides(BaseModel):
- Field set to a positive integer: Use that specific limit
"""
tenant_id: str | None = None
llm_cost_cents_trial: int | None = None
llm_cost_cents_paid: int | None = None
chunks_indexed_trial: int | None = None

View File

@@ -90,12 +90,20 @@ def _get_tenant_override(tenant_id: str, field_name: str) -> int | None:
"onyx.server.tenant_usage_limits", "get_tenant_usage_limit_overrides"
)
overrides: TenantUsageLimitOverrides | None = get_overrides_fn(tenant_id)
logger.debug("Got tenant overrides for %s: %s", tenant_id, overrides)
if overrides is not None:
# Get the field value - None means not set, use default
return getattr(overrides, field_name, None)
fv = getattr(overrides, field_name, None)
logger.debug(
"Using tenant override for %s.%s: %s", tenant_id, field_name, fv
)
return fv
except Exception:
# EE module not available or error - fall back to defaults
pass
logger.exception(
"Error getting tenant override for %s.%s falling back to defaults",
tenant_id,
field_name,
)
return None
@@ -151,10 +159,18 @@ def get_limit_for_usage_type(
"""
field_name, default_value = _FIELD_AND_DEFAULT[usage_type][is_trial]
logger.debug("Getting limit for %s.%s: %s", usage_type, is_trial, default_value)
if tenant_id:
logger.debug("Getting tenant override for %s.%s", tenant_id, field_name)
override = _get_tenant_override(tenant_id, field_name)
if override is not None:
logger.debug(
"Using tenant override for %s.%s: %s", tenant_id, field_name, override
)
return override
logger.debug(
"Using default value for %s.%s: %s", usage_type, is_trial, default_value
)
return default_value
@@ -215,6 +231,7 @@ def check_usage_and_raise(
is_trial = is_tenant_on_trial_fn(tenant_id)
limit = get_limit_for_usage_type(usage_type, is_trial, tenant_id)
logger.debug("Checking usage limit for %s.%s: %s", usage_type, is_trial, limit)
# NO_LIMIT means this tenant has unlimited usage for this type
if limit == NO_LIMIT:

View File

@@ -145,6 +145,7 @@ def _validate_vertex_credentials_file(credentials_path: Path) -> None:
) from exc
@pytest.mark.skip(reason="OpenAI prompt caching is unreliable")
@pytest.mark.skipif(
not os.environ.get("OPENAI_API_KEY"),
reason="OpenAI API key not available",