mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-08 23:58:34 +00:00
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:
@@ -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",
|
||||
|
||||
96
tests/test_dependency_compatibility.py
Normal file
96
tests/test_dependency_compatibility.py
Normal 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")
|
||||
Reference in New Issue
Block a user