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

如何向Pydantic Langchain工具函数传入字典列表?解决验证错误

解决LangChain Agent工具的ValidationError:input_data字段缺失问题

问题根源

出现ValidationError: input_data field required的原因有两点:

  1. 参数传递格式错误:调用工具时直接传入了列表数据,没有按照InputData模型的要求,将数据包装在以input_data为键的字典中。
  2. 输入模型类型定义不匹配:原模型中List[Dict[str, int]]的类型约束不符合实际数据——Junk_Food_name是字符串类型,该约束会导致隐性的类型校验问题。

修复步骤

1. 修正输入模型的类型定义

推荐使用更精确的Pydantic子模型来定义单个菜品结构,既保证类型安全,也让工具的参数描述更清晰:

from typing import List
from pydantic import BaseModel, Field
from langchain.agents import tool

# 定义单个菜品的结构模型
class FoodItem(BaseModel):
    Junk_Food_name: str = Field(description="垃圾食品名称")
    price: int = Field(description="单品价格")

# 定义工具的输入模型
class InputData(BaseModel):
    input_data: List[FoodItem] = Field(description="包含菜品名称和价格的订单列表")

如果不想定义子模型,也可以用Union[str, int]兼容字符串和整数类型:

from typing import List, Dict, Union

class InputData(BaseModel):
    input_data: List[Dict[str, Union[str, int]]] = Field(description="包含菜品名称和价格的订单列表")

2. 按正确格式调用工具

调用工具时,必须将数据包装成符合InputData结构的字典,即顶级键为input_data:

# 示例输入数据
input_data = [
    {'Junk_Food_name': 'Meat Lovers Pizza', 'price': 800},
    {'Junk_Food_name': 'Chicken Alfredo Pizza', 'price': 800},
    {'Junk_Food_name': 'Cheeseburger Pizza', 'price': 800},
    {'Junk_Food_name': 'Chicken Bacon Ranch Pizza', 'price': 800},
    {'Junk_Food_name': 'Chicken Pesto Pizza', 'price': 800}
]

# 正确调用方式
result = calc_price({"input_data": input_data})
print(result)  # 输出:4000

完整可运行代码

from typing import List
from pydantic import BaseModel, Field
from langchain.agents import tool

# 定义单个菜品模型
class FoodItem(BaseModel):
    Junk_Food_name: str = Field(description="垃圾食品名称")
    price: int = Field(description="单品价格")

# 定义工具输入模型
class InputData(BaseModel):
    input_data: List[FoodItem] = Field(description="订单菜品列表")

# 定义求和工具
@tool(args_schema=InputData)
def calc_price(input_data: List[FoodItem])-> int:
    """计算订单总金额"""
    return sum(item.price for item in input_data)

# 测试调用
if __name__ == "__main__":
    input_data = [
        {'Junk_Food_name': 'Meat Lovers Pizza', 'price': 800},
        {'Junk_Food_name': 'Chicken Alfredo Pizza', 'price': 800},
        {'Junk_Food_name': 'Cheeseburger Pizza', 'price': 800},
        {'Junk_Food_name': 'Chicken Bacon Ranch Pizza', 'price': 800},
        {'Junk_Food_name': 'Chicken Pesto Pizza', 'price': 800}
    ]
    total = calc_price({"input_data": input_data})
    print(f"订单总金额:{total}")  # 输出:订单总金额:4000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:55:58