andreibesleaga/a2a-php
A2A PHP brings the Agent2Agent protocol to PHP and Laravel, helping you expose agents, describe skills, and connect AI services through standardized messaging for interoperable agent-to-agent communication.
What this release actually is: v0.9.6-beta contains no product changes. Every entry is a Dependabot dependency bump (Guzzle, phpstan, php_codesniffer, monolog, ramsey/uuid, actions/checkout). No features, no documented breaking changes, no deprecations, no migration notes. The only "new contributor" is dependabot[bot]. From a TPM standpoint, this release carries no functional signal — it is a maintenance checkpoint, not a capability release.
Architecture fit: a2a-php presents as a PHP SDK for the A2A (Agent-to-Agent) protocol — JSON-RPC over HTTP, agent-card discovery, task lifecycle. The dependency profile (Guzzle for HTTP, monolog for logging, ramsey/uuid for task/message identifiers) is consistent with a client-side protocol library. That fits a Laravel service layer as a composable SDK, but two things must be verified before we treat it as "Laravel-native": (1) whether it ships a ServiceProvider/Facade and config publish tag, and (2) whether it drives Guzzle directly rather than Laravel's Http facade. If it owns its own Guzzle client, we lose the Http::fake() test seam, retry/backoff middleware, and event hooks — that is an integration tax we'd absorb ourselves.
Integration feasibility: Composer-installable and low-ceremony. The blocker is not install, it's constraint resolution: this release moved Guzzle from 7.15.x to 8.x. That is a major-version jump on a runtime HTTP client, shipped inside a beta patch release with no changelog narrative. Laravel pins Guzzle 7.x across a wide band of releases, so a hard ^8.0 constraint in this package will produce a Composer conflict on most existing Laravel apps. We need to see the actual composer.json constraint (^8.0 vs ^7.0|^8.0) before scoping anything.
Technical risk:
Key questions for the maintainer:
^8.0 only, or dual ^7.0|^8.0? If ^8.0 only, which Laravel minor versions remain installable?Stack fit: Compatible in shape — a Composer package with HTTP and logging dependencies is a standard Laravel citizen. The fit question is depth: treat it as an SDK wrapped by our own adapter interface, not as something we call directly from controllers. An A2AClient port in our domain layer with this package as the adapter means a Guzzle 8 conflict, a 1.0 breaking change, or a switch to another SDK costs us one class, not a refactor.
Migration path:
composer require andreibesleaga/a2a-php:^0.9.6-beta to surface the Guzzle conflict (or absence of one) in fifteen minutes rather than in a sprint.0.9.6-beta in composer.json — no caret on a 0.x beta, since ^0.9 still permits API churn and 0.10 may not exist with a clean path.Compatibility: Verify against each Laravel version we actually run, not just the newest. If there are multiple applications on different framework minors, the Guzzle constraint may make the package installable on some and not others — that's a portfolio decision, and pinning the package per-app is acceptable short-term. Confirm PHP version floor too (the phpstan 2.2.x line implies modern PHP; don't assume 8.1).
Sequencing:
Do not upgrade Guzzle globally in any application to satisfy this package. If Guzzle 8 is required, isolate it to the one app that needs it, or wait.
Maintenance: This release is a reminder that the dependency delta is being handled almost entirely by automation. That's efficient but it means the changelog is not a change log — there is no human-authored note explaining what Guzzle 8 means for consumers. We should assume we are the ones who will discover compatibility issues, and budget accordingly. Practical implication: subscribe to the repo's releases, but do not treat a green Dependabot merge as evidence the package works with our stack.
Support: Single-maintainer project at 0.9.x-beta. There is no vendor, no SLA, no support tier. Internal ownership must be explicit — name a person who can read the SDK source and patch it, because that is the realistic escalation path. The upside: it's PHP, MIT-style, and small enough that forking for a hotfix is viable.
Scaling: For a client SDK, scaling concerns are connection pooling and concurrency rather than throughput per se. Guzzle's handler stack and any async/promise usage determine whether we can fan out to many agents concurrently or serialize. Long-running A2A task polling is the real scaling question — if the SDK blocks on task completion, we need queue workers and timeouts rather than synchronous request handling. Validate this in the spike, because it drives whether the integration is a web request or a job.
Failure modes to instrument from day one:
Ramp-up: Low. Any Laravel developer can consume this in a day; the A2A protocol concepts (agent card, task, message, artifact) take another day or two. The real ramp is operational maturity — teaching the team to read composer.lock diffs and treat a major transitive bump as a reviewable change. Estimated one engineer-week to a working internal integration on a low-stakes path, contingent on the Guzzle constraint clearing.
Recommendation: Adopt for a time-boxed spike, not a commitment. Approve an internal, non-critical integration on a pinned 0.9.6-beta, gated on the compatibility spike passing. Re-evaluate at 1.0 or after two consecutive releases with human-authored notes and no major transitive bumps. This release neither advances nor blocks that plan — it is housekeeping, and the honest read is that the changelog tells us more about the project's maintenance posture than about its capabilities.
How can I help you explore Laravel packages today?