contribution/compass
BerriAI/litellm

LiteLLM

399 signals · 416 observation events

Open repository ↗

The fastest, litest AI Gateway. Rust core with Python SDK. Call 100+ LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]

56.3K stars10.5K forksPythonNOASSERTIONai-gatewayanthropicazure-openaibedrockgatewaylangchainlitellmllmkeyword: LiteLLM
PROJECT NEWS

Release, roadmap, and discussion

All news →
BerriAI/litellm

LiteLLM

AI Infrastructure
Latest stable

v1.96.2

v1.96.2
  • Verify Docker Image Signature
  • The cosign claims were validated
  • The signatures were verified against the specified public key
  • What's Changed
  • chore(release): backport proxy request-handling maintenance and refresh runtime deps for 1.96.1 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36494
Original release notes ↗

Publicly indicated next

Prereleases and milestones indicate public plans; they are not delivery commitments.

Observation trail

  1. discoveredinitial snapshot
  2. discoveredinitial snapshot
  3. changedupdatedAt, metrics
  4. changedtext, updatedAt, metrics
  5. changedupdatedAt, metrics
  6. changedupdatedAt
  7. discoveredinitial snapshot
  8. changedupdatedAt, metrics
  9. changedupdatedAt, metrics
  10. changedupdatedAt
  11. changedupdatedAt, state
  12. changedupdatedAt, state
  13. changedupdatedAt, state
  14. changedupdatedAt, metrics
  15. changedupdatedAt
  16. discoveredinitial snapshot
  17. changedupdatedAt
  18. changedupdatedAt, metrics
  19. changedtext, updatedAt, metrics
  20. changedupdatedAt
  21. changedupdatedAt
  22. changedtext, updatedAt, metrics
  23. discoveredinitial snapshot
  24. discoveredinitial snapshot
  25. changedupdatedAt
  26. discoveredinitial snapshot
  27. discoveredinitial snapshot
  28. discoveredinitial snapshot
  29. changedtext, updatedAt, metrics
  30. discoveredinitial snapshot
50 shown
issue

Azure GPT-5.6 terra/luna cost-map rows carry OpenAI's prices, not Azure's published meters

## What is wrong `azure/gpt-5.6-terra` and `azure/gpt-5.6-luna`, along with their `azure/us/` and `azure/eu/` data-zone siblings, currently hold OpenAI's direct post-cut prices. Azure never made that cut. OpenAI reduced Terra by 20% and Luna by 80% on 2026-07-30. #35481 then applied the same reduction to the twelve Azure rows on 2026-08-05. Its stated basis

importance 7@marty-sullivanopenllm translationOriginal evidence ↗
issue

[Bug]: Azure Responses forwards empty namespace descriptions from additional_tools

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### What happened? LiteLLM's native Azure Responses path forwards `additional_tools` input items without normalizing nested namespace tools. Codex CLI 0.147.0 can send a default `functions` namespace with `"description": ""`; Azure rejects th

importance 7@david-melvilleopenproxyllm translationOriginal evidence ↗
issue

[Bug]: `_should_start_new_content_block` crashes on empty-`choices` chunk (`/v1/messages`, non-Anthropic backend)

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### What happened? `streaming_iterator.py`'s `_should_start_new_content_block` accesses `chunk.choices[0]` unconditionally. Some OpenAI-format backends send a usage-only chunk with `choices: []` near stream end. This chunk crashes the adapter

importance 7@johnfbclosedbugproxyOriginal evidence ↗
issue

[Bug]: litellm_content_filter evaluations missing from request logs and Guardrails Monitor

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### What happened? Guardrails Monitor does not show evaluations for five configured global `litellm_content_filter` guardrails, even though the associated request metadata lists all six guardrails in `applied_guardrails`. For recent successfu

importance 7@jeremytbrunopenbugui-dashboardOriginal evidence ↗
issue

Fix "azure/gpt-image-1.5" and "azure/gpt-image-2" entries in "model_prices_and_context_window.json"

https://github.com/BerriAI/litellm/blob/0e9cd9893e9de3221c04c6a96542a589b32b6f19/model_prices_and_context_window.json#L7539-L7594 We also need to update [model_prices_and_context_window_backup.json](https://github.com/BerriAI/litellm/blob/0e9cd9893e9de3221c04c6a96542a589b32b6f19/litellm/model_prices_and_context_window_backup.json). gpt-image-1.5 and gpt-imag

importance 7@jjajuopenllm translationOriginal evidence ↗
pull request

docs(cookbook): add Agent Threat Rules detection callback example

This adds a small cookbook example showing how to plug Agent Threat Rules into LiteLLM as a CustomGuardrail. ATR is an open detection standard for AI agent threats (prompt injection, tool poisoning, MCP attacks, skill compromise) released under Apache-2.0 at https://github.com/Agent-Threat-Rule/agent-threat-rules. The new file cookbook/atr_detection_callback

importance 7@eeee2345closedOriginal evidence ↗
pull request

feat(azure-ai): add Grok 4.3 model metadata

## Summary - add Azure AI Foundry grok-4.3 metadata with pricing from the Microsoft announcement - include 200k context metadata, cached input pricing, and capability flags - keep the backup model cost map in sync and cover routing/lookup behavior in tests ## Tests - parsed both model cost JSON files with python -m json.tool - uv run pytest tests/test_litell

importance 7@emerzonopenOriginal evidence ↗
pull request

fix(anthropic): add reasoning_content when converting thinking blocks to OpenAI format

Fixes #27946 ## Summary When converting Anthropic assistant messages with thinking blocks to OpenAI Chat Completions format, the `reasoning_content` field was missing. DeepSeek reasoning models (and OpenAI o-series) require this field on assistant messages in multi-turn conversation history. ## Changes In `litellm/llms/anthropic/experimental_pass_through/ada

importance 7@Biogod2020openstaleOriginal evidence ↗
pull request

feat(models): add zai/glm-5.2 pricing

## Relevant issues Closes #31075 (Add zai/glm-5.2 pricing entry — GLM-5.2 missing from model cost map) ## What & Why Zhipu AI (智谱) released **GLM-5.2** as its new flagship on 2026-06-13, and official pricing is now published. LiteLLM currently has `zai/glm-5` but **no `zai/glm-5.2`**, so downstream cost-resolving tools misattribute GLM-5.2 traffic to GLM-5 a

importance 7@majiayu000openOriginal evidence ↗
pull request

fix(sse): map vendor error codes >=600 to 502 in _parse_event_data_for_error

## Problem Vendors like ZhipuAI (ZAI) and DashScope return error codes **outside the standard HTTP 100–599 range** inside SSE streaming chunks. For example: - ZAI rate-limit: `1302` - ZAI quota exceeded: `1305`, `1308` - DashScope throttle codes: `4001`, `4002`, … The old `_parse_event_data_for_error()` only returned the code when `100 ≤ code ≤ 599`. Codes o

importance 7@adhavan18openOriginal evidence ↗
pull request

fix(streaming): record completion_start_time on first chunk in agentic and responses streaming iterators

Fixes #31385 ## Problem `AgenticAnthropicStreamingIterator` and `AsyncResponsesAPIStreamingIterator` never set `completion_start_time` on the logging object. As a fallback, `litellm_logging.py` substitutes `end_time` when `completion_start_time is None`, which makes TTFT equal to total latency. ## Fix Stamp `completion_start_time` on the first non-None chunk

importance 7@adhavan18openOriginal evidence ↗
pull request

fix(anthropic): emit SSE error event when Responses API bridge stream fails mid-stream

## Relevant issues Addresses #32086 — the core stream-swallowing (ask 1 of the issue). Asks 2 (server-side failure logging/metrics) and 3 (`output_tokens` always 0 on this path — which looks like dict-vs-attribute access in the same `response.completed` branch) are intentionally left for follow-ups to keep this PR isolated. ## Linear ticket ## Pre-Submission

importance 7@David-Wu1119openOriginal evidence ↗
pull request

fix(bedrock): drop toolSpec.strict for Claude Sonnet 5 on Converse

## Relevant issues Fixes #33193 ## Linear ticket Resolves LIT-4261 ## Pre-Submission checklist **Please complete all items before asking a LiteLLM maintainer to review your PR** - [x] I have added meaningful tests - [x] My PR passes all CI/CD checks (e.g., lint, format, unit tests) - [x] My PR's scope is as isolated as possible; it only solves 1 specific pro

importance 7@kr0kclosedOriginal evidence ↗
pull request

fix(azure_ai): recognize real Search doc endpoints so teams can read/write via passthrough

## Relevant issues Non-admin teams cannot upload documents to, read the details of, or run most of the query endpoints on an Azure AI Search index through the passthrough, even when an admin has granted them access ## Linear ticket ## Pre-Submission checklist - [x] I have added meaningful tests - [x] My PR passes all CI/CD checks (e.g., lint, format, unit te

importance 7@noahnistleropenOriginal evidence ↗
pull request

fix: include cache_write_tokens in cost calculation for cached-input requests

## Summary Fixes #33772 OpenAI models that report **cache-write** tokens (`cache_write_tokens`) were being mis-priced because LiteLLM's cost path only recognized Anthropic's field name (`cache_creation_tokens`). This caused `response_cost` to be **understated** for any request that writes to the prompt cache -- cache-write tokens were billed at the plain inp

importance 7@PiedPiper911openOriginal evidence ↗
pull request

feat(otel): resolve a request's trace destinations from its identity

## TLDR Problem this solves: - a request needs to know which admin-owned destinations its identity is granted, resolved from its team and org - a client must not be able to name its own export destinations - an identity no grant reaches must get nothing rather than everything How it solves it: - resolves destinations at auth time and anchors them on a server

importance 7@yucheng-berriopenOriginal evidence ↗
pull request

feat(realtime): support latest OpenAI audio models

## TLDR Problem this solves: - Realtime translation endpoints were not first-class - New transcription models lacked SDK streaming support - Direct WebRTC bypasses spend tracking and budget enforcement How it solves it: - Adds translation WebSocket and WebRTC proxy paths - Uses OpenAI SDK 2.52 native Realtime methods - Adds typed transcription streaming and

importance 7@emerzonopenOriginal evidence ↗
pull request

feat(azure): add support for apply_guardrail within Azure guardrails

## TLDR Adds `/guardrails/apply_guardrail` support for Azure guardrails (`AzureContentSafetyPromptShieldGuardrail` and `AzureContentSafetyTextModerationGuardrail`) Problem this solves: - Allows `/guardrails/apply_guardrail` to work with Azure guardrails properly How it solves it: - Both Azure classes (`AzureContentSafetyPromptShieldGuardrail` and `AzureConte

importance 7@dsmrtopenOriginal evidence ↗
pull request

fix(router): offload sync pre-call checks to thread pool

## What Router._pre_call_checks() blocks the event loop on async paths because it calls sync litellm.token_counter() directly. Offload the existing sync logic to asyncio.to_thread() so async callers can await without stalling. ## Evidence - litellm/router.py:10245 _pre_call_checks() called from async completion/embedding/etc. paths at lines 10771, 11355, 115

importance 7@LavyaTandelopenOriginal evidence ↗
pull request

fix(batches): route filtered list_batches through provider fallback

## What DB proxies with managed files route all `GET /v1/batches` through the managed-files hook. Filtered requests (`provider` or `target_model_names`) should fall through to provider routing instead of hitting a bare `Exception`. ## Root Cause `list_batches` unconditionally calls `managed_files.list_user_batches()` when the hook is present, even for filter

importance 7@LavyaTandelopenOriginal evidence ↗
pull request

fix(router): apply cache_kwargs regardless of Redis presence (#36309)

## What Router now applies cache_kwargs (e.g. type=disk) even when Redis is not configured. ## Evidence - router.py:530-535 — cache_kwargs applied before Redis block - router.py:560 — removed duplicate cache_kwargs.update() inside Redis block ## Fix cache_kwargs are now extracted and applied before the Redis conditional. The 'type' key is popped to avoid dup

importance 7@LavyaTandelopenOriginal evidence ↗
pull request

fix(bedrock): use actual file size when Content-Length missing (#36388)

## What Bedrock file upload now reports correct bytes in FileObject instead of always 0. ## Evidence - transformation.py:863-865 — _file_content_size passed through litellm_params - transformation.py:1030-1034 — fallback to _file_content_size when Content-Length missing ## Fix S3 PUT responses often omit Content-Length. We capture the actual file size during

importance 7@LavyaTandelopenOriginal evidence ↗
pull request

perf(proxy): stagger scheduled background jobs across jobs and pods

## TLDR Problem this solves: - APScheduler anchors an `interval` job at `now + interval`, so every scheduled background job registered in one proxy startup shares a single firing instant for the life of the process, and every replica a rollout brought up together shares that instant as well - Each tick, the spend flush, the daily tag spend flush, the gateway

importance 7@yassin-berriaiclosedOriginal evidence ↗
pull request

fix(batches): stop uncostable batches from starving the cost poll page

## TLDR Problem this solves: - Uncostable batches held poll slots forever - Once they filled the page, newer batches went uncosted - Terminal rows escaped the staleness sweep entirely How it solves it: - Retire rows with no model id in their unified id - Retire rows the provider 404s as gone - Sweep completed rows never costed past the staleness cutoff ## Us

importance 7@devin-ai-integration[bot]openOriginal evidence ↗
pull request

fix(proxy): requeue spend logs when the DB write fails with a transport error

## TLDR Problem this solves: - A DB outage silently loses every queued spend log - Prisma's P1001 masquerade escaped the retry clause entirely - Failed batches were dropped, never put back on the queue How it solves it: - Classify failures with the existing transport-error helper - Requeue the batch at the head after retries exhaust - Route every enqueue, pr

importance 7@devin-ai-integration[bot]openOriginal evidence ↗
issue

[Bug]: DB_Models not shown on AI Hub

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### What happened? In our setup we only use Models which are added through the WebUI and stored in the database. No config file whatsoever is used. With this approach however all available (and working) models are not visible on the AI Hub Ma

importance 6@NikJen26closedbugproxystaleOriginal evidence ↗
issue

[Bug]: Vector store creation fails when using model mapping public model name for embedding_model

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### What happened? **Description** When adding a vector store and specifying the `embedding_model` using a model mapping public model name, the request fails with a `BadRequestError` indicating that the LLM provider is not provided. **Additio

importance 6@Outvokerclosedbugproxyllm translationstaleOriginal evidence ↗
issue

## Bug: Usage AI Chat fails when selected LiteLLM model name is a proxy alias / model group

### Summary The Usage dashboard's **Ask AI** feature fails if the selected model is a LiteLLM model name / model group such as `mylitellmmodel`. In my setup, `mylitellmmodel` is a valid LiteLLM proxy model name that routes to GPT-4.1. It works for normal proxy requests, but the Usage AI chat feature fails with: ```text litellm.BadRequestError: GetLLMProvider

importance 6@metalshankedopenllm translationOriginal evidence ↗
issue

[Bug]: Critical: Response leakage / Cross-talk between users in Redis Cluster environment on OpenShift

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### What happened? Hi, We're seeing an issue in a distributed setup where responses occasionally seem to be returned to the wrong client. Environment - OpenShift (multiple replicas) - Image: litellm-database (v1.81.3+) - Redis Cluster enabled

importance 6@randomkrmlclosedbugproxystaleOriginal evidence ↗
issue

[Feature]: Custom Transport support for acompletion calls

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### The Feature Allow customizing transport layer (HTTP) by passing a custom `httpx` client as a "client" argument. The customization will provide a simplified path to resolve simple tasks as an alternative to a more complex setup of litellm

importance 6@minherzopenenhancementstaleSDKOriginal evidence ↗
issue

[Bug]: max_parallel_requests not reliable with anthropic adapter

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### What happened? Hello, `max_parallel_requests` counter in Redis monotonically increases when clients cancel streaming `/v1/messages` requests mid-stream. Eventually every request hits Limit type: `max_parallel_requests. Current limit: N, R

importance 6@xhejtmanopenbugproxyllm translationclaude codeOriginal evidence ↗
issue

[Bug]: Bedrock passthrough bills 1-hour cache writes at the 5-minute rate (cache_creation.ephemeral_1h_input_tokens not propagated)

## Summary When LiteLLM is used as a **Bedrock passthrough** proxy (`/bedrock/.../invoke-with-response-stream`, e.g. Claude Code with `CLAUDE_CODE_USE_BEDROCK=1`), Anthropic cache-creation tokens written with a **1-hour TTL** (`cache_control: {"type":"ephemeral","ttl":"1h"}`) are billed at the **5-minute** rate. Bedrock **does** return the split in `usage.ca

importance 6@lamalamalamabotopenproxyllm translationOriginal evidence ↗
issue

[Bug]: ReDoS in secret_redaction.redact_string() — catastrophic regex backtracking on large exception strings blocks the event loop for minutes, kills liveness probes, and crash-loops the proxy

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### What happened? ## What happened? All replicas of our LiteLLM proxy (Docker Swarm, 4 replicas) entered a continuous crash-loop: every container was killed with `task: non-zero exit (137): dockerexec: unhealthy container` every 4–8 minutes,

importance 6@etatrosopenbugproxyOriginal evidence ↗
issue

[Bug]: Unable to reset user max budget to unlimited

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### What happened? Similar to https://github.com/BerriAI/litellm/issues/19781, internal users who have been previously set a budget cannot be set back to Unlimited. <img width="2918" height="670" alt="Image" src="https://github.com/user-attac

importance 6@premtiwari5008openbugui-dashboardOriginal evidence ↗
issue

[Bug][Proxy]: Azure v1 image generation and editing use deployment-scoped routes

## Check for existing issues - [x] I searched the existing issues and checked that this is not a duplicate ## What happened? When Azure OpenAI image generation or image editing is configured with `api_version: v1` or `preview`, LiteLLM Proxy builds a deployment-scoped URL instead of the integrated Azure v1 image endpoint The request is sent to `/openai/deplo

importance 6@ymuichiroopenproxyllm translationOriginal evidence ↗
issue

Ask AI (Usage) should route through llm_router for proxy model aliases

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### What happened? A bug happened!## Summary The "Ask AI" chat feature under Usage calls `litellm.acompletion()` directly (`litellm/proxy/management_endpoints/usage_endpoints/ai_usage_chat.py`), which cannot resolve proxy model aliases define

importance 6@thomasmomotopenbugllm translationOriginal evidence ↗
issue

[Feature]: Filter spend logs by endTime in GET /spend/logs/v2

### Check for existing issues - [x] I have searched the existing issues and checked that my issue is not a duplicate. ### The Feature ### Problem The `GET /spend/logs/v2` endpoint currently filters logs **only by `startTime`** (when the request started). This creates a critical gap for billing and monitoring systems that need to track when requests **complet

importance 6@Avgany-23openenhancementproxyllm translationOriginal evidence ↗
pull request

fix(caching): fix AttributeError crashes and embedding fallback for Qdrant semantic cache

## Summary Qdrant semantic cache is completely non-functional due to 4 cascading bugs. Multiple code paths access `litellm.cache.cache` directly, which only exists for Redis-based backends. For Qdrant, this raises `AttributeError: 'Cache' object has no attribute 'cache'` at startup and on every request. ## Changes 1. **proxy_server.py**: Use `getattr(litellm

importance 6@vedaant00closedstaleOriginal evidence ↗
pull request

fix: enable xhigh reasoning support for gpt-5.4-mini models

## Summary Corrects the "supports_xhigh_reasoning_effort" configuration for gpt-5.4-mini models to match their OpenAI counterparts. ## Changes Fixed models (changed "supports_xhigh_reasoning_effort" from false → true): - azure/gpt-5.4-mini - azure/gpt-5.4-mini-2026-03-17 - azure/gpt-5.4-nano - azure/gpt-5.4-nano-2026-03-17 Also updated "supports_none_reasoni

importance 6@emerzonopenOriginal evidence ↗
pull request

fix(responses): handle response.incomplete streaming event in Responses->Chat transform

## Summary The Responses API streaming transform (`LiteLLMResponsesAPIStreamingIterator`) did not handle the `response.incomplete` event type, which is sent by Azure OpenAI when generation ends due to `max_output_tokens` being reached or a content filter trigger. The event fell through to the `else: pass` branch, silently discarding `incomplete_details` and

importance 6@VANDRANKIclosedstaleOriginal evidence ↗
pull request

feat(vertex): add Lyria model support

## Relevant issues ## Linear ticket ## Pre-Submission checklist **Please complete all items before asking a LiteLLM maintainer to review your PR** - [x] I have added meaningful tests - [ ] My PR passes all CI/CD checks (e.g., lint, format, unit tests) - [x] My PR's scope is as isolated as possible; it only solves 1 specific problem - [x] I have received a Gr

importance 6@emerzonopenOriginal evidence ↗
pull request

fix(proxy): skip budget checks for model discovery routes (#31078)

Fixes #31078. ### Description When an internal_user has their budget exhausted, `GET /v1/models` and `GET /models` were returning `400 budget_exceeded` instead of the model list, whereas proxy admins with an exhausted budget were able to successfully access the route. The root cause was that `auth_checks.py::common_checks()` correctly identifies that `MODEL_

importance 6@HasnaathussainclosedOriginal evidence ↗
pull request

fix(mcp): include server_name and alias in /v1/mcp/server/health response

## Relevant issues Fixes #31233 ## Linear ticket ## Pre-Submission checklist **Please complete all items before asking a LiteLLM maintainer to review your PR** - [x] I have added meaningful tests - [x] My PR passes all CI/CD checks (e.g., lint, format, unit tests) - [x] My PR's scope is as isolated as possible; it only solves 1 specific problem - [ ] I have

importance 6@David-Wu1119openOriginal evidence ↗
pull request

fix(anthropic): read usage and status from dict-shaped Responses completed events

## Relevant issues Addresses the usage-extraction finding in #32086 ("`message_delta.usage.output_tokens` is always 0 on the openai-provider → `/v1/messages` streaming path, and every spend row records 0/0 tokens"). Complements #32475, which covers the error-event half of that issue. ## Linear ticket ## Pre-Submission checklist **Please complete all items be

importance 6@David-Wu1119openOriginal evidence ↗
pull request

fix(proxy/batches): stop forwarding custom_llm_provider twice in list and cancel

## Relevant issues ## Linear ticket ## Pre-Submission checklist **Please complete all items before asking a LiteLLM maintainer to review your PR** - [x] I have added meaningful tests - [x] My PR passes all CI/CD checks (e.g., lint, format, unit tests) - [x] My PR's scope is as isolated as possible; it only solves 1 specific problem - [x] I have received a Gr

importance 6@anxkhnopenOriginal evidence ↗
pull request

fix(mcp): configurable default top_k for mcp_tool_search

## Summary - Add `litellm_settings.mcp_tool_search_default_top_k` for a global default when the model omits `top_k` - Add per-key `object_permission.mcp_tool_search_top_k` override (with DB migration) - Expose the resolved default in the virtual `mcp_tool_search` tool schema Fixes #33440 ## Test plan - [x] Added unit tests for default resolution (per-key, gl

importance 6@Hashim1999164openOriginal evidence ↗
pull request

fix(sdk): snapshot dict items before iterating in safe_deep_copy and safe_dumps

## TLDR Problem this solves: - `safe_deep_copy` and `safe_dumps` crash on `dictionary changed size during iteration` - A concurrent hook inserting a key mid-iteration fails the request (intermittent 500s) How it solves it: - Snapshot `.items()` with `list(...)` before iterating, in both helpers ## Relevant issues Fixes #34471 ## Pre-Submission checklist - [x

importance 6@yryzhan-vitechopenOriginal evidence ↗
pull request

fix(spend): stop losing spend log rows when a flush is cancelled

## TLDR Problem this solves: - Spend rows popped for a flush vanish if the flush is cancelled - Nothing writes the spend logs queue on proxy shutdown How it solves it: - Requeue the popped batch when the write is cancelled - Drain the queue at shutdown before Prisma disconnects ## User Flow Before: a platform team rolls their proxy pods and the requests bill

importance 6@devin-ai-integration[bot]closedOriginal evidence ↗
pull request

fix(spend): requeue spend log batch when a flush is cancelled after dequeue

## TLDR Problem this solves: - Cancelled spend flush drops the dequeued batch forever - No requeue and no shield around the DB write How it solves it: - Shield the write so cancellation lets it finish - Requeue the spend log batch at the queue head on cancellation - Requeue a cancelled tool usage batch only once its shielded flush is known to have failed, so

importance 6@devin-ai-integration[bot]closedOriginal evidence ↗
pull request

feat(credentials): admin-owned logging credential, access shape, and destination mapping

## TLDR Problem this solves: - there was no way to store a trace destination that belongs to the admin rather than to a team's own callback settings - a destination needs an access grant that says which identities it may receive traces for, validated when it is written rather than trusted at read time - collector tokens must never come back out of the creden

importance 6@yucheng-berriopenOriginal evidence ↗