All notable changes to FerryAI. Format loosely follows Keep a Changelog.
- Harden
.aiarchive deserialization and native-binary integrity checks (ai,cpu-backend).
- Reorganize repository root: move community-health files to
.github/and documentation intodocs/. - Drop the PHP baseline to 8.3 (replace
\Pdo\Sqlitewith\PDO+getAttribute()+method_exists()runtime checks). - Remove Docker files (native FFI runtime needs no container sidecars).
- CI: auto-detect the VS2022 toolchain path, correct the release asset name and
line-ending normalization, and exclude
SharedMemoryManagerfrom Psalm (ext-shmopShmopclass not recognized). - Documentation: correct the supported-versions table for the 0.1.x pre-1.0 line.
First public release. Inference-only runtime for PHP 8.3+ with a unified API over ONNX Runtime, llama.cpp and RubixML/Tensor engines.
- PostgreSQL + pgvector vector store (
PostgresStore,PostgresCollection,PostgresVecIndex) with native ANN (<=>/<->/<#>) and HNSW/IVFFlat indexes; driver switch inAIFactory. - SQLite native KNN via the sqlite-vec (
vec0) extension, opt-in, with brute-force fallback. Observabilitywrapper wiringMetrics/Profiler/Loggerinto the facade (opt-in);ModelPoolintegration (pooled model loading, LRU eviction, realwarmup).NativeBinaryManagerlibrary resolution inAIFactory;RetryHandler+Loggerin the model hub.- CPU backend: real pure-PHP tensor arithmetic and RubixML
.rbminference (isolated). - FFI CDEF generator (
Core\FFI\CdefGenerator,bin/generate-ffi.php). - Facade config-wiring for
embed/similarity; PSR-7StreamResponse::create(). - llama.cpp CPU + GPU inference via the
ferry_llamawrapper, wired intoLlamaBackend(AI::chat()/AI::stream()), with a native top-k pre-filter for fast sampling. - Strict grammar-constrained sampling (
GbnfMatcher+GrammarSampler);sampler/grammaroptions onAI::chat(). - Per-capability documentation under
docs/and this changelog.
AIFactorycaches embedders per model;AI::chatpools its model (no reload per call).SamplerFactory::forParams()selects greedy/nucleus by temperature;softmaxhonours temperature.
RubixMLAdapter::isAvailable()usedclass_existsfor theEstimatorinterface (nowinterface_exists).- All PHPStan level 8 findings resolved (gate fully green).