Merge pull request #20682 from BerriAI/litellm_avail_teams

[Fix] UI - Teams: Available Teams
This commit is contained in:
yuneng-jiang 2026-02-07 17:58:25 -08:00 committed by GitHub
commit 5dd84df215
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 48 additions and 8 deletions

View file

@ -3095,12 +3095,7 @@ async def list_available_teams(
),
)
if available_teams is None:
raise HTTPException(
status_code=400,
detail={
"error": "No available teams for user to join. See how to set available teams here: https://docs.litellm.ai/docs/proxy/self_serve#all-settings-for-self-serve--sso-flow"
},
)
return []
# filter out teams that the user is already a member of
user_info = await prisma_client.db.litellm_usertable.find_unique(

View file

@ -38,6 +38,7 @@ from litellm.proxy.management_endpoints.team_endpoints import (
_transform_teams_to_deleted_records,
_validate_and_populate_member_user_info,
delete_team,
list_available_teams,
router,
team_member_add_duplication_check,
team_member_delete,
@ -5871,3 +5872,37 @@ async def test_validate_and_populate_member_user_info_only_user_id_not_found():
mock_prisma_client.db.litellm_usertable.find_unique.assert_called_once_with(
where={"user_id": "nonexistent-user"}
)
@pytest.mark.asyncio
async def test_list_available_teams_returns_empty_list_when_none_configured():
"""
Test that /team/available returns an empty list when no available teams
are configured, instead of raising an exception.
"""
import litellm
mock_request = MagicMock()
mock_user_key = UserAPIKeyAuth(user_id="test-user", token="fake-token")
with patch(
"litellm.proxy.proxy_server.prisma_client", mock_prisma_client
):
# Case 1: default_internal_user_params is None
original = litellm.default_internal_user_params
litellm.default_internal_user_params = None
result = await list_available_teams(
http_request=mock_request,
user_api_key_dict=mock_user_key,
)
assert result == []
# Case 2: default_internal_user_params exists but has no "available_teams" key
litellm.default_internal_user_params = {"some_other_param": "value"}
result = await list_available_teams(
http_request=mock_request,
user_api_key_dict=mock_user_key,
)
assert result == []
litellm.default_internal_user_params = original

View file

@ -58,7 +58,8 @@ describe("AvailableTeamsPanel", () => {
renderWithProviders(<AvailableTeamsPanel accessToken="token-123" userID="user-123" />);
await waitFor(() => {
expect(screen.getByText("No available teams to join")).toBeInTheDocument();
expect(screen.getByText(/No available teams to join/i)).toBeInTheDocument();
expect(screen.getByText(/See how to set available teams/i)).toBeInTheDocument();
});
});

View file

@ -113,7 +113,16 @@ const AvailableTeamsPanel: React.FC<AvailableTeamsProps> = ({ accessToken, userI
{availableTeams.length === 0 && (
<TableRow>
<TableCell colSpan={5} className="text-center">
<Text>No available teams to join</Text>
<Text>No available teams to join. See how to set available teams{" "}
<a
href="https://docs.litellm.ai/docs/proxy/self_serve#all-settings-for-self-serve--sso-flow"
target="_blank"
rel="noopener noreferrer"
className="text-blue-500 hover:text-blue-700 underline"
>
here
</a>.
</Text>
</TableCell>
</TableRow>
)}