Skip to content

fix(proxy): surface runtime-registered callbacks in UI Logging page - #38974

Merged
yucheng-berri merged 16 commits into
litellm_internal_stagingfrom
litellm_lit5281_callback_inventory_rework
Sep 10, 2026
Merged

yucheng-berri merged 16 commits into
litellm_internal_stagingfrom
litellm_lit5281_callback_inventory_rework

Conversation

@yucheng-berri

@yucheng-berri yucheng-berri commented Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

TLDR

Problem this solves:

  • Logging & Alerts page only listed callbacks saved through the dashboard
  • A YAML callback kept firing but disappeared from the page
  • Users assumed the dashboard callback had replaced the YAML one

How it solves it:

  • GET /get/config/callbacks appends every active callback missing from the saved config
  • Those extra rows are flagged read_only: true and the UI hides their actions
  • Internal proxy hooks, guardrails, cache and the vector store hook stay hidden

User Flow

Before: an admin adds a second callback in the dashboard and the YAML one vanishes from the page even though both keep logging

  1. The admin starts the proxy with success_callback: ["langsmith"] in the YAML config
  2. They open https://litellm-domain/ui/?page=logging-and-alerts and add Langfuse through Add Callback
  3. They send POST https://litellm-domain/v1/chat/completions and both Langsmith and Langfuse receive the trace
  4. They reload https://litellm-domain/ui/?page=logging-and-alerts and only Langfuse is listed
  5. GET https://litellm-domain/get/config/callbacks returns one row, langfuse, so they conclude Langsmith was overwritten

After: the page lists both callbacks, and the YAML one is marked read only

  1. The admin starts the proxy with success_callback: ["langsmith"] in the YAML config
  2. They open https://litellm-domain/ui/?page=logging-and-alerts and add Langfuse through Add Callback
  3. They send POST https://litellm-domain/v1/chat/completions and both Langsmith and Langfuse receive the trace
  4. They reload https://litellm-domain/ui/?page=logging-and-alerts and see Langfuse with its actions menu plus Langsmith tagged "Read only"
  5. GET https://litellm-domain/get/config/callbacks returns two rows, langfuse and langsmith with "read_only": true

Relevant issues

Linear ticket

Resolves LIT-5281

Pre-Submission checklist

Please complete all items before asking a LiteLLM maintainer to review your PR

  • I have added meaningful tests
  • The handful of test files covering my change pass locally, e.g. uv run pytest tests/test_litellm/<your_test_file>.py -v. Leave the suites (make test-unit-*, make test-unit) to CI: it finishes in ~15 minutes where a laptop takes an hour or more
  • My PR passes all required CI/CD checks (e.g., lint, schema.d.ts sync check, etc.)
  • My PR's scope is as isolated as possible; it only solves 1 specific problem
  • I have received a Greptile Confidence Score of at least 4/5 before requesting a maintainer review (Greptile reviews automatically once the PR is opened; only comment @greptileai to re-request a review after pushing changes)

Delays in PR merge?

If you're seeing a delay in your PR being merged, ping the LiteLLM Team on Slack (#pr-review).

Screenshots / Proof of Fix

Shared setup: two proxies from the same Postgres database, one at the merge base and one at the PR tip, each started with --num_workers 2. The YAML config has success_callback: ["langsmith"], callbacks: ["arize", "weave_otel", "s3_v2"] and store_model_in_db: true. langfuse_otel was added through the dashboard payload (POST /config/update), so it lives in the saved config only. LangSmith EU, Arize, Weave and Langfuse Cloud are real destinations and the model is real openai/gpt-5.4-mini. The s3_v2 callback points at a bucket this rig has no access to (the upload fails with a 404 in the proxy log), it is there to prove the s3_v2 -> s3 alias row is listed. $PORT is 20381 for Before and 20383 for After. Dashboard screenshots for this run, plus an earlier Langfuse-only run with Langfuse UI screenshots, are in PR comments

Before (ef3a3c1)

Real request reaches the YAML callbacks

  1. curl -s localhost:$PORT/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H 'Content-Type: application/json' -d '{"model":"gpt-5.4-mini","messages":[{"role":"user","content":"Reply with exactly: ok"}],"metadata":{"tags":["lit5281-1789004664-$PORT"]}}'
  2. {"model": "gpt-5.4-mini", "content": "ok"}
  3. curl -s -X POST "$LANGSMITH_BASE_URL/api/v1/runs/query" -H "x-api-key: $LANGSMITH_API_KEY" -d '{"session":["<project id>"],"filter":"has(tags, \"lit5281-1789004664-20381\")"}' returns one LLMRun with status: success whose output id matches the completion id
  4. curl -s -u "api:$WANDB_API_KEY" -X POST https://trace.wandb.ai/calls/stream_query -d '{"project_id":"$WANDB_PROJECT_ID","limit":400}' contains one litellm_request call carrying that tag, exported by the YAML weave_otel callback

Callback inventory

  1. for i in 1 2 3 4 5 6; do curl -s localhost:$PORT/get/config/callbacks -H "Authorization: Bearer $LITELLM_MASTER_KEY"; done
  2. Every sample lists langsmith and langfuse_otel only. The YAML arize, weave_otel and s3_v2 callbacks that just ran are missing

Dashboard

  1. Open http://localhost:3281/logging-and-alerts/ (dev UI pointed at the proxy)
  2. The Active Logging Callbacks table shows two rows, Langsmith and langfuse_otel, each with the actions menu

Deleting and re-saving callbacks from the dashboard

  1. curl -s -X POST localhost:$PORT/config/callback/delete -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H 'Content-Type: application/json' -d '{"callback_name":"arize"}'
  2. 404 {"detail":{"error":"Callback 'arize' not found in active configuration"}}, inventory unchanged
  3. Same call with "callback_name":"langfuse_otel" is also 404 because the delete route only searches success_callback and this row was saved under callbacks (pre-existing, unchanged)
  4. POST /config/update with {"litellm_settings":{"success_callback":["langfuse_otel"],"failure_callback":["langfuse_otel"]}, "environment_variables": {...}} returns 200. Within the config sync interval the inventory is three langfuse_otel rows (success, failure, success_and_failure) and langsmith is gone, even though the YAML LangSmith callback is still registered. This is the ticket scenario

Cache enabled does not leak internal hooks

  1. Same YAML plus cache: true under litellm_settings on port 20387, two identical chat completions, the second carries an x-litellm-cache-key header
  2. curl -s localhost:20387/callbacks/list -H "Authorization: Bearer $LITELLM_MASTER_KEY" shows cache, _ProxyDBLogger and the deployment hooks as active
  3. curl -s localhost:20387/get/config/callbacks ... lists langsmith and langfuse_otel only, no cache row

Error and auth paths

  1. curl -s localhost:$PORT/v1/chat/completions ... -d '{"model":"does-not-exist","messages":[{"role":"user","content":"hi"}]}' returns 400 Invalid model name passed in model=does-not-exist and the inventory is unchanged
  2. curl -s -o /dev/null -w "%{http_code}\n" localhost:$PORT/get/config/callbacks is 401
  3. Users minted via POST /user/new with user_role internal_user and internal_user_viewer get 401 Only proxy admin can be used ..., a proxy_admin_viewer user gets 200 with LANGSMITH_API_KEY, LANGFUSE_PUBLIC_KEY and LANGFUSE_SECRET_KEY as REDACTED and LANGSMITH_PROJECT, LANGFUSE_HOST visible

After (d63e655)

Real request reaches the YAML callbacks

  1. curl -s localhost:$PORT/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H 'Content-Type: application/json' -d '{"model":"gpt-5.4-mini","messages":[{"role":"user","content":"Reply with exactly: ok"}],"metadata":{"tags":["lit5281-1789004664-$PORT"]}}'
  2. {"model": "gpt-5.4-mini", "content": "ok"}
  3. The same LangSmith runs query with tag lit5281-1789004664-20383 returns one LLMRun with status: success whose output id matches the completion id
  4. The same Weave calls/stream_query contains one litellm_request call carrying that tag

Callback inventory

  1. for i in 1 2 3 4 5 6; do curl -s localhost:$PORT/get/config/callbacks -H "Authorization: Bearer $LITELLM_MASTER_KEY"; done
  2. Every sample lists langsmith (success), langfuse_otel (success_and_failure), plus arize, s3 and weave_otel (success_and_failure) with "read_only": true. s3 is the YAML s3_v2 callback under the name the dashboard uses; at f3b76f1 that row was missing because the alias check looked the display name up in the integration registry
  3. Same output for 12 samples in a row against a --num_workers 4 proxy on port 20385 whose log shows four Started server process lines

Dashboard

  1. Open http://localhost:3283/logging-and-alerts/ (dev UI pointed at the proxy)
  2. The table shows Langsmith and langfuse_otel with the actions menu (Test, Edit, Delete) and arize, s3 Bucket (AWS) and weave_otel with a "Read only" label in place of the menu

Deleting and re-saving callbacks from the dashboard

  1. curl -s -X POST localhost:$PORT/config/callback/delete -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H 'Content-Type: application/json' -d '{"callback_name":"arize"}'
  2. 404 {"detail":{"error":"Callback 'arize' not found in active configuration"}}, inventory unchanged, so the read-only row cannot be removed from the dashboard. Same 404 for "callback_name":"s3" and "s3_v2"
  3. Same call with "callback_name":"langfuse_otel" is 404 for the same pre-existing reason as Before
  4. The same POST /config/update returns 200. Within the config sync interval the inventory is the three langfuse_otel rows, arize and weave_otel read only, and langsmith now "read_only": true instead of disappearing, so the page keeps showing the still registered callback

Cache enabled does not leak internal hooks

  1. Same YAML plus cache: true on port 20388, two identical chat completions, the second carries an x-litellm-cache-key header
  2. curl -s localhost:20388/callbacks/list ... shows cache, _ProxyDBLogger, ServiceLogging and the deployment hooks as active
  3. curl -s localhost:20388/get/config/callbacks ... lists langsmith, langfuse_otel, arize (read only), weave_otel (read only), no cache row and no internal hook

Error and auth paths

  1. curl -s localhost:$PORT/v1/chat/completions ... -d '{"model":"does-not-exist","messages":[{"role":"user","content":"hi"}]}' returns 400 Invalid model name passed in model=does-not-exist and the inventory is unchanged
  2. curl -s -o /dev/null -w "%{http_code}\n" localhost:$PORT/get/config/callbacks is 401
  3. internal_user and internal_user_viewer users get 401 Only proxy admin can be used ..., same as Before, so that 401 comes from route auth and never reaches this code
  4. A proxy_admin_viewer user gets 200 with the same rows as the master key. Secrets are REDACTED (LANGSMITH_API_KEY, LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY, and AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY on the read-only s3 row), non-secrets stay visible (LANGSMITH_PROJECT, LANGFUSE_HOST, AWS_REGION_NAME), and the arize and weave_otel rows carry read_only: true with no variables

Observations from the run:

  • Arize span readback empty, proxy log shows OTLP UNAVAILABLE; Arize ingestion unverified
  • arize inventory row does not depend on that export
  • Same happy, unauth 401 and read-only delete 404 checks on the GitHub merge ref 8eeb423 (staging b22ca7a merged with tip d63e655), 2 workers: identical output
  • Deleting a callback saved under callbacks returns 404 on both sides (pre-existing)

Type

🐛 Bug Fix

Caveats (if any)

Low

  • Runtime rows for callbacks outside CustomLoggerRegistry show their class or function name
  • Dotted-path config entries dedup by module, so a handler class defined in another module still shows twice (pre-existing)
  • /config/callback/delete only searches success_callback (pre-existing, unchanged)
  • Internal hooks are excluded by module owner plus an explicit list (cache, vector_store_pre_call_hook); a new auto-registered registry hook would need adding to that list

Final Attestation

  • The tests check the right things, including the edge cases, and regressions in the respective real-world customer use-cases are not possible after this PR

  • d63e655 passes /live-pr-risk

Link to Devin session: https://app.devin.ai/sessions/e724cebb80f249c391598984099c3329
Open in Devin Desktop: https://app.devin.ai/desktop/session/e724cebb80f249c391598984099c3329?variant=devin
Requested by: @yucheng-berri

@codspeed

codspeed Bot commented Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 31 untouched benchmarks


Comparing litellm_lit5281_callback_inventory_rework (d63e655) with litellm_internal_staging (b22ca7a)

Open in CodSpeed

@greptile-apps

greptile-apps Bot commented Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR surfaces active runtime callbacks that are missing from saved dashboard configuration and marks those rows read-only. It also normalizes callback aliases, excludes internal hooks, preserves secret redaction, and hides UI actions for runtime-only rows

Confidence Score: 5/5

The PR appears safe to merge, with no outstanding correctness, security, or repository-rule findings

The latest alias-filtering change uses the canonical names produced by the callback registry, while explicit internal callback exclusions remain intact. All four previous threads were manually resolved without explanatory replies and therefore are not outstanding

Important Files Changed

Filename Overview
litellm/litellm_core_utils/logging_callback_manager.py Exposes callback objects and preserves self-assigned OpenTelemetry integration names
litellm/proxy/proxy_server.py Adds normalized runtime callback discovery, deduplication, internal-hook filtering, and read-only response rows
tests/test_litellm/proxy/proxy_server/test_routes_config.py Covers runtime-only callbacks, aliases, dotted paths, internal hooks, callback types, and secret redaction
ui/litellm-dashboard/src/components/Settings/LoggingAndAlerts/LoggingCallbacks/LoggingCallbacksTableColumns.tsx Replaces action controls with a read-only label for runtime-only callbacks
ui/litellm-dashboard/src/components/Settings/LoggingAndAlerts/LoggingCallbacks/types.ts Extends callback rows with the optional read-only state

Reviews (11): Last reviewed commit: "fix(proxy): keep runtime-only s3 and sqs..." | Re-trigger Greptile

greptile-apps[bot]

This comment was marked as resolved.

@devin-ai-integration devin-ai-integration Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

This report is out of date. Scroll down for Devin Review's latest report on this PR.

Devin Review found 3 potential issues.

3 flags not posted on this PR by your GitHub settings — view them in Devin Review. (Configure)

Devin Review

Comment thread litellm/proxy/proxy_server.py Outdated
Comment on lines +17107 to +17109
_normalized_runtime = _normalize_callback_alias(_runtime_cb_name)
# Skip if this callback is in config or already appended.
if _normalized_runtime not in _added_normalized_names:

@devin-ai-integration devin-ai-integration Bot Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Distinct callback modes disappear

When configured and runtime registrations share a name but handle different outcomes, _added_normalized_names drops the runtime registration. The Logging page hides it

Learn more

Deduplicate callback rows by both canonical callback identity and effective event type, rather than callback name alone. Preserve the existing behavior where the same callback can appear once for success and once for failure. Consider how a success_and_failure runtime registration overlaps configured success or failure registrations, and add regression tests covering configured success plus runtime failure and the inverse.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Matching on name plus mode would add a duplicate read-only row whenever config lists one callback under both success_callback and failure_callback, since the runtime reports that as success_and_failure.

Comment thread litellm/proxy/proxy_server.py Outdated
return str(callback_name)
_alias_map: Final[dict[str, str]] = {
"opentelemetry": "otel",
"s3_v2": "s3",

@devin-ai-integration devin-ai-integration Bot Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Two storage callbacks collapse together

_normalize_callback_alias equates s3_v2 with the separate s3 integration. Running both causes the runtime registration to disappear from the Logging page

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The alias map exists so runtime rows land on the names the dashboard knows (otel, s3, generic_api). Two storage sinks configured separately still show as two editable rows.

Comment thread litellm/proxy/proxy_server.py Outdated
@codecov

codecov Bot commented Aug 31, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.59459% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
litellm/proxy/proxy_server.py 93.75% 2 Missing ⚠️

📢 Thoughts on this report? Let us know!

@CLAassistant

CLAassistant commented Aug 31, 2026 •

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@yucheng-berri
yucheng-berri force-pushed the litellm_lit5281_callback_inventory_rework branch from 2ad0a58 to fd75b76 Compare August 31, 2026 21:15
@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai please review the current head fd75b76

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

bugbot run

cursor[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai please review the current head 85e41ae

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

bugbot run

@devin-ai-integration devin-ai-integration Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

This report is out of date. Scroll down for Devin Review's latest report on this PR.

Devin Review found 1 new potential issue.

3 flags not posted on this PR by your GitHub settings — view them in Devin Review. (Configure)

Devin Review

return (callback,)
if callback is None:
return ()
return tuple(callback) if isinstance(callback, (list, dict)) else ()

@devin-ai-integration devin-ai-integration Bot Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Dictionary callback deletion fails

With dictionary-shaped settings, normalize_callback marks each key editable. Deleting that row reaches list-only delete_callback and returns an error

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dict-shaped success_callback rows were already listed as editable on the base branch, and the delete route was list-only before this PR. Unchanged here, out of scope.

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

Dict deletion (Devin comment 3898539019): pre-existing on staging. Base delete_callback is byte-identical; dict-shaped configs show as editable rows in staging too, so the delete failure exists before this PR.

Custom callbacks listed twice (Devin comments 3898496017 + 3896630196): fixed in latest commit 79bffe1. Dotted-path callbacks now marked read-only to prevent duplicate display and UI action failures.

Configured otel alias hides sibling (Devin 3898496017): inherent to the design; registry maps multiple otel names to one class, so configured one hides its siblings. This is the intentional tradeoff to fix the ArizeLogger duplicate shown in the ticket's bug. Base had the same behavior (all instances of a class hidden as duplicates).

Callback modes disappear (Devin 3898495881) + s3_v2/s3 collapse (Devin 3898630391): stale anchors to reworked code. Current behavior: runtime row hidden only when its normalized name matches a configured name. No regression from base.

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai please review the current head 79bffe1

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

bugbot run

devin-ai-integration[bot]

This comment was marked as resolved.

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

@devin-ai-integration devin-ai-integration Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

This report is out of date. Scroll down for Devin Review's latest report on this PR.

Devin Review found 1 new potential issue.

4 flags not posted on this PR by your GitHub settings — view them in Devin Review. (Configure)

Devin Review

Comment thread litellm/proxy/proxy_server.py Outdated
Comment on lines +17032 to +17038
configured_modules: Final = frozenset(
configured_name.rsplit(".", 1)[0] for configured_name in configured_callback_names if "." in configured_name
)
dotted_instance_names: Final = frozenset(
_callback_display_name(instance)
for instance in litellm.logging_callback_manager.get_custom_loggers_for_type(CustomLogger)
if type(instance).__module__ in configured_modules

@devin-ai-integration devin-ai-integration Bot Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Sibling callbacks disappear from inventory

When one dotted callback is configured, configured_modules hides every custom logger from that module. Separately registered siblings disappear from the Logging page

Learn more

Dotted-path deduplication in litellm/proxy/proxy_server.py:_hidden_runtime_callback_names uses only the configured module name. This suppresses every CustomLogger class defined in that module, even when config points to just one exported instance and another instance from the same module was registered independently at runtime. Deduplicate against the exact object resolved by each configured dotted path, or preserve enough callback identity during inventory construction to match only the configured instance. Add a regression test with two different CustomLogger instances from one module, only one present in config.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Matching on the exact configured object would mean importing user modules on every dashboard request. Two independently registered loggers from one module with one in config is rare; module matching is the pragmatic dedup.

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai please review the current head acf2934

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

bugbot run

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

…acks

Config-file callbacks fire at runtime but never appear in the UI Logging
and Alerts page because /get/config/callbacks only reads the DB-merged
config. Append runtime-registered callbacks from LoggingCallbackManager
as read-only rows, deduplicated against configured rows via alias
normalization. UI hides edit/delete/test actions for read-only rows.
- Filter _PROXY*, ShadowEval, ServiceLogging, SkillsInjection, ResponsesID prefixes
- Update test to exclude read_only rows from count assertions
- Still allows deployment/guardrail callbacks to surface if configured

Note: comprehensive internal-hook filtering deferred, live-pr-risk will
observe real behavior on running proxy.
…n tests

- Line-concat type error: normalize_callback now returns empty list for non-list types (dict/tuple/set) instead of passing through unchanged; prevents TypeError when config values are non-list
- Test quality TQ005: replace manual try/finally save-restore of litellm.callbacks with monkeypatch.setattr in test_get_config_callbacks_appends_runtime_only_callbacks and test_get_config_callbacks_redacts_runtime_only_row_secrets_for_view_only_admin
- Ruff format: wrap _internal_callback_prefixes tuple and isinstance check across multiple lines to respect 120-char limit
- All three new tests pass
cursor[bot]

This comment was marked as resolved.

…ntory

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@devin-ai-integration

Copy link
Copy Markdown
Contributor

Dashboard before (ef3a3c1) shows only Langfuse. After (1a8e891) also lists the YAML Langsmith callback as read only

before

after

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

@yucheng-berri yucheng-berri changed the title fix(proxy): surface runtime-registered callbacks in UI Logging page (LIT-5281) fix(proxy): surface runtime-registered callbacks in UI Logging page Sep 9, 2026
@yucheng-berri
yucheng-berri enabled auto-merge (squash) September 9, 2026 23:07

@ryan-crabbe-berri ryan-crabbe-berri left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@devin-ai-integration

Copy link
Copy Markdown
Contributor

Real Langfuse rerun at 1a8e891: dashboard before, dashboard after, then Langfuse traces from both callbacks per request

Before (ef3a3c1)

before

After (1a8e891)

after

after actions

Langfuse

langfuse list

langfuse yaml trace

langfuse otel trace

…ed one

arize, weave_otel and langfuse_otel all initialize OpenTelemetry subclasses, so hiding runtime
callbacks by configured class made one saved OTel callback swallow its YAML siblings. Match runtime
instances by their own callback_name and only fall back to class identity for bare OpenTelemetry

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

greptile-apps[bot]

This comment was marked as resolved.

yucheng-berri and others added 2 commits September 10, 2026 01:09
…entory

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@devin-ai-integration

Copy link
Copy Markdown
Contributor

Multi-provider run (LangSmith, Arize, Weave YAML plus dashboard langfuse_otel): base ef3a3c1 hides the YAML rows, tip f3b76f1 lists them read only

Before (ef3a3c1)

dashboard before

After (f3b76f1)

dashboard after

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread litellm/proxy/proxy_server.py Outdated
…ntory

_is_litellm_internal_callback checked registry membership with the display alias (s3, sqs), which is not a registry key, so runtime-only S3Logger and SQSLogger instances were classified as internal and dropped from /get/config/callbacks. Check the registered name instead and cover both loggers in the internal-exclusion regression test

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor

Rerun at d63e655 with s3_v2 added to the YAML callbacks: base hides the YAML rows, tip lists arize, s3 and weave_otel read only

Before (ef3a3c1)

dashboard before

After (d63e655)

dashboard after

@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit d63e655. Configure here.

@yucheng-berri
yucheng-berri merged commit 00b6318 into litellm_internal_staging Sep 10, 2026
89 of 90 checks passed
@yucheng-berri
yucheng-berri deleted the litellm_lit5281_callback_inventory_rework branch September 10, 2026 05:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants