symfony/ai-albert-platform
Symfony AI platform bridge for Albert, the French government's OpenAI-compatible LLM API (OpenGateLLM). Wire Albert models into your Symfony apps for chat and completions alongside other Symfony AI platforms.
Architecture Fit
This is a bridge, not a platform. The package's job is to map the Albert (Étalab / OpenGateLLM) HTTP API onto Symfony AI's provider abstraction. Almost all of the durable architectural value sits in symfony/ai (the provider/model-routing layer introduced in v0.8.0); this repository is the thin adapter that lets Albert sit behind it. That distinction matters for a TPM: we are adopting a provider abstraction as a strategic asset, and Albert as one interchangeable implementation behind it.
v0.14.0 does not change that shape. It adds one thing: Albert's carbon footprint is now exposed as result metadata. That is an additive, metadata-level capability riding on the existing response path — no new abstraction, no new integration surface, no change to the call contract we would write against. Architecturally it is a field, not a feature layer, and it should be modelled as such in our gateway (a nullable attribute on our result DTO, not a first-class concern).
Fit against our Laravel estate remains Composer-level, not framework-level:
openai-php style code is small; the practical migration is small if we keep an internal interface boundary and do not let vendor-specific calls leak into domain code.Net: architecturally coherent and strategically aligned (EU hosting, GDPR posture, open source, cost), and now with a potential sustainability-reporting hook. The package is still a seam, not a solution. Treat it as one adapter inside a gateway we control.
Integration Feasibility
Feasible at low-to-moderate effort for a spike, moderate-to-high for production hardening. v0.14.0 does not move this needle in either direction.
What's cheap: install, bind in the container, point at Albert endpoints, issue chat completions, and generate embeddings (explicitly supported since v0.4.0). Reading the new carbon metadata is a one-line change on top of that. That is a days-not-weeks proof of concept.
What we own and must budget for: timeouts, retries with jitter, circuit breaking, quota/429 handling, structured logging, token accounting, prompt/response redaction, PII handling, test doubles, and any streaming support the API does not cleanly provide. Add to that list: deciding what the carbon field means and whether we are allowed to report on it — the package surfaces a value, it does not document a methodology.
Technical Risk
| Risk | Severity | Read | Mitigation |
|---|---|---|---|
| Maintenance signal | High (softening) | Still 1 star, 0 dependents, and prior releases were consecutive "no significant changes" rolls. v0.14.0 is the first genuinely new user-facing capability in several releases, and the changelog credits an upstream Symfony AI maintainer, which suggests the package is tracked rather than abandoned | Still assume de facto single-vendor/upstream-tracked maintenance; pin versions and wrap. Treat the improved signal as encouraging, not as a guarantee |
| Vendor/platform concentration | Medium-High | Albert is government-backed (good for continuity) but niche, with a small model catalogue and unknown quotas | Provider abstraction + fallback provider wired from day one |
| API drift | Medium | OpenGateLLM compatibility is versioned and evolving; backward compatibility not guaranteed. v0.14.0 is a 0.x minor bump, which semver permits to carry breaking changes — this one does not appear to, but our discipline must not depend on that | Contract tests against a recorded fixture set; alert on response-shape change; treat every 0.x bump as potentially breaking |
| Capability gaps | Medium | OpenAI-compatible ≠ feature-complete; streaming, tool/function calling, fine-tuning, multimodal are all unverified | Verify against the ReDoc reference before committing to roadmap items |
| Carbon metadata semantics | Low-Medium | The new field's units, methodology (provider-reported vs. estimated), attribution boundary (per request? per token? does it cover embeddings?), and null behaviour are all undocumented in the changelog | Do not consume in reporting until validated; model as nullable and version the metric |
| Dependency coupling | Medium | Pulls symfony/ai and its PHP/version constraints into our dependency graph |
Resolve against the Laravel version matrix early; a conflict here is a schedule risk, not a code risk |
Key Questions (decision-forcing)
If questions 1 and 3 come back weak, this is a spike, not a commitment. The new carbon metadata is a bonus observability signal, not by itself a reason to adopt.
Stack Fit
| Layer | Fit | Note |
|---|---|---|
| Composer / PHP 8.x | Native | Resolve against Laravel version matrix first |
| Laravel container | Via our own provider | We write the service provider; package supplies the client |
| HTTP / retries / backoff | Ours | Laravel HTTP client is sufficient |
| Queue / async | Ours | Essential for embeddings and batch jobs |
| Cache | Ours | Cache embeddings and idempotent completions |
| Observability | Partially improved in v0.14.0 | Carbon footprint now available as result metadata; still no cost or latency telemetry from the package — those remain ours |
Migration Path
Do not swap providers underneath product code. Apply a strangler pattern:
AiGateway::complete(), ::embed()) owned by us.symfony/ai-albert-platform.This makes the package's low maturity a contained risk: replacing it later is a one-class change. Design the interface now so provenance — including carbon metadata — is an optional field returned by every adapter, so the abstraction does not leak when a provider lacks the data.
Compatibility Checks (gate before build)
symfony/ai version constraint vs. our Laravel/PHP floor; re-validate on the 0.13 → 0.14 step specifically.Sequencing
| Phase | Duration | Exit criterion |
|---|---|---|
| Feasibility spike | 1–2 weeks | Chat + embeddings working end-to-end from a Laravel app; carbon field captured and logged |
| Evaluation harness | 1–2 weeks | Golden-set quality, latency p50/p95, cost per 1K tokens vs. incumbent; carbon figure validated or explicitly parked |
| Fallback + hardening | 2–3 weeks | Retries, circuit breaker, quotas, telemetry, redaction in place |
| Shadow traffic | 2–4 weeks | Quality parity on real prompts; no regression in error budget |
| Production, one feature | — | Measured cost saving or compliance requirement met |
Maintenance
Low code churn, high attention requirement — but the attention requirement just became more productive. Pin exact versions; never float. Assume the changelog will not warn us about breaking API changes — our contract tests are the real release notes. Budget a recurring slice of one engineer to track upstream and validate after each bump.
The 0.14.0 signal is worth recording: a substantive, non-trivial addition with an upstream maintainer's name on it is materially better evidence of a live project than another "sync demo skills" bump. It does not retire the risk, and it does not justify unpinning. Treat 0.x minors as potentially breaking by policy, and re-run contract tests on each.
Support
There is still effectively no community to lean on: 1 star, 0 dependents means no Stack Overflow corpus, no third-party blog posts, no peers debugging the same edge cases. Support is internal by construction. The upside remains that Étalab's institutional backing, reinforced by continued Symfony-side contributions, makes abrupt abandonment less likely than for a typical 1-star package — but institutional continuity is not developer support, and a new metadata field with no documented methodology is precisely the kind of thing we will be debugging alone.
Scaling
The unknowns that bite at scale are quota, concurrency, and per-request latency — none of which we can control, and none of which v0.14.0 addresses. Design accordingly: queue-heavy architecture, token budgeting per feature, embedding batching and caching, and precomputed vectors rather than on-demand generation in request paths. If the platform imposes low RPS, our UX must be async by default, which is a product decision to make early, not a late engineering fix.
Note the new field's storage cost: persisting carbon metadata per request is trivial in bytes but adds a slowly-growing time-series dimension. If we intend to report on it, we should aggregate at write time rather than retain per-request values indefinitely.
Failure Modes
| Mode | Impact | Prepared response |
|---|---|---|
| Platform outage | Feature unavailable | Automatic failover to secondary provider; degrade to non-AI path |
| 429 / quota exhaustion | Silent latency growth | Token bucket, backoff, queued retries, alerting |
| Response-schema drift | Runtime exceptions | Contract tests, version pin, feature-flagged rollback |
| Model deprecation | Quality shift with no code change | Golden-set regression suite run on a schedule, not just on deploy |
| Embedding mismatch | Corrupt vector index | Version the index by model + dimensions; never share across providers |
| Carbon metadata absent or inconsistent | Misstated ESG/sustainability reporting; audit exposure | Treat as nullable, validate before publish, version and source-tag the metric, never derive trend lines from unvalidated values |
| Latency tail | Timeouts, abandoned requests | p95 budgets per feature; async UX where p95 is unstable |
Ramp-Up
An experienced PHP engineer reaches a working spike in under a day; the package is small and the README is short enough to read in full. Production competence is the slower curve — Symfony AI's provider/model-routing idioms, plus our own gateway conventions. Acknowledge the framework seam explicitly: this is a Symfony-first package in a Laravel codebase, and the team must be comfortable reading Symfony docs and stack traces. The carbon feature adds no ramp-up cost, but the interpretation of it is not an engineering task — it belongs with whoever owns sustainability/ESG reporting.
TPM recommendation: unchanged in substance. Approve as a time-boxed spike with a named evaluation criterion (cost, latency, compliance, or — newly plausible — sustainability reporting). Commit to production only after the evaluation harness shows a measurable win and the fallback provider is wired and exercised in staging. Treat v0.14.0's carbon metadata as a differentiator worth evaluating, not a decision driver: if ESG reporting is a mandated requirement, it strengthens the case and the metric must be validated with the reporting owner before anyone quotes it; if it is a nice-to-have, log it and move on. Hold an explicit exit review at the end of shadow traffic, with the pre-agreed kill criterion — that keeps the low maturity signal from becoming an unfunded operational liability.
How can I help you explore Laravel packages today?