{"record":{"id":"c8e6d8802570a922","repo":"langchain-ai/deepagents","slug":"model-params-must-be-a-json-object-got-type","errorCode":null,"errorMessage":"--model-params must be a JSON object, got {type}","messagePattern":"--model-params must be a JSON object, got (.+?)","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"libs/code/deepagents_code/app.py","lineNumber":1989,"sourceCode":"        rest = after[end + 1 :].lstrip()\n    else:\n        # Non-brace, non-quoted — take the next whitespace-delimited token.\n        parts = after.split(None, 1)\n        json_str = parts[0]\n        rest = parts[1] if len(parts) > 1 else \"\"\n\n    remaining = f\"{before} {rest}\".strip()\n    try:\n        params = json.loads(json_str)\n    except json.JSONDecodeError:\n        msg = (\n            f\"Invalid JSON in --model-params: {json_str!r}. \"\n            'Expected format: --model-params \\'{\"key\": \"value\"}\\''\n        )\n        raise ValueError(msg) from None\n    if not isinstance(params, dict):\n        msg = \"--model-params must be a JSON object, got \" + type(params).__name__\n        raise TypeError(msg)\n    return remaining, params\n\n\ndef _format_model_params(extra_kwargs: dict[str, Any] | None) -> str:\n    \"\"\"Render `--model-params` as a stable, key-sorted JSON suffix.\n\n    Args:\n        extra_kwargs: The parsed `--model-params` payload, or `None`.\n\n    Returns:\n        ` with model params {json}` when `extra_kwargs` is non-empty;\n        otherwise an empty string so callers can unconditionally concatenate.\n    \"\"\"\n    if not extra_kwargs:\n        return \"\"\n    return f\" with model params {json.dumps(extra_kwargs, sort_keys=True)}\"\n\n","sourceCodeStart":1971,"sourceCodeEnd":2007,"githubUrl":"https://github.com/langchain-ai/deepagents/blob/a1af029e6e73cb17c36bff823d227747b28e91e1/libs/code/deepagents_code/app.py#L1971-L2007","documentation":"After successful JSON parsing, `_extract_model_params_flag` checks the result is a dict. JSON allows top-level arrays, strings, numbers, booleans, and null; `--model-params` only accepts an object of model kwargs, so anything else raises this TypeError naming the actual parsed type.","triggerScenarios":"Passing a valid-JSON-but-not-object value: `--model-params '[1,2]'`, `--model-params '\"hello\"'`, `--model-params '42'`, `--model-params 'null'`, or `--model-params 'true'`.","commonSituations":"Users intending a list of parameters, or passing a scalar value (a temperature number alone) expecting it to be treated as a setting.","solutions":["Wrap the value in a JSON object with the kwarg as key: --model-params '{\"temperature\": 0.5}'","Check the value parses to an object: python -c \"import json;d=json.loads('<v>');assert isinstance(d,dict)\"","For list-shaped settings, nest them under a key inside the object"],"exampleFix":"// before\n--model-params '[\"temperature\", 0.5]'\n// after\n--model-params '{\"temperature\": 0.5}'","handlingStrategy":"type-guard","validationCode":"parsed = json.loads(value)\nif not isinstance(parsed, dict):\n    raise TypeError(f\"--model-params needs a JSON object, got {type(parsed).__name__}\")","typeGuard":"def is_model_params_object(value: str) -> bool:\n    try:\n        return isinstance(json.loads(value), dict)\n    except json.JSONDecodeError:\n        return False","tryCatchPattern":"try:\n    remaining, params = _extract_model_params_flag(argv)\nexcept TypeError as exc:\n    print(exc)  # names the parsed type\n    sys.exit(2)","preventionTips":["Top-level value must be {\"key\": value}; scalars/lists are rejected","Nest list settings under a key instead of passing a bare JSON array","Lint config generators to emit JSON objects only"],"tags":["cli","type-error","argument-validation"],"backgroundTag":"invalid-json-input","analyzedSha":"a1af029e6e73cb17c36bff823d227747b28e91e1","analyzedAt":"2026-08-29T11:43:24.718Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}