Skip to content

Commit 25340d9

Browse files
committed
fix(crewai): resolve
type errors in CrewAI adapter - Convert integer total_tokens to TokenUsage object to fix Pydantic validation error - Add default fallback values for tool_name fields to prevent null validation errors - Improve verbose logging with print statements for better debugging
1 parent ba523cc commit 25340d9

File tree

2 files changed

+33
-24
lines changed

2 files changed

+33
-24
lines changed

.evalview/config.yaml

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
1-
# EvalView Configuration
2-
# Updated for LangGraph Cloud API (port 2024)
3-
adapter: langgraph
4-
endpoint: http://127.0.0.1:2024
5-
assistant_id: agent # Your assistant/graph ID (check langgraph.json or use "agent")
6-
7-
# Maximum time (seconds) to wait for agent response
8-
# If your backend refines multiple times, this prevents infinite waits
9-
# Recommended: 30-90s depending on complexity
1+
adapter: crewai
2+
endpoint: http://127.0.0.1:8000/crew
3+
assistant_id: agent
104
timeout: 90.0
11-
125
headers:
136
Content-Type: application/json

evalview/adapters/crewai_adapter.py

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
StepTrace,
1616
StepMetrics,
1717
ExecutionMetrics,
18+
TokenUsage,
1819
)
1920

2021
logger = logging.getLogger(__name__)
@@ -69,17 +70,26 @@ async def execute(self, query: str, context: Optional[Dict[str, Any]] = None) ->
6970
payload = {"inputs": {"query": query, **context}}
7071

7172
if self.verbose:
72-
logger.info(f"🚀 Executing CrewAI request: {query}...")
73-
logger.debug(f"📤 Payload: {json.dumps(payload, indent=2)}")
74-
75-
async with httpx.AsyncClient(timeout=self.timeout) as client:
76-
response = await client.post(
77-
self.endpoint,
78-
json=payload,
79-
headers=self.headers,
80-
)
81-
response.raise_for_status()
82-
data = response.json()
73+
print(f"🚀 Executing CrewAI request: {query}...")
74+
print(f"📤 Payload: {json.dumps(payload, indent=2)}")
75+
print(f"📡 Endpoint: {self.endpoint}, Timeout: {self.timeout}s")
76+
77+
try:
78+
print("Creating httpx client...") if self.verbose else None
79+
async with httpx.AsyncClient(timeout=self.timeout) as client:
80+
print("Making POST request...") if self.verbose else None
81+
response = await client.post(
82+
self.endpoint,
83+
json=payload,
84+
headers=self.headers,
85+
)
86+
print(f"Got response: {response.status_code}") if self.verbose else None
87+
response.raise_for_status()
88+
data = response.json()
89+
print(f"Parsed JSON response") if self.verbose else None
90+
except Exception as e:
91+
print(f"HTTP ERROR: {e}") if self.verbose else None
92+
raise
8393

8494
if self.verbose:
8595
logger.debug(f"📥 Response: {json.dumps(data, indent=2)[:500]}...")
@@ -110,7 +120,7 @@ def _parse_tasks(self, data: Dict[str, Any]) -> List[StepTrace]:
110120
step = StepTrace(
111121
step_id=task.get("id", f"task-{i}"),
112122
step_name=task.get("description", f"Task {i + 1}"),
113-
tool_name=task.get("tool"),
123+
tool_name=task.get("tool") or "crew_task",
114124
parameters=task.get("inputs", {}),
115125
output=task.get("output", ""),
116126
success=task.get("status") == "completed",
@@ -129,7 +139,7 @@ def _parse_tasks(self, data: Dict[str, Any]) -> List[StepTrace]:
129139
step = StepTrace(
130140
step_id=f"exec-{i}",
131141
step_name=execution.get("agent_name", f"Agent {i + 1}"),
132-
tool_name=execution.get("tool_used"),
142+
tool_name=execution.get("tool_used") or "agent_execution",
133143
parameters={},
134144
output=execution.get("output", ""),
135145
success=True,
@@ -180,10 +190,16 @@ def _calculate_metrics(
180190
total_tokens = sum(step.metrics.tokens or 0 for step in steps)
181191
total_tokens = total_tokens if total_tokens > 0 else None
182192

193+
# Convert integer total_tokens to TokenUsage object
194+
token_usage = None
195+
if total_tokens:
196+
# CrewAI doesn't provide a breakdown, so put all tokens in output_tokens
197+
token_usage = TokenUsage(output_tokens=total_tokens)
198+
183199
return ExecutionMetrics(
184200
total_cost=total_cost,
185201
total_latency=total_latency,
186-
total_tokens=total_tokens,
202+
total_tokens=token_usage,
187203
)
188204

189205
async def health_check(self) -> bool:

0 commit comments

Comments
 (0)