Skip to content

Users & Roles ​

LLM Proxy is multi-tenant: every person gets their own account, their own API keys, their own logs, and optionally their own model allowlist and spending cap.

Team (admin only) is where accounts are created and managed.

Roles ​

adminviewer
Usage & logsAll usersOwn usage and logs only
Audit logView + verify integrityNo access
Providers / Models management / MCP Servers / Team / server settingsFullNo access (403)
API keysOwn keys; may set MCP allowlist and rate limitsOwn keys; MCP allowlist forced to "all", no rate limit
PlaygroundsYesYes

Promote a member by changing their role in Team. A role change revokes all of that member's active sessions — they must sign in again.

Creating a member ​

Team → Add Member:

FieldNotes
UsernameUp to 64 characters; letters, digits, _ and -
Password8–72 characters with uppercase, lowercase, digit, and special character
Roleviewer (default) or admin
Allowed modelsNo selection = all models; an explicit empty selection = deny all

New members (and any member whose password an admin resets) must change their password at first sign-in. Until they do, every endpoint except profile/password/logout is blocked with 403 password_change_required, and the console funnels them to the Set a New Password screen.

Empty allowlist means no access

Clearing the model selection is not the same as "unrestricted" — it denies every model. Click Clear selection only if you intend to lock the member out of model access entirely.

Password changes bump the account's token version, invalidating all previously issued JWTs, and deactivate all session API keys — the user must sign in again.

Model allowlists ​

Each member can be restricted to a set of model names.

  • Applied to the Models screen (read-only catalog for viewers), to /v1/models, and to every inference request.
  • A viewer's API keys can only narrow this list further — the intersection is enforced when the key is created or updated.
  • null/empty selection at the account level means unrestricted; [] means deny all.

Account budgets ​

Beyond per-key budgets (see API Keys), an admin can set an account budget for a member. It caps the combined spend of all of that member's keys in the same UTC calendar windows.

  • Requests over the account budget fail with 429 and code user_budget_exceeded.
  • Only an admin can reset it: Team → member → Reset budget.
  • The member can see their own status at GET /api/me/budget.

Member lifecycle ​

ActionEffect
Edit username / passwordUsername change is immediate; password reset forces a change at next sign-in and revokes sessions
Change roleSessions revoked, token version bumped
DeactivateSigns the member out and stops their keys; keys and usage history are preserved
ReactivateRestores sign-in and key usage
DeletePermanently removes the member and their API keys; usage history remains

Safety rules enforced by the proxy:

  • You cannot delete, deactivate, or demote yourself.
  • You cannot delete, demote, or deactivate the last active admin.
  • Deactivating or deleting a member is irreversible from their side — the console asks for confirmation, with a stricter prompt when the member is an admin.

Sign-in protection ​

  • POST /api/auth/login is rate-limited per IP (default 5 requests/minute).
  • Account lockout is off by default. When enabled, failed logins are counted per username: after 5 failures the account is locked for 15 minutes, and rotating source IPs does not bypass the lockout. It is off by default because a hard per-account lockout is itself a denial-of-service vector — anyone who knows the username can lock the account out. The per-IP limit above and the auth failure delay apply either way.
  • Usernames that do not exist still pay the same bcrypt cost, so timing does not reveal whether an account exists.
  • Successful sign-in clears the failure counter and is recorded in the audit log.

Both thresholds are configurable in Server Settings.

Self-service account endpoints ​

Any signed-in user can:

EndpointPurpose
GET /api/me/profileProfile and role
GET /api/me/budgetAccount budget status
PUT /api/me/passwordChange own password
PUT /api/me/usernameChange own username (requires current password)
GET/PUT /api/me/tracingPersonal Langfuse tracing configuration
POST /api/me/feedbackRate a smart-routing decision for a request
POST /api/auth/logoutSign out (deactivates the session API keys)

MIT licensed