{"record":{"id":"2148bb6b0e820cdf","repo":"HKUDS/DeepTutor","slug":"t-api-partner-not-running","errorCode":null,"errorMessage":"t(\"api.partner_not_running\")","messagePattern":"t\\(\"api\\.partner_not_running\"\\)","errorType":"http","errorClass":"HTTPException","httpStatus":404,"severity":"error","filePath":"deeptutor/api/routers/partners.py","lineNumber":820,"sourceCode":"    if not stopped:\n        raise HTTPException(status_code=404, detail=t(\"api.partner_not_found_or_not_running\"))\n    return {\"partner_id\": partner_id, \"stopped\": True}\n\n\n@router.delete(\"/{partner_id}\", dependencies=_MANAGEABLE)\nasync def destroy_partner(partner_id: str):\n    destroyed = await get_partner_manager().destroy_partner(partner_id)\n    if not destroyed:\n        raise HTTPException(status_code=404, detail=t(\"api.partner_not_found\"))\n    return {\"partner_id\": partner_id, \"destroyed\": True}\n\n\n@router.post(\"/{partner_id}/channels/reload\", dependencies=_MANAGEABLE)\nasync def reload_partner_channels(partner_id: str):\n    mgr = get_partner_manager()\n    instance = mgr.get_partner(partner_id)\n    if not instance or not instance.running:\n        raise HTTPException(status_code=404, detail=t(\"api.partner_not_running\"))\n    try:\n        await mgr.reload_channels(partner_id)\n    except Exception as exc:\n        raise HTTPException(\n            status_code=500,\n            detail=f\"Failed to reload channels: {type(exc).__name__}\",\n        ) from None\n    return {\"partner_id\": partner_id, \"reloaded\": True}\n\n\ndef _onboarding_manager_and_partner(partner_id: str):\n    mgr = get_partner_manager()\n    if not mgr.partner_exists(partner_id):\n        raise HTTPException(status_code=404, detail=t(\"api.partner_not_found\"))\n    return get_channel_onboarding_manager(), mgr\n\n\n@router.post(\"/{partner_id}/channel-onboarding/start\", dependencies=_MANAGEABLE)","sourceCodeStart":802,"sourceCodeEnd":838,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/api/routers/partners.py#L802-L838","documentation":"404 raised by POST /api/partners/{partner_id}/channels/reload when mgr.get_partner(partner_id) returns None or the returned instance has running == False. Channel reload only works on a live partner process, so a stopped/destroyed partner is rejected before any reload attempt.","triggerScenarios":"Calling /partners/{id}/channels/reload when the partner exists but is stopped, or when the id is unknown (get_partner returns None).","commonSituations":"Editing channel config (e.g. Matrix room list) and reloading without restarting the partner first; partner crashed between the listing call and the reload call.","solutions":["Start the partner (POST /partners/{id}/start) before reloading channels","Confirm the partner shows running=True via GET /partners, then reload","Verify partner_id matches an entry in the manager registry"],"exampleFix":"// before\nawait client.post(f\"/partners/{pid}/channels/reload\")\n// after\nstate = (await client.get(f\"/partners\")).json()\nif get(pid, state)[\"running\"]:\n    await client.post(f\"/partners/{pid}/channels/reload\")\nelse:\n    await client.post(f\"/partners/{pid}/start\")","handlingStrategy":"validation","validationCode":"partners = {p[\"partner_id\"]: p for p in (await client.get(\"/api/v1/partners\")).json()}\np = partners.get(partner_id)\nif p is None or not p.get(\"running\"):\n    await client.post(f\"/api/v1/partners/{partner_id}/start\")\nawait client.post(f\"/api/v1/partners/{partner_id}/channels/reload\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always start the partner before reloading channels","Re-check running state after partner crashes before channel ops"],"tags":["http-404","partners","channels","fastapi"],"backgroundTag":"service-not-running","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}