快速结论:此报错发生在 LangChain core 的 `StructuredTool` 中,当工具函数使用 PEP 563 延迟注解(如 `from __future__ import annotations`)或前向引用(quoted forward reference)时,`_injected_args_keys` 无法正确识别 `InjectedToolArg` 参数,导致运行时缺少该参数。优先排查并更新 LangChain core 版本,或避免在工具函数中使用延迟注解。
适用环境:langchain-core(已确认),Python 3.x(`from __future__ import annotations` 场景),无需特殊操作系统、CUDA 或显卡依赖。
最快修复方案:暂无确认的一步修复方案。Issue 中已提交 PR 但尚未合并,可优先尝试升级 langchain-core 到包含修复的版本(如 PR 合并后的版本),或避免在工具函数中使用延迟注解。
注意事项:此修复可能影响 `StructuredTool` 对函数签名注解的解析行为,升级前建议在测试环境验证现有工具函数的兼容性。
问题场景
用户在使用 LangChain core 的 `@tool` 装饰器创建自定义工具时,工具函数参数包含 `Annotated[str, InjectedToolArg]` 类型的注入参数,同时函数顶部使用了 `from __future__ import annotations` 启用延迟注解。调用 `invoke()` 时,注入参数未被正确识别和处理,导致运行时抛出 `TypeError`。
报错原文
Traceback (most recent call last):
...
File "...\langchain_core\tools\structured.py", line 97, in _run
return self.func(*args, **kwargs)
TypeError: my_tool() missing 1 required positional argument: 'secret'
原因分析
问题根源在 `StructuredTool._injected_args_keys` 方法。该方法通过 `signature(fn).parameters` 获取参数注解,但直接使用原始注解值而未解析。当使用 PEP 563 延迟注解或前向引用时,注解以字符串形式存在(如 `”Annotated[str, InjectedToolArg]”`),导致 `InjectedToolArg` 判断失败。此问题与 `ChildTool` 在 #39202 中已修复的 bug 完全相同,但 `StructuredTool` 未同步修复。
环境排查
- 确认 Python 版本是否支持 `from __future__ import annotations`(Python 3.7+)
- 确认 langchain-core 是否已更新到包含修复的版本(PR #39602 合并后的版本)
- 检查工具函数是否使用前向引用(quoted annotation)
- 确认 `InjectedToolArg` 是否正确从 `langchain_core.tools` 导入
解决步骤
- 优先尝试更新 langchain-core 到最新稳定版或包含 PR #39602 修复的版本
- 如果无法升级,可移除工具函数中的 `from __future__ import annotations`,改用直接注解
- 避免在工具函数参数中使用前向引用(quoted annotation),改为直接类型注解
- 如使用 `args_schema` 参数,确保 Pydantic 模型中的字段与工具函数参数一致
- 如果问题持续,可尝试在工具函数中将 `InjectedToolArg` 参数改为普通参数,手动处理注入逻辑
验证方法
运行最小复现代码:创建包含 `InjectedToolArg` 参数的工具函数,确认 `_injected_args_keys` 返回的 frozenset 中包含 `’secret’`,且调用 `invoke()` 时不再抛出 `TypeError`,而是返回正确的输出结果。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: Composite VLM wrapper (Mistral3ForConditionalGeneration) resolves tie_word_embeddings from the wrong (top-level) config, silently dis](https://www.chat-gpts.plus/wp-content/uploads/2026/08/51063-e1d92b3e-768x403.jpg)

