You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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向下传递:

  1. 创建自定义回调,在工具调用前处理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
  1. 创建AgentExecutor时添加该回调:
self._retrieval_agent = AgentExecutor(
    agent=_retrieval_agent, 
    tools=[...], 
    verbose=True,
    callbacks=[retrieval_agent_callback, ConfigPropagationCallback()]
)

关键说明

  • 包装器方案无需依赖Agent内部逻辑,兼容性更强,适合稳定需求;
  • 回调方案更灵活,但需要处理工具输入的序列化逻辑;
  • 避免通过提示词传递动态参数,减少令牌消耗和LLM出错概率。

内容的提问来源于stack exchange,提问作者SubFunction

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:54:51