BerriAI/litellm · error · ValueError

Invalid, tampered, or expired plugin session claim

Error message

Invalid, tampered, or expired plugin session claim

What it means

Raised by verify_plugin_session_claim when Fernet decryption of the plugin session token fails — the ciphertext was tampered with, encrypted for a different plugin, or is otherwise invalid (distinct from audience/expiry failures).

Source

Thrown at litellm/proxy/plugin_routes.py:168

        "plugin": plugin_name,
        "user_id": user_id or "",
        "user_role": user_role or "",
        "exp": int(time.time()) + _CLAIM_TTL_SECONDS,
    }
    return _plugin_fernet(plugin_name).encrypt(json.dumps(claim).encode()).decode()


def verify_plugin_session_claim(plugin_name: str, ciphertext: str) -> dict:
    """Verify and decode a plugin session claim.

    Raises ValueError if the HMAC is invalid, the audience is wrong, or
    the claim is expired.  Returns the decoded claim dict on success.
    """
    try:
        raw: Final = _plugin_fernet(plugin_name).decrypt(ciphertext.encode(), ttl=_CLAIM_TTL_SECONDS)
        claim: Final = json.loads(raw)
    except (InvalidToken, Exception) as exc:
        raise ValueError("Invalid, tampered, or expired plugin session claim") from exc

    if claim.get("plugin") != plugin_name:
        raise ValueError("Plugin claim audience mismatch")
    if int(claim.get("exp", 0)) < int(time.time()):
        raise ValueError("Plugin session claim expired")
    return claim


# ---------------------------------------------------------------------------
# Config
# ---------------------------------------------------------------------------
def register_plugins_from_config(general_settings: dict[str, object]) -> None:
    """Replace the plugin registry from general_settings.

    Replaces (not merges) so plugins removed from config are immediately
    unreachable without requiring a process restart.
    """
    raw: Final = general_settings.get("plugins")

View on GitHub (pinned to 77b7c6c40c)

Solutions

  1. Re-open the plugin from the LiteLLM UI to obtain a fresh session claim.
  2. Ensure LITELLM_SALT_KEY is unchanged; rotating it invalidates existing claims.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at litellm/proxy/plugin_routes.py:168 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18). Data as JSON: /api/errors/781f59a1bab02464. Report an issue: GitHub.