Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
b052329
Add basic evaluation example script
Jagriti-student Dec 7, 2025
dd2f4fe
Fix typos and improve clarity in docstrings across core modules
Jagriti-student Dec 8, 2025
80b0706
Add Google-style docstrings to BaseAdapter methods
Jagriti-student Dec 14, 2025
8e7b8c1
Format base adapter using ruff
Jagriti-student Dec 15, 2025
0669ffd
docs: add instructions for running CI checks locally
Jagriti-student Dec 17, 2025
fe9d27b
Remove example file unrelated to CI documentation
Jagriti-student Dec 18, 2025
7e21593
Add py.typed marker for type checker support
Jagriti-student Dec 18, 2025
e53ab49
Add test for markdown emoji encoding
Jagriti-student Dec 18, 2025
ac0efa1
Fix test_reporting: correct class usage, fields, and Windows-safe to_…
Jagriti-student Dec 27, 2025
dd4d11a
All tests passing: fixed dependencies and formatting
Jagriti-student Dec 27, 2025
35b5efc
Merge branch 'main' into test-markdown-emoji
Jagriti-student Dec 27, 2025
8efa96d
Merge branch 'main' into test-markdown-emoji
Jagriti-student Jan 5, 2026
ec02604
Merge branch 'main' into test-markdown-emoji
Jagriti-student Jan 7, 2026
5dd7810
Merge branch 'main' into test-markdown-emoji
Jagriti-student Jan 7, 2026
b6b5d9f
Update dependencies / poetry config
Jagriti-student Jan 5, 2026
27d79e0
Fix emoji markdown test and align ScenarioRun signature
Jagriti-student Jan 5, 2026
12a7eb4
Fix reporting tests and update dependencies
Jagriti-student Jan 7, 2026
d3dd11c
Fix missing required dependencies (jsonschema, scipy)
Jagriti-student Jan 7, 2026
b4034a1
Update all files
Jagriti-student Jan 7, 2026
580323d
Add CSV export support for SuiteResult
Jagriti-student Jan 12, 2026
f899ead
Fix SIM118 linter issue in SuiteResult.to_csv
Jagriti-student Jan 12, 2026
fc43108
Fix Ruff formatting issues in SuiteResult.to_csv
Jagriti-student Jan 12, 2026
637bb2d
Fix CSV export: iterate over dict keys correctly and pass Ruff lint
Jagriti-student Jan 12, 2026
f303197
Fix: SwarmAdapter imports and end_session duration tracking, fully li…
Jagriti-student Jan 12, 2026
cc345d5
Format files and remove lint error
Jagriti-student Jan 12, 2026
eed13b0
Fix the issue of csv file
Jagriti-student Jan 12, 2026
96ca15c
Merge branch 'main' into implement-duration-track
Jagriti-student Jan 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 44 additions & 20 deletions src/agentunit/adapters/swarm_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,17 @@
from datetime import datetime
from typing import TYPE_CHECKING, Any


try:
from swarm import Agent, Swarm

HAS_SWARM = True
except ImportError:
HAS_SWARM = False
logging.getLogger(__name__).warning(
"OpenAI Swarm not installed. SwarmAdapter will have limited functionality."
)

from agentunit.multiagent import (
AgentInteraction,
AgentMetadata,
Expand All @@ -23,23 +34,14 @@
OrchestrationPattern,
SessionID,
)
from agentunit.reporting.results import ScenarioResult


if TYPE_CHECKING:
from agentunit.core import Scenario
from agentunit.reporting.results import ScenarioResult

# Configure logging
logger = logging.getLogger(__name__)

try:
from swarm import Agent, Swarm

HAS_SWARM = True
except ImportError:
HAS_SWARM = False
logger.warning("OpenAI Swarm not installed. SwarmAdapter will have limited functionality.")


class SwarmAdapter(MultiAgentAdapter):
"""OpenAI Swarm integration adapter for lightweight multi-agent testing."""
Expand Down Expand Up @@ -149,7 +151,11 @@ def wrapped_function(*args, **kwargs):
return wrapped_function

def initiate_conversation(
self, scenario: Scenario, initial_message: str, participants: list[str], **kwargs
self,
scenario: Scenario,
initial_message: str,
participants: list[str],
**kwargs,
) -> SessionID:
"""Initiate a Swarm conversation."""
session_id = f"session_{uuid.uuid4().hex[:8]}"
Expand Down Expand Up @@ -323,34 +329,52 @@ def end_session(self, session_id: SessionID) -> ScenarioResult:
session["status"] = "completed"
session["end_time"] = datetime.now()

# Calculate duration in milliseconds
start_time = session.get("start_time")
if start_time:
duration_seconds = (session["end_time"] - start_time).total_seconds()
duration_ms = float(duration_seconds * 1000)
else:
duration_ms = 0.0

# Collect metrics
metrics = self._calculate_swarm_metrics(session_id)

# Create trace log
from agentunit.core.trace import TraceLog

trace = TraceLog()
trace.record("session_complete", session_id=session_id, metrics=metrics)
trace.record(
"session_complete",
session_id=session_id,
metrics=metrics,
)

# Create scenario run
from agentunit.reporting.results import ScenarioRun

scenario_run = ScenarioRun(
scenario_name=session["scenario"].name
if hasattr(session["scenario"], "name")
else "swarm_scenario",
scenario_name=(
session["scenario"].name
if hasattr(session["scenario"], "name")
else "swarm_scenario"
),
case_id=session_id,
success=True,
metrics=metrics,
duration_ms=0.0, # TODO: Track actual duration
duration_ms=duration_ms,
trace=trace,
)

# Create result
from agentunit.reporting.results import ScenarioResult

result = ScenarioResult(
name=session["scenario"].name
if hasattr(session["scenario"], "name")
else "swarm_scenario"
name=(
session["scenario"].name
if hasattr(session["scenario"], "name")
else "swarm_scenario"
)
)
result.add_run(scenario_run)

Expand Down Expand Up @@ -414,7 +438,7 @@ def _analyze_handoff_patterns(self, handoffs: list[dict[str, Any]]) -> dict[str,
return {
"handoff_counts": patterns,
"unique_patterns": len(patterns),
"most_common": max(patterns.items(), key=lambda x: x[1]) if patterns else None,
"most_common": (max(patterns.items(), key=lambda x: x[1]) if patterns else None),
}

def _calculate_agent_utilization(self, session_id: SessionID) -> dict[str, float]:
Expand Down
3 changes: 0 additions & 3 deletions src/agentunit/reporting/results.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,6 @@ def to_csv(self, path: str | Path) -> Path:

rows.append(row)

if not rows:
return target

fieldnames = sorted({key for row in rows for key in row})

with target.open("w", newline="", encoding="utf-8") as f:
Expand Down