HKUDS/DeepTutor · error · HTTPException
No partner named {partner_id!r}.
Error message
No partner named {partner_id!r}. What it means
The partner_id supplied to create_connection does not correspond to any partner known to the partner manager (get_partner_manager().partner_exists() returned False).
Source
Thrown at deeptutor/api/routers/subagents.py:164
raise HTTPException(status_code=400, detail=f"Unknown agent kind: {agent_kind!r}")
resolved_cwd = ""
partner_id = ""
if agent_kind == PARTNER_BACKEND_KIND:
partner_id = (payload.partner_id or "").strip()
if not partner_id:
raise HTTPException(
status_code=400, detail="A partner_id is required to connect a partner."
)
# Partners are admin-managed, but an admin can assign one to a user via
# the grant system. An admin may connect any partner; a non-admin only a
# partner assigned to them (403 otherwise). The partner still runs in its
# own isolated scope — connecting just lets the user consult it in chat.
assert_partner_allowed(partner_id)
from deeptutor.services.partners import get_partner_manager
if not get_partner_manager().partner_exists(partner_id):
raise HTTPException(status_code=400, detail=f"No partner named {partner_id!r}.")
else:
raw_cwd = (payload.cwd or "").strip()
if raw_cwd:
try:
resolved_cwd = str(assert_path_allowed(raw_cwd))
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
try:
manager = current_kb_manager()
entry = manager.register_subagent_connection(
name, agent_kind, cwd=resolved_cwd, partner_id=partner_id
)
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
except Exception as exc: # pragma: no cover - defensive
logger.error("Error connecting subagent: %s", exc)
raise HTTPException(status_code=500, detail=str(exc)) from excView on GitHub (pinned to 3e82f13042)
Solutions
- List partners and use a valid id
- Recreate/restore the partner via deeptutor partner CLI or admin UI
- Confirm you're pointing at the same environment/server that hosts the partner
Example fix
// before
{"partner_id": "math-budy"}
// after
{"partner_id": "math-buddy"} // id from GET /partners Defensive patterns
Strategy: validation
Validate before calling
const partners = await listPartners();
if (!partners.some(p => p.id === partnerId)) { refreshPartners(); return; } Type guard
const partnerExists = (id: string, partners: {id:string}[]) => partners.some(p => p.id === id); Try / catch
try { await connect(payload); } catch (e) { if (e.status === 400 && /No partner named/.test(e.detail)) await refreshPartners(); } Prevention
- Load the partner list right before connecting
- Treat partner list as volatile; refresh on failure
When it happens
Trigger: POST /connections with agent_kind=partner and a partner_id that was deleted, never created, or typo'd.
Common situations: Partner removed by an admin after the client loaded the list; environment mismatch (dev client hitting prod partner registry); copy/paste error in the id.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- A partner_id is required to connect a partner.
- Unknown agent kind: {kind!r}
- Both name and agent_kind are required.
- Unknown agent kind: {agent_kind!r}
- {exc}
AI-assisted analysis of HKUDS/DeepTutor@3e82f13042 (2026-08-27).
Data as JSON: /api/errors/24e75bfd553c74ac.
Report an issue: GitHub.