waaseyaa / ai-vector
Vector embedding storage and similarity search for Waaseyaa
Requires
- php: >=8.5
- waaseyaa/access: ^0.1.0-alpha.303
- waaseyaa/api: ^0.1.0-alpha.303
- waaseyaa/database-legacy: ^0.1.0-alpha.303
- waaseyaa/entity: ^0.1.0-alpha.303
- waaseyaa/entity-storage: ^0.1.0-alpha.303
- waaseyaa/foundation: ^0.1.0-alpha.303
- waaseyaa/http-client: ^0.1.0-alpha.303
- waaseyaa/workflows: ^0.1.0-alpha.303
Requires (Dev)
- phpunit/phpunit: ^13.0
- waaseyaa/testing: ^0.1.0-alpha.303
Suggests
None
Provides
None
Conflicts
None
Replaces
None
- dev-main / 0.1.x-dev
- v0.1.0-alpha.303
- v0.1.0-alpha.302
- v0.1.0-alpha.301
- v0.1.0-alpha.300
- v0.1.0-alpha.299
- v0.1.0-alpha.298
- v0.1.0-alpha.297
- v0.1.0-alpha.296
- v0.1.0-alpha.295
- v0.1.0-alpha.294
- v0.1.0-alpha.293
- v0.1.0-alpha.292
- v0.1.0-alpha.291
- v0.1.0-alpha.290
- v0.1.0-alpha.289
- v0.1.0-alpha.288
- v0.1.0-alpha.287
- v0.1.0-alpha.286
- v0.1.0-alpha.285
- v0.1.0-alpha.284
- v0.1.0-alpha.283
- v0.1.0-alpha.282
- v0.1.0-alpha.281
- v0.1.0-alpha.280
- v0.1.0-alpha.279
- v0.1.0-alpha.278
- v0.1.0-alpha.277
- v0.1.0-alpha.276
- v0.1.0-alpha.275
- v0.1.0-alpha.274
- v0.1.0-alpha.273
- v0.1.0-alpha.272
- v0.1.0-alpha.271
- v0.1.0-alpha.270
- v0.1.0-alpha.269
- v0.1.0-alpha.268
- v0.1.0-alpha.267
- v0.1.0-alpha.266
- v0.1.0-alpha.265
- v0.1.0-alpha.264
- v0.1.0-alpha.263
- v0.1.0-alpha.262
- v0.1.0-alpha.261
- v0.1.0-alpha.260
- v0.1.0-alpha.259
- v0.1.0-alpha.258
- v0.1.0-alpha.257
- v0.1.0-alpha.256
- v0.1.0-alpha.255
- v0.1.0-alpha.254
- v0.1.0-alpha.253
- v0.1.0-alpha.252
- v0.1.0-alpha.251
- v0.1.0-alpha.250
- v0.1.0-alpha.249
- v0.1.0-alpha.248
- v0.1.0-alpha.247
- v0.1.0-alpha.246
- v0.1.0-alpha.245
- v0.1.0-alpha.244
- v0.1.0-alpha.243
- v0.1.0-alpha.242
- v0.1.0-alpha.241
- v0.1.0-alpha.240
- v0.1.0-alpha.239
- v0.1.0-alpha.238
- v0.1.0-alpha.237
- v0.1.0-alpha.236
- v0.1.0-alpha.235
- v0.1.0-alpha.234
- v0.1.0-alpha.233
- v0.1.0-alpha.232
- v0.1.0-alpha.231
- v0.1.0-alpha.230
- v0.1.0-alpha.229
- v0.1.0-alpha.228
- v0.1.0-alpha.227
- v0.1.0-alpha.226
- v0.1.0-alpha.225
- v0.1.0-alpha.224
- v0.1.0-alpha.223
- v0.1.0-alpha.222
- v0.1.0-alpha.221
- v0.1.0-alpha.220
- v0.1.0-alpha.219
- v0.1.0-alpha.218
- v0.1.0-alpha.217
- v0.1.0-alpha.216
- v0.1.0-alpha.215
- v0.1.0-alpha.214
- v0.1.0-alpha.213
- v0.1.0-alpha.212
- v0.1.0-alpha.211
- v0.1.0-alpha.210
- v0.1.0-alpha.209
- v0.1.0-alpha.208
- v0.1.0-alpha.207
- v0.1.0-alpha.206
- v0.1.0-alpha.205
- v0.1.0-alpha.204
- v0.1.0-alpha.203
- v0.1.0-alpha.202
- v0.1.0-alpha.201
- v0.1.0-alpha.200
- v0.1.0-alpha.199
- v0.1.0-alpha.198
- v0.1.0-alpha.197
- v0.1.0-alpha.196
- v0.1.0-alpha.195
- v0.1.0-alpha.194
- v0.1.0-alpha.193
- v0.1.0-alpha.192
- v0.1.0-alpha.191
- v0.1.0-alpha.190
- v0.1.0-alpha.189
- v0.1.0-alpha.188
- v0.1.0-alpha.187
- v0.1.0-alpha.186
- v0.1.0-alpha.185
- v0.1.0-alpha.184
- v0.1.0-alpha.183
- v0.1.0-alpha.182
- v0.1.0-alpha.181
- v0.1.0-alpha.180
- v0.1.0-alpha.179
- v0.1.0-alpha.178
- v0.1.0-alpha.177
- v0.1.0-alpha.176
- v0.1.0-alpha.175
- v0.1.0-alpha.174
- v0.1.0-alpha.173
- v0.1.0-alpha.172
- v0.1.0-alpha.171
- v0.1.0-alpha.170
- v0.1.0-alpha.169
- v0.1.0-alpha.168
- v0.1.0-alpha.167
- v0.1.0-alpha.166
- v0.1.0-alpha.165
- v0.1.0-alpha.164
- v0.1.0-alpha.163
- v0.1.0-alpha.162
- v0.1.0-alpha.161
- v0.1.0-alpha.160
- v0.1.0-alpha.159
- v0.1.0-alpha.158
- v0.1.0-alpha.157
- v0.1.0-alpha.156
- v0.1.0-alpha.155
- v0.1.0-alpha.154
- v0.1.0-alpha.153
- v0.1.0-alpha.152
- v0.1.0-alpha.151
- v0.1.0-alpha.150
- v0.1.0-alpha.149
- v0.1.0-alpha.148
- v0.1.0-alpha.147
- v0.1.0-alpha.146
- v0.1.0-alpha.145
- v0.1.0-alpha.143
- v0.1.0-alpha.142
- v0.1.0-alpha.141
- v0.1.0-alpha.140
- v0.1.0-alpha.139
- v0.1.0-alpha.138
- v0.1.0-alpha.137
- v0.1.0-alpha.136
- v0.1.0-alpha.135
- v0.1.0-alpha.134
- v0.1.0-alpha.133
- v0.1.0-alpha.132
- v0.1.0-alpha.131
- v0.1.0-alpha.130
- v0.1.0-alpha.129
- v0.1.0-alpha.128
- v0.1.0-alpha.127
- v0.1.0-alpha.126
- v0.1.0-alpha.125
- v0.1.0-alpha.124
- v0.1.0-alpha.123
- v0.1.0-alpha.122
- v0.1.0-alpha.121
- v0.1.0-alpha.120
- v0.1.0-alpha.119
- v0.1.0-alpha.118
- v0.1.0-alpha.117
- v0.1.0-alpha.116
- v0.1.0-alpha.115
- v0.1.0-alpha.114
- v0.1.0-alpha.113
- v0.1.0-alpha.112
- v0.1.0-alpha.111
- v0.1.0-alpha.110
- v0.1.0-alpha.109
- v0.1.0-alpha.108
- v0.1.0-alpha.106
- v0.1.0-alpha.105
- v0.1.0-alpha.104
- v0.1.0-alpha.103
- v0.1.0-alpha.102
- v0.1.0-alpha.101
- v0.1.0-alpha.100
- v0.1.0-alpha.99
- v0.1.0-alpha.98
- v0.1.0-alpha.97
- v0.1.0-alpha.96
- v0.1.0-alpha.95
- v0.1.0-alpha.94
- v0.1.0-alpha.93
- v0.1.0-alpha.92
- v0.1.0-alpha.91
- v0.1.0-alpha.90
- v0.1.0-alpha.89
- v0.1.0-alpha.88
- v0.1.0-alpha.87
- v0.1.0-alpha.86
- v0.1.0-alpha.85
- v0.1.0-alpha.84
- v0.1.0-alpha.83
- v0.1.0-alpha.82
- v0.1.0-alpha.81
- v0.1.0-alpha.80
- v0.1.0-alpha.79
- v0.1.0-alpha.78
- v0.1.0-alpha.77
- v0.1.0-alpha.76
- v0.1.0-alpha.75
- v0.1.0-alpha.74
- v0.1.0-alpha.73
- v0.1.0-alpha.72
- v0.1.0-alpha.71
- v0.1.0-alpha.70
- v0.1.0-alpha.69
- v0.1.0-alpha.68
- v0.1.0-alpha.66
- v0.1.0-alpha.65
- v0.1.0-alpha.64
- v0.1.0-alpha.63
- v0.1.0-alpha.62
- v0.1.0-alpha.61
- v0.1.0-alpha.58
- v0.1.0-alpha.57
- v0.1.0-alpha.56
- v0.1.0-alpha.55
- v0.1.0-alpha.54
- v0.1.0-alpha.53
- v0.1.0-alpha.52
- v0.1.0-alpha.51
- v0.1.0-alpha.50
- v0.1.0-alpha.49
- v0.1.0-alpha.48
- v0.1.0-alpha.47
- v0.1.0-alpha.46
- v0.1.0-alpha.45
- v0.1.0-alpha.44
- v0.1.0-alpha.43
- v0.1.0-alpha.42
- v0.1.0-alpha.41
- v0.1.0-alpha.40
- v0.1.0-alpha.39
- v0.1.0-alpha.38
- v0.1.0-alpha.37
- v0.1.0-alpha.36
- v0.1.0-alpha.35
- v0.1.0-alpha.34
- v0.1.0-alpha.33
- v0.1.0-alpha.32
- v0.1.0-alpha.31
- v0.1.0-alpha.30
- v0.1.0-alpha.29
- v0.1.0-alpha.28
- v0.1.0-alpha.27
- v0.1.0-alpha.26
- v0.1.0-alpha.25
- v0.1.0-alpha.24
- v0.1.0-alpha.23
- v0.1.0-alpha.22
- v0.1.0-alpha.21
- v0.1.0-alpha.20
- v0.1.0-alpha.19
- v0.1.0-alpha.18
- v0.1.0-alpha.17
- v0.1.0-alpha.16
- v0.1.0-alpha.15
- v0.1.0-alpha.14
- v0.1.0-alpha.13
- v0.1.0-alpha.12
- v0.1.0-alpha.11
- v0.1.0-alpha.10
- v0.1.0-alpha.9
- v0.1.0-alpha.8
- v0.1.0-alpha.7
- v0.1.0-alpha.6
- v0.1.0-alpha.5
- v0.1.0-alpha.4
- v0.1.0-alpha.3
- v0.1.0-alpha.2
- v0.1.0-alpha.1
This package is auto-updated.
Last update: 2026-10-01 20:13:28 UTC
README
Layer 5 — AI
Opt-in vector embedding storage and similarity search for Waaseyaa applications.
Installing the package does not activate it. Enable it explicitly in application config, after running its migration:
'ai' => [ 'vector_enabled' => true, 'vector_backend' => 'database', 'embedding_provider' => 'ollama', // or openai 'vector_index' => [ 'node' => [ 'fields' => ['label', 'title', 'body', 'description'], 'allow_external' => false, ], ], ],
Indexing is default-deny. Only declared entity types and fields are embedded.
label must be named explicitly; no label, entity ID, or other fallback text
is added. OpenAI and non-loopback Ollama endpoints may receive content only
when that entity type sets allow_external to true. Providers that do not
declare their egress behavior are treated as external. After removing a type
from the policy, run semantic:refresh --type=<entity-type> to delete its
existing vectors. That deletion-only refresh also works after the embedding
provider has been removed.
database is the only supported storage backend. It stores JSON vectors on
the application's DatabaseInterface connection and performs cosine ranking
in PHP. Selecting pgvector or any other backend fails startup with
[AIV-BACKEND-001]; the package does not silently substitute another backend.
The semantic:warm and semantic:refresh CLI commands appear only when the
package is installed and ai.vector_enabled is true. Without ai-vector, the
semantic search route returns 501. With the package installed but disabled, it
binds no services, registers no lifecycle listeners, and exposes no semantic
commands.
Key production contracts: EmbeddingStorageInterface,
EmbeddingProviderInterface, DatabaseEmbeddingStorage, and
SemanticIndexWarmer. FakeEmbeddingProvider is available only through the
package's development autoloader.
EmbeddingStorageInterface is the sole storage contract: atomic replacement
of one finite numeric vector per exact entity type/string ID, idempotent delete,
and findSimilar() arrays containing only id and cosine score. Results sort
by descending score, then bytewise ID; dimensions must match. Language variants
and stored metadata are unsupported. The old DTO/store family is removed; see
UPGRADING.md.
Missing schema refuses with [AIV-STORAGE-001], corrupt stored vectors with
[AIV-STORAGE-002]. Warm/refresh counts only confirmed operations and propagates
failures. Post-commit listeners log failures and invalidate stale vectors.
The semantic search contract
defines HTTP JSON:API and MCP identity, scores, ordering, current field-filtered
metadata, empty results and refusals. Shipped schemas live in this package's
resources/ and ai-tools/resources/. The shared storage conformance suite
runs on real SQLite and hosted PostgreSQL; host stores must pass it too.
Execution
HTTP lifecycle indexing uses one synchronous two-second network attempt after
true commit. CLI refresh and queries retain Ollama's 15-second and OpenAI's
20-second transfer budgets. Database and whole-request/batch time are separate.
Maintained Symfony HttpClient under waaseyaa/http-client owns HTTP mechanics;
no ext-curl requirement or embedding queue remains.
Source mutations transactionally advance durable generations and invalidate
potentially indexed vectors. Policy-undeclared identities proven never indexed
can remain writable during projection failure while their entity database and
generation authority remain healthy. Declared, indexed or uncertain identities
retain fail-closed invalidation and rollback. The monotonic history migration
requires quiesced older writers and legacy-vector backfill; deletion never clears
history, and excluded lifecycle/refresh cleanup never creates indexing history.
Lifecycle indexing and refresh share guarded publication and fresh
served reads. Custom storage needs a compatible qualified execution guard;
custom HTTP-save providers need EmbeddingSaveProviderInterface.
The application operator schedules full semantic:refresh sweeps to its
freshness SLA and monitors listener errors, failed commands and search coverage.
Imports and failed embeddings can leave coverage absent until reconciliation.
Quiesce old workers and refresh when changing boot-time indexing policy. See
docs/specs/semantic-search-contract.md and FW-AIV-EXECUTION-01 for topology,
migration, custom-provider obligations and recovery details.
Required invalidation is transactional and fail-closed for every kernel. Production has no delayed post-delete/invalidate-only subscription; only configured HTTP providers index after commit. Provider failure is best-effort after committed save, while source invalidation failure rolls back the source mutation. Monitor source errors and all indexing failures separately; AIV-EXECUTION-007 additionally identifies unconfirmed cleanup, not every provider failure.