Stéphane Tailland f9b73fda9f fix(llm): validate tokens against the classic-models realm, not the stale VPS one
The AI gateway's openid-connect plugin still carried the cluster-wide
dataplane-template-defaults issuer, https://keycloak.sttlab.eu/realms/sttlab.
Every other domain gateway overrides it to the lab realm; this one was missed.

The plugin therefore fetched JWKS from a realm that never signed the token and
rejected it with "invalid signature", which reaches the caller as a bare 401
"Authentication required". Combined with the missing llm-proxy audience in the
realm, the OIDC path on this gateway had never authenticated anyone — only the
key-auth path LibreChat uses was ever exercised.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 11:09:39 +02:00
2026-08-20 17:28:05 +02:00

platform-llm

Platform-owned llm bounded context — Gateway infrastructure and the shared LLM proxy in one repo. Never split per functional domain, and never split between infra/routing here either: both are owned by the same (platform) team, unlike catalog's dataplane-catalog/catalog-api split (feature team vs. platform team, a real access boundary that doesn't exist for this domain).

What it does

Fronts OpenRouter (https://openrouter.ai) via one proxy route (/llm/v1/chat/completions) — the client's own model field selects among any OpenRouter-hosted model, not just a fixed set Kong picks.

Active policies:

  • ai-rate-limiting-advanced, token-based, both global (across all callers) and per-client (per authenticated consumer).
  • ai-prompt-guard (regex) and ai-semantic-prompt-guard (embedding-based, backed by Redis Stack) for prompt-injection/jailbreak safeguarding.
  • Two-tier auth: key-auth (static, shared key) for chatbot UIs that can't do OIDC on their outbound LLM connection (LibreChat and similar tools — structural limitation of that whole category, not fixable client-side), openid-connect for agents built in-house. Either succeeds; a request passing neither is rejected (request-termination on the fallback anonymous consumer).

Not yet active: PII redaction (ai-sanitizer) — needs a private Kong Cloudsmith registry image and an AI Gateway Enterprise entitlement, blocked pending that access. Everything else in this repo is unaffected.

Structure

  • dev/ai-gateway-kustomization.yaml + dev/ai-gateway-externalsecret.yaml — Gateway/DataPlane/Control Plane infra (same shared k8s-platform template every domain uses).
  • dev/proxy-kustomization.yaml + dev/proxy-externalsecret.yaml — the LLM proxy itself (./kong).
  • dev/gitrepository.yaml — this repo, self-referential.
S
Description
No description provided
Readme 78 KiB