From b454a0fbac31548a70ad4f8a6e61c68f1728cf27 Mon Sep 17 00:00:00 2001 From: asepharyana Date: Wed, 19 Aug 2026 22:52:05 +0700 Subject: [PATCH] fix(embeddings): defer EMBED_* validation to embed() runtime, not constructor Constructor threw if EMBED_BASE_URL/API_KEY/MODEL unset, which broke next build SSG collection (imports search pkg before .env exists). Validation now happens in embed() so the package is build-safe; a missing config still errors clearly when a semantic/hybrid search actually runs. With the DATABASE_URL import-time throw also removed, the whole monorepo now builds in CI without any .env present. --- packages/embeddings/src/provider.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/embeddings/src/provider.ts b/packages/embeddings/src/provider.ts index bb278db..74d0bb8 100644 --- a/packages/embeddings/src/provider.ts +++ b/packages/embeddings/src/provider.ts @@ -32,11 +32,11 @@ export class OpenRouterEmbeddingProvider implements EmbeddingProvider { this.baseUrl = (opts?.baseUrl ?? EMBED_BASE_URL).replace(/\/$/, ""); this.apiKey = opts?.apiKey ?? EMBED_API_KEY; this.model = opts?.model ?? EMBED_MODEL; - if (!this.baseUrl || !this.apiKey || !this.model) { - throw new Error( - "OpenRouterEmbeddingProvider: missing EMBED_BASE_URL / EMBED_API_KEY / EMBED_MODEL", - ); - } + // NOTE: we do NOT validate baseUrl/apiKey/model here. Throwing in the + // constructor breaks `next build` (SSG data collection imports the search + // package before any .env is present) and any runtime-injected env. The + // provider is constructed lazily at first query, so an unset config + // surfaces as a clear error from embed() at request time, not a build crash. } get dimensions(): number { @@ -45,6 +45,11 @@ export class OpenRouterEmbeddingProvider implements EmbeddingProvider { async embed(texts: string[]): Promise { if (texts.length === 0) return []; + if (!this.baseUrl || !this.apiKey || !this.model) { + throw new Error( + "OpenRouterEmbeddingProvider: missing EMBED_BASE_URL / EMBED_API_KEY / EMBED_MODEL at request time", + ); + } const res = await fetch(`${this.baseUrl}/embeddings`, { method: "POST", headers: {