Files
cleveragents-core/benchmarks/a2a_facade_bench.py
T
HAL9000 4f2122cd9e
CI / push-validation (pull_request) Successful in 27s
CI / helm (pull_request) Successful in 32s
CI / lint (pull_request) Successful in 1m6s
CI / build (pull_request) Successful in 1m0s
CI / typecheck (pull_request) Successful in 1m35s
CI / quality (pull_request) Successful in 1m41s
CI / benchmark-publish (pull_request) Has been skipped
CI / security (pull_request) Successful in 2m50s
CI / integration_tests (pull_request) Successful in 5m3s
CI / e2e_tests (pull_request) Successful in 5m27s
CI / unit_tests (pull_request) Successful in 6m49s
CI / docker (pull_request) Successful in 1m23s
CI / coverage (pull_request) Successful in 11m17s
CI / status-check (pull_request) Successful in 3s
CI / lint (push) Successful in 1m14s
CI / security (push) Successful in 1m22s
CI / typecheck (push) Successful in 1m51s
CI / quality (push) Successful in 1m29s
CI / push-validation (push) Successful in 27s
CI / helm (push) Successful in 48s
CI / build (push) Successful in 48s
CI / integration_tests (push) Successful in 4m11s
CI / e2e_tests (push) Successful in 4m19s
CI / unit_tests (push) Successful in 6m14s
CI / docker (push) Successful in 1m33s
CI / coverage (push) Successful in 16m7s
CI / benchmark-regression (push) Has been skipped
CI / benchmark-publish (push) Failing after 1m3s
CI / status-check (push) Successful in 3s
CI / benchmark-regression (pull_request) Failing after 1h11m1s
docs: add action module API reference, update CHANGELOG and nav
- Add docs/api/action.md: full API reference for ActionConfigSchema and ActionArgumentSchema — field tables, factory methods, camelCase compat mapping, env-var interpolation, database integrity note, and complete YAML example
- Update docs/api/index.md: add cleveragents.action entry to module index
- Update mkdocs.yml: add 'Action Schema: api/action.md' to the API Reference nav
- Update CHANGELOG.md [Unreleased] Fixed: document plan use UNIQUE constraint violation fix (#4174, #4197)
- Clarify from_yaml_file ValueError semantics, document inputs_schema type as dict[str, Any] | None, and update A2A ASV benchmarks to pass method= requests after JSON-RPC migration

ISSUES CLOSED: #7472
2026-04-26 09:39:17 +00:00

125 lines
3.7 KiB
Python

"""ASV benchmarks for A2A facade dispatch, version negotiation, and event queue.
Measures the performance of:
- A2aLocalFacade dispatch overhead per operation
- A2aVersionNegotiator negotiation throughput
- A2aEventQueue publish and get_events throughput
"""
from __future__ import annotations
import importlib
import sys
from pathlib import Path
# Ensure the local *source* tree is importable even when ASV has an
# older build of the package installed.
_SRC = str(Path(__file__).resolve().parents[1] / "src")
if _SRC not in sys.path:
sys.path.insert(0, _SRC)
# Force-reload so ASV picks up the source tree version.
import cleveragents # noqa: E402
importlib.reload(cleveragents)
from cleveragents.a2a.events import A2aEventQueue # noqa: E402
from cleveragents.a2a.facade import A2aLocalFacade # noqa: E402
from cleveragents.a2a.models import A2aEvent, A2aRequest # noqa: E402
from cleveragents.a2a.versioning import A2aVersionNegotiator # noqa: E402
# ---------------------------------------------------------------------------
# Facade dispatch benchmarks
# ---------------------------------------------------------------------------
class FacadeDispatchSuite:
"""Benchmark A2aLocalFacade.dispatch() overhead."""
timeout = 60
def setup(self) -> None:
self.facade = A2aLocalFacade()
self.session_req = A2aRequest(method="session.create", params={})
self.plan_req = A2aRequest(
method="plan.execute", params={"plan_id": "BENCH001"}
)
self.context_req = A2aRequest(method="context.get", params={})
def time_dispatch_session_create(self) -> None:
self.facade.dispatch(self.session_req)
def time_dispatch_plan_execute(self) -> None:
self.facade.dispatch(self.plan_req)
def time_dispatch_context_get(self) -> None:
self.facade.dispatch(self.context_req)
def time_dispatch_all_operations(self) -> None:
for op in self.facade.list_operations():
req = A2aRequest(method=op, params={})
self.facade.dispatch(req)
def time_list_operations(self) -> None:
self.facade.list_operations()
# ---------------------------------------------------------------------------
# Version negotiation benchmarks
# ---------------------------------------------------------------------------
class VersionNegotiationSuite:
"""Benchmark A2aVersionNegotiator throughput."""
timeout = 60
def setup(self) -> None:
self.negotiator = A2aVersionNegotiator()
def time_negotiate_supported(self) -> None:
self.negotiator.negotiate("1.0")
def time_is_supported_true(self) -> None:
self.negotiator.is_supported("1.0")
def time_is_supported_false(self) -> None:
self.negotiator.is_supported("99.0")
def time_get_current(self) -> None:
self.negotiator.get_current()
# ---------------------------------------------------------------------------
# Event queue benchmarks
# ---------------------------------------------------------------------------
class EventQueueSuite:
"""Benchmark A2aEventQueue throughput."""
timeout = 60
def setup(self) -> None:
self.queue = A2aEventQueue()
self.event = A2aEvent(event_type="bench.event")
def time_publish_single(self) -> None:
self.queue.publish(self.event)
def time_publish_100(self) -> None:
for _ in range(100):
self.queue.publish(self.event)
def time_get_events_default(self) -> None:
self.queue.get_events()
def time_subscribe_local(self) -> None:
self.queue.subscribe_local(lambda e: None)
def time_publish_with_subscriber(self) -> None:
q = A2aEventQueue()
q.subscribe_local(lambda e: None)
for _ in range(100):
q.publish(self.event)