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
- Verify the partner id appears in the user's assigned partner list before use
- Request assignment from the partner owner/admin
- 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
- Render partner menus from the user's assigned partner list
- Refresh partner lists after grant/assignment changes
- Never hardcode partner ids across user contexts
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
- You cannot manage this partner
- This model is not assigned to your account.
- Access denied
- Knowledge base '{name}' not found
AI-assisted analysis of HKUDS/DeepTutor@3e82f13042 (2026-08-27).
Data as JSON: /api/errors/ad491cc1940a66c4.
Report an issue: GitHub.