assafelovic/gpt-researcher · error · ValueError
Cannot convert {env_value} to any of {args}
Error message
Cannot convert {env_value} to any of {args} What it means
Config.convert_env_value tries each type in an Optional/Union type hint in turn; when no branch can convert the raw env string, it raises this aggregated ValueError. It is the fallback for Union types where every candidate conversion failed.
Source
Thrown at gpt_researcher/config/config.py:277
"""Convert environment variable to the appropriate type based on the type hint."""
origin = get_origin(type_hint)
args = get_args(type_hint)
if origin is Union:
# Handle Union types (e.g., Union[str, None] / Optional[str]).
# Check the None sentinel BEFORE non-None args: for Optional[str],
# str conversion never raises, so looping str-first permanently
# shadowed the none/null/"" → None branch (see issue #1899).
if type(None) in args and env_value.lower() in ("none", "null", ""):
return None
for arg in args:
if arg is type(None):
continue
try:
return Config.convert_env_value(key, env_value, arg)
except ValueError:
continue
raise ValueError(f"Cannot convert {env_value} to any of {args}")
if type_hint is bool:
return env_value.lower() in ("true", "1", "yes", "on")
elif type_hint is int:
return int(env_value)
elif type_hint is float:
return float(env_value)
elif type_hint in (str, Any):
return env_value
elif type_hint is list or origin is list or origin is List:
# Env values are often hand-edited (trailing commas, single quotes).
# Bare `list` has get_origin(None); typing.List[...] has origin list.
try:
value = json_repair.loads(env_value)
except Exception as exc:
raise ValueError(f"Cannot convert {env_value} to list") from exc
if not isinstance(value, list):
raise ValueError(f"Cannot convert {env_value} to list")View on GitHub (pinned to 6f998577d5)
Solutions
- Set the env var to a valid literal for the annotated type (true/false for bool, digits for int/float)
- Remove the variable to use the default
- Check the Config attribute type hints for the key named in the message
Example fix
# before FAST_TOKEN_LIMIT=unlimited # after FAST_TOKEN_LIMIT=4000
Defensive patterns
Strategy: validation
Validate before calling
def coerce(env_val, types):
for t in types:
try:
return Config.convert_env_value("k", env_val, t)
except ValueError:
pass
raise ValueError(env_val)
# preflight any Optional[int] var:
coerce(os.getenv('FAST_TOKEN_LIMIT','4000'), (int, type(None))) Try / catch
try:
cfg = Config()
except ValueError as e:
if "Cannot convert" in str(e):
print('Bad env value:', e); exit(2)
raise Prevention
- Keep .env values strictly typed literals
- Validate env file in CI with a Config() construction test
When it happens
Trigger: An env var annotated Optional[int] set to 'abc', or Optional[bool] set to 'maybe'—each inner conversion raises and the loop exhausts, producing this message.
Common situations: Hand-edited .env files with non-numeric values for numeric settings; booleans set to 'yeah'; JSON-ish values on scalar fields.
Related errors
- Cannot convert {env_value} to list
- Cannot convert {env_value} to dict
- Unsupported type {type_hint} for key {key}
- Embedding provider not found.
- Invalid retriever(s) found: {', '.join(invalid_retrievers)}.
AI-assisted analysis of assafelovic/gpt-researcher@6f998577d5 (2026-08-28).
Data as JSON: /api/errors/f93e3b8ce6a70438.
Report an issue: GitHub.