@askdb/client 0.1.0-beta.1 → 1.0.0-beta.10

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.
package/README.md CHANGED
@@ -1,13 +1,11 @@
1
1
  # @askdb/client
2
2
 
3
- Config-aware AskDB facade. Resolves schema, model, and dialect from your runtime config so callers only pass a question.
3
+ Config-aware AskDB facade. Resolves schema, model, dialect, and mode from your runtime config so callers only pass a question.
4
4
 
5
5
  ## Quick start
6
6
 
7
7
  ```ts
8
8
  import { bootstrapAskDbEnv, getAskDbRuntimeConfig } from "@askdb/config";
9
- import { createAiRegistry } from "@askdb/ai";
10
- import { openaiProvider } from "@askdb/ai-openai";
11
9
  import { createAskDb } from "@askdb/client";
12
10
 
13
11
  // bootstrapAskDbEnv() reads .env and askdb.config.* into an in-memory snapshot.
@@ -15,22 +13,28 @@ import { createAskDb } from "@askdb/client";
15
13
  // Both calls are needed: bootstrap populates the store; getAskDbRuntimeConfig reads it.
16
14
  bootstrapAskDbEnv();
17
15
  const askdb = createAskDb({
18
- config: getAskDbRuntimeConfig(),
19
- registry: createAiRegistry([openaiProvider]),
16
+ config: getAskDbRuntimeConfig(), // ai.provider in askdb.config.* picks the model
20
17
  });
21
18
 
22
19
  const { sql } = await askdb.ask("top 10 customers by revenue");
23
20
  ```
24
21
 
22
+ Install the AI SDK package for whichever `ai.provider` your config selects — e.g. `npm i @askdb/client @askdb/core @askdb/config ai @ai-sdk/openai` (`@askdb/core` and `ai`, AI SDK 7, are required peers of the client; npm adds them for you, Yarn doesn't). With no `providers`/`registry` option, the client registers every provider built into `@askdb/ai` (OpenAI, Azure/Foundry, Google, Anthropic, Vercel AI Gateway); each loads its `@ai-sdk/*` package only when first used, and a missing one fails with an `npm i @ai-sdk/<provider>` hint.
23
+
24
+ Options: `providers: ["openai"]` restricts the set to named built-ins, and `AiProviderAdapter` objects add custom providers (`providers: ["openai", myAdapter]`). Advanced alternative: build a registry yourself with `createAiRegistry` from `@askdb/ai` and pass it as `registry` (e.g. to share one registry across several clients). Pass at most one of `providers` or `registry`.
25
+
26
+ To bypass config-driven model selection entirely, pass an AI SDK `LanguageModel` per call (`askdb.ask(q, { model })`) or call `ask()` from `@askdb/core` directly.
27
+
25
28
  ## Per-call overrides
26
29
 
27
- All three resolution axes accept optional per-call overrides:
30
+ Each resolution axis accepts an optional per-call override:
28
31
 
29
32
  | Override | Type | Default |
30
33
  |---|---|---|
31
34
  | `schema` | `{ path }` \| `{ json }` \| `{ schema }` \| `NormalizedSchema` | From `createAskDb({ schema })` → config `host.schemaPath`/`host.schemaJson` → env |
32
35
  | `model` | `AskDbLanguageModel` | From registry via config `ai.aiEnv` |
33
36
  | `dialect` | `AskDialectInput` | Config `dialect` → schema `provider` → `"postgres"` |
37
+ | `mode` | `AskDbModeV1` | Config `modes.askdbMode` → `"schema_only"`. A per-call mode can only tighten it: `"bounded_results"` runs the config mode (ADR 0025). |
34
38
 
35
39
  ```ts
36
40
  const { sql } = await askdb.ask("count active users", {
@@ -39,6 +43,26 @@ const { sql } = await askdb.ask("count active users", {
39
43
  });
40
44
  ```
41
45
 
46
+ ## Parameterized output
47
+
48
+ `askdb.ask()` returns the same `AskPipelineResult` as `@askdb/core`'s `ask()`, including optional `unboundSql`, `params`, `parameters`, and `preparedQuery` when the model complies (default `parameterize: true`). The facade forwards options and returns the core result verbatim, `verdict` included.
49
+
50
+ ```ts
51
+ const result = await askdb.ask("How many cities does Colorado have?", { tenantScope });
52
+
53
+ // Tenant IDs are driver parameters by default (tenantSqlMode: "sql-params").
54
+ await pool.query(result.sql, result.tenantParams);
55
+ await pool.query(result.unboundSql!, result.params);
56
+
57
+ // A new value, no model call.
58
+ const rebound = await askdb.bind(result.preparedQuery!, { state_name: "Utah" }, { tenantScope });
59
+ await pool.query(rebound.sql, rebound.tenantParams ?? []);
60
+ ```
61
+
62
+ Every `ask()` is still one model call. Set `{ parameterize: false }` to opt out of the extra output tokens. Each SQL form runs with its own array: `sql` with `tenantParams`, `unboundSql` with `params` (which already holds the tenant IDs); never concatenate them. Set `tenantSqlMode: "sql-only"` to get the tenant IDs inlined in `sql` instead.
63
+
64
+ `askdb.bind(prepared, values, options?)` wraps `@askdb/core`'s `bindPreparedQuery()`: it checks the stored template under the client's schema (or `options.schema`), the `tenantScope` you pass and the modes (`sensitiveGuardrailMode`, `acceptWarnings`), under the `dialect` you pass when `ask()` ran with your own `DialectSpec`, expands a `subtree` scope with `options.resolveTenantDescendants`, and renders the tenant IDs from the scope. Authorizing that scope remains the host's job, as for `ask()`.
65
+
42
66
  ## Multi-tenant usage
43
67
 
44
68
  The schema and model caches are **per-client-instance**. For multi-tenant servers where each tenant has a different schema, either:
@@ -47,7 +71,7 @@ The schema and model caches are **per-client-instance**. For multi-tenant server
47
71
 
48
72
  ## `reload()`
49
73
 
50
- Drops the cached schema and model so the next `ask()` re-resolves them from config:
74
+ Drops the cached schema, model and AI config, so the next call resolves them again from the config snapshot the client was created with. To pick up a changed `askdb.config.*`, create a new client.
51
75
 
52
76
  ```ts
53
77
  askdb.reload();
@@ -60,7 +84,6 @@ Inspect how schema, model, and dialect resolved on each call — useful for logg
60
84
  ```ts
61
85
  const askdb = createAskDb({
62
86
  config,
63
- registry,
64
87
  onResolve: ({ dialect, modelSource }) => {
65
88
  console.log(`dialect=${dialect.dialect} (${dialect.source}), model=${modelSource}`);
66
89
  },
package/dist/client.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import type { AiRegistry } from "@askdb/ai";
1
+ import { type AiProviderAdapters, type AiRegistry, type ReasoningEffort } from "@askdb/ai";
2
2
  import type { AskDbRuntimeConfig } from "@askdb/config";
3
- import { type AnyNormalizedSchema, type AskDbLanguageModel, type AskDialectInput, type AskPipelineOptions, type AskPipelineResult } from "@askdb/core";
4
- import type { BuiltInDialectId } from "@askdb/core";
3
+ import { type AnyNormalizedSchema, type AskDbLanguageModel, type AskDbModeV1, type AskDialectInput, type AskPipelineOptions, type AskPipelineResult, type BindGuardrails, type BuiltInDialectId, type BoundQuery, type PreparedQuery, type QueryParameterValue, type ResolveTenantDescendants } from "@askdb/core";
5
4
  /** Where a schema comes from. A pre-loaded object short-circuits loading. */
6
5
  export type SchemaSource = {
7
6
  path: string;
@@ -10,11 +9,32 @@ export type SchemaSource = {
10
9
  } | {
11
10
  schema: AnyNormalizedSchema;
12
11
  };
13
- /** Per-call options. Everything is optional; anything set overrides the client default. */
14
- export type AskOverrides = Omit<AskPipelineOptions, "question" | "schema" | "model" | "dialect"> & {
12
+ /**
13
+ * Per-call options. Everything is optional; anything set overrides the client default,
14
+ * except the two config `modes` settings, which a call can only tighten.
15
+ */
16
+ export type AskOverrides = Omit<AskPipelineOptions, "question" | "schema" | "model" | "dialect" | "mode"> & {
17
+ /**
18
+ * Trust boundary for this call. Config `modes.askdbMode` (unset: `"schema_only"`) is the
19
+ * loosest mode a call gets: `"schema_only"` tightens it, `"bounded_results"` can't loosen it.
20
+ */
21
+ mode?: AskDbModeV1;
15
22
  schema?: SchemaSource | AnyNormalizedSchema;
16
23
  model?: AskDbLanguageModel;
17
24
  dialect?: AskDialectInput;
25
+ /**
26
+ * Provider-portable reasoning/latency effort for this call, overriding the
27
+ * client default and `askdb.config.ts`'s `ai.reasoning.nlToSql`/`effort`.
28
+ * Ignored when `model` or `deps.generateText` is also set (BYO paths).
29
+ */
30
+ reasoningEffort?: ReasoningEffort;
31
+ };
32
+ /** Options for {@link AskDbClient.bind}. Everything is optional; `schema` overrides the client's schema. */
33
+ export type BindOptions = Omit<BindGuardrails, "schema"> & {
34
+ /** The schema to check the template under. Defaults to the schema `ask()` resolves. */
35
+ schema?: SchemaSource | AnyNormalizedSchema;
36
+ /** Expands a `subtree` `tenantScope` before binding, as in `ask()`. */
37
+ resolveTenantDescendants?: ResolveTenantDescendants;
18
38
  };
19
39
  export type DialectResolution = {
20
40
  dialect: AskDialectInput;
@@ -25,8 +45,22 @@ export type DialectResolution = {
25
45
  export type CreateAskDbOptions = {
26
46
  /** Runtime snapshot, e.g. from `getAskDbRuntimeConfig()`. */
27
47
  config: AskDbRuntimeConfig;
28
- /** AI registry built from host-registered adapters via `createAiRegistry(...)`. */
29
- registry: AiRegistry;
48
+ /**
49
+ * Which AI providers the client can build models for. Optional: when neither
50
+ * `providers` nor `registry` is passed, every provider built into `@askdb/ai`
51
+ * is registered and `ai.provider` in your config picks one — install the
52
+ * matching SDK (e.g. `@ai-sdk/openai`), which is loaded on first use.
53
+ *
54
+ * Pass built-in names to restrict the set (`providers: ["openai"]`), or
55
+ * `AiProviderAdapter` objects for custom providers (mixable with names).
56
+ * Pass at most one of `providers` or `registry`.
57
+ */
58
+ providers?: AiProviderAdapters;
59
+ /**
60
+ * Prebuilt AI registry from `createAiRegistry(...)` — advanced alternative
61
+ * to `providers`, e.g. to share one registry across several clients.
62
+ */
63
+ registry?: AiRegistry;
30
64
  /** Default schema source. Falls back to config `host.schemaJson`/`host.schemaPath`/env. */
31
65
  schema?: SchemaSource;
32
66
  /** Default dialect override. Falls back to config.dialect → schema.provider → "postgres". */
@@ -41,9 +75,23 @@ export type CreateAskDbOptions = {
41
75
  dialect: DialectResolution;
42
76
  modelSource: "override" | "registry" | "mock";
43
77
  }) => void;
78
+ /**
79
+ * Client-level default reasoning/latency effort for NL→SQL generation
80
+ * (`ask()`). When set, takes precedence over `askdb.config.ts`'s
81
+ * `ai.reasoning.nlToSql`/`effort` env resolution; overridden per-call by
82
+ * `AskOverrides.reasoningEffort`.
83
+ */
84
+ reasoningEffort?: ReasoningEffort;
44
85
  };
45
86
  export type AskDbClient = {
46
87
  ask(question: string, overrides?: AskOverrides): Promise<AskPipelineResult>;
88
+ /**
89
+ * Rebind a stored `preparedQuery` with new values, without calling the model. Checks the
90
+ * template under the client's schema (the one `ask()` resolves, unless `options.schema`
91
+ * is set), the given tenant scope and modes, expands a `subtree` scope with
92
+ * `options.resolveTenantDescendants`, and forwards to `@askdb/core`'s `bindPreparedQuery()`.
93
+ */
94
+ bind(prepared: PreparedQuery, values: Record<string, QueryParameterValue | readonly QueryParameterValue[]>, options?: BindOptions): Promise<BoundQuery>;
47
95
  /** Drop cached schema + model so the next ask() re-resolves them. */
48
96
  reload(): void;
49
97
  };
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EAEpB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQpD,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEpC,2FAA2F;AAC3F,MAAM,MAAM,YAAY,GAAG,IAAI,CAC7B,kBAAkB,EAClB,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAC5C,GAAG;IACF,MAAM,CAAC,EAAE,YAAY,GAAG,mBAAmB,CAAC;IAC5C,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrD,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,6DAA6D;IAC7D,MAAM,EAAE,kBAAkB,CAAC;IAC3B,mFAAmF;IACnF,QAAQ,EAAE,UAAU,CAAC;IACrB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,6FAA6F;IAC7F,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAAC;IAC/C,gGAAgG;IAChG,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,iBAAiB,CAAC;QAAC,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC3G,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC5E,qEAAqE;IACrE,MAAM,IAAI,IAAI,CAAC;CAChB,CAAC;AAEF,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAyIpE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -1,12 +1,23 @@
1
- import { ask, isBuiltInDialectId, loadSchema, loadSchemaFromJson, SUPPORTED_DIALECT_IDS, } from "@askdb/core";
1
+ import { createAiRegistry, resolveReasoningEffort, } from "@askdb/ai";
2
+ import { ask, bindPreparedQuery, expandTenantScope, isBuiltInDialectId, loadSchema, loadSchemaFromJson, parseAskDbModeV1, SUPPORTED_DIALECT_IDS, } from "@askdb/core";
2
3
  import { DialectNotSupportedError, ModelNotConfiguredError, SchemaLoadError, SchemaNotConfiguredError, } from "./errors.js";
4
+ function resolveRegistry(options) {
5
+ if (options.registry && options.providers) {
6
+ throw new Error("createAskDb: pass either `providers` or `registry`, not both.");
7
+ }
8
+ if (options.registry)
9
+ return options.registry;
10
+ // No providers/registry: register every built-in provider (each loads its
11
+ // @ai-sdk/* package lazily), so `createAskDb({ config })` is enough.
12
+ return createAiRegistry(options.providers);
13
+ }
3
14
  export function createAskDb(options) {
4
- const { config, registry } = options;
15
+ const { config } = options;
16
+ const registry = resolveRegistry(options);
5
17
  let cachedSchema;
6
18
  let cachedModel;
19
+ let cachedAiConfig;
7
20
  function schemaSourceLabel(src) {
8
- if ("schemaId" in src)
9
- return "schema";
10
21
  if ("schema" in src)
11
22
  return "schema";
12
23
  if ("json" in src)
@@ -14,7 +25,8 @@ export function createAskDb(options) {
14
25
  return `path (${src.path})`;
15
26
  }
16
27
  function loadFromSource(src, label) {
17
- if ("schemaId" in src)
28
+ // A normalized schema, v1 or v2, passed as is: every one has `tables`, no SchemaSource does.
29
+ if ("tables" in src)
18
30
  return src;
19
31
  if ("schema" in src)
20
32
  return src.schema;
@@ -36,12 +48,12 @@ export function createAskDb(options) {
36
48
  }
37
49
  const host = config.structured.host;
38
50
  const env = config.ai.aiEnv;
39
- const json = (host?.schemaJson?.trim() || env["ASKDB_SCHEMA_JSON"]?.trim()) || undefined;
51
+ const json = host?.schemaJson?.trim() || env["ASKDB_SCHEMA_JSON"]?.trim();
40
52
  if (json) {
41
53
  cachedSchema = loadFromSource({ json }, host?.schemaJson?.trim() ? "host.schemaJson" : "ASKDB_SCHEMA_JSON");
42
54
  return cachedSchema;
43
55
  }
44
- const path = (host?.schemaPath?.trim() || env["ASKDB_SCHEMA_PATH"]?.trim()) || undefined;
56
+ const path = host?.schemaPath?.trim() || env["ASKDB_SCHEMA_PATH"]?.trim();
45
57
  if (path) {
46
58
  cachedSchema = loadFromSource({ path }, host?.schemaPath?.trim() ? `host.schemaPath (${path})` : `ASKDB_SCHEMA_PATH (${path})`);
47
59
  return cachedSchema;
@@ -49,9 +61,7 @@ export function createAskDb(options) {
49
61
  throw new SchemaNotConfiguredError("No schema configured. Pass `schema` to createAskDb() or per-call, or set host.schemaPath / host.schemaJson in askdb.config.*.");
50
62
  }
51
63
  function schemaProviderOf(schema) {
52
- return "provider" in schema && typeof schema["provider"] === "string"
53
- ? schema["provider"]
54
- : undefined;
64
+ return "provider" in schema && typeof schema.provider === "string" ? schema.provider : undefined;
55
65
  }
56
66
  function resolveDialect(schema, override) {
57
67
  if (override)
@@ -85,46 +95,83 @@ export function createAskDb(options) {
85
95
  }
86
96
  return { dialect: "postgres", source: "default" };
87
97
  }
88
- async function resolveModel(override, deps) {
98
+ async function resolveModel(override, deps, reasoningEffortOverride) {
89
99
  if (override)
90
100
  return { model: override, source: "override" };
91
101
  if (deps?.generateText) {
92
- return { model: undefined, deps, source: "mock" };
102
+ return { model: undefined, source: "mock", mockDeps: deps };
93
103
  }
94
104
  const mockSql = config.dev.mockSql;
95
105
  if (mockSql !== undefined) {
96
106
  return {
97
107
  model: undefined,
98
- deps: { generateText: (async () => ({ text: mockSql })) },
99
108
  source: "mock",
109
+ mockDeps: { generateText: (async () => ({ text: mockSql })) },
100
110
  };
101
111
  }
102
- if (cachedModel)
103
- return { model: cachedModel, source: "registry" };
104
- const model = await registry.createLanguageModelFromEnv(config.ai.aiEnv);
105
- if (!model)
106
- throw new ModelNotConfiguredError(registry.keyMissingMessage("NL→SQL generation"));
107
- cachedModel = model;
108
- return { model: cachedModel, source: "registry" };
112
+ if (!cachedAiConfig) {
113
+ cachedAiConfig = registry.resolveAiConfig(config.ai.aiEnv);
114
+ if (!cachedAiConfig)
115
+ throw new ModelNotConfiguredError(registry.keyMissingMessage("NL→SQL generation"));
116
+ }
117
+ if (!cachedModel) {
118
+ cachedModel = await registry.createLanguageModel(cachedAiConfig);
119
+ }
120
+ const reasoningEffort = resolveReasoningEffort(config.ai.aiEnv, "nlToSql", reasoningEffortOverride ?? options.reasoningEffort);
121
+ const providerOptions = reasoningEffort
122
+ ? registry.resolveProviderOptions(cachedAiConfig, { reasoningEffort })
123
+ : undefined;
124
+ return { model: cachedModel, source: "registry", providerOptions };
109
125
  }
110
126
  return {
111
127
  reload() {
112
128
  cachedSchema = undefined;
113
129
  cachedModel = undefined;
130
+ cachedAiConfig = undefined;
131
+ },
132
+ async bind(prepared, values, options = {}) {
133
+ const { schema: schemaOverride, resolveTenantDescendants, tenantScope, ...guardrails } = options;
134
+ const schema = schemaOverride ? loadFromSource(schemaOverride, "request") : resolveDefaultSchema();
135
+ const tenantPolicy = "schemaId" in schema ? schema.tenantPolicy : undefined;
136
+ // The same subtree expansion ask() runs, so a host never builds it by hand (ADR 0014).
137
+ const scope = tenantPolicy && tenantScope
138
+ ? await expandTenantScope(tenantPolicy, tenantScope, resolveTenantDescendants)
139
+ : tenantScope;
140
+ return bindPreparedQuery(prepared, values, { ...guardrails, schema, ...(scope ? { tenantScope: scope } : {}) });
114
141
  },
115
142
  async ask(question, overrides = {}) {
116
- const { schema: schemaOverride, model: modelOverride, dialect: dialectOverride, deps, ...rest } = overrides;
143
+ const { schema: schemaOverride, model: modelOverride, dialect: dialectOverride, deps, reasoningEffort, omitSensitiveIdentifiersFromNlToSqlPrompt, mode: callMode, ...rest } = overrides;
117
144
  const schema = schemaOverride ? loadFromSource(schemaOverride, "request") : resolveDefaultSchema();
118
145
  const dialect = resolveDialect(schema, dialectOverride);
119
- const resolvedModel = await resolveModel(modelOverride, deps);
146
+ const resolvedModel = await resolveModel(modelOverride, deps, reasoningEffort);
120
147
  options.onResolve?.({ dialect, modelSource: resolvedModel.source });
148
+ // An explicit `deps.providerOptions` from the caller always wins over
149
+ // the computed one; otherwise merge the resolved reasoning effort in.
150
+ const finalDeps = resolvedModel.mockDeps ??
151
+ (deps?.providerOptions !== undefined
152
+ ? deps
153
+ : resolvedModel.providerOptions !== undefined
154
+ ? { ...deps, providerOptions: resolvedModel.providerOptions }
155
+ : deps);
156
+ // Config `modes.omitSensitiveFromPrompt` is a floor: a per-call override can
157
+ // tighten it (true) but never loosen it (false) when the operator enabled it.
158
+ const omitSensitive = omitSensitiveIdentifiersFromNlToSqlPrompt === true ||
159
+ config.modes?.omitSensitiveFromPrompt === true;
160
+ // Config `modes.askdbMode` (unset: `schema_only`) is the loosest mode a call gets:
161
+ // a per-call `mode` can tighten it to `schema_only`, never loosen it (ADR 0025). Both go
162
+ // through the same parser, so any accepted spelling tightens and an unknown mode throws.
163
+ const configMode = parseAskDbModeV1(config.modes?.askdbMode);
164
+ const requested = callMode == null ? undefined : parseAskDbModeV1(callMode);
165
+ const mode = requested === "schema_only" ? requested : configMode;
121
166
  return ask({
122
167
  ...rest,
168
+ mode,
169
+ ...(omitSensitive ? { omitSensitiveIdentifiersFromNlToSqlPrompt: true } : {}),
123
170
  question,
124
171
  schema,
125
172
  model: resolvedModel.model,
126
173
  dialect: dialect.dialect,
127
- ...(resolvedModel.deps ? { deps: resolvedModel.deps } : deps ? { deps } : {}),
174
+ ...(finalDeps ? { deps: finalDeps } : {}),
128
175
  });
129
176
  },
130
177
  };
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { createAskDb, type AskDbClient, type CreateAskDbOptions, type AskOverrides, type SchemaSource, type DialectResolution, } from "./client.js";
1
+ export { createAskDb, type AskDbClient, type CreateAskDbOptions, type AskOverrides, type BindOptions, type SchemaSource, type DialectResolution, } from "./client.js";
2
2
  export { DialectNotSupportedError, ModelNotConfiguredError, SchemaLoadError, SchemaNotConfiguredError, } from "./errors.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,EACf,wBAAwB,GACzB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,EACf,wBAAwB,GACzB,MAAM,aAAa,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,GAMZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,EACf,wBAAwB,GACzB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,GAOZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,EACf,wBAAwB,GACzB,MAAM,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askdb/client",
3
- "version": "0.1.0-beta.1",
3
+ "version": "1.0.0-beta.10",
4
4
  "description": "Config-aware AskDB facade: resolves schema, model, and dialect from config so callers only pass a question.",
5
5
  "keywords": [
6
6
  "askdb",
@@ -8,7 +8,7 @@
8
8
  "facade",
9
9
  "client"
10
10
  ],
11
- "homepage": "https://github.com/Ygilany/AskDB#readme",
11
+ "homepage": "https://askdb.tools/reference/client-api/",
12
12
  "bugs": {
13
13
  "url": "https://github.com/Ygilany/AskDB/issues"
14
14
  },
@@ -20,12 +20,14 @@
20
20
  "license": "Apache-2.0",
21
21
  "author": "Yahya Gilany",
22
22
  "type": "module",
23
+ "sideEffects": false,
23
24
  "main": "./dist/index.js",
24
25
  "types": "./dist/index.d.ts",
25
26
  "exports": {
26
27
  ".": {
27
28
  "types": "./dist/index.d.ts",
28
- "import": "./dist/index.js"
29
+ "import": "./dist/index.js",
30
+ "default": "./dist/index.js"
29
31
  }
30
32
  },
31
33
  "files": [
@@ -35,21 +37,40 @@
35
37
  "NOTICE"
36
38
  ],
37
39
  "engines": {
38
- "node": ">=20"
40
+ "node": ">=22.23.4"
39
41
  },
40
42
  "peerDependencies": {
41
- "ai": "^6.0.205",
42
- "@askdb/config": "^1.0.0-beta.8",
43
- "@askdb/ai": "^0.1.0-beta.3",
44
- "@askdb/core": "^1.0.0-beta.26"
43
+ "@ai-sdk/anthropic": "^4.0.0",
44
+ "@ai-sdk/azure": "^4.0.0",
45
+ "@ai-sdk/google": "^4.0.0",
46
+ "@ai-sdk/openai": "^4.0.0",
47
+ "@askdb/config": "^1.0.0-beta.16",
48
+ "@askdb/core": "^1.0.0-beta.47",
49
+ "ai": "^7.0.51"
50
+ },
51
+ "peerDependenciesMeta": {
52
+ "@ai-sdk/anthropic": {
53
+ "optional": true
54
+ },
55
+ "@ai-sdk/azure": {
56
+ "optional": true
57
+ },
58
+ "@ai-sdk/google": {
59
+ "optional": true
60
+ },
61
+ "@ai-sdk/openai": {
62
+ "optional": true
63
+ }
45
64
  },
46
65
  "devDependencies": {
47
- "ai": "^6.0.205",
66
+ "@askdb/config": "1.0.0-beta.16",
67
+ "@askdb/core": "1.0.0-beta.47",
68
+ "ai": "^7.0.127",
48
69
  "typescript": "^6.0.3",
49
- "vitest": "^4.1.8",
50
- "@askdb/ai": "0.1.0-beta.3",
51
- "@askdb/core": "1.0.0-beta.26",
52
- "@askdb/config": "1.0.0-beta.8"
70
+ "vitest": "^5.0.5"
71
+ },
72
+ "dependencies": {
73
+ "@askdb/ai": "^0.1.0-beta.10"
53
74
  },
54
75
  "scripts": {
55
76
  "build": "tsc -p tsconfig.build.json",