{"record":{"id":"28ef696e22e65679","repo":"langchain-ai/deepagents","slug":"profile-key-key-r-has-leading-or-trailing-whites","errorCode":null,"errorMessage":"Profile key {key!r} has leading or trailing whitespace; expected 'provider' or 'provider:model'.","messagePattern":"Profile key (.+?) has leading or trailing whitespace; expected 'provider' or 'provider:model'\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"libs/deepagents/deepagents/profiles/_keys.py","lineNumber":31,"sourceCode":"\n    Enforces the `provider` or `provider:model` shape used by the lookup\n    functions. Rejects empty strings, whitespace-only or whitespace-padded\n    halves, multiple colons, and empty halves.\n\n    Args:\n        key: The registry key to check.\n\n    Raises:\n        ValueError: If `key` is empty, contains leading/trailing whitespace,\n            has more than one `:`, has whitespace adjacent to `:`, or has\n            an empty half on either side of `:`.\n    \"\"\"\n    if not key:\n        msg = \"Profile key must be a non-empty string.\"\n        raise ValueError(msg)\n    if key != key.strip():\n        msg = f\"Profile key {key!r} has leading or trailing whitespace; expected 'provider' or 'provider:model'.\"\n        raise ValueError(msg)\n    if key.count(\":\") > 1:\n        msg = f\"Profile key {key!r} has more than one ':'; expected 'provider' or 'provider:model'.\"\n        raise ValueError(msg)\n    if \":\" in key:\n        provider, _, model = key.partition(\":\")\n        if not provider or not model:\n            msg = f\"Profile key {key!r} has an empty provider or model half; expected 'provider:model'.\"\n            raise ValueError(msg)\n        if provider != provider.strip() or model != model.strip():\n            msg = f\"Profile key {key!r} has whitespace adjacent to ':'; expected 'provider:model' with no spaces around ':'.\"\n            raise ValueError(msg)\n","sourceCodeStart":13,"sourceCodeEnd":43,"githubUrl":"https://github.com/langchain-ai/deepagents/blob/a1af029e6e73cb17c36bff823d227747b28e91e1/libs/deepagents/deepagents/profiles/_keys.py#L13-L43","documentation":"validate_profile_key rejects keys with leading or trailing whitespace because registry lookups are exact string matches; padded keys would silently create unreachable entries. The check compares the key to its .strip() result.","triggerScenarios":"Registering or looking up a profile with key like ' anthropic' or 'anthropic:model\\n', e.g. a name copied from documentation or read from an unstripped config line.","commonSituations":"Hand-edited YAML/JSON config with stray spaces; splitting a 'provider:model' spec from user input without stripping; env vars containing trailing newlines.","solutions":["Remove leading/trailing whitespace: key = key.strip() before registering.","Fix whitespace at the config or input-parsing source.","If parsing 'provider:model', strip each half individually."],"exampleFix":"// before\nkey = f\"{provider} : {model}\"  # ' anthropic : gpt-4 ' style\nregister_provider_profile(key)\n// after\nkey = f\"{provider.strip()}:{model.strip()}\"\nregister_provider_profile(key)","handlingStrategy":"validation","validationCode":"key = key.strip()\nassert key == key.strip(), \"profile key has surrounding whitespace\"","typeGuard":null,"tryCatchPattern":"try:\n    register_provider_profile(key)\nexcept ValueError as e:\n    if \"leading or trailing whitespace\" in str(e):\n        key = key.strip()\n    else:\n        raise","preventionTips":["Strip values when reading profile names from config/env/CLI","Canonicalize 'provider:model' keys in one helper used everywhere"],"tags":["python","profiles","whitespace"],"backgroundTag":"invalid-profile-key","analyzedSha":"a1af029e6e73cb17c36bff823d227747b28e91e1","analyzedAt":"2026-08-29T11:43:24.718Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}