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.
Files changed (131) hide show
  1. package/dist/package.json +28 -26
  2. package/dist/src/app/assets/index-eJ2lMe94.js +51 -0
  3. package/dist/src/app/assets/{source-map-support-Bnh0UQ2S.js → source-map-support-1v4oeb7P.js} +1 -1
  4. package/dist/src/app/assets/sync-CtLQRuC1.js +1 -0
  5. package/dist/src/app/assets/{vendor-charts-T60Uk0Z3.js → vendor-charts-DnVv66VV.js} +1 -1
  6. package/dist/src/app/assets/{vendor-markdown-DLig-KJh.js → vendor-markdown-DCpQIyMA.js} +1 -1
  7. package/dist/src/app/assets/{vendor-mui-core-5BLaiG3c.js → vendor-mui-core-Boqnpf9f.js} +1 -1
  8. package/dist/src/app/assets/{vendor-mui-icons-fn39Fu2e.js → vendor-mui-icons-B8MqoVbj.js} +1 -1
  9. package/dist/src/app/assets/vendor-mui-x-CGSS6QHF.js +45 -0
  10. package/dist/src/app/assets/{vendor-utils-DYBMEuwX.js → vendor-utils-DdfHIEy8.js} +1 -1
  11. package/dist/src/app/index.html +7 -7
  12. package/dist/src/assertions/guardrails.d.ts +1 -1
  13. package/dist/src/assertions/guardrails.js +18 -9
  14. package/dist/src/assertions/index.d.ts +1 -1
  15. package/dist/src/assertions/index.js +9 -3
  16. package/dist/src/assertions/searchRubric.d.ts +3 -0
  17. package/dist/src/assertions/searchRubric.js +18 -0
  18. package/dist/src/commands/eval.js +1 -1
  19. package/dist/src/commands/modelScan.d.ts +7 -1
  20. package/dist/src/commands/modelScan.js +121 -59
  21. package/dist/src/database/index.d.ts +6 -0
  22. package/dist/src/database/index.js +11 -0
  23. package/dist/src/database/tables.d.ts +46 -24
  24. package/dist/src/envars.d.ts +17 -0
  25. package/dist/src/generated/constants.js +1 -1
  26. package/dist/src/logger.d.ts +5 -0
  27. package/dist/src/logger.js +28 -0
  28. package/dist/src/main.js +17 -6
  29. package/dist/src/matchers.d.ts +1 -0
  30. package/dist/src/matchers.js +80 -0
  31. package/dist/src/models/eval.d.ts +2 -1
  32. package/dist/src/models/eval.js +44 -2
  33. package/dist/src/prompts/grading.d.ts +1 -0
  34. package/dist/src/prompts/grading.js +26 -1
  35. package/dist/src/prompts/index.d.ts +1 -0
  36. package/dist/src/prompts/index.js +4 -1
  37. package/dist/src/providers/adaline.gateway.js +2 -2
  38. package/dist/src/providers/anthropic/defaults.d.ts +1 -1
  39. package/dist/src/providers/anthropic/defaults.js +15 -0
  40. package/dist/src/providers/azure/chat.d.ts +3 -1
  41. package/dist/src/providers/azure/chat.js +16 -3
  42. package/dist/src/providers/azure/defaults.js +660 -141
  43. package/dist/src/providers/azure/responses.d.ts +5 -0
  44. package/dist/src/providers/azure/responses.js +33 -4
  45. package/dist/src/providers/azure/types.d.ts +4 -0
  46. package/dist/src/providers/bedrock/agents.d.ts +1 -1
  47. package/dist/src/providers/bedrock/agents.js +2 -2
  48. package/dist/src/providers/bedrock/base.d.ts +40 -0
  49. package/dist/src/providers/bedrock/base.js +171 -0
  50. package/dist/src/providers/bedrock/converse.d.ts +146 -0
  51. package/dist/src/providers/bedrock/converse.js +1044 -0
  52. package/dist/src/providers/bedrock/index.d.ts +1 -34
  53. package/dist/src/providers/bedrock/index.js +4 -159
  54. package/dist/src/providers/bedrock/knowledgeBase.d.ts +1 -1
  55. package/dist/src/providers/bedrock/knowledgeBase.js +2 -2
  56. package/dist/src/providers/bedrock/nova-sonic.d.ts +2 -1
  57. package/dist/src/providers/bedrock/nova-sonic.js +2 -2
  58. package/dist/src/providers/claude-agent-sdk.d.ts +58 -1
  59. package/dist/src/providers/claude-agent-sdk.js +22 -1
  60. package/dist/src/providers/defaults.js +4 -0
  61. package/dist/src/providers/github/defaults.js +6 -6
  62. package/dist/src/providers/google/types.d.ts +25 -0
  63. package/dist/src/providers/google/util.d.ts +2 -0
  64. package/dist/src/providers/google/vertex.js +78 -22
  65. package/dist/src/providers/{groq.d.ts → groq/chat.d.ts} +26 -20
  66. package/dist/src/providers/groq/chat.js +79 -0
  67. package/dist/src/providers/groq/index.d.ts +5 -0
  68. package/dist/src/providers/groq/index.js +24 -0
  69. package/dist/src/providers/groq/responses.d.ts +106 -0
  70. package/dist/src/providers/groq/responses.js +64 -0
  71. package/dist/src/providers/groq/types.d.ts +44 -0
  72. package/dist/src/providers/groq/types.js +3 -0
  73. package/dist/src/providers/groq/util.d.ts +15 -0
  74. package/dist/src/providers/groq/util.js +28 -0
  75. package/dist/src/providers/mcp/client.d.ts +8 -0
  76. package/dist/src/providers/mcp/client.js +60 -10
  77. package/dist/src/providers/mcp/types.d.ts +21 -0
  78. package/dist/src/providers/openai/chatkit-pool.d.ts +114 -0
  79. package/dist/src/providers/openai/chatkit-pool.js +548 -0
  80. package/dist/src/providers/openai/chatkit-types.d.ts +73 -0
  81. package/dist/src/providers/openai/chatkit-types.js +3 -0
  82. package/dist/src/providers/openai/chatkit.d.ts +76 -0
  83. package/dist/src/providers/openai/chatkit.js +879 -0
  84. package/dist/src/providers/openai/codex-sdk.d.ts +109 -0
  85. package/dist/src/providers/openai/codex-sdk.js +346 -0
  86. package/dist/src/providers/openai/defaults.d.ts +2 -0
  87. package/dist/src/providers/openai/defaults.js +10 -4
  88. package/dist/src/providers/registry.js +48 -9
  89. package/dist/src/providers/responses/types.d.ts +1 -1
  90. package/dist/src/providers/sagemaker.d.ts +2 -2
  91. package/dist/src/providers/webSearchUtils.d.ts +17 -0
  92. package/dist/src/providers/webSearchUtils.js +169 -0
  93. package/dist/src/providers/xai/chat.d.ts +61 -0
  94. package/dist/src/providers/xai/chat.js +68 -3
  95. package/dist/src/providers/xai/responses.d.ts +189 -0
  96. package/dist/src/providers/xai/responses.js +268 -0
  97. package/dist/src/redteam/constants/plugins.d.ts +1 -1
  98. package/dist/src/redteam/constants/plugins.js +1 -1
  99. package/dist/src/redteam/constants/strategies.d.ts +1 -1
  100. package/dist/src/redteam/constants/strategies.js +1 -0
  101. package/dist/src/redteam/plugins/vlguard.d.ts +53 -4
  102. package/dist/src/redteam/plugins/vlguard.js +362 -46
  103. package/dist/src/redteam/providers/constants.d.ts +2 -2
  104. package/dist/src/redteam/providers/constants.js +2 -2
  105. package/dist/src/redteam/providers/crescendo/index.d.ts +1 -1
  106. package/dist/src/redteam/providers/crescendo/index.js +5 -3
  107. package/dist/src/redteam/providers/hydra/index.js +1 -1
  108. package/dist/src/server/routes/modelAudit.js +4 -4
  109. package/dist/src/share.js +4 -2
  110. package/dist/src/telemetry.js +44 -8
  111. package/dist/src/types/env.d.ts +3 -0
  112. package/dist/src/types/env.js +1 -0
  113. package/dist/src/types/index.d.ts +896 -615
  114. package/dist/src/types/index.js +1 -0
  115. package/dist/src/types/providers.d.ts +1 -0
  116. package/dist/src/types/tracing.d.ts +3 -0
  117. package/dist/src/util/database.d.ts +6 -4
  118. package/dist/src/util/file.js +6 -4
  119. package/dist/src/util/modelAuditCliParser.d.ts +4 -4
  120. package/dist/src/util/xlsx.js +52 -26
  121. package/dist/src/validators/providers.d.ts +142 -122
  122. package/dist/src/validators/providers.js +4 -6
  123. package/dist/src/validators/redteam.d.ts +36 -28
  124. package/dist/src/validators/redteam.js +9 -3
  125. package/dist/tsconfig.tsbuildinfo +1 -1
  126. package/package.json +28 -26
  127. package/dist/drizzle/CLAUDE.md +0 -65
  128. package/dist/src/app/assets/index-DifT6VGT.js +0 -51
  129. package/dist/src/app/assets/sync-Oo-W_Rbj.js +0 -1
  130. package/dist/src/app/assets/vendor-mui-x-C2xF-yiO.js +0 -45
  131. package/dist/src/providers/groq.js +0 -48
@@ -1,24 +1,8 @@
1
- import type { BedrockRuntime, Trace } from '@aws-sdk/client-bedrock-runtime';
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.AwsBedrockGenericProvider = exports.AWS_BEDROCK_MODELS = exports.BEDROCK_MODEL = exports.getLlamaModelHandler = exports.formatPromptLlama4 = exports.formatPromptLlama3Instruct = exports.formatPromptLlama2Chat = exports.LlamaVersion = exports.coerceStrToNum = void 0;
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 './index';
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 index_1 = require("./index");
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 index_1.AwsBedrockGenericProvider {
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, type BedrockAmazonNovaSonicGenerationOptions } from '.';
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 _1 = require(".");
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 _1.AwsBedrockGenericProvider {
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: msg.result,
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-4.1', {
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-4.1', {
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-4.1', {
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-4.1-nano', {
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-4.1-mini', {
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/o3-mini', {
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;
@@ -37,6 +37,8 @@ export interface GeminiResponseData {
37
37
  probability: string;
38
38
  }>;
39
39
  blockReason: any;
40
+ /** Message explaining why content was blocked (e.g., by Model Armor) */
41
+ blockReasonMessage?: string;
40
42
  };
41
43
  }
42
44
  interface GeminiPromptFeedback {
@@ -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
- // Calculate token usage even for safety-blocked responses
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
  }