{"record":{"id":"de46bf85a85a381a","repo":"microsoft/autogen","slug":"invalid-name-name-only-letters-numbers-a-de46bf","errorCode":null,"errorMessage":"Invalid name: {name}. Only letters, numbers, '_' and '-' are allowed.","messagePattern":"Invalid name: (.+?)\\. Only letters, numbers, '_' and '-' are allowed\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/packages/autogen-ext/src/autogen_ext/models/openai/_utils.py","lineNumber":11,"sourceCode":"import re\n\n\ndef assert_valid_name(name: str) -> str:\n    \"\"\"\n    Ensure that configured names are valid, raises ValueError if not.\n\n    For munging LLM responses use _normalize_name to ensure LLM specified names don't break the API.\n    \"\"\"\n    if not re.match(r\"^[a-zA-Z0-9_-]+$\", name):\n        raise ValueError(f\"Invalid name: {name}. Only letters, numbers, '_' and '-' are allowed.\")\n    if len(name) > 64:\n        raise ValueError(f\"Invalid name: {name}. Name must be less than 64 characters.\")\n    return name\n","sourceCodeStart":1,"sourceCodeEnd":15,"githubUrl":"https://github.com/microsoft/autogen/blob/027ecf0a379bcc1d09956d46d12d44a3ad9cee14/python/packages/autogen-ext/src/autogen_ext/models/openai/_utils.py#L1-L15","documentation":"Thrown by assert_valid_name in autogen_ext.models.openai._utils when a configured name contains characters outside [a-zA-Z0-9_-]. This validates developer-configured names (agent names, tool names) that go into API payloads, as opposed to LLM-generated names which are munged via _normalize_name instead.","triggerScenarios":"Passing a name containing spaces, dots, slashes, unicode, or other symbols to assert_valid_name — e.g. an agent or tool named 'my tool.v2' or 'helper/agent'. The regex must fully match the whole string; empty strings also fail.","commonSituations":"Human-readable agent names ('Customer Support Agent') passed unmodified; tool names derived from Python dotted paths (module.function); names built from user input or file names without sanitization.","solutions":["Rename to use only letters, digits, underscore, and hyphen: 'customer_support_agent'","Sanitize programmatically: re.sub(r'[^a-zA-Z0-9_-]', '_', name)","For LLM-produced names, use the provided _normalize_name helper instead of assert_valid_name"],"exampleFix":"# before\nname = assert_valid_name(\"customer support.agent\")  # ValueError\n\n# after\nimport re\nname = assert_valid_name(re.sub(r\"[^a-zA-Z0-9_-]\", \"_\", \"customer support.agent\"))  # 'customer_support_agent_'","handlingStrategy":"validation","validationCode":"import re\n\ndef safe_name(name: str) -> str:\n    return re.sub(r\"[^a-zA-Z0-9_-]\", \"_\", name)[:64]\n\nname = safe_name(raw_name)  # guaranteed to pass assert_valid_name","typeGuard":"def is_valid_name(name: str) -> bool:\n    import re\n    return bool(re.fullmatch(r\"[a-zA-Z0-9_-]{1,64}\", name))","tryCatchPattern":"try:\n    assert_valid_name(name)\nexcept ValueError:\n    name = re.sub(r\"[^a-zA-Z0-9_-]\", \"_\", name)\n    assert_valid_name(name)","preventionTips":["Generate names through one sanitizer (regex [a-zA-Z0-9_-], truncate to 64) at the boundary","Never feed user input or file paths directly as tool/agent names","Add a startup assertion for all configured names so bad names fail at boot, not mid-run"],"tags":["openai","naming","validation","sanitization"],"backgroundTag":null,"analyzedSha":"027ecf0a379bcc1d09956d46d12d44a3ad9cee14","analyzedAt":"2026-08-15T03:38:00.719Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}