{"record":{"id":"369ac9d18c54d8dd","repo":"infiniflow/ragflow","slug":"querit-time-range-must-be-a-string","errorCode":null,"errorMessage":"Querit time_range must be a string.","messagePattern":"Querit time_range must be a string\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/tools/querit.py","lineNumber":410,"sourceCode":"    if \"statuses\" in response_data and not isinstance(response_data[\"statuses\"], list):\n        raise TypeError(\"Querit API response field statuses must be an array.\")\n\n\ndef _validate_search_inputs(\n    count: Any,\n    chunks_per_doc: Any,\n    time_range: Any,\n    site_include: Any,\n    site_exclude: Any,\n    country_include: Any,\n    language_include: Any,\n) -> None:\n    if type(count) is not int or count < 1:\n        raise ValueError(\"Querit count must be an integer greater than or equal to 1.\")\n    if chunks_per_doc is not None and (type(chunks_per_doc) is not int or not 1 <= chunks_per_doc <= 3):\n        raise ValueError(\"Querit chunks_per_doc must be an integer from 1 to 3.\")\n    if type(time_range) is not str:\n        raise ValueError(\"Querit time_range must be a string.\")\n    if time_range and not TIME_RANGE_PATTERN.fullmatch(time_range):\n        raise ValueError(\"Querit time_range must use dN, wN, mN, yN, or YYYY-MM-DDtoYYYY-MM-DD.\")\n    for name, value in (\n        (\"site_include\", site_include),\n        (\"site_exclude\", site_exclude),\n        (\"country_include\", country_include),\n        (\"language_include\", language_include),\n    ):\n        if not isinstance(value, list) or any(not isinstance(item, str) for item in value):\n            raise ValueError(f\"Querit {name} must be an array of strings.\")\n\n\ndef _safe_error_message(error: Exception, api_key: str) -> str:\n    message = str(error) or error.__class__.__name__\n    return message.replace(api_key, \"[REDACTED]\") if api_key else message\n\n\ndef _querit_text(value: Any) -> str:","sourceCodeStart":392,"sourceCodeEnd":428,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/agent/tools/querit.py#L392-L428","documentation":"ValueError from _validate_search_inputs(): the 'time_range' parameter of Querit search must be a Python str (isinstance check). Any non-string — None, int, list — raises before the format regex (dN/wN/mN/yN or YYYY-MM-DDtoYYYY-MM-DD) is even attempted.","triggerScenarios":"time_range=None when the caller omits it instead of passing '', time_range=['d7'] (list from loosely-typed binding), or time_range=30 (an integer day count from an upstream component).","commonSituations":"Optional-field templating that leaves None rather than an empty string; workflow engines passing arrays for single-value params; users converting 'last 7 days' to the number 7.","solutions":["Pass a string: '' for no filter, or 'd7'/'w2'/'m6'/'y1'/'2024-01-01to2024-12-31'.","Default None to '' in your caller before invoking.","Convert numeric day counts: f'd{days}'.","Flatten single-element arrays to their string item."],"exampleFix":"# before\ntime_range = None  # ValueError (must be str)\n\n# after\ntime_range = time_range or \"\"  # None-safe\nif isinstance(time_range, list) and time_range:\n    time_range = str(time_range[0])","handlingStrategy":"validation","validationCode":"def safe_time_range(v) -> str:\n    if v is None:\n        return \"\"\n    if isinstance(v, (int, float)) and v > 0:\n        return f\"d{int(v)}\"\n    if isinstance(v, list):\n        v = str(v[0]) if v else \"\"\n    return str(v)","typeGuard":"def is_valid_time_range_type(v) -> bool:\n    return isinstance(v, str)","tryCatchPattern":"try:\n    querit_search._invoke(query=q, time_range=tr)\nexcept ValueError as e:\n    if \"time_range must be a string\" in str(e):\n        tr = safe_time_range(tr); querit_search._invoke(query=q, time_range=tr)\n    raise","preventionTips":["Default None to '' before invoking; never leave the field unset in Python calls.","Use the documented formats: dN/wN/mN/yN or YYYY-MM-DDtoYYYY-MM-DD (also enforced by the follow-up regex check).","Flatten single-element arrays from workflow bindings to scalars."],"tags":["validation","input","querit","string"],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}