promptguard-sdk 1.2.0 → 1.5.1
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/LICENSE +21 -0
- package/README.md +226 -78
- package/dist/auto.d.ts +40 -0
- package/dist/auto.d.ts.map +1 -0
- package/dist/auto.js +118 -0
- package/dist/auto.js.map +1 -0
- package/dist/guard.d.ts +80 -0
- package/dist/guard.d.ts.map +1 -0
- package/dist/guard.js +104 -0
- package/dist/guard.js.map +1 -0
- package/dist/index.d.ts +105 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +111 -29
- package/dist/index.js.map +1 -1
- package/dist/integrations/langchain.d.ts +55 -0
- package/dist/integrations/langchain.d.ts.map +1 -0
- package/dist/integrations/langchain.js +212 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/dist/integrations/vercel-ai.d.ts +49 -0
- package/dist/integrations/vercel-ai.d.ts.map +1 -0
- package/dist/integrations/vercel-ai.js +170 -0
- package/dist/integrations/vercel-ai.js.map +1 -0
- package/dist/patches/anthropic.d.ts +13 -0
- package/dist/patches/anthropic.d.ts.map +1 -0
- package/dist/patches/anthropic.js +188 -0
- package/dist/patches/anthropic.js.map +1 -0
- package/dist/patches/bedrock.d.ts +14 -0
- package/dist/patches/bedrock.d.ts.map +1 -0
- package/dist/patches/bedrock.js +246 -0
- package/dist/patches/bedrock.js.map +1 -0
- package/dist/patches/cohere.d.ts +14 -0
- package/dist/patches/cohere.d.ts.map +1 -0
- package/dist/patches/cohere.js +183 -0
- package/dist/patches/cohere.js.map +1 -0
- package/dist/patches/google.d.ts +13 -0
- package/dist/patches/google.d.ts.map +1 -0
- package/dist/patches/google.js +163 -0
- package/dist/patches/google.js.map +1 -0
- package/dist/patches/openai.d.ts +14 -0
- package/dist/patches/openai.d.ts.map +1 -0
- package/dist/patches/openai.js +165 -0
- package/dist/patches/openai.js.map +1 -0
- package/package.json +83 -11
package/dist/guard.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Guard client — calls the PromptGuard Guard API for content scanning.
|
|
4
|
+
*
|
|
5
|
+
* Used internally by auto-instrumentation patches and framework
|
|
6
|
+
* integrations. Sends messages to POST /api/v1/guard and returns
|
|
7
|
+
* the decision (allow / block / redact).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.GuardClient = exports.PromptGuardBlockedError = exports.GuardApiError = exports.GuardDecision = void 0;
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// GuardDecision — immutable result object
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
class GuardDecision {
|
|
15
|
+
constructor(data) {
|
|
16
|
+
this.decision = data.decision ?? "allow";
|
|
17
|
+
this.eventId = data.event_id ?? "";
|
|
18
|
+
this.confidence = data.confidence ?? 0;
|
|
19
|
+
this.threatType = data.threat_type;
|
|
20
|
+
this.redactedMessages = data.redacted_messages;
|
|
21
|
+
this.threats = data.threats ?? [];
|
|
22
|
+
this.latencyMs = data.latency_ms ?? 0;
|
|
23
|
+
}
|
|
24
|
+
get blocked() {
|
|
25
|
+
return this.decision === "block";
|
|
26
|
+
}
|
|
27
|
+
get redacted() {
|
|
28
|
+
return this.decision === "redact";
|
|
29
|
+
}
|
|
30
|
+
get allowed() {
|
|
31
|
+
return this.decision === "allow";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.GuardDecision = GuardDecision;
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Errors
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
class GuardApiError extends Error {
|
|
39
|
+
constructor(message, statusCode) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.name = "GuardApiError";
|
|
42
|
+
this.statusCode = statusCode;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.GuardApiError = GuardApiError;
|
|
46
|
+
class PromptGuardBlockedError extends Error {
|
|
47
|
+
constructor(decision) {
|
|
48
|
+
const threat = decision.threatType ?? "policy_violation";
|
|
49
|
+
super(`PromptGuard blocked this request: ${threat} ` +
|
|
50
|
+
`(confidence=${decision.confidence.toFixed(2)}, event_id=${decision.eventId})`);
|
|
51
|
+
this.name = "PromptGuardBlockedError";
|
|
52
|
+
this.decision = decision;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.PromptGuardBlockedError = PromptGuardBlockedError;
|
|
56
|
+
class GuardClient {
|
|
57
|
+
constructor(config) {
|
|
58
|
+
this.apiKey = config.apiKey;
|
|
59
|
+
const base = (config.baseUrl ?? "https://api.promptguard.co/api/v1").replace(/\/$/, "");
|
|
60
|
+
this.guardUrl = `${base}/guard`;
|
|
61
|
+
this.timeout = config.timeout ?? 10000;
|
|
62
|
+
}
|
|
63
|
+
headers() {
|
|
64
|
+
return {
|
|
65
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
66
|
+
"Content-Type": "application/json",
|
|
67
|
+
"X-PromptGuard-SDK": "node-auto",
|
|
68
|
+
"X-PromptGuard-Version": "1.3.0",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Scan messages via the Guard API.
|
|
73
|
+
*
|
|
74
|
+
* Throws {@link GuardApiError} on network/API errors so the caller
|
|
75
|
+
* can decide whether to fail open or closed.
|
|
76
|
+
*/
|
|
77
|
+
async scan(messages, direction = "input", model, context) {
|
|
78
|
+
const payload = { messages, direction };
|
|
79
|
+
if (model)
|
|
80
|
+
payload.model = model;
|
|
81
|
+
if (context)
|
|
82
|
+
payload.context = context;
|
|
83
|
+
let resp;
|
|
84
|
+
try {
|
|
85
|
+
resp = await fetch(this.guardUrl, {
|
|
86
|
+
method: "POST",
|
|
87
|
+
headers: this.headers(),
|
|
88
|
+
body: JSON.stringify(payload),
|
|
89
|
+
signal: AbortSignal.timeout(this.timeout),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
throw new GuardApiError(`Guard API call failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
94
|
+
}
|
|
95
|
+
if (!resp.ok) {
|
|
96
|
+
const text = await resp.text().catch(() => "");
|
|
97
|
+
throw new GuardApiError(`Guard API returned ${resp.status}: ${text.slice(0, 200)}`, resp.status);
|
|
98
|
+
}
|
|
99
|
+
const body = (await resp.json());
|
|
100
|
+
return new GuardDecision(body);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.GuardClient = GuardClient;
|
|
104
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,24 +2,40 @@
|
|
|
2
2
|
* PromptGuard Node.js SDK
|
|
3
3
|
*
|
|
4
4
|
* Drop-in security for AI applications.
|
|
5
|
-
* Just change your base URL and add an API key.
|
|
6
5
|
*
|
|
6
|
+
* **Option 1 — Auto-instrumentation (recommended)**
|
|
7
7
|
* @example
|
|
8
|
-
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { init } from 'promptguard-sdk';
|
|
10
|
+
* init({ apiKey: 'pg_xxx' });
|
|
11
|
+
* // All LLM calls are now secured automatically.
|
|
12
|
+
* ```
|
|
9
13
|
*
|
|
14
|
+
* **Option 2 — Proxy mode**
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { PromptGuard } from 'promptguard-sdk';
|
|
10
18
|
* const pg = new PromptGuard({ apiKey: 'pg_xxx' });
|
|
19
|
+
* const response = await pg.chat.completions.create({ ... });
|
|
20
|
+
* ```
|
|
11
21
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* }
|
|
22
|
+
* **Option 3 — Framework integrations**
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { PromptGuardCallbackHandler } from 'promptguard-sdk/integrations/langchain';
|
|
26
|
+
* import { promptGuardMiddleware } from 'promptguard-sdk/integrations/vercel-ai';
|
|
27
|
+
* ```
|
|
16
28
|
*/
|
|
29
|
+
export { type InitOptions, init, shutdown } from "./auto";
|
|
30
|
+
export { GuardApiError, GuardClient, type GuardClientConfig, type GuardContext, GuardDecision, type GuardMessage, type GuardRequestBody, type GuardResponseBody, PromptGuardBlockedError, type ThreatDetail, } from "./guard";
|
|
31
|
+
export { PromptGuardCallbackHandler } from "./integrations/langchain";
|
|
32
|
+
export { promptGuardMiddleware } from "./integrations/vercel-ai";
|
|
17
33
|
export interface PromptGuardConfig {
|
|
18
34
|
apiKey: string;
|
|
19
35
|
baseUrl?: string;
|
|
20
36
|
timeout?: number;
|
|
21
|
-
|
|
22
|
-
|
|
37
|
+
maxRetries?: number;
|
|
38
|
+
retryDelay?: number;
|
|
23
39
|
}
|
|
24
40
|
export interface Message {
|
|
25
41
|
role: "system" | "user" | "assistant";
|
|
@@ -61,6 +77,47 @@ export interface RedactResult {
|
|
|
61
77
|
redacted: string;
|
|
62
78
|
piiFound: string[];
|
|
63
79
|
}
|
|
80
|
+
export interface CompletionRequest {
|
|
81
|
+
model: string;
|
|
82
|
+
prompt: string;
|
|
83
|
+
temperature?: number;
|
|
84
|
+
maxTokens?: number;
|
|
85
|
+
[key: string]: unknown;
|
|
86
|
+
}
|
|
87
|
+
export interface CompletionResponse {
|
|
88
|
+
id: string;
|
|
89
|
+
object: string;
|
|
90
|
+
created: number;
|
|
91
|
+
model: string;
|
|
92
|
+
choices: Array<{
|
|
93
|
+
text: string;
|
|
94
|
+
index: number;
|
|
95
|
+
finish_reason: string;
|
|
96
|
+
}>;
|
|
97
|
+
usage?: {
|
|
98
|
+
prompt_tokens: number;
|
|
99
|
+
completion_tokens: number;
|
|
100
|
+
total_tokens: number;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export interface EmbeddingRequest {
|
|
104
|
+
model: string;
|
|
105
|
+
input: string | string[];
|
|
106
|
+
[key: string]: unknown;
|
|
107
|
+
}
|
|
108
|
+
export interface EmbeddingResponse {
|
|
109
|
+
object: string;
|
|
110
|
+
data: Array<{
|
|
111
|
+
object: string;
|
|
112
|
+
embedding: number[];
|
|
113
|
+
index: number;
|
|
114
|
+
}>;
|
|
115
|
+
model: string;
|
|
116
|
+
usage?: {
|
|
117
|
+
prompt_tokens: number;
|
|
118
|
+
total_tokens: number;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
64
121
|
declare class ChatCompletions {
|
|
65
122
|
private client;
|
|
66
123
|
constructor(client: PromptGuard);
|
|
@@ -70,6 +127,16 @@ declare class Chat {
|
|
|
70
127
|
completions: ChatCompletions;
|
|
71
128
|
constructor(client: PromptGuard);
|
|
72
129
|
}
|
|
130
|
+
declare class Completions {
|
|
131
|
+
private client;
|
|
132
|
+
constructor(client: PromptGuard);
|
|
133
|
+
create(params: CompletionRequest): Promise<CompletionResponse>;
|
|
134
|
+
}
|
|
135
|
+
declare class Embeddings {
|
|
136
|
+
private client;
|
|
137
|
+
constructor(client: PromptGuard);
|
|
138
|
+
create(params: EmbeddingRequest): Promise<EmbeddingResponse>;
|
|
139
|
+
}
|
|
73
140
|
declare class Security {
|
|
74
141
|
private client;
|
|
75
142
|
constructor(client: PromptGuard);
|
|
@@ -126,6 +193,25 @@ export interface RedTeamSummary {
|
|
|
126
193
|
block_rate: number;
|
|
127
194
|
results: RedTeamTestResult[];
|
|
128
195
|
}
|
|
196
|
+
export interface AutonomousRedTeamRequest {
|
|
197
|
+
budget?: number;
|
|
198
|
+
target_preset?: string;
|
|
199
|
+
enabled_detectors?: string[];
|
|
200
|
+
}
|
|
201
|
+
export interface AutonomousRedTeamReport {
|
|
202
|
+
grade: string;
|
|
203
|
+
bypass_rate: number;
|
|
204
|
+
total_attempts: number;
|
|
205
|
+
bypasses_found: number;
|
|
206
|
+
bypasses: Array<Record<string, unknown>>;
|
|
207
|
+
recommendations: string[];
|
|
208
|
+
}
|
|
209
|
+
export interface IntelligenceStats {
|
|
210
|
+
total_patterns: number;
|
|
211
|
+
by_category: Record<string, number>;
|
|
212
|
+
by_severity: Record<string, number>;
|
|
213
|
+
recent_discoveries: number;
|
|
214
|
+
}
|
|
129
215
|
declare class RedTeam {
|
|
130
216
|
private client;
|
|
131
217
|
private base;
|
|
@@ -137,10 +223,21 @@ declare class RedTeam {
|
|
|
137
223
|
runTest(testName: string, targetPreset?: string): Promise<RedTeamTestResult>;
|
|
138
224
|
runAll(targetPreset?: string): Promise<RedTeamSummary>;
|
|
139
225
|
runCustom(prompt: string, targetPreset?: string): Promise<RedTeamTestResult>;
|
|
226
|
+
/**
|
|
227
|
+
* Run the autonomous red team agent.
|
|
228
|
+
*
|
|
229
|
+
* Uses LLM-powered mutation to discover novel attack vectors
|
|
230
|
+
* that bypass the current policy configuration.
|
|
231
|
+
*/
|
|
232
|
+
runAutonomous(options?: AutonomousRedTeamRequest): Promise<AutonomousRedTeamReport>;
|
|
233
|
+
/** Get statistics from the Attack Intelligence DB. */
|
|
234
|
+
intelligenceStats(): Promise<IntelligenceStats>;
|
|
140
235
|
}
|
|
141
236
|
export declare class PromptGuard {
|
|
142
237
|
private config;
|
|
143
238
|
chat: Chat;
|
|
239
|
+
completions: Completions;
|
|
240
|
+
embeddings: Embeddings;
|
|
144
241
|
security: Security;
|
|
145
242
|
scrape: Scrape;
|
|
146
243
|
agent: Agent;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,27 +3,54 @@
|
|
|
3
3
|
* PromptGuard Node.js SDK
|
|
4
4
|
*
|
|
5
5
|
* Drop-in security for AI applications.
|
|
6
|
-
* Just change your base URL and add an API key.
|
|
7
6
|
*
|
|
7
|
+
* **Option 1 — Auto-instrumentation (recommended)**
|
|
8
8
|
* @example
|
|
9
|
-
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { init } from 'promptguard-sdk';
|
|
11
|
+
* init({ apiKey: 'pg_xxx' });
|
|
12
|
+
* // All LLM calls are now secured automatically.
|
|
13
|
+
* ```
|
|
10
14
|
*
|
|
15
|
+
* **Option 2 — Proxy mode**
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { PromptGuard } from 'promptguard-sdk';
|
|
11
19
|
* const pg = new PromptGuard({ apiKey: 'pg_xxx' });
|
|
20
|
+
* const response = await pg.chat.completions.create({ ... });
|
|
21
|
+
* ```
|
|
12
22
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* }
|
|
23
|
+
* **Option 3 — Framework integrations**
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { PromptGuardCallbackHandler } from 'promptguard-sdk/integrations/langchain';
|
|
27
|
+
* import { promptGuardMiddleware } from 'promptguard-sdk/integrations/vercel-ai';
|
|
28
|
+
* ```
|
|
17
29
|
*/
|
|
18
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.PromptGuardError = exports.PromptGuard = void 0;
|
|
31
|
+
exports.PromptGuardError = exports.PromptGuard = exports.promptGuardMiddleware = exports.PromptGuardCallbackHandler = exports.PromptGuardBlockedError = exports.GuardDecision = exports.GuardClient = exports.GuardApiError = exports.shutdown = exports.init = void 0;
|
|
32
|
+
// Auto-instrumentation
|
|
33
|
+
var auto_1 = require("./auto");
|
|
34
|
+
Object.defineProperty(exports, "init", { enumerable: true, get: function () { return auto_1.init; } });
|
|
35
|
+
Object.defineProperty(exports, "shutdown", { enumerable: true, get: function () { return auto_1.shutdown; } });
|
|
36
|
+
// Guard client (standalone scanning)
|
|
37
|
+
var guard_1 = require("./guard");
|
|
38
|
+
Object.defineProperty(exports, "GuardApiError", { enumerable: true, get: function () { return guard_1.GuardApiError; } });
|
|
39
|
+
Object.defineProperty(exports, "GuardClient", { enumerable: true, get: function () { return guard_1.GuardClient; } });
|
|
40
|
+
Object.defineProperty(exports, "GuardDecision", { enumerable: true, get: function () { return guard_1.GuardDecision; } });
|
|
41
|
+
Object.defineProperty(exports, "PromptGuardBlockedError", { enumerable: true, get: function () { return guard_1.PromptGuardBlockedError; } });
|
|
42
|
+
// Framework integrations (re-exported for convenience)
|
|
43
|
+
var langchain_1 = require("./integrations/langchain");
|
|
44
|
+
Object.defineProperty(exports, "PromptGuardCallbackHandler", { enumerable: true, get: function () { return langchain_1.PromptGuardCallbackHandler; } });
|
|
45
|
+
var vercel_ai_1 = require("./integrations/vercel-ai");
|
|
46
|
+
Object.defineProperty(exports, "promptGuardMiddleware", { enumerable: true, get: function () { return vercel_ai_1.promptGuardMiddleware; } });
|
|
47
|
+
const RETRYABLE_STATUS_CODES = new Set([429, 500, 502, 503, 504]);
|
|
20
48
|
class ChatCompletions {
|
|
21
49
|
constructor(client) {
|
|
22
50
|
this.client = client;
|
|
23
51
|
}
|
|
24
52
|
async create(params) {
|
|
25
|
-
|
|
26
|
-
return response;
|
|
53
|
+
return this.client.request("POST", "/chat/completions", params);
|
|
27
54
|
}
|
|
28
55
|
}
|
|
29
56
|
class Chat {
|
|
@@ -31,6 +58,22 @@ class Chat {
|
|
|
31
58
|
this.completions = new ChatCompletions(client);
|
|
32
59
|
}
|
|
33
60
|
}
|
|
61
|
+
class Completions {
|
|
62
|
+
constructor(client) {
|
|
63
|
+
this.client = client;
|
|
64
|
+
}
|
|
65
|
+
async create(params) {
|
|
66
|
+
return this.client.request("POST", "/completions", params);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
class Embeddings {
|
|
70
|
+
constructor(client) {
|
|
71
|
+
this.client = client;
|
|
72
|
+
}
|
|
73
|
+
async create(params) {
|
|
74
|
+
return this.client.request("POST", "/embeddings", params);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
34
77
|
class Security {
|
|
35
78
|
constructor(client) {
|
|
36
79
|
this.client = client;
|
|
@@ -107,22 +150,43 @@ class RedTeam {
|
|
|
107
150
|
target_preset: targetPreset,
|
|
108
151
|
});
|
|
109
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Run the autonomous red team agent.
|
|
155
|
+
*
|
|
156
|
+
* Uses LLM-powered mutation to discover novel attack vectors
|
|
157
|
+
* that bypass the current policy configuration.
|
|
158
|
+
*/
|
|
159
|
+
async runAutonomous(options) {
|
|
160
|
+
return this.client.request("POST", `${this.base}/autonomous`, {
|
|
161
|
+
budget: options?.budget ?? 100,
|
|
162
|
+
target_preset: options?.target_preset ?? "default",
|
|
163
|
+
...(options?.enabled_detectors && { enabled_detectors: options.enabled_detectors }),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/** Get statistics from the Attack Intelligence DB. */
|
|
167
|
+
async intelligenceStats() {
|
|
168
|
+
return this.client.request("GET", `${this.base}/intelligence/stats`);
|
|
169
|
+
}
|
|
110
170
|
}
|
|
111
171
|
class PromptGuard {
|
|
112
172
|
constructor(config) {
|
|
113
|
-
const apiKey = config.apiKey
|
|
173
|
+
const apiKey = config.apiKey ?? process.env.PROMPTGUARD_API_KEY;
|
|
114
174
|
if (!apiKey) {
|
|
115
175
|
throw new Error("API key required. Pass apiKey in config or set PROMPTGUARD_API_KEY environment variable.");
|
|
116
176
|
}
|
|
117
177
|
this.config = {
|
|
118
178
|
apiKey,
|
|
119
|
-
baseUrl: config.baseUrl
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
179
|
+
baseUrl: config.baseUrl ??
|
|
180
|
+
process.env.PROMPTGUARD_BASE_URL ??
|
|
181
|
+
"https://api.promptguard.co/api/v1/proxy",
|
|
182
|
+
timeout: config.timeout ?? 30000,
|
|
183
|
+
maxRetries: config.maxRetries ?? 3,
|
|
184
|
+
retryDelay: config.retryDelay ?? 1000,
|
|
123
185
|
};
|
|
124
186
|
// OpenAI-compatible
|
|
125
187
|
this.chat = new Chat(this);
|
|
188
|
+
this.completions = new Completions(this);
|
|
189
|
+
this.embeddings = new Embeddings(this);
|
|
126
190
|
// PromptGuard-specific
|
|
127
191
|
this.security = new Security(this);
|
|
128
192
|
this.scrape = new Scrape(this);
|
|
@@ -131,22 +195,40 @@ class PromptGuard {
|
|
|
131
195
|
}
|
|
132
196
|
async request(method, path, body) {
|
|
133
197
|
const url = `${this.config.baseUrl}${path}`;
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
198
|
+
let lastError;
|
|
199
|
+
for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {
|
|
200
|
+
try {
|
|
201
|
+
const response = await fetch(url, {
|
|
202
|
+
method,
|
|
203
|
+
headers: {
|
|
204
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
205
|
+
"Content-Type": "application/json",
|
|
206
|
+
"X-PromptGuard-SDK": "node",
|
|
207
|
+
"X-PromptGuard-Version": "1.3.0",
|
|
208
|
+
},
|
|
209
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
210
|
+
signal: AbortSignal.timeout(this.config.timeout),
|
|
211
|
+
});
|
|
212
|
+
if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < this.config.maxRetries) {
|
|
213
|
+
await new Promise((r) => setTimeout(r, this.config.retryDelay * 2 ** attempt));
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (!response.ok) {
|
|
217
|
+
const errorBody = (await response.json().catch(() => ({})));
|
|
218
|
+
throw new PromptGuardError(errorBody.error?.message || "Request failed", errorBody.error?.code || "UNKNOWN", response.status);
|
|
219
|
+
}
|
|
220
|
+
return response.json();
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
if (err instanceof PromptGuardError)
|
|
224
|
+
throw err;
|
|
225
|
+
lastError = err;
|
|
226
|
+
if (attempt < this.config.maxRetries) {
|
|
227
|
+
await new Promise((r) => setTimeout(r, this.config.retryDelay * 2 ** attempt));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
148
230
|
}
|
|
149
|
-
|
|
231
|
+
throw lastError ?? new PromptGuardError("Max retries exceeded", "MAX_RETRIES", 0);
|
|
150
232
|
}
|
|
151
233
|
}
|
|
152
234
|
exports.PromptGuard = PromptGuard;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LangChain.js integration — PromptGuardCallbackHandler.
|
|
3
|
+
*
|
|
4
|
+
* Implements the LangChain BaseCallbackHandler interface to scan prompts
|
|
5
|
+
* before LLM calls and responses after, with rich context about chains,
|
|
6
|
+
* tools, and agent steps.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { PromptGuardCallbackHandler } from 'promptguard-sdk/integrations/langchain';
|
|
11
|
+
*
|
|
12
|
+
* const handler = new PromptGuardCallbackHandler({ apiKey: 'pg_xxx' });
|
|
13
|
+
*
|
|
14
|
+
* const llm = new ChatOpenAI({ callbacks: [handler] });
|
|
15
|
+
* // or
|
|
16
|
+
* await chain.invoke({ input: '...' }, { callbacks: [handler] });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import { type GuardClientConfig } from "../guard";
|
|
20
|
+
export interface PromptGuardCallbackOptions extends GuardClientConfig {
|
|
21
|
+
mode?: "enforce" | "monitor";
|
|
22
|
+
scanResponses?: boolean;
|
|
23
|
+
failOpen?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare class PromptGuardCallbackHandler {
|
|
26
|
+
readonly name = "promptguard";
|
|
27
|
+
private readonly guard;
|
|
28
|
+
private readonly mode;
|
|
29
|
+
private readonly scanResponses;
|
|
30
|
+
private readonly failOpen;
|
|
31
|
+
/** Chain context per run ID for richer threat detection. */
|
|
32
|
+
private chainContext;
|
|
33
|
+
constructor(options: PromptGuardCallbackOptions);
|
|
34
|
+
handleLLMStart(serialized: Record<string, unknown>, prompts: string[], runId: string, parentRunId?: string, _extraParams?: Record<string, unknown>, tags?: string[], metadata?: Record<string, unknown>): Promise<void>;
|
|
35
|
+
handleChatModelStart(serialized: Record<string, unknown>, messages: unknown[][], runId: string, parentRunId?: string, _extraParams?: Record<string, unknown>, tags?: string[], metadata?: Record<string, unknown>): Promise<void>;
|
|
36
|
+
handleLLMEnd(output: unknown, runId: string): Promise<void>;
|
|
37
|
+
handleLLMError(_error: Error, runId: string): void;
|
|
38
|
+
handleChainStart(serialized: Record<string, unknown>, _inputs: Record<string, unknown>, runId: string, parentRunId?: string, tags?: string[]): Promise<void>;
|
|
39
|
+
handleChainEnd(_outputs: Record<string, unknown>, runId: string): void;
|
|
40
|
+
handleChainError(_error: Error, runId: string): void;
|
|
41
|
+
handleToolStart(serialized: Record<string, unknown>, input: string, runId: string, parentRunId?: string, tags?: string[], metadata?: Record<string, unknown>): Promise<void>;
|
|
42
|
+
handleToolEnd(output: unknown, runId: string): Promise<void>;
|
|
43
|
+
handleToolError(_error: Error, runId: string): void;
|
|
44
|
+
handleRetrieverStart(..._args: unknown[]): void;
|
|
45
|
+
handleRetrieverEnd(..._args: unknown[]): void;
|
|
46
|
+
handleRetrieverError(..._args: unknown[]): void;
|
|
47
|
+
handleText(..._args: unknown[]): void;
|
|
48
|
+
private safeScan;
|
|
49
|
+
private handleDecision;
|
|
50
|
+
private buildContext;
|
|
51
|
+
private extractModel;
|
|
52
|
+
private mapRole;
|
|
53
|
+
private extractLLMResponse;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=langchain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langchain.d.ts","sourceRoot":"","sources":["../../src/integrations/langchain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAEL,KAAK,iBAAiB,EAKvB,MAAM,UAAU,CAAA;AAMjB,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACnE,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAMD,qBAAa,0BAA0B;IACrC,QAAQ,CAAC,IAAI,iBAAgB;IAE7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,4DAA4D;IAC5D,OAAO,CAAC,YAAY,CAA6C;gBAErD,OAAO,EAAE,0BAA0B;IAmBzC,cAAc,CAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAYV,oBAAoB,CACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,QAAQ,EAAE,OAAO,EAAE,EAAE,EACrB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAmBV,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjE,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM5C,gBAAgB,CACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,IAAI,CAAC;IAShB,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAItE,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9C,eAAe,CACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAoBV,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAelE,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAMnD,oBAAoB,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;IAG/C,kBAAkB,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;IAG7C,oBAAoB,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;IAG/C,UAAU,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;YAMvB,QAAQ;IActB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,kBAAkB;CAmB3B"}
|