agentid-sdk 0.1.24 → 0.1.26
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 +28 -5
- package/dist/{agentid-BGCUoYV7.d.mts → agentid-DviYzyAM.d.mts} +49 -4
- package/dist/{agentid-BGCUoYV7.d.ts → agentid-DviYzyAM.d.ts} +49 -4
- package/dist/{chunk-JLHAS2EE.mjs → chunk-JIQGHFHI.mjs} +493 -54
- package/dist/index.d.mts +10 -2
- package/dist/index.d.ts +10 -2
- package/dist/index.js +496 -56
- package/dist/index.mjs +3 -1
- package/dist/langchain.d.mts +4 -1
- package/dist/langchain.d.ts +4 -1
- package/dist/langchain.js +111 -20
- package/dist/langchain.mjs +111 -20
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AgentID,
|
|
3
|
+
DependencyError,
|
|
3
4
|
InjectionScanner,
|
|
4
5
|
OpenAIAdapter,
|
|
5
6
|
PIIManager,
|
|
6
7
|
SecurityBlockError,
|
|
7
8
|
getInjectionScanner,
|
|
8
9
|
scanWithRegex
|
|
9
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-JIQGHFHI.mjs";
|
|
10
11
|
|
|
11
12
|
// src/transparency-badge.tsx
|
|
12
13
|
import * as React from "react";
|
|
@@ -169,6 +170,7 @@ function AgentIDTransparencyBadge(props) {
|
|
|
169
170
|
export {
|
|
170
171
|
AgentID,
|
|
171
172
|
AgentIDTransparencyBadge,
|
|
173
|
+
DependencyError,
|
|
172
174
|
InjectionScanner,
|
|
173
175
|
OpenAIAdapter,
|
|
174
176
|
PIIManager,
|
package/dist/langchain.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
2
|
-
import { A as AgentID } from './agentid-
|
|
2
|
+
import { A as AgentID } from './agentid-DviYzyAM.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* LangChainJS callback handler (dependency-free shape).
|
|
@@ -12,9 +12,12 @@ declare class AgentIDCallbackHandler extends BaseCallbackHandler {
|
|
|
12
12
|
private agent;
|
|
13
13
|
private systemId;
|
|
14
14
|
private apiKeyOverride?;
|
|
15
|
+
private expectedLanguages?;
|
|
15
16
|
private runs;
|
|
16
17
|
constructor(agent: AgentID, options: {
|
|
17
18
|
system_id: string;
|
|
19
|
+
expected_languages?: string[];
|
|
20
|
+
expectedLanguages?: string[];
|
|
18
21
|
apiKey?: string;
|
|
19
22
|
api_key?: string;
|
|
20
23
|
});
|
package/dist/langchain.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
2
|
-
import { A as AgentID } from './agentid-
|
|
2
|
+
import { A as AgentID } from './agentid-DviYzyAM.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* LangChainJS callback handler (dependency-free shape).
|
|
@@ -12,9 +12,12 @@ declare class AgentIDCallbackHandler extends BaseCallbackHandler {
|
|
|
12
12
|
private agent;
|
|
13
13
|
private systemId;
|
|
14
14
|
private apiKeyOverride?;
|
|
15
|
+
private expectedLanguages?;
|
|
15
16
|
private runs;
|
|
16
17
|
constructor(agent: AgentID, options: {
|
|
17
18
|
system_id: string;
|
|
19
|
+
expected_languages?: string[];
|
|
20
|
+
expectedLanguages?: string[];
|
|
18
21
|
apiKey?: string;
|
|
19
22
|
api_key?: string;
|
|
20
23
|
});
|
package/dist/langchain.js
CHANGED
|
@@ -27,7 +27,7 @@ var import_base = require("@langchain/core/callbacks/base");
|
|
|
27
27
|
|
|
28
28
|
// src/sdk-version.ts
|
|
29
29
|
var FALLBACK_SDK_VERSION = "js-0.0.0-dev";
|
|
30
|
-
var AGENTID_SDK_VERSION_HEADER = "js-0.1.
|
|
30
|
+
var AGENTID_SDK_VERSION_HEADER = "js-0.1.26".trim().length > 0 ? "js-0.1.26" : FALLBACK_SDK_VERSION;
|
|
31
31
|
|
|
32
32
|
// src/pii-national-identifiers.ts
|
|
33
33
|
var REGION_ANCHORS = {
|
|
@@ -215,6 +215,15 @@ var SecurityBlockError = class extends Error {
|
|
|
215
215
|
function safeString(val) {
|
|
216
216
|
return typeof val === "string" ? val : "";
|
|
217
217
|
}
|
|
218
|
+
function normalizeExpectedLanguages(value) {
|
|
219
|
+
if (!Array.isArray(value)) {
|
|
220
|
+
return void 0;
|
|
221
|
+
}
|
|
222
|
+
const normalized = [...new Set(
|
|
223
|
+
value.map((entry) => typeof entry === "string" ? entry.trim() : "").filter((entry) => entry.length > 0)
|
|
224
|
+
)];
|
|
225
|
+
return normalized.length > 0 ? normalized : void 0;
|
|
226
|
+
}
|
|
218
227
|
function coerceTransparencyMetadata(value) {
|
|
219
228
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
220
229
|
return void 0;
|
|
@@ -245,6 +254,14 @@ function logCallbackDebug(message, details) {
|
|
|
245
254
|
}
|
|
246
255
|
console.log(`[AgentID][LC] ${message}`);
|
|
247
256
|
}
|
|
257
|
+
function setFiniteDurationMetadata(metadata, key, value) {
|
|
258
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
259
|
+
metadata[key] = Math.max(0, Math.trunc(value));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function isGuardFailureEligibleForLocalFallback(reason) {
|
|
263
|
+
return reason === "network_error_strict_mode" || reason === "server_error" || reason === "system_failure" || reason === "system_failure_db_unavailable" || reason === "logging_failed" || reason === "guard_unreachable" || reason === "api_key_pepper_missing" || reason === "encryption_key_missing";
|
|
264
|
+
}
|
|
248
265
|
function extractTextFromContent(content) {
|
|
249
266
|
if (typeof content === "string") {
|
|
250
267
|
return content;
|
|
@@ -452,15 +469,16 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
452
469
|
this.runs = /* @__PURE__ */ new Map();
|
|
453
470
|
this.agent = agent;
|
|
454
471
|
this.systemId = options.system_id;
|
|
472
|
+
this.expectedLanguages = normalizeExpectedLanguages(
|
|
473
|
+
options.expected_languages ?? options.expectedLanguages
|
|
474
|
+
);
|
|
455
475
|
this.apiKeyOverride = options.apiKey?.trim() || options.api_key?.trim() || void 0;
|
|
456
476
|
}
|
|
457
477
|
get requestOptions() {
|
|
458
478
|
return this.apiKeyOverride ? { apiKey: this.apiKeyOverride } : void 0;
|
|
459
479
|
}
|
|
460
480
|
getLangchainCapabilities() {
|
|
461
|
-
const piiMaskingEnabled =
|
|
462
|
-
this.agent.piiMasking
|
|
463
|
-
);
|
|
481
|
+
const piiMaskingEnabled = this.agent.getEffectivePiiMasking(this.requestOptions);
|
|
464
482
|
return {
|
|
465
483
|
capabilities: {
|
|
466
484
|
has_feedback_handler: true,
|
|
@@ -469,15 +487,14 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
469
487
|
}
|
|
470
488
|
};
|
|
471
489
|
}
|
|
472
|
-
async preflight(input, stream) {
|
|
473
|
-
await this.agent.scanPromptInjection(input, this.requestOptions);
|
|
490
|
+
async preflight(input, stream, clientEventId) {
|
|
474
491
|
const prepared = await this.agent.prepareInputForDispatch({
|
|
475
492
|
input,
|
|
476
493
|
systemId: this.systemId,
|
|
477
494
|
stream,
|
|
478
|
-
|
|
495
|
+
clientEventId
|
|
479
496
|
}, this.requestOptions);
|
|
480
|
-
return prepared
|
|
497
|
+
return prepared;
|
|
481
498
|
}
|
|
482
499
|
async handleLLMStart(serialized, prompts, runId, _parentRunId, extraParams) {
|
|
483
500
|
const input = extractPromptFromPrompts(prompts);
|
|
@@ -486,8 +503,10 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
486
503
|
if (!input) {
|
|
487
504
|
return;
|
|
488
505
|
}
|
|
506
|
+
const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
|
|
489
507
|
const stream = extractStreamFlag(serialized, extraParams);
|
|
490
|
-
const
|
|
508
|
+
const prepared = await this.preflight(input, stream, requestedClientEventId);
|
|
509
|
+
const sanitizedInput = prepared.sanitizedInput;
|
|
491
510
|
if (sanitizedInput !== input) {
|
|
492
511
|
const mutated = setPromptInPrompts(prompts, sanitizedInput);
|
|
493
512
|
if (!mutated) {
|
|
@@ -496,7 +515,6 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
496
515
|
);
|
|
497
516
|
}
|
|
498
517
|
}
|
|
499
|
-
const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
|
|
500
518
|
const modelName = extractModel(serialized, extraParams);
|
|
501
519
|
const pipelineStartedAtMs = Date.now();
|
|
502
520
|
const verdict = await this.agent.guard({
|
|
@@ -504,20 +522,47 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
504
522
|
system_id: this.systemId,
|
|
505
523
|
model: modelName,
|
|
506
524
|
client_event_id: requestedClientEventId,
|
|
525
|
+
expected_languages: this.expectedLanguages,
|
|
507
526
|
client_capabilities: this.getLangchainCapabilities()
|
|
508
527
|
}, this.requestOptions);
|
|
528
|
+
let transformedForRun = sanitizedInput;
|
|
529
|
+
let sdkLocalScanMs = prepared.sdkLocalScanMs;
|
|
530
|
+
let localFallbackApplied = false;
|
|
531
|
+
let localFallbackReason = null;
|
|
509
532
|
if (!verdict.allowed) {
|
|
510
|
-
|
|
533
|
+
const fallbackEligible = isGuardFailureEligibleForLocalFallback(verdict.reason) && verdict.reason !== "guard_denied";
|
|
534
|
+
if (fallbackEligible) {
|
|
535
|
+
const fallback = await this.agent.applyLocalFallbackForGuardFailure({
|
|
536
|
+
input: sanitizedInput,
|
|
537
|
+
systemId: this.systemId,
|
|
538
|
+
stream,
|
|
539
|
+
clientEventId: requestedClientEventId,
|
|
540
|
+
capabilityConfig: prepared.capabilityConfig,
|
|
541
|
+
sdkConfigFetchMs: prepared.sdkConfigFetchMs
|
|
542
|
+
}, this.requestOptions);
|
|
543
|
+
transformedForRun = fallback.sanitizedInput;
|
|
544
|
+
sdkLocalScanMs = fallback.sdkLocalScanMs;
|
|
545
|
+
localFallbackApplied = true;
|
|
546
|
+
localFallbackReason = verdict.reason ?? "guard_unreachable";
|
|
547
|
+
} else {
|
|
548
|
+
throw new SecurityBlockError(verdict.reason ?? "guard_denied");
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
if (transformedForRun !== sanitizedInput) {
|
|
552
|
+
const mutated = setPromptInPrompts(prompts, transformedForRun);
|
|
553
|
+
if (!mutated) {
|
|
554
|
+
transformedForRun = sanitizedInput;
|
|
555
|
+
}
|
|
511
556
|
}
|
|
512
557
|
const canonicalClientEventId = isUuidLike(verdict.client_event_id) ? verdict.client_event_id.trim() : requestedClientEventId;
|
|
513
558
|
const guardEventId = typeof verdict.guard_event_id === "string" && verdict.guard_event_id.length > 0 ? verdict.guard_event_id : void 0;
|
|
514
559
|
const guardLatencyMs = typeof verdict.guard_latency_ms === "number" && Number.isFinite(verdict.guard_latency_ms) ? Math.max(0, Math.trunc(verdict.guard_latency_ms)) : Math.max(0, Date.now() - pipelineStartedAtMs);
|
|
515
560
|
const transparency = coerceTransparencyMetadata(verdict.transparency);
|
|
516
|
-
let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input :
|
|
517
|
-
if (transformedInput !==
|
|
561
|
+
let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : transformedForRun;
|
|
562
|
+
if (transformedInput !== transformedForRun) {
|
|
518
563
|
const mutated = setPromptInPrompts(prompts, transformedInput);
|
|
519
564
|
if (!mutated) {
|
|
520
|
-
transformedInput =
|
|
565
|
+
transformedInput = transformedForRun;
|
|
521
566
|
}
|
|
522
567
|
}
|
|
523
568
|
this.runs.set(id, {
|
|
@@ -525,6 +570,10 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
525
570
|
startedAtMs: Date.now(),
|
|
526
571
|
pipelineStartedAtMs,
|
|
527
572
|
guardLatencyMs,
|
|
573
|
+
sdkConfigFetchMs: prepared.sdkConfigFetchMs,
|
|
574
|
+
sdkLocalScanMs,
|
|
575
|
+
localFallbackApplied,
|
|
576
|
+
localFallbackReason,
|
|
528
577
|
model: modelName,
|
|
529
578
|
clientEventId: canonicalClientEventId,
|
|
530
579
|
guardEventId,
|
|
@@ -543,8 +592,10 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
543
592
|
if (!input) {
|
|
544
593
|
return;
|
|
545
594
|
}
|
|
595
|
+
const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
|
|
546
596
|
const stream = extractStreamFlag(serialized, extraParams);
|
|
547
|
-
const
|
|
597
|
+
const prepared = await this.preflight(input, stream, requestedClientEventId);
|
|
598
|
+
const sanitizedInput = prepared.sanitizedInput;
|
|
548
599
|
if (sanitizedInput !== input) {
|
|
549
600
|
const mutated = setPromptInMessages(messages, sanitizedInput);
|
|
550
601
|
if (!mutated) {
|
|
@@ -553,7 +604,6 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
553
604
|
);
|
|
554
605
|
}
|
|
555
606
|
}
|
|
556
|
-
const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
|
|
557
607
|
const modelName = extractModel(serialized, extraParams);
|
|
558
608
|
const pipelineStartedAtMs = Date.now();
|
|
559
609
|
const verdict = await this.agent.guard({
|
|
@@ -561,20 +611,47 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
561
611
|
system_id: this.systemId,
|
|
562
612
|
model: modelName,
|
|
563
613
|
client_event_id: requestedClientEventId,
|
|
614
|
+
expected_languages: this.expectedLanguages,
|
|
564
615
|
client_capabilities: this.getLangchainCapabilities()
|
|
565
616
|
}, this.requestOptions);
|
|
617
|
+
let transformedForRun = sanitizedInput;
|
|
618
|
+
let sdkLocalScanMs = prepared.sdkLocalScanMs;
|
|
619
|
+
let localFallbackApplied = false;
|
|
620
|
+
let localFallbackReason = null;
|
|
566
621
|
if (!verdict.allowed) {
|
|
567
|
-
|
|
622
|
+
const fallbackEligible = isGuardFailureEligibleForLocalFallback(verdict.reason) && verdict.reason !== "guard_denied";
|
|
623
|
+
if (fallbackEligible) {
|
|
624
|
+
const fallback = await this.agent.applyLocalFallbackForGuardFailure({
|
|
625
|
+
input: sanitizedInput,
|
|
626
|
+
systemId: this.systemId,
|
|
627
|
+
stream,
|
|
628
|
+
clientEventId: requestedClientEventId,
|
|
629
|
+
capabilityConfig: prepared.capabilityConfig,
|
|
630
|
+
sdkConfigFetchMs: prepared.sdkConfigFetchMs
|
|
631
|
+
}, this.requestOptions);
|
|
632
|
+
transformedForRun = fallback.sanitizedInput;
|
|
633
|
+
sdkLocalScanMs = fallback.sdkLocalScanMs;
|
|
634
|
+
localFallbackApplied = true;
|
|
635
|
+
localFallbackReason = verdict.reason ?? "guard_unreachable";
|
|
636
|
+
} else {
|
|
637
|
+
throw new SecurityBlockError(verdict.reason ?? "guard_denied");
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
if (transformedForRun !== sanitizedInput) {
|
|
641
|
+
const mutated = setPromptInMessages(messages, transformedForRun);
|
|
642
|
+
if (!mutated) {
|
|
643
|
+
transformedForRun = sanitizedInput;
|
|
644
|
+
}
|
|
568
645
|
}
|
|
569
646
|
const canonicalClientEventId = isUuidLike(verdict.client_event_id) ? verdict.client_event_id.trim() : requestedClientEventId;
|
|
570
647
|
const guardEventId = typeof verdict.guard_event_id === "string" && verdict.guard_event_id.length > 0 ? verdict.guard_event_id : void 0;
|
|
571
648
|
const guardLatencyMs = typeof verdict.guard_latency_ms === "number" && Number.isFinite(verdict.guard_latency_ms) ? Math.max(0, Math.trunc(verdict.guard_latency_ms)) : Math.max(0, Date.now() - pipelineStartedAtMs);
|
|
572
649
|
const transparency = coerceTransparencyMetadata(verdict.transparency);
|
|
573
|
-
let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input :
|
|
574
|
-
if (transformedInput !==
|
|
650
|
+
let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : transformedForRun;
|
|
651
|
+
if (transformedInput !== transformedForRun) {
|
|
575
652
|
const mutated = setPromptInMessages(messages, transformedInput);
|
|
576
653
|
if (!mutated) {
|
|
577
|
-
transformedInput =
|
|
654
|
+
transformedInput = transformedForRun;
|
|
578
655
|
}
|
|
579
656
|
}
|
|
580
657
|
this.runs.set(id, {
|
|
@@ -582,6 +659,10 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
582
659
|
startedAtMs: Date.now(),
|
|
583
660
|
pipelineStartedAtMs,
|
|
584
661
|
guardLatencyMs,
|
|
662
|
+
sdkConfigFetchMs: prepared.sdkConfigFetchMs,
|
|
663
|
+
sdkLocalScanMs,
|
|
664
|
+
localFallbackApplied,
|
|
665
|
+
localFallbackReason,
|
|
585
666
|
model: modelName,
|
|
586
667
|
clientEventId: canonicalClientEventId,
|
|
587
668
|
guardEventId,
|
|
@@ -618,7 +699,12 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
618
699
|
}
|
|
619
700
|
if (typeof state.guardLatencyMs === "number" && Number.isFinite(state.guardLatencyMs)) {
|
|
620
701
|
metadata.guard_latency_ms = state.guardLatencyMs;
|
|
702
|
+
metadata.sdk_guard_ms = state.guardLatencyMs;
|
|
621
703
|
}
|
|
704
|
+
setFiniteDurationMetadata(metadata, "sdk_config_fetch_ms", state.sdkConfigFetchMs);
|
|
705
|
+
setFiniteDurationMetadata(metadata, "sdk_local_scan_ms", state.sdkLocalScanMs);
|
|
706
|
+
metadata.sdk_local_fallback_applied = state.localFallbackApplied === true;
|
|
707
|
+
metadata.sdk_local_fallback_reason = state.localFallbackReason ?? null;
|
|
622
708
|
if (state.transparency) {
|
|
623
709
|
metadata.transparency = state.transparency;
|
|
624
710
|
}
|
|
@@ -658,7 +744,12 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
658
744
|
}
|
|
659
745
|
if (typeof state?.guardLatencyMs === "number" && Number.isFinite(state.guardLatencyMs)) {
|
|
660
746
|
metadata.guard_latency_ms = state.guardLatencyMs;
|
|
747
|
+
metadata.sdk_guard_ms = state.guardLatencyMs;
|
|
661
748
|
}
|
|
749
|
+
setFiniteDurationMetadata(metadata, "sdk_config_fetch_ms", state?.sdkConfigFetchMs);
|
|
750
|
+
setFiniteDurationMetadata(metadata, "sdk_local_scan_ms", state?.sdkLocalScanMs);
|
|
751
|
+
metadata.sdk_local_fallback_applied = state?.localFallbackApplied === true;
|
|
752
|
+
metadata.sdk_local_fallback_reason = state?.localFallbackReason ?? null;
|
|
662
753
|
if (state?.transparency) {
|
|
663
754
|
metadata.transparency = state.transparency;
|
|
664
755
|
}
|
package/dist/langchain.mjs
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SecurityBlockError
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JIQGHFHI.mjs";
|
|
4
4
|
|
|
5
5
|
// src/langchain.ts
|
|
6
6
|
import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
|
|
7
7
|
function safeString(val) {
|
|
8
8
|
return typeof val === "string" ? val : "";
|
|
9
9
|
}
|
|
10
|
+
function normalizeExpectedLanguages(value) {
|
|
11
|
+
if (!Array.isArray(value)) {
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
const normalized = [...new Set(
|
|
15
|
+
value.map((entry) => typeof entry === "string" ? entry.trim() : "").filter((entry) => entry.length > 0)
|
|
16
|
+
)];
|
|
17
|
+
return normalized.length > 0 ? normalized : void 0;
|
|
18
|
+
}
|
|
10
19
|
function coerceTransparencyMetadata(value) {
|
|
11
20
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
12
21
|
return void 0;
|
|
@@ -37,6 +46,14 @@ function logCallbackDebug(message, details) {
|
|
|
37
46
|
}
|
|
38
47
|
console.log(`[AgentID][LC] ${message}`);
|
|
39
48
|
}
|
|
49
|
+
function setFiniteDurationMetadata(metadata, key, value) {
|
|
50
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
51
|
+
metadata[key] = Math.max(0, Math.trunc(value));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function isGuardFailureEligibleForLocalFallback(reason) {
|
|
55
|
+
return reason === "network_error_strict_mode" || reason === "server_error" || reason === "system_failure" || reason === "system_failure_db_unavailable" || reason === "logging_failed" || reason === "guard_unreachable" || reason === "api_key_pepper_missing" || reason === "encryption_key_missing";
|
|
56
|
+
}
|
|
40
57
|
function extractTextFromContent(content) {
|
|
41
58
|
if (typeof content === "string") {
|
|
42
59
|
return content;
|
|
@@ -244,15 +261,16 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
244
261
|
this.runs = /* @__PURE__ */ new Map();
|
|
245
262
|
this.agent = agent;
|
|
246
263
|
this.systemId = options.system_id;
|
|
264
|
+
this.expectedLanguages = normalizeExpectedLanguages(
|
|
265
|
+
options.expected_languages ?? options.expectedLanguages
|
|
266
|
+
);
|
|
247
267
|
this.apiKeyOverride = options.apiKey?.trim() || options.api_key?.trim() || void 0;
|
|
248
268
|
}
|
|
249
269
|
get requestOptions() {
|
|
250
270
|
return this.apiKeyOverride ? { apiKey: this.apiKeyOverride } : void 0;
|
|
251
271
|
}
|
|
252
272
|
getLangchainCapabilities() {
|
|
253
|
-
const piiMaskingEnabled =
|
|
254
|
-
this.agent.piiMasking
|
|
255
|
-
);
|
|
273
|
+
const piiMaskingEnabled = this.agent.getEffectivePiiMasking(this.requestOptions);
|
|
256
274
|
return {
|
|
257
275
|
capabilities: {
|
|
258
276
|
has_feedback_handler: true,
|
|
@@ -261,15 +279,14 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
261
279
|
}
|
|
262
280
|
};
|
|
263
281
|
}
|
|
264
|
-
async preflight(input, stream) {
|
|
265
|
-
await this.agent.scanPromptInjection(input, this.requestOptions);
|
|
282
|
+
async preflight(input, stream, clientEventId) {
|
|
266
283
|
const prepared = await this.agent.prepareInputForDispatch({
|
|
267
284
|
input,
|
|
268
285
|
systemId: this.systemId,
|
|
269
286
|
stream,
|
|
270
|
-
|
|
287
|
+
clientEventId
|
|
271
288
|
}, this.requestOptions);
|
|
272
|
-
return prepared
|
|
289
|
+
return prepared;
|
|
273
290
|
}
|
|
274
291
|
async handleLLMStart(serialized, prompts, runId, _parentRunId, extraParams) {
|
|
275
292
|
const input = extractPromptFromPrompts(prompts);
|
|
@@ -278,8 +295,10 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
278
295
|
if (!input) {
|
|
279
296
|
return;
|
|
280
297
|
}
|
|
298
|
+
const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
|
|
281
299
|
const stream = extractStreamFlag(serialized, extraParams);
|
|
282
|
-
const
|
|
300
|
+
const prepared = await this.preflight(input, stream, requestedClientEventId);
|
|
301
|
+
const sanitizedInput = prepared.sanitizedInput;
|
|
283
302
|
if (sanitizedInput !== input) {
|
|
284
303
|
const mutated = setPromptInPrompts(prompts, sanitizedInput);
|
|
285
304
|
if (!mutated) {
|
|
@@ -288,7 +307,6 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
288
307
|
);
|
|
289
308
|
}
|
|
290
309
|
}
|
|
291
|
-
const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
|
|
292
310
|
const modelName = extractModel(serialized, extraParams);
|
|
293
311
|
const pipelineStartedAtMs = Date.now();
|
|
294
312
|
const verdict = await this.agent.guard({
|
|
@@ -296,20 +314,47 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
296
314
|
system_id: this.systemId,
|
|
297
315
|
model: modelName,
|
|
298
316
|
client_event_id: requestedClientEventId,
|
|
317
|
+
expected_languages: this.expectedLanguages,
|
|
299
318
|
client_capabilities: this.getLangchainCapabilities()
|
|
300
319
|
}, this.requestOptions);
|
|
320
|
+
let transformedForRun = sanitizedInput;
|
|
321
|
+
let sdkLocalScanMs = prepared.sdkLocalScanMs;
|
|
322
|
+
let localFallbackApplied = false;
|
|
323
|
+
let localFallbackReason = null;
|
|
301
324
|
if (!verdict.allowed) {
|
|
302
|
-
|
|
325
|
+
const fallbackEligible = isGuardFailureEligibleForLocalFallback(verdict.reason) && verdict.reason !== "guard_denied";
|
|
326
|
+
if (fallbackEligible) {
|
|
327
|
+
const fallback = await this.agent.applyLocalFallbackForGuardFailure({
|
|
328
|
+
input: sanitizedInput,
|
|
329
|
+
systemId: this.systemId,
|
|
330
|
+
stream,
|
|
331
|
+
clientEventId: requestedClientEventId,
|
|
332
|
+
capabilityConfig: prepared.capabilityConfig,
|
|
333
|
+
sdkConfigFetchMs: prepared.sdkConfigFetchMs
|
|
334
|
+
}, this.requestOptions);
|
|
335
|
+
transformedForRun = fallback.sanitizedInput;
|
|
336
|
+
sdkLocalScanMs = fallback.sdkLocalScanMs;
|
|
337
|
+
localFallbackApplied = true;
|
|
338
|
+
localFallbackReason = verdict.reason ?? "guard_unreachable";
|
|
339
|
+
} else {
|
|
340
|
+
throw new SecurityBlockError(verdict.reason ?? "guard_denied");
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (transformedForRun !== sanitizedInput) {
|
|
344
|
+
const mutated = setPromptInPrompts(prompts, transformedForRun);
|
|
345
|
+
if (!mutated) {
|
|
346
|
+
transformedForRun = sanitizedInput;
|
|
347
|
+
}
|
|
303
348
|
}
|
|
304
349
|
const canonicalClientEventId = isUuidLike(verdict.client_event_id) ? verdict.client_event_id.trim() : requestedClientEventId;
|
|
305
350
|
const guardEventId = typeof verdict.guard_event_id === "string" && verdict.guard_event_id.length > 0 ? verdict.guard_event_id : void 0;
|
|
306
351
|
const guardLatencyMs = typeof verdict.guard_latency_ms === "number" && Number.isFinite(verdict.guard_latency_ms) ? Math.max(0, Math.trunc(verdict.guard_latency_ms)) : Math.max(0, Date.now() - pipelineStartedAtMs);
|
|
307
352
|
const transparency = coerceTransparencyMetadata(verdict.transparency);
|
|
308
|
-
let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input :
|
|
309
|
-
if (transformedInput !==
|
|
353
|
+
let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : transformedForRun;
|
|
354
|
+
if (transformedInput !== transformedForRun) {
|
|
310
355
|
const mutated = setPromptInPrompts(prompts, transformedInput);
|
|
311
356
|
if (!mutated) {
|
|
312
|
-
transformedInput =
|
|
357
|
+
transformedInput = transformedForRun;
|
|
313
358
|
}
|
|
314
359
|
}
|
|
315
360
|
this.runs.set(id, {
|
|
@@ -317,6 +362,10 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
317
362
|
startedAtMs: Date.now(),
|
|
318
363
|
pipelineStartedAtMs,
|
|
319
364
|
guardLatencyMs,
|
|
365
|
+
sdkConfigFetchMs: prepared.sdkConfigFetchMs,
|
|
366
|
+
sdkLocalScanMs,
|
|
367
|
+
localFallbackApplied,
|
|
368
|
+
localFallbackReason,
|
|
320
369
|
model: modelName,
|
|
321
370
|
clientEventId: canonicalClientEventId,
|
|
322
371
|
guardEventId,
|
|
@@ -335,8 +384,10 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
335
384
|
if (!input) {
|
|
336
385
|
return;
|
|
337
386
|
}
|
|
387
|
+
const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
|
|
338
388
|
const stream = extractStreamFlag(serialized, extraParams);
|
|
339
|
-
const
|
|
389
|
+
const prepared = await this.preflight(input, stream, requestedClientEventId);
|
|
390
|
+
const sanitizedInput = prepared.sanitizedInput;
|
|
340
391
|
if (sanitizedInput !== input) {
|
|
341
392
|
const mutated = setPromptInMessages(messages, sanitizedInput);
|
|
342
393
|
if (!mutated) {
|
|
@@ -345,7 +396,6 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
345
396
|
);
|
|
346
397
|
}
|
|
347
398
|
}
|
|
348
|
-
const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
|
|
349
399
|
const modelName = extractModel(serialized, extraParams);
|
|
350
400
|
const pipelineStartedAtMs = Date.now();
|
|
351
401
|
const verdict = await this.agent.guard({
|
|
@@ -353,20 +403,47 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
353
403
|
system_id: this.systemId,
|
|
354
404
|
model: modelName,
|
|
355
405
|
client_event_id: requestedClientEventId,
|
|
406
|
+
expected_languages: this.expectedLanguages,
|
|
356
407
|
client_capabilities: this.getLangchainCapabilities()
|
|
357
408
|
}, this.requestOptions);
|
|
409
|
+
let transformedForRun = sanitizedInput;
|
|
410
|
+
let sdkLocalScanMs = prepared.sdkLocalScanMs;
|
|
411
|
+
let localFallbackApplied = false;
|
|
412
|
+
let localFallbackReason = null;
|
|
358
413
|
if (!verdict.allowed) {
|
|
359
|
-
|
|
414
|
+
const fallbackEligible = isGuardFailureEligibleForLocalFallback(verdict.reason) && verdict.reason !== "guard_denied";
|
|
415
|
+
if (fallbackEligible) {
|
|
416
|
+
const fallback = await this.agent.applyLocalFallbackForGuardFailure({
|
|
417
|
+
input: sanitizedInput,
|
|
418
|
+
systemId: this.systemId,
|
|
419
|
+
stream,
|
|
420
|
+
clientEventId: requestedClientEventId,
|
|
421
|
+
capabilityConfig: prepared.capabilityConfig,
|
|
422
|
+
sdkConfigFetchMs: prepared.sdkConfigFetchMs
|
|
423
|
+
}, this.requestOptions);
|
|
424
|
+
transformedForRun = fallback.sanitizedInput;
|
|
425
|
+
sdkLocalScanMs = fallback.sdkLocalScanMs;
|
|
426
|
+
localFallbackApplied = true;
|
|
427
|
+
localFallbackReason = verdict.reason ?? "guard_unreachable";
|
|
428
|
+
} else {
|
|
429
|
+
throw new SecurityBlockError(verdict.reason ?? "guard_denied");
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (transformedForRun !== sanitizedInput) {
|
|
433
|
+
const mutated = setPromptInMessages(messages, transformedForRun);
|
|
434
|
+
if (!mutated) {
|
|
435
|
+
transformedForRun = sanitizedInput;
|
|
436
|
+
}
|
|
360
437
|
}
|
|
361
438
|
const canonicalClientEventId = isUuidLike(verdict.client_event_id) ? verdict.client_event_id.trim() : requestedClientEventId;
|
|
362
439
|
const guardEventId = typeof verdict.guard_event_id === "string" && verdict.guard_event_id.length > 0 ? verdict.guard_event_id : void 0;
|
|
363
440
|
const guardLatencyMs = typeof verdict.guard_latency_ms === "number" && Number.isFinite(verdict.guard_latency_ms) ? Math.max(0, Math.trunc(verdict.guard_latency_ms)) : Math.max(0, Date.now() - pipelineStartedAtMs);
|
|
364
441
|
const transparency = coerceTransparencyMetadata(verdict.transparency);
|
|
365
|
-
let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input :
|
|
366
|
-
if (transformedInput !==
|
|
442
|
+
let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : transformedForRun;
|
|
443
|
+
if (transformedInput !== transformedForRun) {
|
|
367
444
|
const mutated = setPromptInMessages(messages, transformedInput);
|
|
368
445
|
if (!mutated) {
|
|
369
|
-
transformedInput =
|
|
446
|
+
transformedInput = transformedForRun;
|
|
370
447
|
}
|
|
371
448
|
}
|
|
372
449
|
this.runs.set(id, {
|
|
@@ -374,6 +451,10 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
374
451
|
startedAtMs: Date.now(),
|
|
375
452
|
pipelineStartedAtMs,
|
|
376
453
|
guardLatencyMs,
|
|
454
|
+
sdkConfigFetchMs: prepared.sdkConfigFetchMs,
|
|
455
|
+
sdkLocalScanMs,
|
|
456
|
+
localFallbackApplied,
|
|
457
|
+
localFallbackReason,
|
|
377
458
|
model: modelName,
|
|
378
459
|
clientEventId: canonicalClientEventId,
|
|
379
460
|
guardEventId,
|
|
@@ -410,7 +491,12 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
410
491
|
}
|
|
411
492
|
if (typeof state.guardLatencyMs === "number" && Number.isFinite(state.guardLatencyMs)) {
|
|
412
493
|
metadata.guard_latency_ms = state.guardLatencyMs;
|
|
494
|
+
metadata.sdk_guard_ms = state.guardLatencyMs;
|
|
413
495
|
}
|
|
496
|
+
setFiniteDurationMetadata(metadata, "sdk_config_fetch_ms", state.sdkConfigFetchMs);
|
|
497
|
+
setFiniteDurationMetadata(metadata, "sdk_local_scan_ms", state.sdkLocalScanMs);
|
|
498
|
+
metadata.sdk_local_fallback_applied = state.localFallbackApplied === true;
|
|
499
|
+
metadata.sdk_local_fallback_reason = state.localFallbackReason ?? null;
|
|
414
500
|
if (state.transparency) {
|
|
415
501
|
metadata.transparency = state.transparency;
|
|
416
502
|
}
|
|
@@ -450,7 +536,12 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
|
|
|
450
536
|
}
|
|
451
537
|
if (typeof state?.guardLatencyMs === "number" && Number.isFinite(state.guardLatencyMs)) {
|
|
452
538
|
metadata.guard_latency_ms = state.guardLatencyMs;
|
|
539
|
+
metadata.sdk_guard_ms = state.guardLatencyMs;
|
|
453
540
|
}
|
|
541
|
+
setFiniteDurationMetadata(metadata, "sdk_config_fetch_ms", state?.sdkConfigFetchMs);
|
|
542
|
+
setFiniteDurationMetadata(metadata, "sdk_local_scan_ms", state?.sdkLocalScanMs);
|
|
543
|
+
metadata.sdk_local_fallback_applied = state?.localFallbackApplied === true;
|
|
544
|
+
metadata.sdk_local_fallback_reason = state?.localFallbackReason ?? null;
|
|
454
545
|
if (state?.transparency) {
|
|
455
546
|
metadata.transparency = state.transparency;
|
|
456
547
|
}
|