BerriAI/litellm · error · Exception

ollama image conversion failed please run `pip install Pillo

Error message

ollama image conversion failed please run `pip install Pillow`

What it means

Ollama image conversion in litellm/llms/ollama/common_utils.py needs Pillow to re-encode non-JPEG/PNG images (e.g. WebP) to JPEG base64. It tries `from PIL import Image`; if the import fails, this generic Exception is raised telling you to install Pillow.

Source

Thrown at litellm/llms/ollama/common_utils.py:28

    def __init__(self, status_code: int, message: str, headers: dict | httpx.Headers):
        super().__init__(status_code=status_code, message=message, headers=headers)


def _convert_image(image):
    """
    Convert image to base64 encoded image if not already in base64 format

    If image is already in base64 format AND is a jpeg/png, return it

    If image is not JPEG/PNG, convert it to JPEG base64 format
    """
    import base64
    import io

    try:
        from PIL import Image
    except Exception:
        raise Exception("ollama image conversion failed please run `pip install Pillow`")

    orig: Final = image
    if image.startswith("data:"):
        image = image.split(",")[-1]
    try:
        image_data: Final = Image.open(io.BytesIO(base64.b64decode(image)))
        if image_data.format in ["JPEG", "PNG"]:
            return image
    except Exception:
        return orig
    jpeg_image: Final = io.BytesIO()
    image_data.convert("RGB").save(jpeg_image, "JPEG")
    jpeg_image.seek(0)
    return base64.b64encode(jpeg_image.getvalue()).decode("utf-8")


from litellm.llms.base_llm.base_utils import BaseLLMModelInfo

View on GitHub (pinned to 6c2dcb801b)

Solutions

  1. Install Pillow in the environment running LiteLLM: `pip install Pillow`.
  2. Or pre-convert images to JPEG/PNG base64 yourself before passing them, avoiding the conversion path.
  3. Add Pillow to your project's dependency list so it survives fresh installs.

Example fix

# before
# images fail with "ollama image conversion failed please run `pip install Pillow`"

# after
pip install Pillow
# or pre-convert:
from PIL import Image
import io, base64
buf = io.BytesIO()
Image.open("cat.webp").convert("RGB").save(buf, "JPEG")
b64 = base64.b64encode(buf.getvalue()).decode()
Defensive patterns

Strategy: validation

Validate before calling

def pillow_available() -> bool:
    try:
        from PIL import Image  # noqa: F401
        return True
    except ImportError:
        return False

if not pillow_available() and any_image_inputs(messages):
    raise RuntimeError("Install Pillow or pre-convert images to JPEG/PNG base64")

Prevention

When it happens

Trigger: Calling `litellm.completion(model='ollama/llava', messages=[{'role':'user','content':[{'type':'image_url','image_url':{'url':'data:image/webp;base64,...'}}]}])` in an environment where Pillow is not installed — LiteLLM does not depend on Pillow by default.

Common situations: Fresh venvs with a minimal `pip install litellm`, slim Docker images, or WebP/other-format images (JPEG/PNG pass through without Pillow only when already base64-decodable; conversion paths need it).

Related errors


AI-assisted analysis of BerriAI/litellm@6c2dcb801b (2026-08-15). Data as JSON: /api/errors/2cfe0ca75908daa8. Report an issue: GitHub.