@lockllm/sdk 1.0.1 → 1.2.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 +223 -5
- package/README.md +272 -40
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/errors.d.ts +56 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +132 -2
- package/dist/errors.js.map +1 -1
- package/dist/errors.mjs +127 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -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 +59 -5
- package/dist/scan.js.map +1 -1
- package/dist/scan.mjs +59 -5
- package/dist/types/common.d.ts +116 -0
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/errors.d.ts +39 -0
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/scan.d.ts +118 -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 +234 -0
- package/dist/utils/proxy-headers.js.map +1 -0
- package/dist/utils/proxy-headers.mjs +229 -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 -2
package/dist/scan.mjs
CHANGED
|
@@ -9,27 +9,81 @@ 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
|
+
// PII action: opt-in PII detection (null/undefined means disabled)
|
|
75
|
+
if (options?.piiAction !== undefined && options?.piiAction !== null) {
|
|
76
|
+
headers['x-lockllm-pii-action'] = options.piiAction;
|
|
77
|
+
}
|
|
78
|
+
// Build request body
|
|
79
|
+
const body = {
|
|
30
80
|
input: request.input,
|
|
31
|
-
|
|
32
|
-
},
|
|
81
|
+
};
|
|
82
|
+
const { data } = await this.http.post('/v1/scan', body, {
|
|
83
|
+
headers,
|
|
84
|
+
timeout: options?.timeout,
|
|
85
|
+
signal: options?.signal,
|
|
86
|
+
});
|
|
33
87
|
return data;
|
|
34
88
|
}
|
|
35
89
|
}
|
package/dist/types/common.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Common types used throughout the SDK
|
|
3
3
|
*/
|
|
4
|
+
import type { Sensitivity } from './scan';
|
|
4
5
|
export interface LockLLMConfig {
|
|
5
6
|
/** Your LockLLM API key */
|
|
6
7
|
apiKey: string;
|
|
@@ -28,4 +29,119 @@ export interface ErrorResponse {
|
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
31
|
export type Provider = 'openai' | 'anthropic' | 'gemini' | 'cohere' | 'openrouter' | 'perplexity' | 'mistral' | 'groq' | 'deepseek' | 'together' | 'xai' | 'fireworks' | 'anyscale' | 'huggingface' | 'azure' | 'bedrock' | 'vertex-ai';
|
|
32
|
+
/** Scan mode for security checks */
|
|
33
|
+
export type ScanMode = 'normal' | 'policy_only' | 'combined';
|
|
34
|
+
/** Scan action for threat detection */
|
|
35
|
+
export type ScanAction = 'block' | 'allow_with_warning';
|
|
36
|
+
/** Routing action for intelligent model selection */
|
|
37
|
+
export type RouteAction = 'disabled' | 'auto' | 'custom';
|
|
38
|
+
/** PII detection action (opt-in) */
|
|
39
|
+
export type PIIAction = 'strip' | 'block' | 'allow_with_warning';
|
|
40
|
+
/** Proxy request options with advanced headers */
|
|
41
|
+
export interface ProxyRequestOptions extends RequestOptions {
|
|
42
|
+
/** Scan mode (default: combined) - Check both core security and custom policies */
|
|
43
|
+
scanMode?: ScanMode;
|
|
44
|
+
/** Scan action for core injection (default: allow_with_warning) - Threats detected but not blocked */
|
|
45
|
+
scanAction?: ScanAction;
|
|
46
|
+
/** Policy action for custom policies (default: allow_with_warning) - Violations detected but not blocked */
|
|
47
|
+
policyAction?: ScanAction;
|
|
48
|
+
/** Abuse detection action (opt-in, default: null) - When null, abuse detection is disabled */
|
|
49
|
+
abuseAction?: ScanAction | null;
|
|
50
|
+
/** Routing action (default: disabled) - No intelligent routing unless explicitly enabled */
|
|
51
|
+
routeAction?: RouteAction;
|
|
52
|
+
/** PII detection action (opt-in, default: null) - When null, PII detection is disabled */
|
|
53
|
+
piiAction?: PIIAction | null;
|
|
54
|
+
/** Detection sensitivity level (default: medium) - Controls injection detection threshold */
|
|
55
|
+
sensitivity?: Sensitivity;
|
|
56
|
+
/** Response caching (default: enabled). Set false to disable. */
|
|
57
|
+
cacheResponse?: boolean;
|
|
58
|
+
/** Cache TTL in seconds (default: 3600) */
|
|
59
|
+
cacheTTL?: number;
|
|
60
|
+
}
|
|
61
|
+
/** Response metadata from proxy */
|
|
62
|
+
export interface ProxyResponseMetadata {
|
|
63
|
+
/** Unique request identifier */
|
|
64
|
+
request_id: string;
|
|
65
|
+
/** Whether the request was scanned */
|
|
66
|
+
scanned: boolean;
|
|
67
|
+
/** Whether the request is safe */
|
|
68
|
+
safe: boolean;
|
|
69
|
+
/** Scan mode used */
|
|
70
|
+
scan_mode: ScanMode;
|
|
71
|
+
/** Credits mode (lockllm_credits or byok) */
|
|
72
|
+
credits_mode: 'lockllm_credits' | 'byok';
|
|
73
|
+
/** Provider used */
|
|
74
|
+
provider: string;
|
|
75
|
+
/** Model used */
|
|
76
|
+
model?: string;
|
|
77
|
+
/** Detection sensitivity level used */
|
|
78
|
+
sensitivity?: string;
|
|
79
|
+
/** Safety label (0 = safe, 1 = unsafe) */
|
|
80
|
+
label?: number;
|
|
81
|
+
/** Whether the request was blocked */
|
|
82
|
+
blocked?: boolean;
|
|
83
|
+
/** Scan warning details */
|
|
84
|
+
scan_warning?: {
|
|
85
|
+
injection_score: number;
|
|
86
|
+
confidence: number;
|
|
87
|
+
detail: string;
|
|
88
|
+
};
|
|
89
|
+
/** Policy violation warnings */
|
|
90
|
+
policy_warnings?: {
|
|
91
|
+
count: number;
|
|
92
|
+
confidence: number;
|
|
93
|
+
detail: string;
|
|
94
|
+
};
|
|
95
|
+
/** Abuse detection warnings */
|
|
96
|
+
abuse_detected?: {
|
|
97
|
+
confidence: number;
|
|
98
|
+
types: string;
|
|
99
|
+
detail: string;
|
|
100
|
+
};
|
|
101
|
+
/** PII detection metadata */
|
|
102
|
+
pii_detected?: {
|
|
103
|
+
detected: boolean;
|
|
104
|
+
entity_types: string;
|
|
105
|
+
entity_count: number;
|
|
106
|
+
action: string;
|
|
107
|
+
};
|
|
108
|
+
/** Routing metadata */
|
|
109
|
+
routing?: {
|
|
110
|
+
enabled: boolean;
|
|
111
|
+
task_type: string;
|
|
112
|
+
complexity: number;
|
|
113
|
+
selected_model: string;
|
|
114
|
+
routing_reason: string;
|
|
115
|
+
original_provider: string;
|
|
116
|
+
original_model: string;
|
|
117
|
+
estimated_savings: number;
|
|
118
|
+
estimated_original_cost: number;
|
|
119
|
+
estimated_routed_cost: number;
|
|
120
|
+
estimated_input_tokens: number;
|
|
121
|
+
estimated_output_tokens: number;
|
|
122
|
+
routing_fee_reason: string;
|
|
123
|
+
};
|
|
124
|
+
/** Credits reserved for this request */
|
|
125
|
+
credits_reserved?: number;
|
|
126
|
+
/** Routing fee reserved */
|
|
127
|
+
routing_fee_reserved?: number;
|
|
128
|
+
/** Actual credits deducted (available after completion) */
|
|
129
|
+
credits_deducted?: number;
|
|
130
|
+
/** Balance after this request (available after completion) */
|
|
131
|
+
balance_after?: number;
|
|
132
|
+
/** Cache status for this response */
|
|
133
|
+
cache_status?: 'HIT' | 'MISS';
|
|
134
|
+
/** Cache age in seconds (when cache hit) */
|
|
135
|
+
cache_age?: number;
|
|
136
|
+
/** Tokens saved from cache hit */
|
|
137
|
+
tokens_saved?: number;
|
|
138
|
+
/** Cost saved from cache hit */
|
|
139
|
+
cost_saved?: number;
|
|
140
|
+
/** Decoded scan detail (from base64 header) */
|
|
141
|
+
scan_detail?: any;
|
|
142
|
+
/** Decoded policy warning detail (from base64 header) */
|
|
143
|
+
policy_detail?: any;
|
|
144
|
+
/** Decoded abuse detail (from base64 header) */
|
|
145
|
+
abuse_detail?: any;
|
|
146
|
+
}
|
|
31
147
|
//# 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,43 @@ 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
|
+
}
|
|
55
|
+
export interface PIIDetectedErrorData extends LockLLMErrorData {
|
|
56
|
+
pii_details: {
|
|
57
|
+
entity_types: string[];
|
|
58
|
+
entity_count: number;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
22
61
|
//# 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;AAED,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,WAAW,EAAE;QACX,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH"}
|
package/dist/types/scan.d.ts
CHANGED
|
@@ -1,21 +1,113 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Scan API types
|
|
3
3
|
*/
|
|
4
|
-
import type {
|
|
4
|
+
import type { PIIAction } from './common';
|
|
5
5
|
export type Sensitivity = 'low' | 'medium' | 'high';
|
|
6
|
+
/** Scan mode determines which security checks are performed */
|
|
7
|
+
export type ScanMode = 'normal' | 'policy_only' | 'combined';
|
|
8
|
+
/** Scan action determines behavior when threats are detected */
|
|
9
|
+
export type ScanAction = 'block' | 'allow_with_warning';
|
|
6
10
|
export interface ScanRequest {
|
|
7
11
|
/** The text prompt to scan for injection attacks */
|
|
8
12
|
input: string;
|
|
9
13
|
/** Detection sensitivity level (default: medium) */
|
|
10
14
|
sensitivity?: Sensitivity;
|
|
15
|
+
/** Scan mode (default: combined) - Check both core security and custom policies */
|
|
16
|
+
mode?: ScanMode;
|
|
17
|
+
/** Force chunking for large inputs */
|
|
18
|
+
chunk?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** PII detection result */
|
|
21
|
+
export interface PIIResult {
|
|
22
|
+
/** Whether PII was detected */
|
|
23
|
+
detected: boolean;
|
|
24
|
+
/** Types of PII entities found (user-friendly names) */
|
|
25
|
+
entity_types: string[];
|
|
26
|
+
/** Number of PII entities found */
|
|
27
|
+
entity_count: number;
|
|
28
|
+
/** Redacted input text (only present when piiAction is "strip") */
|
|
29
|
+
redacted_input?: string;
|
|
30
|
+
}
|
|
31
|
+
/** Scan request options with action headers */
|
|
32
|
+
export interface ScanOptions {
|
|
33
|
+
/** Scan action for core injection (default: allow_with_warning) - Threats detected but not blocked */
|
|
34
|
+
scanAction?: ScanAction;
|
|
35
|
+
/** Policy action for custom policies (default: allow_with_warning) - Violations detected but not blocked */
|
|
36
|
+
policyAction?: ScanAction;
|
|
37
|
+
/** Abuse detection action (opt-in, default: null) - When null, abuse detection is disabled */
|
|
38
|
+
abuseAction?: ScanAction | null;
|
|
39
|
+
/** PII detection action (opt-in, default: null) - When null, PII detection is disabled */
|
|
40
|
+
piiAction?: PIIAction | null;
|
|
41
|
+
/** Custom headers to include in the request */
|
|
42
|
+
headers?: Record<string, string>;
|
|
43
|
+
/** Request timeout in milliseconds */
|
|
44
|
+
timeout?: number;
|
|
45
|
+
/** Abort signal for cancelling requests */
|
|
46
|
+
signal?: AbortSignal;
|
|
47
|
+
}
|
|
48
|
+
/** Policy violation details */
|
|
49
|
+
export interface PolicyViolation {
|
|
50
|
+
/** Policy name (user-defined or built-in) */
|
|
51
|
+
policy_name: string;
|
|
52
|
+
/** Categories that were violated */
|
|
53
|
+
violated_categories: Array<{
|
|
54
|
+
/** Category name */
|
|
55
|
+
name: string;
|
|
56
|
+
}>;
|
|
57
|
+
/** Specific details about the violation */
|
|
58
|
+
violation_details?: string;
|
|
59
|
+
}
|
|
60
|
+
/** Scan warning when core injection is detected with allow_with_warning */
|
|
61
|
+
export interface ScanWarning {
|
|
62
|
+
/** Warning message */
|
|
63
|
+
message: string;
|
|
64
|
+
/** Injection score (0-100) */
|
|
65
|
+
injection_score: number;
|
|
66
|
+
/** Confidence score (0-100) */
|
|
67
|
+
confidence: number;
|
|
68
|
+
/** Safety label (0 = safe, 1 = unsafe) */
|
|
69
|
+
label: 0 | 1;
|
|
70
|
+
}
|
|
71
|
+
/** Abuse detection warning */
|
|
72
|
+
export interface AbuseWarning {
|
|
73
|
+
/** Whether abuse was detected */
|
|
74
|
+
detected: true;
|
|
75
|
+
/** Overall confidence score (0-100) */
|
|
76
|
+
confidence: number;
|
|
77
|
+
/** Types of abuse detected */
|
|
78
|
+
abuse_types: string[];
|
|
79
|
+
/** Individual abuse indicators */
|
|
80
|
+
indicators: {
|
|
81
|
+
/** Bot-generated content score (0-100) */
|
|
82
|
+
bot_score: number;
|
|
83
|
+
/** Repetition detection score (0-100) */
|
|
84
|
+
repetition_score: number;
|
|
85
|
+
/** Resource exhaustion score (0-100) */
|
|
86
|
+
resource_score: number;
|
|
87
|
+
/** Pattern analysis score (0-100) */
|
|
88
|
+
pattern_score: number;
|
|
89
|
+
};
|
|
90
|
+
/** Recommended mitigation action */
|
|
91
|
+
recommendation?: string;
|
|
11
92
|
}
|
|
12
93
|
/**
|
|
13
94
|
* Full scan response from the scan API endpoint
|
|
14
|
-
* Extends the base ScanResult with additional metadata
|
|
15
95
|
*/
|
|
16
|
-
export interface ScanResponse
|
|
96
|
+
export interface ScanResponse {
|
|
17
97
|
/** Unique request identifier */
|
|
18
98
|
request_id: string;
|
|
99
|
+
/** Whether the prompt is safe */
|
|
100
|
+
safe: boolean;
|
|
101
|
+
/** Safety label (0 = safe, 1 = unsafe) */
|
|
102
|
+
label: 0 | 1;
|
|
103
|
+
/** Detection sensitivity level used */
|
|
104
|
+
sensitivity: Sensitivity;
|
|
105
|
+
/** Core injection confidence (not present in policy_only mode) */
|
|
106
|
+
confidence?: number;
|
|
107
|
+
/** Core injection score (not present in policy_only mode) */
|
|
108
|
+
injection?: number;
|
|
109
|
+
/** Policy check confidence (present in policy_only and combined modes) */
|
|
110
|
+
policy_confidence?: number;
|
|
19
111
|
/** Usage statistics */
|
|
20
112
|
usage: {
|
|
21
113
|
/** Number of upstream inference requests */
|
|
@@ -32,5 +124,28 @@ export interface ScanResponse extends ScanResult {
|
|
|
32
124
|
/** Processing mode used */
|
|
33
125
|
mode: 'single' | 'chunked';
|
|
34
126
|
};
|
|
127
|
+
/** Policy warnings (when present in policy_only or combined modes) */
|
|
128
|
+
policy_warnings?: PolicyViolation[];
|
|
129
|
+
/** Scan warning (when core injection detected with allow_with_warning) */
|
|
130
|
+
scan_warning?: ScanWarning;
|
|
131
|
+
/** Abuse warnings (when abuse detected with allow_with_warning) */
|
|
132
|
+
abuse_warnings?: AbuseWarning;
|
|
133
|
+
/** Routing metadata (present when routing is enabled) */
|
|
134
|
+
routing?: {
|
|
135
|
+
/** Whether routing is enabled */
|
|
136
|
+
enabled: boolean;
|
|
137
|
+
/** Detected task type */
|
|
138
|
+
task_type: string;
|
|
139
|
+
/** Complexity score (0-1) */
|
|
140
|
+
complexity: number;
|
|
141
|
+
/** Model selected by router */
|
|
142
|
+
selected_model?: string;
|
|
143
|
+
/** Routing decision reasoning */
|
|
144
|
+
reasoning?: string;
|
|
145
|
+
/** Estimated cost */
|
|
146
|
+
estimated_cost?: number;
|
|
147
|
+
};
|
|
148
|
+
/** PII detection result (present when PII detection is enabled) */
|
|
149
|
+
pii_result?: PIIResult;
|
|
35
150
|
}
|
|
36
151
|
//# 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,CAiDzF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,qBAAqB,CA0LnG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAOrD"}
|