From 4ab53c07264676ad53a7fdd3f7bcec238a034336 Mon Sep 17 00:00:00 2001 From: Greyson LaLonde Date: Fri, 23 Jan 2026 01:57:29 -0500 Subject: [PATCH] feat(files): add file_id upload support and text file handling - Add VCR patch for binary request bodies (base64 encoding fallback) - Add generate_filename() utility for UUID-based filenames with extension - Add OpenAIResponsesFormatter for Responses API (input_image, input_file) - Fix OpenAI uploader to use 'vision' purpose for images - Fix Anthropic uploader to use tuple format (filename, content, content_type) - Add TextConstraints and text support for Gemini - Add file_id upload integration tests for Anthropic and OpenAI Responses API --- conftest.py | 21 ++ .../src/crewai_files/cache/metrics.py | 2 +- .../src/crewai_files/core/sources.py | 15 ++ .../src/crewai_files/formatting/__init__.py | 2 + .../src/crewai_files/formatting/api.py | 5 + .../src/crewai_files/formatting/openai.py | 89 ++++++++ .../crewai_files/processing/constraints.py | 41 ++++ .../src/crewai_files/uploaders/anthropic.py | 28 +-- .../src/crewai_files/uploaders/openai.py | 50 +++-- ...tion.test_describe_image_with_file_id.yaml | 179 +++++++++++++++ ...dalIntegration.test_analyze_text_file.yaml | 26 +-- ...gration.test_generic_file_text_gemini.yaml | 67 ++++++ ...tion.test_describe_image_with_file_id.yaml | 204 ++++++++++++++++++ .../tests/llms/test_multimodal_integration.py | 148 +++++++++++++ 14 files changed, 833 insertions(+), 44 deletions(-) create mode 100644 lib/crewai/tests/cassettes/llms/TestAnthropicFileUploadIntegration.test_describe_image_with_file_id.yaml create mode 100644 lib/crewai/tests/cassettes/llms/TestGenericFileIntegration.test_generic_file_text_gemini.yaml create mode 100644 lib/crewai/tests/cassettes/llms/TestOpenAIResponsesFileUploadIntegration.test_describe_image_with_file_id.yaml diff --git a/conftest.py b/conftest.py index e5e49a2ed..50392e10d 100644 --- a/conftest.py +++ b/conftest.py @@ -1,5 +1,6 @@ """Pytest configuration for crewAI workspace.""" +import base64 from collections.abc import Generator import gzip import os @@ -10,6 +11,7 @@ from typing import Any from dotenv import load_dotenv import pytest from vcr.request import Request # type: ignore[import-untyped] +import vcr.stubs.httpx_stubs as httpx_stubs # type: ignore[import-untyped] env_test_path = Path(__file__).parent / ".env.test" @@ -17,6 +19,25 @@ load_dotenv(env_test_path, override=True) load_dotenv(override=True) +def _patched_make_vcr_request(httpx_request: Any, **kwargs: Any) -> Any: + """Patched version of VCR's _make_vcr_request that handles binary content. + + The original implementation fails on binary request bodies (like file uploads) + because it assumes all content can be decoded as UTF-8. + """ + raw_body = httpx_request.read() + try: + body = raw_body.decode("utf-8") + except UnicodeDecodeError: + body = base64.b64encode(raw_body).decode("ascii") + uri = str(httpx_request.url) + headers = dict(httpx_request.headers) + return Request(httpx_request.method, uri, body, headers) + + +httpx_stubs._make_vcr_request = _patched_make_vcr_request + + @pytest.fixture(autouse=True, scope="function") def cleanup_event_handlers() -> Generator[None, Any, None]: """Clean up event bus handlers after each test to prevent test pollution.""" diff --git a/lib/crewai-files/src/crewai_files/cache/metrics.py b/lib/crewai-files/src/crewai_files/cache/metrics.py index fa20d7e20..50dc02f58 100644 --- a/lib/crewai-files/src/crewai_files/cache/metrics.py +++ b/lib/crewai-files/src/crewai_files/cache/metrics.py @@ -54,7 +54,7 @@ class FileOperationMetrics: } if self.filename: - result["filename"] = self.filename + result["file_name"] = self.filename if self.provider: result["provider"] = self.provider if self.size_bytes is not None: diff --git a/lib/crewai-files/src/crewai_files/core/sources.py b/lib/crewai-files/src/crewai_files/core/sources.py index 3aaccf70e..d2df10f56 100644 --- a/lib/crewai-files/src/crewai_files/core/sources.py +++ b/lib/crewai-files/src/crewai_files/core/sources.py @@ -64,6 +64,21 @@ def _fallback_content_type(filename: str | None) -> str: return "application/octet-stream" +def generate_filename(content_type: str) -> str: + """Generate a UUID-based filename with extension from content type. + + Args: + content_type: MIME type to derive extension from. + + Returns: + Filename in format "{uuid}{ext}" where ext includes the dot. + """ + import uuid + + ext = mimetypes.guess_extension(content_type) or "" + return f"{uuid.uuid4()}{ext}" + + def detect_content_type(data: bytes, filename: str | None = None) -> str: """Detect MIME type from file content. diff --git a/lib/crewai-files/src/crewai_files/formatting/__init__.py b/lib/crewai-files/src/crewai_files/formatting/__init__.py index 3c41bac49..3f2bd7432 100644 --- a/lib/crewai-files/src/crewai_files/formatting/__init__.py +++ b/lib/crewai-files/src/crewai_files/formatting/__init__.py @@ -4,9 +4,11 @@ from crewai_files.formatting.api import ( aformat_multimodal_content, format_multimodal_content, ) +from crewai_files.formatting.openai import OpenAIResponsesFormatter __all__ = [ + "OpenAIResponsesFormatter", "aformat_multimodal_content", "format_multimodal_content", ] diff --git a/lib/crewai-files/src/crewai_files/formatting/api.py b/lib/crewai-files/src/crewai_files/formatting/api.py index 861b8e442..a3cd02185 100644 --- a/lib/crewai-files/src/crewai_files/formatting/api.py +++ b/lib/crewai-files/src/crewai_files/formatting/api.py @@ -186,6 +186,11 @@ def _get_supported_types( supported.append("audio/") if constraints.video is not None: supported.append("video/") + if constraints.text is not None: + supported.append("text/") + supported.append("application/json") + supported.append("application/xml") + supported.append("application/x-yaml") return supported diff --git a/lib/crewai-files/src/crewai_files/formatting/openai.py b/lib/crewai-files/src/crewai_files/formatting/openai.py index 17312b208..c8e1340fa 100644 --- a/lib/crewai-files/src/crewai_files/formatting/openai.py +++ b/lib/crewai-files/src/crewai_files/formatting/openai.py @@ -14,6 +14,95 @@ from crewai_files.core.resolved import ( ) +class OpenAIResponsesFormatter: + """Formats resolved files into OpenAI Responses API content blocks. + + The Responses API uses a different format than Chat Completions: + - Images use `type: "input_image"` with `file_id` or `image_url` + - PDFs use `type: "input_file"` with `file_id`, `file_url`, or `file_data` + """ + + @staticmethod + def format_block(resolved: ResolvedFileType, content_type: str) -> dict[str, Any]: + """Format a resolved file into an OpenAI Responses API content block. + + Args: + resolved: Resolved file. + content_type: MIME type of the file. + + Returns: + Content block dict. + + Raises: + TypeError: If resolved type is not supported. + """ + is_image = content_type.startswith("image/") + is_pdf = content_type == "application/pdf" + + if isinstance(resolved, FileReference): + if is_image: + return { + "type": "input_image", + "file_id": resolved.file_id, + } + if is_pdf: + return { + "type": "input_file", + "file_id": resolved.file_id, + } + raise TypeError( + f"Unsupported content type for Responses API: {content_type}" + ) + + if isinstance(resolved, UrlReference): + if is_image: + return { + "type": "input_image", + "image_url": resolved.url, + } + if is_pdf: + return { + "type": "input_file", + "file_url": resolved.url, + } + raise TypeError( + f"Unsupported content type for Responses API: {content_type}" + ) + + if isinstance(resolved, InlineBase64): + if is_image: + return { + "type": "input_image", + "image_url": f"data:{resolved.content_type};base64,{resolved.data}", + } + if is_pdf: + return { + "type": "input_file", + "file_data": f"data:{resolved.content_type};base64,{resolved.data}", + } + raise TypeError( + f"Unsupported content type for Responses API: {content_type}" + ) + + if isinstance(resolved, InlineBytes): + data = base64.b64encode(resolved.data).decode("ascii") + if is_image: + return { + "type": "input_image", + "image_url": f"data:{resolved.content_type};base64,{data}", + } + if is_pdf: + return { + "type": "input_file", + "file_data": f"data:{resolved.content_type};base64,{data}", + } + raise TypeError( + f"Unsupported content type for Responses API: {content_type}" + ) + + raise TypeError(f"Unexpected resolved type: {type(resolved).__name__}") + + class OpenAIFormatter: """Formats resolved files into OpenAI content blocks.""" diff --git a/lib/crewai-files/src/crewai_files/processing/constraints.py b/lib/crewai-files/src/crewai_files/processing/constraints.py index e9f68341a..bdd1cba9c 100644 --- a/lib/crewai-files/src/crewai_files/processing/constraints.py +++ b/lib/crewai-files/src/crewai_files/processing/constraints.py @@ -7,6 +7,7 @@ from typing import Literal from crewai_files.core.types import ( AudioMimeType, ImageMimeType, + TextContentType, VideoMimeType, ) @@ -72,6 +73,27 @@ GEMINI_VIDEO_FORMATS: tuple[VideoMimeType, ...] = ( "video/x-flv", ) +DEFAULT_TEXT_FORMATS: tuple[TextContentType, ...] = ( + "text/plain", + "text/markdown", + "text/csv", + "application/json", + "text/xml", + "text/html", +) + +GEMINI_TEXT_FORMATS: tuple[TextContentType, ...] = ( + "text/plain", + "text/markdown", + "text/csv", + "application/json", + "application/xml", + "text/xml", + "application/x-yaml", + "text/yaml", + "text/html", +) + @dataclass(frozen=True) class ImageConstraints: @@ -135,6 +157,19 @@ class VideoConstraints: supported_formats: tuple[VideoMimeType, ...] = DEFAULT_VIDEO_FORMATS +@dataclass(frozen=True) +class TextConstraints: + """Constraints for text files. + + Attributes: + max_size_bytes: Maximum file size in bytes. + supported_formats: Supported text MIME types. + """ + + max_size_bytes: int + supported_formats: tuple[TextContentType, ...] = DEFAULT_TEXT_FORMATS + + @dataclass(frozen=True) class ProviderConstraints: """Complete set of constraints for a provider. @@ -145,6 +180,7 @@ class ProviderConstraints: pdf: PDF file constraints. audio: Audio file constraints. video: Video file constraints. + text: Text file constraints. general_max_size_bytes: Maximum size for any file type. supports_file_upload: Whether the provider supports file upload APIs. file_upload_threshold_bytes: Size threshold above which to use file upload. @@ -156,6 +192,7 @@ class ProviderConstraints: pdf: PDFConstraints | None = None audio: AudioConstraints | None = None video: VideoConstraints | None = None + text: TextConstraints | None = None general_max_size_bytes: int | None = None supports_file_upload: bool = False file_upload_threshold_bytes: int | None = None @@ -213,6 +250,10 @@ GEMINI_CONSTRAINTS = ProviderConstraints( max_duration_seconds=3600, # 1 hour at default resolution supported_formats=GEMINI_VIDEO_FORMATS, ), + text=TextConstraints( + max_size_bytes=104_857_600, + supported_formats=GEMINI_TEXT_FORMATS, + ), supports_file_upload=True, file_upload_threshold_bytes=20_971_520, supports_url_references=True, diff --git a/lib/crewai-files/src/crewai_files/uploaders/anthropic.py b/lib/crewai-files/src/crewai_files/uploaders/anthropic.py index f1e8fd2ff..fdba93974 100644 --- a/lib/crewai-files/src/crewai_files/uploaders/anthropic.py +++ b/lib/crewai-files/src/crewai_files/uploaders/anthropic.py @@ -2,11 +2,11 @@ from __future__ import annotations -import io import logging import os from typing import Any +from crewai_files.core.sources import generate_filename from crewai_files.core.types import FileInput from crewai_files.processing.exceptions import classify_upload_error from crewai_files.uploaders.base import FileUploader, UploadResult @@ -91,17 +91,14 @@ class AnthropicFileUploader(FileUploader): client = self._get_client() content = file.read() - file_purpose = purpose or "user_upload" - - file_data = io.BytesIO(content) logger.info( f"Uploading file '{file.filename}' to Anthropic ({len(content)} bytes)" ) - uploaded_file = client.files.create( - file=(file.filename, file_data, file.content_type), - purpose=file_purpose, + filename = file.filename or generate_filename(file.content_type) + uploaded_file = client.beta.files.upload( + file=(filename, content, file.content_type), ) logger.info(f"Uploaded to Anthropic: {uploaded_file.id}") @@ -129,7 +126,7 @@ class AnthropicFileUploader(FileUploader): """ try: client = self._get_client() - client.files.delete(file_id=file_id) + client.beta.files.delete(file_id=file_id) logger.info(f"Deleted Anthropic file: {file_id}") return True except Exception as e: @@ -147,7 +144,7 @@ class AnthropicFileUploader(FileUploader): """ try: client = self._get_client() - file_info = client.files.retrieve(file_id=file_id) + file_info = client.beta.files.retrieve(file_id=file_id) return { "id": file_info.id, "filename": file_info.filename, @@ -167,7 +164,7 @@ class AnthropicFileUploader(FileUploader): """ try: client = self._get_client() - files = client.files.list() + files = client.beta.files.list() return [ { "id": f.id, @@ -202,17 +199,14 @@ class AnthropicFileUploader(FileUploader): client = self._get_async_client() content = await file.aread() - file_purpose = purpose or "user_upload" - - file_data = io.BytesIO(content) logger.info( f"Uploading file '{file.filename}' to Anthropic ({len(content)} bytes)" ) - uploaded_file = await client.files.create( - file=(file.filename, file_data, file.content_type), - purpose=file_purpose, + filename = file.filename or generate_filename(file.content_type) + uploaded_file = await client.beta.files.upload( + file=(filename, content, file.content_type), ) logger.info(f"Uploaded to Anthropic: {uploaded_file.id}") @@ -240,7 +234,7 @@ class AnthropicFileUploader(FileUploader): """ try: client = self._get_async_client() - await client.files.delete(file_id=file_id) + await client.beta.files.delete(file_id=file_id) logger.info(f"Deleted Anthropic file: {file_id}") return True except Exception as e: diff --git a/lib/crewai-files/src/crewai_files/uploaders/openai.py b/lib/crewai-files/src/crewai_files/uploaders/openai.py index 8a6f976b5..fc1600a1d 100644 --- a/lib/crewai-files/src/crewai_files/uploaders/openai.py +++ b/lib/crewai-files/src/crewai_files/uploaders/openai.py @@ -9,7 +9,7 @@ import os from typing import Any from crewai_files.core.constants import DEFAULT_UPLOAD_CHUNK_SIZE, FILES_API_MAX_SIZE -from crewai_files.core.sources import FileBytes, FilePath, FileStream +from crewai_files.core.sources import FileBytes, FilePath, FileStream, generate_filename from crewai_files.core.types import FileInput from crewai_files.processing.exceptions import ( PermanentUploadError, @@ -22,6 +22,27 @@ from crewai_files.uploaders.base import FileUploader, UploadResult logger = logging.getLogger(__name__) +def _get_purpose_for_content_type(content_type: str, purpose: str | None) -> str: + """Get the appropriate purpose for a file based on content type. + + OpenAI Files API requires different purposes for different file types: + - Images (for Responses API vision): "vision" + - PDFs and other documents: "user_data" + + Args: + content_type: MIME type of the file. + purpose: Optional explicit purpose override. + + Returns: + The purpose string to use for upload. + """ + if purpose is not None: + return purpose + if content_type.startswith("image/"): + return "vision" + return "user_data" + + def _get_file_size(file: FileInput) -> int | None: """Get file size without reading content if possible. @@ -219,13 +240,14 @@ class OpenAIFileUploader(FileUploader): UploadResult with the file ID and metadata. """ client = self._get_client() - file_purpose = purpose or "user_data" + file_purpose = _get_purpose_for_content_type(file.content_type, purpose) + filename = file.filename or generate_filename(file.content_type) file_data = io.BytesIO(content) - file_data.name = file.filename or "file" + file_data.name = filename logger.info( - f"Uploading file '{file.filename}' to OpenAI Files API ({len(content)} bytes)" + f"Uploading file '{filename}' to OpenAI Files API ({len(content)} bytes)" ) uploaded_file = client.files.create( @@ -254,8 +276,8 @@ class OpenAIFileUploader(FileUploader): UploadResult with the file ID and metadata. """ client = self._get_client() - file_purpose = purpose or "user_data" - filename = file.filename or "file" + file_purpose = _get_purpose_for_content_type(file.content_type, purpose) + filename = file.filename or generate_filename(file.content_type) file_size = len(content) logger.info( @@ -329,8 +351,8 @@ class OpenAIFileUploader(FileUploader): UploadResult with the file ID and metadata. """ client = self._get_client() - file_purpose = purpose or "user_data" - filename = file.filename or "file" + file_purpose = _get_purpose_for_content_type(file.content_type, purpose) + filename = file.filename or generate_filename(file.content_type) logger.info( f"Uploading file '{filename}' to OpenAI Uploads API (streaming) " @@ -496,10 +518,10 @@ class OpenAIFileUploader(FileUploader): UploadResult with the file ID and metadata. """ client = self._get_async_client() - file_purpose = purpose or "user_data" + file_purpose = _get_purpose_for_content_type(file.content_type, purpose) file_data = io.BytesIO(content) - file_data.name = file.filename or "file" + file_data.name = file.filename or generate_filename(file.content_type) logger.info( f"Uploading file '{file.filename}' to OpenAI Files API ({len(content)} bytes)" @@ -531,8 +553,8 @@ class OpenAIFileUploader(FileUploader): UploadResult with the file ID and metadata. """ client = self._get_async_client() - file_purpose = purpose or "user_data" - filename = file.filename or "file" + file_purpose = _get_purpose_for_content_type(file.content_type, purpose) + filename = file.filename or generate_filename(file.content_type) file_size = len(content) logger.info( @@ -606,8 +628,8 @@ class OpenAIFileUploader(FileUploader): UploadResult with the file ID and metadata. """ client = self._get_async_client() - file_purpose = purpose or "user_data" - filename = file.filename or "file" + file_purpose = _get_purpose_for_content_type(file.content_type, purpose) + filename = file.filename or generate_filename(file.content_type) logger.info( f"Uploading file '{filename}' to OpenAI Uploads API (streaming) " diff --git a/lib/crewai/tests/cassettes/llms/TestAnthropicFileUploadIntegration.test_describe_image_with_file_id.yaml b/lib/crewai/tests/cassettes/llms/TestAnthropicFileUploadIntegration.test_describe_image_with_file_id.yaml new file mode 100644 index 000000000..1aaf9831b --- /dev/null +++ b/lib/crewai/tests/cassettes/llms/TestAnthropicFileUploadIntegration.test_describe_image_with_file_id.yaml @@ -0,0 +1,179 @@ +interactions: +- request: + body: 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GXZhMlw5/t4hi8XCqVOnCAwMxGQyFerYaWlpREREcOLECYKCggp17OJA/Tk+Z+9R/Tk+Z+9R/d0+wzBIT0+nXLlyuLm55rvhdAbwDri5uVGhQoUiPUZQUJBTvrCvUH+Oz9l7VH+Oz9l7VH+3x1XP/F3hmrFXRERExIUpAIqIiIi4GAXAYsrb25uxY8fi7e1t71KKhPpzfM7eo/pzfM7eo/qTO6GLQERERERcjM4AioiIiLgYBUARERERF6MAKCIiIuJiFABFREREXIwC4B146623aNq0KYGBgYSGhtK9e3f27duXb5+srCyio6MpVaoUAQEB9OjRg+TkZOv27du306dPHyIiIvD19aV27dpMnTr1qmOtXr2aJk2a4O3tTfXq1Zk1a9YN69uxYwf3338/Pj4+RERE8M477zhVj0ePHsVkMl31tXHjxmLX3+nTp4mKiqJGjRq4ubnx73//+6bqO378OF26dMHPz4/Q0FBGjhxJbm7uTffnCD0W9BzOnTu32PW3aNEiOnToQJkyZQgKCqJly5asXLnyhvXd6euwOPdXGK9BW/a4fv167rvvPkqVKoWvry+1atXi/fffv2F9jvIc3k5/jvR79O9+/fVXPDw8aNSo0Q3rK4y/hU7JkNvWsWNHY+bMmcauXbuMxMRE46GHHjIqVqxoZGRkWPd57rnnjIiICOPnn382tmzZYrRo0cK49957rds///xz44UXXjBWr15tHDp0yPj6668NX19fY/r06dZ9Dh8+bPj5+RnDhw839uzZY0yfPt1wd3c3VqxYcc3aUlNTjbCwMKNv377Grl27jDlz5hi+vr7GJ5984jQ9HjlyxACMn376yTh9+rT1Kycnp9j1d+TIEeOFF14wvvzyS6NRo0bGiy++eMPacnNzjXr16hnt27c3tm3bZixfvtwoXbq0MXr06Jvur7j3aBiGARgzZ87M9xxevny52PX34osvGm+//bbx+++/G/v37zdGjx5teHp6GgkJCdesrTBeh8W5v8J4Ddqyx4SEBCMuLs7YtWuXceTIEePrr782/Pz8rvt8ONJzeDv9OdLv0SsuXrxoVK1a1YiMjDQaNmx43doK62+hM1IALERnzpwxAGPNmjWGYRhGSkqK4enpacyfP9+6z969ew3A2LBhwzXHef755422bdtal19++WWjbt26+fbp1auX0bFjx2uO8eGH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+GG+nzdHfg5vpz9H+z36dwUFwKL6W+iMTIZxB/dbEBERERGHo4tARERERFyMAqCIiIiIi1EAFBEREXExCoAiIiIiLkYBUERERMTFKACKiIiIuBgFQBEREREXowAoIiIi4mIUAEXEqRmGQfv27enYseNV2z788ENKlCjByZMn7VCZiIj9KACKiFMzmUzMnDmTTZs28cknn1jXHzlyhJdffpnp06dToUKFQj2m2Wwu1PFERAqbAqCIOL2IiAimTp3KiBEjOHLkCIZhMGjQICIjI2ncuDGdO3cmICCAsLAwnnzySc6dO2d97IoVK2jVqhUlSpSgVKlSPPzwwxw6dMi6/ejRo5hMJubNm0fr1q3x8fFh9uzZ9mhTROSm6bOARcRldO/endTUVB577DEmTpzI7t27qVu3Ls888wxPPfUUly9fZtSoUeTm5vLLL78AsHDhQkwmEw0aNCAjI4MxY8Zw9OhREhMTcXNz4+jRo1SpUoXKlSvz3nvv0bhxY3x8fChbtqyduxURuTYFQBFxGWfOnKFu3bpcuHCBhQsXsmvXLtatW8fKlSut+5w8eZKIiAj27dtHjRo1rhrj3LlzlClThp07d1KvXj1rAPzggw948cUXbdmOiMht0xSwiLiM0NBQ/vWvf1G7dm26d+/O9u3bWbVqFQEBAdavWrVqAVineQ8cOECfPn2oWrUqQUFBVK5cGYDjx4/nG/uee+6xaS8iInfCw94FiIjYkoeHBx4ef/3qy8jIoGvXrrz99ttX7XdlCrdr165UqlSJzz77jHLlymGxWKhXrx45OTn59vf39y/64kVECokCoIi4rCZNmrBw4UIqV65sDYV/d/78efbt28dnn33G/fffD8D69ettXaaISKHTFLCIuKzo6GguXLhAnz592Lx5M4cOHWLlypUMHDiQvLw8SpYsSalSpfj00085ePAgv/zyC8OHD7d32SIid0wBUERcVrly5fj111/Jy8sjMjKS+vXr8+9//5sSJUrg5uaGm5sbc+fOZevWrdSrV49hw4YxefJke5ctInLHdBWwiIiIiIvRGUARERERF6MAKCIiIuJiFABFREREXIwCoIiIiIiLUQAUERERcTEKgCIiIiIuRgFQRERExMUoAIqIiIi4GAVAERERERejACgiIiLiYhQARURERFyMAqCIiIiIi/n/AKLZeyypu2ZCAAAAAElFTkSuQmCCDQotLTY0Y2RhZjczNWQzNDE1ODI3YmM2ZmM0ZTYyYWE2ZDJmLS0NCg== + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + anthropic-beta: + - files-api-2025-04-14 + anthropic-version: + - '2023-06-01' + connection: + - keep-alive + content-length: + - '27946' + content-type: + - multipart/form-data; boundary=64cdaf735d3415827bc6fc4e62aa6d2f + host: + - api.anthropic.com + x-api-key: + - X-API-KEY-XXX + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 0.71.1 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + x-stainless-timeout: + - NOT_GIVEN + method: POST + uri: https://api.anthropic.com/v1/files?beta=true + response: + body: + string: '{"type":"file","id":"file_011CXPoRmVQC8wQiCnmgu2M7","size_bytes":27749,"created_at":"2026-01-23T06:01:38.323000Z","filename":"346208a0-d072-48ff-b866-76b3183fa6e1","mime_type":"image/png","downloadable":false}' + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Fri, 23 Jan 2026 06:01:38 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + anthropic-organization-id: + - ANTHROPIC-ORGANIZATION-ID-XXX + cf-cache-status: + - DYNAMIC + request-id: + - REQUEST-ID-XXX + strict-transport-security: + - STS-XXX + x-envoy-upstream-service-time: + - '403' + status: + code: 200 + message: OK +- request: + body: '{"max_tokens":4096,"messages":[{"role":"user","content":[{"type":"text","text":"Describe + this image in one sentence. Be brief."},{"type":"image","source":{"type":"file","file_id":"file_011CXPoRmVQC8wQiCnmgu2M7"},"cache_control":{"type":"ephemeral"}}]}],"model":"claude-3-5-haiku-20241022","stream":false}' + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + anthropic-beta: + - files-api-2025-04-14 + anthropic-version: + - '2023-06-01' + connection: + - keep-alive + content-length: + - '304' + content-type: + - application/json + host: + - api.anthropic.com + x-api-key: + - X-API-KEY-XXX + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 0.71.1 + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + x-stainless-timeout: + - NOT_GIVEN + method: POST + uri: https://api.anthropic.com/v1/messages?beta=true + response: + body: + string: '{"model":"claude-3-5-haiku-20241022","id":"msg_014qnQm57QYHem7heFXAEqgW","type":"message","role":"assistant","content":[{"type":"text","text":"The + graph shows a steady, linear increase in revenue from 2020 to 2024, rising + from around $100 to nearly $300."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":453,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":34,"service_tier":"standard"}}' + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Fri, 23 Jan 2026 06:01:40 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + anthropic-organization-id: + - ANTHROPIC-ORGANIZATION-ID-XXX + anthropic-ratelimit-input-tokens-limit: + - ANTHROPIC-RATELIMIT-INPUT-TOKENS-LIMIT-XXX + anthropic-ratelimit-input-tokens-remaining: + - ANTHROPIC-RATELIMIT-INPUT-TOKENS-REMAINING-XXX + anthropic-ratelimit-input-tokens-reset: + - ANTHROPIC-RATELIMIT-INPUT-TOKENS-RESET-XXX + anthropic-ratelimit-output-tokens-limit: + - ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-LIMIT-XXX + anthropic-ratelimit-output-tokens-remaining: + - ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-REMAINING-XXX + anthropic-ratelimit-output-tokens-reset: + - ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-RESET-XXX + anthropic-ratelimit-requests-limit: + - '4000' + anthropic-ratelimit-requests-remaining: + - '3999' + anthropic-ratelimit-requests-reset: + - '2026-01-23T06:01:38Z' + anthropic-ratelimit-tokens-limit: + - ANTHROPIC-RATELIMIT-TOKENS-LIMIT-XXX + anthropic-ratelimit-tokens-remaining: + - ANTHROPIC-RATELIMIT-TOKENS-REMAINING-XXX + anthropic-ratelimit-tokens-reset: + - ANTHROPIC-RATELIMIT-TOKENS-RESET-XXX + cf-cache-status: + - DYNAMIC + request-id: + - REQUEST-ID-XXX + strict-transport-security: + - STS-XXX + x-envoy-upstream-service-time: + - '1692' + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_text_file.yaml b/lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_text_file.yaml index 336497452..bfd591b14 100644 --- a/lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_text_file.yaml +++ b/lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_text_file.yaml @@ -1,7 +1,8 @@ interactions: - request: body: '{"contents": [{"parts": [{"text": "Summarize what this text file says in - one sentence."}], "role": "user"}], "generationConfig": {}}' + one sentence."}, {"inlineData": {"data": "UmV2aWV3IEd1aWRlbGluZXMKCjEuIEJlIGNsZWFyIGFuZCBjb25jaXNlOiBXcml0ZSBmZWVkYmFjayB0aGF0IGlzIGVhc3kgdG8gdW5kZXJzdGFuZC4KMi4gRm9jdXMgb24gYmVoYXZpb3IgYW5kIG91dGNvbWVzOiBEZXNjcmliZSB3aGF0IGhhcHBlbmVkIGFuZCB3aHkgaXQgbWF0dGVycy4KMy4gQmUgc3BlY2lmaWM6IFByb3ZpZGUgZXhhbXBsZXMgdG8gc3VwcG9ydCB5b3VyIHBvaW50cy4KNC4gQmFsYW5jZSBwb3NpdGl2ZXMgYW5kIGltcHJvdmVtZW50czogSGlnaGxpZ2h0IHN0cmVuZ3RocyBhbmQgYXJlYXMgdG8gZ3Jvdy4KNS4gQmUgcmVzcGVjdGZ1bCBhbmQgY29uc3RydWN0aXZlOiBBc3N1bWUgcG9zaXRpdmUgaW50ZW50IGFuZCBvZmZlciBzb2x1dGlvbnMuCjYuIFVzZSBvYmplY3RpdmUgY3JpdGVyaWE6IFJlZmVyZW5jZSBnb2FscywgbWV0cmljcywgb3IgZXhwZWN0YXRpb25zIHdoZXJlIHBvc3NpYmxlLgo3LiBTdWdnZXN0IG5leHQgc3RlcHM6IFJlY29tbWVuZCBhY3Rpb25hYmxlIHdheXMgdG8gaW1wcm92ZS4KOC4gUHJvb2ZyZWFkOiBDaGVjayB0b25lLCBncmFtbWFyLCBhbmQgY2xhcml0eSBiZWZvcmUgc3VibWl0dGluZy4K", + "mimeType": "text/plain"}}], "role": "user"}], "generationConfig": {}}' headers: User-Agent: - X-USER-AGENT-XXX @@ -12,7 +13,7 @@ interactions: connection: - keep-alive content-length: - - '132' + - '976' content-type: - application/json host: @@ -26,27 +27,28 @@ interactions: response: body: string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"text\": \"Please provide the text file so I - can summarize it for you. I need the content of the file to be able to understand - and summarize it in one sentence.\\n\"\n }\n ],\n \"role\": + [\n {\n \"text\": \"The text file outlines guidelines + for providing effective feedback, emphasizing clarity, specificity, a balance + of positive and constructive criticism, respect, objectivity, actionable suggestions, + and careful proofreading.\\n\"\n }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": \"STOP\",\n \"avgLogprobs\": - -0.17782547979643851\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": - 11,\n \"candidatesTokenCount\": 33,\n \"totalTokenCount\": 44,\n \"promptTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 11\n + -0.17109338442484537\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": + 136,\n \"candidatesTokenCount\": 36,\n \"totalTokenCount\": 172,\n \"promptTokensDetails\": + [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 136\n \ }\n ],\n \"candidatesTokensDetails\": [\n {\n \"modality\": - \"TEXT\",\n \"tokenCount\": 33\n }\n ]\n },\n \"modelVersion\": - \"gemini-2.0-flash\",\n \"responseId\": \"b-dyabKwN8a9jrEP7JT1yAo\"\n}\n" + \"TEXT\",\n \"tokenCount\": 36\n }\n ]\n },\n \"modelVersion\": + \"gemini-2.0-flash\",\n \"responseId\": \"wxZzaYaiGYG2_uMPtMjFiAw\"\n}\n" headers: Alt-Svc: - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Type: - application/json; charset=UTF-8 Date: - - Fri, 23 Jan 2026 03:13:52 GMT + - Fri, 23 Jan 2026 06:35:48 GMT Server: - scaffolding on HTTPServer2 Server-Timing: - - gfet4t7; dur=631 + - gfet4t7; dur=675 Transfer-Encoding: - chunked Vary: diff --git a/lib/crewai/tests/cassettes/llms/TestGenericFileIntegration.test_generic_file_text_gemini.yaml b/lib/crewai/tests/cassettes/llms/TestGenericFileIntegration.test_generic_file_text_gemini.yaml new file mode 100644 index 000000000..dff2b3be0 --- /dev/null +++ b/lib/crewai/tests/cassettes/llms/TestGenericFileIntegration.test_generic_file_text_gemini.yaml @@ -0,0 +1,67 @@ +interactions: +- request: + body: '{"contents": [{"parts": [{"text": "Summarize what this text says in one + sentence."}, {"inlineData": {"data": "UmV2aWV3IEd1aWRlbGluZXMKCjEuIEJlIGNsZWFyIGFuZCBjb25jaXNlOiBXcml0ZSBmZWVkYmFjayB0aGF0IGlzIGVhc3kgdG8gdW5kZXJzdGFuZC4KMi4gRm9jdXMgb24gYmVoYXZpb3IgYW5kIG91dGNvbWVzOiBEZXNjcmliZSB3aGF0IGhhcHBlbmVkIGFuZCB3aHkgaXQgbWF0dGVycy4KMy4gQmUgc3BlY2lmaWM6IFByb3ZpZGUgZXhhbXBsZXMgdG8gc3VwcG9ydCB5b3VyIHBvaW50cy4KNC4gQmFsYW5jZSBwb3NpdGl2ZXMgYW5kIGltcHJvdmVtZW50czogSGlnaGxpZ2h0IHN0cmVuZ3RocyBhbmQgYXJlYXMgdG8gZ3Jvdy4KNS4gQmUgcmVzcGVjdGZ1bCBhbmQgY29uc3RydWN0aXZlOiBBc3N1bWUgcG9zaXRpdmUgaW50ZW50IGFuZCBvZmZlciBzb2x1dGlvbnMuCjYuIFVzZSBvYmplY3RpdmUgY3JpdGVyaWE6IFJlZmVyZW5jZSBnb2FscywgbWV0cmljcywgb3IgZXhwZWN0YXRpb25zIHdoZXJlIHBvc3NpYmxlLgo3LiBTdWdnZXN0IG5leHQgc3RlcHM6IFJlY29tbWVuZCBhY3Rpb25hYmxlIHdheXMgdG8gaW1wcm92ZS4KOC4gUHJvb2ZyZWFkOiBDaGVjayB0b25lLCBncmFtbWFyLCBhbmQgY2xhcml0eSBiZWZvcmUgc3VibWl0dGluZy4K", + "mimeType": "text/plain"}}], "role": "user"}], "generationConfig": {}}' + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - '*/*' + accept-encoding: + - ACCEPT-ENCODING-XXX + connection: + - keep-alive + content-length: + - '971' + content-type: + - application/json + host: + - generativelanguage.googleapis.com + x-goog-api-client: + - google-genai-sdk/1.49.0 gl-python/3.12.10 + x-goog-api-key: + - X-GOOG-API-KEY-XXX + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent + response: + body: + string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": + [\n {\n \"text\": \"Effective review feedback should be + clear, specific, balanced, respectful, and constructive, focusing on behaviors + and outcomes with examples, objective criteria, and suggested next steps, + ensuring it is proofread for clarity.\\n\"\n }\n ],\n \"role\": + \"model\"\n },\n \"finishReason\": \"STOP\",\n \"avgLogprobs\": + -0.35489303309743\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": + 135,\n \"candidatesTokenCount\": 41,\n \"totalTokenCount\": 176,\n \"promptTokensDetails\": + [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 135\n + \ }\n ],\n \"candidatesTokensDetails\": [\n {\n \"modality\": + \"TEXT\",\n \"tokenCount\": 41\n }\n ]\n },\n \"modelVersion\": + \"gemini-2.0-flash\",\n \"responseId\": \"xBZzaY2tCsa9jrEP7JT1yAo\"\n}\n" + headers: + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + Content-Type: + - application/json; charset=UTF-8 + Date: + - Fri, 23 Jan 2026 06:35:48 GMT + Server: + - scaffolding on HTTPServer2 + Server-Timing: + - gfet4t7; dur=732 + Transfer-Encoding: + - chunked + Vary: + - Origin + - X-Origin + - Referer + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + X-Frame-Options: + - X-FRAME-OPTIONS-XXX + X-XSS-Protection: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/llms/TestOpenAIResponsesFileUploadIntegration.test_describe_image_with_file_id.yaml b/lib/crewai/tests/cassettes/llms/TestOpenAIResponsesFileUploadIntegration.test_describe_image_with_file_id.yaml new file mode 100644 index 000000000..1dac9af37 --- /dev/null +++ b/lib/crewai/tests/cassettes/llms/TestOpenAIResponsesFileUploadIntegration.test_describe_image_with_file_id.yaml @@ -0,0 +1,204 @@ +interactions: +- request: + body: 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9deEh4dfNe4/ryj29vbGzc02kzTX+v7f6Hm51Z5EpPjQq1PEhbi7u/PWW2/Rtm1bZsyYwSuvvELVqlUB8PT0pH379jcco1evXowfP56FCxcSFhZGWloavXv3tm4vU6YMgYGB5OXl3dR4N6tkyZKkpKRctf7YsWPWHgCqVavG9u3badeu3TVD47XUqFGDGjVqsGTJEqZOnVrgVPBXX30FwMMPP5xvfc+ePZk6dSppaWnMmzePypUr06JFi3x1AYSGhhbq98WenLEnEVeh9wCKuJg2bdrQrFkzPvjgA7KysggNDaVNmzZ88sknnD59+qr9z549m2+5du3a1K9fn3nz5jFv3jzKli3LAw88YN3u7u5Ojx49WLhwIbt27brheDerWrVqbNy4kZycHOu6ZcuWceLEiXz79ezZkz///JPPPvvsqjEuX77MpUuXrnucMWPGcPHiRZ577rl8t28B2Lp1K2+//Tb16tW76qrcXr16kZ2dzZdffsmKFSuuusdix44dCQoK4s0338RsNl913Nv9vtiTM/Yk4ip0BlDEBY0cOZInnniCWbNm8dxzzxEbG0urVq2oX78+gwcPpmrVqiQnJ7NhwwZOnjzJ9u3b8z2+V69ejBkzBh8fHwYNGnTVVOWkSZNYtWoVzZs3Z/DgwdSpU4cLFy6QkJDATz/9VOC95G7kmWeeYcGCBXTq1ImePXty6NAh/ve//1nPQl3x5JNP8s033/Dcc8+xatUq7rvvPvLy8vjjjz/45ptvWLlyZb4bY/9T37592bx5M1OnTmXPnj307duXkiVLkpCQwBdffEGpUqVYsGABnp6e+R7XpEkTqlevzn/+8x+ys7OvuuVMUFAQH330EU8++SRNmjShd+/elClThuPHj/P9999z3333MWPGjFv+vtiTM/Yk4jLseg2yiBSZK7eB2bx581Xb8vLyjGrVqhnVqlUzcnNzDcMwjEOHDhlPPfWUER4ebnh6ehrly5c3Hn74YWPBggVXPf7AgQMGYADG+vXrCzx+cnKyER0dbURERBienp5GeHi40a5dO+PTTz+17nPlNjDz58/P99grtyeZOXNmvvXvvfeeUb58ecPb29u47777jC1btlx1GxjDMIycnBzj7bffNurWrWt4e3sbJUuWNO6++25j/PjxRmpq6s18+4wlS5YYHTp0MEqWLGl4e3sb1atXN1566SXj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 + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX + connection: + - keep-alive + content-length: + - '28044' + content-type: + - multipart/form-data; boundary=e0c741e22d5bbf76053b261d04dce90e + host: + - api.openai.com + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 1.83.0 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/files + response: + body: + string: "{\n \"object\": \"file\",\n \"id\": \"file-2VDJ4ce8xkJquQnDYtvKS8\",\n + \ \"purpose\": \"vision\",\n \"filename\": \"63652bcc-95f8-48df-b99e-d3ce0c3b14c6.png\",\n + \ \"bytes\": 27749,\n \"created_at\": 1769149768,\n \"expires_at\": null,\n + \ \"status\": \"processed\",\n \"status_details\": null\n}\n" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Fri, 23 Jan 2026 06:29:28 GMT + Server: + - cloudflare + Set-Cookie: + - SET-COOKIE-XXX + Strict-Transport-Security: + - STS-XXX + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + access-control-allow-origin: + - '*' + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - OPENAI-ORG-XXX + openai-processing-ms: + - '477' + openai-project: + - OPENAI-PROJECT-XXX + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '483' + x-openai-proxy-wasm: + - v0.1 + x-request-id: + - X-REQUEST-ID-XXX + status: + code: 200 + message: OK +- request: + body: '{"input":[{"role":"user","content":[{"type":"input_text","text":"Describe + this image in one sentence. Be brief."},{"type":"input_image","file_id":"file-2VDJ4ce8xkJquQnDYtvKS8"}]}],"model":"gpt-4o-mini"}' + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX + connection: + - keep-alive + content-length: + - '202' + content-type: + - application/json + host: + - api.openai.com + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 1.83.0 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/responses + response: + body: + string: "{\n \"id\": \"resp_0eb3b818918a077600697315491b808197a4e3654b6f212c42\",\n + \ \"object\": \"response\",\n \"created_at\": 1769149769,\n \"status\": + \"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\": + \"developer\"\n },\n \"completed_at\": 1769149771,\n \"error\": null,\n + \ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\": + null,\n \"max_output_tokens\": null,\n \"max_tool_calls\": null,\n \"model\": + \"gpt-4o-mini-2024-07-18\",\n \"output\": [\n {\n \"id\": \"msg_0eb3b818918a0776006973154a61b881978b58f82f518c6062\",\n + \ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\": + [\n {\n \"type\": \"output_text\",\n \"annotations\": + [],\n \"logprobs\": [],\n \"text\": \"The image is a line + graph showing a steady increase in revenue over time from 2020 to 2024, starting + at $100 million and reaching $300 million.\"\n }\n ],\n \"role\": + \"assistant\"\n }\n ],\n \"parallel_tool_calls\": true,\n \"presence_penalty\": + 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\": null,\n \"prompt_cache_retention\": + null,\n \"reasoning\": {\n \"effort\": null,\n \"summary\": null\n + \ },\n \"safety_identifier\": null,\n \"service_tier\": \"default\",\n \"store\": + true,\n \"temperature\": 1.0,\n \"text\": {\n \"format\": {\n \"type\": + \"text\"\n },\n \"verbosity\": \"medium\"\n },\n \"tool_choice\": + \"auto\",\n \"tools\": [],\n \"top_logprobs\": 0,\n \"top_p\": 1.0,\n \"truncation\": + \"disabled\",\n \"usage\": {\n \"input_tokens\": 14184,\n \"input_tokens_details\": + {\n \"cached_tokens\": 0\n },\n \"output_tokens\": 35,\n \"output_tokens_details\": + {\n \"reasoning_tokens\": 0\n },\n \"total_tokens\": 14219\n },\n + \ \"user\": null,\n \"metadata\": {}\n}" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Fri, 23 Jan 2026 06:29:31 GMT + Server: + - cloudflare + Set-Cookie: + - SET-COOKIE-XXX + Strict-Transport-Security: + - STS-XXX + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - OPENAI-ORG-XXX + openai-processing-ms: + - '2127' + openai-project: + - OPENAI-PROJECT-XXX + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '2130' + x-ratelimit-limit-requests: + - X-RATELIMIT-LIMIT-REQUESTS-XXX + x-ratelimit-limit-tokens: + - X-RATELIMIT-LIMIT-TOKENS-XXX + x-ratelimit-remaining-requests: + - X-RATELIMIT-REMAINING-REQUESTS-XXX + x-ratelimit-remaining-tokens: + - X-RATELIMIT-REMAINING-TOKENS-XXX + x-ratelimit-reset-requests: + - X-RATELIMIT-RESET-REQUESTS-XXX + x-ratelimit-reset-tokens: + - X-RATELIMIT-RESET-TOKENS-XXX + x-request-id: + - X-REQUEST-ID-XXX + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/llms/test_multimodal_integration.py b/lib/crewai/tests/llms/test_multimodal_integration.py index 8f79873fb..09cf98611 100644 --- a/lib/crewai/tests/llms/test_multimodal_integration.py +++ b/lib/crewai/tests/llms/test_multimodal_integration.py @@ -18,6 +18,7 @@ from crewai_files import ( VideoFile, format_multimodal_content, ) +from crewai_files.resolution.resolver import FileResolver, FileResolverConfig # Path to test data files @@ -559,6 +560,153 @@ class TestGenericFileIntegration: response = llm.call(messages) + assert response + assert isinstance(response, str) + assert len(response) > 0 + + +def _build_multimodal_message_with_upload( + llm: LLM, prompt: str, files: dict +) -> tuple[list[dict], list[dict]]: + """Build a multimodal message using file_id uploads instead of inline base64. + + Note: OpenAI Chat Completions API only supports file_id for PDFs via + type="file", not for images. For image file_id support, OpenAI requires + the Responses API (type="input_image"). Since crewAI uses Chat Completions, + we test file_id uploads with Anthropic which supports file_id for all types. + + Returns: + Tuple of (messages, content_blocks) where content_blocks can be inspected + to verify file_id was used. + """ + from crewai_files.formatting.anthropic import AnthropicFormatter + + config = FileResolverConfig(prefer_upload=True) + resolver = FileResolver(config=config) + formatter = AnthropicFormatter() + + content_blocks = [] + for file in files.values(): + resolved = resolver.resolve(file, "anthropic") + block = formatter.format_block(file, resolved) + if block is not None: + content_blocks.append(block) + + messages = [ + { + "role": "user", + "content": [ + llm.format_text_content(prompt), + *content_blocks, + ], + } + ] + return messages, content_blocks + + +def _build_responses_message_with_upload( + llm: LLM, prompt: str, files: dict +) -> tuple[list[dict], list[dict]]: + """Build a Responses API message using file_id uploads. + + The Responses API supports file_id for images via type="input_image". + + Returns: + Tuple of (messages, content_blocks) where content_blocks can be inspected + to verify file_id was used. + """ + from crewai_files.formatting import OpenAIResponsesFormatter + + config = FileResolverConfig(prefer_upload=True) + resolver = FileResolver(config=config) + + content_blocks = [] + for file in files.values(): + resolved = resolver.resolve(file, "openai") + block = OpenAIResponsesFormatter.format_block(resolved, file.content_type) + content_blocks.append(block) + + messages = [ + { + "role": "user", + "content": [ + {"type": "input_text", "text": prompt}, + *content_blocks, + ], + } + ] + return messages, content_blocks + + +class TestAnthropicFileUploadIntegration: + """Integration tests for Anthropic multimodal with file_id uploads. + + We test file_id uploads with Anthropic because OpenAI Chat Completions API + only supports file_id references for PDFs (type="file"), not images. + OpenAI's Responses API supports image file_id (type="input_image"), but + crewAI currently uses Chat Completions. Anthropic supports file_id for + all content types including images. + """ + + @pytest.mark.vcr() + def test_describe_image_with_file_id(self, test_image_bytes: bytes) -> None: + """Test Anthropic can describe an image uploaded via Files API.""" + llm = LLM(model="anthropic/claude-3-5-haiku-20241022") + files = {"image": ImageFile(source=test_image_bytes)} + + messages, content_blocks = _build_multimodal_message_with_upload( + llm, + "Describe this image in one sentence. Be brief.", + files, + ) + + # Verify we're using file_id, not base64 + assert len(content_blocks) == 1 + source = content_blocks[0].get("source", {}) + assert source.get("type") == "file", ( + f"Expected source type 'file' for file_id upload, got '{source.get('type')}'. " + "This test verifies file_id uploads work - if falling back to base64, " + "check that the Anthropic Files API uploader is working correctly." + ) + assert "file_id" in source, "Expected file_id in source for file_id upload" + + response = llm.call(messages) + + assert response + assert isinstance(response, str) + assert len(response) > 0 + + +class TestOpenAIResponsesFileUploadIntegration: + """Integration tests for OpenAI Responses API with file_id uploads. + + The Responses API supports file_id for images via type="input_image", + unlike Chat Completions which only supports file_id for PDFs. + """ + + @pytest.mark.vcr() + def test_describe_image_with_file_id(self, test_image_bytes: bytes) -> None: + """Test OpenAI Responses API can describe an image uploaded via Files API.""" + llm = LLM(model="openai/gpt-4o-mini", api="responses") + files = {"image": ImageFile(source=test_image_bytes)} + + messages, content_blocks = _build_responses_message_with_upload( + llm, + "Describe this image in one sentence. Be brief.", + files, + ) + + # Verify we're using file_id with input_image type + assert len(content_blocks) == 1 + block = content_blocks[0] + assert block.get("type") == "input_image", ( + f"Expected type 'input_image' for Responses API, got '{block.get('type')}'. " + "This test verifies file_id uploads work with the Responses API." + ) + assert "file_id" in block, "Expected file_id in block for file_id upload" + + response = llm.call(messages) + assert response assert isinstance(response, str) assert len(response) > 0 \ No newline at end of file