{"record":{"id":"24e75bfd553c74ac","repo":"HKUDS/DeepTutor","slug":"no-partner-named-partner-id-r","errorCode":null,"errorMessage":"No partner named {partner_id!r}.","messagePattern":"No partner named (.+?)\\.","errorType":"http","errorClass":"HTTPException","httpStatus":400,"severity":"error","filePath":"deeptutor/api/routers/subagents.py","lineNumber":164,"sourceCode":"        raise HTTPException(status_code=400, detail=f\"Unknown agent kind: {agent_kind!r}\")\n\n    resolved_cwd = \"\"\n    partner_id = \"\"\n    if agent_kind == PARTNER_BACKEND_KIND:\n        partner_id = (payload.partner_id or \"\").strip()\n        if not partner_id:\n            raise HTTPException(\n                status_code=400, detail=\"A partner_id is required to connect a partner.\"\n            )\n        # Partners are admin-managed, but an admin can assign one to a user via\n        # the grant system. An admin may connect any partner; a non-admin only a\n        # partner assigned to them (403 otherwise). The partner still runs in its\n        # own isolated scope — connecting just lets the user consult it in chat.\n        assert_partner_allowed(partner_id)\n        from deeptutor.services.partners import get_partner_manager\n\n        if not get_partner_manager().partner_exists(partner_id):\n            raise HTTPException(status_code=400, detail=f\"No partner named {partner_id!r}.\")\n    else:\n        raw_cwd = (payload.cwd or \"\").strip()\n        if raw_cwd:\n            try:\n                resolved_cwd = str(assert_path_allowed(raw_cwd))\n            except ValueError as exc:\n                raise HTTPException(status_code=400, detail=str(exc)) from exc\n\n    try:\n        manager = current_kb_manager()\n        entry = manager.register_subagent_connection(\n            name, agent_kind, cwd=resolved_cwd, partner_id=partner_id\n        )\n    except ValueError as exc:\n        raise HTTPException(status_code=400, detail=str(exc)) from exc\n    except Exception as exc:  # pragma: no cover - defensive\n        logger.error(\"Error connecting subagent: %s\", exc)\n        raise HTTPException(status_code=500, detail=str(exc)) from exc","sourceCodeStart":146,"sourceCodeEnd":182,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/api/routers/subagents.py#L146-L182","documentation":"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).","triggerScenarios":"POST /connections with agent_kind=partner and a partner_id that was deleted, never created, or typo'd.","commonSituations":"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.","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"],"exampleFix":"// before\n{\"partner_id\": \"math-budy\"}\n// after\n{\"partner_id\": \"math-buddy\"}  // id from GET /partners","handlingStrategy":"validation","validationCode":"const partners = await listPartners();\nif (!partners.some(p => p.id === partnerId)) { refreshPartners(); return; }","typeGuard":"const partnerExists = (id: string, partners: {id:string}[]) => partners.some(p => p.id === id);","tryCatchPattern":"try { await connect(payload); } catch (e) { if (e.status === 400 && /No partner named/.test(e.detail)) await refreshPartners(); }","preventionTips":["Load the partner list right before connecting","Treat partner list as volatile; refresh on failure"],"tags":["http-400","partners","subagent","api"],"backgroundTag":"entity-not-found","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}