nuabase 2.1.0 → 2.3.0

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.
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var node_module = require('node:module');
4
3
  var require$$0 = require('ajv');
5
4
  var require$$1 = require('ajv/dist/2019');
6
5
  var require$$2 = require('ajv/dist/2020');
@@ -8,16 +7,12 @@ var require$$3 = require('ajv/dist/refs/json-schema-draft-07.json');
8
7
  var require$$4 = require('ajv/dist/refs/json-schema-draft-06.json');
9
8
  var zod = require('zod');
10
9
 
11
- var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
12
10
  var dist = {};
13
11
 
14
12
  var nuaLlmClient = {};
15
13
 
16
14
  var logger = {};
17
15
 
18
- const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
19
- function __require() { return require$1("node:crypto"); }
20
-
21
16
  var hasRequiredLogger;
22
17
  function requireLogger() {
23
18
  if (hasRequiredLogger) return logger;
@@ -27,7 +22,6 @@ function requireLogger() {
27
22
  logger.truncateText = truncateText;
28
23
  logger.pickHeaders = pickHeaders;
29
24
  logger.normalizeError = normalizeError;
30
- const node_crypto_1 = __require();
31
25
  class ConsoleLogger {
32
26
  debug(message, context) {
33
27
  console.debug(`[DEBUG] ${message}`, context || "");
@@ -43,7 +37,7 @@ function requireLogger() {
43
37
  }
44
38
  }
45
39
  logger.ConsoleLogger = ConsoleLogger;
46
- const generateSpanId = () => (0, node_crypto_1.randomUUID)();
40
+ const generateSpanId = () => crypto.randomUUID();
47
41
  logger.generateSpanId = generateSpanId;
48
42
  function truncateText(text, limit = 500) {
49
43
  const length = text.length;
@@ -1216,9 +1210,10 @@ class DirectBackend {
1216
1210
  this.client = new distExports.NuaLlmClient({ providers: config.providers });
1217
1211
  }
1218
1212
  async castValue(params) {
1213
+ const model = params.model ?? this.model;
1219
1214
  const startTime = Date.now();
1220
1215
  const result = await this.client.castValue({
1221
- model: this.model,
1216
+ model,
1222
1217
  input: { prompt: params.prompt, data: params.data },
1223
1218
  output: { name: params.outputName, effectiveSchema: params.outputSchema }
1224
1219
  });
@@ -1235,20 +1230,21 @@ class DirectBackend {
1235
1230
  success: true,
1236
1231
  data: result.data,
1237
1232
  usage: result.usage || normalizedUsageZero,
1238
- model: this.model,
1233
+ model,
1239
1234
  latencyMs,
1240
1235
  source: "direct",
1241
1236
  meta: {}
1242
1237
  };
1243
1238
  }
1244
1239
  async castArray(params) {
1240
+ const model = params.model ?? this.model;
1245
1241
  const startTime = Date.now();
1246
1242
  const wrappedSchema = distExports.wrapArraySchema(params.outputSchema, {
1247
1243
  primaryKey: params.primaryKey,
1248
1244
  outputName: params.outputName
1249
1245
  });
1250
1246
  const result = await this.client.castArray({
1251
- model: this.model,
1247
+ model,
1252
1248
  data: params.data,
1253
1249
  input: { prompt: params.prompt, primaryKey: params.primaryKey },
1254
1250
  output: { name: params.outputName, effectiveSchema: wrappedSchema }
@@ -1266,7 +1262,7 @@ class DirectBackend {
1266
1262
  success: true,
1267
1263
  data: result.data,
1268
1264
  usage: result.usage || normalizedUsageZero,
1269
- model: this.model,
1265
+ model,
1270
1266
  latencyMs,
1271
1267
  source: "direct",
1272
1268
  meta: {}
@@ -1285,6 +1281,13 @@ function resolveConfigValue(config, key, envVar) {
1285
1281
  }
1286
1282
 
1287
1283
  const isBrowserEnvironment = () => typeof window !== "undefined" && !!window.document;
1284
+ const isLocalhost = () => {
1285
+ if (typeof window === "undefined" || !window.location) {
1286
+ return false;
1287
+ }
1288
+ const host = window.location.hostname;
1289
+ return host === "localhost" || host === "127.0.0.1";
1290
+ };
1288
1291
  class AuthTokenManager {
1289
1292
  constructor(config) {
1290
1293
  this.apiKey = resolveConfigValue(config, "apiKey", "NUABASE_API_KEY") || void 0;
@@ -1298,9 +1301,12 @@ class AuthTokenManager {
1298
1301
  );
1299
1302
  }
1300
1303
  if (this.apiKey && isBrowserEnvironment()) {
1301
- throw new Error(
1302
- "found config.apiKey. It is a private secret that must only be used in server environments."
1303
- );
1304
+ const allowedLocally = config.dangerouslyAllowBrowserApiKeyInLocalhost && isLocalhost();
1305
+ if (!allowedLocally) {
1306
+ throw new Error(
1307
+ "found config.apiKey. It is a private secret that must only be used in server environments."
1308
+ );
1309
+ }
1304
1310
  }
1305
1311
  }
1306
1312
  async getToken() {
@@ -1391,7 +1397,8 @@ class GatewayBackend {
1391
1397
  const startTime = Date.now();
1392
1398
  const response = await this.post("cast/value/now", {
1393
1399
  input: { prompt: params.prompt, data: params.data },
1394
- output: { name: params.outputName, schema: params.outputSchema }
1400
+ output: { name: params.outputName, schema: params.outputSchema },
1401
+ ...params.model && { model: params.model }
1395
1402
  });
1396
1403
  const latencyMs = Date.now() - startTime;
1397
1404
  if (isErrorResponse(response)) {
@@ -1422,7 +1429,8 @@ class GatewayBackend {
1422
1429
  const startTime = Date.now();
1423
1430
  const response = await this.post("cast/array/now", {
1424
1431
  input: { prompt: params.prompt, data: params.data, primaryKey: params.primaryKey },
1425
- output: { name: params.outputName, schema: params.outputSchema }
1432
+ output: { name: params.outputName, schema: params.outputSchema },
1433
+ ...params.model && { model: params.model }
1426
1434
  });
1427
1435
  const latencyMs = Date.now() - startTime;
1428
1436
  if (isErrorResponse(response)) {
@@ -1452,7 +1460,8 @@ class GatewayBackend {
1452
1460
  async queueCastValue(params) {
1453
1461
  const response = await this.post("cast/value", {
1454
1462
  input: { prompt: params.prompt, data: params.data },
1455
- output: { name: params.outputName, schema: params.outputSchema }
1463
+ output: { name: params.outputName, schema: params.outputSchema },
1464
+ ...params.model && { model: params.model }
1456
1465
  });
1457
1466
  if (isErrorResponse(response)) {
1458
1467
  return { success: false, error: response.error, source: "gateway" };
@@ -1463,7 +1472,8 @@ class GatewayBackend {
1463
1472
  async queueCastArray(params) {
1464
1473
  const response = await this.post("cast/array", {
1465
1474
  input: { prompt: params.prompt, data: params.data, primaryKey: params.primaryKey },
1466
- output: { name: params.outputName, schema: params.outputSchema }
1475
+ output: { name: params.outputName, schema: params.outputSchema },
1476
+ ...params.model && { model: params.model }
1467
1477
  });
1468
1478
  if (isErrorResponse(response)) {
1469
1479
  return { success: false, error: response.error, source: "gateway" };
@@ -1520,7 +1530,8 @@ class Nua {
1520
1530
  prompt,
1521
1531
  data: options?.input ?? null,
1522
1532
  outputName,
1523
- outputSchema: jsonSchema
1533
+ outputSchema: jsonSchema,
1534
+ model: options?.model
1524
1535
  });
1525
1536
  }
1526
1537
  // ========== list() - Array Operations ==========
@@ -1540,7 +1551,8 @@ class Nua {
1540
1551
  data: options.input,
1541
1552
  primaryKey: options.primaryKey,
1542
1553
  outputName: options.output.name,
1543
- outputSchema: jsonSchema
1554
+ outputSchema: jsonSchema,
1555
+ model: options.model
1544
1556
  });
1545
1557
  }
1546
1558
  // Implementation
@@ -1558,7 +1570,8 @@ class Nua {
1558
1570
  prompt,
1559
1571
  data: options?.input ?? null,
1560
1572
  outputName,
1561
- outputSchema: jsonSchema
1573
+ outputSchema: jsonSchema,
1574
+ model: options?.model
1562
1575
  });
1563
1576
  }
1564
1577
  // ========== queueList() - Async Array Operations ==========
@@ -1581,7 +1594,8 @@ class Nua {
1581
1594
  data: options.input,
1582
1595
  primaryKey: options.primaryKey,
1583
1596
  outputName: options.output.name,
1584
- outputSchema: jsonSchema
1597
+ outputSchema: jsonSchema,
1598
+ model: options.model
1585
1599
  });
1586
1600
  }
1587
1601
  }
@@ -1,4 +1,3 @@
1
- import { createRequire } from 'node:module';
2
1
  import require$$0 from 'ajv';
3
2
  import require$$1 from 'ajv/dist/2019';
4
3
  import require$$2 from 'ajv/dist/2020';
@@ -13,9 +12,6 @@ var nuaLlmClient = {};
13
12
 
14
13
  var logger = {};
15
14
 
16
- const require$1 = createRequire(import.meta.url);
17
- function __require() { return require$1("node:crypto"); }
18
-
19
15
  var hasRequiredLogger;
20
16
  function requireLogger() {
21
17
  if (hasRequiredLogger) return logger;
@@ -25,7 +21,6 @@ function requireLogger() {
25
21
  logger.truncateText = truncateText;
26
22
  logger.pickHeaders = pickHeaders;
27
23
  logger.normalizeError = normalizeError;
28
- const node_crypto_1 = __require();
29
24
  class ConsoleLogger {
30
25
  debug(message, context) {
31
26
  console.debug(`[DEBUG] ${message}`, context || "");
@@ -41,7 +36,7 @@ function requireLogger() {
41
36
  }
42
37
  }
43
38
  logger.ConsoleLogger = ConsoleLogger;
44
- const generateSpanId = () => (0, node_crypto_1.randomUUID)();
39
+ const generateSpanId = () => crypto.randomUUID();
45
40
  logger.generateSpanId = generateSpanId;
46
41
  function truncateText(text, limit = 500) {
47
42
  const length = text.length;
@@ -1214,9 +1209,10 @@ class DirectBackend {
1214
1209
  this.client = new distExports.NuaLlmClient({ providers: config.providers });
1215
1210
  }
1216
1211
  async castValue(params) {
1212
+ const model = params.model ?? this.model;
1217
1213
  const startTime = Date.now();
1218
1214
  const result = await this.client.castValue({
1219
- model: this.model,
1215
+ model,
1220
1216
  input: { prompt: params.prompt, data: params.data },
1221
1217
  output: { name: params.outputName, effectiveSchema: params.outputSchema }
1222
1218
  });
@@ -1233,20 +1229,21 @@ class DirectBackend {
1233
1229
  success: true,
1234
1230
  data: result.data,
1235
1231
  usage: result.usage || normalizedUsageZero,
1236
- model: this.model,
1232
+ model,
1237
1233
  latencyMs,
1238
1234
  source: "direct",
1239
1235
  meta: {}
1240
1236
  };
1241
1237
  }
1242
1238
  async castArray(params) {
1239
+ const model = params.model ?? this.model;
1243
1240
  const startTime = Date.now();
1244
1241
  const wrappedSchema = distExports.wrapArraySchema(params.outputSchema, {
1245
1242
  primaryKey: params.primaryKey,
1246
1243
  outputName: params.outputName
1247
1244
  });
1248
1245
  const result = await this.client.castArray({
1249
- model: this.model,
1246
+ model,
1250
1247
  data: params.data,
1251
1248
  input: { prompt: params.prompt, primaryKey: params.primaryKey },
1252
1249
  output: { name: params.outputName, effectiveSchema: wrappedSchema }
@@ -1264,7 +1261,7 @@ class DirectBackend {
1264
1261
  success: true,
1265
1262
  data: result.data,
1266
1263
  usage: result.usage || normalizedUsageZero,
1267
- model: this.model,
1264
+ model,
1268
1265
  latencyMs,
1269
1266
  source: "direct",
1270
1267
  meta: {}
@@ -1283,6 +1280,13 @@ function resolveConfigValue(config, key, envVar) {
1283
1280
  }
1284
1281
 
1285
1282
  const isBrowserEnvironment = () => typeof window !== "undefined" && !!window.document;
1283
+ const isLocalhost = () => {
1284
+ if (typeof window === "undefined" || !window.location) {
1285
+ return false;
1286
+ }
1287
+ const host = window.location.hostname;
1288
+ return host === "localhost" || host === "127.0.0.1";
1289
+ };
1286
1290
  class AuthTokenManager {
1287
1291
  constructor(config) {
1288
1292
  this.apiKey = resolveConfigValue(config, "apiKey", "NUABASE_API_KEY") || void 0;
@@ -1296,9 +1300,12 @@ class AuthTokenManager {
1296
1300
  );
1297
1301
  }
1298
1302
  if (this.apiKey && isBrowserEnvironment()) {
1299
- throw new Error(
1300
- "found config.apiKey. It is a private secret that must only be used in server environments."
1301
- );
1303
+ const allowedLocally = config.dangerouslyAllowBrowserApiKeyInLocalhost && isLocalhost();
1304
+ if (!allowedLocally) {
1305
+ throw new Error(
1306
+ "found config.apiKey. It is a private secret that must only be used in server environments."
1307
+ );
1308
+ }
1302
1309
  }
1303
1310
  }
1304
1311
  async getToken() {
@@ -1389,7 +1396,8 @@ class GatewayBackend {
1389
1396
  const startTime = Date.now();
1390
1397
  const response = await this.post("cast/value/now", {
1391
1398
  input: { prompt: params.prompt, data: params.data },
1392
- output: { name: params.outputName, schema: params.outputSchema }
1399
+ output: { name: params.outputName, schema: params.outputSchema },
1400
+ ...params.model && { model: params.model }
1393
1401
  });
1394
1402
  const latencyMs = Date.now() - startTime;
1395
1403
  if (isErrorResponse(response)) {
@@ -1420,7 +1428,8 @@ class GatewayBackend {
1420
1428
  const startTime = Date.now();
1421
1429
  const response = await this.post("cast/array/now", {
1422
1430
  input: { prompt: params.prompt, data: params.data, primaryKey: params.primaryKey },
1423
- output: { name: params.outputName, schema: params.outputSchema }
1431
+ output: { name: params.outputName, schema: params.outputSchema },
1432
+ ...params.model && { model: params.model }
1424
1433
  });
1425
1434
  const latencyMs = Date.now() - startTime;
1426
1435
  if (isErrorResponse(response)) {
@@ -1450,7 +1459,8 @@ class GatewayBackend {
1450
1459
  async queueCastValue(params) {
1451
1460
  const response = await this.post("cast/value", {
1452
1461
  input: { prompt: params.prompt, data: params.data },
1453
- output: { name: params.outputName, schema: params.outputSchema }
1462
+ output: { name: params.outputName, schema: params.outputSchema },
1463
+ ...params.model && { model: params.model }
1454
1464
  });
1455
1465
  if (isErrorResponse(response)) {
1456
1466
  return { success: false, error: response.error, source: "gateway" };
@@ -1461,7 +1471,8 @@ class GatewayBackend {
1461
1471
  async queueCastArray(params) {
1462
1472
  const response = await this.post("cast/array", {
1463
1473
  input: { prompt: params.prompt, data: params.data, primaryKey: params.primaryKey },
1464
- output: { name: params.outputName, schema: params.outputSchema }
1474
+ output: { name: params.outputName, schema: params.outputSchema },
1475
+ ...params.model && { model: params.model }
1465
1476
  });
1466
1477
  if (isErrorResponse(response)) {
1467
1478
  return { success: false, error: response.error, source: "gateway" };
@@ -1518,7 +1529,8 @@ class Nua {
1518
1529
  prompt,
1519
1530
  data: options?.input ?? null,
1520
1531
  outputName,
1521
- outputSchema: jsonSchema
1532
+ outputSchema: jsonSchema,
1533
+ model: options?.model
1522
1534
  });
1523
1535
  }
1524
1536
  // ========== list() - Array Operations ==========
@@ -1538,7 +1550,8 @@ class Nua {
1538
1550
  data: options.input,
1539
1551
  primaryKey: options.primaryKey,
1540
1552
  outputName: options.output.name,
1541
- outputSchema: jsonSchema
1553
+ outputSchema: jsonSchema,
1554
+ model: options.model
1542
1555
  });
1543
1556
  }
1544
1557
  // Implementation
@@ -1556,7 +1569,8 @@ class Nua {
1556
1569
  prompt,
1557
1570
  data: options?.input ?? null,
1558
1571
  outputName,
1559
- outputSchema: jsonSchema
1572
+ outputSchema: jsonSchema,
1573
+ model: options?.model
1560
1574
  });
1561
1575
  }
1562
1576
  // ========== queueList() - Async Array Operations ==========
@@ -1579,7 +1593,8 @@ class Nua {
1579
1593
  data: options.input,
1580
1594
  primaryKey: options.primaryKey,
1581
1595
  outputName: options.output.name,
1582
- outputSchema: jsonSchema
1596
+ outputSchema: jsonSchema,
1597
+ model: options.model
1583
1598
  });
1584
1599
  }
1585
1600
  }
@@ -3,6 +3,7 @@ export type CastValueParams = {
3
3
  data: unknown;
4
4
  outputName: string;
5
5
  outputSchema: object;
6
+ model?: string;
6
7
  };
7
8
  export type CastArrayParams = {
8
9
  prompt: string;
@@ -10,6 +11,7 @@ export type CastArrayParams = {
10
11
  primaryKey: string;
11
12
  outputName: string;
12
13
  outputSchema: object;
14
+ model?: string;
13
15
  };
14
16
  export type NormalizedUsage = {
15
17
  promptTokens: number;
@@ -1,6 +1,7 @@
1
1
  export type AuthConfig = {
2
2
  apiKey?: string;
3
3
  fetchToken?: () => Promise<string>;
4
+ dangerouslyAllowBrowserApiKeyInLocalhost?: boolean;
4
5
  };
5
6
  export declare class AuthTokenManager {
6
7
  private readonly apiKey?;
@@ -9,11 +9,13 @@ export type OutputDef<TSchema extends z.ZodTypeAny> = {
9
9
  export type GetOptions<TSchema extends z.ZodTypeAny> = {
10
10
  input?: unknown;
11
11
  output: OutputDef<TSchema>;
12
+ model?: string;
12
13
  };
13
14
  export type ListOptions<TSchema extends z.ZodTypeAny, TData extends Record<string, unknown>, PrimaryKey extends keyof TData & string> = {
14
15
  input: TData[];
15
16
  primaryKey: PrimaryKey;
16
17
  output: OutputDef<TSchema>;
18
+ model?: string;
17
19
  };
18
20
  export type ListResultRow<TSchema extends z.ZodTypeAny, PrimaryKey extends string> = {
19
21
  [K in PrimaryKey]: string | number;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuabase",
3
3
  "description": "Nuabase TypeScript client to create typed functions from LLM prompts",
4
- "version": "2.1.0",
4
+ "version": "2.3.0",
5
5
  "type": "module",
6
6
  "author": "Jasim A Basheer <jasim@nuabase.com>",
7
7
  "engines": {