mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-21 06:12:17 +03:00
The re-land of #12630 validated only its own tests and broke 15 existing ones. Three root causes, all fixed in production code so the tip's tests are untouched: 1. Dual-layer manager was ON by default. `DEFAULT_SEMANTIC_CACHE_CONFIG.enabled` was `true` and the DB bridge wired it to the pre-existing `semanticCacheEnabled` toggle (also default `true`), so every temperature=0 request called an embedding endpoint (lemonade @ localhost:13305 by default) on lookup AND store — two extra fetches per chat call (chat-combo-live-test, issue-agent-route-execution). Fix: new `semanticCacheVectorEnabled` setting (default false; types, DB keys, cache-config route, settings UI sub-toggle) and the bridge only enables the manager when BOTH toggles are on. Manager default is now `enabled: false`. With the opt-in off, chatCore behaves exactly like the legacy SQLite cache. 2. `X-OmniRoute-Cache` value changed from `HIT` to `HIT (exact)`/`HIT (semantic)`, and `cacheSource: "semantic_similarity"` fell through attemptLogging's `"semantic" | "upstream"` narrowing as "upstream". Fix: keep `HIT` verbatim (similarity hits are distinguished by X-OmniRoute-Cache-Similarity) and log both hit types as `cacheSource: "semantic"`. The PR's edits to chatcore-semantic-cache.test.ts are reverted to the tip version. 3. Model discovery stamped `modelType: "chat"` + `supportedInputTypes: ["text"]` on every model (import-mode diff noise, 6 catalog tests), and endpoint-based modality inference tagged a `["chat","embeddings"]` model as embedding-only (`apiFormat: "embeddings"`), dropping it from the chat catalog. Fix: an explicit chat endpoint vetoes the embedding/rerank/image heuristics; chat models keep the tip's row shape (metadata only stamped for non-chat modalities). Also: - Restore the tip's `isTruncatedStreamBody` dep in streamingSemanticCacheStore and widen the predicate to the assembled-object body chatCore actually passes (the PR's object-shaped streaming cases are appended to the tip's test file). - Pass `provider` from chatCore to both cache store paths — the manager scopes entries per provider on lookup, so writes without it could never hit. - test-embedding route: `validateBody()` has no `.response`; invalid payloads returned `undefined` (TS2339 in api-typecheck). Now a proper 400. - New guard: tests/unit/semantic-cache-vector-layer-opt-in.test.ts.