我是如何调试LangChain #34974的:一个ContextVar线程亲和性的案例分析
TL;DR: 10行代码修复了一个导致Human-in-the-Loop(人机交互回路)中断5个月的bug。根本原因:当异步函数使用线程池执行器(thread pool executor)派发任务时,Python的ContextVar无法跨越线程边界。修复方法:使用copy_context()。
两天前,我看到一个从2026年2月就打开的GitHub Issue——LangChain #34974:HumanInTheLoopMiddleware + ainvoke() → RuntimeError: Called get_config outside of a runnable context。5个月。2个未合并的PR。一整串开发者尝试各种变通方法——切换检查点后端、升级Python版本——都只是在治标。我决定写一个诊断工具来正本清源。以下是整个过程。
第一步:追踪错误链路
错误堆栈展示了一条清晰的路线:
langchain/agents/middleware/human_in_the_loop.py:381 → aafter_model (async wrapper)
langchain/agents/middleware/human_in_the_loop.py:331 → after_model (sync) → interrupt()
langgraph/types.py:515 → interrupt → get_config()["configurable"]