agentid-sdk 0.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/LICENSE +21 -0
- package/README.md +51 -0
- package/dist/chunk-5VHWMLV2.mjs +232 -0
- package/dist/index.d.mts +55 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.js +1538 -0
- package/dist/index.mjs +1270 -0
- package/dist/langchain-BdIOZZVq.d.mts +128 -0
- package/dist/langchain-BdIOZZVq.d.ts +128 -0
- package/dist/langchain.d.mts +1 -0
- package/dist/langchain.d.ts +1 -0
- package/dist/langchain.js +256 -0
- package/dist/langchain.mjs +6 -0
- package/package.json +54 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AgentID
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# 🛡️ AgentID: Enterprise AI Governance & PII Shield
|
|
2
|
+
|
|
3
|
+
AgentID je inteligentní brána (gateway) pro vaše LLM aplikace. Monitoruje náklady, filtruje PII (osobní údaje) v reálném čase a zajišťuje soulad s GDPR.
|
|
4
|
+
|
|
5
|
+
## 🚀 Rychlý start (60 sekund)
|
|
6
|
+
|
|
7
|
+
### 1. Instalace
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Pro Python projekty
|
|
11
|
+
pip install agentid-sdk
|
|
12
|
+
|
|
13
|
+
# Pro JavaScript/TypeScript projekty
|
|
14
|
+
npm install agentid-sdk
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 2. Integrace (Python)
|
|
18
|
+
|
|
19
|
+
Stačí zabalit vašeho stávajícího OpenAI klienta.
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
from openai import OpenAI
|
|
23
|
+
from agentid import AgentID
|
|
24
|
+
|
|
25
|
+
client = OpenAI(api_key="your_openai_key")
|
|
26
|
+
agent = AgentID(api_key="ag_prod_...")
|
|
27
|
+
|
|
28
|
+
# Automaticky filtruje PII a loguje metriky
|
|
29
|
+
response = agent.wrap_openai(client, system_id="sys_...").chat.completions.create(
|
|
30
|
+
model="gpt-4",
|
|
31
|
+
messages=[{"role": "user", "content": "Můj email je jan.novak@firma.cz"}]
|
|
32
|
+
)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 3. Integrace (Node.js)
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { AgentID } from "agentid-sdk";
|
|
39
|
+
import OpenAI from "openai";
|
|
40
|
+
|
|
41
|
+
const openai = new OpenAI();
|
|
42
|
+
const agent = new AgentID({ apiKey: "ag_prod_..." });
|
|
43
|
+
|
|
44
|
+
const proxiedOpenAI = agent.wrapOpenAI(openai, { system_id: "sys_..." });
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 🔒 Klíčové vlastnosti
|
|
48
|
+
|
|
49
|
+
- PII Scrubbing: Automatická redakce e-mailů, rodných čísel a hesel před odesláním do cloudu.
|
|
50
|
+
- Crypto-Shredding: Možnost nenávratně smazat citlivá data z logů na žádost uživatele (GDPR).
|
|
51
|
+
- Fail-Safe architektura: Inteligentní přepínání mezi bezpečností a dostupností (Fail-Open/Closed).
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
// src/langchain.ts
|
|
2
|
+
function safeString(val) {
|
|
3
|
+
return typeof val === "string" ? val : "";
|
|
4
|
+
}
|
|
5
|
+
function extractPromptFromPrompts(prompts) {
|
|
6
|
+
if (Array.isArray(prompts) && prompts.length > 0) {
|
|
7
|
+
return safeString(prompts[prompts.length - 1]);
|
|
8
|
+
}
|
|
9
|
+
return "";
|
|
10
|
+
}
|
|
11
|
+
function extractPromptFromMessages(messages) {
|
|
12
|
+
const flat = [];
|
|
13
|
+
if (Array.isArray(messages)) {
|
|
14
|
+
for (const item of messages) {
|
|
15
|
+
if (Array.isArray(item)) {
|
|
16
|
+
flat.push(...item);
|
|
17
|
+
} else {
|
|
18
|
+
flat.push(item);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
let last = null;
|
|
23
|
+
for (const msg of flat) {
|
|
24
|
+
const typed = msg;
|
|
25
|
+
const role = typed?.role ?? typed?.type;
|
|
26
|
+
if (role === "user" || role === "human") {
|
|
27
|
+
last = typed;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (!last || typeof last !== "object") {
|
|
31
|
+
return "";
|
|
32
|
+
}
|
|
33
|
+
const typedLast = last;
|
|
34
|
+
return safeString(typedLast.content ?? typedLast.text);
|
|
35
|
+
}
|
|
36
|
+
function setPromptInPrompts(prompts, sanitizedInput) {
|
|
37
|
+
if (!Array.isArray(prompts) || prompts.length === 0) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
prompts[prompts.length - 1] = sanitizedInput;
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
function setPromptInMessages(messages, sanitizedInput) {
|
|
44
|
+
if (!Array.isArray(messages)) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
const flat = [];
|
|
48
|
+
for (const item of messages) {
|
|
49
|
+
if (Array.isArray(item)) {
|
|
50
|
+
flat.push(...item);
|
|
51
|
+
} else {
|
|
52
|
+
flat.push(item);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
for (let i = flat.length - 1; i >= 0; i -= 1) {
|
|
56
|
+
const candidate = flat[i];
|
|
57
|
+
if (!candidate || typeof candidate !== "object") {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const typed = candidate;
|
|
61
|
+
const role = typed.role ?? typed.type;
|
|
62
|
+
if (role !== "user" && role !== "human") {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if ("content" in typed) {
|
|
66
|
+
typed.content = sanitizedInput;
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
if ("text" in typed) {
|
|
70
|
+
typed.text = sanitizedInput;
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
typed.content = sanitizedInput;
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
function extractModel(serialized, kwargs) {
|
|
79
|
+
const kw = (kwargs && typeof kwargs === "object" ? kwargs : null) ?? null;
|
|
80
|
+
const model = kw?.model ?? kw?.model_name ?? kw?.modelName;
|
|
81
|
+
if (typeof model === "string" && model) return model;
|
|
82
|
+
const ser = (serialized && typeof serialized === "object" ? serialized : null) ?? null;
|
|
83
|
+
const name = ser?.name ?? ser?.id;
|
|
84
|
+
if (typeof name === "string" && name) return name;
|
|
85
|
+
return void 0;
|
|
86
|
+
}
|
|
87
|
+
function extractOutputText(output) {
|
|
88
|
+
const gens = output?.generations;
|
|
89
|
+
const first = gens?.[0]?.[0];
|
|
90
|
+
const text = first?.text ?? first?.message?.content;
|
|
91
|
+
return typeof text === "string" ? text : "";
|
|
92
|
+
}
|
|
93
|
+
function extractTokenUsage(output) {
|
|
94
|
+
const llmOutput = output?.llmOutput ?? output?.llm_output;
|
|
95
|
+
const usage = llmOutput?.tokenUsage ?? llmOutput?.token_usage ?? llmOutput?.usage ?? void 0;
|
|
96
|
+
return usage && typeof usage === "object" ? usage : void 0;
|
|
97
|
+
}
|
|
98
|
+
function readBooleanField(value) {
|
|
99
|
+
return typeof value === "boolean" ? value : null;
|
|
100
|
+
}
|
|
101
|
+
function extractStreamFlag(serialized, extraParams) {
|
|
102
|
+
const extras = extraParams && typeof extraParams === "object" ? extraParams : null;
|
|
103
|
+
const direct = readBooleanField(extras?.stream) ?? readBooleanField(extras?.streaming);
|
|
104
|
+
if (direct !== null) {
|
|
105
|
+
return direct;
|
|
106
|
+
}
|
|
107
|
+
const invocation = extras?.invocation_params && typeof extras.invocation_params === "object" ? extras.invocation_params : null;
|
|
108
|
+
const invocationStream = readBooleanField(invocation?.stream) ?? readBooleanField(invocation?.streaming);
|
|
109
|
+
if (invocationStream !== null) {
|
|
110
|
+
return invocationStream;
|
|
111
|
+
}
|
|
112
|
+
const serializedRecord = serialized && typeof serialized === "object" ? serialized : null;
|
|
113
|
+
const kwargs = serializedRecord?.kwargs && typeof serializedRecord.kwargs === "object" ? serializedRecord.kwargs : null;
|
|
114
|
+
return readBooleanField(kwargs?.stream) ?? readBooleanField(kwargs?.streaming) ?? false;
|
|
115
|
+
}
|
|
116
|
+
var AgentIDCallbackHandler = class {
|
|
117
|
+
constructor(agent, options) {
|
|
118
|
+
this.runs = /* @__PURE__ */ new Map();
|
|
119
|
+
this.agent = agent;
|
|
120
|
+
this.systemId = options.system_id;
|
|
121
|
+
this.apiKeyOverride = options.apiKey?.trim() || options.api_key?.trim() || void 0;
|
|
122
|
+
}
|
|
123
|
+
get requestOptions() {
|
|
124
|
+
return this.apiKeyOverride ? { apiKey: this.apiKeyOverride } : void 0;
|
|
125
|
+
}
|
|
126
|
+
async preflight(input, stream) {
|
|
127
|
+
await this.agent.scanPromptInjection(input, this.requestOptions);
|
|
128
|
+
const prepared = await this.agent.prepareInputForDispatch({
|
|
129
|
+
input,
|
|
130
|
+
systemId: this.systemId,
|
|
131
|
+
stream,
|
|
132
|
+
skipInjectionScan: true
|
|
133
|
+
}, this.requestOptions);
|
|
134
|
+
return prepared.sanitizedInput;
|
|
135
|
+
}
|
|
136
|
+
async handleLLMStart(serialized, prompts, runId, _parentRunId, extraParams) {
|
|
137
|
+
const input = extractPromptFromPrompts(prompts);
|
|
138
|
+
const id = String(runId ?? "");
|
|
139
|
+
if (!input) {
|
|
140
|
+
throw new Error("AgentID: No prompt found. Security guard requires string input.");
|
|
141
|
+
}
|
|
142
|
+
const stream = extractStreamFlag(serialized, extraParams);
|
|
143
|
+
const sanitizedInput = await this.preflight(input, stream);
|
|
144
|
+
if (sanitizedInput !== input) {
|
|
145
|
+
const mutated = setPromptInPrompts(prompts, sanitizedInput);
|
|
146
|
+
if (!mutated) {
|
|
147
|
+
throw new Error(
|
|
148
|
+
"AgentID: Strict PII mode requires mutable LangChain prompt payload."
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const verdict = await this.agent.guard({
|
|
153
|
+
input: sanitizedInput,
|
|
154
|
+
system_id: this.systemId
|
|
155
|
+
}, this.requestOptions);
|
|
156
|
+
if (!verdict.allowed) {
|
|
157
|
+
throw new Error(`AgentID: Security Blocked (${verdict.reason ?? "guard_denied"})`);
|
|
158
|
+
}
|
|
159
|
+
this.runs.set(id, {
|
|
160
|
+
input: sanitizedInput,
|
|
161
|
+
startedAtMs: Date.now(),
|
|
162
|
+
model: extractModel(serialized, extraParams)
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
async handleChatModelStart(serialized, messages, runId, _parentRunId, extraParams) {
|
|
166
|
+
const input = extractPromptFromMessages(messages);
|
|
167
|
+
const id = String(runId ?? "");
|
|
168
|
+
if (!input) {
|
|
169
|
+
throw new Error("AgentID: No user message found. Security guard requires string input.");
|
|
170
|
+
}
|
|
171
|
+
const stream = extractStreamFlag(serialized, extraParams);
|
|
172
|
+
const sanitizedInput = await this.preflight(input, stream);
|
|
173
|
+
if (sanitizedInput !== input) {
|
|
174
|
+
const mutated = setPromptInMessages(messages, sanitizedInput);
|
|
175
|
+
if (!mutated) {
|
|
176
|
+
throw new Error(
|
|
177
|
+
"AgentID: Strict PII mode requires mutable LangChain message payload."
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const verdict = await this.agent.guard({
|
|
182
|
+
input: sanitizedInput,
|
|
183
|
+
system_id: this.systemId
|
|
184
|
+
}, this.requestOptions);
|
|
185
|
+
if (!verdict.allowed) {
|
|
186
|
+
throw new Error(`AgentID: Security Blocked (${verdict.reason ?? "guard_denied"})`);
|
|
187
|
+
}
|
|
188
|
+
this.runs.set(id, {
|
|
189
|
+
input: sanitizedInput,
|
|
190
|
+
startedAtMs: Date.now(),
|
|
191
|
+
model: extractModel(serialized, extraParams)
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
async handleLLMEnd(output, runId) {
|
|
195
|
+
const id = String(runId ?? "");
|
|
196
|
+
const state = this.runs.get(id);
|
|
197
|
+
if (!state) return;
|
|
198
|
+
this.runs.delete(id);
|
|
199
|
+
const latency = Date.now() - state.startedAtMs;
|
|
200
|
+
const outText = extractOutputText(output);
|
|
201
|
+
const usage = extractTokenUsage(output);
|
|
202
|
+
this.agent.log({
|
|
203
|
+
system_id: this.systemId,
|
|
204
|
+
input: state.input,
|
|
205
|
+
output: outText,
|
|
206
|
+
model: state.model ?? "unknown",
|
|
207
|
+
usage,
|
|
208
|
+
latency
|
|
209
|
+
}, this.requestOptions);
|
|
210
|
+
}
|
|
211
|
+
async handleLLMError(err, runId) {
|
|
212
|
+
const id = String(runId ?? "");
|
|
213
|
+
const state = this.runs.get(id);
|
|
214
|
+
if (state) this.runs.delete(id);
|
|
215
|
+
const message = err && typeof err === "object" && "message" in err ? String(err.message) : String(err ?? "");
|
|
216
|
+
this.agent.log({
|
|
217
|
+
system_id: this.systemId,
|
|
218
|
+
input: state?.input ?? "",
|
|
219
|
+
output: "",
|
|
220
|
+
model: state?.model ?? "unknown",
|
|
221
|
+
event_type: "error",
|
|
222
|
+
severity: "error",
|
|
223
|
+
metadata: {
|
|
224
|
+
error_message: message
|
|
225
|
+
}
|
|
226
|
+
}, this.requestOptions);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
export {
|
|
231
|
+
AgentIDCallbackHandler
|
|
232
|
+
};
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export { A as AgentID, a as AgentIDCallbackHandler, G as GuardParams, b as GuardResponse, L as LogParams, P as PreparedInput, R as RequestOptions } from './langchain-BdIOZZVq.mjs';
|
|
2
|
+
|
|
3
|
+
type PIIMapping = Record<string, string>;
|
|
4
|
+
declare class PIIManager {
|
|
5
|
+
/**
|
|
6
|
+
* Reversible local-first masking using <TYPE_INDEX> placeholders.
|
|
7
|
+
*
|
|
8
|
+
* Zero-dep (regex-based). Designed for "good enough" privacy first-pass.
|
|
9
|
+
*/
|
|
10
|
+
anonymize(text: string): {
|
|
11
|
+
maskedText: string;
|
|
12
|
+
mapping: PIIMapping;
|
|
13
|
+
};
|
|
14
|
+
deanonymize(text: string, mapping: PIIMapping): string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
type TokenUsage = Record<string, number>;
|
|
18
|
+
interface LLMAdapter {
|
|
19
|
+
extractInput(req: unknown): string | null;
|
|
20
|
+
getModelName(req: unknown, res?: unknown): string;
|
|
21
|
+
extractOutput(res: unknown): string;
|
|
22
|
+
getTokenUsage(res: unknown): TokenUsage | undefined;
|
|
23
|
+
isStream(req: unknown): boolean;
|
|
24
|
+
}
|
|
25
|
+
declare class OpenAIAdapter implements LLMAdapter {
|
|
26
|
+
extractInput(req: any): string | null;
|
|
27
|
+
getModelName(req: any, res?: any): string;
|
|
28
|
+
extractOutput(res: any): string;
|
|
29
|
+
getTokenUsage(res: any): TokenUsage | undefined;
|
|
30
|
+
isStream(req: any): boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type InjectionScanParams = {
|
|
34
|
+
prompt: string;
|
|
35
|
+
apiKey: string;
|
|
36
|
+
baseUrl: string;
|
|
37
|
+
aiScanEnabled?: boolean;
|
|
38
|
+
storePii?: boolean;
|
|
39
|
+
piiManager?: PIIManager;
|
|
40
|
+
source?: string;
|
|
41
|
+
};
|
|
42
|
+
declare function scanWithRegex(prompt: string): string | null;
|
|
43
|
+
declare class InjectionScanner {
|
|
44
|
+
static getInstance(): InjectionScanner;
|
|
45
|
+
static scan(prompt: string, apiKey: string, baseUrl: string, options?: {
|
|
46
|
+
aiScanEnabled?: boolean;
|
|
47
|
+
storePii?: boolean;
|
|
48
|
+
piiManager?: PIIManager;
|
|
49
|
+
source?: string;
|
|
50
|
+
}): Promise<void>;
|
|
51
|
+
scan(params: InjectionScanParams): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
declare function getInjectionScanner(): InjectionScanner;
|
|
54
|
+
|
|
55
|
+
export { type InjectionScanParams, InjectionScanner, type LLMAdapter, OpenAIAdapter, PIIManager, type PIIMapping, type TokenUsage, getInjectionScanner, scanWithRegex };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export { A as AgentID, a as AgentIDCallbackHandler, G as GuardParams, b as GuardResponse, L as LogParams, P as PreparedInput, R as RequestOptions } from './langchain-BdIOZZVq.js';
|
|
2
|
+
|
|
3
|
+
type PIIMapping = Record<string, string>;
|
|
4
|
+
declare class PIIManager {
|
|
5
|
+
/**
|
|
6
|
+
* Reversible local-first masking using <TYPE_INDEX> placeholders.
|
|
7
|
+
*
|
|
8
|
+
* Zero-dep (regex-based). Designed for "good enough" privacy first-pass.
|
|
9
|
+
*/
|
|
10
|
+
anonymize(text: string): {
|
|
11
|
+
maskedText: string;
|
|
12
|
+
mapping: PIIMapping;
|
|
13
|
+
};
|
|
14
|
+
deanonymize(text: string, mapping: PIIMapping): string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
type TokenUsage = Record<string, number>;
|
|
18
|
+
interface LLMAdapter {
|
|
19
|
+
extractInput(req: unknown): string | null;
|
|
20
|
+
getModelName(req: unknown, res?: unknown): string;
|
|
21
|
+
extractOutput(res: unknown): string;
|
|
22
|
+
getTokenUsage(res: unknown): TokenUsage | undefined;
|
|
23
|
+
isStream(req: unknown): boolean;
|
|
24
|
+
}
|
|
25
|
+
declare class OpenAIAdapter implements LLMAdapter {
|
|
26
|
+
extractInput(req: any): string | null;
|
|
27
|
+
getModelName(req: any, res?: any): string;
|
|
28
|
+
extractOutput(res: any): string;
|
|
29
|
+
getTokenUsage(res: any): TokenUsage | undefined;
|
|
30
|
+
isStream(req: any): boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type InjectionScanParams = {
|
|
34
|
+
prompt: string;
|
|
35
|
+
apiKey: string;
|
|
36
|
+
baseUrl: string;
|
|
37
|
+
aiScanEnabled?: boolean;
|
|
38
|
+
storePii?: boolean;
|
|
39
|
+
piiManager?: PIIManager;
|
|
40
|
+
source?: string;
|
|
41
|
+
};
|
|
42
|
+
declare function scanWithRegex(prompt: string): string | null;
|
|
43
|
+
declare class InjectionScanner {
|
|
44
|
+
static getInstance(): InjectionScanner;
|
|
45
|
+
static scan(prompt: string, apiKey: string, baseUrl: string, options?: {
|
|
46
|
+
aiScanEnabled?: boolean;
|
|
47
|
+
storePii?: boolean;
|
|
48
|
+
piiManager?: PIIManager;
|
|
49
|
+
source?: string;
|
|
50
|
+
}): Promise<void>;
|
|
51
|
+
scan(params: InjectionScanParams): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
declare function getInjectionScanner(): InjectionScanner;
|
|
54
|
+
|
|
55
|
+
export { type InjectionScanParams, InjectionScanner, type LLMAdapter, OpenAIAdapter, PIIManager, type PIIMapping, type TokenUsage, getInjectionScanner, scanWithRegex };
|