{"record":{"id":"72257c01b8ff18a1","repo":"run-llama/llama_index","slug":"invalid-additional-field-info-field-info-must","errorCode":null,"errorMessage":"Invalid additional field info: {field_info}. Must be a tuple of length 2 or 3.","messagePattern":"Invalid additional field info: (.+?)\\. Must be a tuple of length 2 or 3\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"llama-index-core/llama_index/core/tools/utils.py","lineNumber":128,"sourceCode":"                FieldInfo(\n                    default=param_default,\n                    description=description,\n                    json_schema_extra=json_schema_extra,\n                ),\n            )\n\n    additional_fields = additional_fields or []\n    for field_info in additional_fields:\n        if len(field_info) == 3:\n            field_info = cast(Tuple[str, Type, Any], field_info)\n            field_name, field_type, field_default = field_info\n            fields[field_name] = (field_type, FieldInfo(default=field_default))\n        elif len(field_info) == 2:\n            field_info = cast(Tuple[str, Type], field_info)\n            field_name, field_type = field_info\n            fields[field_name] = (field_type, FieldInfo())\n        else:\n            raise ValueError(\n                f\"Invalid additional field info: {field_info}. \"\n                \"Must be a tuple of length 2 or 3.\"\n            )\n\n    return create_model(name, **fields)  # type: ignore\n","sourceCodeStart":110,"sourceCodeEnd":134,"githubUrl":"https://github.com/run-llama/llama_index/blob/afd0fef371831f9bda13e5af7167cf4e981278ab/llama-index-core/llama_index/core/tools/utils.py#L110-L134","documentation":"create_schema_model() builds a dynamic Pydantic model from a base schema plus additional field definitions. Each entry in additional_fields must be a tuple of length 2 (name, type) or length 3 (name, type, default). Any other length raises ValueError with the offending tuple echoed in the message.","triggerScenarios":"Calling create_schema_model(..., additional_fields=[('q', str, 'default', 'extra')]) (4-tuple) or [('q',)] (1-tuple); passing lists instead of tuples does NOT trigger this (len still works) but passing strings of wrong length or malformed nested data does.","commonSituations":"Building custom tool schemas for text-to-SQL or structured extraction; copy-paste drift when a field's default was removed but the leftover element stayed in the tuple; programmatic generation of additional_fields that sometimes emits 1- or 4-element tuples.","solutions":["Fix each tuple to exactly (name, type) or (name, type, default).","Validate programmatically before calling: assert all(len(t) in (2, 3) for t in additional_fields).","When generating fields from data, normalize: if len(t) == 2, append a sensible default or None."],"exampleFix":"# before\n fields = [('city', str, 'n/a', 'unused')]  # len 4 -> ValueError\n model = create_schema_model('Args', additional_fields=fields)\n\n# after\n fields = [('city', str, 'n-a')]\n model = create_schema_model('Args', additional_fields=fields)","handlingStrategy":"validation","validationCode":"def normalize_additional_fields(fields):\n    out = []\n    for f in fields or []:\n        if len(f) == 2:\n            out.append((f[0], f[1]))\n        elif len(f) == 3:\n            out.append((f[0], f[1], f[2]))\n        else:\n            raise ValueError(f'additional_fields entry must be len 2 or 3, got {f!r}')\n    return out","typeGuard":"def is_valid_additional_fields(fields) -> bool:\n    return all(isinstance(f, tuple) and len(f) in (2, 3) for f in (fields or []))","tryCatchPattern":"try:\n    model = create_schema_model('Args', additional_fields=fields)\nexcept ValueError as e:\n    if 'Invalid additional field info' in str(e):\n        model = create_schema_model('Args', additional_fields=normalize_additional_fields(fields))\n    else:\n        raise","preventionTips":["Assert tuple lengths before calling create_schema_model.","Generate (name, type, default) triples from a typed config object instead of raw tuples.","Add unit tests for dynamic schema builders with edge-case inputs."],"tags":["pydantic","schema-model","validation","value-error"],"backgroundTag":null,"analyzedSha":"afd0fef371831f9bda13e5af7167cf4e981278ab","analyzedAt":"2026-08-15T05:42:58.429Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}