fix: resolve opentelemetry protobuf dependency conflict with Google Cloud SDKs

- Downgrade opentelemetry requirements from >=1.30.0 to >=1.27.0,<1.28.0
- This resolves protobuf version conflict where opentelemetry 1.30.0+ requires protobuf>=5.0
  but Google Cloud SDKs require protobuf<5.0
- Now uses protobuf 4.25.8 which satisfies both requirements
- Add comprehensive dependency compatibility tests
- Fixes issue #3413

Co-Authored-By: João <joao@crewai.com>
This commit is contained in:
Devin AI
2025-08-27 19:28:05 +00:00
parent 109de91d08
commit 36de68ecd4
3 changed files with 3383 additions and 3647 deletions

View File

@@ -17,9 +17,9 @@ dependencies = [
"pdfplumber>=0.11.4",
"regex>=2024.9.11",
# Telemetry and Monitoring
"opentelemetry-api>=1.30.0",
"opentelemetry-sdk>=1.30.0",
"opentelemetry-exporter-otlp-proto-http>=1.30.0",
"opentelemetry-api>=1.27.0,<1.28.0",
"opentelemetry-sdk>=1.27.0,<1.28.0",
"opentelemetry-exporter-otlp-proto-http>=1.27.0,<1.28.0",
# Data Handling
"chromadb>=0.5.23",
"tokenizers>=0.20.3",

View File

@@ -0,0 +1,96 @@
"""Tests for dependency compatibility, specifically for issue #3413.
This module tests that CrewAI can be installed alongside Google Cloud SDKs
without protobuf dependency conflicts.
"""
import subprocess
import sys
import tempfile
import pytest
from pathlib import Path
class TestDependencyCompatibility:
"""Test dependency compatibility with Google Cloud SDKs."""
def test_opentelemetry_protobuf_compatibility(self):
"""Test that opentelemetry versions work with protobuf<5.0."""
try:
import opentelemetry
from opentelemetry import trace, baggage
from opentelemetry.context import attach, detach
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
tracer_provider = TracerProvider()
tracer = tracer_provider.get_tracer("test")
with tracer.start_as_current_span("test_span") as span:
span.set_attribute("test", "value")
assert span is not None
except ImportError as e:
pytest.fail(f"Failed to import opentelemetry modules: {e}")
def test_google_cloud_sdk_compatibility_simulation(self):
"""Simulate Google Cloud SDK protobuf requirements."""
try:
import google.protobuf
version_parts = google.protobuf.__version__.split('.')
major_version = int(version_parts[0])
assert major_version < 5, f"protobuf version {google.protobuf.__version__} should be <5.0 for Google Cloud SDK compatibility"
except ImportError:
pytest.skip("protobuf not installed, skipping compatibility test")
def test_crewai_telemetry_functionality(self):
"""Test that CrewAI telemetry functionality works with downgraded opentelemetry."""
try:
from crewai.telemetry.telemetry import Telemetry
from crewai.utilities.crew.crew_context import get_crew_context
telemetry = Telemetry()
assert telemetry is not None
context = get_crew_context()
except ImportError as e:
pytest.fail(f"Failed to import CrewAI telemetry modules: {e}")
def test_dry_run_installation_compatibility(self):
"""Test that CrewAI and Google Cloud SDKs can be installed together."""
with tempfile.TemporaryDirectory() as temp_dir:
try:
result = subprocess.run([
sys.executable, "-m", "pip", "install", "--dry-run", "--quiet",
"opentelemetry-api>=1.27.0,<1.30.0",
"opentelemetry-sdk>=1.27.0,<1.30.0",
"opentelemetry-exporter-otlp-proto-http>=1.27.0,<1.30.0",
"google-cloud-storage"
], capture_output=True, text=True, cwd=temp_dir)
assert result.returncode == 0, f"Dry run installation failed: {result.stderr}"
assert "protobuf" in result.stdout.lower(), "protobuf should be in installation plan"
except Exception as e:
pytest.fail(f"Dry run installation test failed: {e}")
def test_protobuf_version_constraint_resolution(self):
"""Test that protobuf version constraints are properly resolved."""
try:
import google.protobuf
version = google.protobuf.__version__
version_parts = [int(x) for x in version.split('.')]
major, minor = version_parts[0], version_parts[1]
assert major >= 3, f"protobuf version {version} should be >=3.19"
if major == 3:
assert minor >= 19, f"protobuf version {version} should be >=3.19"
assert major < 5, f"protobuf version {version} should be <5.0 for Google Cloud SDK compatibility"
except ImportError:
pytest.skip("protobuf not installed, skipping version constraint test")

6928
uv.lock generated

File diff suppressed because it is too large Load Diff