promptfoo 0.119.13 → 0.119.14
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/dist/package.json +28 -26
- package/dist/src/app/assets/index-eJ2lMe94.js +51 -0
- package/dist/src/app/assets/{source-map-support-Bnh0UQ2S.js → source-map-support-1v4oeb7P.js} +1 -1
- package/dist/src/app/assets/sync-CtLQRuC1.js +1 -0
- package/dist/src/app/assets/{vendor-charts-T60Uk0Z3.js → vendor-charts-DnVv66VV.js} +1 -1
- package/dist/src/app/assets/{vendor-markdown-DLig-KJh.js → vendor-markdown-DCpQIyMA.js} +1 -1
- package/dist/src/app/assets/{vendor-mui-core-5BLaiG3c.js → vendor-mui-core-Boqnpf9f.js} +1 -1
- package/dist/src/app/assets/{vendor-mui-icons-fn39Fu2e.js → vendor-mui-icons-B8MqoVbj.js} +1 -1
- package/dist/src/app/assets/vendor-mui-x-CGSS6QHF.js +45 -0
- package/dist/src/app/assets/{vendor-utils-DYBMEuwX.js → vendor-utils-DdfHIEy8.js} +1 -1
- package/dist/src/app/index.html +7 -7
- package/dist/src/assertions/guardrails.d.ts +1 -1
- package/dist/src/assertions/guardrails.js +18 -9
- package/dist/src/assertions/index.d.ts +1 -1
- package/dist/src/assertions/index.js +9 -3
- package/dist/src/assertions/searchRubric.d.ts +3 -0
- package/dist/src/assertions/searchRubric.js +18 -0
- package/dist/src/commands/eval.js +1 -1
- package/dist/src/commands/modelScan.d.ts +7 -1
- package/dist/src/commands/modelScan.js +121 -59
- package/dist/src/database/index.d.ts +6 -0
- package/dist/src/database/index.js +11 -0
- package/dist/src/database/tables.d.ts +46 -24
- package/dist/src/envars.d.ts +17 -0
- package/dist/src/generated/constants.js +1 -1
- package/dist/src/logger.d.ts +5 -0
- package/dist/src/logger.js +28 -0
- package/dist/src/main.js +17 -6
- package/dist/src/matchers.d.ts +1 -0
- package/dist/src/matchers.js +80 -0
- package/dist/src/models/eval.d.ts +2 -1
- package/dist/src/models/eval.js +44 -2
- package/dist/src/prompts/grading.d.ts +1 -0
- package/dist/src/prompts/grading.js +26 -1
- package/dist/src/prompts/index.d.ts +1 -0
- package/dist/src/prompts/index.js +4 -1
- package/dist/src/providers/adaline.gateway.js +2 -2
- package/dist/src/providers/anthropic/defaults.d.ts +1 -1
- package/dist/src/providers/anthropic/defaults.js +15 -0
- package/dist/src/providers/azure/chat.d.ts +3 -1
- package/dist/src/providers/azure/chat.js +16 -3
- package/dist/src/providers/azure/defaults.js +660 -141
- package/dist/src/providers/azure/responses.d.ts +5 -0
- package/dist/src/providers/azure/responses.js +33 -4
- package/dist/src/providers/azure/types.d.ts +4 -0
- package/dist/src/providers/bedrock/agents.d.ts +1 -1
- package/dist/src/providers/bedrock/agents.js +2 -2
- package/dist/src/providers/bedrock/base.d.ts +40 -0
- package/dist/src/providers/bedrock/base.js +171 -0
- package/dist/src/providers/bedrock/converse.d.ts +146 -0
- package/dist/src/providers/bedrock/converse.js +1044 -0
- package/dist/src/providers/bedrock/index.d.ts +1 -34
- package/dist/src/providers/bedrock/index.js +4 -159
- package/dist/src/providers/bedrock/knowledgeBase.d.ts +1 -1
- package/dist/src/providers/bedrock/knowledgeBase.js +2 -2
- package/dist/src/providers/bedrock/nova-sonic.d.ts +2 -1
- package/dist/src/providers/bedrock/nova-sonic.js +2 -2
- package/dist/src/providers/claude-agent-sdk.d.ts +58 -1
- package/dist/src/providers/claude-agent-sdk.js +22 -1
- package/dist/src/providers/defaults.js +4 -0
- package/dist/src/providers/github/defaults.js +6 -6
- package/dist/src/providers/google/types.d.ts +25 -0
- package/dist/src/providers/google/util.d.ts +2 -0
- package/dist/src/providers/google/vertex.js +78 -22
- package/dist/src/providers/{groq.d.ts → groq/chat.d.ts} +26 -20
- package/dist/src/providers/groq/chat.js +79 -0
- package/dist/src/providers/groq/index.d.ts +5 -0
- package/dist/src/providers/groq/index.js +24 -0
- package/dist/src/providers/groq/responses.d.ts +106 -0
- package/dist/src/providers/groq/responses.js +64 -0
- package/dist/src/providers/groq/types.d.ts +44 -0
- package/dist/src/providers/groq/types.js +3 -0
- package/dist/src/providers/groq/util.d.ts +15 -0
- package/dist/src/providers/groq/util.js +28 -0
- package/dist/src/providers/mcp/client.d.ts +8 -0
- package/dist/src/providers/mcp/client.js +60 -10
- package/dist/src/providers/mcp/types.d.ts +21 -0
- package/dist/src/providers/openai/chatkit-pool.d.ts +114 -0
- package/dist/src/providers/openai/chatkit-pool.js +548 -0
- package/dist/src/providers/openai/chatkit-types.d.ts +73 -0
- package/dist/src/providers/openai/chatkit-types.js +3 -0
- package/dist/src/providers/openai/chatkit.d.ts +76 -0
- package/dist/src/providers/openai/chatkit.js +879 -0
- package/dist/src/providers/openai/codex-sdk.d.ts +109 -0
- package/dist/src/providers/openai/codex-sdk.js +346 -0
- package/dist/src/providers/openai/defaults.d.ts +2 -0
- package/dist/src/providers/openai/defaults.js +10 -4
- package/dist/src/providers/registry.js +48 -9
- package/dist/src/providers/responses/types.d.ts +1 -1
- package/dist/src/providers/sagemaker.d.ts +2 -2
- package/dist/src/providers/webSearchUtils.d.ts +17 -0
- package/dist/src/providers/webSearchUtils.js +169 -0
- package/dist/src/providers/xai/chat.d.ts +61 -0
- package/dist/src/providers/xai/chat.js +68 -3
- package/dist/src/providers/xai/responses.d.ts +189 -0
- package/dist/src/providers/xai/responses.js +268 -0
- package/dist/src/redteam/constants/plugins.d.ts +1 -1
- package/dist/src/redteam/constants/plugins.js +1 -1
- package/dist/src/redteam/constants/strategies.d.ts +1 -1
- package/dist/src/redteam/constants/strategies.js +1 -0
- package/dist/src/redteam/plugins/vlguard.d.ts +53 -4
- package/dist/src/redteam/plugins/vlguard.js +362 -46
- package/dist/src/redteam/providers/constants.d.ts +2 -2
- package/dist/src/redteam/providers/constants.js +2 -2
- package/dist/src/redteam/providers/crescendo/index.d.ts +1 -1
- package/dist/src/redteam/providers/crescendo/index.js +5 -3
- package/dist/src/redteam/providers/hydra/index.js +1 -1
- package/dist/src/server/routes/modelAudit.js +4 -4
- package/dist/src/share.js +4 -2
- package/dist/src/telemetry.js +44 -8
- package/dist/src/types/env.d.ts +3 -0
- package/dist/src/types/env.js +1 -0
- package/dist/src/types/index.d.ts +896 -615
- package/dist/src/types/index.js +1 -0
- package/dist/src/types/providers.d.ts +1 -0
- package/dist/src/types/tracing.d.ts +3 -0
- package/dist/src/util/database.d.ts +6 -4
- package/dist/src/util/file.js +6 -4
- package/dist/src/util/modelAuditCliParser.d.ts +4 -4
- package/dist/src/util/xlsx.js +52 -26
- package/dist/src/validators/providers.d.ts +142 -122
- package/dist/src/validators/providers.js +4 -6
- package/dist/src/validators/redteam.d.ts +36 -28
- package/dist/src/validators/redteam.js +9 -3
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +28 -26
- package/dist/drizzle/CLAUDE.md +0 -65
- package/dist/src/app/assets/index-DifT6VGT.js +0 -51
- package/dist/src/app/assets/sync-Oo-W_Rbj.js +0 -1
- package/dist/src/app/assets/vendor-mui-x-C2xF-yiO.js +0 -45
- package/dist/src/providers/groq.js +0 -48
|
@@ -1,24 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { AwsCredentialIdentity, AwsCredentialIdentityProvider } from '@aws-sdk/types';
|
|
3
|
-
import type { EnvOverrides } from '../../types/env';
|
|
1
|
+
import { AwsBedrockGenericProvider, type BedrockOptions } from './base';
|
|
4
2
|
import type { ApiEmbeddingProvider, ApiProvider, CallApiContextParams, ProviderEmbeddingResponse, ProviderResponse } from '../../types/providers';
|
|
5
3
|
import type { TokenUsage } from '../../types/shared';
|
|
6
4
|
export declare const coerceStrToNum: (value: string | number | undefined) => number | undefined;
|
|
7
5
|
export type BedrockModelFamily = 'claude' | 'nova' | 'llama' | 'llama2' | 'llama3' | 'llama3.1' | 'llama3_1' | 'llama3.2' | 'llama3_2' | 'llama3.3' | 'llama3_3' | 'llama4' | 'mistral' | 'cohere' | 'ai21' | 'titan' | 'deepseek' | 'openai' | 'qwen';
|
|
8
|
-
interface BedrockOptions {
|
|
9
|
-
accessKeyId?: string;
|
|
10
|
-
apiKey?: string;
|
|
11
|
-
profile?: string;
|
|
12
|
-
region?: string;
|
|
13
|
-
secretAccessKey?: string;
|
|
14
|
-
sessionToken?: string;
|
|
15
|
-
guardrailIdentifier?: string;
|
|
16
|
-
guardrailVersion?: string;
|
|
17
|
-
trace?: Trace;
|
|
18
|
-
showThinking?: boolean;
|
|
19
|
-
endpoint?: string;
|
|
20
|
-
inferenceModelType?: BedrockModelFamily;
|
|
21
|
-
}
|
|
22
6
|
export interface TextGenerationOptions {
|
|
23
7
|
maxTokenCount?: number;
|
|
24
8
|
stopSequences?: Array<string>;
|
|
@@ -460,23 +444,6 @@ export declare const BEDROCK_MODEL: {
|
|
|
460
444
|
};
|
|
461
445
|
};
|
|
462
446
|
export declare const AWS_BEDROCK_MODELS: Record<string, IBedrockModel>;
|
|
463
|
-
export declare abstract class AwsBedrockGenericProvider {
|
|
464
|
-
modelName: string;
|
|
465
|
-
env?: EnvOverrides;
|
|
466
|
-
bedrock?: BedrockRuntime;
|
|
467
|
-
config: BedrockOptions;
|
|
468
|
-
constructor(modelName: string, options?: {
|
|
469
|
-
config?: BedrockOptions;
|
|
470
|
-
id?: string;
|
|
471
|
-
env?: EnvOverrides;
|
|
472
|
-
});
|
|
473
|
-
id(): string;
|
|
474
|
-
toString(): string;
|
|
475
|
-
protected getApiKey(): string | undefined;
|
|
476
|
-
getCredentials(): Promise<AwsCredentialIdentity | AwsCredentialIdentityProvider | undefined>;
|
|
477
|
-
getBedrockInstance(): Promise<BedrockRuntime>;
|
|
478
|
-
getRegion(): string;
|
|
479
|
-
}
|
|
480
447
|
export declare class AwsBedrockCompletionProvider extends AwsBedrockGenericProvider implements ApiProvider {
|
|
481
448
|
static AWS_BEDROCK_COMPLETION_MODELS: string[];
|
|
482
449
|
callApi(prompt: string, context?: CallApiContextParams): Promise<ProviderResponse>;
|
|
@@ -1,42 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
38
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.AwsBedrockEmbeddingProvider = exports.AwsBedrockCompletionProvider = exports.
|
|
6
|
+
exports.AwsBedrockEmbeddingProvider = exports.AwsBedrockCompletionProvider = exports.AWS_BEDROCK_MODELS = exports.BEDROCK_MODEL = exports.getLlamaModelHandler = exports.formatPromptLlama4 = exports.formatPromptLlama3Instruct = exports.formatPromptLlama2Chat = exports.LlamaVersion = exports.coerceStrToNum = void 0;
|
|
40
7
|
exports.parseValue = parseValue;
|
|
41
8
|
exports.addConfigParam = addConfigParam;
|
|
42
9
|
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
@@ -44,11 +11,11 @@ const dedent_1 = __importDefault(require("dedent"));
|
|
|
44
11
|
const cache_1 = require("../../cache");
|
|
45
12
|
const envars_1 = require("../../envars");
|
|
46
13
|
const logger_1 = __importDefault(require("../../logger"));
|
|
47
|
-
const telemetry_1 = __importDefault(require("../../telemetry"));
|
|
48
14
|
const index_1 = require("../../util/index");
|
|
49
15
|
const tokenUsageUtils_1 = require("../../util/tokenUsageUtils");
|
|
50
16
|
const util_1 = require("../anthropic/util");
|
|
51
17
|
const shared_1 = require("../shared");
|
|
18
|
+
const base_1 = require("./base");
|
|
52
19
|
const util_2 = require("./util");
|
|
53
20
|
// Utility function to coerce string values to numbers
|
|
54
21
|
const coerceStrToNum = (value) => value === undefined ? undefined : typeof value === 'string' ? Number(value) : value;
|
|
@@ -1072,129 +1039,7 @@ function getHandlerForModel(modelName, config) {
|
|
|
1072
1039
|
}
|
|
1073
1040
|
throw new Error(`Unknown Amazon Bedrock model: ${modelName}`);
|
|
1074
1041
|
}
|
|
1075
|
-
class AwsBedrockGenericProvider {
|
|
1076
|
-
constructor(modelName, options = {}) {
|
|
1077
|
-
const { config, id, env } = options;
|
|
1078
|
-
this.env = env;
|
|
1079
|
-
this.modelName = modelName;
|
|
1080
|
-
this.config = config || {};
|
|
1081
|
-
this.id = id ? () => id : this.id;
|
|
1082
|
-
if (this.config.guardrailIdentifier) {
|
|
1083
|
-
telemetry_1.default.record('feature_used', {
|
|
1084
|
-
feature: 'guardrail',
|
|
1085
|
-
provider: 'bedrock',
|
|
1086
|
-
});
|
|
1087
|
-
}
|
|
1088
|
-
}
|
|
1089
|
-
id() {
|
|
1090
|
-
return `bedrock:${this.modelName}`;
|
|
1091
|
-
}
|
|
1092
|
-
toString() {
|
|
1093
|
-
return `[Amazon Bedrock Provider ${this.modelName}]`;
|
|
1094
|
-
}
|
|
1095
|
-
getApiKey() {
|
|
1096
|
-
return this.config.apiKey || (0, envars_1.getEnvString)('AWS_BEARER_TOKEN_BEDROCK');
|
|
1097
|
-
}
|
|
1098
|
-
async getCredentials() {
|
|
1099
|
-
// 1. Explicit credentials have ABSOLUTE highest priority (as documented)
|
|
1100
|
-
if (this.config.accessKeyId && this.config.secretAccessKey) {
|
|
1101
|
-
logger_1.default.debug(`Using credentials from config file`);
|
|
1102
|
-
return {
|
|
1103
|
-
accessKeyId: this.config.accessKeyId,
|
|
1104
|
-
secretAccessKey: this.config.secretAccessKey,
|
|
1105
|
-
sessionToken: this.config.sessionToken,
|
|
1106
|
-
};
|
|
1107
|
-
}
|
|
1108
|
-
// 2. API key authentication as second priority
|
|
1109
|
-
const apiKey = this.getApiKey();
|
|
1110
|
-
if (apiKey) {
|
|
1111
|
-
logger_1.default.debug(`Using Bedrock API key authentication`);
|
|
1112
|
-
// For Bedrock API keys, we don't need traditional AWS credentials
|
|
1113
|
-
// The API key will be handled in the request headers
|
|
1114
|
-
return undefined;
|
|
1115
|
-
}
|
|
1116
|
-
// 3. SSO profile as third priority
|
|
1117
|
-
if (this.config.profile) {
|
|
1118
|
-
logger_1.default.debug(`Using SSO profile: ${this.config.profile}`);
|
|
1119
|
-
try {
|
|
1120
|
-
const { fromSSO } = await Promise.resolve().then(() => __importStar(require('@aws-sdk/credential-provider-sso')));
|
|
1121
|
-
return fromSSO({ profile: this.config.profile });
|
|
1122
|
-
}
|
|
1123
|
-
catch (err) {
|
|
1124
|
-
logger_1.default.error(`Error loading @aws-sdk/credential-provider-sso: ${err}`);
|
|
1125
|
-
throw new Error('The @aws-sdk/credential-provider-sso package is required for SSO profiles. Please install it: npm install @aws-sdk/credential-provider-sso');
|
|
1126
|
-
}
|
|
1127
|
-
}
|
|
1128
|
-
// 4. AWS default credential chain (lowest priority)
|
|
1129
|
-
logger_1.default.debug(`No explicit credentials in config, falling back to AWS default chain`);
|
|
1130
|
-
return undefined;
|
|
1131
|
-
}
|
|
1132
|
-
async getBedrockInstance() {
|
|
1133
|
-
if (!this.bedrock) {
|
|
1134
|
-
let handler;
|
|
1135
|
-
const apiKey = this.getApiKey();
|
|
1136
|
-
// Create request handler for proxy or API key scenarios
|
|
1137
|
-
if ((0, envars_1.getEnvString)('HTTP_PROXY') || (0, envars_1.getEnvString)('HTTPS_PROXY') || apiKey) {
|
|
1138
|
-
try {
|
|
1139
|
-
const { NodeHttpHandler } = await Promise.resolve().then(() => __importStar(require('@smithy/node-http-handler')));
|
|
1140
|
-
const { ProxyAgent } = await Promise.resolve().then(() => __importStar(require('proxy-agent')));
|
|
1141
|
-
// Create handler with proxy support if needed
|
|
1142
|
-
const proxyAgent = (0, envars_1.getEnvString)('HTTP_PROXY') || (0, envars_1.getEnvString)('HTTPS_PROXY')
|
|
1143
|
-
? new ProxyAgent()
|
|
1144
|
-
: undefined;
|
|
1145
|
-
handler = new NodeHttpHandler({
|
|
1146
|
-
...(proxyAgent ? { httpsAgent: proxyAgent } : {}),
|
|
1147
|
-
requestTimeout: 300000, // 5 minutes
|
|
1148
|
-
});
|
|
1149
|
-
// Add Bearer token middleware for API key authentication
|
|
1150
|
-
if (apiKey) {
|
|
1151
|
-
const originalHandle = handler.handle.bind(handler);
|
|
1152
|
-
handler.handle = async (request, options) => {
|
|
1153
|
-
// Add Authorization header with Bearer token
|
|
1154
|
-
request.headers = {
|
|
1155
|
-
...request.headers,
|
|
1156
|
-
Authorization: `Bearer ${apiKey}`,
|
|
1157
|
-
};
|
|
1158
|
-
return originalHandle(request, options);
|
|
1159
|
-
};
|
|
1160
|
-
}
|
|
1161
|
-
}
|
|
1162
|
-
catch {
|
|
1163
|
-
const reason = apiKey
|
|
1164
|
-
? 'API key authentication requires the @smithy/node-http-handler package'
|
|
1165
|
-
: 'Proxy configuration requires the @smithy/node-http-handler package';
|
|
1166
|
-
throw new Error(`${reason}. Please install it in your project or globally.`);
|
|
1167
|
-
}
|
|
1168
|
-
}
|
|
1169
|
-
try {
|
|
1170
|
-
const { BedrockRuntime } = await Promise.resolve().then(() => __importStar(require('@aws-sdk/client-bedrock-runtime')));
|
|
1171
|
-
const credentials = await this.getCredentials();
|
|
1172
|
-
const bedrock = new BedrockRuntime({
|
|
1173
|
-
region: this.getRegion(),
|
|
1174
|
-
maxAttempts: (0, envars_1.getEnvInt)('AWS_BEDROCK_MAX_RETRIES', 10),
|
|
1175
|
-
retryMode: 'adaptive',
|
|
1176
|
-
...(credentials ? { credentials } : {}),
|
|
1177
|
-
...(handler ? { requestHandler: handler } : {}),
|
|
1178
|
-
...(this.config.endpoint ? { endpoint: this.config.endpoint } : {}),
|
|
1179
|
-
});
|
|
1180
|
-
this.bedrock = bedrock;
|
|
1181
|
-
}
|
|
1182
|
-
catch (err) {
|
|
1183
|
-
logger_1.default.error(`Error creating BedrockRuntime: ${err}`);
|
|
1184
|
-
throw new Error('The @aws-sdk/client-bedrock-runtime package is required as a peer dependency. Please install it in your project or globally.');
|
|
1185
|
-
}
|
|
1186
|
-
}
|
|
1187
|
-
return this.bedrock;
|
|
1188
|
-
}
|
|
1189
|
-
getRegion() {
|
|
1190
|
-
return (this.config?.region ||
|
|
1191
|
-
this.env?.AWS_BEDROCK_REGION ||
|
|
1192
|
-
(0, envars_1.getEnvString)('AWS_BEDROCK_REGION') ||
|
|
1193
|
-
'us-east-1');
|
|
1194
|
-
}
|
|
1195
|
-
}
|
|
1196
|
-
exports.AwsBedrockGenericProvider = AwsBedrockGenericProvider;
|
|
1197
|
-
class AwsBedrockCompletionProvider extends AwsBedrockGenericProvider {
|
|
1042
|
+
class AwsBedrockCompletionProvider extends base_1.AwsBedrockGenericProvider {
|
|
1198
1043
|
async callApi(prompt, context) {
|
|
1199
1044
|
let stop;
|
|
1200
1045
|
try {
|
|
@@ -1331,7 +1176,7 @@ class AwsBedrockCompletionProvider extends AwsBedrockGenericProvider {
|
|
|
1331
1176
|
}
|
|
1332
1177
|
exports.AwsBedrockCompletionProvider = AwsBedrockCompletionProvider;
|
|
1333
1178
|
AwsBedrockCompletionProvider.AWS_BEDROCK_COMPLETION_MODELS = Object.keys(exports.AWS_BEDROCK_MODELS);
|
|
1334
|
-
class AwsBedrockEmbeddingProvider extends AwsBedrockGenericProvider {
|
|
1179
|
+
class AwsBedrockEmbeddingProvider extends base_1.AwsBedrockGenericProvider {
|
|
1335
1180
|
async callApi() {
|
|
1336
1181
|
throw new Error('callApi is not implemented for embedding provider');
|
|
1337
1182
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AwsBedrockGenericProvider } from './
|
|
1
|
+
import { AwsBedrockGenericProvider } from './base';
|
|
2
2
|
import type { BedrockAgentRuntimeClient } from '@aws-sdk/client-bedrock-agent-runtime';
|
|
3
3
|
import type { EnvOverrides } from '../../types/env';
|
|
4
4
|
import type { ApiProvider, ProviderResponse } from '../../types/providers';
|
|
@@ -42,12 +42,12 @@ const envars_1 = require("../../envars");
|
|
|
42
42
|
const logger_1 = __importDefault(require("../../logger"));
|
|
43
43
|
const telemetry_1 = __importDefault(require("../../telemetry"));
|
|
44
44
|
const tokenUsageUtils_1 = require("../../util/tokenUsageUtils");
|
|
45
|
-
const
|
|
45
|
+
const base_1 = require("./base");
|
|
46
46
|
/**
|
|
47
47
|
* AWS Bedrock Knowledge Base provider for RAG (Retrieval Augmented Generation).
|
|
48
48
|
* Allows querying an existing AWS Bedrock Knowledge Base with text queries.
|
|
49
49
|
*/
|
|
50
|
-
class AwsBedrockKnowledgeBaseProvider extends
|
|
50
|
+
class AwsBedrockKnowledgeBaseProvider extends base_1.AwsBedrockGenericProvider {
|
|
51
51
|
constructor(modelName, options = {}) {
|
|
52
52
|
super(modelName, options);
|
|
53
53
|
// Ensure we have a knowledgeBaseId
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { AwsBedrockGenericProvider
|
|
1
|
+
import { AwsBedrockGenericProvider } from './base';
|
|
2
|
+
import type { BedrockAmazonNovaSonicGenerationOptions } from '.';
|
|
2
3
|
import type { ApiProvider, CallApiContextParams, ProviderOptions, ProviderResponse } from '../../types/providers';
|
|
3
4
|
export declare class NovaSonicProvider extends AwsBedrockGenericProvider implements ApiProvider {
|
|
4
5
|
private sessions;
|
|
@@ -43,7 +43,7 @@ const rxjs_1 = require("rxjs");
|
|
|
43
43
|
const operators_1 = require("rxjs/operators");
|
|
44
44
|
const logger_1 = __importDefault(require("../../logger"));
|
|
45
45
|
const tokenUsageUtils_1 = require("../../util/tokenUsageUtils");
|
|
46
|
-
const
|
|
46
|
+
const base_1 = require("./base");
|
|
47
47
|
const DEFAULT_CONFIG = {
|
|
48
48
|
inference: {
|
|
49
49
|
maxTokens: 1024,
|
|
@@ -73,7 +73,7 @@ const DEFAULT_CONFIG = {
|
|
|
73
73
|
mediaType: 'text/plain',
|
|
74
74
|
},
|
|
75
75
|
};
|
|
76
|
-
class NovaSonicProvider extends
|
|
76
|
+
class NovaSonicProvider extends base_1.AwsBedrockGenericProvider {
|
|
77
77
|
constructor(modelName = 'amazon.nova-sonic-v1:0', options = {}) {
|
|
78
78
|
super(modelName, options);
|
|
79
79
|
this.sessions = new Map();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MCPConfig } from './mcp/types';
|
|
2
|
-
import type { SettingSource } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
+
import type { AgentDefinition, HookCallbackMatcher, HookEvent, OutputFormat, SettingSource } from '@anthropic-ai/claude-agent-sdk';
|
|
3
3
|
import type { ApiProvider, CallApiContextParams, CallApiOptionsParams, ProviderResponse } from '../types/index';
|
|
4
4
|
import type { EnvOverrides } from '../types/env';
|
|
5
5
|
/**
|
|
@@ -62,6 +62,63 @@ export interface ClaudeCodeOptions {
|
|
|
62
62
|
* if not supplied, it won't look for any settings, CLAUDE.md, or slash commands
|
|
63
63
|
*/
|
|
64
64
|
setting_sources?: SettingSource[];
|
|
65
|
+
/**
|
|
66
|
+
* 'plugins' allows loading Claude Code plugins from local file system paths
|
|
67
|
+
* Each plugin must be a directory containing .claude-plugin/plugin.json manifest
|
|
68
|
+
*/
|
|
69
|
+
plugins?: Array<{
|
|
70
|
+
type: 'local';
|
|
71
|
+
path: string;
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* Maximum budget in USD for this session. When exceeded, the SDK will stop with error_max_budget_usd.
|
|
75
|
+
* Useful for cost control in automated evaluations.
|
|
76
|
+
*/
|
|
77
|
+
max_budget_usd?: number;
|
|
78
|
+
/**
|
|
79
|
+
* Additional directories the agent can access beyond the working directory.
|
|
80
|
+
* Useful when the agent needs to read files from multiple locations.
|
|
81
|
+
*/
|
|
82
|
+
additional_directories?: string[];
|
|
83
|
+
/**
|
|
84
|
+
* Session ID to resume a previous conversation. The agent will continue from where it left off.
|
|
85
|
+
* Use with 'fork_session' to branch instead of continuing the same session.
|
|
86
|
+
*/
|
|
87
|
+
resume?: string;
|
|
88
|
+
/**
|
|
89
|
+
* When true and 'resume' is set, creates a new session branching from the resumed point
|
|
90
|
+
* instead of continuing the original session.
|
|
91
|
+
*/
|
|
92
|
+
fork_session?: boolean;
|
|
93
|
+
/**
|
|
94
|
+
* When resuming, only restore messages up to this message UUID.
|
|
95
|
+
* Allows resuming from a specific point in the conversation history.
|
|
96
|
+
*/
|
|
97
|
+
resume_session_at?: string;
|
|
98
|
+
/**
|
|
99
|
+
* When true, continues from the previous conversation without requiring a resume session ID.
|
|
100
|
+
*/
|
|
101
|
+
continue?: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Programmatic agent definitions. Allows defining custom subagents inline without filesystem dependencies.
|
|
104
|
+
* Keys are agent names, values are agent definitions with description, tools, and prompt.
|
|
105
|
+
*/
|
|
106
|
+
agents?: Record<string, AgentDefinition>;
|
|
107
|
+
/**
|
|
108
|
+
* Output format specification for structured outputs.
|
|
109
|
+
* When set, the agent will return validated JSON matching the provided schema.
|
|
110
|
+
*/
|
|
111
|
+
output_format?: OutputFormat;
|
|
112
|
+
/**
|
|
113
|
+
* Hooks for intercepting events during agent execution.
|
|
114
|
+
* Allows custom logic at various points like PreToolUse, PostToolUse, etc.
|
|
115
|
+
*/
|
|
116
|
+
hooks?: Partial<Record<HookEvent, HookCallbackMatcher[]>>;
|
|
117
|
+
/**
|
|
118
|
+
* When true, includes partial/streaming messages in the response.
|
|
119
|
+
* Useful for debugging or when you need to see intermediate outputs.
|
|
120
|
+
*/
|
|
121
|
+
include_partial_messages?: boolean;
|
|
65
122
|
}
|
|
66
123
|
export declare class ClaudeCodeSDKProvider implements ApiProvider {
|
|
67
124
|
static ANTHROPIC_MODELS: {
|
|
@@ -180,6 +180,17 @@ class ClaudeCodeSDKProvider {
|
|
|
180
180
|
maxThinkingTokens: config.max_thinking_tokens,
|
|
181
181
|
allowedTools,
|
|
182
182
|
disallowedTools,
|
|
183
|
+
plugins: config.plugins,
|
|
184
|
+
maxBudgetUsd: config.max_budget_usd,
|
|
185
|
+
additionalDirectories: config.additional_directories,
|
|
186
|
+
resume: config.resume,
|
|
187
|
+
forkSession: config.fork_session,
|
|
188
|
+
resumeSessionAt: config.resume_session_at,
|
|
189
|
+
continue: config.continue,
|
|
190
|
+
agents: config.agents,
|
|
191
|
+
outputFormat: config.output_format,
|
|
192
|
+
hooks: config.hooks,
|
|
193
|
+
includePartialMessages: config.include_partial_messages,
|
|
183
194
|
env,
|
|
184
195
|
};
|
|
185
196
|
let shouldCache = (0, cache_1.isCacheEnabled)();
|
|
@@ -295,13 +306,23 @@ class ClaudeCodeSDKProvider {
|
|
|
295
306
|
const sessionId = msg.session_id;
|
|
296
307
|
if (msg.subtype == 'success') {
|
|
297
308
|
logger_1.default.debug(`Claude Agent SDK response: ${raw}`);
|
|
309
|
+
// When structured output is enabled and available, use it as the output
|
|
310
|
+
// Otherwise fall back to the text result
|
|
311
|
+
const output = msg.structured_output !== undefined ? msg.structured_output : msg.result;
|
|
298
312
|
const response = {
|
|
299
|
-
output
|
|
313
|
+
output,
|
|
300
314
|
tokenUsage,
|
|
301
315
|
cost,
|
|
302
316
|
raw,
|
|
303
317
|
sessionId,
|
|
304
318
|
};
|
|
319
|
+
// Include structured output in metadata if available
|
|
320
|
+
if (msg.structured_output !== undefined) {
|
|
321
|
+
response.metadata = {
|
|
322
|
+
...response.metadata,
|
|
323
|
+
structuredOutput: msg.structured_output,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
305
326
|
if (shouldWriteCache && cache && cacheKey) {
|
|
306
327
|
try {
|
|
307
328
|
await cache.set(cacheKey, JSON.stringify(response));
|
|
@@ -84,6 +84,7 @@ async function getDefaultProviders(env) {
|
|
|
84
84
|
moderationProvider: defaults_4.DefaultModerationProvider,
|
|
85
85
|
suggestionsProvider: azureProvider,
|
|
86
86
|
synthesizeProvider: azureProvider,
|
|
87
|
+
// Azure doesn't have web search by default
|
|
87
88
|
};
|
|
88
89
|
}
|
|
89
90
|
else if (preferAnthropic) {
|
|
@@ -97,6 +98,7 @@ async function getDefaultProviders(env) {
|
|
|
97
98
|
moderationProvider: defaults_4.DefaultModerationProvider,
|
|
98
99
|
suggestionsProvider: anthropicProviders.suggestionsProvider,
|
|
99
100
|
synthesizeProvider: anthropicProviders.synthesizeProvider,
|
|
101
|
+
webSearchProvider: anthropicProviders.webSearchProvider,
|
|
100
102
|
};
|
|
101
103
|
}
|
|
102
104
|
else if (!hasOpenAiCredentials && !hasAnthropicCredentials && hasGoogleAiStudioCredentials) {
|
|
@@ -138,6 +140,7 @@ async function getDefaultProviders(env) {
|
|
|
138
140
|
moderationProvider: defaults_4.DefaultModerationProvider,
|
|
139
141
|
suggestionsProvider: defaults_2.DefaultSuggestionsProvider,
|
|
140
142
|
synthesizeProvider: defaults_2.DefaultSynthesizeProvider,
|
|
143
|
+
// Mistral doesn't have web search
|
|
141
144
|
};
|
|
142
145
|
}
|
|
143
146
|
else if (!hasOpenAiCredentials &&
|
|
@@ -165,6 +168,7 @@ async function getDefaultProviders(env) {
|
|
|
165
168
|
moderationProvider: defaults_4.DefaultModerationProvider,
|
|
166
169
|
suggestionsProvider: defaults_4.DefaultSuggestionsProvider,
|
|
167
170
|
synthesizeProvider: defaults_4.DefaultGradingJsonProvider,
|
|
171
|
+
webSearchProvider: defaults_4.DefaultWebSearchProvider,
|
|
168
172
|
};
|
|
169
173
|
}
|
|
170
174
|
// If Azure Content Safety endpoint is available, use it for moderation
|
|
@@ -8,28 +8,28 @@ const githubConfig = {
|
|
|
8
8
|
apiBaseUrl: 'https://models.github.ai',
|
|
9
9
|
apiKeyEnvar: 'GITHUB_TOKEN',
|
|
10
10
|
};
|
|
11
|
-
exports.DefaultGitHubGradingProvider = new chat_1.OpenAiChatCompletionProvider('openai/gpt-
|
|
11
|
+
exports.DefaultGitHubGradingProvider = new chat_1.OpenAiChatCompletionProvider('openai/gpt-5', {
|
|
12
12
|
config: githubConfig,
|
|
13
13
|
});
|
|
14
|
-
exports.DefaultGitHubGradingJsonProvider = new chat_1.OpenAiChatCompletionProvider('openai/gpt-
|
|
14
|
+
exports.DefaultGitHubGradingJsonProvider = new chat_1.OpenAiChatCompletionProvider('openai/gpt-5', {
|
|
15
15
|
config: {
|
|
16
16
|
...githubConfig,
|
|
17
17
|
response_format: { type: 'json_object' },
|
|
18
18
|
},
|
|
19
19
|
});
|
|
20
|
-
exports.DefaultGitHubSuggestionsProvider = new chat_1.OpenAiChatCompletionProvider('openai/gpt-
|
|
20
|
+
exports.DefaultGitHubSuggestionsProvider = new chat_1.OpenAiChatCompletionProvider('openai/gpt-5', {
|
|
21
21
|
config: githubConfig,
|
|
22
22
|
});
|
|
23
23
|
// Fast model for quick evaluations
|
|
24
|
-
exports.DefaultGitHubFastProvider = new chat_1.OpenAiChatCompletionProvider('openai/gpt-
|
|
24
|
+
exports.DefaultGitHubFastProvider = new chat_1.OpenAiChatCompletionProvider('openai/gpt-5-nano', {
|
|
25
25
|
config: githubConfig,
|
|
26
26
|
});
|
|
27
27
|
// Balanced model for general use
|
|
28
|
-
exports.DefaultGitHubBalancedProvider = new chat_1.OpenAiChatCompletionProvider('openai/gpt-
|
|
28
|
+
exports.DefaultGitHubBalancedProvider = new chat_1.OpenAiChatCompletionProvider('openai/gpt-5-mini', {
|
|
29
29
|
config: githubConfig,
|
|
30
30
|
});
|
|
31
31
|
// Reasoning model for complex evaluations
|
|
32
|
-
exports.DefaultGitHubReasoningProvider = new chat_1.OpenAiChatCompletionProvider('openai/
|
|
32
|
+
exports.DefaultGitHubReasoningProvider = new chat_1.OpenAiChatCompletionProvider('openai/o4-mini', {
|
|
33
33
|
config: githubConfig,
|
|
34
34
|
});
|
|
35
35
|
//# sourceMappingURL=defaults.js.map
|
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
import type { MCPConfig } from '../mcp/types';
|
|
2
|
+
/**
|
|
3
|
+
* Model Armor configuration for Vertex AI integration.
|
|
4
|
+
* Model Armor screens prompts and responses for safety, security, and compliance.
|
|
5
|
+
* @see https://cloud.google.com/security-command-center/docs/model-armor-vertex-integration
|
|
6
|
+
*/
|
|
7
|
+
export interface ModelArmorConfig {
|
|
8
|
+
/**
|
|
9
|
+
* Full resource path to the Model Armor template for screening prompts.
|
|
10
|
+
* Format: projects/{project}/locations/{location}/templates/{template_id}
|
|
11
|
+
* @example "projects/my-project/locations/us-central1/templates/strict-safety"
|
|
12
|
+
*/
|
|
13
|
+
promptTemplate?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Full resource path to the Model Armor template for screening responses.
|
|
16
|
+
* Format: projects/{project}/locations/{location}/templates/{template_id}
|
|
17
|
+
* @example "projects/my-project/locations/us-central1/templates/strict-safety"
|
|
18
|
+
*/
|
|
19
|
+
responseTemplate?: string;
|
|
20
|
+
}
|
|
2
21
|
interface Blob {
|
|
3
22
|
mimeType: string;
|
|
4
23
|
data: string;
|
|
@@ -182,6 +201,12 @@ export interface CompletionOptions {
|
|
|
182
201
|
* If false (default), maps 'assistant' to 'model' (for newer Gemini versions).
|
|
183
202
|
*/
|
|
184
203
|
useAssistantRole?: boolean;
|
|
204
|
+
/**
|
|
205
|
+
* Model Armor configuration for screening prompts and responses.
|
|
206
|
+
* Only applicable for Vertex AI provider.
|
|
207
|
+
* @see https://cloud.google.com/security-command-center/docs/model-armor-vertex-integration
|
|
208
|
+
*/
|
|
209
|
+
modelArmor?: ModelArmorConfig;
|
|
185
210
|
}
|
|
186
211
|
interface ClaudeMessage {
|
|
187
212
|
role: string;
|
|
@@ -245,6 +245,19 @@ class VertexChatProvider extends VertexGenericProvider {
|
|
|
245
245
|
...(config.toolConfig ? { toolConfig: config.toolConfig } : {}),
|
|
246
246
|
...(allTools.length > 0 ? { tools: allTools } : {}),
|
|
247
247
|
...(systemInstruction ? { systemInstruction } : {}),
|
|
248
|
+
// Model Armor integration: inject template configuration for prompt/response screening
|
|
249
|
+
// See: https://cloud.google.com/security-command-center/docs/model-armor-vertex-integration
|
|
250
|
+
...(config.modelArmor &&
|
|
251
|
+
(config.modelArmor.promptTemplate || config.modelArmor.responseTemplate) && {
|
|
252
|
+
model_armor_config: {
|
|
253
|
+
...(config.modelArmor.promptTemplate && {
|
|
254
|
+
prompt_template_name: config.modelArmor.promptTemplate,
|
|
255
|
+
}),
|
|
256
|
+
...(config.modelArmor.responseTemplate && {
|
|
257
|
+
response_template_name: config.modelArmor.responseTemplate,
|
|
258
|
+
}),
|
|
259
|
+
},
|
|
260
|
+
}),
|
|
248
261
|
};
|
|
249
262
|
if (config.responseSchema) {
|
|
250
263
|
if (body.generationConfig.response_schema) {
|
|
@@ -326,20 +339,77 @@ class VertexChatProvider extends VertexGenericProvider {
|
|
|
326
339
|
const dataWithResponse = data;
|
|
327
340
|
let output;
|
|
328
341
|
for (const datum of dataWithResponse) {
|
|
342
|
+
// Check for blockReason first (before getCandidate) since blocked responses have no candidates
|
|
343
|
+
if (datum.promptFeedback?.blockReason) {
|
|
344
|
+
// Handle Model Armor blocks with detailed guardrails information
|
|
345
|
+
const isModelArmor = datum.promptFeedback.blockReason === 'MODEL_ARMOR';
|
|
346
|
+
const blockReasonMessage = datum.promptFeedback.blockReasonMessage ||
|
|
347
|
+
`Content was blocked due to ${isModelArmor ? 'Model Armor' : 'safety settings'}: ${datum.promptFeedback.blockReason}`;
|
|
348
|
+
const tokenUsage = {
|
|
349
|
+
total: datum.usageMetadata?.totalTokenCount || 0,
|
|
350
|
+
prompt: datum.usageMetadata?.promptTokenCount || 0,
|
|
351
|
+
completion: datum.usageMetadata?.candidatesTokenCount || 0,
|
|
352
|
+
};
|
|
353
|
+
// Build guardrails response with Model Armor details
|
|
354
|
+
const guardrails = {
|
|
355
|
+
flagged: true,
|
|
356
|
+
flaggedInput: true,
|
|
357
|
+
flaggedOutput: false,
|
|
358
|
+
reason: blockReasonMessage,
|
|
359
|
+
};
|
|
360
|
+
if (cliState_1.default.config?.redteam) {
|
|
361
|
+
// Refusals are not errors during redteams, they're actually successes.
|
|
362
|
+
return {
|
|
363
|
+
output: blockReasonMessage,
|
|
364
|
+
tokenUsage,
|
|
365
|
+
guardrails,
|
|
366
|
+
metadata: {
|
|
367
|
+
modelArmor: isModelArmor
|
|
368
|
+
? {
|
|
369
|
+
blockReason: datum.promptFeedback.blockReason,
|
|
370
|
+
...(datum.promptFeedback.blockReasonMessage && {
|
|
371
|
+
blockReasonMessage: datum.promptFeedback.blockReasonMessage,
|
|
372
|
+
}),
|
|
373
|
+
}
|
|
374
|
+
: undefined,
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
return {
|
|
379
|
+
error: blockReasonMessage,
|
|
380
|
+
guardrails,
|
|
381
|
+
metadata: {
|
|
382
|
+
modelArmor: isModelArmor
|
|
383
|
+
? {
|
|
384
|
+
blockReason: datum.promptFeedback.blockReason,
|
|
385
|
+
...(datum.promptFeedback.blockReasonMessage && {
|
|
386
|
+
blockReasonMessage: datum.promptFeedback.blockReasonMessage,
|
|
387
|
+
}),
|
|
388
|
+
}
|
|
389
|
+
: undefined,
|
|
390
|
+
},
|
|
391
|
+
};
|
|
392
|
+
}
|
|
329
393
|
const candidate = (0, util_1.getCandidate)(datum);
|
|
330
394
|
if (candidate.finishReason && candidate.finishReason === 'SAFETY') {
|
|
331
395
|
const finishReason = 'Content was blocked due to safety settings.';
|
|
396
|
+
const tokenUsage = {
|
|
397
|
+
total: datum.usageMetadata?.totalTokenCount || 0,
|
|
398
|
+
prompt: datum.usageMetadata?.promptTokenCount || 0,
|
|
399
|
+
completion: datum.usageMetadata?.candidatesTokenCount || 0,
|
|
400
|
+
};
|
|
401
|
+
// Build guardrails response for safety blocks
|
|
402
|
+
const guardrails = {
|
|
403
|
+
flagged: true,
|
|
404
|
+
flaggedInput: false,
|
|
405
|
+
flaggedOutput: true,
|
|
406
|
+
reason: finishReason,
|
|
407
|
+
};
|
|
332
408
|
if (cliState_1.default.config?.redteam) {
|
|
333
409
|
// Refusals are not errors during redteams, they're actually successes.
|
|
334
|
-
|
|
335
|
-
const tokenUsage = {
|
|
336
|
-
total: datum.usageMetadata?.totalTokenCount || 0,
|
|
337
|
-
prompt: datum.usageMetadata?.promptTokenCount || 0,
|
|
338
|
-
completion: datum.usageMetadata?.candidatesTokenCount || 0,
|
|
339
|
-
};
|
|
340
|
-
return { output: finishReason, tokenUsage };
|
|
410
|
+
return { output: finishReason, tokenUsage, guardrails };
|
|
341
411
|
}
|
|
342
|
-
return { error: finishReason };
|
|
412
|
+
return { error: finishReason, guardrails };
|
|
343
413
|
}
|
|
344
414
|
else if (candidate.finishReason && candidate.finishReason !== 'STOP') {
|
|
345
415
|
// e.g. MALFORMED_FUNCTION_CALL
|
|
@@ -347,20 +417,6 @@ class VertexChatProvider extends VertexGenericProvider {
|
|
|
347
417
|
error: `Finish reason ${candidate.finishReason}: ${JSON.stringify(data)}`,
|
|
348
418
|
};
|
|
349
419
|
}
|
|
350
|
-
else if (datum.promptFeedback?.blockReason) {
|
|
351
|
-
const blockReason = `Content was blocked due to safety settings: ${datum.promptFeedback.blockReason}`;
|
|
352
|
-
if (cliState_1.default.config?.redteam) {
|
|
353
|
-
// Refusals are not errors during redteams, they're actually successes.
|
|
354
|
-
// Calculate token usage even for safety-blocked responses
|
|
355
|
-
const tokenUsage = {
|
|
356
|
-
total: datum.usageMetadata?.totalTokenCount || 0,
|
|
357
|
-
prompt: datum.usageMetadata?.promptTokenCount || 0,
|
|
358
|
-
completion: datum.usageMetadata?.candidatesTokenCount || 0,
|
|
359
|
-
};
|
|
360
|
-
return { output: blockReason, tokenUsage };
|
|
361
|
-
}
|
|
362
|
-
return { error: blockReason };
|
|
363
|
-
}
|
|
364
420
|
else if (candidate.content?.parts) {
|
|
365
421
|
output = (0, util_1.mergeParts)(output, (0, util_1.formatCandidateContents)(candidate));
|
|
366
422
|
}
|