Skip to content

Commit f379059

Browse files
authored
Merge branch 'Arize-ai:main' into alisaleh/ticket-2037
2 parents 72ce06f + e2c919c commit f379059

File tree

6 files changed

+28
-18
lines changed

6 files changed

+28
-18
lines changed

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"python/openinference-instrumentation": "0.1.41",
1111
"python/instrumentation/openinference-instrumentation-guardrails": "0.1.10",
1212
"python/instrumentation/openinference-instrumentation-vertexai": "0.1.11",
13-
"python/instrumentation/openinference-instrumentation-crewai": "0.1.14",
13+
"python/instrumentation/openinference-instrumentation-crewai": "0.1.15",
1414
"python/instrumentation/openinference-instrumentation-haystack": "0.1.26",
1515
"python/instrumentation/openinference-instrumentation-litellm": "0.1.27",
1616
"python/instrumentation/openinference-instrumentation-groq": "0.1.12",

python/instrumentation/openinference-instrumentation-crewai/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## [0.1.15](https://github.com/Arize-ai/openinference/compare/python-openinference-instrumentation-crewai-v0.1.14...python-openinference-instrumentation-crewai-v0.1.15) (2025-10-21)
4+
5+
6+
### Bug Fixes
7+
8+
* **crewai:** CrewAI Flow Traces Not Generated With Async ([#2308](https://github.com/Arize-ai/openinference/issues/2308)) ([7e7f532](https://github.com/Arize-ai/openinference/commit/7e7f53283df61a0d78df01ab808bacdddd14620a))
9+
310
## [0.1.14](https://github.com/Arize-ai/openinference/compare/python-openinference-instrumentation-crewai-v0.1.13...python-openinference-instrumentation-crewai-v0.1.14) (2025-10-14)
411

512

python/instrumentation/openinference-instrumentation-crewai/examples/advanced_flow.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
and display structured and human-readable results.
1212
"""
1313

14+
import asyncio
1415
import os
1516
from typing import Any, Dict, List, Optional
1617

@@ -186,7 +187,7 @@ def create_advanced_flow(flow_name: Optional[str] = None) -> Flow:
186187
return flow
187188

188189

189-
def run_advanced_flow():
190+
async def run_advanced_flow():
190191
"""
191192
Executes the advanced flow and handles any runtime exceptions.
192193
"""
@@ -197,7 +198,7 @@ def run_advanced_flow():
197198
# Inputs are passed here and injected into the @start() method
198199
inputs = {"product": "AI-powered Chatbots"}
199200

200-
flow.kickoff(inputs=inputs)
201+
await flow.kickoff_async(inputs=inputs)
201202
print("✅ Flow execution completed successfully.")
202203
except Exception as e:
203204
print(f"⚠️ Flow execution failed: {type(e).__name__}")
@@ -207,7 +208,7 @@ def main():
207208
"""Run the CrewAI instrumentation demonstration."""
208209
print("CrewAI Instrumentation Demo - Advanced Flow")
209210
print("Check Phoenix UI at http://localhost:6006 for trace visualization\n")
210-
run_advanced_flow()
211+
asyncio.run(run_advanced_flow())
211212

212213

213214
if __name__ == "__main__":

python/instrumentation/openinference-instrumentation-crewai/src/openinference/instrumentation/crewai/__init__.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
_AgentActionWrapper,
1515
_CrewKickoffWrapper,
1616
_ExecuteCoreWrapper,
17-
_FlowKickoffWrapper,
17+
_FlowKickoffAsyncWrapper,
1818
_ToolUseWrapper,
1919
)
2020
from openinference.instrumentation.crewai.version import __version__
@@ -29,7 +29,7 @@ class CrewAIInstrumentor(BaseInstrumentor): # type: ignore
2929
"_original_agent_action",
3030
"_original_execute_core",
3131
"_original_crew_kickoff",
32-
"_original_flow_kickoff",
32+
"_original_flow_kickoff_async",
3333
"_original_tool_use",
3434
"_tracer",
3535
)
@@ -77,12 +77,14 @@ def _instrument(self, **kwargs: Any) -> None:
7777
wrapper=crew_kickoff_wrapper,
7878
)
7979

80-
flow_kickoff_wrapper = _FlowKickoffWrapper(tracer=self._tracer)
81-
self._original_flow_kickoff = getattr(import_module("crewai").Flow, "kickoff", None)
80+
flow_kickoff_async_wrapper = _FlowKickoffAsyncWrapper(tracer=self._tracer)
81+
self._original_flow_kickoff_async = getattr(
82+
import_module("crewai").Flow, "kickoff_async", None
83+
)
8284
wrap_function_wrapper(
8385
module="crewai",
84-
name="Flow.kickoff",
85-
wrapper=flow_kickoff_wrapper,
86+
name="Flow.kickoff_async",
87+
wrapper=flow_kickoff_async_wrapper,
8688
)
8789

8890
use_wrapper = _ToolUseWrapper(tracer=self._tracer)
@@ -113,10 +115,10 @@ def _uninstrument(self, **kwargs: Any) -> None:
113115
crew_module.Crew.kickoff = self._original_crew_kickoff
114116
self._original_crew_kickoff = None
115117

116-
if self._original_flow_kickoff is not None:
118+
if self._original_flow_kickoff_async is not None:
117119
crew_module = import_module("crewai")
118-
crew_module.Flow.kickoff = self._original_flow_kickoff
119-
self._original_flow_kickoff = None
120+
crew_module.Flow.kickoff_async = self._original_flow_kickoff_async
121+
self._original_flow_kickoff_async = None
120122

121123
if self._original_tool_use is not None:
122124
tool_usage_module = import_module("crewai.tools.tool_usage")

python/instrumentation/openinference-instrumentation-crewai/src/openinference/instrumentation/crewai/_wrappers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -412,19 +412,19 @@ def __call__(
412412
return crew_output
413413

414414

415-
class _FlowKickoffWrapper:
415+
class _FlowKickoffAsyncWrapper:
416416
def __init__(self, tracer: trace_api.Tracer) -> None:
417417
self._tracer = tracer
418418

419-
def __call__(
419+
async def __call__(
420420
self,
421421
wrapped: Callable[..., Any],
422422
instance: Any,
423423
args: Tuple[Any, ...],
424424
kwargs: Mapping[str, Any],
425425
) -> Any:
426426
if context_api.get_value(context_api._SUPPRESS_INSTRUMENTATION_KEY):
427-
return wrapped(*args, **kwargs)
427+
return await wrapped(*args, **kwargs)
428428
# Enhanced flow naming - use meaningful flow name instead of generic "Flow.kickoff"
429429
flow_name = _get_flow_name(instance)
430430
span_name = f"{flow_name}.kickoff"
@@ -450,7 +450,7 @@ def __call__(
450450
span.set_attribute("flow_inputs", json.dumps(inputs) if inputs else "")
451451

452452
try:
453-
flow_output = wrapped(*args, **kwargs)
453+
flow_output = await wrapped(*args, **kwargs)
454454
except Exception as exception:
455455
span.set_status(trace_api.Status(trace_api.StatusCode.ERROR, str(exception)))
456456
span.record_exception(exception)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.1.14"
1+
__version__ = "0.1.15"

0 commit comments

Comments
 (0)