LangChain AgentExecutor无法传递RunnableConfig的configurable至自定义@tool
解决LangChain AgentExecutor中动态变量无法传递到自定义工具的问题
核心原因
LangChain的AgentExecutor默认不会将顶层调用传入的RunnableConfig中的configurable参数传递给子工具调用,导致工具无法获取到动态注入的input_content。
可靠解决方案:自定义工具包装器
通过包装工具函数,显式从RunnableConfig中提取所需参数并传递给实际工具逻辑,绕过Agent的参数传递限制。
修改后的工具代码(tools.py)
from langchain_core.runnables import RunnableConfig from langchain_core.tools import tool, StructuredTool # 原始工具逻辑,直接接收所需参数 @tool def _retrieval_and_rerank(query: str, k: int = 5, input_content: str = "") -> str: """从文档中检索并重新排序文档。""" print(f"Tool executing. Extracted Variable: {input_content}") return f"Reranked with context: {input_content}" # 包装器:从RunnableConfig中提取configurable参数,再调用原始工具 def retrieval_and_rerank_wrapper(inputs: dict, config: RunnableConfig): # 从config中获取动态注入的input_content configurable_data = config.get("configurable", {}) input_content = configurable_data.get("input_content", "CONFIG_NOT_PROPAGATED") # 调用原始工具,传入所有必要参数 return _retrieval_and_rerank.invoke({ "query": inputs["query"], "k": inputs.get("k", 5), "input_content": input_content }) # 创建可被Agent调用的结构化工具 retrieval_and_rerank = StructuredTool.from_function( func=retrieval_and_rerank_wrapper, name="retrieval_and_rerank", description="从文档中检索并重新排序文档。" )
代理调用代码无需修改
保持原有的invoke调用方式即可:
response = self.retrieval_agent.invoke( {"input": input_content}, config={"callbacks": [retrieval_agent_callback], "configurable": {"input_content": input_content}} )
备选方案:强制Agent传递Config
针对LangChain 0.3.x版本,可通过修改AgentExecutor的配置,结合自定义回调确保Config向下传递:
- 创建自定义回调,在工具调用前处理Config传递:
from langchain_core.callbacks.base import BaseCallbackHandler class ConfigPropagationCallback(BaseCallbackHandler): def on_tool_start(self, serialized: dict, input_str: str, **kwargs) -> None: # 从上下文获取顶层Config,可按需注入到工具输入或调用上下文 config = kwargs.get("config", {}) if config.get("configurable"): # 此处可根据工具逻辑修改输入内容,或直接传递Config到工具内部 pass
- 创建AgentExecutor时添加该回调:
self._retrieval_agent = AgentExecutor( agent=_retrieval_agent, tools=[...], verbose=True, callbacks=[retrieval_agent_callback, ConfigPropagationCallback()] )
关键说明
- 包装器方案无需依赖Agent内部逻辑,兼容性更强,适合稳定需求;
- 回调方案更灵活,但需要处理工具输入的序列化逻辑;
- 避免通过提示词传递动态参数,减少令牌消耗和LLM出错概率。
内容的提问来源于stack exchange,提问作者SubFunction
相关产品推荐
相关产品推荐

