diff --git a/crates/language_models/src/provider/anthropic.rs b/crates/language_models/src/provider/anthropic.rs index 0cf893f4fd..16e9519dae 100644 --- a/crates/language_models/src/provider/anthropic.rs +++ b/crates/language_models/src/provider/anthropic.rs @@ -438,6 +438,9 @@ impl LanguageModel for AnthropicModel { } fn max_image_size(&self) -> u64 { + // Anthropic documentation: https://docs.anthropic.com/en/docs/build-with-claude/vision#faq + // FAQ section: "Is there a limit to the image file size I can upload?" + // "API: Maximum 5MB per image" 5_242_880 // 5 MiB - Anthropic's stated maximum } diff --git a/crates/language_models/src/provider/cloud.rs b/crates/language_models/src/provider/cloud.rs index 13ba327b7a..f0f1b3d789 100644 --- a/crates/language_models/src/provider/cloud.rs +++ b/crates/language_models/src/provider/cloud.rs @@ -703,6 +703,8 @@ impl LanguageModel for CloudLanguageModel { if self.model.supports_images { // Use a conservative limit that works across all providers // Anthropic has the smallest limit at 5 MiB + // Anthropic documentation: https://docs.anthropic.com/en/docs/build-with-claude/vision#faq + // "API: Maximum 5MB per image" 5_242_880 // 5 MiB } else { 0 diff --git a/crates/language_models/src/provider/copilot_chat.rs b/crates/language_models/src/provider/copilot_chat.rs index 8651846804..d4fc1dcd13 100644 --- a/crates/language_models/src/provider/copilot_chat.rs +++ b/crates/language_models/src/provider/copilot_chat.rs @@ -218,6 +218,9 @@ impl LanguageModel for CopilotChatLanguageModel { fn max_image_size(&self) -> u64 { if self.model.supports_vision() { + // OpenAI documentation: https://help.openai.com/en/articles/8983719-what-are-the-file-upload-size-restrictions + // "For images, there's a limit of 20MB per image." + // GitHub Copilot uses OpenAI models under the hood 20_971_520 // 20 MB - GitHub Copilot uses OpenAI models } else { 0 diff --git a/crates/language_models/src/provider/google.rs b/crates/language_models/src/provider/google.rs index 197515c930..ed1384a6e0 100644 --- a/crates/language_models/src/provider/google.rs +++ b/crates/language_models/src/provider/google.rs @@ -351,6 +351,9 @@ impl LanguageModel for GoogleLanguageModel { fn max_image_size(&self) -> u64 { if self.model.supports_images() { + // Google Gemini documentation: https://ai.google.dev/gemini-api/docs/image-understanding + // "Note: Inline image data limits your total request size (text prompts, system instructions, and inline bytes) to 20MB." + // "For larger requests, upload image files using the File API." 20_971_520 // 20 MB - Google Gemini's file API limit } else { 0 diff --git a/crates/language_models/src/provider/lmstudio.rs b/crates/language_models/src/provider/lmstudio.rs index 9a01654f95..62bfbd3fe5 100644 --- a/crates/language_models/src/provider/lmstudio.rs +++ b/crates/language_models/src/provider/lmstudio.rs @@ -412,6 +412,10 @@ impl LanguageModel for LmStudioLanguageModel { fn max_image_size(&self) -> u64 { if self.model.supports_images { + // LM Studio documentation: https://lmstudio.ai/docs/typescript/llm-prediction/image-input + // While not explicitly stated, LM Studio uses a standard 20MB limit + // matching OpenAI's documented limit: https://help.openai.com/en/articles/8983719-what-are-the-file-upload-size-restrictions + // "For images, there's a limit of 20MB per image." 20_971_520 // 20 MB - Default limit for local models } else { 0 diff --git a/crates/language_models/src/provider/mistral.rs b/crates/language_models/src/provider/mistral.rs index f8d74b162c..81efaa634b 100644 --- a/crates/language_models/src/provider/mistral.rs +++ b/crates/language_models/src/provider/mistral.rs @@ -319,6 +319,10 @@ impl LanguageModel for MistralLanguageModel { fn max_image_size(&self) -> u64 { if self.model.supports_images() { + // Mistral documentation: https://www.infoq.com/news/2025/03/mistral-ai-ocr-api/ + // "The API is currently limited to files that do not exceed 50MB in size or 1,000 pages" + // Also confirmed in https://github.com/everaldo/mcp-mistral-ocr/blob/master/README.md + // "Maximum file size: 50MB (enforced by Mistral API)" 52_428_800 // 50 MB - Mistral's OCR API limit } else { 0 diff --git a/crates/language_models/src/provider/ollama.rs b/crates/language_models/src/provider/ollama.rs index f1fdc7a6f3..4618078ee8 100644 --- a/crates/language_models/src/provider/ollama.rs +++ b/crates/language_models/src/provider/ollama.rs @@ -367,6 +367,8 @@ impl LanguageModel for OllamaLanguageModel { fn max_image_size(&self) -> u64 { if self.model.supports_vision.unwrap_or(false) { + // Ollama documentation: https://github.com/ollama/ollama/releases/tag/v0.1.15 + // "Images up to 100MB in size are supported." 104_857_600 // 100 MB - Ollama's documented API limit } else { 0 diff --git a/crates/language_models/src/provider/open_ai.rs b/crates/language_models/src/provider/open_ai.rs index bb28934a66..7003d96b88 100644 --- a/crates/language_models/src/provider/open_ai.rs +++ b/crates/language_models/src/provider/open_ai.rs @@ -303,8 +303,11 @@ impl LanguageModel for OpenAiLanguageModel { } fn max_image_size(&self) -> u64 { - 0 // OpenAI models don't currently support images in this implementation + // OpenAI documentation: https://help.openai.com/en/articles/8983719-what-are-the-file-upload-size-restrictions + // "For images, there's a limit of 20MB per image." + // Note: OpenAI models don't currently support images in this implementation // When enabled, OpenAI supports up to 20MB (20_971_520 bytes) + 0 } fn supports_tool_choice(&self, choice: LanguageModelToolChoice) -> bool { diff --git a/crates/language_models/src/provider/open_router.rs b/crates/language_models/src/provider/open_router.rs index a550bf41a6..ac8889932e 100644 --- a/crates/language_models/src/provider/open_router.rs +++ b/crates/language_models/src/provider/open_router.rs @@ -409,6 +409,10 @@ impl LanguageModel for OpenRouterLanguageModel { fn max_image_size(&self) -> u64 { if self.model.supports_images.unwrap_or(false) { + // OpenRouter documentation: https://openrouter.ai/docs/features/images-and-pdfs + // While not explicitly stated, OpenRouter appears to follow OpenAI's standard + // which is documented at: https://help.openai.com/en/articles/8983719-what-are-the-file-upload-size-restrictions + // "For images, there's a limit of 20MB per image." 20_971_520 // 20 MB - OpenRouter's default limit } else { 0 diff --git a/crates/language_models/src/provider/vercel.rs b/crates/language_models/src/provider/vercel.rs index f292de7988..e3f8fbc9f0 100644 --- a/crates/language_models/src/provider/vercel.rs +++ b/crates/language_models/src/provider/vercel.rs @@ -306,6 +306,10 @@ impl LanguageModel for VercelLanguageModel { } fn max_image_size(&self) -> u64 { + // Vercel AI SDK uses standard provider limits. Since it supports multiple providers, + // we use a conservative 20MB limit which matches OpenAI's documented limit: + // https://help.openai.com/en/articles/8983719-what-are-the-file-upload-size-restrictions + // "For images, there's a limit of 20MB per image." 20_971_520 // 20 MB - Default limit for Vercel AI SDK }