{"record":{"id":"15426492171c7f8c","repo":"HKUDS/DeepTutor","slug":"failed-to-reload-channels-type-exc-name","errorCode":null,"errorMessage":"Failed to reload channels: {type(exc).__name__}","messagePattern":"Failed to reload channels: (.+?)","errorType":"http","errorClass":"HTTPException","httpStatus":500,"severity":"error","filePath":"deeptutor/api/routers/partners.py","lineNumber":824,"sourceCode":"\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)\nasync def start_partner_channel_onboarding(partner_id: str, payload: ChannelOnboardingStartRequest):\n    onboarding, _ = _onboarding_manager_and_partner(partner_id)\n    try:\n        return await onboarding.start(partner_id, payload.channel)","sourceCodeStart":806,"sourceCodeEnd":842,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/api/routers/partners.py#L806-L842","documentation":"500 raised by reload_partner_channels when mgr.reload_channels(partner_id) raises any unexpected exception. The detail deliberately leaks only the exception class name (e.g. 'ConnectionError'), and the full traceback goes to server logs via 'from None' suppression of the HTTP chain.","triggerScenarios":"Any unexpected failure inside PartnerManager.reload_channels: broken channel provider credentials, malformed channel config file, network failure reaching the channel backend (Matrix homeserver, Discord gateway, etc.).","commonSituations":"Homeserver unreachable during Matrix channel reload; invalid/rotted auth token in partner channel config; config file schema changed after an upgrade.","solutions":["Check server logs — the exception type in the detail plus the logged traceback pinpoints the failing channel backend","Validate the partner's channel configuration (credentials, endpoints) and fix the underlying provider issue","Retry the reload once the provider/network is healthy; restart the partner if its runtime state is corrupted"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"except HTTPStatusError as e:\n    if e.response.status_code == 500:\n        log(e.response.json()[\"detail\"])  # exception type name\n        backoff_and_retry(max_attempts=3)","preventionTips":["Keep channel provider credentials and endpoints validated before reload","Watch server logs for the traceback behind the 500 detail"],"tags":["http-500","partners","channels","provider-error"],"backgroundTag":"upstream-provider-failure","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}