{"record":{"id":"16215c20c3a88982","repo":"BerriAI/litellm","slug":"unmapped-prompt-format-your-prompt-is-neither-a-l","errorCode":null,"errorMessage":"Unmapped prompt format. Your prompt is neither a list of strings nor a string. prompt={prompt}. File an issue - https://github.com/BerriAI/litellm/issues","messagePattern":"Unmapped prompt format\\. Your prompt is neither a list of strings nor a string\\. prompt=(.+?)\\. File an issue - https://github\\.com/BerriAI/litellm/issues","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"litellm/main.py","lineNumber":7327,"sourceCode":"            messages.append(message)\n    elif isinstance(prompt, str):\n        messages = [{\"role\": \"user\", \"content\": prompt}]\n    elif (\n        (\n            custom_llm_provider == \"openai\"\n            or custom_llm_provider == \"azure\"\n            or custom_llm_provider == \"azure_text\"\n            or custom_llm_provider == \"text-completion-codestral\"\n            or custom_llm_provider == \"text-completion-openai\"\n        )\n        and isinstance(prompt, list)\n        and len(prompt) > 0\n        and (isinstance(prompt[0], list) or isinstance(prompt[0], int))\n    ):\n        # Support for token IDs as prompt (list of integers or list of lists of integers)\n        messages = [{\"role\": \"user\", \"content\": prompt}]\n    else:\n        raise Exception(\n            f\"Unmapped prompt format. Your prompt is neither a list of strings nor a string. prompt={prompt}. File an issue - https://github.com/BerriAI/litellm/issues\"\n        )\n\n    kwargs.pop(\"prompt\", None)\n\n    if (\n        _model is not None and (custom_llm_provider == \"openai\")\n    ):  # for openai compatible endpoints - e.g. vllm, call the native /v1/completions endpoint for text completion calls\n        if _model not in litellm.open_ai_chat_completion_models:\n            model = \"text-completion-openai/\" + _model\n            optional_params.pop(\"custom_llm_provider\", None)\n\n    if model is None:\n        raise ValueError(\"model is not set. Set either via 'model' or 'engine' param.\")\n    kwargs[\"text_completion\"] = True\n    response = completion(\n        model=model,\n        messages=messages,","sourceCodeStart":7309,"sourceCodeEnd":7345,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/main.py#L7309-L7345","documentation":"litellm.text_completion() accepts prompt as a plain string, a list of strings, or — for token-ID inputs — a list of ints / list of list of ints, and the token-ID form is only allowed for openai, azure, azure_text, text-completion-codestral and text-completion-openai providers. Any other shape raises this Exception.","triggerScenarios":"text_completion(model=..., prompt=[{'role': 'user', 'content': ...}]) (chat messages fed to prompt); prompt being an int, dict or None; or token-ID lists used with a provider outside the supported set.","commonSituations":"Porting completion() code to text_completion() and passing messages unchanged; sending pre-tokenized inputs to a non-OpenAI legacy endpoint; a upstream library handing back dicts where strings were expected.","solutions":["Pass a string: litellm.text_completion(model='gpt-3.5-turbo-instruct', prompt='Once upon a time')","For message dicts, use litellm.completion(model=..., messages=[...]) instead","For token IDs, use an allowed provider (model='text-completion-openai/...' or an azure variant)","Normalize prompt to str or list[str] before calling"],"exampleFix":"# before\nresp = litellm.text_completion(model=\"gpt-3.5-turbo-instruct\", prompt=[{\"role\": \"user\", \"content\": \"hi\"}])\n\n# after\nresp = litellm.completion(model=\"gpt-4o-mini\", messages=[{\"role\": \"user\", \"content\": \"hi\"}])","handlingStrategy":"type-guard","validationCode":"TOKEN_ID_PROVIDERS = {\"openai\", \"azure\", \"azure_text\", \"text-completion-codestral\", \"text-completion-openai\"}\n\ndef is_valid_text_prompt(prompt, provider: str) -> bool:\n    if isinstance(prompt, str):\n        return True\n    if isinstance(prompt, list) and prompt and all(isinstance(p, str) for p in prompt):\n        return True\n    if (\n        provider in TOKEN_ID_PROVIDERS\n        and isinstance(prompt, list)\n        and prompt\n        and (isinstance(prompt[0], int) or isinstance(prompt[0], list))\n    ):\n        return True\n    return False","typeGuard":"def is_valid_text_prompt(prompt: object) -> bool:\n    if isinstance(prompt, str):\n        return True\n    if isinstance(prompt, list):\n        if not prompt:\n            return False\n        return isinstance(prompt[0], (str, int)) or isinstance(prompt[0], list)\n    return False","tryCatchPattern":"try:\n    resp = litellm.text_completion(model=model, prompt=prompt)\nexcept Exception as e:\n    if \"Unmapped prompt format\" in str(e):\n        raise TypeError(f\"bad prompt shape: {type(prompt)}\") from e\n    raise","preventionTips":["Route chat-style dicts to litellm.completion(), never text_completion()","Normalize prompts to str or list[str] at your API boundary","Remember token-ID prompts are OpenAI/Azure-only"],"tags":["litellm","text-completion","prompt","input-validation"],"backgroundTag":"invalid-request-payload","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}