{"record":{"id":"48703e1b337f0bdd","repo":"bytedance/deer-flow","slug":"could-not-find-source-run-for-assistant-message","errorCode":null,"errorMessage":"Could not find source run for assistant message","messagePattern":"Could not find source run for assistant message","errorType":"http","errorClass":"HTTPException","httpStatus":409,"severity":"error","filePath":"backend/app/gateway/routers/thread_runs.py","lineNumber":515,"sourceCode":"        return source_run_id\n\n    run_mgr = get_run_manager(request)\n    user_id = await get_current_user(request)\n    records = await run_mgr.list_by_thread(thread_id, user_id=user_id, limit=10)\n    fallback_record = next(\n        (record for record in records if record.status == RunStatus.success and _run_last_ai_matches_message(record, target_message)),\n        None,\n    )\n    if fallback_record is not None:\n        return fallback_record.run_id\n    if len(rows) >= REGENERATE_HISTORY_SCAN_LIMIT:\n        logger.warning(\n            \"Could not find source run for regenerate message %s in recent run events for thread %s (limit=%s)\",\n            message_id,\n            thread_id,\n            REGENERATE_HISTORY_SCAN_LIMIT,\n        )\n    raise HTTPException(status_code=409, detail=\"Could not find source run for assistant message\")\n\n\nasync def _find_base_checkpoint_before_human(\n    thread_id: str,\n    human_message_id: str,\n    request: Request,\n    *,\n    head_checkpoint: Any | None = None,\n) -> Any:\n    accessor, base_config = await build_thread_checkpoint_state_accessor(request, thread_id=thread_id)\n    if head_checkpoint is not None:\n        try:\n            return await find_checkpoint_before_message(\n                accessor,\n                head_checkpoint,\n                human_message_id,\n                max_depth=REGENERATE_HISTORY_RAW_SCAN_LIMIT,\n            )","sourceCodeStart":497,"sourceCodeEnd":533,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/app/gateway/routers/thread_runs.py#L497-L533","documentation":"Raised in _find_target_run_id (HTTP 409) when no run record can be linked to the assistant message being regenerated: neither the journal lookup nor the fallback scan (recent run events, bounded by REGENERATE_HISTORY_SCAN_LIMIT = 200) found a successful run whose last AI message matches. The server needs the source run_id to rerun the turn, so regenerate is refused.","triggerScenarios":"Regenerating an assistant message whose producing run's event journal was trimmed beyond the 200-entry scan limit; run store persistence gap where run records were never hydrated; regenerating an old turn after 200+ newer events.","commonSituations":"Long threads with heavy tool activity that floods run events; restarting the Gateway with an in-memory run store so older run records were lost; run-event journal retention/pruning configured aggressively.","solutions":["Regenerate the latest turn first (its run events are freshest) instead of reaching far back in history.","Check run-event journal retention settings and the run manager store backend; ensure runs are persisted, not in-memory only.","Increase REGENERATE_HISTORY_SCAN_LIMIT if the deployment regularly exceeds 200 run events between turns.","As a workaround, start a new thread and resurface needed context rather than regenerating a very old turn."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"const runs = await listRuns(threadId, {status: 'success'});\nif (!runs.some(r => r.final_message_id === targetMessageId)) {\n  // regenerate the latest turn instead, or start a new thread\n}","typeGuard":null,"tryCatchPattern":"try { await regeneratePrepare(threadId, messageId); } catch (e) { if (e.status === 409 && /source run/.test(e.detail)) { await resyncThreadAndRegenerateLatest(threadId); } else throw e; }","preventionTips":["Persist run-event journal and run store","Regenerate recent turns only","Tune REGENERATE_HISTORY_SCAN_LIMIT to thread length"],"tags":["regenerate","run-events","retention","http-409"],"backgroundTag":null,"analyzedSha":"1dd6ba1acb03700589994b0366c5d1c7d05e2eff","analyzedAt":"2026-08-14T21:20:34.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}