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

  1. Start the partner (POST /partners/{id}/start) before reloading channels
  2. Confirm the partner shows running=True via GET /partners, then reload
  3. 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

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


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