Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Ai Qdrant Store Laravel Package

symfony/ai-qdrant-store

Qdrant vector store integration for Symfony AI Store, with links to official Qdrant documentation on collections, points, and unified query search, plus Symfony AI contributing and issue resources.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • The package remains a store implementation (symfony/ai-qdrant-store) behind the symfony/ai store abstraction. Architecturally it is a swappable vector-persistence adapter, not a framework-level concern — still the right seam, and nothing in v0.15.0 changes that.
  • v0.15.0 is a constraint-only release (#2753 Bump version constraints to 0.15). No new interfaces, no behavioural changes, no deprecations. The architectural picture is therefore unchanged from v0.14.0, which remains the release that matters for design decisions:
    • VectorDocumentInterface (#2495) — the document contract between domain objects and the store. This is still the strategically significant change: one canonical document type consumed by any store implementation, reduced lock-in to Qdrant payload shapes, simpler test doubles.
    • count() capability (#1755) — first-class cardinality queries replacing ad-hoc scroll/scan loops for migration validation, monitoring, and "results available" UI logic.
  • What v0.15.0 tells us architecturally: the symfony/ai 0.15 line shipped without breaking the store contract. That is a data point in favour of the abstraction holding, not a guarantee. Treat it as one green cycle in an ongoing pre-1.0 risk, not as evidence the risk is retired.
  • Net effect unchanged: the store continues moving from "concrete adapter we call directly" toward "contract we program against." Still worth enforcing in code review.

Integration Feasibility

  • Very low effort — lower than 0.14.0. The diff between 0.14.0 and 0.15.0 is a version-constraint bump. There is no new API surface to adopt and no migration work attributable to this release.
  • The real work item is lockstep alignment: symfony/ai-qdrant-store 0.15 targets the symfony/ai 0.15 line. Verify the parent package constraint before bumping, and expect to move symfony/ai at the same time.
  • The substantive integration work described in the prior assessment — adopting VectorDocumentInterface and wiring count() — remains outstanding and undiminished. It is not made easier or harder by 0.15.0, and it should not be quietly dropped because the release itself was trivial.
  • The count() capability-support verification still stands: not every store implementation necessarily implements counting, and Qdrant's counting behaviour (exact vs approximate, filtered vs unfiltered) still needs characterising before it enters a request path.

Technical Risk

  • Pre-1.0 versioning remains the dominant risk. 0.15.0 happening to be non-breaking does not reduce the structural exposure; at 0.x, minor bumps may carry breaking changes. Pin the version, keep the deliberate upgrade cadence, do not float constraints.
  • Interface adoption risk (unchanged): if we build directly against VectorDocumentInterface and the signature shifts, every implementing class breaks at once. Keep the thin domain DTO and adapt at the boundary. This cycle validated the approach; keep it anyway.
  • Constraint-skew risk (new, minor): a mismatch between symfony/ai and symfony/ai-qdrant-store minor versions is now the most likely failure mode of this upgrade. Composer will usually catch it, but only if we bump both together rather than letting --update-with-dependencies resolve them independently.
  • Count semantics risk (unchanged): approximate counts, write-to-count lag, and expensive filtered counts on large collections. A user-facing total that disagrees with a search() result set is still a visible correctness bug.
  • Still low risk: no schema change, no Qdrant server version change implied, no new PHP extension requirements.

Key Questions

  1. Is v0.15.0 purely a constraint alignment with no code changes, i.e. can we treat it as a no-op upgrade provided symfony/ai moves in lockstep?
  2. Is VectorDocumentInterface required or optional for consumers — must custom document classes implement it, or will existing array shapes continue to be accepted? (Carried over; still unanswered by the changelog.)
  3. Do third-party or custom store implementations we depend on need to add count(), and is there capability detection, or will calls fail hard? (Carried over.)
  4. Is count() exact by default, and what is the cost profile for filtered counts on collections in the 10M+ point range? (Carried over.)
  5. Has the project published a support/back-compat policy or a 1.0 timeline? One clean minor release is not a policy — we still need to know whether 0.16 is expected to break the store contract.
  6. Does the count() contract define behaviour when the collection does not exist (exception vs zero)? (Carried over.)

Integration Approach

Stack Fit

  • Unchanged. The store is framework-agnostic via the symfony/ai contracts, serving both Symfony (native bundle config) and Laravel (bound in a service provider). The abstraction is what makes the package viable for us.
  • Symfony: register the store as a tagged service and expose it through the AI bundle config (framework.ai.stores.qdrant), now on the 0.15 line.
  • Laravel equivalent: bind the store as a singleton in a service provider, pulling HttpClientInterface (or Guzzle adapter), collection name, and API key from config; publish a config/ai.php mirroring the Symfony parameter bag.
  • Environment surface unchanged: QDRANT_API_URL, QDRANT_API_KEY, QDRANT_COLLECTION.

Migration Path

The phased plan is unchanged. v0.15.0 adds no step and removes none — it is a no-op on the migration path, provided the parent package moves with it.

  1. Phase 1 — Read operations: unchanged. Replace search/retrieval in critical paths, gate with feature flags, monitor latency and error rates via Monolog/APM.
  2. Phase 2 — Write operations: unchanged. Migrate ingestion (embedding generation, batch upserts), dual-write during transition.
  3. Phase 3 — Full cutover: deprecate legacy store code, update docs and onboarding.
  4. Data migration: export/import via Qdrant tooling or custom scripts; align payload schema; validate integrity. Use count() as the primary reconciliation check instead of scroll-and-tally scripts — compare source count, target count, and count-after-filter on a few payload predicates.
  5. Document contract adoption: introduce VectorDocumentInterface at the boundary, keep an internal domain DTO plus an adapter, backfill incrementally per call site. Still the largest remaining piece of work; unaffected by 0.15.0.

Compatibility

  • symfony/ai alignment is now the whole story. 0.15.0 exists solely to bump constraints to the 0.15 line, so a store-only bump will likely fail resolution or produce an unsupported pairing. Bump symfony/ai and symfony/ai-qdrant-store together.
  • Qdrant server: minimum remains v1.8.0+; no new server-side dependency. Confirm HNSW, payload indexing, and filtering support as before.
  • PHP extensions: gRPC only if using a gRPC-based Qdrant deployment; REST via the bundled HTTP client needs nothing extra.
  • Code-level compatibility: no code changes in this release, so array-based documents, direct store calls, and the count() contract are all untouched. The audit target is unchanged: any decorator, mock, or fake store in our test suite that needs a count() method (from 0.14.0).

Sequencing

  1. Pin and baseline: record current versions, run existing integration tests against a Dockerised Qdrant to establish a green baseline.
  2. Upgrade in lockstep: bump symfony/ai and symfony/ai-qdrant-store to the 0.15 line in a single commit; run unit + integration suites. Expect a near-zero diff and a fast review.
  3. Add count-based validation: wire count() into migration reconciliation and a nightly drift check (source vs target cardinality). Feature-flag any user-facing use.
  4. Adopt the document contract: introduce the domain DTO + adapter, migrate call sites incrementally, delete the raw-array path once coverage is complete.
  5. Promote: ship behind flags, monitor, then remove the legacy validation scripts.

Steps 1–2 are the 0.15.0 work; steps 3–5 are carry-over from the 0.14.0 assessment and should be tracked as separate backlog items so the trivial upgrade does not mask them.

Testing

  • Regression only for this release: existing suites are sufficient evidence that 0.15.0 is inert. Add one assertion that the parent package and store report compatible versions, so a future skew fails in CI rather than at runtime.
  • Unit: mock the Qdrant client; assert store logic in isolation, including count() return handling and interface conformance of the adapter.
  • Integration: Dockerised Qdrant container; assert search() and count() agree on the same filter; assert interface round-trip (document in → document out preserves payload).
  • Load: k6/Locust against filtered count() on a production-shaped collection to establish the cost ceiling before it touches a request path.

Operational Impact

Maintenance

  • Upgrade cadence validated. v0.15.0 is exactly the kind of release a monthly review cadence absorbs cheaply. Keep the review ritual and the automated Composer script, now targeting the 0.15 line:
    { "scripts": { "update:ai": "composer require symfony/ai:^0.15 symfony/ai-qdrant-store:^0.15 --update-with-dependencies" } }
    
  • Qdrant operations: unchanged. Self-hosted requires CPU/memory/disk monitoring, backups, Prometheus + Grafana; Qdrant Cloud offloads this but requires cost and quota monitoring.
  • Schema evolution: collections remain effectively immutable; schema changes still require new collection + export/import + reindex, with count() as a cheap post-migration verification gate.
  • Reduced maintenance surface: the document contract remains the main total-cost-of-ownership win on the 12-month horizon. 0.15.0 neither adds to nor detracts from it.

Support

  • Common issues: authentication failures (API key, VPC/firewall), timeouts (tune HTTP client timeout, limit, hnsw_ef), schema mismatches (vector dimensions, payload fields).
  • New troubleshooting entry — version skew: if the store errors immediately after an upgrade, check that symfony/ai and symfony/ai-qdrant-store were moved together. Log resolved versions in the health endpoint so support can confirm the pairing without a shell.
  • Existing troubleshooting entry — count divergence: if count() disagrees with expected totals, check (a) approximate-count mode, (b) write lag / eventual consistency, (c) filter translation differences between our adapter and Qdrant's filter syntax. Log the generated filter alongside the count.
  • Debugging tools: Qdrant dashboard at http://<host>:6333/dashboard; Symfony debug toolbar / Laravel Telescope for request inspection.
  • Vendor support: community forums and GitHub Discussions; SLA-backed support only via Qdrant Cloud paid tiers. No commercial support for the PHP package itself.
  • Documentation: symfony/ai docs remain high-level on store specifics — cross-reference Qdrant docs. Internal runbook should cover: version-pairing rules, filtered-query examples, gRPC vs REST configuration, count semantics, and escalation paths.

Scaling

  • Horizontal: Qdrant supports sharding and replication (shard_count, replicas_count); application servers scale independently since the store is stateless.
  • Performance tuning: HNSW parameters (hnsw_ef, hnsw_m) for recall/latency trade-off; batch upserts (upsert_points) to cut round trips; cache frequent queries via the framework cache component with explicit TTLs.
  • count() scaling caution: cheap on small/filtered sets, expensive on very large unfiltered collections. Use approximate counting for UI and dashboards; reserve exact counts for reconciliation jobs. Never place a filtered exact count in a synchronous request path without a measured ceiling.
  • Resource limits: Qdrant supports up to 65,535 dimensions, but 768+ dimensions materially affect memory and latency; keep payloads lean.

Failure Modes

  • Qdrant Unavailable: timeouts and HTTP client exceptions on search and count(). Mitigate with a circuit breaker around the store client, bounded retries with jitter, graceful degradation to a cached result set or "no results" state rather than a 500, and a health-check endpoint that gates traffic.
  • Version skew after upgrade (new, low severity): store and parent package on mismatched minors produces resolution failures or unsupported behaviour. Mitigate by bumping both in one commit and asserting compatibility in CI.
  • Count drift / inconsistency: counts that trail writes produce user-visible mismatches. Treat counts as advisory in the UI; pin reconciliation jobs to a read-after-write or snapshot-consistent path.
  • Interface break on a future minor: a 0.16 signature change would break all implementors at once. Mitigate with the adapter boundary, a pinned version, and a contract test that fails loudly on upgrade. The 0.15.0 cycle did not exercise this, so the mitigation is untested in anger.
  • Collection misconfiguration: wrong vector size or distance metric fails at query time, not at deploy time. Mitigate with a startup smoke test asserting collection existence, dimension, and distance metric.
  • Credential/network failure: typically 401/403 or connection refused after a config change. Mitigate with config validation at boot and an alert on auth-error rate.

Ramp-Up

  • Very low for this release. The 0.15.0 upgrade is a routine lockstep Composer bump with no API learning. Realistically a few hours including test runs and review.
  • Unchanged totals for the outstanding work (carry-over from 0.14.0): ~3–5 days for interface adoption across call sites and the adapter; ~1–2 days to wire count-based reconciliation and document it in the runbook.
  • Enablement: add a short internal note on the store contract ("program against the interface, adapt at the boundary") and a runbook section on count semantics and version pairing. Half-day artefacts that prevent the two most likely misuse patterns.
  • Process note for stakeholders: this release is a good moment to set expectations that a trivial changelog does not mean the store work is done. The value is in the 0.14.0 features, which we have not yet adopted.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
adachsoft/command-executor-lib
tagixo/document-builder
tagixo/page-builder
tagixo/mail-builder
tagixo/form-builder
primix/primix
tagixo/core
alesima/laravel-azure-service-bus
tomshaw/shopcart
likyly/laravel
darthsoup/shoppingcart
tdt/core
labyrinthe/connect-php
encore2/laravel-admin2
cboxdk/laravel-console-kit
shapecode/doctrine-dbal-datetimeutc
gilads-otiannoh254/inertia-protocol
dakiquang/laravel-oauth-refresh-lock
woda/laravel-worktrees
dalefranks/ramasite