HKUDS/DeepTutor · error · HTTPException
t("api.partner_not_running")
Error message
t("api.partner_not_running") What it means
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.
Source
Thrown at deeptutor/api/routers/partners.py:820
if not stopped:
raise HTTPException(status_code=404, detail=t("api.partner_not_found_or_not_running"))
return {"partner_id": partner_id, "stopped": True}
@router.delete("/{partner_id}", dependencies=_MANAGEABLE)
async def destroy_partner(partner_id: str):
destroyed = await get_partner_manager().destroy_partner(partner_id)
if not destroyed:
raise HTTPException(status_code=404, detail=t("api.partner_not_found"))
return {"partner_id": partner_id, "destroyed": True}
@router.post("/{partner_id}/channels/reload", dependencies=_MANAGEABLE)
async def reload_partner_channels(partner_id: str):
mgr = get_partner_manager()
instance = mgr.get_partner(partner_id)
if not instance or not instance.running:
raise HTTPException(status_code=404, detail=t("api.partner_not_running"))
try:
await mgr.reload_channels(partner_id)
except Exception as exc:
raise HTTPException(
status_code=500,
detail=f"Failed to reload channels: {type(exc).__name__}",
) from None
return {"partner_id": partner_id, "reloaded": True}
def _onboarding_manager_and_partner(partner_id: str):
mgr = get_partner_manager()
if not mgr.partner_exists(partner_id):
raise HTTPException(status_code=404, detail=t("api.partner_not_found"))
return get_channel_onboarding_manager(), mgr
@router.post("/{partner_id}/channel-onboarding/start", dependencies=_MANAGEABLE)View on GitHub (pinned to 3e82f13042)
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
Example fix
// before
await client.post(f"/partners/{pid}/channels/reload")
// after
state = (await client.get(f"/partners")).json()
if get(pid, state)["running"]:
await client.post(f"/partners/{pid}/channels/reload")
else:
await client.post(f"/partners/{pid}/start") Defensive patterns
Strategy: validation
Validate before calling
partners = {p["partner_id"]: p for p in (await client.get("/api/v1/partners")).json()}
p = partners.get(partner_id)
if p is None or not p.get("running"):
await client.post(f"/api/v1/partners/{partner_id}/start")
await client.post(f"/api/v1/partners/{partner_id}/channels/reload") Prevention
- Always start the partner before reloading channels
- Re-check running state after partner crashes before channel ops
When it happens
Trigger: Calling /partners/{id}/channels/reload when the partner exists but is stopped, or when the id is unknown (get_partner returns None).
Common situations: 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.
Related errors
- t("api.partner_not_found_or_not_running")
- Record not found
- Record or target notebook not found
- Failed to reload channels: {type(exc).__name__}
- str(exc)
AI-assisted analysis of HKUDS/DeepTutor@3e82f13042 (2026-08-27).
Data as JSON: /api/errors/2148bb6b0e820cdf.
Report an issue: GitHub.