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
- Install Pillow in the environment running LiteLLM: `pip install Pillow`.
- Or pre-convert images to JPEG/PNG base64 yourself before passing them, avoiding the conversion path.
- 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
- Add Pillow to project dependencies when using vision models
- Pre-convert images to JPEG/PNG base64 in your ingestion step
- Fail fast at startup on missing optional deps instead of mid-request
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
- image conversion failed please run `pip install Pillow`
- gemini image conversion failed please run `pip install Pillo
- Unable to determine content type from URL: {url}. Response c
- Please install litellm with `litellm[caching]` to use disk c
- Invalid image URL: {content_image_url}
AI-assisted analysis of BerriAI/litellm@6c2dcb801b (2026-08-15).
Data as JSON: /api/errors/2cfe0ca75908daa8.
Report an issue: GitHub.