--- title: "v1.4.14" description: "v1.4.14 changelog - 2026-03-18" --- ```bash npx -y @maximhq/bifrost --transport-version v1.4.14 ``` ```bash docker pull maximhq/bifrost:v1.4.14 docker run -p 8080:8080 maximhq/bifrost:v1.4.14 ``` ## 🐞 Fixed - **GIN Index Migration** — Rewrote metadata GIN index migration to run non-transactionally with CREATE INDEX CONCURRENTLY in a background goroutine, preventing pod startup deadlocks during rolling upgrades on large tables - **Advisory Lock Refactor** — Generalized advisory lock into reusable `acquireAdvisoryLock` with dedicated GIN index lock key to serialize index builds across cluster nodes - **Metadata Pointer Safety** — Changed `Log.Metadata` from `string` to `*string` to properly represent nullable metadata and prevent serialization errors from aborting log writes - **Distributed Lock Nil Safety** — Added nil-store guards to `DistributedLock` methods to prevent panics when config store is unavailable - **PostgreSQL 16 Requirement** — Added minimum PostgreSQL 16 version check at logstore startup, leveraging `IS NOT JSON OBJECT` for server-side metadata validation - fix: deterministic JSON serialization across all providers — replaced map[string]interface{} round-trips with json.RawMessage and sjson/gjson to preserve original key ordering for prompt caching - fix: ResponsesTool MarshalJSON rewritten to use sjson for incremental byte-level JSON construction, ensuring stable key order critical for OpenAI prompt caching - fix: Anthropic tool call arguments preserved as json.RawMessage instead of parsing into map, preventing key reordering on re-serialization - fix: Bedrock tool use input and extra params preserved as json.RawMessage for consistent prompt caching behavior - fix: Gemini FunctionCall.Args changed from map[string]interface{} to json.RawMessage, eliminating key order randomization - fix: Cohere response format serialization switched to sjson for deterministic output - fix: HuggingFace model field update uses sjson SetJSONField instead of unmarshal/marshal round-trip - fix: Replicate prediction request input merges extra params using sjson to preserve key ordering - feat: added comprehensive prompt caching tests for Anthropic, Azure, Bedrock, Gemini, and Vertex providers - feat: added serialization tests for ResponsesTool to verify deterministic JSON output - fix: rewrote GIN index migration to use CREATE INDEX CONCURRENTLY in background goroutine, preventing deadlocks during rolling upgrades - fix: generalized advisory lock into acquireAdvisoryLock with dedicated ginIndexAdvisoryLockKey for serialized index builds - fix: changed Log.Metadata from string to *string with graceful serialization error handling - fix: added nil-store guards to DistributedLock methods (Lock, TryLock, Extend, IsHeld, cleanupExpiredLock) - feat: added PostgreSQL 16 minimum version requirement with server-side IS NOT JSON OBJECT validation - chore: upgraded framework to v1.2.30 - chore: upgraded framework to v1.2.30 - chore: upgraded framework to v1.2.30 - fix: adapted log size estimation for Metadata *string change - chore: upgraded framework to v1.2.30 - chore: upgraded framework to v1.2.30 - chore: upgraded framework to v1.2.30 - chore: upgraded framework to v1.2.30 - chore: upgraded framework to v1.2.30