@askdb/config 1.0.0-beta.12 → 1.0.0-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +20 -17
  2. package/dist/bootstrap.d.ts +3 -0
  3. package/dist/bootstrap.d.ts.map +1 -1
  4. package/dist/bootstrap.js +16 -0
  5. package/dist/bootstrap.js.map +1 -1
  6. package/dist/constants.d.ts +15 -4
  7. package/dist/constants.d.ts.map +1 -1
  8. package/dist/constants.js +15 -4
  9. package/dist/constants.js.map +1 -1
  10. package/dist/defaults.d.ts +33 -1
  11. package/dist/defaults.d.ts.map +1 -1
  12. package/dist/defaults.js +46 -10
  13. package/dist/defaults.js.map +1 -1
  14. package/dist/diagnostics.d.ts +10 -0
  15. package/dist/diagnostics.d.ts.map +1 -0
  16. package/dist/diagnostics.js +13 -0
  17. package/dist/diagnostics.js.map +1 -0
  18. package/dist/flatten.d.ts +8 -1
  19. package/dist/flatten.d.ts.map +1 -1
  20. package/dist/flatten.js +100 -116
  21. package/dist/flatten.js.map +1 -1
  22. package/dist/index.d.ts +5 -4
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +3 -2
  25. package/dist/index.js.map +1 -1
  26. package/dist/normalize.d.ts +53 -0
  27. package/dist/normalize.d.ts.map +1 -0
  28. package/dist/normalize.js +398 -0
  29. package/dist/normalize.js.map +1 -0
  30. package/dist/projection.d.ts +12 -1
  31. package/dist/projection.d.ts.map +1 -1
  32. package/dist/projection.js +12 -3
  33. package/dist/projection.js.map +1 -1
  34. package/dist/runtime-config.d.ts +43 -3
  35. package/dist/runtime-config.d.ts.map +1 -1
  36. package/dist/runtime-config.js +57 -12
  37. package/dist/runtime-config.js.map +1 -1
  38. package/dist/runtime-store.d.ts +5 -0
  39. package/dist/runtime-store.d.ts.map +1 -1
  40. package/dist/runtime-store.js +20 -5
  41. package/dist/runtime-store.js.map +1 -1
  42. package/dist/scaffold/ai.d.ts +30 -0
  43. package/dist/scaffold/ai.d.ts.map +1 -0
  44. package/dist/scaffold/ai.js +54 -0
  45. package/dist/scaffold/ai.js.map +1 -0
  46. package/dist/scaffold/index.d.ts +8 -0
  47. package/dist/scaffold/index.d.ts.map +1 -0
  48. package/dist/scaffold/index.js +7 -0
  49. package/dist/scaffold/index.js.map +1 -0
  50. package/dist/types.d.ts +174 -106
  51. package/dist/types.d.ts.map +1 -1
  52. package/package.json +9 -4
@@ -0,0 +1,398 @@
1
+ import { ASKDB_AI_PROVIDERS, ASKDB_RAG_EMBEDDERS, ASKDB_REASONING_EFFORTS, } from "./constants.js";
2
+ import { DEFAULT_ANTHROPIC_LANGUAGE_MODEL, DEFAULT_AZURE_OPENAI_DEPLOYMENT, DEFAULT_GATEWAY_LANGUAGE_MODEL, DEFAULT_GOOGLE_LANGUAGE_MODEL, DEFAULT_MOCK_RAG_EMBEDDING_DIMENSIONS, DEFAULT_OPENAI_LANGUAGE_MODEL, DEFAULT_RAG_EMBEDDING_MODEL, defaultRagEmbeddingDimensions, parsePositiveInteger, } from "./defaults.js";
3
+ /** Every setting a built-in provider connection can carry, besides its name. */
4
+ const CONNECTION_FIELDS = ["apiKey", "secondaryApiKey", "resourceName", "baseUrl", "apiVersion"];
5
+ const DEFAULT_CONNECTION = "default";
6
+ /** Name of the connection a legacy RAG key moves to when it differs from the provider's default connection. */
7
+ const LEGACY_RAG_CONNECTION = "rag-embeddings";
8
+ /** Providers a legacy `rag.embedderConfig.openai` key or base URL can move to. */
9
+ const LEGACY_RAG_KEY_PROVIDERS = new Set(["openai", "azure", "foundry", "gateway"]);
10
+ /** Providers a legacy `"ai-sdk"` embedder without a model defaults to `text-embedding-3-small` on. */
11
+ const LEGACY_DEFAULT_EMBEDDING_MODEL_PROVIDERS = new Set(["openai", "azure", "foundry"]);
12
+ /**
13
+ * The width earlier AskDB versions assumed for a deprecated `rag.embedder` with no width set.
14
+ * Only for telling users which width an existing index has; AskDB no longer assumes it.
15
+ */
16
+ function widthEarlierVersionsAssumed(model) {
17
+ return defaultRagEmbeddingDimensions(model);
18
+ }
19
+ export function isMember(value, allowed) {
20
+ return allowed.includes(value);
21
+ }
22
+ function isBuiltinProvider(provider) {
23
+ return isMember(provider, ASKDB_AI_PROVIDERS);
24
+ }
25
+ function nonBlank(value) {
26
+ if (typeof value !== "string")
27
+ return undefined;
28
+ const trimmed = value.trim();
29
+ return trimmed === "" ? undefined : trimmed;
30
+ }
31
+ function defaultLanguageModel(provider) {
32
+ switch (provider) {
33
+ case "openai":
34
+ return DEFAULT_OPENAI_LANGUAGE_MODEL;
35
+ case "azure":
36
+ case "foundry":
37
+ return DEFAULT_AZURE_OPENAI_DEPLOYMENT;
38
+ case "anthropic":
39
+ return DEFAULT_ANTHROPIC_LANGUAGE_MODEL;
40
+ case "google":
41
+ return DEFAULT_GOOGLE_LANGUAGE_MODEL;
42
+ case "gateway":
43
+ return DEFAULT_GATEWAY_LANGUAGE_MODEL;
44
+ default:
45
+ return undefined;
46
+ }
47
+ }
48
+ function toConnection(raw, name) {
49
+ const connection = { name };
50
+ for (const field of CONNECTION_FIELDS) {
51
+ const value = nonBlank(raw[field]);
52
+ if (value !== undefined)
53
+ connection[field] = value;
54
+ }
55
+ return connection;
56
+ }
57
+ function readConnections(config) {
58
+ const table = new Map();
59
+ for (const [provider, value] of Object.entries(config.ai.providerConfig ?? {})) {
60
+ if (value === undefined || value === null)
61
+ continue;
62
+ const isList = Array.isArray(value);
63
+ const list = (isList ? value : [value]);
64
+ const label = `ai.providerConfig.${provider}`;
65
+ const entries = [];
66
+ for (const raw of list) {
67
+ const name = nonBlank(raw.name) ?? DEFAULT_CONNECTION;
68
+ if (entries.some((entry) => entry.connection.name === name)) {
69
+ throw new Error(`askdb.config: ${label} has more than one connection named "${name}"; connection names must be unique within a provider.`);
70
+ }
71
+ entries.push({
72
+ raw,
73
+ connection: toConnection(raw, name),
74
+ label: isList ? `${label} connection "${name}"` : label,
75
+ });
76
+ }
77
+ table.set(provider, { entries, label });
78
+ }
79
+ return table;
80
+ }
81
+ function connectionNames(provider) {
82
+ const names = provider?.entries.map((entry) => `"${entry.connection.name}"`) ?? [];
83
+ return names.length > 0 ? names.join(", ") : "none";
84
+ }
85
+ /**
86
+ * Looks up a section's connection: `connection` within `provider`, `"default"` when unnamed.
87
+ * A provider with named connections must name one `"default"` unless the section picks one. A
88
+ * custom provider with no connection at all gets an empty one (AI then resolves as disabled, as
89
+ * it always has); a built-in provider must have one.
90
+ */
91
+ function resolveConnection(table, section, provider, providerSource, connectionName) {
92
+ const providerConnections = table.get(provider);
93
+ const name = connectionName ?? DEFAULT_CONNECTION;
94
+ const found = providerConnections?.entries.find((entry) => entry.connection.name === name);
95
+ if (found)
96
+ return found;
97
+ if (connectionName !== undefined) {
98
+ throw new Error(`askdb.config: ai.${section}.connection is "${connectionName}", but ai.providerConfig.${provider} ` +
99
+ `has no connection by that name (it has: ${connectionNames(providerConnections)}).`);
100
+ }
101
+ if (providerConnections && providerConnections.entries.length > 0) {
102
+ throw new Error(`askdb.config: ai.providerConfig.${provider} has no connection named "default" ` +
103
+ `(it has: ${connectionNames(providerConnections)}); name one "default" or set ai.${section}.connection.`);
104
+ }
105
+ if (!isBuiltinProvider(provider))
106
+ return undefined;
107
+ throw new Error(`askdb.config: ai.providerConfig.${provider} is required when ${providerSource} is "${provider}". ` +
108
+ `(Did you put the settings under providerConfig.custom? That key was only for providers ` +
109
+ `without a first-party package, and it's deprecated: key a custom provider's connection by its provider id.)`);
110
+ }
111
+ function validateReasoning(reasoning, key) {
112
+ if (!reasoning)
113
+ return;
114
+ for (const value of [reasoning.effort, reasoning.nlToSql, reasoning.enrichment]) {
115
+ if (value !== undefined && !isMember(value, ASKDB_REASONING_EFFORTS)) {
116
+ throw new Error(`askdb.config: invalid ${key} value "${value}" (expected one of: ${ASKDB_REASONING_EFFORTS.join(", ")}).`);
117
+ }
118
+ }
119
+ }
120
+ function parseConfiguredDimensions(value, key) {
121
+ if (value === undefined || (typeof value === "string" && value.trim() === ""))
122
+ return undefined;
123
+ const parsed = parsePositiveInteger(value);
124
+ if (parsed === undefined) {
125
+ throw new Error(`askdb.config: ${key} must be a positive integer (got ${JSON.stringify(value)}).`);
126
+ }
127
+ return parsed;
128
+ }
129
+ /**
130
+ * Reads a deprecated width key and warns that it's deprecated. A value that isn't a positive
131
+ * integer is ignored, as it always was, and the warning says so.
132
+ */
133
+ function readLegacyWidth(value, key, context, warn) {
134
+ if (value === undefined || String(value).trim() === "")
135
+ return undefined;
136
+ const parsed = parsePositiveInteger(value);
137
+ warn(parsed === undefined
138
+ ? `askdb.config: ${key} is deprecated${context}, and ignored because it isn't a positive integer; ` +
139
+ "remove it, and set ai.embedding.dimensions if you need a width."
140
+ : `askdb.config: ${key} is deprecated${context}; move it to ai.embedding.dimensions.`);
141
+ return parsed;
142
+ }
143
+ /** Whether `rag.embedderConfig` holds any value (an empty `{}`, or one of unset `env()` reads, doesn't). */
144
+ function hasLegacyEmbedderConfig(rag) {
145
+ return Object.values(rag.embedderConfig ?? {}).some((branch) => branch !== undefined &&
146
+ branch !== null &&
147
+ Object.values(branch).some((value) => value !== undefined && String(value).trim() !== ""));
148
+ }
149
+ /**
150
+ * Translates `rag.embedder: "openai" | "ai-sdk"` plus `rag.embedderConfig.openai`. A legacy key
151
+ * or base URL moves to a connection of the embedding model's provider, and only for providers
152
+ * that ever accepted an OpenAI-shaped key (#345).
153
+ */
154
+ function translateLegacyEmbedder(embedder, rag, table, languageProvider, warn) {
155
+ const legacyOpenai = rag.embedderConfig?.openai ?? {};
156
+ const provider = embedder === "openai" ? "openai" : languageProvider;
157
+ warn(embedder === "openai"
158
+ ? `askdb.config: rag.embedder "openai" is deprecated; use rag.embedder: "ai" with ai.embedding: { provider: "openai", model }.`
159
+ : `askdb.config: rag.embedder "ai-sdk" is deprecated; use rag.embedder: "ai" with ai.embedding: { model }.`);
160
+ const legacyModel = nonBlank(legacyOpenai.model);
161
+ if (legacyModel !== undefined) {
162
+ warn("askdb.config: rag.embedderConfig.openai.model is deprecated; move it to ai.embedding.model.");
163
+ }
164
+ let model = legacyModel;
165
+ if (model === undefined) {
166
+ if (!LEGACY_DEFAULT_EMBEDDING_MODEL_PROVIDERS.has(provider)) {
167
+ throw new Error(`askdb.config: rag.embedder "${embedder}" embeds with "${provider}", which has no default embedding model; ` +
168
+ `set rag.embedder: "ai" and ai.embedding.model.`);
169
+ }
170
+ model = DEFAULT_RAG_EMBEDDING_MODEL;
171
+ }
172
+ const dimensions = readLegacyWidth(legacyOpenai.dimension, "rag.embedderConfig.openai.dimension", "", warn);
173
+ const apiKey = nonBlank(legacyOpenai.apiKey);
174
+ const baseUrl = nonBlank(legacyOpenai.baseUrl);
175
+ if (apiKey !== undefined || baseUrl !== undefined) {
176
+ if (!LEGACY_RAG_KEY_PROVIDERS.has(provider)) {
177
+ throw new Error(`askdb.config: rag.embedderConfig.openai.apiKey and .baseUrl can only move to an openai, azure, foundry or gateway ` +
178
+ `connection, but rag.embedder "${embedder}" embeds with "${provider}". Replace rag.embedderConfig with an ` +
179
+ `ai.embedding section and a connection for its provider, for example:\n` +
180
+ ` ai: {\n` +
181
+ ` embedding: { provider: "openai", model: "text-embedding-3-small" },\n` +
182
+ ` providerConfig: { openai: { apiKey: env("OPENAI_API_KEY") }, /* ...your ${provider} connection */ },\n` +
183
+ ` },\n` +
184
+ ` rag: { embedder: "ai", /* ...store */ },`);
185
+ }
186
+ const moveTo = `put it on a connection in ai.providerConfig.${provider} ` +
187
+ `(and point ai.embedding.connection at that connection if it isn't the default one).`;
188
+ if (apiKey !== undefined)
189
+ warn(`askdb.config: rag.embedderConfig.openai.apiKey is deprecated; ${moveTo}`);
190
+ if (baseUrl !== undefined)
191
+ warn(`askdb.config: rag.embedderConfig.openai.baseUrl is deprecated; ${moveTo}`);
192
+ }
193
+ const providerConnections = table.get(provider);
194
+ const defaultEntry = providerConnections?.entries.find((entry) => entry.connection.name === DEFAULT_CONNECTION);
195
+ if (!defaultEntry) {
196
+ if (apiKey === undefined && baseUrl === undefined && providerConnections && providerConnections.entries.length > 0) {
197
+ // Named connections but none called "default": resolving the section reports their names.
198
+ return { provider, model, dimensions, connection: undefined };
199
+ }
200
+ // A provider used only for embeddings: its legacy key (or nothing, as before) becomes the default connection.
201
+ const raw = { apiKey, baseUrl };
202
+ const entry = { raw, connection: toConnection(raw, DEFAULT_CONNECTION), label: `ai.providerConfig.${provider}` };
203
+ if (providerConnections)
204
+ providerConnections.entries.push(entry);
205
+ else
206
+ table.set(provider, { entries: [entry], label: entry.label });
207
+ }
208
+ else if ((apiKey !== undefined && apiKey !== defaultEntry.connection.apiKey) ||
209
+ (baseUrl !== undefined && baseUrl !== defaultEntry.connection.baseUrl)) {
210
+ if (providerConnections.entries.some((entry) => entry.connection.name === LEGACY_RAG_CONNECTION)) {
211
+ throw new Error(`askdb.config: ai.providerConfig.${provider} already has a connection named "${LEGACY_RAG_CONNECTION}", so ` +
212
+ `rag.embedderConfig.openai can't move there; put its key on a connection yourself and set ai.embedding.connection.`);
213
+ }
214
+ // On Azure, a base URL overrides the resource name, as it did before.
215
+ const connection = {
216
+ ...defaultEntry.connection,
217
+ ...(apiKey !== undefined ? { apiKey } : {}),
218
+ ...(baseUrl !== undefined ? { baseUrl } : {}),
219
+ name: LEGACY_RAG_CONNECTION,
220
+ };
221
+ providerConnections.entries.push({ raw: {}, connection, label: `ai.providerConfig.${provider}` });
222
+ return { provider, model, dimensions, connection: LEGACY_RAG_CONNECTION };
223
+ }
224
+ return { provider, model, dimensions, connection: undefined };
225
+ }
226
+ /**
227
+ * Translates a legacy `model` or `modelFamily` on a connection. On the language section's
228
+ * connection it's the language model (`modelFamily` only on Azure and Foundry), unless
229
+ * `ai.language.<field>` is set to something else; on any other connection it was never read.
230
+ * Returns the field's value for the language section.
231
+ */
232
+ function translateLegacyLanguageField(field, configured, table, languageEntry, warn) {
233
+ const target = `ai.language.${field}`;
234
+ let value = configured;
235
+ for (const [provider, providerConnections] of table) {
236
+ for (const entry of providerConnections.entries) {
237
+ const legacy = nonBlank(entry.raw[field]);
238
+ if (legacy === undefined)
239
+ continue;
240
+ const legacyKey = `${entry.label}.${field}`;
241
+ const translates = entry === languageEntry && (field === "model" || provider === "azure" || provider === "foundry");
242
+ if (!translates) {
243
+ warn(`askdb.config: ${legacyKey} is deprecated and ignored (it isn't on the language model's connection); remove it.`);
244
+ }
245
+ else if (value !== undefined && value !== legacy) {
246
+ warn(`askdb.config: ${legacyKey} is deprecated and ignored because ${target} is set; remove it.`);
247
+ }
248
+ else {
249
+ value = legacy;
250
+ warn(`askdb.config: ${legacyKey} is deprecated; move it to ${target}.`);
251
+ }
252
+ }
253
+ }
254
+ return value;
255
+ }
256
+ /**
257
+ * Translates every deprecated `ai` / `rag` key to the current shape and resolves the
258
+ * `ai.language` and `ai.embedding` sections to a provider, a connection and a model. Pure: it
259
+ * reads no environment, and returns one deprecation message per legacy key in use (each names
260
+ * the old and new location, never a value). Throws `askdb.config: …` errors for a config that
261
+ * can't load.
262
+ */
263
+ export function normalizeAskDbConfig(config) {
264
+ const deprecations = [];
265
+ const warn = (message) => {
266
+ if (!deprecations.includes(message))
267
+ deprecations.push(message);
268
+ };
269
+ const ai = config.ai;
270
+ // An omitted `rag` block means "not using retrieval": the mock embedder and the in-memory store,
271
+ // which write no store keys. This is the only place that default lives (#226): the flat map,
272
+ // defineConfig and the runtime view (`rt.rag.store`) all read the normalized block.
273
+ const authored = config.rag ?? { embedder: "mock", store: "memory", storeConfig: {} };
274
+ // `storeConfig` is typed as required, but a JS config can leave it out (the memory store needs none).
275
+ const rag = { ...authored, storeConfig: authored.storeConfig ?? {} };
276
+ // The default can't be seen in the file, so refuse a config whose embedding model it would leave unused.
277
+ if ((config.rag === undefined || config.rag === null) &&
278
+ Object.values(ai.embedding ?? {}).some((value) => value !== undefined && value !== null && String(value).trim() !== "")) {
279
+ throw new Error('askdb.config: ai.embedding is set but the config has no rag block; add rag: { embedder: "ai", store, storeConfig }, or remove ai.embedding.');
280
+ }
281
+ if (!isMember(rag.embedder, ASKDB_RAG_EMBEDDERS)) {
282
+ throw new Error(`askdb.config: invalid rag.embedder "${rag.embedder}" (expected one of: ${ASKDB_RAG_EMBEDDERS.join(", ")}).`);
283
+ }
284
+ const table = readConnections(config);
285
+ const topProvider = nonBlank(ai.provider);
286
+ // The legacy `providerConfig.custom` is the connection of a custom `ai.provider`.
287
+ const custom = table.get("custom");
288
+ if (custom && topProvider !== undefined && topProvider !== "custom" && !isBuiltinProvider(topProvider)) {
289
+ if (table.has(topProvider)) {
290
+ throw new Error(`askdb.config: ai.providerConfig.custom and ai.providerConfig.${topProvider} are both set; remove the legacy providerConfig.custom.`);
291
+ }
292
+ warn(`askdb.config: ai.providerConfig.custom is deprecated; key the connection by its provider id: ai.providerConfig.${topProvider}.`);
293
+ table.delete("custom");
294
+ table.set(topProvider, custom);
295
+ }
296
+ // The legacy `ai.reasoning` is `ai.language.reasoning`.
297
+ const language = ai.language ?? {};
298
+ if (ai.reasoning !== undefined && language.reasoning !== undefined) {
299
+ throw new Error("askdb.config: ai.reasoning and ai.language.reasoning are both set; remove the legacy ai.reasoning.");
300
+ }
301
+ if (ai.reasoning !== undefined) {
302
+ warn("askdb.config: ai.reasoning is deprecated; move it to ai.language.reasoning.");
303
+ }
304
+ validateReasoning(language.reasoning, "ai.language.reasoning");
305
+ validateReasoning(ai.reasoning, "ai.reasoning");
306
+ const reasoning = language.reasoning ?? ai.reasoning;
307
+ // Language section.
308
+ const languageProviderOwn = nonBlank(language.provider);
309
+ const languageProvider = languageProviderOwn ?? topProvider;
310
+ if (languageProvider === undefined) {
311
+ throw new Error("askdb.config: ai.language has no provider; set ai.language.provider or ai.provider.");
312
+ }
313
+ const languageEntry = resolveConnection(table, "language", languageProvider, languageProviderOwn !== undefined ? "ai.language.provider" : "ai.provider", nonBlank(language.connection));
314
+ const model = translateLegacyLanguageField("model", nonBlank(language.model), table, languageEntry, warn);
315
+ const modelFamily = translateLegacyLanguageField("modelFamily", nonBlank(language.modelFamily), table, languageEntry, warn);
316
+ const languageSection = {
317
+ provider: languageProvider,
318
+ connection: languageEntry?.connection ?? { name: DEFAULT_CONNECTION },
319
+ model: model ?? defaultLanguageModel(languageProvider),
320
+ modelFamily,
321
+ reasoning,
322
+ };
323
+ // Embedding section.
324
+ const legacyEmbedder = rag.embedder === "openai" || rag.embedder === "ai-sdk";
325
+ const hasLegacyConfig = hasLegacyEmbedderConfig(rag);
326
+ let embedding;
327
+ if (rag.embedder === "mock") {
328
+ if (hasLegacyConfig) {
329
+ warn('askdb.config: rag.embedderConfig is ignored because rag.embedder is "mock"; remove it.');
330
+ }
331
+ if (rag.store === "pgvector" && String(rag.storeConfig.pgvector?.dimensions ?? "").trim() !== "") {
332
+ warn(`askdb.config: rag.storeConfig.pgvector.dimensions is ignored because rag.embedder is "mock" ` +
333
+ `(its vectors are always ${DEFAULT_MOCK_RAG_EMBEDDING_DIMENSIONS} wide); remove it.`);
334
+ }
335
+ }
336
+ else {
337
+ if (legacyEmbedder && ai.embedding !== undefined) {
338
+ throw new Error(`askdb.config: ai.embedding is set but rag.embedder is "${rag.embedder}"; set rag.embedder: "ai" and remove rag.embedderConfig.`);
339
+ }
340
+ if (!legacyEmbedder && hasLegacyConfig) {
341
+ throw new Error('askdb.config: rag.embedderConfig is set but rag.embedder is "ai"; move its settings to ai.embedding and ai.providerConfig, then remove it.');
342
+ }
343
+ const legacy = rag.embedder === "openai" || rag.embedder === "ai-sdk"
344
+ ? translateLegacyEmbedder(rag.embedder, rag, table, languageProvider, warn)
345
+ : undefined;
346
+ const section = ai.embedding ?? {};
347
+ const embeddingModel = legacy?.model ?? nonBlank(section.model);
348
+ if (embeddingModel === undefined) {
349
+ throw new Error('askdb.config: rag.embedder is "ai" but ai.embedding.model is not set.');
350
+ }
351
+ const providerOwn = legacy?.provider ?? nonBlank(section.provider);
352
+ const provider = providerOwn ?? topProvider;
353
+ if (provider === undefined) {
354
+ throw new Error("askdb.config: ai.embedding has no provider; set ai.embedding.provider or ai.provider.");
355
+ }
356
+ if (provider === "anthropic") {
357
+ throw new Error('askdb.config: anthropic has no embeddings API; set ai.embedding.provider (for example "openai") and give it a connection in ai.providerConfig.');
358
+ }
359
+ const embeddingEntry = resolveConnection(table, "embedding", provider, providerOwn !== undefined ? "ai.embedding.provider" : "ai.provider", legacy ? legacy.connection : nonBlank(section.connection));
360
+ let dimensions = legacy ? legacy.dimensions : parseConfiguredDimensions(section.dimensions, "ai.embedding.dimensions");
361
+ const dimensionsKey = legacy ? "rag.embedderConfig.openai.dimension" : "ai.embedding.dimensions";
362
+ // The legacy pgvector width moves to the embedding section.
363
+ const pgvectorDimensions = rag.store === "pgvector"
364
+ ? readLegacyWidth(rag.storeConfig.pgvector?.dimensions, "rag.storeConfig.pgvector.dimensions", ` with rag.embedder "${rag.embedder}"`, warn)
365
+ : undefined;
366
+ if (pgvectorDimensions !== undefined) {
367
+ if (dimensions !== undefined && dimensions !== pgvectorDimensions) {
368
+ throw new Error(`askdb.config: ${dimensionsKey} is ${dimensions} but rag.storeConfig.pgvector.dimensions is ${pgvectorDimensions}; ` +
369
+ `remove rag.storeConfig.pgvector.dimensions and keep one width in ai.embedding.dimensions.`);
370
+ }
371
+ dimensions = pgvectorDimensions;
372
+ }
373
+ // AskDB assumes no width: it uses the one the model returns. The deprecated embedders assumed
374
+ // one, so an index they built has it; say which, so the index can be kept or rebuilt.
375
+ if (legacy && dimensions === undefined) {
376
+ const earlierWidth = widthEarlierVersionsAssumed(embeddingModel);
377
+ warn(`askdb.config: rag.embedder "${rag.embedder}" no longer assumes ${earlierWidth} dimensions for embedding model ` +
378
+ `"${embeddingModel}"; AskDB now uses the width the model returns. An index built with an earlier AskDB ` +
379
+ `version is ${earlierWidth} wide: to keep it, move to ai.embedding and set ai.embedding.dimensions: ${earlierWidth}. ` +
380
+ `Otherwise rebuild the index.`);
381
+ }
382
+ embedding = {
383
+ provider,
384
+ connection: embeddingEntry?.connection ?? { name: DEFAULT_CONNECTION },
385
+ model: embeddingModel,
386
+ dimensions,
387
+ };
388
+ }
389
+ return {
390
+ config: {
391
+ ...config,
392
+ ai: { language: languageSection, embedding },
393
+ rag: { embedder: embedding ? "ai" : "mock", store: rag.store, storeConfig: rag.storeConfig },
394
+ },
395
+ deprecations,
396
+ };
397
+ }
398
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,11 @@ export type AskDbEnvProjection = {
5
5
  /** Nested config as authored (same reference passed to {@link defineConfig}). */
6
6
  readonly config: AskDbConfig;
7
7
  readonly entries: Readonly<Record<string, string>>;
8
+ /**
9
+ * One message per deprecated key `config` uses. {@link bootstrapAskDbEnv} emits each as a
10
+ * `DeprecationWarning`. Absent on projections built by an older `@askdb/config`.
11
+ */
12
+ readonly deprecations?: readonly string[];
8
13
  };
9
14
  /**
10
15
  * Wraps a nested {@link AskDbConfig} for bootstrap merge. Check the object with TypeScript’s
@@ -12,10 +17,16 @@ export type AskDbEnvProjection = {
12
17
  *
13
18
  * ```ts
14
19
  * export default defineConfig({
15
- * ai: { provider: "openai", providerConfig: { openai: { apiKey: "", model: "gpt-4o-mini" } } },
20
+ * ai: {
21
+ * provider: "openai",
22
+ * providerConfig: { openai: { apiKey: env("OPENAI_API_KEY") } },
23
+ * language: { model: "gpt-4o-mini" },
24
+ * },
16
25
  * // ...
17
26
  * } satisfies AskDbConfig);
18
27
  * ```
28
+ *
29
+ * Throws an `askdb.config: …` error for a config that can't load.
19
30
  */
20
31
  export declare function defineConfig<const T extends AskDbConfig>(config: T): AskDbEnvProjection;
21
32
  export declare function isAskDbEnvProjection(value: unknown): value is AskDbEnvProjection;
@@ -1 +1 @@
1
- {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,eAAO,MAAM,oBAAoB,eAAoC,CAAC;AAEtE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC;IACtC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,MAAM,EAAE,CAAC,GAAG,kBAAkB,CAMvF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAYhF"}
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,eAAO,MAAM,oBAAoB,eAAoC,CAAC;AAEtE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC;IACtC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,MAAM,EAAE,CAAC,GAAG,kBAAkB,CAQvF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAYhF"}
@@ -1,4 +1,5 @@
1
- import { flattenAskDbConfig } from "./flatten.js";
1
+ import { flattenNormalizedAskDbConfig } from "./flatten.js";
2
+ import { normalizeAskDbConfig } from "./normalize.js";
2
3
  export const ASKDB_ENV_PROJECTION = Symbol.for("askdb.envProjection");
3
4
  /**
4
5
  * Wraps a nested {@link AskDbConfig} for bootstrap merge. Check the object with TypeScript’s
@@ -6,16 +7,24 @@ export const ASKDB_ENV_PROJECTION = Symbol.for("askdb.envProjection");
6
7
  *
7
8
  * ```ts
8
9
  * export default defineConfig({
9
- * ai: { provider: "openai", providerConfig: { openai: { apiKey: "", model: "gpt-4o-mini" } } },
10
+ * ai: {
11
+ * provider: "openai",
12
+ * providerConfig: { openai: { apiKey: env("OPENAI_API_KEY") } },
13
+ * language: { model: "gpt-4o-mini" },
14
+ * },
10
15
  * // ...
11
16
  * } satisfies AskDbConfig);
12
17
  * ```
18
+ *
19
+ * Throws an `askdb.config: …` error for a config that can't load.
13
20
  */
14
21
  export function defineConfig(config) {
22
+ const { config: normalized, deprecations } = normalizeAskDbConfig(config);
15
23
  return {
16
24
  [ASKDB_ENV_PROJECTION]: true,
17
25
  config,
18
- entries: flattenAskDbConfig(config),
26
+ entries: flattenNormalizedAskDbConfig(normalized),
27
+ deprecations,
19
28
  };
20
29
  }
21
30
  export function isAskDbEnvProjection(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAStE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAA8B,MAAS;IACjE,OAAO;QACL,CAAC,oBAAoB,CAAC,EAAE,IAAI;QAC5B,MAAM;QACN,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,oBAAoB,IAAI,KAAK;QAC5B,KAA4B,CAAC,oBAAoB,CAAC,KAAK,IAAI;QAC5D,OAAQ,KAA4B,CAAC,OAAO,KAAK,QAAQ;QACxD,KAA4B,CAAC,OAAO,KAAK,IAAI;QAC9C,QAAQ,IAAI,KAAK;QACjB,OAAQ,KAA4B,CAAC,MAAM,KAAK,QAAQ;QACvD,KAA4B,CAAC,MAAM,KAAK,IAAI,CAC9C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AActE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,YAAY,CAA8B,MAAS;IACjE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1E,OAAO;QACL,CAAC,oBAAoB,CAAC,EAAE,IAAI;QAC5B,MAAM;QACN,OAAO,EAAE,4BAA4B,CAAC,UAAU,CAAC;QACjD,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,oBAAoB,IAAI,KAAK;QAC5B,KAA4B,CAAC,oBAAoB,CAAC,KAAK,IAAI;QAC5D,OAAQ,KAA4B,CAAC,OAAO,KAAK,QAAQ;QACxD,KAA4B,CAAC,OAAO,KAAK,IAAI;QAC9C,QAAQ,IAAI,KAAK;QACjB,OAAQ,KAA4B,CAAC,MAAM,KAAK,QAAQ;QACvD,KAA4B,CAAC,MAAM,KAAK,IAAI,CAC9C,CAAC;AACJ,CAAC"}
@@ -1,16 +1,46 @@
1
- import type { AskDbDialectId, AskDbIntrospectionProvider, AskDbStudioExecuteProvider } from "./constants.js";
1
+ import type { AskDbDialectId, AskDbIntrospectionProvider, AskDbRagStore, AskDbStudioExecuteProvider } from "./constants.js";
2
2
  import type { AskDbConfig } from "./types.js";
3
+ /** One resolved `ai` section: its provider, the connection it uses, its model, and an env view built from that connection only. */
4
+ export type AskDbRuntimeAiSection = {
5
+ provider: string;
6
+ /** Connection name within `ai.providerConfig.<provider>`. */
7
+ connection: string;
8
+ model: string | undefined;
9
+ /** `AiEnv` for `@askdb/ai` registry calls, built from this section's connection only. */
10
+ env: Record<string, string | undefined>;
11
+ };
3
12
  /**
4
13
  * Typed AI runtime settings for `@askdb/core` (not `process.env`).
5
14
  */
6
15
  export type AskDbRuntimeAiConfig = {
7
16
  /**
8
- * Flat env-shaped map built from the runtime snapshot. Pass to
9
- * `@askdb/ai` registry methods such as `resolveAiConfig` and
17
+ * Flat env-shaped map built from the runtime snapshot: the language view plus every other
18
+ * canonical key. Pass to `@askdb/ai` registry methods such as `resolveAiConfig` and
10
19
  * `createLanguageModelFromEnv`.
11
20
  */
12
21
  aiEnv: Record<string, string | undefined>;
22
+ /** `ai.language`: the language model. `model` is undefined only for a custom provider with no model set. */
23
+ language: AskDbRuntimeAiSection & {
24
+ modelFamily: string | undefined;
25
+ };
26
+ /**
27
+ * `ai.embedding`: the embedding model. Undefined unless `rag.embedder` is `"ai"`. Pass `env`
28
+ * to `resolveEmbeddingConfig` / `createEmbeddingModelFromEnv`, and `{ dimensions }` as the
29
+ * latter's options: `env` holds the connection and model, not the width.
30
+ */
31
+ embedding: (AskDbRuntimeAiSection & {
32
+ model: string;
33
+ /**
34
+ * `ai.embedding.dimensions`: the vector size to request from the provider. Undefined
35
+ * leaves the width to the model; `detectEmbeddingDimensions` in `@askdb/rag` learns it.
36
+ */
37
+ dimensions: number | undefined;
38
+ }) | undefined;
13
39
  };
40
+ /**
41
+ * OpenAI embedder settings for the `askdb-rag` CLI. Filled from `ai.embedding` when its provider
42
+ * is `openai`; otherwise only from the OpenAI language connection.
43
+ */
14
44
  export type AskDbRuntimeRagEmbedderConfig = {
15
45
  apiKey: string | undefined;
16
46
  baseURL: string | undefined;
@@ -18,6 +48,10 @@ export type AskDbRuntimeRagEmbedderConfig = {
18
48
  };
19
49
  export type AskDbRuntimeRagConfig = {
20
50
  embedder: AskDbRuntimeRagEmbedderConfig;
51
+ /** `rag.store`, or `"memory"` when the config has no `rag` block. Read this rather than `structured.rag`, which is `undefined` when the block is omitted. */
52
+ store: AskDbRagStore;
53
+ /** `rag.storeConfig` as written, with no defaults filled in; `{}` when the config has no `rag` block or the block has no `storeConfig`. */
54
+ storeConfig: NonNullable<AskDbConfig["rag"]>["storeConfig"];
21
55
  };
22
56
  export type AskDbRuntimeLoggingConfig = {
23
57
  level: string | undefined;
@@ -30,6 +64,10 @@ export type AskDbRuntimeHttpApiConfig = {
30
64
  port: number;
31
65
  host: string;
32
66
  };
67
+ /** Whether `POST /ask` accepts a per-request `schemaJson` override. Default `false`. */
68
+ allowSchemaOverride: boolean;
69
+ /** Model-call timeout per `POST /ask` request, in milliseconds (1 to 2147483647). Default `60000`. */
70
+ requestTimeoutMs: number;
33
71
  };
34
72
  export type AskDbRuntimeIntrospectionConfig = {
35
73
  provider: AskDbIntrospectionProvider;
@@ -130,6 +168,8 @@ export type AskDbRuntimeConfig = {
130
168
  modes: AskDbRuntimeModesConfig;
131
169
  nlToSql: AskDbRuntimeNlToSqlConfig;
132
170
  studio: AskDbRuntimeStudioConfig;
171
+ /** One message per deprecated config key in use (it names the old and new key, never a value). */
172
+ deprecations: readonly string[];
133
173
  };
134
174
  /**
135
175
  * Returns typed runtime configuration from the snapshot installed by {@link bootstrapAskDbEnv}.
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-config.d.ts","sourceRoot":"","sources":["../src/runtime-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime-config.d.ts","sourceRoot":"","sources":["../src/runtime-config.ts"],"names":[],"mappings":"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"}