HKUDS/DeepTutor · error · HTTPException

Partner is not assigned to you

Error message

Partner is not assigned to you

What it means

HTTP 403 from assert_partner_allowed: the current user can neither manage the partner (can_manage_partner) nor is the partner id in their assigned_partner_ids. Guards every partner usage (execute, connect, consult).

Source

Thrown at deeptutor/multi_user/partner_access.py:91

    """Whether the user may talk to *partner_id* — manage it, or be assigned it."""
    actor = user or get_current_user()
    if can_manage_partner(partner_id, actor):
        return True
    return str(partner_id or "").strip() in assigned_partner_ids(actor.id)


def assert_partner_allowed(partner_id: str, user_id: str | None = None) -> None:
    """Raise 403 unless the current user may talk to *partner_id*.

    A no-op for admins, for the partner's owner, and for single-user
    deployments (where the current user resolves to the local admin).
    """
    user = get_current_user()
    if can_manage_partner(partner_id, user):
        return
    if str(partner_id or "").strip() in assigned_partner_ids(user_id or user.id):
        return
    raise HTTPException(status_code=403, detail="Partner is not assigned to you")


def assert_partner_manageable(partner_id: str) -> None:
    """Raise 403 unless the current user may configure *partner_id*.

    Deliberately the same 403 an unassigned partner gets: someone who may only
    talk to a partner learns nothing new about who owns it.
    """
    if not can_manage_partner(partner_id):
        raise HTTPException(status_code=403, detail="You cannot manage this partner")


# Identity-only card fields a consumer needs (partner list page, connect modal).
# Deliberately excludes channels / llm_selection / tool config so a user who was
# merely *assigned* a partner sees its face, never its wiring.
_CARD_FIELDS = (
    "partner_id",
    "name",

View on GitHub (pinned to 3e82f13042)

Solutions

  1. Verify the partner id appears in the user's assigned partner list before use
  2. Request assignment from the partner owner/admin
  3. Refresh partner list after grant changes to drop stale ids

Example fix

// before
assert_partner_allowed("partner-123")  # 403

// after
from deeptutor.multi_user.partner_access import assigned_partner_ids
pid = "partner-123"
assert pid in assigned_partner_ids(user.id) or can_manage_partner(pid, user), "not yours"
assert_partner_allowed(pid)
Defensive patterns

Strategy: validation

Validate before calling

from deeptutor.multi_user.partner_access import can_manage_partner, assigned_partner_ids
if not (can_manage_partner(pid, get_current_user()) or pid in assigned_partner_ids(user.id)):
    raise PartnerNotAvailable(pid)

Type guard

def partner_usable(pid: str, user) -> bool:
    return can_manage_partner(pid, user) or pid in assigned_partner_ids(user.id)

Try / catch

try:
    assert_partner_allowed(pid)
except HTTPException as e:
    if e.status_code == 403:
        refresh_partner_list()  # grants may have changed; resync

Prevention

When it happens

Trigger: Calling a partner endpoint with a partner_id owned by someone else without an assignment; using a revoked partner after grants changed; wrong partner id copied from another workspace.

Common situations: Partner sharing across team members; stale frontend state after an admin revoked assignment; integration tests hitting unassigned partners.

Related errors


AI-assisted analysis of HKUDS/DeepTutor@3e82f13042 (2026-08-27). Data as JSON: /api/errors/ad491cc1940a66c4. Report an issue: GitHub.