@averta-security/sdk-core 0.1.0-beta.0 → 0.1.0-beta.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/README.md +3 -4
- package/dist/decision-client.d.ts +2 -2
- package/dist/decision-client.js +22 -4
- package/dist/env.d.ts +2 -0
- package/dist/env.js +14 -0
- package/dist/guard-flow.d.ts +3 -1
- package/dist/guard-flow.js +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/types.d.ts +11 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -40,8 +40,7 @@ The public surface includes:
|
|
|
40
40
|
import { AvertaDecisionClient } from "@averta-security/sdk-core";
|
|
41
41
|
|
|
42
42
|
const client = new AvertaDecisionClient({
|
|
43
|
-
|
|
44
|
-
sdk: {
|
|
43
|
+
clientMetadata: {
|
|
45
44
|
name: "custom-adapter",
|
|
46
45
|
version: "0.1.0",
|
|
47
46
|
},
|
|
@@ -50,11 +49,11 @@ const client = new AvertaDecisionClient({
|
|
|
50
49
|
|
|
51
50
|
Options:
|
|
52
51
|
|
|
53
|
-
- `avertaApiKey`:
|
|
52
|
+
- `avertaApiKey`: optional Averta API key. Defaults to `process.env.AVERTA_API_KEY`.
|
|
54
53
|
- `avertaBaseUrl`: optional Averta API base URL. Defaults to `https://api.averta.io`.
|
|
55
54
|
- `decisionTimeoutMs`: optional decision request timeout in milliseconds. Defaults to `30000`. Set to `0` to disable the SDK-managed timeout.
|
|
56
55
|
- `fetch`: optional custom `fetch` implementation.
|
|
57
|
-
- `
|
|
56
|
+
- `clientMetadata`: adapter name and version metadata. `sdk-core` sends this over the wire as `client: { type: "sdk", ...clientMetadata }`.
|
|
58
57
|
|
|
59
58
|
## Errors
|
|
60
59
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { DecisionClientOptions, DecisionPreflightInput, OutputDecisionInput, DecisionResponse, ToolCallDecisionInput, ToolResultDecisionInput } from "./types.ts";
|
|
2
2
|
export declare class AvertaDecisionClient {
|
|
3
3
|
private readonly avertaBaseUrl;
|
|
4
|
+
private readonly clientMetadata;
|
|
4
5
|
private readonly decisionTimeoutMs;
|
|
5
6
|
private readonly fetchImpl;
|
|
6
|
-
private readonly sdk;
|
|
7
7
|
constructor(options: DecisionClientOptions);
|
|
8
8
|
private readonly avertaApiKey;
|
|
9
|
-
preflight(input:
|
|
9
|
+
preflight(input: DecisionPreflightInput): Promise<DecisionResponse>;
|
|
10
10
|
checkToolCall(input: ToolCallDecisionInput): Promise<DecisionResponse>;
|
|
11
11
|
checkToolResult(input: ToolResultDecisionInput): Promise<DecisionResponse>;
|
|
12
12
|
checkOutput(input: OutputDecisionInput): Promise<DecisionResponse>;
|
package/dist/decision-client.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AvertaSdkError } from "./errors.js";
|
|
2
|
+
import { resolveAvertaApiKey } from "./env.js";
|
|
2
3
|
import { ensureRequestContext } from "./ids.js";
|
|
3
4
|
import { isObject } from "./values.js";
|
|
4
5
|
const DEFAULT_AVERTA_BASE_URL = "https://api.averta.io";
|
|
@@ -155,6 +156,18 @@ function toToolsPayload(tools) {
|
|
|
155
156
|
type: tool.type,
|
|
156
157
|
}));
|
|
157
158
|
}
|
|
159
|
+
function toMediaPayload(media) {
|
|
160
|
+
if (!media) {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
return media.map((item) => ({
|
|
164
|
+
data_base64: item.dataBase64,
|
|
165
|
+
...(item.filename ? { filename: item.filename } : {}),
|
|
166
|
+
...(item.id ? { id: item.id } : {}),
|
|
167
|
+
kind: item.kind,
|
|
168
|
+
mime_type: item.mimeType,
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
158
171
|
function toToolCallPayload(toolCall) {
|
|
159
172
|
return {
|
|
160
173
|
...(toolCall.arguments && toolCall.arguments.value !== undefined
|
|
@@ -204,6 +217,7 @@ function toToolCallContextPayload(context) {
|
|
|
204
217
|
function toCheckpointPayload(input) {
|
|
205
218
|
if (input.checkpointType === "request") {
|
|
206
219
|
return {
|
|
220
|
+
...(input.media ? { media: toMediaPayload(input.media) } : {}),
|
|
207
221
|
payload: input.payload,
|
|
208
222
|
...(input.tools ? { tools: toToolsPayload(input.tools) } : {}),
|
|
209
223
|
};
|
|
@@ -299,20 +313,21 @@ function createDecisionAbortState(input) {
|
|
|
299
313
|
}
|
|
300
314
|
export class AvertaDecisionClient {
|
|
301
315
|
avertaBaseUrl;
|
|
316
|
+
clientMetadata;
|
|
302
317
|
decisionTimeoutMs;
|
|
303
318
|
fetchImpl;
|
|
304
|
-
sdk;
|
|
305
319
|
constructor(options) {
|
|
306
320
|
this.avertaBaseUrl = options.avertaBaseUrl ?? DEFAULT_AVERTA_BASE_URL;
|
|
321
|
+
this.clientMetadata = options.clientMetadata;
|
|
307
322
|
this.decisionTimeoutMs = normalizeDecisionTimeoutMs(options.decisionTimeoutMs);
|
|
308
323
|
this.fetchImpl = options.fetch ?? fetch;
|
|
309
|
-
this.
|
|
310
|
-
this.avertaApiKey = options.avertaApiKey;
|
|
324
|
+
this.avertaApiKey = resolveAvertaApiKey(options.avertaApiKey);
|
|
311
325
|
}
|
|
312
326
|
avertaApiKey;
|
|
313
327
|
async preflight(input) {
|
|
314
328
|
const response = await this.sendDecisionRequest({
|
|
315
329
|
checkpointType: "request",
|
|
330
|
+
...(input.media ? { media: input.media } : {}),
|
|
316
331
|
provider: input.provider,
|
|
317
332
|
payload: input.payload,
|
|
318
333
|
...(input.tools ? { tools: input.tools } : {}),
|
|
@@ -416,7 +431,10 @@ export class AvertaDecisionClient {
|
|
|
416
431
|
...(abortState.signal ? { signal: abortState.signal } : {}),
|
|
417
432
|
body: JSON.stringify({
|
|
418
433
|
checkpoint_type: input.checkpointType,
|
|
419
|
-
|
|
434
|
+
client: {
|
|
435
|
+
type: "sdk",
|
|
436
|
+
...this.clientMetadata,
|
|
437
|
+
},
|
|
420
438
|
provider: toProviderPayload(input.provider),
|
|
421
439
|
...toCheckpointPayload(input),
|
|
422
440
|
request_context: toRequestContextPayload(ensureRequestContext(input.requestContext)),
|
package/dist/env.d.ts
ADDED
package/dist/env.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AvertaSdkError } from "./errors.js";
|
|
2
|
+
export function readAvertaApiKeyFromEnv() {
|
|
3
|
+
const value = globalThis.process?.env?.AVERTA_API_KEY;
|
|
4
|
+
const trimmed = typeof value === "string" ? value.trim() : "";
|
|
5
|
+
return trimmed || undefined;
|
|
6
|
+
}
|
|
7
|
+
export function resolveAvertaApiKey(avertaApiKey) {
|
|
8
|
+
const explicit = typeof avertaApiKey === "string" ? avertaApiKey.trim() : "";
|
|
9
|
+
const resolved = explicit || readAvertaApiKeyFromEnv();
|
|
10
|
+
if (!resolved) {
|
|
11
|
+
throw new AvertaSdkError("Averta API key is required. Pass avertaApiKey or set AVERTA_API_KEY.", "missing_averta_api_key");
|
|
12
|
+
}
|
|
13
|
+
return resolved;
|
|
14
|
+
}
|
package/dist/guard-flow.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { AvertaSdkError } from "./errors.ts";
|
|
2
|
-
import type { AvertaProviderMetadata, AvertaRequestContext, DecisionPayload, DecisionResponse, NormalizedToolDefinition, OutputDecisionInput, ToolCallContext, ToolCallDecisionInput, ToolCallDecisionCandidate, ToolResultDecisionInput } from "./types.ts";
|
|
2
|
+
import type { AvertaProviderMetadata, AvertaRequestContext, DecisionMediaItem, DecisionPayload, DecisionResponse, NormalizedToolDefinition, OutputDecisionInput, ToolCallContext, ToolCallDecisionInput, ToolCallDecisionCandidate, ToolResultDecisionInput } from "./types.ts";
|
|
3
3
|
type DecisionClientWithPreflight = {
|
|
4
4
|
preflight(input: {
|
|
5
|
+
media?: DecisionMediaItem[];
|
|
5
6
|
provider: AvertaProviderMetadata;
|
|
6
7
|
payload: DecisionPayload;
|
|
7
8
|
requestContext?: AvertaRequestContext;
|
|
@@ -46,6 +47,7 @@ export declare function prepareGuardedRequest<TTool>(input: {
|
|
|
46
47
|
decisionClient: DecisionClientWithPreflight & DecisionClientWithToolResultDecision;
|
|
47
48
|
filterTools: (tools: readonly TTool[] | undefined, blockedTools: readonly string[] | undefined) => TTool[] | undefined;
|
|
48
49
|
getPreflightInput: () => {
|
|
50
|
+
media?: DecisionMediaItem[];
|
|
49
51
|
payload: DecisionPayload;
|
|
50
52
|
tools?: NormalizedToolDefinition[];
|
|
51
53
|
};
|
package/dist/guard-flow.js
CHANGED
|
@@ -91,6 +91,7 @@ export async function prepareGuardedRequest(input) {
|
|
|
91
91
|
else {
|
|
92
92
|
const preflightInput = input.getPreflightInput();
|
|
93
93
|
const decision = await input.decisionClient.preflight({
|
|
94
|
+
media: preflightInput.media,
|
|
94
95
|
provider: input.provider,
|
|
95
96
|
payload: preflightInput.payload,
|
|
96
97
|
requestContext: input.requestContext,
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { AvertaDecisionClient } from "./decision-client.ts";
|
|
2
|
+
export { readAvertaApiKeyFromEnv, resolveAvertaApiKey } from "./env.ts";
|
|
2
3
|
export { AvertaSdkError } from "./errors.ts";
|
|
3
4
|
export { createRequestId, createTraceId, ensureRequestContext } from "./ids.ts";
|
|
4
5
|
export { filterToolsByIdentity } from "./filter-tools.ts";
|
|
@@ -8,4 +9,4 @@ export { buildForwardedToolInput, omitProviderFields } from "./provider-input.ts
|
|
|
8
9
|
export { StreamingOutputGuard } from "./streaming-output-guard.ts";
|
|
9
10
|
export { isObject, readTrimmedString } from "./values.ts";
|
|
10
11
|
export type { AvertaSdkErrorOptions, } from "./errors.ts";
|
|
11
|
-
export type { AvertaProviderMetadata, AvertaRequestContext,
|
|
12
|
+
export type { AvertaClientMetadata, AvertaProviderMetadata, AvertaRequestContext, DecisionMediaItem, DecisionClientOptions, DecisionPayload, DecisionPreflightInput, DecisionReason, DecisionResponse, DecisionRewriteAction, NormalizedToolDefinition, OutputDecisionInput, PreparedAvertaRequestContext, ToolCallContext, ToolCallContextMessage, ToolCallDecisionCandidate, ToolCallDecisionInput, ToolResultDecisionInput, } from "./types.ts";
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { AvertaDecisionClient } from "./decision-client.js";
|
|
2
|
+
export { readAvertaApiKeyFromEnv, resolveAvertaApiKey } from "./env.js";
|
|
2
3
|
export { AvertaSdkError } from "./errors.js";
|
|
3
4
|
export { createRequestId, createTraceId, ensureRequestContext } from "./ids.js";
|
|
4
5
|
export { filterToolsByIdentity } from "./filter-tools.js";
|
package/dist/types.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export type PreparedAvertaRequestContext = AvertaRequestContext & {
|
|
|
7
7
|
requestId: string;
|
|
8
8
|
traceId: string;
|
|
9
9
|
};
|
|
10
|
-
export type
|
|
10
|
+
export type AvertaClientMetadata = {
|
|
11
11
|
name: string;
|
|
12
12
|
version: string;
|
|
13
13
|
};
|
|
@@ -26,8 +26,15 @@ export type NormalizedToolDefinition = {
|
|
|
26
26
|
export type DecisionPayload = {
|
|
27
27
|
text: string;
|
|
28
28
|
};
|
|
29
|
+
export type DecisionMediaItem = {
|
|
30
|
+
dataBase64: string;
|
|
31
|
+
filename?: string;
|
|
32
|
+
id?: string;
|
|
33
|
+
kind: "image";
|
|
34
|
+
mimeType: "image/jpeg" | "image/png" | "image/webp";
|
|
35
|
+
};
|
|
29
36
|
export type DecisionPreflightInput = {
|
|
30
|
-
|
|
37
|
+
media?: DecisionMediaItem[];
|
|
31
38
|
provider: AvertaProviderMetadata;
|
|
32
39
|
payload: unknown;
|
|
33
40
|
signal?: AbortSignal;
|
|
@@ -119,7 +126,7 @@ export type DecisionResponse = {
|
|
|
119
126
|
};
|
|
120
127
|
};
|
|
121
128
|
export type DecisionClientOptions = {
|
|
122
|
-
avertaApiKey
|
|
129
|
+
avertaApiKey?: string;
|
|
123
130
|
avertaBaseUrl?: string;
|
|
124
131
|
/**
|
|
125
132
|
* Maximum time to wait for an Averta decision request. Defaults to 30000.
|
|
@@ -127,5 +134,5 @@ export type DecisionClientOptions = {
|
|
|
127
134
|
*/
|
|
128
135
|
decisionTimeoutMs?: number;
|
|
129
136
|
fetch?: typeof fetch;
|
|
130
|
-
|
|
137
|
+
clientMetadata: AvertaClientMetadata;
|
|
131
138
|
};
|