mirror of
https://github.com/headroomlabs-ai/headroom.git
synced 2026-08-27 14:17:10 -04:00
2 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
f9384ef4b7
|
fix: suppress LiteLLM provider banner before import (#874)
## Summary - set `LITELLM_SUPPRESS_DEBUG_INFO` before importing `litellm` in the LiteLLM provider - keep the existing post-import suppression flags as a fallback - add a regression test that verifies the env flag exists before `litellm` import Fixes #613 ## Tests - `uv run pytest tests/test_startup_log_noise.py::TestLiteLLMLogSuppression -q` - `uv run ruff check headroom/providers/litellm.py tests/test_startup_log_noise.py` - `python3 -m py_compile headroom/providers/litellm.py tests/test_startup_log_noise.py` |
||
|
|
45559011b1
|
fix(startup): suppress proxy startup log noise (#619)
* docs: add enterprise.md * docs: add link to enterprisemd in README * fix(copilot): restore generic endpoint for non-subscription OAuth (#610) (#612) * fix(copilot): restore generic endpoint for non-subscription OAuth (#610) 0.23.0 re-pointed the shared Copilot OAuth branch from the generic api.githubcopilot.com host to the account-specific endpoints.api host returned by /copilot_internal/user, and made resolve_copilot_api_url ignore the GITHUB_COPILOT_API_URL override whenever a token resolved. That change was meant to add --subscription, but it also altered the pre-existing non-subscription OAuth flow that worked on 0.22.4. The account host does not serve newer models (e.g. gpt-5.4) on the responses API, so wrapped requests began failing with unsupported-model errors while plain Copilot and 0.22.4 kept working. Restore 0.22.4 routing for non-subscription OAuth (generic host, still overridable) and keep account resolution only for --subscription. resolve_copilot_api_url now honors GITHUB_COPILOT_API_URL first, so the override escape hatch works for every path. BYOK is unaffected. Add a regression suite that mocks a successful user-info response, the real-world path the prior test never exercised (it relied on the network call failing in CI and falling back to the generic host). * fix(copilot): route subscription + OAuth through the generic host (#610) The 0.23.0 endpoint resolution derived the Copilot API host from /copilot_internal/user (endpoints.api), which returns a segmented host (e.g. api.individual.githubcopilot.com) that does not serve newer models on the responses API and is not the host the official Copilot client routes with (that comes from the token-exchange endpoint). --subscription used the identical resolution, so it carried the same latent regression as the non-subscription OAuth path. Make Copilot host resolution override -> generic for BOTH --subscription and the implicit OAuth path, and stop using user-info to route. Accounts that require a dedicated host (enterprise / data residency) pin it via GITHUB_COPILOT_API_URL. resolve_copilot_api_url no longer makes a network call; _fetch_copilot_user_info is retained for token validation. Update the subscription smoke tests that encoded the old account-host assumption, and add wrap-level + unit coverage that --subscription routes to the generic host even when user-info advertises an account host, and that the GITHUB_COPILOT_API_URL override flows through both paths. * docs(copilot): document generic-host routing + enterprise override (#610) Spell out the routing contract introduced by the #610 fix so enterprise users have a supported path. Headroom routes wrapped Copilot hosted traffic (--subscription and OAuth) to the generic api.githubcopilot.com, and accounts on a dedicated host (Enterprise Cloud data residency, egress proxy) pin it via GITHUB_COPILOT_API_URL. - copilot --help: note the generic host + GITHUB_COPILOT_API_URL override. - TESTING-copilot-subscription.md: add "API host & Enterprise / data residency" section; correct the stale api.*.githubcopilot.com claim; and invite enterprise tenants who want token-exchange-based auto-detection to open an issue. - integration-guide.md: short hosted-host + override note in the Copilot section. * fix(wrap): report unbindable proxy ports (#602) * fix(proxy): fail-open on corrupt golden bytes instead of RuntimeError (#603) * fix(proxy): fail-open on corrupt golden bytes instead of RuntimeError Permanent session corruption: once golden bytes become unreadable (UnicodeDecodeError / JSONDecodeError), every subsequent request for the session raised RuntimeError, returning 500 until proxy restart. Fix: log at ERROR level and recover — skip the corrupt memory tool, or regenerate a fresh CCR definition — rather than propagating RuntimeError and permanently breaking the session. Also change proxy_inbound_request_aborted from logger.info to logger.error with exc_info=True so tracebacks appear in logs. Closes: proxy silent-500 sessions in the wild (observed 2026-06-04) * fix(tests): re-enable headroom log propagation in corrupt-bytes tests configure_proxy_logging() sets headroom_logger.propagate = False to prevent duplicate writes when the proxy redirects stderr to a log file. In CI the proxy initialises its logging stack before the test suite, leaving propagation disabled. pytest's caplog handler attaches to the root logger, so records that stop at the headroom logger are never captured. Added _enable_headroom_log_propagation autouse fixture that temporarily re-enables propagation for the duration of each test, making caplog capture work regardless of the surrounding logging configuration. * fix(tests): remove unused imports from corrupt-bytes regression tests Remove json, SessionCcrTracker, and SessionToolTracker imports that were imported but never referenced in the test body. Fixes ruff F401 and I001 lint errors reported by CI. --------- Co-authored-by: Patrick Ancillotti <patrick.ancillotti@people.inc> * fix(startup): suppress log noise from litellm, trafilatura, HF hub, and tiktoken warning * fix(startup): suppress httpx INFO logs from sentence_transformers HEAD checks * docs(changelog): add entry for startup log noise suppression fixes * refactor(startup): extract hf_hub_download_local_first into onnx_runtime The three _hub_download/_hub_dl helpers in embedders.py, onnx_router.py, and kompress_compressor.py are identical -- try local cache first, fall back to network download. Extract into a single hf_hub_download_local_first() function in onnx_runtime.py (the natural home for shared ORT/HF utilities) and update all three callers to use it. * fix(lint): sort imports and remove unused _FALLBACK_WARNING_SHOWN import * fix(lint): cast hf_hub_download return to str for mypy no-any-return --------- Co-authored-by: Patrick Ancillotti <patrick.ancillotti@people.inc> |