BerriAI/litellm · error · ProxyException

callback_name = {data.callback_name} already exists in team_

Error message

callback_name = {data.callback_name} already exists in team_callback_settings, for team_id = {team_id} and event = {data.callback_type}

What it means

Before appending, the endpoint scans the team's metadata['logging'] list and finds a callback with the same callback_name and event type already registered for this team; adding a duplicate is refused with 400, directing callers to update instead.

Source

Thrown at litellm/proxy/management_endpoints/team_callback_endpoints.py:309

        # config (and read back the credentials they wrote).
        await _verify_team_access(
            team_obj=LiteLLM_TeamTable(**_existing_team.model_dump()),
            user_api_key_dict=user_api_key_dict,
        )

        # store team callback settings in metadata
        team_metadata = _existing_team.metadata
        team_callback_settings: list[dict] = team_metadata.get("logging")  # will be dict of type AddTeamCallback
        if team_callback_settings is None or not isinstance(team_callback_settings, list):
            team_callback_settings = []

        ## check if it already exists, for the same callback event
        for callback in team_callback_settings:
            if (
                callback.get("callback_name") == data.callback_name
                and callback.get("callback_type") == data.callback_type
            ):
                raise ProxyException(
                    message=f"callback_name = {data.callback_name} already exists in team_callback_settings, for team_id = {team_id} and event = {data.callback_type}",
                    code=status.HTTP_400_BAD_REQUEST,
                    type=ProxyErrorTypes.bad_request_error,
                    param="callback_name",
                )

        before_metadata: Final = copy.deepcopy(team_metadata)
        team_callback_settings.append(data.model_dump())

        team_metadata["logging"] = team_callback_settings
        team_metadata = encrypt_callback_vars(team_metadata)
        team_metadata_json: Final = json.dumps(team_metadata)  # update team_metadata

        new_team_row: Final = await TeamRepository(prisma_client).table.update(
            where={"team_id": team_id},
            data={"metadata": team_metadata_json},
            # `object_permission` is included so `_refresh_cached_team` doesn't
            # write a cached team with the relation nulled out — see

View on GitHub (pinned to 77b7c6c40c)

Solutions

  1. Use a different callback_name, or update the existing callback for that team and event.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at litellm/proxy/management_endpoints/team_callback_endpoints.py:309 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18). Data as JSON: /api/errors/feae8dba43381028. Report an issue: GitHub.