This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
// SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
|
||||
// Where the knowledge module's vectors backend keeps its vectors (decision 2026-10-25): a linked
|
||||
// Qdrant, or pgvector when chosen explicitly, and otherwise no store at all. pgvector is never the
|
||||
// silent default: the platform's default managed Postgres image has no pgvector, and the migrate
|
||||
// job of a fresh app must not stop on `extension "vector" is not available` before anyone asked for
|
||||
// document AI. The migrate job and the readiness probe read the same decision.
|
||||
|
||||
import {
|
||||
KNOWLEDGE_VECTOR_STORE_VAR,
|
||||
NO_VECTOR_STORE_REASON,
|
||||
vectorStoreMigrationName,
|
||||
vectorStoreOf,
|
||||
} from "@app/config"
|
||||
import { describe, expect, it } from "vitest"
|
||||
import { vectorStoreMigration } from "../apps/worker/src/migrations.js"
|
||||
|
||||
const QDRANT = { QDRANT_URL: "http://qdrant.internal:6333" }
|
||||
|
||||
describe("the knowledge vector store", () => {
|
||||
it("is none by default, so a fresh app migrates on a Postgres without pgvector", () => {
|
||||
expect(vectorStoreOf({})).toBeNull()
|
||||
expect(vectorStoreMigrationName({})).toBeNull()
|
||||
expect(vectorStoreMigration({})).toBeNull()
|
||||
expect(NO_VECTOR_STORE_REASON).toContain(`${KNOWLEDGE_VECTOR_STORE_VAR}=pgvector`)
|
||||
})
|
||||
|
||||
it("is the linked Qdrant when one is linked, with no vector table", () => {
|
||||
expect(vectorStoreOf(QDRANT)).toBe("qdrant")
|
||||
expect(vectorStoreMigrationName(QDRANT)).toBeNull()
|
||||
expect(vectorStoreOf({ ...QDRANT, KNOWLEDGE_VECTOR_STORE: "qdrant" })).toBe("qdrant")
|
||||
// Qdrant required but not linked: no store, never a fallback to pgvector.
|
||||
expect(vectorStoreOf({ KNOWLEDGE_VECTOR_STORE: "qdrant" })).toBeNull()
|
||||
expect(vectorStoreMigrationName({ KNOWLEDGE_VECTOR_STORE: "qdrant" })).toBeNull()
|
||||
})
|
||||
|
||||
it("is pgvector only when chosen, and then the migrate job builds the table", () => {
|
||||
const chosen = { KNOWLEDGE_VECTOR_STORE: " PgVector " }
|
||||
expect(vectorStoreOf(chosen)).toBe("pgvector")
|
||||
expect(vectorStoreMigrationName(chosen)).toBe("0006_vectors")
|
||||
const migration = vectorStoreMigration({ ...chosen, VECTOR_DIMENSIONS: "8" })
|
||||
expect(migration?.name).toBe("0006_vectors")
|
||||
expect(migration?.statements[0]).toBe("create extension if not exists vector")
|
||||
// An explicit choice wins over a linked Qdrant.
|
||||
expect(vectorStoreOf({ ...QDRANT, KNOWLEDGE_VECTOR_STORE: "pgvector" })).toBe("pgvector")
|
||||
})
|
||||
|
||||
it("has no store on the platform backend and refuses an unknown choice", () => {
|
||||
expect(vectorStoreOf({ KNOWLEDGE_BACKEND: "platform", KNOWLEDGE_VECTOR_STORE: "pgvector" })).toBeNull()
|
||||
expect(vectorStoreMigrationName({ KNOWLEDGE_BACKEND: "platform", ...QDRANT })).toBeNull()
|
||||
expect(() => vectorStoreOf({ KNOWLEDGE_VECTOR_STORE: "sqlite" })).toThrow(KNOWLEDGE_VECTOR_STORE_VAR)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user