Skip to content

0.7.0

Choose a tag to compare

@leoguillaume leoguillaume released this 02 Sep 08:55
· 101 commits to main since this release
fb67446

OpenGateLLM 0.7.0 continues the clean-architecture migration of self-service (/v1/me, /v1/keys, /v1/usage) and admin organization APIs. Several HTTP contracts change with that work (renamed self-service paths with deprecated aliases, full-replacement admin PATCH, richer key and organization responses). The release also adds Grafana dashboard templates, flushes Redis on API startup, and releases pooled Postgres connections during model inference.

Breaking changes

  • Rename /v1/me/info to /v1/me and /v1/me/keys to /v1/keys. Deprecated aliases remain on the old paths (#1033).
  • Move GET /v1/me/usage to GET /v1/usage (deprecated alias kept). List items now use "object": "usage" (was "me.usage"), the wrapper adds total / offset / limit, and unused method / status fields are dropped (#1045).
  • Admin user payloads rename role → role_id and organization → organization_id. Clients using the old names get 422 (#1010).
  • Self-service key list and create now match admin keys: paginated {object, total, offset, limit, data}, sort_by / sort_order, secret field value instead of token (#1020, #1021).
  • DELETE /v1/admin/keys/{key_id} and DELETE /v1/keys/{key_id} return 200 with a key object instead of 204. The leftover DELETE /v1/admin/tokens/{token} route is removed. A deprecated DELETE /v1/me/keys/{key_id} alias is kept (#1022, #1039).
  • Admin PATCH on users, roles, routers, providers, and organizations is a full replacement: omitting a required field is 422; null on a nullable field clears it; empty lists clear permissions / limits / aliases. Provider timeout on update is bounded 1..3600. PATCH /v1/me is unchanged (#1053, #1080).
  • POST /v1/admin/organizations 201 body is a full OrganizationResponse instead of {id} (#1041).
  • DELETE /v1/admin/organizations/{organization_id} and PATCH /v1/admin/organizations/{organization_id} return 200 with the organization instead of 204 (#1050, #1080).
  • GET /v1/admin/organizations sort params rename order_by / order_direction → sort_by / sort_order; the list wrapper adds total / offset / limit (#1057).
  • Admin RouterResponse drops vector_size and max_context_length; they now live on ProviderResponse. GET /v1/models is unchanged (#1052).

Features

  • Flush the Redis logical DB once per process on gunicorn startup (rate-limit keys, inflight gauges, latency series), instead of only resetting LIMITS:* (#952).
  • Add importable Grafana dashboard templates for inference (traffic, latency, TTFT, tokens, output speed) and HTTP traffic (grafana/inference.json, grafana/traffic.json) (#903).

Refactoring

  • Introduce AutocommitSession so model-forward endpoints release the pooled Postgres connection before the provider call (#1005).
  • Migrate POST /v1/audio/transcriptions to clean architecture (#1008).
  • Migrate self-service me / keys / usage endpoints to clean architecture (#1020, #1021, #1023, #1024, #1038, #1039, #1045).
  • Migrate DELETE /v1/admin/keys to clean architecture (#1022).
  • Complete admin organizations CRUD on clean architecture (POST, GET, PATCH, DELETE) (#1041, #1050, #1057, #1080).
  • Load /v1/models through ModelQuery / ModelView and drop capability fields from the Router aggregate (#1052).
  • Standardize datetime handling: Unix seconds (int) at the HTTP boundary, timezone-aware UTC datetime in domain and Postgres. The JSON contract is unchanged (#1062).
  • Delete a router’s providers in a single query (#1067).

Bug fix

  • Return 409 (not 500) when deleting an organization or role that still has users, including the FK race. The error detail no longer includes a user count (#1068).
  • Stop logging the unused duplicate normalized_latency metric and drop it from the Metric enum (#1056).

Playground

  • Admin edit dialogs send a full PATCH body and can clear nullable fields. Fixes the provider router dropdown (router_id), user expires (Unix timestamp), and role limit create/delete payloads (#1053).
  • Display timestamps in the viewer’s local timezone via a shared helper (#1062).
  • Show vector_size and max_context_length on the provider page instead of the router page (#1052).

Full Changelog: 0.6.0...0.7.0

  • refacto(users): rename residual ID fields to *_id in clean-architecture code by @bakr-a in #1010
  • chore(doc): update generated documentation and release versions by @github-actions[bot] in #1009
  • refacto(audio): refacto post /v1/audio/transcriptions endpoint toward clean architecture by @leoguillaume in #1008
  • refacto(postgres): release pooled connection during provider calls by @benjaminpilia in #1005
  • chore: add AGENTS.md by @leoguillaume in #1017
  • refacto: rename GetModelUseCase and GetRoleUseCase to GetOne* by @leoguillaume in #1018
  • refacto(endpoints): inject get_authenticated_user when only the user is needed by @leoguillaume in #1019
  • refacto(keys): migrate DELETE /v1/admin/keys to clean architecture by @leoguillaume in #1022
  • ci: run coverage and e2e only on ready PRs by @leoguillaume in #1025
  • refacto(me): refacto GET /v1/me/keys endpoint toward clean architecture by @leoguillaume in #1020
  • refacto(me): POST /v1/me/keys endpoint toward clean architecture by @leoguillaume in #1021
  • refacto(me): migrate GET /v1/me/info toward clean architecture by @leoguillaume in #1023
  • feat(redis): implement redis keys reset by @tibo-pdn in #952
  • feat(me): rename /v1/me/info to /v1/me and /v1/me/keys to /v1/keys by @leoguillaume in #1033
  • refacto(me): refacto PATCH /v1/me/info endpoint toward clean architecture by @leoguillaume in #1024
  • refacto(me): migrate GET /v1/keys/{key_id} toward clean architecture by @leoguillaume in #1038
  • refacto(me): migrate DELETE /v1/me/keys toward clean architecture by @leoguillaume in #1039
  • feat(grafana): add inference and traffic grafana templates for OGL by @tibo-pdn in #903
  • refacto(organizations): move post /v1/admin/organizations to clean architecture by @bakr-a in #1041
  • chore(tests): review tests run execution in CI/CD by @leoguillaume in #1043
  • refacto(usage): migrate GET /v1/me/usage to /v1/usage toward clean architecture by @leoguillaume in #1045
  • refacto(organizations) - migrate delete /v1/admin/organizations endpo… by @leoguillaume in #1050
  • fix(doc): patch deploy issue by @leoguillaume in #1054
  • chore(doc): update generated documentation and release versions by @github-actions[bot] in #1055
  • feat(metric): remove normalized_latency reference (useless) - fix str, Enum usage by @tibo-pdn in #1056
  • refacto(router): move vector_size and max_context_length off Router onto ModelQuery (#886) by @leoguillaume in #1052
  • refacto(organizations): migrate GET /v1/admin/organizations to clean architecture by @bakr-a in #1057
  • feat(datetime): standardize datetime handling across API, domain and playground by @tibo-pdn in #1062
  • feat(admin): require all fields on migrated PATCH update endpoints by @tibo-pdn in #1053
  • refacto(postgres): delete providers in one query and test delete_all_routers by @leoguillaume in #1067
  • refacto(pydantic): adopt pydantic v3 annotated syntax in all basemodel classes by @bakr-a in #1070
  • fix(admin): update prod private_host by @moscaale in #1075
  • fix(admin): return 409 on delete org/role FK race without user count (#1048) by @leoguillaume in #1068
  • chore: update AGENTS.md by @benjaminpilia in #1079
  • refacto(organizations): migrate the PATCH endpoint to clean architecture by @leoguillaume in #1080
  • refacto(postgres): use row_to* as return type for the whole db layer by @bakr-a in #1072
  • fix(ci): bump oauth2-proxy and refresh expired Trivy ignores by @leoguillaume in #1078

Full Changelog: 0.6.0...0.7.0