{"record":{"id":"845591b26a559308","repo":"langchain-ai/langchain","slug":"invalid-annotation-for-field-arg-third-argument","errorCode":null,"errorMessage":"Invalid annotation for field {arg}. Third argument to Annotated must be a string description, received value of type {type(field_desc)}.","messagePattern":"Invalid annotation for field (.+?)\\. Third argument to Annotated must be a string description, received value of type (.+?)\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"libs/core/langchain_core/utils/function_calling.py","lineNumber":298,"sourceCode":"        fields: dict[str, Any] = {}\n        for arg, arg_type in annotations_.items():\n            if get_origin(arg_type) in {Annotated, typing_extensions.Annotated}:\n                annotated_args = get_args(arg_type)\n                new_arg_type = _convert_any_typed_dicts_to_pydantic(\n                    annotated_args[0], depth=depth + 1, visited=visited\n                )\n                field_kwargs = dict(\n                    zip((\"default\", \"description\"), annotated_args[1:], strict=False)\n                )\n                if (field_desc := field_kwargs.get(\"description\")) and not isinstance(\n                    field_desc, str\n                ):\n                    msg = (\n                        f\"Invalid annotation for field {arg}. Third argument to \"\n                        f\"Annotated must be a string description, received value of \"\n                        f\"type {type(field_desc)}.\"\n                    )\n                    raise ValueError(msg)\n                if arg_desc := arg_descriptions.get(arg):\n                    field_kwargs[\"description\"] = arg_desc\n                fields[arg] = (new_arg_type, Field_v1(**field_kwargs))\n            else:\n                new_arg_type = _convert_any_typed_dicts_to_pydantic(\n                    arg_type, depth=depth + 1, visited=visited\n                )\n                field_kwargs = {\"default\": ...}\n                if arg_desc := arg_descriptions.get(arg):\n                    field_kwargs[\"description\"] = arg_desc\n                fields[arg] = (new_arg_type, Field_v1(**field_kwargs))\n        model = cast(\n            \"type[BaseModelV1]\", create_model_v1(typed_dict.__name__, **fields)\n        )\n        model.__doc__ = description\n        visited[typed_dict] = model\n        return model\n    if (origin := get_origin(type_)) and (type_args := get_args(type_)):","sourceCodeStart":280,"sourceCodeEnd":316,"githubUrl":"https://github.com/langchain-ai/langchain/blob/e32fa9a52eab3b61ad7a45399bfde59b3e580fc4/libs/core/langchain_core/utils/function_calling.py#L280-L316","documentation":"Error \"Invalid annotation for field {arg}. Third argument to Annotated must be a string description, received value of type {type(field_desc)}.\" thrown in langchain-ai/langchain.","triggerScenarios":"Raised when an Annotated[..., X] argument annotation is used in a tool function where X (the third element) is not a string description, e.g. a number or another type object.","commonSituations":"See trigger scenarios.","solutions":["Use Annotated with a string as the third element: Annotated[T, FieldInfo, \"description\"].","If you need structured metadata, use pydantic Field(description=...) instead of passing a non-string in Annotated."],"exampleFix":"def f(arg: Annotated[str, Field(...), \"the query\"]) -> None: ...","handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"e32fa9a52eab3b61ad7a45399bfde59b3e580fc4","analyzedAt":"2026-08-14T18:42:09.092Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}