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.
- package/README.md +44 -30
- package/dist/cjs/index.cjs +227 -213
- package/dist/esm/index.mjs +227 -213
- package/dist/types/backend/direct.d.ts +2 -2
- package/dist/types/backend/types.d.ts +3 -2
- package/dist/types/nua.d.ts +3 -2
- package/package.json +1 -1
package/dist/cjs/index.cjs
CHANGED
|
@@ -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,
|
|
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.
|
|
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
|
|
176
|
+
function parseJsonFromLlmResponse(input) {
|
|
188
177
|
const trimmed = input.trim();
|
|
189
178
|
const codeFence = "```";
|
|
190
179
|
const jsonFence = "```json";
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const
|
|
194
|
-
|
|
195
|
-
|
|
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
|
-
|
|
199
|
-
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
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
|
-
|
|
228
|
-
|
|
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
|
-
|
|
5523
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
10748
|
-
|
|
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(
|
|
10760
|
-
const result = (0, model_info_1.
|
|
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
|
|
10768
|
-
const client = this.
|
|
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
|
|
10800
|
-
const client = this.
|
|
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
|
|
10831
|
-
const client = this.
|
|
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];
|