Hunter Wittenborn
6b52abe652
fix oauth credential refresh and test coverage
2026-04-25 07:08:48 -05:00
Hunter Wittenborn
788da36fea
fix: exchange GitHub access token for inference token in embedding/responses
...
The embedding and responses transformations were passing the raw GitHub
access token (ghu_xxx) as the Authorization header instead of exchanging
it for a short-lived Copilot inference token. Also fix api_base
precedence so caller-provided values win, update authenticator docstring
and error message to mention both SDK and proxy auth paths.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 06:41:56 -05:00
Hunter Wittenborn
a0efd2bdf5
chore: rebuild UI after upstream merge
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 06:33:56 -05:00
Hunter Wittenborn
c2ba0bc9c2
Merge remote-tracking branch 'upstream/main' into oauth-ui-flow
...
# Conflicts:
# litellm/proxy/_experimental/out/__next.__PAGE__.txt
# litellm/proxy/_experimental/out/__next._full.txt
# litellm/proxy/_experimental/out/__next._head.txt
# litellm/proxy/_experimental/out/__next._index.txt
# litellm/proxy/_experimental/out/__next._tree.txt
# litellm/proxy/_experimental/out/_not-found.txt
# litellm/proxy/_experimental/out/_not-found/__next._full.txt
# litellm/proxy/_experimental/out/_not-found/__next._head.txt
# litellm/proxy/_experimental/out/_not-found/__next._index.txt
# litellm/proxy/_experimental/out/_not-found/__next._not-found.__PAGE__.txt
# litellm/proxy/_experimental/out/_not-found/__next._not-found.txt
# litellm/proxy/_experimental/out/_not-found/__next._tree.txt
# litellm/proxy/_experimental/out/api-reference.txt
# litellm/proxy/_experimental/out/api-reference/__next.!KGRhc2hib2FyZCk.api-reference.__PAGE__.txt
# litellm/proxy/_experimental/out/api-reference/__next.!KGRhc2hib2FyZCk.api-reference.txt
# litellm/proxy/_experimental/out/api-reference/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/api-reference/__next._full.txt
# litellm/proxy/_experimental/out/api-reference/__next._head.txt
# litellm/proxy/_experimental/out/api-reference/__next._index.txt
# litellm/proxy/_experimental/out/api-reference/__next._tree.txt
# litellm/proxy/_experimental/out/chat.html
# litellm/proxy/_experimental/out/chat.txt
# litellm/proxy/_experimental/out/chat/__next._full.txt
# litellm/proxy/_experimental/out/chat/__next._head.txt
# litellm/proxy/_experimental/out/chat/__next._index.txt
# litellm/proxy/_experimental/out/chat/__next._tree.txt
# litellm/proxy/_experimental/out/chat/__next.chat.__PAGE__.txt
# litellm/proxy/_experimental/out/chat/__next.chat.txt
# litellm/proxy/_experimental/out/experimental/api-playground.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next.!KGRhc2hib2FyZCk.experimental.api-playground.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next.!KGRhc2hib2FyZCk.experimental.api-playground.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next._full.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next._head.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next._index.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/budgets.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next.!KGRhc2hib2FyZCk.experimental.budgets.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next.!KGRhc2hib2FyZCk.experimental.budgets.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next._full.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next._head.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next._index.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/caching.txt
# litellm/proxy/_experimental/out/experimental/caching/__next.!KGRhc2hib2FyZCk.experimental.caching.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/caching/__next.!KGRhc2hib2FyZCk.experimental.caching.txt
# litellm/proxy/_experimental/out/experimental/caching/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/caching/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/caching/__next._full.txt
# litellm/proxy/_experimental/out/experimental/caching/__next._head.txt
# litellm/proxy/_experimental/out/experimental/caching/__next._index.txt
# litellm/proxy/_experimental/out/experimental/caching/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next.!KGRhc2hib2FyZCk.experimental.claude-code-plugins.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next.!KGRhc2hib2FyZCk.experimental.claude-code-plugins.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next._full.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next._head.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next._index.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/old-usage.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next.!KGRhc2hib2FyZCk.experimental.old-usage.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next.!KGRhc2hib2FyZCk.experimental.old-usage.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next._full.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next._head.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next._index.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/prompts.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next.!KGRhc2hib2FyZCk.experimental.prompts.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next.!KGRhc2hib2FyZCk.experimental.prompts.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next._full.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next._head.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next._index.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/tag-management.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next.!KGRhc2hib2FyZCk.experimental.tag-management.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next.!KGRhc2hib2FyZCk.experimental.tag-management.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next._full.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next._head.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next._index.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next._tree.txt
# litellm/proxy/_experimental/out/guardrails.txt
# litellm/proxy/_experimental/out/guardrails/__next.!KGRhc2hib2FyZCk.guardrails.__PAGE__.txt
# litellm/proxy/_experimental/out/guardrails/__next.!KGRhc2hib2FyZCk.guardrails.txt
# litellm/proxy/_experimental/out/guardrails/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/guardrails/__next._full.txt
# litellm/proxy/_experimental/out/guardrails/__next._head.txt
# litellm/proxy/_experimental/out/guardrails/__next._index.txt
# litellm/proxy/_experimental/out/guardrails/__next._tree.txt
# litellm/proxy/_experimental/out/index.html
# litellm/proxy/_experimental/out/index.txt
# litellm/proxy/_experimental/out/login.txt
# litellm/proxy/_experimental/out/login/__next._full.txt
# litellm/proxy/_experimental/out/login/__next._head.txt
# litellm/proxy/_experimental/out/login/__next._index.txt
# litellm/proxy/_experimental/out/login/__next._tree.txt
# litellm/proxy/_experimental/out/login/__next.login.__PAGE__.txt
# litellm/proxy/_experimental/out/login/__next.login.txt
# litellm/proxy/_experimental/out/logs.txt
# litellm/proxy/_experimental/out/logs/__next.!KGRhc2hib2FyZCk.logs.__PAGE__.txt
# litellm/proxy/_experimental/out/logs/__next.!KGRhc2hib2FyZCk.logs.txt
# litellm/proxy/_experimental/out/logs/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/logs/__next._full.txt
# litellm/proxy/_experimental/out/logs/__next._head.txt
# litellm/proxy/_experimental/out/logs/__next._index.txt
# litellm/proxy/_experimental/out/logs/__next._tree.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next._full.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next._head.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next._index.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next._tree.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.oauth.callback.__PAGE__.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.oauth.callback.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.oauth.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.txt
# litellm/proxy/_experimental/out/model-hub.txt
# litellm/proxy/_experimental/out/model-hub/__next.!KGRhc2hib2FyZCk.model-hub.__PAGE__.txt
# litellm/proxy/_experimental/out/model-hub/__next.!KGRhc2hib2FyZCk.model-hub.txt
# litellm/proxy/_experimental/out/model-hub/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/model-hub/__next._full.txt
# litellm/proxy/_experimental/out/model-hub/__next._head.txt
# litellm/proxy/_experimental/out/model-hub/__next._index.txt
# litellm/proxy/_experimental/out/model-hub/__next._tree.txt
# litellm/proxy/_experimental/out/model_hub.txt
# litellm/proxy/_experimental/out/model_hub/__next._full.txt
# litellm/proxy/_experimental/out/model_hub/__next._head.txt
# litellm/proxy/_experimental/out/model_hub/__next._index.txt
# litellm/proxy/_experimental/out/model_hub/__next._tree.txt
# litellm/proxy/_experimental/out/model_hub/__next.model_hub.__PAGE__.txt
# litellm/proxy/_experimental/out/model_hub/__next.model_hub.txt
# litellm/proxy/_experimental/out/model_hub_table.txt
# litellm/proxy/_experimental/out/model_hub_table/__next._full.txt
# litellm/proxy/_experimental/out/model_hub_table/__next._head.txt
# litellm/proxy/_experimental/out/model_hub_table/__next._index.txt
# litellm/proxy/_experimental/out/model_hub_table/__next._tree.txt
# litellm/proxy/_experimental/out/model_hub_table/__next.model_hub_table.__PAGE__.txt
# litellm/proxy/_experimental/out/model_hub_table/__next.model_hub_table.txt
# litellm/proxy/_experimental/out/models-and-endpoints.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next.!KGRhc2hib2FyZCk.models-and-endpoints.__PAGE__.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next.!KGRhc2hib2FyZCk.models-and-endpoints.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next._full.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next._head.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next._index.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next._tree.txt
# litellm/proxy/_experimental/out/onboarding.txt
# litellm/proxy/_experimental/out/onboarding/__next._full.txt
# litellm/proxy/_experimental/out/onboarding/__next._head.txt
# litellm/proxy/_experimental/out/onboarding/__next._index.txt
# litellm/proxy/_experimental/out/onboarding/__next._tree.txt
# litellm/proxy/_experimental/out/onboarding/__next.onboarding.__PAGE__.txt
# litellm/proxy/_experimental/out/onboarding/__next.onboarding.txt
# litellm/proxy/_experimental/out/organizations.txt
# litellm/proxy/_experimental/out/organizations/__next.!KGRhc2hib2FyZCk.organizations.__PAGE__.txt
# litellm/proxy/_experimental/out/organizations/__next.!KGRhc2hib2FyZCk.organizations.txt
# litellm/proxy/_experimental/out/organizations/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/organizations/__next._full.txt
# litellm/proxy/_experimental/out/organizations/__next._head.txt
# litellm/proxy/_experimental/out/organizations/__next._index.txt
# litellm/proxy/_experimental/out/organizations/__next._tree.txt
# litellm/proxy/_experimental/out/playground.txt
# litellm/proxy/_experimental/out/playground/__next.!KGRhc2hib2FyZCk.playground.__PAGE__.txt
# litellm/proxy/_experimental/out/playground/__next.!KGRhc2hib2FyZCk.playground.txt
# litellm/proxy/_experimental/out/playground/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/playground/__next._full.txt
# litellm/proxy/_experimental/out/playground/__next._head.txt
# litellm/proxy/_experimental/out/playground/__next._index.txt
# litellm/proxy/_experimental/out/playground/__next._tree.txt
# litellm/proxy/_experimental/out/policies.txt
# litellm/proxy/_experimental/out/policies/__next.!KGRhc2hib2FyZCk.policies.__PAGE__.txt
# litellm/proxy/_experimental/out/policies/__next.!KGRhc2hib2FyZCk.policies.txt
# litellm/proxy/_experimental/out/policies/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/policies/__next._full.txt
# litellm/proxy/_experimental/out/policies/__next._head.txt
# litellm/proxy/_experimental/out/policies/__next._index.txt
# litellm/proxy/_experimental/out/policies/__next._tree.txt
# litellm/proxy/_experimental/out/settings/admin-settings.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next.!KGRhc2hib2FyZCk.settings.admin-settings.__PAGE__.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next.!KGRhc2hib2FyZCk.settings.admin-settings.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next.!KGRhc2hib2FyZCk.settings.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next._full.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next._head.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next._index.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next._tree.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next.!KGRhc2hib2FyZCk.settings.logging-and-alerts.__PAGE__.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next.!KGRhc2hib2FyZCk.settings.logging-and-alerts.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next.!KGRhc2hib2FyZCk.settings.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next._full.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next._head.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next._index.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next._tree.txt
# litellm/proxy/_experimental/out/settings/router-settings.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next.!KGRhc2hib2FyZCk.settings.router-settings.__PAGE__.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next.!KGRhc2hib2FyZCk.settings.router-settings.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next.!KGRhc2hib2FyZCk.settings.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next._full.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next._head.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next._index.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next._tree.txt
# litellm/proxy/_experimental/out/settings/ui-theme.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next.!KGRhc2hib2FyZCk.settings.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next.!KGRhc2hib2FyZCk.settings.ui-theme.__PAGE__.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next.!KGRhc2hib2FyZCk.settings.ui-theme.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next._full.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next._head.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next._index.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next._tree.txt
# litellm/proxy/_experimental/out/teams.txt
# litellm/proxy/_experimental/out/teams/__next.!KGRhc2hib2FyZCk.teams.__PAGE__.txt
# litellm/proxy/_experimental/out/teams/__next.!KGRhc2hib2FyZCk.teams.txt
# litellm/proxy/_experimental/out/teams/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/teams/__next._full.txt
# litellm/proxy/_experimental/out/teams/__next._head.txt
# litellm/proxy/_experimental/out/teams/__next._index.txt
# litellm/proxy/_experimental/out/teams/__next._tree.txt
# litellm/proxy/_experimental/out/test-key.txt
# litellm/proxy/_experimental/out/test-key/__next.!KGRhc2hib2FyZCk.test-key.__PAGE__.txt
# litellm/proxy/_experimental/out/test-key/__next.!KGRhc2hib2FyZCk.test-key.txt
# litellm/proxy/_experimental/out/test-key/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/test-key/__next._full.txt
# litellm/proxy/_experimental/out/test-key/__next._head.txt
# litellm/proxy/_experimental/out/test-key/__next._index.txt
# litellm/proxy/_experimental/out/test-key/__next._tree.txt
# litellm/proxy/_experimental/out/tools/mcp-servers.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next.!KGRhc2hib2FyZCk.tools.mcp-servers.__PAGE__.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next.!KGRhc2hib2FyZCk.tools.mcp-servers.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next.!KGRhc2hib2FyZCk.tools.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next._full.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next._head.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next._index.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next._tree.txt
# litellm/proxy/_experimental/out/tools/vector-stores.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next.!KGRhc2hib2FyZCk.tools.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next.!KGRhc2hib2FyZCk.tools.vector-stores.__PAGE__.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next.!KGRhc2hib2FyZCk.tools.vector-stores.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next._full.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next._head.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next._index.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next._tree.txt
# litellm/proxy/_experimental/out/usage.txt
# litellm/proxy/_experimental/out/usage/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/usage/__next.!KGRhc2hib2FyZCk.usage.__PAGE__.txt
# litellm/proxy/_experimental/out/usage/__next.!KGRhc2hib2FyZCk.usage.txt
# litellm/proxy/_experimental/out/usage/__next._full.txt
# litellm/proxy/_experimental/out/usage/__next._head.txt
# litellm/proxy/_experimental/out/usage/__next._index.txt
# litellm/proxy/_experimental/out/usage/__next._tree.txt
# litellm/proxy/_experimental/out/users.txt
# litellm/proxy/_experimental/out/users/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/users/__next.!KGRhc2hib2FyZCk.users.__PAGE__.txt
# litellm/proxy/_experimental/out/users/__next.!KGRhc2hib2FyZCk.users.txt
# litellm/proxy/_experimental/out/users/__next._full.txt
# litellm/proxy/_experimental/out/users/__next._head.txt
# litellm/proxy/_experimental/out/users/__next._index.txt
# litellm/proxy/_experimental/out/users/__next._tree.txt
# litellm/proxy/_experimental/out/virtual-keys.txt
# litellm/proxy/_experimental/out/virtual-keys/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/virtual-keys/__next.!KGRhc2hib2FyZCk.virtual-keys.__PAGE__.txt
# litellm/proxy/_experimental/out/virtual-keys/__next.!KGRhc2hib2FyZCk.virtual-keys.txt
# litellm/proxy/_experimental/out/virtual-keys/__next._full.txt
# litellm/proxy/_experimental/out/virtual-keys/__next._head.txt
# litellm/proxy/_experimental/out/virtual-keys/__next._index.txt
# litellm/proxy/_experimental/out/virtual-keys/__next._tree.txt
2026-03-30 06:31:49 -05:00
Hunter Wittenborn
243d4f8c46
feat: add re-authorize flow, fix inline credential submission, update docs
...
Add "Re-authorize" button (key icon) on LLM Credentials page for
device-code providers (GitHub Copilot, ChatGPT) so expired tokens can be
refreshed without deleting and recreating the credential.
Fix inline credential submission on Add Model page by adding a hidden
Form.Item for api_key — Ant Design requires a rendered form item to
include values in submission. Also reset device code state on any
provider change, not just when leaving device-code mode.
Update ChatGPT docs with full proxy credential flow (UI + API curl
steps), SDK setup command, and litellm_credential_name in config
examples. Add re-authorization note to both provider docs.
Fix button spacing in credentials table with flex gap.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 06:24:50 -05:00
Hunter Wittenborn
fc0bf4bd30
fix: clean up OAuth device code flow for reviewer clarity
...
Remove double Depends(user_api_key_auth) that ran auth twice per SSO
request, raise AuthenticationError instead of silently swallowing ChatGPT
token exchange failures, parallelize N+1 GitHub API calls in GET
/credentials with asyncio.gather, replace importlib dynamic dispatch with
direct imports, eliminate redundant static header generation, move inline
imports to module level, and remove unused parameters/exports.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 05:31:16 -05:00
Hunter Wittenborn
de31fc4471
refactor: DRY up device code OAuth flow, fix quality/efficiency issues
...
- Extract shared useDeviceCodeFlow hook (eliminates ~200 lines of duplicated
polling logic between AddModelForm and AddCredentialModal)
- Extract authenticatedPost helper in networking.tsx (4 OAuth functions → 4 one-liners)
- Replace inline SVG with GithubOutlined icon (CLAUDE.md violation)
- Remove unused refetchCredentials prop from AddModelForm
- Fix sync HTTP blocking in async get_credentials endpoint (N+1 GitHub API calls)
- Use cached _get_httpx_client() in ChatGPT credential-mode refresh
- Remove _get_github_headers backward-compat alias (only used internally)
- Fix redundant except (ImportError, Exception) in proxy_cli.py
- Unify static-header blocks in main.py with dispatch table
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 05:19:56 -05:00
Hunter Wittenborn
b7432a4c44
feat: add ChatGPT device code OAuth + fix token exchange across all endpoints
...
Add ChatGPT credential-based auth (device code OAuth flow) matching the
GitHub Copilot pattern. The refresh token is stored as the credential's
api_key and exchanged for an access token (JWT) at request time via
OpenAI's OAuth endpoint — same flow as openai/codex.
Key changes:
- ChatGPT SSO endpoints (/credentials/chatgpt/initiate and /status)
- ChatGPT authenticator credential mode with module-level token cache
- Token exchange in responses validate_environment (single auth point
for all endpoints: /responses, /chat/completions, /v1/messages, Gemini)
- Raw httpx.Client for OAuth calls to avoid litellm wrapper interference
- Generic device code UI dispatch for both GitHub Copilot and ChatGPT
- Simplified main.py header blocks to static headers only (no auth)
- GitHub Copilot chat validate_environment uses api_key directly
Tested: all 8 endpoint/streaming combinations work (responses, chat,
Anthropic, Gemini × streaming/non-streaming).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 05:02:35 -05:00
Hunter Wittenborn
3cd86f3982
feat(github_copilot): replace file-based auth with session key credentials
...
Move GitHub Copilot authentication from a file-based device-code flow
(which printed credentials to stdio on startup) to a named credential /
session key model suitable for the proxy.
Key changes:
- Authenticator accepts optional access_token for credential mode with
a module-level cache to share copilot inference tokens across requests
- Add stateless OAuth device code SSO endpoints (initiate + status)
- Early credential resolution in the router before client selection
- Always send static Copilot headers (editor-version, user-agent, etc.)
even before API key exchange, fixing "missing Editor-Version" errors
- Fix UI polling to ratchet up the interval on GitHub slow_down instead
of resetting to 5s on the next pending response
- Narrow bare except to (GetAPIKeyError, GetAccessTokenError) in main.py
- Remove dead config.authenticator mocks from tests
- Update docs with credential-based proxy auth flow
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 01:05:49 -05:00
Krrish Dholakia
58120537af
Merge pull request #24756 from BerriAI/litellm_/pensive-sinoussi
...
[Fix] Remove NLP_CLOUD_API_KEY requirement from test_exceptions
2026-03-28 22:04:49 -07:00
Krrish Dholakia
a671083596
Merge pull request #24755 from BerriAI/litellm_test_cleanup
...
Litellm test cleanup
2026-03-28 22:04:26 -07:00
Krrish Dholakia
85cc7bc433
refactor: make unit test
2026-03-28 21:44:46 -07:00
Krrish Dholakia
1ba109079d
test: update tests
2026-03-28 21:22:04 -07:00
Krrish Dholakia
9e070143fb
test: update key names
2026-03-28 21:13:16 -07:00
Krrish Dholakia
25f2baad71
test: cleanup dead tests
2026-03-28 20:49:02 -07:00
Yuneng Jiang
14095ee144
[Fix] Remove NLP_CLOUD_API_KEY requirement from test_exceptions.py
...
The test only needs a bad key to verify AuthenticationError handling.
No other tests use this env var, and it's not provisioned in CI.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 20:38:54 -07:00
Krrish Dholakia
a92b31a636
test: remove dead tests
2026-03-28 20:36:08 -07:00
Krrish Dholakia
fe379fd738
test: rename env var
2026-03-28 20:27:39 -07:00
Krrish Dholakia
0fef88d67c
test: remove dead tests
2026-03-28 20:23:44 -07:00
yuneng-jiang
c27114470e
Merge pull request #24754 from BerriAI/litellm_gha_p3b
...
[Infra] Remove CircleCI jobs now covered by GitHub Actions
2026-03-28 20:23:27 -07:00
Krrish Dholakia
1fb677702d
test: update to new vertex ai keys
2026-03-28 20:19:05 -07:00
Krrish Dholakia
92db2df2f6
Merge pull request #23794 from ndgigliotti/feat/bedrock-structured-output-cost-json
...
Bedrock: move native structured output model list to cost JSON, add Sonnet 4.6
2026-03-28 20:04:47 -07:00
Krrish Dholakia
ce26dd4101
test: update tests
2026-03-28 19:42:14 -07:00
Krrish Dholakia
cdcab8a243
refactor: cleanup deprecated models
2026-03-28 19:39:11 -07:00
Krrish Dholakia
bc829d51f2
test: test
2026-03-28 19:17:38 -07:00
Yuneng Jiang
7aec9101f5
[Infra] Remove CircleCI jobs now covered by GitHub Actions
...
Removes 10 CircleCI jobs that are fully duplicated by GHA workflows:
- caching_unit_tests → test-unit-caching-redis.yml
- litellm_security_tests → test-unit-security.yml
- litellm_proxy_unit_testing_{key_generation,part1,part2} → test-unit-proxy-db.yml + test-unit-proxy-legacy.yml
- litellm_mapped_tests_{llms,core,litellm_core_utils,mcps,integrations} → test-unit-*.yml workflows
Also cleans up upload-coverage requires and workflow entries.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 19:06:48 -07:00
Krrish Dholakia
a41ba7bb6a
test: update test
2026-03-28 19:01:55 -07:00
Krrish Dholakia
bee1607248
test: update test apis
2026-03-28 18:57:27 -07:00
Krrish Dholakia
564ad3195b
test: update testing
2026-03-28 18:42:55 -07:00
Krrish Dholakia
5cd8ca2365
refactor: refactor testing
2026-03-28 18:39:32 -07:00
Krrish Dholakia
6df995d0d1
refactor: dead test cleanup
2026-03-28 18:27:25 -07:00
Krrish Dholakia
44b03e6138
fix: fix azure tests
2026-03-28 18:19:41 -07:00
Krrish Dholakia
c75fb3650a
fix: fix azure audio test
2026-03-28 18:14:01 -07:00
Krrish Dholakia
b63b43fe09
docs: add faq to docs
2026-03-28 18:14:01 -07:00
Krrish Dholakia
bc33cf662f
Merge pull request #24449 from J-Byron/feat/prometheus-org-budget-metrics
...
Feat/prometheus org budget metrics
2026-03-28 17:32:17 -07:00
yuneng-jiang
40d4e79a00
Merge pull request #24742 from BerriAI/litellm_gha_p3
...
[Infra] Add unit test workflows for Postgres, Redis, and security suites
2026-03-28 14:54:20 -07:00
Yuneng Jiang
3b5b98327e
[Fix] Use integration-redis-postgres env for Redis workflows since Postgres always starts
...
GHA doesn't support conditional service containers, so the Postgres container
always starts even for Redis-only jobs. Use integration-redis-postgres
environment for any workflow with enable-redis so the Postgres container gets
valid credentials.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:25:29 -07:00
Yuneng Jiang
3ae80407dd
[Fix] Move Postgres username and password to environment secrets
...
Move POSTGRES_USER and POSTGRES_PASSWORD from hardcoded values to
environment secrets so no credentials appear in workflow files at all.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:31:58 -07:00
Yuneng Jiang
d42e2f6429
[Fix] Move Postgres DATABASE_URL to environment secret to avoid credential leak warnings
...
The hardcoded postgresql://postgres:postgres@localhost connection string was
being flagged by secret scanners. Move DATABASE_URL to a GHA environment
secret (integration-postgres) so the password is never in the workflow file.
Changes:
- _test-unit-services-base.yml: DATABASE_URL now comes from secrets, environment
is derived from enable-* flags (integration-postgres, integration-redis, or
integration-redis-postgres)
- test-unit-proxy-db.yml: switched to push-only trigger (uses secrets now)
- test-unit-security.yml: switched to push-only trigger (uses secrets now)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:28:41 -07:00
Yuneng Jiang
6549f3eb1a
[Infra] Add unit test workflows for Postgres, Redis, and security test suites
...
Add three new GHA workflows for tests requiring service containers, plus a
reusable base workflow that provides Postgres and cloud Redis support.
New workflows:
- test-unit-proxy-db.yml: proxy DB tests (key generation, auth checks,
remaining) using a local Postgres container with a 3-way descriptive matrix
- test-unit-caching-redis.yml: caching tests that need Redis but no provider
API keys, using cloud Redis via the integration-redis environment
- test-unit-security.yml: proxy security tests using a local Postgres container
Reusable base (_test-unit-services-base.yml):
- Local Postgres pinned by digest (postgres@sha256:705a5d5b...)
- Cloud Redis credentials scoped to the integration-redis GHA environment
- Environment binding is derived from enable-redis flag inside the base
(not caller-controllable) to prevent secret scope bypass
- Supports workers=0 for tests that cannot run in parallel
Security hardening:
- All actions pinned to commit SHAs
- persist-credentials: false on all checkouts
- permissions: contents: read only
- Postgres-only workflows (proxy-db, security) use zero secrets and trigger on
both pull_request and push to main/litellm_*
- Redis workflow triggers on push only (not pull_request) to prevent external
PRs from accessing Redis Cloud credentials
- Added ${TEST_PATH:?} guard to both _test-unit-base.yml and
_test-unit-services-base.yml to fail fast on empty test paths
- All files pass zizmor --pedantic with zero findings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 12:06:45 -07:00
yuneng-jiang
666a31d47a
Merge pull request #24741 from BerriAI/litellm_gha_p2
...
[Fix] Test Isolation and Path Resolution for GHA Unit Tests
2026-03-28 11:32:48 -07:00
Yuneng Jiang
7851567091
[Fix] Scope documentation workflow to match CircleCI and add missing router settings
...
Revert path fixes for documentation tests that CircleCI never ran
(test_exception_types, test_general_setting_keys, test_readme_providers,
test_standard_logging_payload). Update the GHA workflow to run only the
4 tests CircleCI actually executed: test_env_keys, test_router_settings,
test_api_docs, test_circular_imports.
Add 2 missing router_settings keys (enable_health_check_routing,
health_check_staleness_threshold) and 27 missing general_settings keys
to config_settings.md so test_router_settings passes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 11:23:53 -07:00
Yuneng Jiang
7100ed5d0a
[Fix] Test isolation for agent health checks and documentation test path resolution
...
Fix agent health check tests failing with 500 errors in parallel CI by
mocking prisma_client to None. Fix documentation validation tests using
CWD-relative paths that break depending on the working directory.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 11:00:22 -07:00
yuneng-jiang
428d837704
Merge pull request #24740 from BerriAI/litellm_unit_test_workflow_isolation
...
[Infra] Isolate unit test workflows with hardened security posture
2026-03-28 10:30:13 -07:00
Yuneng Jiang
c717189ed2
[Infra] Remove workflows that require API keys or external services
...
These test suites are not pure unit tests and don't belong in Phase 1:
- litellm_utils_tests: health check tests need OPENAI_API_KEY
- pass_through_unit_tests: tests hit real Anthropic API
- router_unit_tests: tests call real OpenAI moderation endpoints
- proxy_security_tests: requires DATABASE_URL (Postgres)
- documentation_tests: requires docs directory at specific relative path
These will be re-added in later phases with proper secret scoping.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 10:16:19 -07:00
Yuneng Jiang
a34ed20901
[Infra] Fix job naming in reusable workflow callers
...
Rename job keys from generic 'test' to descriptive names (e.g.,
'core-utils', 'proxy-auth', 'router') so GitHub checks display as
'core-utils / run' instead of 'test / test'.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 10:07:32 -07:00
Yuneng Jiang
3d527b722d
[Infra] Add isolated unit test workflows with hardened security posture
...
Replace monolithic matrix workflow with individual, descriptively-named
workflow files. Each workflow uses a shared reusable base and follows
least-privilege security: zero secrets, read-only permissions, SHA-pinned
actions, persist-credentials: false, and env-var indirection to prevent
template injection.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 09:56:58 -07:00
ryan-crabbe-berri
2eb3c20e76
Merge pull request #24718 from BerriAI/litellm_ryan-march-26
...
litellm ryan march 26
2026-03-28 09:01:11 -07:00
ryan-crabbe-berri
726a34627c
Merge pull request #24717 from BerriAI/litellm_fix-user-cache-invalidation
...
fix(jwt): invalidate user cache after role/team sync updates
2026-03-27 19:50:41 -07:00
ryan-crabbe-berri
7907e5e126
Merge pull request #24711 from BerriAI/litellm_fix-edit-budget
...
fix(ui): refactor budget page to React Query hooks and fix crashes
2026-03-27 19:49:30 -07:00