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 exc

View on GitHub (pinned to 3e82f13042)

Solutions

  1. List partners and use a valid id
  2. Recreate/restore the partner via deeptutor partner CLI or admin UI
  3. 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

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


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