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
@@ -0,0 +1,109 @@
1
+ import type { ApiProvider, CallApiContextParams, CallApiOptionsParams, ProviderResponse } from '../../types/index';
2
+ import type { EnvOverrides } from '../../types/env';
3
+ /**
4
+ * OpenAI Codex SDK Provider
5
+ *
6
+ * This provider requires the @openai/codex-sdk package, which may have a
7
+ * proprietary license and is not installed by default. Users must install it separately:
8
+ * npm install @openai/codex-sdk
9
+ *
10
+ * Key features:
11
+ * - Thread-based conversations with persistence in ~/.codex/sessions
12
+ * - Native JSON schema output with Zod support
13
+ * - Git repository requirement for safety (can be disabled)
14
+ * - Custom binary path override support
15
+ * - Streaming events for real-time progress
16
+ *
17
+ * Thread Management:
18
+ * - No persist_threads: Creates ephemeral thread per call (default)
19
+ * - With persist_threads: Pools threads by cache key for reuse
20
+ * - With thread_id: Resumes specific thread from ~/.codex/sessions
21
+ */
22
+ export interface OpenAICodexSDKConfig {
23
+ apiKey?: string;
24
+ /**
25
+ * Working directory for Codex to operate in
26
+ * Defaults to process.cwd()
27
+ */
28
+ working_dir?: string;
29
+ /**
30
+ * Additional directories the agent can access beyond the working directory.
31
+ * Maps to --add-dir flag in Codex CLI.
32
+ */
33
+ additional_directories?: string[];
34
+ /**
35
+ * Skip Git repository check (Codex requires Git by default)
36
+ */
37
+ skip_git_repo_check?: boolean;
38
+ /**
39
+ * Path to custom codex binary
40
+ */
41
+ codex_path_override?: string;
42
+ /**
43
+ * Model to use (e.g., 'gpt-5.1-codex', 'gpt-4o', 'o3-mini')
44
+ */
45
+ model?: string;
46
+ /**
47
+ * Fallback model if primary model fails
48
+ */
49
+ fallback_model?: string;
50
+ /**
51
+ * Maximum tokens for response
52
+ */
53
+ max_tokens?: number;
54
+ /**
55
+ * Maximum tokens for tool output (default: 10000)
56
+ * Controls how much output from tool calls is included in the context.
57
+ */
58
+ tool_output_token_limit?: number;
59
+ /**
60
+ * Thread management
61
+ */
62
+ thread_id?: string;
63
+ persist_threads?: boolean;
64
+ thread_pool_size?: number;
65
+ /**
66
+ * Output schema for structured JSON responses
67
+ * Supports plain JSON schema or Zod schemas converted with zod-to-json-schema
68
+ */
69
+ output_schema?: Record<string, any>;
70
+ /**
71
+ * Environment variables to pass to Codex CLI
72
+ * By default inherits Node.js process.env
73
+ */
74
+ cli_env?: Record<string, string>;
75
+ /**
76
+ * Custom system instructions
77
+ */
78
+ system_prompt?: string;
79
+ /**
80
+ * Enable streaming events (default: false for simplicity)
81
+ */
82
+ enable_streaming?: boolean;
83
+ }
84
+ export declare class OpenAICodexSDKProvider implements ApiProvider {
85
+ static OPENAI_MODELS: string[];
86
+ config: OpenAICodexSDKConfig;
87
+ env?: EnvOverrides;
88
+ apiKey?: string;
89
+ private providerId;
90
+ private codexModule?;
91
+ private codexInstance?;
92
+ private threads;
93
+ constructor(options?: {
94
+ id?: string;
95
+ config?: OpenAICodexSDKConfig;
96
+ env?: EnvOverrides;
97
+ });
98
+ id(): string;
99
+ getApiKey(): string | undefined;
100
+ toString(): string;
101
+ cleanup(): Promise<void>;
102
+ private prepareEnvironment;
103
+ private validateWorkingDirectory;
104
+ private getOrCreateThread;
105
+ private runStreaming;
106
+ private generateCacheKey;
107
+ callApi(prompt: string, context?: CallApiContextParams, callOptions?: CallApiOptionsParams): Promise<ProviderResponse>;
108
+ }
109
+ //# sourceMappingURL=codex-sdk.d.ts.map
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAICodexSDKProvider = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const dedent_1 = __importDefault(require("dedent"));
11
+ const cliState_1 = __importDefault(require("../../cliState"));
12
+ const envars_1 = require("../../envars");
13
+ const esm_1 = require("../../esm");
14
+ const logger_1 = __importDefault(require("../../logger"));
15
+ /**
16
+ * Helper to load the OpenAI Codex SDK ESM module
17
+ * Uses importModule utility which handles ESM loading in CommonJS environments
18
+ */
19
+ async function loadCodexSDK() {
20
+ try {
21
+ // Resolve the package path, then use importModule to load it
22
+ // The SDK is ESM-only, so we need the importModule utility which uses dynamic-import.cjs
23
+ const basePath = cliState_1.default.basePath && path_1.default.isAbsolute(cliState_1.default.basePath) ? cliState_1.default.basePath : process.cwd();
24
+ // The package only exports ESM, so we construct the direct path
25
+ // The SDK is installed in node_modules/@openai/codex-sdk/dist/index.js
26
+ const modulePath = path_1.default.join(basePath, 'node_modules', '@openai', 'codex-sdk', 'dist', 'index.js');
27
+ return await (0, esm_1.importModule)(modulePath);
28
+ }
29
+ catch (err) {
30
+ logger_1.default.error(`Failed to load OpenAI Codex SDK: ${err}`);
31
+ if (err.stack) {
32
+ logger_1.default.error(err.stack);
33
+ }
34
+ throw new Error((0, dedent_1.default) `The @openai/codex-sdk package is required but not installed.
35
+
36
+ This package may have a proprietary license and is not installed by default.
37
+
38
+ To use the OpenAI Codex SDK provider, install it with:
39
+ npm install @openai/codex-sdk
40
+
41
+ Requires Node.js 18+.
42
+
43
+ For more information, see: https://www.promptfoo.dev/docs/providers/openai-codex-sdk/`);
44
+ }
45
+ }
46
+ // Pricing per 1M tokens (as of November 2025)
47
+ // See: https://openai.com/pricing
48
+ const CODEX_MODEL_PRICING = {
49
+ 'gpt-5.1-codex': { input: 2.0, output: 8.0 },
50
+ 'gpt-5.1-codex-max': { input: 3.0, output: 12.0 },
51
+ 'gpt-5.1-codex-mini': { input: 0.5, output: 2.0 },
52
+ 'gpt-5-codex': { input: 2.0, output: 8.0 },
53
+ 'gpt-5-codex-mini': { input: 0.5, output: 2.0 },
54
+ 'gpt-5': { input: 2.0, output: 8.0 },
55
+ 'gpt-4o': { input: 2.5, output: 10.0 },
56
+ 'gpt-4o-mini': { input: 0.15, output: 0.6 },
57
+ 'gpt-4-turbo': { input: 10.0, output: 30.0 },
58
+ 'gpt-4': { input: 30.0, output: 60.0 },
59
+ 'o3-mini': { input: 1.1, output: 4.4 },
60
+ o1: { input: 15.0, output: 60.0 },
61
+ 'o1-mini': { input: 3.0, output: 12.0 },
62
+ };
63
+ class OpenAICodexSDKProvider {
64
+ constructor(options = {}) {
65
+ this.providerId = 'openai:codex-sdk';
66
+ this.threads = new Map();
67
+ const { config, env, id } = options;
68
+ this.config = config ?? {};
69
+ this.env = env;
70
+ this.apiKey = this.getApiKey();
71
+ this.providerId = id ?? this.providerId;
72
+ if (this.config.model && !OpenAICodexSDKProvider.OPENAI_MODELS.includes(this.config.model)) {
73
+ logger_1.default.warn(`Using unknown model for OpenAI Codex SDK: ${this.config.model}`);
74
+ }
75
+ if (this.config.fallback_model &&
76
+ !OpenAICodexSDKProvider.OPENAI_MODELS.includes(this.config.fallback_model)) {
77
+ logger_1.default.warn(`Using unknown model for OpenAI Codex SDK fallback: ${this.config.fallback_model}`);
78
+ }
79
+ }
80
+ id() {
81
+ return this.providerId;
82
+ }
83
+ getApiKey() {
84
+ return (this.config?.apiKey ||
85
+ this.env?.OPENAI_API_KEY ||
86
+ this.env?.CODEX_API_KEY ||
87
+ (0, envars_1.getEnvString)('OPENAI_API_KEY') ||
88
+ (0, envars_1.getEnvString)('CODEX_API_KEY'));
89
+ }
90
+ toString() {
91
+ return '[OpenAI Codex SDK Provider]';
92
+ }
93
+ async cleanup() {
94
+ this.threads.clear();
95
+ }
96
+ prepareEnvironment(config) {
97
+ const env = config.cli_env
98
+ ? { ...config.cli_env }
99
+ : { ...process.env };
100
+ // Sort keys for stable cache key generation
101
+ const sortedEnv = {};
102
+ for (const key of Object.keys(env).sort()) {
103
+ if (env[key] !== undefined) {
104
+ sortedEnv[key] = env[key];
105
+ }
106
+ }
107
+ // Inject API key
108
+ if (this.apiKey) {
109
+ sortedEnv.OPENAI_API_KEY = this.apiKey;
110
+ sortedEnv.CODEX_API_KEY = this.apiKey;
111
+ }
112
+ // Inject env overrides
113
+ if (this.env) {
114
+ for (const key of Object.keys(this.env).sort()) {
115
+ const value = this.env[key];
116
+ if (value !== undefined) {
117
+ sortedEnv[key] = value;
118
+ }
119
+ }
120
+ }
121
+ return sortedEnv;
122
+ }
123
+ validateWorkingDirectory(workingDir, skipGitCheck = false) {
124
+ let stats;
125
+ try {
126
+ stats = fs_1.default.statSync(workingDir);
127
+ }
128
+ catch (err) {
129
+ throw new Error(`Working directory ${workingDir} does not exist or isn't accessible: ${err.message}`);
130
+ }
131
+ if (!stats.isDirectory()) {
132
+ throw new Error(`Working directory ${workingDir} is not a directory`);
133
+ }
134
+ if (!skipGitCheck) {
135
+ const gitDir = path_1.default.join(workingDir, '.git');
136
+ if (!fs_1.default.existsSync(gitDir)) {
137
+ throw new Error((0, dedent_1.default) `Working directory ${workingDir} is not a Git repository.
138
+
139
+ Codex requires a Git repository by default to prevent unrecoverable errors.
140
+
141
+ To bypass this check, set skip_git_repo_check: true in your provider config.`);
142
+ }
143
+ }
144
+ }
145
+ async getOrCreateThread(config, cacheKey) {
146
+ // Resume specific thread
147
+ if (config.thread_id) {
148
+ const cached = this.threads.get(config.thread_id);
149
+ if (cached) {
150
+ return cached;
151
+ }
152
+ const thread = this.codexInstance.resumeThread(config.thread_id);
153
+ if (config.persist_threads) {
154
+ this.threads.set(config.thread_id, thread);
155
+ }
156
+ return thread;
157
+ }
158
+ // Use pooled thread
159
+ if (config.persist_threads && cacheKey) {
160
+ const cached = this.threads.get(cacheKey);
161
+ if (cached) {
162
+ return cached;
163
+ }
164
+ // Enforce pool size limit
165
+ const poolSize = config.thread_pool_size ?? 1;
166
+ if (this.threads.size >= poolSize) {
167
+ const oldestKey = this.threads.keys().next().value;
168
+ if (oldestKey) {
169
+ this.threads.delete(oldestKey);
170
+ }
171
+ }
172
+ }
173
+ // Create new thread
174
+ const thread = this.codexInstance.startThread({
175
+ workingDirectory: config.working_dir,
176
+ skipGitRepoCheck: config.skip_git_repo_check ?? false,
177
+ ...(config.model ? { model: config.model } : {}),
178
+ ...(config.additional_directories?.length
179
+ ? { additionalDirectories: config.additional_directories }
180
+ : {}),
181
+ });
182
+ if (config.persist_threads && cacheKey) {
183
+ this.threads.set(cacheKey, thread);
184
+ }
185
+ return thread;
186
+ }
187
+ async runStreaming(thread, prompt, runOptions, callOptions) {
188
+ const { events } = await thread.runStreamed(prompt, runOptions);
189
+ const items = [];
190
+ let usage = undefined;
191
+ for await (const event of events) {
192
+ // Check abort signal
193
+ if (callOptions?.abortSignal?.aborted) {
194
+ throw new Error('AbortError');
195
+ }
196
+ switch (event.type) {
197
+ case 'item.completed':
198
+ items.push(event.item);
199
+ logger_1.default.debug('Codex item completed', { item: event.item });
200
+ break;
201
+ case 'turn.completed':
202
+ usage = event.usage;
203
+ logger_1.default.debug('Codex turn completed', { usage });
204
+ break;
205
+ }
206
+ }
207
+ // Extract text from agent_message items for final response
208
+ const agentMessages = items.filter((i) => i.type === 'agent_message');
209
+ const finalResponse = agentMessages.length > 0 ? agentMessages.map((i) => i.text).join('\n') : '';
210
+ return {
211
+ finalResponse,
212
+ items,
213
+ usage,
214
+ };
215
+ }
216
+ generateCacheKey(config, prompt) {
217
+ const keyData = {
218
+ working_dir: config.working_dir,
219
+ additional_directories: config.additional_directories,
220
+ model: config.model,
221
+ output_schema: config.output_schema,
222
+ tool_output_token_limit: config.tool_output_token_limit,
223
+ prompt,
224
+ };
225
+ const hash = crypto_1.default.createHash('sha256').update(JSON.stringify(keyData)).digest('hex');
226
+ return `openai:codex-sdk:${hash}`;
227
+ }
228
+ async callApi(prompt, context, callOptions) {
229
+ // Merge configs (prompt config takes precedence)
230
+ const config = {
231
+ ...this.config,
232
+ ...context?.prompt?.config,
233
+ };
234
+ // Prepare environment
235
+ const env = this.prepareEnvironment(config);
236
+ if (!this.apiKey && !env.OPENAI_API_KEY && !env.CODEX_API_KEY) {
237
+ throw new Error('OpenAI API key is not set. Set OPENAI_API_KEY or CODEX_API_KEY environment variable or add "apiKey" to provider config.');
238
+ }
239
+ // Validate working directory
240
+ if (config.working_dir) {
241
+ this.validateWorkingDirectory(config.working_dir, config.skip_git_repo_check);
242
+ }
243
+ // Check abort signal
244
+ if (callOptions?.abortSignal?.aborted) {
245
+ return { error: 'OpenAI Codex SDK call aborted before it started' };
246
+ }
247
+ // Load SDK module (lazy)
248
+ if (!this.codexModule) {
249
+ this.codexModule = await loadCodexSDK();
250
+ }
251
+ // Initialize Codex instance (lazy)
252
+ if (!this.codexInstance) {
253
+ this.codexInstance = new this.codexModule.Codex({
254
+ env,
255
+ ...(config.codex_path_override ? { codexPathOverride: config.codex_path_override } : {}),
256
+ });
257
+ }
258
+ // Get or create thread
259
+ const cacheKey = this.generateCacheKey(config, prompt);
260
+ const thread = await this.getOrCreateThread(config, cacheKey);
261
+ // Prepare run options
262
+ const runOptions = {};
263
+ if (config.output_schema) {
264
+ runOptions.outputSchema = config.output_schema;
265
+ }
266
+ if (config.tool_output_token_limit !== undefined) {
267
+ runOptions.toolOutputTokenLimit = config.tool_output_token_limit;
268
+ }
269
+ // Execute turn
270
+ try {
271
+ const turn = config.enable_streaming
272
+ ? await this.runStreaming(thread, prompt, runOptions, callOptions)
273
+ : await thread.run(prompt, runOptions);
274
+ // Extract response
275
+ const output = turn.finalResponse || '';
276
+ const raw = JSON.stringify(turn);
277
+ const tokenUsage = turn.usage
278
+ ? {
279
+ prompt: turn.usage.input_tokens + (turn.usage.cached_input_tokens || 0),
280
+ completion: turn.usage.output_tokens,
281
+ total: turn.usage.input_tokens +
282
+ (turn.usage.cached_input_tokens || 0) +
283
+ turn.usage.output_tokens,
284
+ }
285
+ : undefined;
286
+ // Calculate cost from usage
287
+ let cost = 0;
288
+ if (tokenUsage && config.model) {
289
+ const pricing = CODEX_MODEL_PRICING[config.model];
290
+ if (pricing) {
291
+ // Pricing is per 1M tokens
292
+ const inputCost = (tokenUsage.prompt || 0) * (pricing.input / 1000000);
293
+ const outputCost = (tokenUsage.completion || 0) * (pricing.output / 1000000);
294
+ cost = inputCost + outputCost;
295
+ }
296
+ }
297
+ logger_1.default.debug('OpenAI Codex SDK response', { output, usage: turn.usage });
298
+ return {
299
+ output,
300
+ tokenUsage,
301
+ cost,
302
+ raw,
303
+ sessionId: thread.id || 'unknown',
304
+ };
305
+ }
306
+ catch (error) {
307
+ const isAbort = error?.name === 'AbortError' || callOptions?.abortSignal?.aborted;
308
+ if (isAbort) {
309
+ logger_1.default.warn('OpenAI Codex SDK call aborted');
310
+ return { error: 'OpenAI Codex SDK call aborted' };
311
+ }
312
+ logger_1.default.error('Error calling OpenAI Codex SDK', { error: error.message });
313
+ return {
314
+ error: `Error calling OpenAI Codex SDK: ${error.message}`,
315
+ };
316
+ }
317
+ finally {
318
+ // Clean up ephemeral threads
319
+ if (!config.persist_threads && !config.thread_id && cacheKey) {
320
+ this.threads.delete(cacheKey);
321
+ }
322
+ }
323
+ }
324
+ }
325
+ exports.OpenAICodexSDKProvider = OpenAICodexSDKProvider;
326
+ OpenAICodexSDKProvider.OPENAI_MODELS = [
327
+ // GPT-5.1 Codex models (recommended for code tasks)
328
+ 'gpt-5.1-codex',
329
+ 'gpt-5.1-codex-max',
330
+ 'gpt-5.1-codex-mini',
331
+ // GPT-5 Codex models
332
+ 'gpt-5-codex',
333
+ 'gpt-5-codex-mini',
334
+ // GPT-5 base
335
+ 'gpt-5',
336
+ // GPT-4 models
337
+ 'gpt-4',
338
+ 'gpt-4-turbo',
339
+ 'gpt-4o',
340
+ 'gpt-4o-mini',
341
+ // Reasoning models
342
+ 'o1',
343
+ 'o1-mini',
344
+ 'o3-mini',
345
+ ];
346
+ //# sourceMappingURL=codex-sdk.js.map
@@ -1,9 +1,11 @@
1
1
  import { OpenAiChatCompletionProvider } from './chat';
2
2
  import { OpenAiEmbeddingProvider } from './embedding';
3
3
  import { OpenAiModerationProvider } from './moderation';
4
+ import { OpenAiResponsesProvider } from './responses';
4
5
  export declare const DefaultEmbeddingProvider: OpenAiEmbeddingProvider;
5
6
  export declare const DefaultGradingProvider: OpenAiChatCompletionProvider;
6
7
  export declare const DefaultGradingJsonProvider: OpenAiChatCompletionProvider;
7
8
  export declare const DefaultSuggestionsProvider: OpenAiChatCompletionProvider;
8
9
  export declare const DefaultModerationProvider: OpenAiModerationProvider;
10
+ export declare const DefaultWebSearchProvider: OpenAiResponsesProvider;
9
11
  //# sourceMappingURL=defaults.d.ts.map
@@ -1,16 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DefaultModerationProvider = exports.DefaultSuggestionsProvider = exports.DefaultGradingJsonProvider = exports.DefaultGradingProvider = exports.DefaultEmbeddingProvider = void 0;
3
+ exports.DefaultWebSearchProvider = exports.DefaultModerationProvider = exports.DefaultSuggestionsProvider = exports.DefaultGradingJsonProvider = exports.DefaultGradingProvider = exports.DefaultEmbeddingProvider = void 0;
4
4
  const chat_1 = require("./chat");
5
5
  const embedding_1 = require("./embedding");
6
6
  const moderation_1 = require("./moderation");
7
+ const responses_1 = require("./responses");
7
8
  exports.DefaultEmbeddingProvider = new embedding_1.OpenAiEmbeddingProvider('text-embedding-3-large');
8
- exports.DefaultGradingProvider = new chat_1.OpenAiChatCompletionProvider('gpt-4.1-2025-04-14');
9
- exports.DefaultGradingJsonProvider = new chat_1.OpenAiChatCompletionProvider('gpt-4.1-2025-04-14', {
9
+ exports.DefaultGradingProvider = new chat_1.OpenAiChatCompletionProvider('gpt-5-2025-08-07');
10
+ exports.DefaultGradingJsonProvider = new chat_1.OpenAiChatCompletionProvider('gpt-5-2025-08-07', {
10
11
  config: {
11
12
  response_format: { type: 'json_object' },
12
13
  },
13
14
  });
14
- exports.DefaultSuggestionsProvider = new chat_1.OpenAiChatCompletionProvider('gpt-4.1-2025-04-14');
15
+ exports.DefaultSuggestionsProvider = new chat_1.OpenAiChatCompletionProvider('gpt-5-2025-08-07');
15
16
  exports.DefaultModerationProvider = new moderation_1.OpenAiModerationProvider('omni-moderation-latest');
17
+ exports.DefaultWebSearchProvider = new responses_1.OpenAiResponsesProvider('gpt-5.1', {
18
+ config: {
19
+ tools: [{ type: 'web_search_preview' }],
20
+ },
21
+ });
16
22
  //# sourceMappingURL=defaults.js.map
@@ -68,6 +68,7 @@ const foundry_agent_1 = require("./azure/foundry-agent");
68
68
  const moderation_1 = require("./azure/moderation");
69
69
  const responses_1 = require("./azure/responses");
70
70
  const index_4 = require("./bedrock/index");
71
+ const converse_1 = require("./bedrock/converse");
71
72
  const browser_1 = require("./browser");
72
73
  const cerebras_1 = require("./cerebras");
73
74
  const cloudera_1 = require("./cloudera");
@@ -83,7 +84,7 @@ const ai_studio_1 = require("./google/ai.studio");
83
84
  const image_1 = require("./google/image");
84
85
  const live_1 = require("./google/live");
85
86
  const vertex_1 = require("./google/vertex");
86
- const groq_1 = require("./groq");
87
+ const index_6 = require("./groq/index");
87
88
  const helicone_1 = require("./helicone");
88
89
  const http_1 = require("./http");
89
90
  const huggingface_1 = require("./huggingface");
@@ -92,11 +93,10 @@ const llama_1 = require("./llama");
92
93
  const llamaApi_1 = require("./llamaApi");
93
94
  const localai_1 = require("./localai");
94
95
  const manualInput_1 = require("./manualInput");
95
- const index_6 = require("./mcp/index");
96
+ const index_7 = require("./mcp/index");
96
97
  const mistral_1 = require("./mistral");
97
98
  const nscale_1 = require("./nscale");
98
99
  const ollama_1 = require("./ollama");
99
- const agents_1 = require("./openai/agents");
100
100
  const assistant_2 = require("./openai/assistant");
101
101
  const chat_2 = require("./openai/chat");
102
102
  const completion_3 = require("./openai/completion");
@@ -126,6 +126,7 @@ const webhook_1 = require("./webhook");
126
126
  const websocket_1 = require("./websocket");
127
127
  const chat_3 = require("./xai/chat");
128
128
  const image_3 = require("./xai/image");
129
+ const responses_3 = require("./xai/responses");
129
130
  exports.providerMap = [
130
131
  (0, scriptBasedProvider_1.createScriptBasedProviderFactory)('exec', null, scriptCompletion_1.ScriptCompletionProvider),
131
132
  (0, scriptBasedProvider_1.createScriptBasedProviderFactory)('golang', 'go', golangCompletion_1.GolangProvider),
@@ -270,6 +271,10 @@ exports.providerMap = [
270
271
  const splits = providerPath.split(':');
271
272
  const modelType = splits[1];
272
273
  const modelName = splits.slice(2).join(':');
274
+ // Handle Converse API
275
+ if (modelType === 'converse') {
276
+ return new converse_1.AwsBedrockConverseProvider(modelName, providerOptions);
277
+ }
273
278
  // Handle nova-sonic model
274
279
  if (modelType === 'nova-sonic' || modelType.includes('amazon.nova-sonic')) {
275
280
  const { NovaSonicProvider } = await Promise.resolve().then(() => __importStar(require('./bedrock/nova-sonic')));
@@ -469,8 +474,22 @@ exports.providerMap = [
469
474
  {
470
475
  test: (providerPath) => providerPath.startsWith('groq:'),
471
476
  create: async (providerPath, providerOptions, _context) => {
472
- const modelName = providerPath.split(':')[1];
473
- return new groq_1.GroqProvider(modelName, providerOptions);
477
+ // Handle groq:responses:<model> format for Responses API
478
+ if (providerPath.startsWith('groq:responses:')) {
479
+ const modelName = providerPath.slice('groq:responses:'.length);
480
+ if (!modelName) {
481
+ throw new Error(`Invalid groq:responses provider path: "${providerPath}". ` +
482
+ 'Use format groq:responses:<model> (e.g., groq:responses:llama-3.3-70b-versatile)');
483
+ }
484
+ return new index_6.GroqResponsesProvider(modelName, providerOptions);
485
+ }
486
+ // Handle groq:<model> format for Chat Completions API
487
+ const modelName = providerPath.slice('groq:'.length);
488
+ if (!modelName) {
489
+ throw new Error(`Invalid groq provider path: "${providerPath}". ` +
490
+ 'Use format groq:<model> (e.g., groq:llama-3.3-70b-versatile)');
491
+ }
492
+ return new index_6.GroqProvider(modelName, providerOptions);
474
493
  },
475
494
  },
476
495
  {
@@ -583,11 +602,19 @@ exports.providerMap = [
583
602
  },
584
603
  {
585
604
  test: (providerPath) => providerPath.startsWith('openai:'),
586
- create: async (providerPath, providerOptions, _context) => {
605
+ create: async (providerPath, providerOptions, context) => {
587
606
  // Load OpenAI module
588
607
  const splits = providerPath.split(':');
589
608
  const modelType = splits[1];
590
609
  const modelName = splits.slice(2).join(':');
610
+ // Codex SDK providers (openai:codex-sdk or openai:codex)
611
+ if (modelType === 'codex-sdk' || modelType === 'codex') {
612
+ const { OpenAICodexSDKProvider } = await Promise.resolve().then(() => __importStar(require('./openai/codex-sdk')));
613
+ return new OpenAICodexSDKProvider({
614
+ ...providerOptions,
615
+ env: context.env,
616
+ });
617
+ }
591
618
  if (modelType === 'chat') {
592
619
  return new chat_2.OpenAiChatCompletionProvider(modelName || 'gpt-4.1-2025-04-14', providerOptions);
593
620
  }
@@ -623,7 +650,12 @@ exports.providerMap = [
623
650
  return new responses_2.OpenAiResponsesProvider(modelType, providerOptions);
624
651
  }
625
652
  if (modelType === 'agents') {
626
- return new agents_1.OpenAiAgentsProvider(modelName || 'default-agent', providerOptions);
653
+ const { OpenAiAgentsProvider } = await Promise.resolve().then(() => __importStar(require('./openai/agents')));
654
+ return new OpenAiAgentsProvider(modelName || 'default-agent', providerOptions);
655
+ }
656
+ if (modelType === 'chatkit') {
657
+ const { OpenAiChatKitProvider } = await Promise.resolve().then(() => __importStar(require('./openai/chatkit')));
658
+ return new OpenAiChatKitProvider(modelName || '', providerOptions);
627
659
  }
628
660
  if (modelType === 'assistant') {
629
661
  return new assistant_2.OpenAiAssistantProvider(modelName, providerOptions);
@@ -632,7 +664,7 @@ exports.providerMap = [
632
664
  return new image_2.OpenAiImageProvider(modelName, providerOptions);
633
665
  }
634
666
  // Assume user did not provide model type, and it's a chat model
635
- logger_1.default.warn(`Unknown OpenAI model type: ${modelType}. Treating it as a chat model. Use one of the following providers: openai:chat:<model name>, openai:completion:<model name>, openai:embeddings:<model name>, openai:image:<model name>, openai:realtime:<model name>, openai:agents:<agent name>`);
667
+ logger_1.default.warn(`Unknown OpenAI model type: ${modelType}. Treating it as a chat model. Use one of the following providers: openai:chat:<model name>, openai:completion:<model name>, openai:embeddings:<model name>, openai:image:<model name>, openai:realtime:<model name>, openai:agents:<agent name>, openai:chatkit:<workflow_id>, openai:codex-sdk`);
636
668
  return new chat_2.OpenAiChatCompletionProvider(modelType, providerOptions);
637
669
  },
638
670
  },
@@ -789,6 +821,13 @@ exports.providerMap = [
789
821
  env: context.env,
790
822
  });
791
823
  }
824
+ // Handle xai:responses:<model> format for Agent Tools API
825
+ if (modelType === 'responses') {
826
+ return (0, responses_3.createXAIResponsesProvider)(providerPath, {
827
+ ...providerOptions,
828
+ env: context.env,
829
+ });
830
+ }
792
831
  // Handle regular xai:<model> format
793
832
  return (0, chat_3.createXAIProvider)(providerPath, {
794
833
  config: providerOptions,
@@ -877,7 +916,7 @@ exports.providerMap = [
877
916
  serverName,
878
917
  };
879
918
  }
880
- return new index_6.MCPProvider({
919
+ return new index_7.MCPProvider({
881
920
  config,
882
921
  id: providerOptions.id,
883
922
  });
@@ -1,7 +1,7 @@
1
1
  import type { FunctionCallbackHandler } from '../functionCallbackUtils';
2
2
  export interface ProcessorConfig {
3
3
  modelName: string;
4
- providerType: 'openai' | 'azure';
4
+ providerType: 'openai' | 'azure' | 'xai';
5
5
  functionCallbackHandler: FunctionCallbackHandler;
6
6
  costCalculator: (modelName: string, usage: any, config?: any) => number;
7
7
  }
@@ -40,11 +40,11 @@ declare const SageMakerConfigSchema: z.ZodObject<{
40
40
  basePath?: string | undefined;
41
41
  maxTokens?: number | undefined;
42
42
  temperature?: number | undefined;
43
- contentType?: string | undefined;
44
43
  accessKeyId?: string | undefined;
45
44
  secretAccessKey?: string | undefined;
46
45
  sessionToken?: string | undefined;
47
46
  region?: string | undefined;
47
+ contentType?: string | undefined;
48
48
  topP?: number | undefined;
49
49
  stopSequences?: string[] | undefined;
50
50
  responseFormat?: {
@@ -61,11 +61,11 @@ declare const SageMakerConfigSchema: z.ZodObject<{
61
61
  basePath?: string | undefined;
62
62
  maxTokens?: number | undefined;
63
63
  temperature?: number | undefined;
64
- contentType?: string | undefined;
65
64
  accessKeyId?: string | undefined;
66
65
  secretAccessKey?: string | undefined;
67
66
  sessionToken?: string | undefined;
68
67
  region?: string | undefined;
68
+ contentType?: string | undefined;
69
69
  topP?: number | undefined;
70
70
  stopSequences?: string[] | undefined;
71
71
  responseFormat?: {