nuabase 2.3.2 → 2.3.4

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.
@@ -14,7 +14,6 @@ function requireLogger() {
14
14
  hasRequiredLogger = 1;
15
15
  Object.defineProperty(logger, "__esModule", { value: true });
16
16
  logger.logLlmCallError = logger.logLlmCallComplete = logger.logLlmCallStart = logger.generateSpanId = logger.ConsoleLogger = void 0;
17
- logger.truncateText = truncateText;
18
17
  logger.pickHeaders = pickHeaders;
19
18
  logger.normalizeError = normalizeError;
20
19
  class ConsoleLogger {
@@ -34,13 +33,6 @@ function requireLogger() {
34
33
  logger.ConsoleLogger = ConsoleLogger;
35
34
  const generateSpanId = () => crypto.randomUUID();
36
35
  logger.generateSpanId = generateSpanId;
37
- function truncateText(text, limit = 500) {
38
- const length = text.length;
39
- if (length <= limit) {
40
- return { preview: text, length };
41
- }
42
- return { preview: text.slice(0, limit), length };
43
- }
44
36
  function pickHeaders(headers, allowlist, redactSet) {
45
37
  const result = {};
46
38
  for (const [key, value] of Object.entries(headers)) {
@@ -75,16 +67,13 @@ function requireLogger() {
75
67
  };
76
68
  logger.logLlmCallStart = logLlmCallStart;
77
69
  const logLlmCallComplete = (logger2, spanId, service, method, response, duration) => {
78
- const { headers, responseText, ...rest } = response;
79
- const { preview: responsePreview, length: responseLength } = truncateText(responseText);
70
+ const { headers, ...rest } = response;
80
71
  logger2.info("LLM call completed", {
81
72
  type: "llm_call_complete",
82
73
  span_id: spanId,
83
74
  service,
84
75
  method,
85
76
  ...rest,
86
- responsePreview,
87
- responseLength,
88
77
  ...pickHeaders(headers, LLM_RESPONSE_HEADER_ALLOWLIST),
89
78
  duration_ms: duration
90
79
  });
@@ -154,7 +143,7 @@ function requireLlmResponseExtraction() {
154
143
  hasRequiredLlmResponseExtraction = 1;
155
144
  Object.defineProperty(llmResponseExtraction, "__esModule", { value: true });
156
145
  llmResponseExtraction.extractThinkingFromResponse = extractThinkingFromResponse;
157
- llmResponseExtraction.extractJsonFromMarkdown = extractJsonFromMarkdown;
146
+ llmResponseExtraction.parseJsonFromLlmResponse = parseJsonFromLlmResponse;
158
147
  function extractThinkingFromResponse(input) {
159
148
  const startTag = "<think>";
160
149
  const endTag = "</think>";
@@ -184,25 +173,71 @@ function requireLlmResponseExtraction() {
184
173
  cleanedResponse
185
174
  };
186
175
  }
187
- function extractJsonFromMarkdown(input) {
176
+ function parseJsonFromLlmResponse(input) {
188
177
  const trimmed = input.trim();
189
178
  const codeFence = "```";
190
179
  const jsonFence = "```json";
191
- if (trimmed.startsWith(jsonFence)) {
192
- const startIndex = jsonFence.length;
193
- const endIndex = trimmed.lastIndexOf(codeFence);
194
- if (endIndex > startIndex) {
195
- return trimmed.substring(startIndex, endIndex).trim();
180
+ const lastJsonFence = trimmed.lastIndexOf(jsonFence);
181
+ if (lastJsonFence !== -1) {
182
+ const startIndex = lastJsonFence + jsonFence.length;
183
+ const endIndex = trimmed.indexOf(codeFence, startIndex);
184
+ if (endIndex !== -1) {
185
+ try {
186
+ return JSON.parse(trimmed.substring(startIndex, endIndex).trim());
187
+ } catch {
188
+ }
196
189
  }
197
190
  }
198
- if (trimmed.startsWith(codeFence) && !trimmed.startsWith(jsonFence)) {
199
- const startIndex = codeFence.length;
200
- const endIndex = trimmed.lastIndexOf(codeFence);
201
- if (endIndex > startIndex) {
202
- return trimmed.substring(startIndex, endIndex).trim();
191
+ const firstCodeFence = trimmed.indexOf(codeFence);
192
+ if (firstCodeFence !== -1) {
193
+ const startIndex = firstCodeFence + codeFence.length;
194
+ const endIndex = trimmed.indexOf(codeFence, startIndex);
195
+ if (endIndex !== -1) {
196
+ try {
197
+ return JSON.parse(trimmed.substring(startIndex, endIndex).trim());
198
+ } catch {
199
+ }
203
200
  }
204
201
  }
205
- return input;
202
+ const matchingClose = new Array(trimmed.length).fill(-1);
203
+ const stack = [];
204
+ let inString = false;
205
+ for (let k = 0; k < trimmed.length; k++) {
206
+ if (inString) {
207
+ if (trimmed[k] === "\\")
208
+ k++;
209
+ else if (trimmed[k] === '"')
210
+ inString = false;
211
+ continue;
212
+ }
213
+ if (trimmed[k] === '"') {
214
+ inString = true;
215
+ continue;
216
+ }
217
+ if (trimmed[k] === "{" || trimmed[k] === "[") {
218
+ stack.push(k);
219
+ } else if (trimmed[k] === "}" || trimmed[k] === "]") {
220
+ if (stack.length > 0) {
221
+ const open = stack.pop();
222
+ const expected = trimmed[open] === "{" ? "}" : "]";
223
+ if (trimmed[k] === expected)
224
+ matchingClose[open] = k;
225
+ }
226
+ }
227
+ }
228
+ for (let i = 0; i < trimmed.length; i++) {
229
+ if (trimmed[i] !== "{" && trimmed[i] !== "[")
230
+ continue;
231
+ const j = matchingClose[i];
232
+ if (j === -1)
233
+ continue;
234
+ try {
235
+ return JSON.parse(trimmed.substring(i, j + 1));
236
+ } catch {
237
+ continue;
238
+ }
239
+ }
240
+ return JSON.parse(trimmed);
206
241
  }
207
242
  return llmResponseExtraction;
208
243
  }
@@ -224,9 +259,8 @@ function requireCallLlmService() {
224
259
  const response = providerResponse.text;
225
260
  let parsedResponse;
226
261
  try {
227
- let { thinking, cleanedResponse } = (0, llm_response_extraction_1.extractThinkingFromResponse)(response);
228
- cleanedResponse = (0, llm_response_extraction_1.extractJsonFromMarkdown)(cleanedResponse);
229
- parsedResponse = JSON.parse(cleanedResponse);
262
+ const { cleanedResponse } = (0, llm_response_extraction_1.extractThinkingFromResponse)(response);
263
+ parsedResponse = (0, llm_response_extraction_1.parseJsonFromLlmResponse)(cleanedResponse);
230
264
  } catch (parseError) {
231
265
  const errorMessage2 = `Failed to parse LLM response as JSON: ${parseError instanceof Error ? parseError.message : "Unknown parsing error"}`;
232
266
  throw new Error(`${errorMessage2}
@@ -5504,6 +5538,7 @@ function requirePattern () {
5504
5538
  hasRequiredPattern = 1;
5505
5539
  Object.defineProperty(pattern, "__esModule", { value: true });
5506
5540
  const code_1 = requireCode();
5541
+ const util_1 = requireUtil();
5507
5542
  const codegen_1 = requireCodegen();
5508
5543
  const error = {
5509
5544
  message: ({ schemaCode }) => (0, codegen_1.str) `must match pattern "${schemaCode}"`,
@@ -5516,11 +5551,19 @@ function requirePattern () {
5516
5551
  $data: true,
5517
5552
  error,
5518
5553
  code(cxt) {
5519
- const { data, $data, schema, schemaCode, it } = cxt;
5520
- // TODO regexp should be wrapped in try/catchs
5554
+ const { gen, data, $data, schema, schemaCode, it } = cxt;
5521
5555
  const u = it.opts.unicodeRegExp ? "u" : "";
5522
- const regExp = $data ? (0, codegen_1._) `(new RegExp(${schemaCode}, ${u}))` : (0, code_1.usePattern)(cxt, schema);
5523
- cxt.fail$data((0, codegen_1._) `!${regExp}.test(${data})`);
5556
+ if ($data) {
5557
+ const { regExp } = it.opts.code;
5558
+ const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._) `new RegExp` : (0, util_1.useFunc)(gen, regExp);
5559
+ const valid = gen.let("valid");
5560
+ gen.try(() => gen.assign(valid, (0, codegen_1._) `${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false));
5561
+ cxt.fail$data((0, codegen_1._) `!${valid}`);
5562
+ }
5563
+ else {
5564
+ const regExp = (0, code_1.usePattern)(cxt, schema);
5565
+ cxt.fail$data((0, codegen_1._) `!${regExp}.test(${data})`);
5566
+ }
5524
5567
  },
5525
5568
  };
5526
5569
  pattern.default = def;
@@ -9386,9 +9429,9 @@ function requireAjvInstances() {
9386
9429
  };
9387
9430
  Object.defineProperty(ajvInstances, "__esModule", { value: true });
9388
9431
  ajvInstances.ajvInstances = void 0;
9389
- const ajv_1 = __importDefault(requireAjv());
9390
- const _2019_js_1 = __importDefault(require_2019());
9391
- const _2020_js_1 = __importDefault(require_2020());
9432
+ const ajv_1 = __importDefault(/* @__PURE__ */ requireAjv());
9433
+ const _2019_js_1 = __importDefault(/* @__PURE__ */ require_2019());
9434
+ const _2020_js_1 = __importDefault(/* @__PURE__ */ require_2020());
9392
9435
  const json_schema_draft_07_json_1 = __importDefault(require$$3$2);
9393
9436
  const json_schema_draft_06_json_1 = __importDefault(require$$4);
9394
9437
  const ajvOptions = {
@@ -9456,140 +9499,6 @@ function requireNuaJsonSchemaValueValidation() {
9456
9499
 
9457
9500
  var httpLlmClient = {};
9458
9501
 
9459
- var modelInfo = {};
9460
-
9461
- var hasRequiredModelInfo;
9462
- function requireModelInfo() {
9463
- if (hasRequiredModelInfo) return modelInfo;
9464
- hasRequiredModelInfo = 1;
9465
- (function(exports$1) {
9466
- Object.defineProperty(exports$1, "__esModule", { value: true });
9467
- exports$1.SUPPORTED_MODELS = exports$1.CANONICAL_MODELS = void 0;
9468
- exports$1.parseCanonicalModelName = parseCanonicalModelName;
9469
- exports$1.CANONICAL_MODELS = [
9470
- "qwen3-30b-a3b-instruct-2507",
9471
- "claude-sonnet-4-6",
9472
- "qwen3-vl-235b-a22b-instruct",
9473
- "qwen3-max",
9474
- "gpt-5",
9475
- "gemini-2.5-flash-lite",
9476
- "gemini-2.5-flash",
9477
- "qwen3-coder-flash",
9478
- "gpt-oss-120b",
9479
- "kimi-k2.5"
9480
- ];
9481
- const CANONICAL_SET = new Set(exports$1.CANONICAL_MODELS);
9482
- exports$1.SUPPORTED_MODELS = {
9483
- "gpt-oss-120b": [
9484
- {
9485
- provider: "cerebras",
9486
- providerModelName: "gpt-oss-120b"
9487
- },
9488
- {
9489
- provider: "groq",
9490
- providerModelName: "openai/gpt-oss-120b"
9491
- },
9492
- {
9493
- provider: "openrouter",
9494
- providerModelName: "openai/gpt-oss-120b"
9495
- }
9496
- ],
9497
- "qwen3-30b-a3b-instruct-2507": [
9498
- {
9499
- provider: "openrouter",
9500
- providerModelName: "qwen/qwen3-30b-a3b-instruct-2507"
9501
- }
9502
- ],
9503
- "claude-sonnet-4-6": [
9504
- {
9505
- provider: "openrouter",
9506
- providerModelName: "anthropic/claude-sonnet-4.6"
9507
- }
9508
- ],
9509
- "qwen3-vl-235b-a22b-instruct": [
9510
- {
9511
- provider: "openrouter",
9512
- providerModelName: "qwen/qwen3-vl-235b-a22b-instruct"
9513
- }
9514
- ],
9515
- "qwen3-max": [
9516
- {
9517
- provider: "openrouter",
9518
- providerModelName: "qwen/qwen3-max"
9519
- }
9520
- ],
9521
- "gpt-5": [
9522
- {
9523
- provider: "openrouter",
9524
- providerModelName: "openai/gpt-5"
9525
- }
9526
- ],
9527
- "gemini-2.5-flash-lite": [
9528
- {
9529
- provider: "gemini",
9530
- providerModelName: "gemini-2.5-flash-lite"
9531
- },
9532
- {
9533
- provider: "openrouter",
9534
- providerModelName: "google/gemini-2.5-flash-lite"
9535
- }
9536
- ],
9537
- "gemini-2.5-flash": [
9538
- {
9539
- provider: "gemini",
9540
- providerModelName: "gemini-2.5-flash"
9541
- },
9542
- {
9543
- provider: "openrouter",
9544
- providerModelName: "google/gemini-2.5-flash"
9545
- }
9546
- ],
9547
- "qwen3-coder-flash": [
9548
- {
9549
- provider: "openrouter",
9550
- providerModelName: "qwen/qwen3-coder-flash"
9551
- }
9552
- ],
9553
- "kimi-k2.5": [
9554
- {
9555
- provider: "openrouter",
9556
- providerModelName: "moonshotai/kimi-k2.5"
9557
- }
9558
- ]
9559
- };
9560
- function parseCanonicalModelName(requestedModel) {
9561
- let m = requestedModel || "fast";
9562
- if (CANONICAL_SET.has(m))
9563
- return m;
9564
- let m2;
9565
- switch (m) {
9566
- case "fast":
9567
- m2 = "gpt-oss-120b";
9568
- break;
9569
- case "gemini":
9570
- m2 = "gemini-2.5-flash";
9571
- break;
9572
- case "qwen":
9573
- m2 = "qwen3-vl-235b-a22b-instruct";
9574
- break;
9575
- case "sonnet":
9576
- m2 = "claude-sonnet-4-6";
9577
- break;
9578
- case "gpt":
9579
- m2 = "gpt-5";
9580
- break;
9581
- }
9582
- if (m2)
9583
- return m2;
9584
- return {
9585
- kind: "validation-error",
9586
- message: `Invalid model name: ${m ?? "null/undefined"}`
9587
- };
9588
- }
9589
- })(modelInfo);
9590
- return modelInfo;
9591
- }
9592
-
9593
9502
  var providerConfig = {};
9594
9503
 
9595
9504
  var hasRequiredProviderConfig;
@@ -9598,7 +9507,13 @@ function requireProviderConfig() {
9598
9507
  hasRequiredProviderConfig = 1;
9599
9508
  (function(exports$1) {
9600
9509
  Object.defineProperty(exports$1, "__esModule", { value: true });
9601
- exports$1.providerConfigs = exports$1.extractOpenAiMessageText = exports$1.normalizeGeminiUsage = exports$1.normalizeOpenAiUsage = exports$1.normalizedUsageZero = void 0;
9510
+ exports$1.providerConfigs = exports$1.extractOpenAiMessageText = exports$1.normalizeGeminiUsage = exports$1.normalizeOpenAiUsage = exports$1.normalizedUsageZero = exports$1.LLM_PROVIDER_IDS = void 0;
9511
+ exports$1.LLM_PROVIDER_IDS = [
9512
+ "groq",
9513
+ "cerebras",
9514
+ "gemini",
9515
+ "openrouter"
9516
+ ];
9602
9517
  exports$1.normalizedUsageZero = {
9603
9518
  promptTokens: 0,
9604
9519
  completionTokens: 0,
@@ -10297,7 +10212,6 @@ function requireHttpLlmClient() {
10297
10212
  hasRequiredHttpLlmClient = 1;
10298
10213
  Object.defineProperty(httpLlmClient, "__esModule", { value: true });
10299
10214
  httpLlmClient.HttpLlmClient = void 0;
10300
- const model_info_1 = requireModelInfo();
10301
10215
  const logger_1 = requireLogger();
10302
10216
  const provider_config_1 = requireProviderConfig();
10303
10217
  const provider_formatters_1 = requireProviderFormatters();
@@ -10309,10 +10223,9 @@ function requireHttpLlmClient() {
10309
10223
  }
10310
10224
  async sendRequest(prompt, model, maxTokens, assistantPrefillPrompt) {
10311
10225
  const provider = this.getProviderConfig();
10312
- const providerModelName = this.getProviderModelName(model);
10313
10226
  const requestOptions = provider.buildRequest({
10314
10227
  prompt,
10315
- model: providerModelName,
10228
+ model,
10316
10229
  maxTokens,
10317
10230
  assistantPrefillPrompt
10318
10231
  }, this.apiKey);
@@ -10323,18 +10236,17 @@ function requireHttpLlmClient() {
10323
10236
  apiOperation: provider.apiOperation,
10324
10237
  requestOptions,
10325
10238
  parseResponse: provider.parseResponse,
10326
- getResponsePreview: (parsedResponse) => parsedResponse.text,
10239
+ getResponseLength: (parsedResponse) => parsedResponse.text.length,
10327
10240
  getUsage: (parsedResponse) => parsedResponse.usage
10328
10241
  });
10329
10242
  }
10330
10243
  async sendAgenticRequest(messages, tools, model, maxTokens, systemPrompt, onEvent) {
10331
10244
  const provider = this.getProviderConfig();
10332
- const providerModelName = this.getProviderModelName(model);
10333
10245
  const codec = this.getAgenticProviderCodec(provider.errorLabel);
10334
10246
  const requestOptions = codec.buildRequest({
10335
10247
  messages,
10336
10248
  tools,
10337
- model: providerModelName,
10249
+ model,
10338
10250
  maxTokens,
10339
10251
  systemPrompt,
10340
10252
  stream: !!onEvent
@@ -10347,7 +10259,7 @@ function requireHttpLlmClient() {
10347
10259
  apiOperation: "agentic",
10348
10260
  requestOptions,
10349
10261
  parseResponse,
10350
- getResponsePreview: (parsedResponse) => parsedResponse.message.content.filter((content) => content.type === "text").map((content) => content.text).join(""),
10262
+ getResponseLength: (parsedResponse) => parsedResponse.message.content.reduce((total, content) => total + (content.type === "text" ? content.text.length : 0), 0),
10351
10263
  getUsage: (parsedResponse) => parsedResponse.usage
10352
10264
  });
10353
10265
  }
@@ -10358,13 +10270,6 @@ function requireHttpLlmClient() {
10358
10270
  }
10359
10271
  return provider;
10360
10272
  }
10361
- getProviderModelName(model) {
10362
- const providerSpecificModelName = model_info_1.SUPPORTED_MODELS[model].find((pm) => pm.provider === this.providerId);
10363
- if (!providerSpecificModelName) {
10364
- throw new Error(`LLM Provider ${this.providerId} does not support model ${model}. If this is an error and the provider does support this model, please contact us to fix it`);
10365
- }
10366
- return providerSpecificModelName.providerModelName;
10367
- }
10368
10273
  async executeProviderCall(params) {
10369
10274
  const method = params.requestOptions.method ?? "POST";
10370
10275
  const headers = params.requestOptions.headers ?? {};
@@ -10387,7 +10292,7 @@ function requireHttpLlmClient() {
10387
10292
  const duration = Date.now() - startTime;
10388
10293
  (0, logger_1.logLlmCallComplete)(this.logger, spanId, params.provider.providerId, params.apiOperation, {
10389
10294
  status: response.status,
10390
- responseText: params.getResponsePreview(parsedResponse),
10295
+ responseLength: params.getResponseLength(parsedResponse),
10391
10296
  headers: Object.fromEntries(response.headers.entries()),
10392
10297
  usage: params.getUsage(parsedResponse)
10393
10298
  }, duration);
@@ -10442,6 +10347,112 @@ function requireHttpLlmClient() {
10442
10347
  return httpLlmClient;
10443
10348
  }
10444
10349
 
10350
+ var modelInfo = {};
10351
+
10352
+ var hasRequiredModelInfo;
10353
+ function requireModelInfo() {
10354
+ if (hasRequiredModelInfo) return modelInfo;
10355
+ hasRequiredModelInfo = 1;
10356
+ (function(exports$1) {
10357
+ Object.defineProperty(exports$1, "__esModule", { value: true });
10358
+ exports$1.MODEL_ALIAS_NAMES = exports$1.MODEL_ALIASES = void 0;
10359
+ exports$1.isLlmProviderId = isLlmProviderId;
10360
+ exports$1.isModelAliasName = isModelAliasName;
10361
+ exports$1.resolveModelInput = resolveModelInput;
10362
+ const provider_config_1 = requireProviderConfig();
10363
+ exports$1.MODEL_ALIASES = {
10364
+ fast: [
10365
+ { provider: "cerebras", model: "gpt-oss-120b" },
10366
+ { provider: "groq", model: "openai/gpt-oss-120b" },
10367
+ { provider: "openrouter", model: "openai/gpt-oss-120b" }
10368
+ ],
10369
+ gemini: [
10370
+ { provider: "gemini", model: "gemini-2.5-flash" },
10371
+ { provider: "openrouter", model: "google/gemini-2.5-flash" }
10372
+ ],
10373
+ qwen: [
10374
+ { provider: "openrouter", model: "qwen/qwen3-vl-235b-a22b-instruct" }
10375
+ ],
10376
+ sonnet: [
10377
+ { provider: "openrouter", model: "anthropic/claude-sonnet-4.6" }
10378
+ ],
10379
+ opus: [
10380
+ { provider: "openrouter", model: "anthropic/claude-opus-4.7" }
10381
+ ],
10382
+ haiku: [
10383
+ { provider: "openrouter", model: "anthropic/claude-haiku-4.5" }
10384
+ ],
10385
+ kimi: [
10386
+ { provider: "openrouter", model: "moonshotai/kimi-k2.6" }
10387
+ ],
10388
+ gpt: [
10389
+ { provider: "openrouter", model: "openai/gpt-5" }
10390
+ ]
10391
+ };
10392
+ exports$1.MODEL_ALIAS_NAMES = Object.keys(exports$1.MODEL_ALIASES);
10393
+ const MODEL_ALIAS_SET = new Set(exports$1.MODEL_ALIAS_NAMES);
10394
+ const LLM_PROVIDER_ID_SET = new Set(provider_config_1.LLM_PROVIDER_IDS);
10395
+ function isLlmProviderId(value) {
10396
+ return typeof value === "string" && LLM_PROVIDER_ID_SET.has(value);
10397
+ }
10398
+ function isModelAliasName(value) {
10399
+ return typeof value === "string" && MODEL_ALIAS_SET.has(value);
10400
+ }
10401
+ function validationError(message) {
10402
+ return {
10403
+ kind: "validation-error",
10404
+ message
10405
+ };
10406
+ }
10407
+ function validateProviderModel(input, configuredProviders) {
10408
+ if (!isLlmProviderId(input.provider)) {
10409
+ return validationError(`Invalid LLM provider: ${String(input.provider)}`);
10410
+ }
10411
+ if (!configuredProviders.has(input.provider)) {
10412
+ return validationError(`LLM provider ${input.provider} is not configured. Please check your API keys.`);
10413
+ }
10414
+ if (typeof input.model !== "string") {
10415
+ return validationError("model.model must be a string");
10416
+ }
10417
+ const model = input.model.trim();
10418
+ if (!model) {
10419
+ return validationError("model.model must be a non-empty string");
10420
+ }
10421
+ if (input.provider === "gemini" && model.startsWith("models/")) {
10422
+ return validationError('Gemini model names must use bare model IDs, for example "gemini-2.5-flash", not "models/gemini-2.5-flash".');
10423
+ }
10424
+ return {
10425
+ provider: input.provider,
10426
+ model
10427
+ };
10428
+ }
10429
+ function resolveModelInput(input, configuredProviders) {
10430
+ if (input == null) {
10431
+ return resolveModelInput({ alias: "fast" }, configuredProviders);
10432
+ }
10433
+ if (typeof input !== "object") {
10434
+ return validationError("model must be an object with either alias or provider/model fields");
10435
+ }
10436
+ if ("provider" in input || "model" in input) {
10437
+ return validateProviderModel(input, configuredProviders);
10438
+ }
10439
+ if ("alias" in input) {
10440
+ const alias = input.alias;
10441
+ if (!isModelAliasName(alias)) {
10442
+ return validationError(`Invalid model alias: ${String(alias)}`);
10443
+ }
10444
+ const configuredTarget = exports$1.MODEL_ALIASES[alias].find((target) => configuredProviders.has(target.provider));
10445
+ if (!configuredTarget) {
10446
+ return validationError(`No configured provider found for model alias ${alias}. Please check your API keys.`);
10447
+ }
10448
+ return configuredTarget;
10449
+ }
10450
+ return validationError("model must include either alias or provider/model fields");
10451
+ }
10452
+ })(modelInfo);
10453
+ return modelInfo;
10454
+ }
10455
+
10445
10456
  var castArrayPromptBuilder = {};
10446
10457
 
10447
10458
  var promptTemplateUtils = {};
@@ -10744,28 +10755,26 @@ function requireNuaLlmClient() {
10744
10755
  }
10745
10756
  });
10746
10757
  }
10747
- getClientForModel(model) {
10748
- const supported = model_info_1.SUPPORTED_MODELS[model];
10749
- if (!supported || supported.length === 0) {
10750
- throw new Error(`Model ${model} is not supported or configuration is missing.`);
10751
- }
10752
- for (const option of supported) {
10753
- if (this.clients.has(option.provider)) {
10754
- return this.clients.get(option.provider);
10755
- }
10756
- }
10757
- throw new Error(`No configured provider found for model ${model}. Please check your API keys.`);
10758
+ getConfiguredProviderIds() {
10759
+ return new Set(this.clients.keys());
10758
10760
  }
10759
- resolveModel(modelName) {
10760
- const result = (0, model_info_1.parseCanonicalModelName)(modelName);
10761
+ resolveModel(model) {
10762
+ const result = (0, model_info_1.resolveModelInput)(model, this.getConfiguredProviderIds());
10761
10763
  if ((0, nua_errors_1.isNuaValidationError)(result)) {
10762
10764
  throw new Error(result.message);
10763
10765
  }
10764
10766
  return result;
10765
10767
  }
10768
+ getClientForProvider(provider) {
10769
+ const client = this.clients.get(provider);
10770
+ if (!client) {
10771
+ throw new Error(`LLM provider ${provider} is not configured. Please check your API keys.`);
10772
+ }
10773
+ return client;
10774
+ }
10766
10775
  async castValue(params) {
10767
- const model = this.resolveModel(params.model);
10768
- const client = this.getClientForModel(model);
10776
+ const providerModel = this.resolveModel(params.model);
10777
+ const client = this.getClientForProvider(providerModel.provider);
10769
10778
  const maxTokens = params.maxTokens || 4096;
10770
10779
  const temperature = params.temperature ?? 0;
10771
10780
  const prompt = cast_prompt_builder_1.default.buildFullPrompt(params);
@@ -10774,7 +10783,7 @@ function requireNuaLlmClient() {
10774
10783
  const result = await (0, call_llm_service_1.callLLM)(
10775
10784
  client,
10776
10785
  prompt,
10777
- model,
10786
+ providerModel.model,
10778
10787
  maxTokens,
10779
10788
  temperature,
10780
10789
  3,
@@ -10796,8 +10805,8 @@ function requireNuaLlmClient() {
10796
10805
  }
10797
10806
  }
10798
10807
  async castArray(params) {
10799
- const model = this.resolveModel(params.model);
10800
- const client = this.getClientForModel(model);
10808
+ const providerModel = this.resolveModel(params.model);
10809
+ const client = this.getClientForProvider(providerModel.provider);
10801
10810
  const maxTokens = params.maxTokens || 4096;
10802
10811
  const temperature = params.temperature ?? 0;
10803
10812
  const validData = (0, validate_mappable_input_data_1.validateMappableInputData)(params.data, params.input.primaryKey);
@@ -10810,7 +10819,7 @@ function requireNuaLlmClient() {
10810
10819
  const prompt = cast_array_prompt_builder_1.default.buildFullPrompt(params, validData);
10811
10820
  const validationFn = (0, nua_json_schema_value_validation_1.buildNuaJsonSchemaValueValidation)("library-req", params.output.effectiveSchema);
10812
10821
  try {
10813
- const result = await (0, call_llm_service_1.callLLM)(client, prompt, model, maxTokens, temperature, 3, validationFn);
10822
+ const result = await (0, call_llm_service_1.callLLM)(client, prompt, providerModel.model, maxTokens, temperature, 3, validationFn);
10814
10823
  return {
10815
10824
  success: true,
10816
10825
  data: result.data,
@@ -10827,8 +10836,8 @@ function requireNuaLlmClient() {
10827
10836
  }
10828
10837
  async runAgent(params) {
10829
10838
  try {
10830
- const model = this.resolveModel(params.model);
10831
- const client = this.getClientForModel(model);
10839
+ const providerModel = this.resolveModel(params.model);
10840
+ const client = this.getClientForProvider(providerModel.provider);
10832
10841
  const maxTokens = params.maxTokens ?? 4096;
10833
10842
  const maxTurns = params.maxTurns ?? 10;
10834
10843
  return (0, agent_loop_1.runAgentLoop)({
@@ -10837,7 +10846,7 @@ function requireNuaLlmClient() {
10837
10846
  systemPrompt: params.systemPrompt,
10838
10847
  maxTurns,
10839
10848
  onEvent: params.onEvent,
10840
- sendRequest: (messages, tools, systemPrompt) => client.sendAgenticRequest(messages, tools, model, maxTokens, systemPrompt, params.onEvent)
10849
+ sendRequest: (messages, tools, systemPrompt) => client.sendAgenticRequest(messages, tools, providerModel.model, maxTokens, systemPrompt, params.onEvent)
10841
10850
  });
10842
10851
  } catch (e) {
10843
10852
  return {
@@ -11022,7 +11031,7 @@ function requireDist() {
11022
11031
  return mod && mod.__esModule ? mod : { "default": mod };
11023
11032
  };
11024
11033
  Object.defineProperty(exports$1, "__esModule", { value: true });
11025
- exports$1.runAgentLoop = exports$1.stableStringify = exports$1.validateJsonSchema = exports$1.providerConfigs = exports$1.normalizedUsageZero = exports$1.castArrayPromptBuilder = exports$1.castPromptBuilder = void 0;
11034
+ exports$1.runAgentLoop = exports$1.stableStringify = exports$1.validateJsonSchema = exports$1.providerConfigs = exports$1.normalizedUsageZero = exports$1.LLM_PROVIDER_IDS = exports$1.castArrayPromptBuilder = exports$1.castPromptBuilder = void 0;
11026
11035
  __exportStar(requireNuaLlmClient(), exports$1);
11027
11036
  __exportStar(requireLogger(), exports$1);
11028
11037
  __exportStar(requireTypes(), exports$1);
@@ -11036,6 +11045,9 @@ function requireDist() {
11036
11045
  return __importDefault(cast_array_prompt_builder_1).default;
11037
11046
  } });
11038
11047
  var provider_config_1 = requireProviderConfig();
11048
+ Object.defineProperty(exports$1, "LLM_PROVIDER_IDS", { enumerable: true, get: function() {
11049
+ return provider_config_1.LLM_PROVIDER_IDS;
11050
+ } });
11039
11051
  Object.defineProperty(exports$1, "normalizedUsageZero", { enumerable: true, get: function() {
11040
11052
  return provider_config_1.normalizedUsageZero;
11041
11053
  } });
@@ -11069,9 +11081,6 @@ const normalizedUsageZero = {
11069
11081
  };
11070
11082
  class DirectBackend {
11071
11083
  constructor(config) {
11072
- if (!config.model) {
11073
- throw new Error("model is required for direct mode");
11074
- }
11075
11084
  this.model = config.model;
11076
11085
  this.client = new distExports.NuaLlmClient({ providers: config.providers });
11077
11086
  }
@@ -11096,7 +11105,7 @@ class DirectBackend {
11096
11105
  success: true,
11097
11106
  data: result.data,
11098
11107
  usage: result.usage || normalizedUsageZero,
11099
- model,
11108
+ model: formatModelInput(model),
11100
11109
  latencyMs,
11101
11110
  source: "direct",
11102
11111
  meta: {}
@@ -11128,13 +11137,18 @@ class DirectBackend {
11128
11137
  success: true,
11129
11138
  data: result.data,
11130
11139
  usage: result.usage || normalizedUsageZero,
11131
- model,
11140
+ model: formatModelInput(model),
11132
11141
  latencyMs,
11133
11142
  source: "direct",
11134
11143
  meta: {}
11135
11144
  };
11136
11145
  }
11137
11146
  }
11147
+ function formatModelInput(model) {
11148
+ if (!model) return "fast";
11149
+ if ("alias" in model) return model.alias;
11150
+ return `${model.provider}:${model.model}`;
11151
+ }
11138
11152
 
11139
11153
  function resolveConfigValue(config, key, envVar) {
11140
11154
  if (config[key]) return config[key];