Repository navigation
fix(e2e): clear the three standing errors in the scheduled Buildkite suite - #41616
Merged
Merged
Conversation
yuneng-berri
had a problem deploying
to
e2e-changed
September 17, 2026 17:12 — with
GitHub Actions
Error
tin-berri
approved these changes
Sep 17, 2026
Contributor
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
yuneng-berri
force-pushed
the
litellm_/buildkite-241-triage-4a48cf
branch
from
September 17, 2026 17:24
7c20639 to
52308a8
Compare
yuneng-berri
had a problem deploying
to
e2e-changed
September 17, 2026 17:24 — with
GitHub Actions
Error
Contributor
yuneng-berri
marked this pull request as draft
September 17, 2026 17:29
… suite The check spins up a hypercorn TLS peer and drives the SDK's own httpx handlers at it, so it needs litellm importable, hypercorn installed and a loopback socket. It lived under tests/e2e, whose Buildkite runner image installs neither litellm nor hypercorn by design (the suite drives a remote proxy over HTTP), so every scheduled e2e build since #230 failed to import the module and pytest reported it as a collection error. The unit tree bans sockets, so it does not belong there either tests/integration is the CircleCI tier built for real TCP against local protocol peers. This adds an sdk shard to it for cases that exercise the SDK's clients with no gateway in the path, registers the two HTTP/2 nodes in the contracts manifest, and adds the shard to the CircleCI matrix. The test now flips the feature through LITELLM_HTTP2 (the user surface) instead of patching module attributes, and asserts the version the peer observed on the wire next to the one the client reports
The team access-group fixture polled a 403 until its message enumerated the team's allow-list, because registering a team-scoped deployment appends that deployment to the list and the fixture has to wait for the reset to land. #41310 replaced that message with a fixed client-facing one, so the poll never matched and both tests errored at setup The allow-list is now read back from /team/info until it holds exactly the access group
DELETE /v1/files/{id} only lets a proxy admin key delete a raw s3:// or
gs:// file id, because such ids skip the managed-file owner check. The
batch lifecycle cleanup deleted the vertex_ai raw ids with the test's
own virtual key and got a 403 at teardown on every build since #194
Raw cloud-storage ids now go through the master key; managed and
provider-native ids keep using the creating key
yuneng-berri
force-pushed
the
litellm_/buildkite-241-triage-4a48cf
branch
from
September 17, 2026 17:38
52308a8 to
dd6ef9e
Compare
yuneng-berri
marked this pull request as ready for review
September 17, 2026 17:38
yuneng-berri
requested a deployment
to
e2e-changed
September 17, 2026 17:40 — with
GitHub Actions
Waiting
This branch is waiting to be deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
TLDR
Problem this solves:
test_outbound_http2_e2e.pycannot importhypercornin the runner imagegs://ids with a virtual key and gets 403How it solves it:
sdkshard undertests/integration, the CircleCI tier for SDK clients against local protocol peers/team/infoinstead of parsing the denial textUser Flow
Before: an engineer opens the scheduled e2e build and finds the same 5 errors every 6 hours, none of them about the code under test
1263 passed, 60 skipped, 5 errorsllm_translation/test_outbound_http2_e2e.pyshowsModuleNotFoundError: No module named 'hypercorn'TestTeamScopedToAccessGrouptests showthe team's allow-list never settled to models=[...], with a 403 whose message no longer lists any modelstest_batch_lifecycle[vertex_ai-*]cases pass and then error at teardown withDelete file gs://... failed: HTTP 403After: the same build reports the suite's real outcome
llm_translation/test_outbound_http2_e2e.pyis gone from the e2e suite; its two checks run in theintegration-sdkCircleCI job onmainTestTeamScopedToAccessGrouptests run once/team/infoshows the allow-list holding only the access grouptest_batch_lifecycle[vertex_ai-*]cases clean up theirgs://input file with the master key and pass end to endRelevant issues
Affected release
Linear ticket
Pre-Submission checklist
Please complete all items before asking a LiteLLM maintainer to review your PR
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@greptileaito 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
Both runs are the real
litellm-e2eBuildkite pipeline: a fresh ephemeral stack deployed from the litellm SHA, the full suite against live providersBefore (4b368bf)
1263 passed, 60 skipped, 30 warnings, 5 errors in 1951.59sAfter (fa01e2d)
http2=http2_enabled()replaced byhttp2=False(and separatelyhttp2=True) inhttp_handler.py, both nodes fail onobserved.post_version; restored afterwardsuv sync --frozen --no-install-workspace --extra proxy --extra cli --group e2e-devinto a scratch venv and runningpython -c 'import litellm'from outside the checkout raisesModuleNotFoundError, which is why the fix is a move and not a dependency pincircleci config validate .circleci/config.ymlreports the config valid with the new matrix entryType
✅ Test
Caveats (if any)
Medium
Low
integrationCircleCI workflow only runs onmain, so the newintegration-sdkjob first executes after merge; the local run above throughrun.pyis the same command the job runsrun_integration.shunchanged, so its job still boots Postgres, Redis and a proxy it never talks toprovider=vertex_aigets a rawgs://id it can never delete; that is the guard's intended behavior, the suite now just cleans up as an adminQA runbook
{"team_alias": "ag-team", "models": ["ag-group"]}; note theteam_id{"models": [], "team_id": "<team_id>"}; note the key{"model_name": "openai/gpt-5.6*", "litellm_params": {"model": "openai/gpt-5.6*", "api_key": "<OPENAI_API_KEY>"}, "model_info": {"team_id": "<team_id>", "access_groups": ["ag-group"]}}modelsto read["ag-group", "openai/gpt-5.6*"]{"team_id": "<team_id>", "team_alias": "ag-team", "models": ["ag-group"]}, then GET /team/info untilmodelsreads exactly["ag-group"]"model": "gpt-5.6-luna"; expect 200 with a real completion/team/inforead"model": "e2e-ag-unknown-1"; expect 403 with"type": "team_model_access_denied"gs://input file runs, and the cleanup deletes that file as an admin (needs VERTEXAI_PROJECT, VERTEXAI_CREDENTIALS, GCS_BUCKET_NAME)purpose=batchand a one-line JSONL; expect ags://<bucket>/litellm-vertex-files/...id"model": "<vertex batch deployment>"; expect a batch objectRaw cloud storage file ids can only be deleted by a proxy admin key"deleted": trueLITELLM_HTTP2is set, verified by both the client and a local hypercorn TLS peer.venv/bin/python tests/integration/run.py sdk --results /tmp/integration-sdk; expect 2 passed andcomplete: truein/tmp/integration-sdk/execution.jsonFinal Attestation