@lockllm/sdk 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +146 -5
- package/README.md +238 -39
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/errors.d.ts +46 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +104 -2
- package/dist/errors.js.map +1 -1
- package/dist/errors.mjs +100 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -2
- package/dist/scan.d.ts +20 -5
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +55 -5
- package/dist/scan.js.map +1 -1
- package/dist/scan.mjs +55 -5
- package/dist/types/common.d.ts +85 -0
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/errors.d.ts +33 -0
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/scan.d.ts +102 -3
- package/dist/types/scan.d.ts.map +1 -1
- package/dist/utils/proxy-headers.d.ts +24 -0
- package/dist/utils/proxy-headers.d.ts.map +1 -0
- package/dist/utils/proxy-headers.js +175 -0
- package/dist/utils/proxy-headers.js.map +1 -0
- package/dist/utils/proxy-headers.mjs +170 -0
- package/dist/utils.d.ts +24 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +28 -0
- package/dist/utils.js.map +1 -1
- package/dist/utils.mjs +27 -0
- package/dist/wrappers/anthropic-wrapper.d.ts +10 -1
- package/dist/wrappers/anthropic-wrapper.d.ts.map +1 -1
- package/dist/wrappers/anthropic-wrapper.js +17 -2
- package/dist/wrappers/anthropic-wrapper.js.map +1 -1
- package/dist/wrappers/anthropic-wrapper.mjs +17 -2
- package/dist/wrappers/generic-wrapper.d.ts +5 -0
- package/dist/wrappers/generic-wrapper.d.ts.map +1 -1
- package/dist/wrappers/generic-wrapper.js +12 -1
- package/dist/wrappers/generic-wrapper.js.map +1 -1
- package/dist/wrappers/generic-wrapper.mjs +12 -1
- package/dist/wrappers/openai-wrapper.d.ts +10 -1
- package/dist/wrappers/openai-wrapper.d.ts.map +1 -1
- package/dist/wrappers/openai-wrapper.js +17 -2
- package/dist/wrappers/openai-wrapper.js.map +1 -1
- package/dist/wrappers/openai-wrapper.mjs +17 -2
- package/package.json +2 -18
package/dist/scan.mjs
CHANGED
|
@@ -9,27 +9,77 @@ export class ScanClient {
|
|
|
9
9
|
* Scan a prompt for injection attacks
|
|
10
10
|
*
|
|
11
11
|
* @param request - Scan request parameters
|
|
12
|
-
* @param options -
|
|
12
|
+
* @param options - Scan options with action headers
|
|
13
13
|
* @returns Scan result with safety information
|
|
14
14
|
*
|
|
15
15
|
* @example
|
|
16
16
|
* ```typescript
|
|
17
|
+
* // Basic scan with combined mode (default)
|
|
17
18
|
* const result = await client.scan({
|
|
18
19
|
* input: "Ignore previous instructions and...",
|
|
19
|
-
* sensitivity: "medium"
|
|
20
|
+
* sensitivity: "medium",
|
|
21
|
+
* mode: "combined" // Check both core security + custom policies
|
|
22
|
+
* }, {
|
|
23
|
+
* scanAction: "block", // Block core injection attacks
|
|
24
|
+
* policyAction: "allow_with_warning", // Allow but warn on policy violations
|
|
25
|
+
* abuseAction: "block" // Opt-in abuse detection
|
|
20
26
|
* });
|
|
21
27
|
*
|
|
22
28
|
* if (!result.safe) {
|
|
23
29
|
* console.log("Malicious prompt detected!");
|
|
24
30
|
* console.log("Injection score:", result.injection);
|
|
31
|
+
*
|
|
32
|
+
* // Check for policy violations
|
|
33
|
+
* if (result.policy_warnings) {
|
|
34
|
+
* console.log("Policy violations:", result.policy_warnings);
|
|
35
|
+
* }
|
|
36
|
+
*
|
|
37
|
+
* // Check for abuse warnings
|
|
38
|
+
* if (result.abuse_warnings) {
|
|
39
|
+
* console.log("Abuse detected:", result.abuse_warnings);
|
|
40
|
+
* }
|
|
25
41
|
* }
|
|
26
42
|
* ```
|
|
27
43
|
*/
|
|
28
44
|
async scan(request, options) {
|
|
29
|
-
|
|
45
|
+
// Build headers from scan options
|
|
46
|
+
const headers = {
|
|
47
|
+
...(options?.headers || {}),
|
|
48
|
+
};
|
|
49
|
+
// Scan mode header
|
|
50
|
+
if (request.mode) {
|
|
51
|
+
headers['x-lockllm-scan-mode'] = request.mode;
|
|
52
|
+
}
|
|
53
|
+
// Sensitivity header
|
|
54
|
+
if (request.sensitivity) {
|
|
55
|
+
headers['x-lockllm-sensitivity'] = request.sensitivity;
|
|
56
|
+
}
|
|
57
|
+
// Chunk header
|
|
58
|
+
if (request.chunk !== undefined) {
|
|
59
|
+
headers['x-lockllm-chunk'] = request.chunk ? 'true' : 'false';
|
|
60
|
+
}
|
|
61
|
+
// Add action headers if provided
|
|
62
|
+
// Scan action: controls core injection detection behavior
|
|
63
|
+
if (options?.scanAction) {
|
|
64
|
+
headers['x-lockllm-scan-action'] = options.scanAction;
|
|
65
|
+
}
|
|
66
|
+
// Policy action: controls custom policy violation behavior
|
|
67
|
+
if (options?.policyAction) {
|
|
68
|
+
headers['x-lockllm-policy-action'] = options.policyAction;
|
|
69
|
+
}
|
|
70
|
+
// Abuse action: opt-in abuse detection (null/undefined means disabled)
|
|
71
|
+
if (options?.abuseAction !== undefined && options?.abuseAction !== null) {
|
|
72
|
+
headers['x-lockllm-abuse-action'] = options.abuseAction;
|
|
73
|
+
}
|
|
74
|
+
// Build request body
|
|
75
|
+
const body = {
|
|
30
76
|
input: request.input,
|
|
31
|
-
|
|
32
|
-
},
|
|
77
|
+
};
|
|
78
|
+
const { data } = await this.http.post('/v1/scan', body, {
|
|
79
|
+
headers,
|
|
80
|
+
timeout: options?.timeout,
|
|
81
|
+
signal: options?.signal,
|
|
82
|
+
});
|
|
33
83
|
return data;
|
|
34
84
|
}
|
|
35
85
|
}
|
package/dist/types/common.d.ts
CHANGED
|
@@ -28,4 +28,89 @@ export interface ErrorResponse {
|
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
30
|
export type Provider = 'openai' | 'anthropic' | 'gemini' | 'cohere' | 'openrouter' | 'perplexity' | 'mistral' | 'groq' | 'deepseek' | 'together' | 'xai' | 'fireworks' | 'anyscale' | 'huggingface' | 'azure' | 'bedrock' | 'vertex-ai';
|
|
31
|
+
/** Scan mode for security checks */
|
|
32
|
+
export type ScanMode = 'normal' | 'policy_only' | 'combined';
|
|
33
|
+
/** Scan action for threat detection */
|
|
34
|
+
export type ScanAction = 'block' | 'allow_with_warning';
|
|
35
|
+
/** Routing action for intelligent model selection */
|
|
36
|
+
export type RouteAction = 'disabled' | 'auto' | 'custom';
|
|
37
|
+
/** Proxy request options with advanced headers */
|
|
38
|
+
export interface ProxyRequestOptions extends RequestOptions {
|
|
39
|
+
/** Scan mode (default: combined) - Check both core security and custom policies */
|
|
40
|
+
scanMode?: ScanMode;
|
|
41
|
+
/** Scan action for core injection (default: allow_with_warning) - Threats detected but not blocked */
|
|
42
|
+
scanAction?: ScanAction;
|
|
43
|
+
/** Policy action for custom policies (default: allow_with_warning) - Violations detected but not blocked */
|
|
44
|
+
policyAction?: ScanAction;
|
|
45
|
+
/** Abuse detection action (opt-in, default: null) - When null, abuse detection is disabled */
|
|
46
|
+
abuseAction?: ScanAction | null;
|
|
47
|
+
/** Routing action (default: disabled) - No intelligent routing unless explicitly enabled */
|
|
48
|
+
routeAction?: RouteAction;
|
|
49
|
+
/** Response caching (default: enabled). Set false to disable. */
|
|
50
|
+
cacheResponse?: boolean;
|
|
51
|
+
/** Cache TTL in seconds (default: 3600) */
|
|
52
|
+
cacheTTL?: number;
|
|
53
|
+
}
|
|
54
|
+
/** Response metadata from proxy */
|
|
55
|
+
export interface ProxyResponseMetadata {
|
|
56
|
+
/** Unique request identifier */
|
|
57
|
+
request_id: string;
|
|
58
|
+
/** Whether the request was scanned */
|
|
59
|
+
scanned: boolean;
|
|
60
|
+
/** Whether the request is safe */
|
|
61
|
+
safe: boolean;
|
|
62
|
+
/** Scan mode used */
|
|
63
|
+
scan_mode: ScanMode;
|
|
64
|
+
/** Credits mode (lockllm_credits or byok) */
|
|
65
|
+
credits_mode: 'lockllm_credits' | 'byok';
|
|
66
|
+
/** Provider used */
|
|
67
|
+
provider: string;
|
|
68
|
+
/** Model used */
|
|
69
|
+
model?: string;
|
|
70
|
+
/** Scan warning details */
|
|
71
|
+
scan_warning?: {
|
|
72
|
+
injection_score: number;
|
|
73
|
+
confidence: number;
|
|
74
|
+
detail: string;
|
|
75
|
+
};
|
|
76
|
+
/** Policy violation warnings */
|
|
77
|
+
policy_warnings?: {
|
|
78
|
+
count: number;
|
|
79
|
+
confidence: number;
|
|
80
|
+
detail: string;
|
|
81
|
+
};
|
|
82
|
+
/** Abuse detection warnings */
|
|
83
|
+
abuse_detected?: {
|
|
84
|
+
confidence: number;
|
|
85
|
+
types: string;
|
|
86
|
+
detail: string;
|
|
87
|
+
};
|
|
88
|
+
/** Routing metadata */
|
|
89
|
+
routing?: {
|
|
90
|
+
enabled: boolean;
|
|
91
|
+
task_type: string;
|
|
92
|
+
complexity: number;
|
|
93
|
+
selected_model: string;
|
|
94
|
+
routing_reason: string;
|
|
95
|
+
original_provider: string;
|
|
96
|
+
original_model: string;
|
|
97
|
+
estimated_savings: number;
|
|
98
|
+
};
|
|
99
|
+
/** Credits reserved for this request */
|
|
100
|
+
credits_reserved?: number;
|
|
101
|
+
/** Routing fee reserved */
|
|
102
|
+
routing_fee_reserved?: number;
|
|
103
|
+
/** Actual credits deducted (available after completion) */
|
|
104
|
+
credits_deducted?: number;
|
|
105
|
+
/** Balance after this request (available after completion) */
|
|
106
|
+
balance_after?: number;
|
|
107
|
+
/** Cache status for this response */
|
|
108
|
+
cache_status?: 'HIT' | 'MISS';
|
|
109
|
+
/** Cache age in seconds (when cache hit) */
|
|
110
|
+
cache_age?: number;
|
|
111
|
+
/** Tokens saved from cache hit */
|
|
112
|
+
tokens_saved?: number;
|
|
113
|
+
/** Cost saved from cache hit */
|
|
114
|
+
cost_saved?: number;
|
|
115
|
+
}
|
|
31
116
|
//# sourceMappingURL=common.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH;AAED,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,MAAM,GACN,UAAU,GACV,UAAU,GACV,KAAK,GACL,WAAW,GACX,UAAU,GACV,aAAa,GACb,OAAO,GACP,SAAS,GACT,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"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"}
|
package/dist/types/errors.d.ts
CHANGED
|
@@ -19,4 +19,37 @@ export interface LockLLMErrorData {
|
|
|
19
19
|
export interface PromptInjectionErrorData extends LockLLMErrorData {
|
|
20
20
|
scanResult: ScanResult;
|
|
21
21
|
}
|
|
22
|
+
export interface PolicyViolationErrorData extends LockLLMErrorData {
|
|
23
|
+
violated_policies: Array<{
|
|
24
|
+
policy_name: string;
|
|
25
|
+
violated_categories: Array<{
|
|
26
|
+
name: string;
|
|
27
|
+
}>;
|
|
28
|
+
violation_details?: string;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
export interface AbuseDetectedErrorData extends LockLLMErrorData {
|
|
32
|
+
abuse_details: {
|
|
33
|
+
confidence: number;
|
|
34
|
+
abuse_types: string[];
|
|
35
|
+
indicators: {
|
|
36
|
+
bot_score: number;
|
|
37
|
+
repetition_score: number;
|
|
38
|
+
resource_score: number;
|
|
39
|
+
pattern_score: number;
|
|
40
|
+
};
|
|
41
|
+
recommendation?: string;
|
|
42
|
+
details?: {
|
|
43
|
+
recommendation?: string;
|
|
44
|
+
bot_indicators?: string[];
|
|
45
|
+
repetition_indicators?: string[];
|
|
46
|
+
resource_indicators?: string[];
|
|
47
|
+
pattern_indicators?: string[];
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export interface InsufficientCreditsErrorData extends LockLLMErrorData {
|
|
52
|
+
current_balance: number;
|
|
53
|
+
estimated_cost: number;
|
|
54
|
+
}
|
|
22
55
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,UAAU,EAAE,UAAU,CAAC;CACxB"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,iBAAiB,EAAE,KAAK,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,mBAAmB,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,aAAa,EAAE;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,UAAU,EAAE;YACV,SAAS,EAAE,MAAM,CAAC;YAClB,gBAAgB,EAAE,MAAM,CAAC;YACzB,cAAc,EAAE,MAAM,CAAC;YACvB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE;YACR,cAAc,CAAC,EAAE,MAAM,CAAC;YACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;YAC1B,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;YACjC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;YAC/B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;SAC/B,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,4BAA6B,SAAQ,gBAAgB;IACpE,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB"}
|
package/dist/types/scan.d.ts
CHANGED
|
@@ -1,21 +1,99 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Scan API types
|
|
3
3
|
*/
|
|
4
|
-
import type { ScanResult } from './errors';
|
|
5
4
|
export type Sensitivity = 'low' | 'medium' | 'high';
|
|
5
|
+
/** Scan mode determines which security checks are performed */
|
|
6
|
+
export type ScanMode = 'normal' | 'policy_only' | 'combined';
|
|
7
|
+
/** Scan action determines behavior when threats are detected */
|
|
8
|
+
export type ScanAction = 'block' | 'allow_with_warning';
|
|
6
9
|
export interface ScanRequest {
|
|
7
10
|
/** The text prompt to scan for injection attacks */
|
|
8
11
|
input: string;
|
|
9
12
|
/** Detection sensitivity level (default: medium) */
|
|
10
13
|
sensitivity?: Sensitivity;
|
|
14
|
+
/** Scan mode (default: combined) - Check both core security and custom policies */
|
|
15
|
+
mode?: ScanMode;
|
|
16
|
+
/** Force chunking for large inputs */
|
|
17
|
+
chunk?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** Scan request options with action headers */
|
|
20
|
+
export interface ScanOptions {
|
|
21
|
+
/** Scan action for core injection (default: allow_with_warning) - Threats detected but not blocked */
|
|
22
|
+
scanAction?: ScanAction;
|
|
23
|
+
/** Policy action for custom policies (default: allow_with_warning) - Violations detected but not blocked */
|
|
24
|
+
policyAction?: ScanAction;
|
|
25
|
+
/** Abuse detection action (opt-in, default: null) - When null, abuse detection is disabled */
|
|
26
|
+
abuseAction?: ScanAction | null;
|
|
27
|
+
/** Custom headers to include in the request */
|
|
28
|
+
headers?: Record<string, string>;
|
|
29
|
+
/** Request timeout in milliseconds */
|
|
30
|
+
timeout?: number;
|
|
31
|
+
/** Abort signal for cancelling requests */
|
|
32
|
+
signal?: AbortSignal;
|
|
33
|
+
}
|
|
34
|
+
/** Policy violation details */
|
|
35
|
+
export interface PolicyViolation {
|
|
36
|
+
/** Policy name (user-defined or built-in) */
|
|
37
|
+
policy_name: string;
|
|
38
|
+
/** Categories that were violated */
|
|
39
|
+
violated_categories: Array<{
|
|
40
|
+
/** Category name */
|
|
41
|
+
name: string;
|
|
42
|
+
}>;
|
|
43
|
+
/** Specific details about the violation */
|
|
44
|
+
violation_details?: string;
|
|
45
|
+
}
|
|
46
|
+
/** Scan warning when core injection is detected with allow_with_warning */
|
|
47
|
+
export interface ScanWarning {
|
|
48
|
+
/** Warning message */
|
|
49
|
+
message: string;
|
|
50
|
+
/** Injection score (0-100) */
|
|
51
|
+
injection_score: number;
|
|
52
|
+
/** Confidence score (0-100) */
|
|
53
|
+
confidence: number;
|
|
54
|
+
/** Safety label (0 = safe, 1 = unsafe) */
|
|
55
|
+
label: 0 | 1;
|
|
56
|
+
}
|
|
57
|
+
/** Abuse detection warning */
|
|
58
|
+
export interface AbuseWarning {
|
|
59
|
+
/** Whether abuse was detected */
|
|
60
|
+
detected: true;
|
|
61
|
+
/** Overall confidence score (0-100) */
|
|
62
|
+
confidence: number;
|
|
63
|
+
/** Types of abuse detected */
|
|
64
|
+
abuse_types: string[];
|
|
65
|
+
/** Individual abuse indicators */
|
|
66
|
+
indicators: {
|
|
67
|
+
/** Bot-generated content score (0-100) */
|
|
68
|
+
bot_score: number;
|
|
69
|
+
/** Repetition detection score (0-100) */
|
|
70
|
+
repetition_score: number;
|
|
71
|
+
/** Resource exhaustion score (0-100) */
|
|
72
|
+
resource_score: number;
|
|
73
|
+
/** Pattern analysis score (0-100) */
|
|
74
|
+
pattern_score: number;
|
|
75
|
+
};
|
|
76
|
+
/** Recommended mitigation action */
|
|
77
|
+
recommendation?: string;
|
|
11
78
|
}
|
|
12
79
|
/**
|
|
13
80
|
* Full scan response from the scan API endpoint
|
|
14
|
-
* Extends the base ScanResult with additional metadata
|
|
15
81
|
*/
|
|
16
|
-
export interface ScanResponse
|
|
82
|
+
export interface ScanResponse {
|
|
17
83
|
/** Unique request identifier */
|
|
18
84
|
request_id: string;
|
|
85
|
+
/** Whether the prompt is safe */
|
|
86
|
+
safe: boolean;
|
|
87
|
+
/** Safety label (0 = safe, 1 = unsafe) */
|
|
88
|
+
label: 0 | 1;
|
|
89
|
+
/** Detection sensitivity level used */
|
|
90
|
+
sensitivity: Sensitivity;
|
|
91
|
+
/** Core injection confidence (not present in policy_only mode) */
|
|
92
|
+
confidence?: number;
|
|
93
|
+
/** Core injection score (not present in policy_only mode) */
|
|
94
|
+
injection?: number;
|
|
95
|
+
/** Policy check confidence (present in policy_only and combined modes) */
|
|
96
|
+
policy_confidence?: number;
|
|
19
97
|
/** Usage statistics */
|
|
20
98
|
usage: {
|
|
21
99
|
/** Number of upstream inference requests */
|
|
@@ -32,5 +110,26 @@ export interface ScanResponse extends ScanResult {
|
|
|
32
110
|
/** Processing mode used */
|
|
33
111
|
mode: 'single' | 'chunked';
|
|
34
112
|
};
|
|
113
|
+
/** Policy warnings (when present in policy_only or combined modes) */
|
|
114
|
+
policy_warnings?: PolicyViolation[];
|
|
115
|
+
/** Scan warning (when core injection detected with allow_with_warning) */
|
|
116
|
+
scan_warning?: ScanWarning;
|
|
117
|
+
/** Abuse warnings (when abuse detected with allow_with_warning) */
|
|
118
|
+
abuse_warnings?: AbuseWarning;
|
|
119
|
+
/** Routing metadata (present when routing is enabled) */
|
|
120
|
+
routing?: {
|
|
121
|
+
/** Whether routing is enabled */
|
|
122
|
+
enabled: boolean;
|
|
123
|
+
/** Detected task type */
|
|
124
|
+
task_type: string;
|
|
125
|
+
/** Complexity score (0-1) */
|
|
126
|
+
complexity: number;
|
|
127
|
+
/** Model selected by router */
|
|
128
|
+
selected_model?: string;
|
|
129
|
+
/** Routing decision reasoning */
|
|
130
|
+
reasoning?: string;
|
|
131
|
+
/** Estimated cost */
|
|
132
|
+
estimated_cost?: number;
|
|
133
|
+
};
|
|
35
134
|
}
|
|
36
135
|
//# sourceMappingURL=scan.d.ts.map
|
package/dist/types/scan.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/types/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/types/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy headers utility functions
|
|
3
|
+
*/
|
|
4
|
+
import type { ProxyRequestOptions, ProxyResponseMetadata } from '../types/common';
|
|
5
|
+
/**
|
|
6
|
+
* Build LockLLM headers from proxy request options
|
|
7
|
+
*
|
|
8
|
+
* Default behavior (when no headers are provided):
|
|
9
|
+
* - Scan Mode: combined (check both core security and custom policies)
|
|
10
|
+
* - Scan Action: allow_with_warning (detect threats but don't block)
|
|
11
|
+
* - Policy Action: allow_with_warning (detect violations but don't block)
|
|
12
|
+
* - Abuse Action: null (abuse detection disabled, opt-in only)
|
|
13
|
+
* - Route Action: disabled (no intelligent routing)
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildLockLLMHeaders(options?: ProxyRequestOptions): Record<string, string>;
|
|
16
|
+
/**
|
|
17
|
+
* Parse proxy metadata from response headers
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseProxyMetadata(headers: Headers | Record<string, string>): ProxyResponseMetadata;
|
|
20
|
+
/**
|
|
21
|
+
* Decode base64-encoded detail field
|
|
22
|
+
*/
|
|
23
|
+
export declare function decodeDetailField(detail: string): any;
|
|
24
|
+
//# sourceMappingURL=proxy-headers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-headers.d.ts","sourceRoot":"","sources":["../../src/utils/proxy-headers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAElF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuCzF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,qBAAqB,CA8HnG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAOrD"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Proxy headers utility functions
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildLockLLMHeaders = buildLockLLMHeaders;
|
|
7
|
+
exports.parseProxyMetadata = parseProxyMetadata;
|
|
8
|
+
exports.decodeDetailField = decodeDetailField;
|
|
9
|
+
/**
|
|
10
|
+
* Build LockLLM headers from proxy request options
|
|
11
|
+
*
|
|
12
|
+
* Default behavior (when no headers are provided):
|
|
13
|
+
* - Scan Mode: combined (check both core security and custom policies)
|
|
14
|
+
* - Scan Action: allow_with_warning (detect threats but don't block)
|
|
15
|
+
* - Policy Action: allow_with_warning (detect violations but don't block)
|
|
16
|
+
* - Abuse Action: null (abuse detection disabled, opt-in only)
|
|
17
|
+
* - Route Action: disabled (no intelligent routing)
|
|
18
|
+
*/
|
|
19
|
+
function buildLockLLMHeaders(options) {
|
|
20
|
+
const headers = {};
|
|
21
|
+
// Scan mode header (controls which security checks are performed)
|
|
22
|
+
if (options?.scanMode) {
|
|
23
|
+
headers['x-lockllm-scan-mode'] = options.scanMode;
|
|
24
|
+
}
|
|
25
|
+
// Scan action header (controls blocking behavior for core injection)
|
|
26
|
+
if (options?.scanAction) {
|
|
27
|
+
headers['x-lockllm-scan-action'] = options.scanAction;
|
|
28
|
+
}
|
|
29
|
+
// Policy action header (controls blocking behavior for policy violations)
|
|
30
|
+
if (options?.policyAction) {
|
|
31
|
+
headers['x-lockllm-policy-action'] = options.policyAction;
|
|
32
|
+
}
|
|
33
|
+
// Abuse action header (opt-in, null means disabled)
|
|
34
|
+
if (options?.abuseAction !== undefined && options?.abuseAction !== null) {
|
|
35
|
+
headers['x-lockllm-abuse-action'] = options.abuseAction;
|
|
36
|
+
}
|
|
37
|
+
// Route action header (controls intelligent routing)
|
|
38
|
+
if (options?.routeAction) {
|
|
39
|
+
headers['x-lockllm-route-action'] = options.routeAction;
|
|
40
|
+
}
|
|
41
|
+
// Response caching control
|
|
42
|
+
if (options?.cacheResponse === false) {
|
|
43
|
+
headers['x-lockllm-cache-response'] = 'false';
|
|
44
|
+
}
|
|
45
|
+
// Cache TTL in seconds
|
|
46
|
+
if (options?.cacheTTL !== undefined) {
|
|
47
|
+
headers['x-lockllm-cache-ttl'] = String(options.cacheTTL);
|
|
48
|
+
}
|
|
49
|
+
return headers;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parse proxy metadata from response headers
|
|
53
|
+
*/
|
|
54
|
+
function parseProxyMetadata(headers) {
|
|
55
|
+
const getHeader = (name) => {
|
|
56
|
+
if (headers instanceof Headers) {
|
|
57
|
+
return headers.get(name);
|
|
58
|
+
}
|
|
59
|
+
return headers[name] || headers[name.toLowerCase()] || null;
|
|
60
|
+
};
|
|
61
|
+
const metadata = {
|
|
62
|
+
request_id: getHeader('x-request-id') || '',
|
|
63
|
+
scanned: getHeader('x-lockllm-scanned') === 'true',
|
|
64
|
+
safe: getHeader('x-lockllm-safe') === 'true',
|
|
65
|
+
scan_mode: getHeader('x-scan-mode') || 'combined',
|
|
66
|
+
credits_mode: getHeader('x-lockllm-credits-mode') || 'byok',
|
|
67
|
+
provider: getHeader('x-lockllm-provider') || '',
|
|
68
|
+
model: getHeader('x-lockllm-model') || undefined,
|
|
69
|
+
};
|
|
70
|
+
// Parse scan warning
|
|
71
|
+
const scanWarning = getHeader('x-lockllm-scan-warning');
|
|
72
|
+
if (scanWarning === 'true') {
|
|
73
|
+
const injectionScore = getHeader('x-lockllm-injection-score');
|
|
74
|
+
const confidence = getHeader('x-lockllm-confidence');
|
|
75
|
+
const detail = getHeader('x-lockllm-scan-detail');
|
|
76
|
+
metadata.scan_warning = {
|
|
77
|
+
injection_score: injectionScore ? parseFloat(injectionScore) : 0,
|
|
78
|
+
confidence: confidence ? parseFloat(confidence) : 0,
|
|
79
|
+
detail: detail || '',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Parse policy warnings
|
|
83
|
+
const policyWarnings = getHeader('x-lockllm-policy-warnings');
|
|
84
|
+
if (policyWarnings === 'true') {
|
|
85
|
+
const count = getHeader('x-lockllm-warning-count');
|
|
86
|
+
const confidence = getHeader('x-lockllm-policy-confidence');
|
|
87
|
+
const detail = getHeader('x-lockllm-warning-detail');
|
|
88
|
+
metadata.policy_warnings = {
|
|
89
|
+
count: count ? parseInt(count, 10) : 0,
|
|
90
|
+
confidence: confidence ? parseFloat(confidence) : 0,
|
|
91
|
+
detail: detail || '',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Parse abuse detection
|
|
95
|
+
const abuseDetected = getHeader('x-lockllm-abuse-detected');
|
|
96
|
+
if (abuseDetected === 'true') {
|
|
97
|
+
const confidence = getHeader('x-lockllm-abuse-confidence');
|
|
98
|
+
const types = getHeader('x-lockllm-abuse-types');
|
|
99
|
+
const detail = getHeader('x-lockllm-abuse-detail');
|
|
100
|
+
metadata.abuse_detected = {
|
|
101
|
+
confidence: confidence ? parseFloat(confidence) : 0,
|
|
102
|
+
types: types || '',
|
|
103
|
+
detail: detail || '',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// Parse routing metadata
|
|
107
|
+
const routeEnabled = getHeader('x-lockllm-route-enabled');
|
|
108
|
+
if (routeEnabled === 'true') {
|
|
109
|
+
const taskType = getHeader('x-lockllm-task-type');
|
|
110
|
+
const complexity = getHeader('x-lockllm-complexity');
|
|
111
|
+
const selectedModel = getHeader('x-lockllm-selected-model');
|
|
112
|
+
const routingReason = getHeader('x-lockllm-routing-reason');
|
|
113
|
+
const originalProvider = getHeader('x-lockllm-original-provider');
|
|
114
|
+
const originalModel = getHeader('x-lockllm-original-model');
|
|
115
|
+
const estimatedSavings = getHeader('x-lockllm-estimated-savings');
|
|
116
|
+
metadata.routing = {
|
|
117
|
+
enabled: true,
|
|
118
|
+
task_type: taskType || '',
|
|
119
|
+
complexity: complexity ? parseFloat(complexity) : 0,
|
|
120
|
+
selected_model: selectedModel || '',
|
|
121
|
+
routing_reason: routingReason || '',
|
|
122
|
+
original_provider: originalProvider || '',
|
|
123
|
+
original_model: originalModel || '',
|
|
124
|
+
estimated_savings: estimatedSavings ? parseFloat(estimatedSavings) : 0,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// Parse credit tracking
|
|
128
|
+
const creditsReserved = getHeader('x-lockllm-credits-reserved');
|
|
129
|
+
if (creditsReserved) {
|
|
130
|
+
metadata.credits_reserved = parseFloat(creditsReserved);
|
|
131
|
+
}
|
|
132
|
+
const routingFeeReserved = getHeader('x-lockllm-routing-fee-reserved');
|
|
133
|
+
if (routingFeeReserved) {
|
|
134
|
+
metadata.routing_fee_reserved = parseFloat(routingFeeReserved);
|
|
135
|
+
}
|
|
136
|
+
// Parse cache status
|
|
137
|
+
const cacheStatus = getHeader('x-lockllm-cache-status');
|
|
138
|
+
if (cacheStatus) {
|
|
139
|
+
metadata.cache_status = cacheStatus;
|
|
140
|
+
}
|
|
141
|
+
const cacheAge = getHeader('x-lockllm-cache-age');
|
|
142
|
+
if (cacheAge) {
|
|
143
|
+
metadata.cache_age = parseInt(cacheAge, 10);
|
|
144
|
+
}
|
|
145
|
+
const tokensSaved = getHeader('x-lockllm-tokens-saved');
|
|
146
|
+
if (tokensSaved) {
|
|
147
|
+
metadata.tokens_saved = parseInt(tokensSaved, 10);
|
|
148
|
+
}
|
|
149
|
+
const costSaved = getHeader('x-lockllm-cost-saved');
|
|
150
|
+
if (costSaved) {
|
|
151
|
+
metadata.cost_saved = parseFloat(costSaved);
|
|
152
|
+
}
|
|
153
|
+
const creditsDeducted = getHeader('x-lockllm-credits-deducted');
|
|
154
|
+
if (creditsDeducted) {
|
|
155
|
+
metadata.credits_deducted = parseFloat(creditsDeducted);
|
|
156
|
+
}
|
|
157
|
+
const balanceAfter = getHeader('x-lockllm-balance-after');
|
|
158
|
+
if (balanceAfter) {
|
|
159
|
+
metadata.balance_after = parseFloat(balanceAfter);
|
|
160
|
+
}
|
|
161
|
+
return metadata;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Decode base64-encoded detail field
|
|
165
|
+
*/
|
|
166
|
+
function decodeDetailField(detail) {
|
|
167
|
+
try {
|
|
168
|
+
const decoded = atob(detail);
|
|
169
|
+
return JSON.parse(decoded);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=proxy-headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-headers.js","sourceRoot":"","sources":["../../src/utils/proxy-headers.ts"],"names":[],"mappings":"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"}
|