@standardagents/openai 0.41.25 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +105 -17
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
} from "./chunk-ESFAYEBL.js";
|
|
5
5
|
|
|
6
6
|
// src/OpenAIProvider.ts
|
|
7
|
-
import { ProviderError, defineTool } from "@standardagents/spec";
|
|
7
|
+
import { ProviderError as ProviderError2, defineTool } from "@standardagents/spec";
|
|
8
8
|
import { z } from "zod";
|
|
9
9
|
|
|
10
10
|
// src/transformers.ts
|
|
11
|
-
import { mapReasoningLevel } from "@standardagents/spec";
|
|
11
|
+
import { ProviderError, mapReasoningLevel } from "@standardagents/spec";
|
|
12
12
|
var DEFAULT_REASONING_LEVELS = {
|
|
13
13
|
0: null,
|
|
14
14
|
33: "low",
|
|
@@ -209,6 +209,7 @@ function isObjectJsonSchema(schema) {
|
|
|
209
209
|
const type = schema.type;
|
|
210
210
|
return type === "object" || Array.isArray(type) && type.includes("object");
|
|
211
211
|
}
|
|
212
|
+
var ANY_OF_ANNOTATION_KEYS = ["description", "title"];
|
|
212
213
|
function normalizeStrictFunctionSchema(value) {
|
|
213
214
|
if (Array.isArray(value)) {
|
|
214
215
|
return value.map((item) => normalizeStrictFunctionSchema(item));
|
|
@@ -216,6 +217,15 @@ function normalizeStrictFunctionSchema(value) {
|
|
|
216
217
|
if (!isRecord(value)) {
|
|
217
218
|
return value;
|
|
218
219
|
}
|
|
220
|
+
if (Array.isArray(value.anyOf)) {
|
|
221
|
+
const normalized2 = {
|
|
222
|
+
anyOf: value.anyOf.map((item) => normalizeStrictFunctionSchema(item))
|
|
223
|
+
};
|
|
224
|
+
for (const key of ANY_OF_ANNOTATION_KEYS) {
|
|
225
|
+
if (key in value) normalized2[key] = value[key];
|
|
226
|
+
}
|
|
227
|
+
return normalized2;
|
|
228
|
+
}
|
|
219
229
|
const normalized = {};
|
|
220
230
|
for (const [key, child] of Object.entries(value)) {
|
|
221
231
|
normalized[key] = normalizeStrictFunctionSchema(child);
|
|
@@ -295,6 +305,24 @@ function mapFinishReason(response) {
|
|
|
295
305
|
}
|
|
296
306
|
return "stop";
|
|
297
307
|
}
|
|
308
|
+
function unusableResponseError(response) {
|
|
309
|
+
if (response.status === "failed") {
|
|
310
|
+
return {
|
|
311
|
+
message: response.error?.message || "Response generation failed",
|
|
312
|
+
code: response.error?.code || "server_error"
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
if (response.status !== "incomplete") return null;
|
|
316
|
+
const output = Array.isArray(response.output) ? response.output : [];
|
|
317
|
+
const hasToolCalls = output.some((item) => item.type === "function_call");
|
|
318
|
+
const text = extractTextContent(output);
|
|
319
|
+
if (hasToolCalls || text !== null && text.length > 0) return null;
|
|
320
|
+
const reason = response.incomplete_details?.reason ?? "unknown";
|
|
321
|
+
return {
|
|
322
|
+
message: `OpenAI returned an incomplete response with no output (reason: ${reason})` + (response.error?.message ? `: ${response.error.message}` : ""),
|
|
323
|
+
code: response.error?.code || "invalid_request"
|
|
324
|
+
};
|
|
325
|
+
}
|
|
298
326
|
function extractTextContent(output) {
|
|
299
327
|
const textParts = [];
|
|
300
328
|
for (const item of output) {
|
|
@@ -496,6 +524,12 @@ function transformUsage(usage, modelId) {
|
|
|
496
524
|
return transformed;
|
|
497
525
|
}
|
|
498
526
|
function transformResponse(response) {
|
|
527
|
+
const unusable = unusableResponseError(response);
|
|
528
|
+
if (unusable) {
|
|
529
|
+
throw new ProviderError(unusable.message, toProviderErrorCode(unusable.code), void 0, void 0, {
|
|
530
|
+
cause: response
|
|
531
|
+
});
|
|
532
|
+
}
|
|
499
533
|
const content = extractTextContent(response.output);
|
|
500
534
|
const { reasoning, reasoningDetails } = extractReasoningContent(response.output);
|
|
501
535
|
const toolCalls = extractToolCalls(response.output);
|
|
@@ -618,7 +652,8 @@ function createStreamState() {
|
|
|
618
652
|
hasContent: false,
|
|
619
653
|
hasReasoning: false,
|
|
620
654
|
currentItemId: null,
|
|
621
|
-
imageIndex: 0
|
|
655
|
+
imageIndex: 0,
|
|
656
|
+
terminal: false
|
|
622
657
|
};
|
|
623
658
|
}
|
|
624
659
|
function isCurrentReasoningDeltaEvent(event) {
|
|
@@ -805,6 +840,7 @@ function processStreamEvent(event, state) {
|
|
|
805
840
|
}
|
|
806
841
|
// Response completion
|
|
807
842
|
case "response.completed": {
|
|
843
|
+
state.terminal = true;
|
|
808
844
|
if (state.hasContent) {
|
|
809
845
|
chunks.push({ type: "content-done" });
|
|
810
846
|
}
|
|
@@ -821,13 +857,21 @@ function processStreamEvent(event, state) {
|
|
|
821
857
|
break;
|
|
822
858
|
}
|
|
823
859
|
case "response.failed":
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
860
|
+
state.terminal = true;
|
|
861
|
+
chunks.push(
|
|
862
|
+
upstreamErrorChunk(
|
|
863
|
+
event.response.error?.message || "Response generation failed",
|
|
864
|
+
event.response.error?.code
|
|
865
|
+
)
|
|
866
|
+
);
|
|
829
867
|
break;
|
|
830
868
|
case "response.incomplete": {
|
|
869
|
+
state.terminal = true;
|
|
870
|
+
const unusable = state.hasContent || state.toolCalls.size > 0 ? null : unusableResponseError(event.response);
|
|
871
|
+
if (unusable) {
|
|
872
|
+
chunks.push(upstreamErrorChunk(unusable.message, unusable.code));
|
|
873
|
+
break;
|
|
874
|
+
}
|
|
831
875
|
if (state.hasContent) {
|
|
832
876
|
chunks.push({ type: "content-done" });
|
|
833
877
|
}
|
|
@@ -843,12 +887,54 @@ function processStreamEvent(event, state) {
|
|
|
843
887
|
});
|
|
844
888
|
break;
|
|
845
889
|
}
|
|
890
|
+
// Stream-level error event (`{ type: "error", code, message }`): the
|
|
891
|
+
// upstream aborted the response. Previously ignored, which let the stream
|
|
892
|
+
// end silently and read as an empty successful completion.
|
|
893
|
+
case "error": {
|
|
894
|
+
state.terminal = true;
|
|
895
|
+
const errorEvent = event;
|
|
896
|
+
chunks.push(upstreamErrorChunk(errorEvent.message || "OpenAI stream error", errorEvent.code));
|
|
897
|
+
break;
|
|
898
|
+
}
|
|
846
899
|
// Ignore other events
|
|
847
900
|
default:
|
|
848
901
|
break;
|
|
849
902
|
}
|
|
850
903
|
return chunks;
|
|
851
904
|
}
|
|
905
|
+
function upstreamErrorChunk(message, rawCode) {
|
|
906
|
+
const code = toProviderErrorCode(rawCode);
|
|
907
|
+
const error = rawCode && rawCode !== code ? `${message} (${rawCode})` : message;
|
|
908
|
+
return { type: "error", error, code };
|
|
909
|
+
}
|
|
910
|
+
function unterminatedStreamError(state) {
|
|
911
|
+
if (state.terminal) return null;
|
|
912
|
+
return {
|
|
913
|
+
type: "error",
|
|
914
|
+
error: "OpenAI stream ended without a terminal response event",
|
|
915
|
+
code: "server_error"
|
|
916
|
+
};
|
|
917
|
+
}
|
|
918
|
+
function toProviderErrorCode(code) {
|
|
919
|
+
switch (code) {
|
|
920
|
+
case "rate_limit":
|
|
921
|
+
case "rate_limit_exceeded":
|
|
922
|
+
return "rate_limit";
|
|
923
|
+
case "server_error":
|
|
924
|
+
case "server_is_overloaded":
|
|
925
|
+
case "internal_error":
|
|
926
|
+
return "server_error";
|
|
927
|
+
case "timeout":
|
|
928
|
+
return "timeout";
|
|
929
|
+
case "auth_error":
|
|
930
|
+
case "invalid_api_key":
|
|
931
|
+
return "auth_error";
|
|
932
|
+
case "unknown":
|
|
933
|
+
return "unknown";
|
|
934
|
+
default:
|
|
935
|
+
return "invalid_request";
|
|
936
|
+
}
|
|
937
|
+
}
|
|
852
938
|
function createErrorChunk(error, code) {
|
|
853
939
|
return { type: "error", error, code };
|
|
854
940
|
}
|
|
@@ -1369,6 +1455,8 @@ var OpenAIProvider = class _OpenAIProvider {
|
|
|
1369
1455
|
yield chunk;
|
|
1370
1456
|
}
|
|
1371
1457
|
}
|
|
1458
|
+
const unterminated = request.signal?.aborted ? null : unterminatedStreamError(state);
|
|
1459
|
+
if (unterminated) yield unterminated;
|
|
1372
1460
|
} catch (error) {
|
|
1373
1461
|
const providerError = self.toProviderError(error);
|
|
1374
1462
|
yield createErrorChunk(providerError.message, providerError.code);
|
|
@@ -1394,7 +1482,7 @@ var OpenAIProvider = class _OpenAIProvider {
|
|
|
1394
1482
|
return /<html|<!doctype|unable to load site|ray id|cloudflare|attention required/i.test(body);
|
|
1395
1483
|
}
|
|
1396
1484
|
toProviderError(error) {
|
|
1397
|
-
if (error instanceof
|
|
1485
|
+
if (error instanceof ProviderError2) {
|
|
1398
1486
|
return error;
|
|
1399
1487
|
}
|
|
1400
1488
|
if (error instanceof Error) {
|
|
@@ -1402,26 +1490,26 @@ var OpenAIProvider = class _OpenAIProvider {
|
|
|
1402
1490
|
const status = anyError.status || anyError.statusCode;
|
|
1403
1491
|
const retryAfter = anyError.headers?.["retry-after"] ? parseInt(anyError.headers["retry-after"], 10) : void 0;
|
|
1404
1492
|
if (status === 429) {
|
|
1405
|
-
return new
|
|
1493
|
+
return new ProviderError2(error.message, "rate_limit", status, retryAfter, { cause: error });
|
|
1406
1494
|
}
|
|
1407
1495
|
if (status === 403 && _OpenAIProvider.isEdgeBlock(anyError)) {
|
|
1408
|
-
return new
|
|
1496
|
+
return new ProviderError2(error.message, "server_error", status, retryAfter ?? 3, { cause: error });
|
|
1409
1497
|
}
|
|
1410
1498
|
if (status === 401 || status === 403) {
|
|
1411
|
-
return new
|
|
1499
|
+
return new ProviderError2(error.message, "auth_error", status, void 0, { cause: error });
|
|
1412
1500
|
}
|
|
1413
1501
|
if (status === 400) {
|
|
1414
|
-
return new
|
|
1502
|
+
return new ProviderError2(error.message, "invalid_request", status, void 0, { cause: error });
|
|
1415
1503
|
}
|
|
1416
1504
|
if (status >= 500) {
|
|
1417
|
-
return new
|
|
1505
|
+
return new ProviderError2(error.message, "server_error", status, void 0, { cause: error });
|
|
1418
1506
|
}
|
|
1419
1507
|
if (error.name === "AbortError" || anyError.code === "ETIMEDOUT") {
|
|
1420
|
-
return new
|
|
1508
|
+
return new ProviderError2(error.message, "timeout", void 0, void 0, { cause: error });
|
|
1421
1509
|
}
|
|
1422
|
-
return new
|
|
1510
|
+
return new ProviderError2(error.message, "unknown", status, void 0, { cause: error });
|
|
1423
1511
|
}
|
|
1424
|
-
return new
|
|
1512
|
+
return new ProviderError2(String(error), "unknown", void 0, void 0, { cause: error });
|
|
1425
1513
|
}
|
|
1426
1514
|
// ============================================================================
|
|
1427
1515
|
// Inspection
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/OpenAIProvider.ts","../src/transformers.ts","../src/icons.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import type OpenAI from 'openai';\nimport type {\n LLMProviderInterface as Provider,\n ProviderFactoryConfig,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ModelCapabilities,\n ProviderModelInfo,\n ToolDefinition,\n ToolArgs,\n ToolTenvs,\n InspectedRequest,\n} from '@standardagents/spec';\nimport { ProviderError, defineTool } from '@standardagents/spec';\nimport { z } from 'zod';\nimport {\n buildCreateParams,\n transformResponse,\n createStreamState,\n processStreamEvent,\n createErrorChunk,\n DEFAULT_REASONING_LEVELS,\n truncateBase64,\n} from './transformers';\nimport { getOpenAIIconDataUri } from './icons';\n\n// Re-export ProviderError for consumers\nexport { ProviderError };\n\n/**\n * OpenAI model info from their API\n */\ninterface OpenAIModelInfo {\n id: string;\n object: string;\n created: number;\n owned_by: string;\n}\n\n/**\n * OpenAI provider implementation for Standard Agents\n *\n * Uses the Responses API for all requests (stateless mode).\n * Supports: the gpt-6 family, gpt-4o, gpt-4-turbo, gpt-3.5-turbo, o1, o3, o4-mini, etc.\n */\nexport class OpenAIProvider implements Provider {\n readonly name = 'openai';\n readonly specificationVersion = '1' as const;\n\n private client: OpenAI | null = null;\n private config: ProviderFactoryConfig;\n\n /** Cache for models list to avoid repeated API calls */\n private static modelsCache: OpenAIModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n private async getClient(): Promise<OpenAI> {\n if (!this.client) {\n const { default: OpenAI } = await import('openai');\n // `defaultHeaders` lets a sub-provider (via defineProvider) target an\n // OpenAI-compatible backend that needs extra headers — e.g. the ChatGPT\n // Codex backend's `chatgpt-account-id` / `OpenAI-Beta` / originator —\n // without subclassing or patching this client.\n const defaultHeaders = this.config.defaultHeaders as Record<string, string> | undefined;\n // A runtime-injected transport (`config.fetch`) routes every request\n // through a custom pipe — e.g. a client-side TCP tunnel that terminates\n // TLS in the Worker so the request egresses from the user's machine.\n // When present the SDK MUST use it instead of the global fetch.\n const fetchOverride = this.config.fetch;\n this.client = new OpenAI({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl,\n timeout: this.config.timeout,\n ...(defaultHeaders ? { defaultHeaders } : {}),\n ...(fetchOverride ? { fetch: fetchOverride } : {}),\n });\n }\n return this.client;\n }\n\n supportsModel(modelId: string): boolean {\n return (\n modelId.startsWith('gpt-') ||\n modelId.startsWith('o1') ||\n modelId.startsWith('o3') ||\n modelId.startsWith('o4') ||\n modelId.startsWith('dall-e') ||\n modelId.startsWith('chatgpt-')\n );\n }\n\n /**\n * Get the icon for this provider as a data URI.\n * Always returns the OpenAI icon since all models are from OpenAI.\n */\n getIcon(_modelId?: string): string {\n return getOpenAIIconDataUri();\n }\n\n // ============================================================================\n // Model Capabilities\n // ============================================================================\n\n /**\n * Hardcoded capability mappings for OpenAI models.\n * OpenAI doesn't provide a capabilities API, so these are manually maintained.\n */\n private static readonly MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {\n // GPT-6 family (catalog synced 2026-10-01): 1,048,576-token context,\n // 128k output, text + image input, reasoning efforts low..max (Luna also\n // accepts `none`). The 0-100 reasoning scale maps onto the low/medium/high\n // vocabulary the builder validates; `max` and `none` are not expressible\n // through reasoningLevels yet. Listed before older entries because\n // lookup is first-prefix-match over insertion order.\n 'gpt-6.1-sol': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n maxOutputTokens: 128000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'gpt-6-astra': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n maxOutputTokens: 128000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'gpt-6-sol': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n maxOutputTokens: 128000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'gpt-6-luna': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n maxOutputTokens: 128000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'gpt-4o': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 16384,\n },\n 'gpt-4o-mini': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 16384,\n },\n 'gpt-4-turbo': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 4096,\n },\n 'gpt-4': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 8192,\n maxOutputTokens: 4096,\n },\n 'gpt-3.5-turbo': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 16385,\n maxOutputTokens: 4096,\n },\n 'o1': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o1-preview': {\n supportsImages: true,\n supportsToolCalls: false,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 128000,\n maxOutputTokens: 32768,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o1-mini': {\n supportsImages: false,\n supportsToolCalls: false,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 128000,\n maxOutputTokens: 65536,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o3-mini': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o4-mini': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n };\n\n /**\n * Get capabilities for a specific model.\n * Uses hardcoded mappings since OpenAI doesn't provide a capabilities API.\n */\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n // Exact match first\n if (OpenAIProvider.MODEL_CAPABILITIES[modelId]) {\n return { ...OpenAIProvider.MODEL_CAPABILITIES[modelId] };\n }\n\n // Prefix match (e.g., 'gpt-4o-2024-11-20' matches 'gpt-4o')\n for (const [prefix, caps] of Object.entries(OpenAIProvider.MODEL_CAPABILITIES)) {\n if (modelId.startsWith(prefix)) {\n return { ...caps };\n }\n }\n\n // Default capabilities for unknown OpenAI models\n return {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 8192,\n maxOutputTokens: 4096,\n };\n }\n\n /**\n * Human-readable names and descriptions for models.\n * Used to enrich API response data.\n */\n private static readonly MODEL_METADATA: Record<string, { name: string; description: string }> = {\n 'gpt-6.1-sol': { name: 'GPT-6.1 Sol', description: 'Updated GPT-6 Sol with 1M context, vision, and reasoning' },\n 'gpt-6-astra': { name: 'GPT-6 Astra', description: 'Highest-capability GPT-6 model with 1M context' },\n 'gpt-6-sol': { name: 'GPT-6 Sol', description: 'Flagship GPT-6 model with 1M context, vision, and reasoning' },\n 'gpt-6-luna': { name: 'GPT-6 Luna', description: 'Fast, low-cost GPT-6 model with 1M context' },\n 'gpt-4o': { name: 'GPT-4o', description: 'Most capable GPT-4 model with vision' },\n 'gpt-4o-mini': { name: 'GPT-4o Mini', description: 'Fast and affordable GPT-4o variant' },\n 'gpt-4-turbo': { name: 'GPT-4 Turbo', description: 'GPT-4 Turbo with vision' },\n 'gpt-4': { name: 'GPT-4', description: 'Original GPT-4 model' },\n 'gpt-3.5-turbo': { name: 'GPT-3.5 Turbo', description: 'Fast and cost-effective' },\n 'o1': { name: 'o1', description: 'Advanced reasoning model' },\n 'o1-preview': { name: 'o1 Preview', description: 'Preview reasoning model' },\n 'o1-mini': { name: 'o1 Mini', description: 'Smaller reasoning model' },\n 'o3-mini': { name: 'o3 Mini', description: 'Latest compact reasoning model' },\n 'o4-mini': { name: 'o4 Mini', description: 'Next-gen compact reasoning model' },\n 'chatgpt-4o-latest': { name: 'ChatGPT-4o Latest', description: 'Latest ChatGPT model' },\n };\n\n /**\n * Prefixes for chat-capable models (filter out embeddings, tts, whisper, dall-e, etc.)\n */\n private static readonly CHAT_MODEL_PREFIXES = ['gpt-', 'o1', 'o3', 'o4', 'chatgpt-'];\n\n // ============================================================================\n // Provider-Embedded Tools\n // ============================================================================\n\n /**\n * Provider-embedded tools using defineTool().\n * These are OpenAI's built-in tools that execute on OpenAI's servers.\n * The execute function is a no-op since execution is handled by the provider.\n */\n private static readonly TOOLS: Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> = {\n web_search: defineTool({\n description: 'Search the web for up-to-date information with citations',\n args: z.object({\n query: z.string().describe('Search query'),\n searchContextSize: z.enum(['low', 'medium', 'high']).default('medium').describe('Amount of context to gather'),\n }),\n execute: async (_state, _args) => {\n // Execution handled by OpenAI - this is a passthrough\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n userLocation: z.string().optional().describe('User location for relevant results'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n file_search: defineTool({\n description: 'Search through uploaded files using vector embeddings',\n args: z.object({\n query: z.string().describe('Search query'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n vectorStoreId: z.string().describe('OpenAI Vector Store ID'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n code_interpreter: defineTool({\n description: 'Execute Python code in a sandboxed environment',\n args: z.object({\n code: z.string().describe('Python code to execute'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n containerId: z.string().optional().describe('Code interpreter container ID'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n image_generation: defineTool({\n description: 'Generate images using GPT-image-1',\n args: z.object({\n prompt: z.string().describe('Image generation prompt'),\n quality: z.enum(['standard', 'hd']).default('standard').describe('Image quality'),\n size: z.enum(['1024x1024', '1792x1024', '1024x1792']).default('1024x1024').describe('Image size'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n };\n\n /**\n * Which tools are available for each model.\n */\n private static readonly MODEL_TOOLS: Record<string, string[]> = {\n 'gpt-4o': ['web_search', 'file_search', 'code_interpreter', 'image_generation'],\n 'gpt-4o-mini': ['web_search', 'file_search', 'code_interpreter'],\n 'o1': ['web_search', 'code_interpreter'],\n 'o3-mini': ['web_search', 'code_interpreter'],\n 'o4-mini': ['web_search', 'file_search', 'code_interpreter', 'image_generation'],\n };\n\n /**\n * Get tools embedded in this provider.\n * These are OpenAI's built-in tools with tenv requirements.\n *\n * @param modelId - Optional filter to get tools available for a specific model\n * @returns Record of tool name to tool definition\n */\n getTools(modelId?: string): Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> {\n // For OpenAI, return all tools by default - most modern models support all provider tools\n // If a specific model has restrictions, we can filter, but default to returning all\n if (!modelId) {\n return { ...OpenAIProvider.TOOLS };\n }\n\n // Check if we have model-specific restrictions\n let toolNames = OpenAIProvider.MODEL_TOOLS[modelId];\n if (!toolNames) {\n for (const [prefix, tools] of Object.entries(OpenAIProvider.MODEL_TOOLS)) {\n if (modelId.startsWith(prefix)) {\n toolNames = tools;\n break;\n }\n }\n }\n\n // If no specific mapping found, return all tools (OpenAI default)\n if (!toolNames) {\n return { ...OpenAIProvider.TOOLS };\n }\n\n const result: Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> = {};\n for (const name of toolNames) {\n if (OpenAIProvider.TOOLS[name]) {\n result[name] = OpenAIProvider.TOOLS[name];\n }\n }\n return result;\n }\n\n /**\n * Fetch models from OpenAI API with caching.\n */\n private async fetchModelsWithCache(): Promise<OpenAIModelInfo[]> {\n const now = Date.now();\n\n // Return cached data if still valid\n if (\n OpenAIProvider.modelsCache &&\n now - OpenAIProvider.modelsCacheTime < OpenAIProvider.CACHE_TTL\n ) {\n return OpenAIProvider.modelsCache;\n }\n\n // Fetch from OpenAI API\n const client = await this.getClient();\n const response = await client.models.list();\n\n // Convert to array (the response is a Page object)\n const models: OpenAIModelInfo[] = [];\n for await (const model of response) {\n models.push(model as OpenAIModelInfo);\n }\n\n OpenAIProvider.modelsCache = models;\n OpenAIProvider.modelsCacheTime = now;\n\n return models;\n }\n\n /**\n * Check if a model ID is a chat-capable model.\n */\n private isChatModel(modelId: string): boolean {\n return OpenAIProvider.CHAT_MODEL_PREFIXES.some((prefix) => modelId.startsWith(prefix));\n }\n\n /**\n * Get human-readable name for a model.\n */\n private getModelName(modelId: string): string {\n // Check exact match first\n if (OpenAIProvider.MODEL_METADATA[modelId]) {\n return OpenAIProvider.MODEL_METADATA[modelId].name;\n }\n\n // Check prefix match\n for (const [prefix, meta] of Object.entries(OpenAIProvider.MODEL_METADATA)) {\n if (modelId.startsWith(prefix + '-')) {\n return `${meta.name} (${modelId.slice(prefix.length + 1)})`;\n }\n }\n\n // Fallback: format the ID nicely\n return modelId\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n }\n\n /**\n * Get description for a model.\n */\n private getModelDescription(modelId: string): string {\n // Check exact match first\n if (OpenAIProvider.MODEL_METADATA[modelId]) {\n return OpenAIProvider.MODEL_METADATA[modelId].description;\n }\n\n // Check prefix match\n for (const [prefix, meta] of Object.entries(OpenAIProvider.MODEL_METADATA)) {\n if (modelId.startsWith(prefix + '-')) {\n return meta.description;\n }\n }\n\n return '';\n }\n\n /**\n * Map OpenAI model info to ProviderModelInfo.\n */\n private mapToProviderModelInfo(model: OpenAIModelInfo): ProviderModelInfo {\n // Get capabilities for context length\n const caps = OpenAIProvider.MODEL_CAPABILITIES[model.id];\n let contextLength = caps?.maxContextTokens;\n\n // If no exact match, try prefix match\n if (!contextLength) {\n for (const [prefix, prefixCaps] of Object.entries(OpenAIProvider.MODEL_CAPABILITIES)) {\n if (model.id.startsWith(prefix)) {\n contextLength = prefixCaps.maxContextTokens;\n break;\n }\n }\n }\n\n return {\n id: model.id,\n name: this.getModelName(model.id),\n description: this.getModelDescription(model.id),\n contextLength,\n iconId: this.getIcon(model.id),\n };\n }\n\n /**\n * Get list of available models from OpenAI.\n * Fetches from the OpenAI API with caching.\n *\n * @param filter - Optional search string to filter models by name/id\n */\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n try {\n const rawModels = await this.fetchModelsWithCache();\n\n // Filter to chat models only and map to ProviderModelInfo\n let models = rawModels\n .filter((m) => this.isChatModel(m.id))\n .map((m) => this.mapToProviderModelInfo(m))\n .sort((a, b) => {\n // Sort by name for consistent ordering\n return a.name.localeCompare(b.name);\n });\n\n if (filter) {\n const lowerFilter = filter.toLowerCase();\n models = models.filter(\n (m) =>\n m.id.toLowerCase().includes(lowerFilter) ||\n m.name.toLowerCase().includes(lowerFilter) ||\n (m.description && m.description.toLowerCase().includes(lowerFilter))\n );\n }\n\n return models;\n } catch (error) {\n console.error('Failed to fetch models from OpenAI:', error);\n return [];\n }\n }\n\n // ============================================================================\n // Generation Methods\n // ============================================================================\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const client = await this.getClient();\n\n try {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n const response = await client.responses.create(\n { ...params, stream: false },\n { signal: request.signal }\n );\n\n return transformResponse(response);\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const client = await this.getClient();\n const self = this;\n\n try {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n\n const stream = await client.responses.create(\n { ...params, stream: true },\n { signal: request.signal }\n );\n\n return {\n async *[Symbol.asyncIterator]() {\n const state = createStreamState();\n\n try {\n for await (const event of stream) {\n const chunks = processStreamEvent(event, state);\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n } catch (error) {\n const providerError = self.toProviderError(error);\n yield createErrorChunk(providerError.message, providerError.code);\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n // ============================================================================\n // Error Handling\n // ============================================================================\n\n /**\n * True when a 403 is an edge/CDN block page (HTML challenge such as\n * Cloudflare's \"Unable to load site\") rather than a real API auth error.\n * Real API 403s carry a JSON error body; edge blocks carry HTML.\n */\n private static isEdgeBlock(error: { message?: string; error?: unknown }): boolean {\n const parts = [error?.message];\n if (typeof error?.error === 'string') parts.push(error.error);\n const body = parts.filter(Boolean).join(' ');\n return /<html|<!doctype|unable to load site|ray id|cloudflare|attention required/i.test(body);\n }\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const anyError = error as any;\n const status = anyError.status || anyError.statusCode;\n const retryAfter = anyError.headers?.['retry-after']\n ? parseInt(anyError.headers['retry-after'], 10)\n : undefined;\n\n if (status === 429) {\n return new ProviderError(error.message, 'rate_limit', status, retryAfter, { cause: error });\n }\n if (status === 403 && OpenAIProvider.isEdgeBlock(anyError)) {\n // A Cloudflare-fronted backend (e.g. the ChatGPT Codex backend) returns\n // an HTML \"Unable to load site\" challenge page when it rate-blocks the\n // caller's IP under bursty traffic. That is a transient edge block, NOT\n // an auth failure — classify it retryable AND ask the retry loop to\n // pause a few seconds first, since the block clears within seconds of\n // slowing down (an immediate retry just re-trips the same burst limit).\n return new ProviderError(error.message, 'server_error', status, retryAfter ?? 3, { cause: error });\n }\n if (status === 401 || status === 403) {\n return new ProviderError(error.message, 'auth_error', status, undefined, { cause: error });\n }\n if (status === 400) {\n return new ProviderError(error.message, 'invalid_request', status, undefined, { cause: error });\n }\n if (status >= 500) {\n return new ProviderError(error.message, 'server_error', status, undefined, { cause: error });\n }\n if (error.name === 'AbortError' || anyError.code === 'ETIMEDOUT') {\n return new ProviderError(error.message, 'timeout', undefined, undefined, { cause: error });\n }\n\n return new ProviderError(error.message, 'unknown', status, undefined, { cause: error });\n }\n\n return new ProviderError(String(error), 'unknown', undefined, undefined, { cause: error });\n }\n\n // ============================================================================\n // Inspection\n // ============================================================================\n\n /**\n * Transform a ProviderRequest to OpenAI Responses API format for inspection.\n * Returns the exact request body that would be sent to OpenAI, with base64 data truncated.\n */\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n return {\n body: truncateBase64(params as unknown as Record<string, unknown>),\n messagesPath: 'input',\n metadata: {\n endpoint: 'responses.create',\n },\n };\n }\n}\n","/**\n * Discrete transformer functions for OpenAI Responses API provider.\n * These functions convert between Standard Agent types and OpenAI Responses API types.\n * Kept as pure functions for easy testing.\n */\n\nimport type {\n ProviderRequest,\n ProviderResponse,\n ProviderMessage,\n ProviderTool,\n ProviderToolCallPart,\n ProviderFinishReason,\n ProviderUsage,\n ProviderStreamChunk,\n ContentPart,\n ImageUrlPart,\n ProviderReasoningDetail,\n ProviderGeneratedImage,\n ProviderExecutedToolResult,\n} from '@standardagents/spec';\nimport { mapReasoningLevel } from '@standardagents/spec';\nimport type OpenAI from 'openai';\nimport { calculateOpenAIUsageCost } from './pricing';\n\n// ============================================================================\n// Type aliases for OpenAI Responses API types\n// ============================================================================\n\ntype ResponseInputItem = OpenAI.Responses.ResponseInputItem;\ntype ResponseInput = OpenAI.Responses.ResponseInput;\ntype ResponseOutputItem = OpenAI.Responses.ResponseOutputItem;\ntype FunctionTool = OpenAI.Responses.FunctionTool;\ntype ResponseCreateParams = OpenAI.Responses.ResponseCreateParams;\ntype ResponseIncludable = OpenAI.Responses.ResponseIncludable;\ntype Response = OpenAI.Responses.Response;\ntype ResponseStreamEvent = OpenAI.Responses.ResponseStreamEvent;\n\n/**\n * Content type for function call output with multimodal content.\n * Note: The OpenAI API accepts arrays here, but the SDK types only allow strings.\n * We serialize this to JSON for type safety.\n */\ntype FunctionCallOutputContent =\n | { type: 'input_text'; text: string }\n | { type: 'input_image'; image_url: string; detail?: 'auto' | 'low' | 'high' };\n\n/** Default reasoning level mapping for OpenAI o-series models */\nexport const DEFAULT_REASONING_LEVELS: Record<number, string | null> = {\n 0: null,\n 33: 'low',\n 66: 'medium',\n 100: 'high',\n};\n\n/**\n * OpenAI built-in tool names that are executed by OpenAI on their side.\n * These should NOT be sent as function_call items - their results come back\n * as native response types (e.g., image_generation_call, web_search_call).\n */\nexport const OPENAI_NATIVE_TOOLS = new Set([\n 'image_generation',\n 'web_search',\n 'code_interpreter',\n 'file_search',\n]);\n\n// ============================================================================\n// Input Content Transformers\n// ============================================================================\n\n/**\n * Transform a single content part to Responses API input format.\n */\nexport function transformContentPart(\n part: ContentPart\n): OpenAI.Responses.ResponseInputContent {\n if (part.type === 'text') {\n return { type: 'input_text', text: part.text };\n }\n if (part.type === 'image') {\n // Guard against undefined data (e.g., file not loaded)\n const data = part.data || '';\n const imageUrl = data.startsWith('data:')\n ? data\n : `data:${part.mediaType || 'image/png'};base64,${data}`;\n return {\n type: 'input_image',\n image_url: imageUrl,\n detail: part.detail || 'auto',\n };\n }\n // Handle image_url format (stored format uses this instead of 'image')\n if (part.type === 'image_url') {\n // TypeScript narrows to ImageUrlPart here\n const url = part.image_url?.url || '';\n const detail = part.image_url?.detail || 'auto';\n // If URL is a path (not data URI or http), it needs to be loaded separately\n // For now, just pass through - the inspect endpoint should load the data\n return {\n type: 'input_image',\n image_url: url,\n detail,\n };\n }\n // File parts\n // Guard against undefined data\n const fileData = part.data || '';\n return {\n type: 'input_file',\n filename: part.filename,\n file_data: fileData.startsWith('data:')\n ? fileData\n : `data:${part.mediaType || 'application/octet-stream'};base64,${fileData}`,\n };\n}\n\n/**\n * Transform message content (string or parts array) to Responses API format.\n */\nexport function transformMessageContent(\n content: string | ContentPart[]\n): string | OpenAI.Responses.ResponseInputContent[] {\n if (typeof content === 'string') {\n return content;\n }\n return content.map(transformContentPart);\n}\n\n// ============================================================================\n// Message Transformers\n// ============================================================================\n\n/**\n * Transform a user message to Responses API input item.\n */\nexport function transformUserMessage(\n msg: ProviderMessage & { role: 'user' }\n): OpenAI.Responses.EasyInputMessage {\n const content = transformMessageContent(msg.content);\n return {\n role: 'user',\n // Always emit STRUCTURED content parts, never a bare string. Both are\n // valid on api.openai.com, but the canonical Responses shape (an array of\n // typed `input_text`/`input_image` parts) is what the assistant path\n // already emits and what the stricter ChatGPT Codex backend requires — a\n // plain string there earns a bodyless 400.\n content: typeof content === 'string' ? [{ type: 'input_text', text: content }] : content,\n };\n}\n\n/**\n * Transform an assistant message to Responses API input item.\n * Assistant messages from previous turns need special handling.\n */\nexport function transformAssistantMessage(\n msg: ProviderMessage & { role: 'assistant' }\n): ResponseInputItem[] {\n const items: ResponseInputItem[] = [];\n\n // Add assistant message if there's content OR if there are tool calls\n // The assistant message helps the model understand turn structure\n const hasToolCalls = msg.toolCalls && msg.toolCalls.length > 0;\n if (msg.content || hasToolCalls) {\n items.push({\n type: 'message',\n role: 'assistant',\n content: msg.content\n ? [{ type: 'output_text', text: msg.content }]\n : [], // Empty content array when only tool calls\n } as OpenAI.Responses.ResponseOutputMessage);\n }\n\n // Add reasoning if present.\n // OpenAI expects each reasoning item to be passed back EXACTLY as received.\n // Multiple reasoning items can exist with different IDs - we must group by ID\n // and create separate ResponseReasoningItem for each.\n //\n // Replay is strictly limited to items OpenAI itself produced: a provider-\n // supplied `rs_` id together with its `encrypted_content` blob. Requests are\n // always sent with `store: false`, so the API resolves a replayed item by\n // decrypting that blob — an item without it triggers a server-side lookup of\n // an id that was never persisted and fails the WHOLE request with\n // `404 Item with id 'rs_…' not found`. That rules out fabricating ids for\n // reasoning that other providers wrote into the history (Novita/OpenRouter\n // `text` details, the runtime's synthetic flat string): mid-thread model or\n // agent switches would otherwise poison every later OpenAI turn. Reasoning\n // that cannot be replayed verbatim is dropped from the item list; its text\n // still reaches the model wherever the runtime inlines it.\n if (msg.reasoningDetails) {\n // Group reasoning details by ID - each unique ID becomes a separate reasoning item\n const reasoningItemsById = new Map<string, OpenAI.Responses.ResponseReasoningItem>();\n\n const getOrCreateItem = (id: string): OpenAI.Responses.ResponseReasoningItem => {\n let item = reasoningItemsById.get(id);\n if (!item) {\n item = {\n id,\n type: 'reasoning',\n summary: [],\n };\n reasoningItemsById.set(id, item);\n }\n return item;\n };\n\n for (const detail of msg.reasoningDetails) {\n // No provider-supplied id → not an OpenAI reasoning item → not replayable.\n if (!detail.id) continue;\n const item = getOrCreateItem(detail.id);\n\n if (detail.type === 'encrypted' && detail.data) {\n // Each reasoning item gets its own encrypted_content\n item.encrypted_content = detail.data;\n } else if ((detail.type === 'summary' || detail.type === 'text') && detail.text) {\n item.summary.push({ type: 'summary_text', text: detail.text });\n }\n }\n\n // Only items whose encrypted payload survived are valid under store:false.\n const replayableItems = Array.from(reasoningItemsById.values()).filter(\n (item) => item.encrypted_content\n );\n\n // Fold the legacy flat msg.reasoning string into an existing replayable\n // item's summary — never fabricate an item for it. Skip when the same text\n // already arrived via reasoningDetails: the runtime may populate the flat\n // field FROM the details' text entries, and replaying the chain twice\n // inflates the request and confuses the model.\n if (msg.reasoning && typeof msg.reasoning === 'string' && replayableItems.length > 0) {\n const alreadyPresent = replayableItems.some((item) =>\n item.summary.some((s) => s.text === msg.reasoning)\n );\n if (!alreadyPresent) {\n replayableItems[0].summary.unshift({ type: 'summary_text', text: msg.reasoning });\n }\n }\n\n // Push all replayable reasoning items - preserves ID and encrypted_content\n for (const item of replayableItems) {\n items.push(item);\n }\n }\n\n // Add tool calls if present\n // Note: image_generation is included as function_call for history reconstruction,\n // even though OpenAI executes it. This allows us to return the result as\n // function_call_output with the image, which the model can \"see\" in stateless mode.\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n for (const tc of msg.toolCalls) {\n // Skip other native OpenAI tools (web_search, code_interpreter, etc.)\n // but include image_generation as a pseudo-function-call\n if (OPENAI_NATIVE_TOOLS.has(tc.name) && tc.name !== 'image_generation') {\n continue;\n }\n items.push({\n type: 'function_call',\n call_id: tc.id,\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n } as OpenAI.Responses.ResponseFunctionToolCall);\n }\n }\n\n return items;\n}\n\n/**\n * Transform a tool result message to Responses API input items.\n *\n * For image_generation (OpenAI's native tool), we treat it as a pseudo-function-call\n * in history reconstruction. This allows us to return the generated image as a\n * function_call_output with input_image content, which the model can \"see\" in\n * stateless mode. (The actual image_generation_call format requires stored IDs.)\n *\n * For other tools, returns standard function_call_output.\n */\nexport function transformToolMessage(\n msg: ProviderMessage & { role: 'tool' }\n): ResponseInputItem[] {\n // Standard function call output\n let output: string;\n\n if (typeof msg.content === 'string') {\n output = msg.content;\n } else if ('type' in msg.content) {\n if (msg.content.type === 'text') {\n output = msg.content.text;\n } else if (msg.content.type === 'error') {\n output = `Error: ${msg.content.error}`;\n } else {\n output = JSON.stringify(msg.content);\n }\n } else {\n output = JSON.stringify(msg.content);\n }\n\n // Handle image attachments from any tool (not just image_generation)\n // OpenAI API accepts function_call_output with array content including images.\n // See: https://platform.openai.com/docs/guides/function-calling#formatting-results\n if (msg.attachments?.length) {\n const imageAttachments = msg.attachments.filter(a => a.type === 'image' && a.data);\n if (imageAttachments.length > 0) {\n const outputContent: FunctionCallOutputContent[] = [];\n\n // Add text content first (ResponseInputText format)\n if (output) {\n outputContent.push({\n type: 'input_text',\n text: output,\n });\n }\n\n // Add image content (ResponseInputImage format)\n for (const attachment of imageAttachments) {\n const attachmentData = attachment.data || '';\n const imageData = attachmentData.startsWith('data:')\n ? attachmentData\n : `data:${attachment.mediaType || 'image/png'};base64,${attachmentData}`;\n\n outputContent.push({\n type: 'input_image',\n image_url: imageData,\n detail: 'auto',\n });\n }\n\n // Return array content directly - OpenAI API supports this for multimodal output\n // The SDK types are narrower than what the API accepts, so we use type assertion\n return [{\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output: outputContent as unknown as string,\n }];\n }\n }\n\n return [{\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output,\n }];\n}\n\n/**\n * Transform an array of ProviderMessages to Responses API input format.\n * Returns both the input items and extracted system instructions.\n */\nexport function transformMessages(messages: ProviderMessage[]): {\n input: ResponseInput;\n instructions: string | undefined;\n} {\n let instructions: string | undefined;\n const input: ResponseInput = [];\n\n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n // System messages become instructions\n instructions = instructions\n ? `${instructions}\\n\\n${msg.content}`\n : msg.content;\n break;\n\n case 'user':\n input.push(transformUserMessage(msg));\n break;\n\n case 'assistant':\n input.push(...transformAssistantMessage(msg));\n break;\n\n case 'tool':\n input.push(...transformToolMessage(msg));\n break;\n }\n }\n\n return { input, instructions };\n}\n\n// ============================================================================\n// Tool Transformers\n// ============================================================================\n\n/**\n * Native OpenAI tool types for the Responses API.\n */\ntype NativeToolType = OpenAI.Responses.Tool;\n\n/**\n * Transform a single ProviderTool to Responses API function tool.\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isObjectJsonSchema(schema: Record<string, unknown>): boolean {\n const type = schema.type;\n return type === 'object' || (Array.isArray(type) && type.includes('object'));\n}\n\nfunction normalizeStrictFunctionSchema(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => normalizeStrictFunctionSchema(item));\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n const normalized: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n normalized[key] = normalizeStrictFunctionSchema(child);\n }\n\n if (isObjectJsonSchema(normalized)) {\n const properties = isRecord(normalized.properties) ? normalized.properties : {};\n normalized.properties = properties;\n normalized.required = Object.keys(properties);\n normalized.additionalProperties = false;\n }\n\n return normalized;\n}\n\nfunction normalizeStrictFunctionParameters(inputParams: unknown): Record<string, unknown> {\n const schema = isRecord(inputParams)\n ? inputParams\n : {\n type: 'object',\n properties: {},\n };\n const normalized = normalizeStrictFunctionSchema(schema);\n return isRecord(normalized) ? normalized : { type: 'object', properties: {}, required: [], additionalProperties: false };\n}\n\nexport function transformTool(tool: ProviderTool): FunctionTool {\n // OpenAI strict mode requires every object schema to reject additional\n // properties and mark every declared property as required.\n // Ensure we always have a valid schema, even for tools with no parameters\n const inputParams = tool.function.parameters as Record<string, unknown> | null | undefined;\n\n const parameters = normalizeStrictFunctionParameters(inputParams);\n\n return {\n type: 'function',\n name: tool.function.name,\n description: tool.function.description || undefined,\n parameters,\n strict: true,\n };\n}\n\n/**\n * Transform an array of ProviderTools to Responses API format.\n * Separates function tools (for local execution) from native tools (executed by OpenAI).\n *\n * @returns Object with functionTools (regular tools) and nativeTools (OpenAI built-ins)\n */\nexport function transformTools(tools: ProviderTool[]): {\n functionTools: FunctionTool[];\n nativeTools: NativeToolType[];\n} {\n const functionTools: FunctionTool[] = [];\n const nativeTools: NativeToolType[] = [];\n\n for (const tool of tools) {\n const toolName = tool.function.name;\n\n // Check if this is an OpenAI native tool\n if (tool.executionMode === 'provider' && OPENAI_NATIVE_TOOLS.has(toolName)) {\n // Add as native tool type\n nativeTools.push({ type: toolName } as NativeToolType);\n } else {\n // Regular function tool\n functionTools.push(transformTool(tool));\n }\n }\n\n return { functionTools, nativeTools };\n}\n\n/**\n * Legacy function for backward compatibility - transforms all tools as function tools.\n * @deprecated Use transformTools() which properly handles native tools\n */\nexport function transformToolsLegacy(tools: ProviderTool[]): FunctionTool[] {\n return tools.map(transformTool);\n}\n\n/**\n * Transform tool choice option to Responses API format.\n */\nexport function transformToolChoice(\n choice: ProviderRequest['toolChoice']\n): ResponseCreateParams['tool_choice'] {\n if (choice === 'auto') {\n return 'auto';\n }\n if (choice === 'none') {\n return 'none';\n }\n if (choice === 'required') {\n return 'required';\n }\n if (typeof choice === 'object' && 'name' in choice) {\n return { type: 'function', name: choice.name };\n }\n return 'auto';\n}\n\n// ============================================================================\n// Response Transformers\n// ============================================================================\n\n/**\n * Map Responses API status/incomplete_details to Provider finish reason.\n */\nexport function mapFinishReason(response: Response): ProviderFinishReason {\n if (response.status === 'failed') {\n return 'error';\n }\n if (response.status === 'incomplete') {\n if (response.incomplete_details?.reason === 'max_output_tokens') {\n return 'length';\n }\n if (response.incomplete_details?.reason === 'content_filter') {\n return 'content_filter';\n }\n }\n\n // Check if there are function calls in the output\n const hasToolCalls = response.output.some(\n (item) => item.type === 'function_call'\n );\n if (hasToolCalls) {\n return 'tool_calls';\n }\n\n return 'stop';\n}\n\n/**\n * Extract text content from response output items.\n */\nexport function extractTextContent(output: ResponseOutputItem[]): string | null {\n const textParts: string[] = [];\n\n for (const item of output) {\n if (item.type === 'message' && item.role === 'assistant') {\n for (const content of item.content) {\n if (content.type === 'output_text') {\n textParts.push(content.text);\n }\n }\n }\n }\n\n return textParts.length > 0 ? textParts.join('') : null;\n}\n\n/**\n * Extract reasoning content from response output items.\n */\nexport function extractReasoningContent(output: ResponseOutputItem[]): {\n reasoning: string | null;\n reasoningDetails: ProviderReasoningDetail[] | undefined;\n} {\n let reasoning: string | null = null;\n const reasoningDetails: ProviderReasoningDetail[] = [];\n\n for (const item of output) {\n if (item.type === 'reasoning') {\n // Capture the original reasoning ID for multi-turn context (OpenAI uses rs_xxx format)\n const reasoningId = item.id;\n\n // Extract summary text\n if (item.summary && item.summary.length > 0) {\n const summaryText = item.summary\n .map((s) => s.text)\n .join('\\n');\n reasoning = reasoning ? `${reasoning}\\n${summaryText}` : summaryText;\n reasoningDetails.push({ type: 'summary', id: reasoningId, text: summaryText });\n }\n\n // Note: ResponseReasoningItem from OpenAI SDK only exposes summary and encrypted_content\n // There's no public `content` array in the SDK type - text reasoning comes via streaming events\n\n // Extract encrypted content for stateless multi-turn\n if (item.encrypted_content) {\n reasoningDetails.push({ type: 'encrypted', id: reasoningId, data: item.encrypted_content });\n }\n }\n }\n\n return {\n reasoning,\n reasoningDetails: reasoningDetails.length > 0 ? reasoningDetails : undefined,\n };\n}\n\n/**\n * Extract tool calls from response output items.\n */\nexport function extractToolCalls(\n output: ResponseOutputItem[]\n): ProviderToolCallPart[] | undefined {\n const toolCalls: ProviderToolCallPart[] = [];\n\n for (const item of output) {\n if (item.type === 'function_call') {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = item.arguments ? JSON.parse(item.arguments) : {};\n } catch {\n // Keep empty object on parse failure\n }\n\n toolCalls.push({\n id: item.call_id,\n name: item.name,\n arguments: parsedArgs,\n });\n }\n }\n\n return toolCalls.length > 0 ? toolCalls : undefined;\n}\n\n/**\n * Extract generated images from image_generation_call output items.\n */\nexport function extractProviderImages(\n output: ResponseOutputItem[]\n): ProviderGeneratedImage[] | undefined {\n const images: ProviderGeneratedImage[] = [];\n\n for (const item of output) {\n if (item.type === 'image_generation_call' && item.result) {\n images.push({\n id: item.id,\n toolName: 'image_generation',\n data: item.result,\n mediaType: 'image/png',\n // Note: OpenAI SDK ImageGenerationCall doesn't expose revised_prompt\n });\n }\n }\n\n return images.length > 0 ? images : undefined;\n}\n\nfunction normalizeProviderToolStatus(status: unknown): ProviderExecutedToolResult['status'] {\n if (status === 'completed') return 'completed';\n if (status === 'failed' || status === 'incomplete') return 'failed';\n return 'in_progress';\n}\n\nfunction getStringValue(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction extractOpenAIWebSearchActions(item: unknown): ProviderExecutedToolResult['result'] {\n if (!isRecord(item)) return undefined;\n const action = item.action;\n if (!isRecord(action)) return undefined;\n\n const type = getStringValue(action, 'type') ?? 'search';\n const query = getStringValue(action, 'query');\n const url = getStringValue(action, 'url');\n const pattern = getStringValue(action, 'pattern');\n const rawSources = action.sources;\n const sources = Array.isArray(rawSources)\n ? rawSources\n .filter(isRecord)\n .map((source) => ({\n type: getStringValue(source, 'type'),\n url: getStringValue(source, 'url') ?? '',\n title: getStringValue(source, 'title'),\n }))\n .filter((source) => source.url)\n : undefined;\n\n return {\n actions: [{\n type,\n ...(query ? { query } : {}),\n ...(url ? { url } : {}),\n ...(pattern ? { pattern } : {}),\n ...(sources && sources.length > 0 ? { sources } : {}),\n }],\n };\n}\n\nfunction extractOpenAIFileSearchResult(item: unknown): ProviderExecutedToolResult['result'] {\n if (!isRecord(item)) return undefined;\n const queries = item.queries;\n const results = item.results;\n return {\n ...(Array.isArray(queries) ? { input: { queries } } : {}),\n ...(Array.isArray(results) ? { results } : {}),\n };\n}\n\nfunction extractOpenAICodeInterpreterResult(item: unknown): ProviderExecutedToolResult['result'] {\n if (!isRecord(item)) return undefined;\n const code = getStringValue(item, 'code');\n const containerId = getStringValue(item, 'container_id');\n const outputs = item.outputs;\n const logs = Array.isArray(outputs)\n ? outputs\n .filter(isRecord)\n .map((output) => getStringValue(output, 'logs'))\n .filter((value): value is string => typeof value === 'string')\n .join('\\n')\n : '';\n\n return {\n ...(code || containerId ? { input: { ...(code ? { code } : {}), ...(containerId ? { containerId } : {}) } } : {}),\n ...(logs ? { output: logs } : {}),\n ...(Array.isArray(outputs) ? { results: outputs } : {}),\n };\n}\n\nfunction providerToolResult(\n name: string,\n id: string,\n status: unknown,\n result?: ProviderExecutedToolResult['result']\n): ProviderExecutedToolResult {\n return {\n name,\n type: name,\n provider: 'openai',\n id,\n status: normalizeProviderToolStatus(status),\n ...(result ? { result } : {}),\n };\n}\n\nexport function extractProviderToolResults(\n output: unknown[]\n): ProviderExecutedToolResult[] | undefined {\n const providerTools: ProviderExecutedToolResult[] = [];\n\n for (const item of output) {\n if (!isRecord(item)) continue;\n\n const type = getStringValue(item, 'type');\n const id = getStringValue(item, 'id');\n if (!type || !id) continue;\n\n if (type === 'web_search_call') {\n providerTools.push(providerToolResult(\n 'web_search',\n id,\n getStringValue(item, 'status'),\n extractOpenAIWebSearchActions(item)\n ));\n } else if (type === 'image_generation_call') {\n providerTools.push(providerToolResult(\n 'image_generation',\n id,\n getStringValue(item, 'status'),\n {\n artifacts: [{\n type: 'image',\n id,\n mediaType: 'image/png',\n }],\n }\n ));\n } else if (type === 'file_search_call') {\n providerTools.push(providerToolResult(\n 'file_search',\n id,\n getStringValue(item, 'status'),\n extractOpenAIFileSearchResult(item)\n ));\n } else if (type === 'code_interpreter_call') {\n providerTools.push(providerToolResult(\n 'code_interpreter',\n id,\n getStringValue(item, 'status'),\n extractOpenAICodeInterpreterResult(item)\n ));\n }\n }\n\n return providerTools.length > 0 ? providerTools : undefined;\n}\n\n/**\n * Transform Responses API usage to Provider usage format.\n */\nexport function transformUsage(\n usage: Response['usage'] | undefined,\n modelId?: string\n): ProviderUsage {\n if (!usage) {\n return {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n }\n\n const transformed: ProviderUsage = {\n promptTokens: usage.input_tokens || 0,\n completionTokens: usage.output_tokens || 0,\n totalTokens: usage.total_tokens || 0,\n reasoningTokens: usage.output_tokens_details?.reasoning_tokens,\n cachedTokens: usage.input_tokens_details?.cached_tokens,\n };\n\n if (modelId) {\n const cost = calculateOpenAIUsageCost(modelId, transformed);\n if (cost !== undefined) {\n transformed.cost = cost;\n }\n }\n\n return transformed;\n}\n\n/**\n * Transform a complete Responses API response to ProviderResponse.\n */\nexport function transformResponse(response: Response): ProviderResponse {\n const content = extractTextContent(response.output);\n const { reasoning, reasoningDetails } = extractReasoningContent(response.output);\n const toolCalls = extractToolCalls(response.output);\n const images = extractProviderImages(response.output);\n const providerTools = extractProviderToolResults(response.output);\n\n return {\n content,\n reasoning,\n reasoningDetails,\n toolCalls,\n images,\n providerTools,\n finishReason: mapFinishReason(response),\n usage: transformUsage(response.usage, response.model),\n metadata: {\n model: response.model,\n provider: 'openai',\n requestId: response.id,\n },\n };\n}\n\n// ============================================================================\n// Request Builder\n// ============================================================================\n\n/**\n * Build a Responses API create request from a ProviderRequest.\n */\nexport function buildCreateParams(\n request: ProviderRequest,\n reasoningLevels: Record<number, string | null> = DEFAULT_REASONING_LEVELS\n): ResponseCreateParams {\n const { input, instructions } = transformMessages(request.messages);\n\n const params: ResponseCreateParams = {\n model: request.model,\n input,\n store: false, // Always stateless\n };\n\n if (instructions) {\n params.instructions = instructions;\n }\n\n // Tools\n if (request.tools && request.tools.length > 0) {\n const { functionTools, nativeTools } = transformTools(request.tools);\n\n // Check if any native tools were already used in this conversation\n // If so, exclude them from the tools list to avoid confusing the model\n // (The model sees them as function_call/function_call_output in history,\n // but having them also available as native tools causes regeneration loops)\n const usedNativeTools = new Set<string>();\n for (const msg of request.messages) {\n if (msg.role === 'tool' && msg.toolName && OPENAI_NATIVE_TOOLS.has(msg.toolName)) {\n usedNativeTools.add(msg.toolName);\n }\n }\n\n // Filter out native tools that were already used\n const availableNativeTools = nativeTools.filter(tool => {\n const toolType = (tool as { type: string }).type;\n return !usedNativeTools.has(toolType);\n });\n\n // Combine function tools and native OpenAI tools\n // Native tools (image_generation, web_search, etc.) must be added as their native types\n params.tools = [\n ...functionTools,\n ...availableNativeTools,\n ];\n\n // Include web search results if web_search tool is available\n const hasWebSearch = availableNativeTools.some(\n tool => (tool as { type: string }).type === 'web_search'\n );\n if (hasWebSearch) {\n const includeList: ResponseIncludable[] = params.include || [];\n if (!includeList.includes('web_search_call.results')) {\n includeList.push('web_search_call.results');\n }\n params.include = includeList;\n }\n\n if (request.toolChoice !== undefined) {\n params.tool_choice = transformToolChoice(request.toolChoice);\n }\n\n if (request.parallelToolCalls !== undefined) {\n params.parallel_tool_calls = request.parallelToolCalls;\n }\n }\n\n // Generation parameters\n if (request.maxOutputTokens !== undefined) {\n params.max_output_tokens = request.maxOutputTokens;\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n params.top_p = request.topP;\n }\n\n // Reasoning (o-series models)\n if (request.reasoning?.level !== undefined) {\n const effort = mapReasoningLevel(request.reasoning.level, reasoningLevels);\n if (effort) {\n params.reasoning = {\n effort: effort as 'low' | 'medium' | 'high',\n summary: 'auto',\n };\n\n // Include encrypted reasoning for stateless multi-turn\n // Note: reasoning.summary is not a valid include value - summaries come by default\n const includeList: ResponseIncludable[] = params.include || [];\n if (!includeList.includes('reasoning.encrypted_content')) {\n includeList.push('reasoning.encrypted_content');\n }\n params.include = includeList;\n }\n }\n\n // Response format\n if (request.responseFormat) {\n if (request.responseFormat.type === 'json') {\n if (request.responseFormat.schema) {\n params.text = {\n format: {\n type: 'json_schema',\n name: 'response',\n schema: request.responseFormat.schema,\n strict: true,\n },\n };\n } else {\n params.text = {\n format: { type: 'json_object' },\n };\n }\n }\n }\n\n // Merge provider-specific options (but don't let them override our managed include array)\n if (request.providerOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { include: _providerInclude, ...otherOptions } = request.providerOptions as Record<string, unknown>;\n Object.assign(params, otherOptions);\n // Note: We intentionally ignore providerOptions.include - the include array is managed\n // by buildCreateParams based on reasoning settings. User-provided include values like\n // 'reasoning.summary' are invalid and would cause API errors.\n }\n\n return params;\n}\n\n// ============================================================================\n// Stream State and Chunk Transformers\n// ============================================================================\n\nexport interface StreamState {\n toolCalls: Map<string, { id: string; name: string; arguments: string }>;\n toolCallIdsByItemId: Map<string, string>;\n imageGenerations: Map<string, { id: string; status: string }>;\n webSearches: Map<string, { id: string; status: string }>;\n reasoningContent: string;\n hasContent: boolean;\n hasReasoning: boolean;\n currentItemId: string | null;\n imageIndex: number;\n}\n\nexport function createStreamState(): StreamState {\n return {\n toolCalls: new Map(),\n toolCallIdsByItemId: new Map(),\n imageGenerations: new Map(),\n webSearches: new Map(),\n reasoningContent: '',\n hasContent: false,\n hasReasoning: false,\n currentItemId: null,\n imageIndex: 0,\n };\n}\n\ninterface CurrentReasoningDeltaEvent {\n type: 'response.reasoning.delta';\n delta: string;\n}\n\nfunction isCurrentReasoningDeltaEvent(event: unknown): event is CurrentReasoningDeltaEvent {\n return isRecord(event) && event.type === 'response.reasoning.delta' && typeof event.delta === 'string';\n}\n\nfunction resolveToolCallId(state: StreamState, itemId: string): string {\n return state.toolCallIdsByItemId.get(itemId) ?? itemId;\n}\n\nfunction getToolCallForItem(\n state: StreamState,\n itemId: string\n): { id: string; name: string; arguments: string } | undefined {\n return state.toolCalls.get(resolveToolCallId(state, itemId));\n}\n\nfunction parseToolCallArguments(argumentsJson: string): Record<string, unknown> {\n try {\n const parsed: unknown = argumentsJson ? JSON.parse(argumentsJson) : {};\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction getFunctionCallItemField(event: unknown, field: string): string | undefined {\n if (!isRecord(event) || !isRecord(event.item)) {\n return undefined;\n }\n const value = event.item[field];\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Process a stream event and return provider stream chunks.\n */\nexport function processStreamEvent(\n event: ResponseStreamEvent,\n state: StreamState\n): ProviderStreamChunk[] {\n const chunks: ProviderStreamChunk[] = [];\n const rawEvent: unknown = event;\n\n if (isCurrentReasoningDeltaEvent(rawEvent)) {\n state.hasReasoning = true;\n state.reasoningContent += rawEvent.delta;\n chunks.push({ type: 'reasoning-delta', delta: rawEvent.delta });\n return chunks;\n }\n\n switch (event.type) {\n // Text content streaming\n case 'response.output_text.delta':\n state.hasContent = true;\n chunks.push({ type: 'content-delta', delta: event.delta });\n break;\n\n case 'response.output_text.done':\n // Content done is emitted at the end\n break;\n\n // Reasoning streaming\n case 'response.reasoning_text.delta':\n state.hasReasoning = true;\n if (isRecord(event) && typeof event.delta === 'string') {\n state.reasoningContent += event.delta;\n chunks.push({ type: 'reasoning-delta', delta: event.delta });\n }\n break;\n\n case 'response.reasoning_text.done':\n // Reasoning done is emitted at the end\n break;\n\n // Function call and image generation streaming\n case 'response.output_item.added':\n if (event.item.type === 'function_call') {\n const itemId = event.item.id ?? event.item.call_id;\n state.toolCallIdsByItemId.set(itemId, event.item.call_id);\n state.toolCallIdsByItemId.set(event.item.call_id, event.item.call_id);\n state.toolCalls.set(event.item.call_id, {\n id: event.item.call_id,\n name: event.item.name,\n arguments: event.item.arguments ?? '',\n });\n chunks.push({\n type: 'tool-call-start',\n id: event.item.call_id,\n name: event.item.name,\n });\n } else if (event.item.type === 'image_generation_call') {\n // Track image generation for when it completes\n state.imageGenerations.set(event.item.id, {\n id: event.item.id,\n status: event.item.status,\n });\n } else if (event.item.type === 'web_search_call') {\n // Track web search for when it completes\n state.webSearches.set(event.item.id, {\n id: event.item.id,\n status: event.item.status,\n });\n }\n break;\n\n case 'response.output_item.done':\n // Handle completed image generation\n if (event.item.type === 'image_generation_call') {\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'image_generation',\n event.item.id,\n event.item.status,\n event.item.result\n ? {\n artifacts: [{\n type: 'image',\n id: event.item.id,\n mediaType: 'image/png',\n }],\n }\n : undefined\n ),\n });\n\n // Emit image when we have result data - don't require status to be 'completed'\n // OpenAI may return status='generating' even when the result is ready\n if (event.item.result) {\n const imageIndex = state.imageIndex;\n state.imageIndex++;\n chunks.push({\n type: 'image-done',\n index: imageIndex,\n image: {\n id: event.item.id,\n toolName: 'image_generation',\n data: event.item.result,\n mediaType: 'image/png',\n // Note: OpenAI SDK ImageGenerationCall doesn't expose revised_prompt\n },\n });\n }\n // Clean up tracking\n state.imageGenerations.delete(event.item.id);\n } else if (event.item.type === 'web_search_call') {\n // Handle completed web search\n // Extract search actions if available (requires include: ['web_search_call.results'])\n const webSearchItem = event.item as any; // Type assertion needed as SDK types may not include action\n const actions: Array<{\n type: 'search' | 'open_page' | 'find';\n query?: string;\n url?: string;\n pattern?: string;\n sources?: Array<{ type: 'url'; url: string; title?: string }>;\n }> = [];\n\n if (webSearchItem.action) {\n actions.push({\n type: webSearchItem.action.type,\n query: webSearchItem.action.query,\n url: webSearchItem.action.url,\n pattern: webSearchItem.action.pattern,\n sources: webSearchItem.action.sources,\n });\n }\n\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'web_search',\n event.item.id,\n event.item.status,\n actions.length > 0 ? { actions } : undefined\n ),\n });\n\n // Clean up tracking\n state.webSearches.delete(event.item.id);\n } else if (event.item.type === 'file_search_call') {\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'file_search',\n event.item.id,\n event.item.status,\n extractOpenAIFileSearchResult(event.item)\n ),\n });\n } else if (event.item.type === 'code_interpreter_call') {\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'code_interpreter',\n event.item.id,\n event.item.status,\n extractOpenAICodeInterpreterResult(event.item)\n ),\n });\n }\n break;\n\n case 'response.function_call_arguments.delta': {\n const deltaToolCall = getToolCallForItem(state, event.item_id);\n if (deltaToolCall) {\n deltaToolCall.arguments += event.delta;\n chunks.push({\n type: 'tool-call-delta',\n id: deltaToolCall.id,\n argumentsDelta: event.delta,\n });\n }\n break;\n }\n\n case 'response.function_call_arguments.done': {\n const doneToolCall = getToolCallForItem(state, event.item_id);\n if (doneToolCall) {\n const finalArguments =\n event.arguments ||\n getFunctionCallItemField(rawEvent, 'arguments') ||\n doneToolCall.arguments;\n doneToolCall.arguments = finalArguments;\n const parsedArgs = parseToolCallArguments(finalArguments);\n chunks.push({\n type: 'tool-call-done',\n id: doneToolCall.id,\n arguments: parsedArgs,\n });\n }\n break;\n }\n\n // Response completion\n case 'response.completed': {\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n\n // Extract reasoning details (including encrypted content) for multi-turn continuity\n const { reasoningDetails } = extractReasoningContent(event.response.output);\n\n chunks.push({\n type: 'finish',\n finishReason: mapFinishReason(event.response),\n usage: transformUsage(event.response.usage, event.response.model),\n reasoningDetails,\n });\n break;\n }\n\n case 'response.failed':\n chunks.push({\n type: 'error',\n error: event.response.error?.message || 'Response generation failed',\n code: event.response.error?.code,\n });\n break;\n\n case 'response.incomplete': {\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n\n // Extract reasoning details even for incomplete responses\n const { reasoningDetails: incompleteReasoningDetails } = extractReasoningContent(event.response.output);\n\n chunks.push({\n type: 'finish',\n finishReason: mapFinishReason(event.response),\n usage: transformUsage(event.response.usage, event.response.model),\n reasoningDetails: incompleteReasoningDetails,\n });\n break;\n }\n\n // Ignore other events\n default:\n break;\n }\n\n return chunks;\n}\n\n/**\n * Create error chunk.\n */\nexport function createErrorChunk(error: string, code?: string): ProviderStreamChunk {\n return { type: 'error', error, code };\n}\n\n// ============================================================================\n// Inspection Utilities\n// ============================================================================\n\n/**\n * Check if a string looks like base64 data that should be truncated.\n * Matches data URIs and long strings with base64-like character patterns.\n */\nfunction isBase64Like(str: string): boolean {\n // Data URIs (data:image/png;base64,...)\n if (str.startsWith('data:')) return true;\n\n // Very long strings (>200 chars) that look like base64\n // Base64 only contains A-Z, a-z, 0-9, +, /, and = for padding\n if (str.length > 200) {\n const base64Pattern = /^[A-Za-z0-9+/]+=*$/;\n // Check first 200 chars to avoid regex on huge strings\n return base64Pattern.test(str.substring(0, 200));\n }\n\n return false;\n}\n\n/**\n * Truncate a base64 string for display, preserving the start and showing length.\n */\nfunction truncateBase64String(str: string, maxLength: number = 50): string {\n if (str.length <= maxLength) return str;\n\n const preview = str.substring(0, maxLength);\n return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;\n}\n\n/**\n * Recursively truncate base64 data in an object for inspection.\n * Detects base64 strings (data URIs and long base64-like strings) and truncates them.\n *\n * @param obj - The object to process\n * @param maxLength - Maximum length for base64 preview (default 50)\n * @returns A new object with base64 data truncated\n */\nexport function truncateBase64<T>(obj: T, maxLength: number = 50): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n // Handle strings\n if (typeof obj === 'string') {\n if (isBase64Like(obj)) {\n return truncateBase64String(obj, maxLength) as T;\n }\n return obj;\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map(item => truncateBase64(item, maxLength)) as T;\n }\n\n // Handle objects\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = truncateBase64(value, maxLength);\n }\n return result as T;\n }\n\n // Return primitives as-is\n return obj;\n}\n","import OPENAI_ICON_FILE from './vendor-icons/openai.svg';\n\n/**\n * OpenAI icon asset.\n */\nexport const OPENAI_ICON = OPENAI_ICON_FILE;\n\n/**\n * Convert SVG string to data URI for use in img src.\n */\nexport function svgToDataUri(svg: string): string {\n const encoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n return `data:image/svg+xml,${encoded}`;\n}\n\nfunction normalizeIcon(icon: string): string {\n if (icon.startsWith('data:') || icon.endsWith('.svg') || icon.includes('.svg?')) {\n return icon;\n }\n return svgToDataUri(icon);\n}\n\n/**\n * Get the OpenAI icon as a data URI.\n */\nexport function getOpenAIIconDataUri(): string {\n return normalizeIcon(OPENAI_ICON);\n}\n","/**\n * OpenAI provider options schema.\n *\n * Defines typed providerOptions for OpenAI models, providing\n * TypeScript autocompletion and runtime validation.\n *\n * @see https://platform.openai.com/docs/api-reference/chat/create\n * @module\n */\n\nimport { z } from 'zod';\n\n/**\n * OpenAI provider options schema.\n *\n * These options are passed directly to the OpenAI API and control\n * various aspects of request handling and generation.\n *\n * @example\n * ```typescript\n * providerOptions: {\n * service_tier: 'default',\n * user: 'user-123',\n * seed: 42,\n * }\n * ```\n */\nexport const openaiProviderOptions = z.object({\n /** Service tier for request: 'auto', 'default', or 'flex' */\n service_tier: z.enum(['auto', 'default', 'flex']).optional(),\n\n /** User identifier for abuse monitoring */\n user: z.string().optional(),\n\n /** Seed for deterministic outputs (beta feature) */\n seed: z.number().int().optional(),\n\n /** Frequency penalty (-2.0 to 2.0) - reduces repetition of tokens */\n frequency_penalty: z.number().min(-2).max(2).optional(),\n\n /** Presence penalty (-2.0 to 2.0) - encourages new topics */\n presence_penalty: z.number().min(-2).max(2).optional(),\n\n /** Whether to return log probabilities of output tokens */\n logprobs: z.boolean().optional(),\n\n /** Number of most likely tokens to return at each position (0-20) */\n top_logprobs: z.number().int().min(0).max(20).optional(),\n\n /** Whether to store the completion for future reference */\n store: z.boolean().optional(),\n\n /** Metadata for stored completions */\n metadata: z.record(z.string(), z.string()).optional(),\n}).passthrough(); // Allow unknown keys for forward compatibility\n\n/**\n * TypeScript type for OpenAI provider options.\n * Inferred from the Zod schema for type-safe usage.\n */\nexport type OpenAIProviderOptions = z.infer<typeof openaiProviderOptions>;\n","import type { ProviderFactoryWithOptions, ProviderFactoryConfig, ProviderConfigSlots } from '@standardagents/spec';\nimport { OpenAIProvider } from './OpenAIProvider';\nimport { openaiProviderOptions } from './providerOptions';\n\n/**\n * OpenAI provider factory for Standard Agents\n *\n * Includes typed providerOptions for OpenAI-specific configuration.\n *\n * @example\n * ```typescript\n * import { defineModel } from '@standardagents/builder';\n * import { openai } from '@standardagents/openai';\n *\n * export default defineModel({\n * name: 'gpt-4o',\n * provider: openai,\n * model: 'gpt-4o',\n * inputPrice: 2.5,\n * outputPrice: 10,\n * capabilities: {\n * supportsImages: true,\n * supportsToolCalls: true,\n * supportsJsonMode: true,\n * maxContextTokens: 128000,\n * },\n * providerOptions: {\n * service_tier: 'default',\n * },\n * });\n * ```\n */\nexport const openai: ProviderFactoryWithOptions<typeof openaiProviderOptions> =\n Object.assign(\n (config: ProviderFactoryConfig) => new OpenAIProvider(config),\n {\n providerOptions: openaiProviderOptions,\n configSlots: {\n apiKey: {\n type: 'secret',\n required: true,\n defaultEnv: 'OPENAI_API_KEY',\n overridable: true,\n description: 'OpenAI API key used to authenticate provider requests.',\n },\n baseUrl: {\n type: 'url',\n required: false,\n default: 'https://api.openai.com/v1',\n overridable: true,\n description: 'OpenAI-compatible API base URL.',\n },\n timeout: {\n type: 'number',\n required: false,\n default: 30000,\n overridable: true,\n description: 'Provider request timeout in milliseconds.',\n },\n } satisfies ProviderConfigSlots,\n }\n );\n\n// Re-export the provider options schema and types\nexport { openaiProviderOptions, type OpenAIProviderOptions } from './providerOptions';\n\n// Re-export the provider class for advanced usage\nexport { OpenAIProvider } from './OpenAIProvider';\n\nexport {\n calculateOpenAIUsageCost,\n getOpenAIModelPricing,\n type OpenAIModelPricing,\n} from './pricing';\n"],"mappings":"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","names":["z"]}
|
|
1
|
+
{"version":3,"sources":["../src/OpenAIProvider.ts","../src/transformers.ts","../src/icons.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import type OpenAI from 'openai';\nimport type {\n LLMProviderInterface as Provider,\n ProviderFactoryConfig,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ModelCapabilities,\n ProviderModelInfo,\n ToolDefinition,\n ToolArgs,\n ToolTenvs,\n InspectedRequest,\n} from '@standardagents/spec';\nimport { ProviderError, defineTool } from '@standardagents/spec';\nimport { z } from 'zod';\nimport {\n buildCreateParams,\n transformResponse,\n createStreamState,\n unterminatedStreamError,\n processStreamEvent,\n createErrorChunk,\n DEFAULT_REASONING_LEVELS,\n truncateBase64,\n} from './transformers';\nimport { getOpenAIIconDataUri } from './icons';\n\n// Re-export ProviderError for consumers\nexport { ProviderError };\n\n/**\n * OpenAI model info from their API\n */\ninterface OpenAIModelInfo {\n id: string;\n object: string;\n created: number;\n owned_by: string;\n}\n\n/**\n * OpenAI provider implementation for Standard Agents\n *\n * Uses the Responses API for all requests (stateless mode).\n * Supports: the gpt-6 family, gpt-4o, gpt-4-turbo, gpt-3.5-turbo, o1, o3, o4-mini, etc.\n */\nexport class OpenAIProvider implements Provider {\n readonly name = 'openai';\n readonly specificationVersion = '1' as const;\n\n private client: OpenAI | null = null;\n private config: ProviderFactoryConfig;\n\n /** Cache for models list to avoid repeated API calls */\n private static modelsCache: OpenAIModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n private async getClient(): Promise<OpenAI> {\n if (!this.client) {\n const { default: OpenAI } = await import('openai');\n // `defaultHeaders` lets a sub-provider (via defineProvider) target an\n // OpenAI-compatible backend that needs extra headers — e.g. the ChatGPT\n // Codex backend's `chatgpt-account-id` / `OpenAI-Beta` / originator —\n // without subclassing or patching this client.\n const defaultHeaders = this.config.defaultHeaders as Record<string, string> | undefined;\n // A runtime-injected transport (`config.fetch`) routes every request\n // through a custom pipe — e.g. a client-side TCP tunnel that terminates\n // TLS in the Worker so the request egresses from the user's machine.\n // When present the SDK MUST use it instead of the global fetch.\n const fetchOverride = this.config.fetch;\n this.client = new OpenAI({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl,\n timeout: this.config.timeout,\n ...(defaultHeaders ? { defaultHeaders } : {}),\n ...(fetchOverride ? { fetch: fetchOverride } : {}),\n });\n }\n return this.client;\n }\n\n supportsModel(modelId: string): boolean {\n return (\n modelId.startsWith('gpt-') ||\n modelId.startsWith('o1') ||\n modelId.startsWith('o3') ||\n modelId.startsWith('o4') ||\n modelId.startsWith('dall-e') ||\n modelId.startsWith('chatgpt-')\n );\n }\n\n /**\n * Get the icon for this provider as a data URI.\n * Always returns the OpenAI icon since all models are from OpenAI.\n */\n getIcon(_modelId?: string): string {\n return getOpenAIIconDataUri();\n }\n\n // ============================================================================\n // Model Capabilities\n // ============================================================================\n\n /**\n * Hardcoded capability mappings for OpenAI models.\n * OpenAI doesn't provide a capabilities API, so these are manually maintained.\n */\n private static readonly MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {\n // GPT-6 family (catalog synced 2026-10-01): 1,048,576-token context,\n // 128k output, text + image input, reasoning efforts low..max (Luna also\n // accepts `none`). The 0-100 reasoning scale maps onto the low/medium/high\n // vocabulary the builder validates; `max` and `none` are not expressible\n // through reasoningLevels yet. Listed before older entries because\n // lookup is first-prefix-match over insertion order.\n 'gpt-6.1-sol': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n maxOutputTokens: 128000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'gpt-6-astra': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n maxOutputTokens: 128000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'gpt-6-sol': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n maxOutputTokens: 128000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'gpt-6-luna': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n maxOutputTokens: 128000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'gpt-4o': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 16384,\n },\n 'gpt-4o-mini': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 16384,\n },\n 'gpt-4-turbo': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 4096,\n },\n 'gpt-4': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 8192,\n maxOutputTokens: 4096,\n },\n 'gpt-3.5-turbo': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 16385,\n maxOutputTokens: 4096,\n },\n 'o1': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o1-preview': {\n supportsImages: true,\n supportsToolCalls: false,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 128000,\n maxOutputTokens: 32768,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o1-mini': {\n supportsImages: false,\n supportsToolCalls: false,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 128000,\n maxOutputTokens: 65536,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o3-mini': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o4-mini': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n };\n\n /**\n * Get capabilities for a specific model.\n * Uses hardcoded mappings since OpenAI doesn't provide a capabilities API.\n */\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n // Exact match first\n if (OpenAIProvider.MODEL_CAPABILITIES[modelId]) {\n return { ...OpenAIProvider.MODEL_CAPABILITIES[modelId] };\n }\n\n // Prefix match (e.g., 'gpt-4o-2024-11-20' matches 'gpt-4o')\n for (const [prefix, caps] of Object.entries(OpenAIProvider.MODEL_CAPABILITIES)) {\n if (modelId.startsWith(prefix)) {\n return { ...caps };\n }\n }\n\n // Default capabilities for unknown OpenAI models\n return {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 8192,\n maxOutputTokens: 4096,\n };\n }\n\n /**\n * Human-readable names and descriptions for models.\n * Used to enrich API response data.\n */\n private static readonly MODEL_METADATA: Record<string, { name: string; description: string }> = {\n 'gpt-6.1-sol': { name: 'GPT-6.1 Sol', description: 'Updated GPT-6 Sol with 1M context, vision, and reasoning' },\n 'gpt-6-astra': { name: 'GPT-6 Astra', description: 'Highest-capability GPT-6 model with 1M context' },\n 'gpt-6-sol': { name: 'GPT-6 Sol', description: 'Flagship GPT-6 model with 1M context, vision, and reasoning' },\n 'gpt-6-luna': { name: 'GPT-6 Luna', description: 'Fast, low-cost GPT-6 model with 1M context' },\n 'gpt-4o': { name: 'GPT-4o', description: 'Most capable GPT-4 model with vision' },\n 'gpt-4o-mini': { name: 'GPT-4o Mini', description: 'Fast and affordable GPT-4o variant' },\n 'gpt-4-turbo': { name: 'GPT-4 Turbo', description: 'GPT-4 Turbo with vision' },\n 'gpt-4': { name: 'GPT-4', description: 'Original GPT-4 model' },\n 'gpt-3.5-turbo': { name: 'GPT-3.5 Turbo', description: 'Fast and cost-effective' },\n 'o1': { name: 'o1', description: 'Advanced reasoning model' },\n 'o1-preview': { name: 'o1 Preview', description: 'Preview reasoning model' },\n 'o1-mini': { name: 'o1 Mini', description: 'Smaller reasoning model' },\n 'o3-mini': { name: 'o3 Mini', description: 'Latest compact reasoning model' },\n 'o4-mini': { name: 'o4 Mini', description: 'Next-gen compact reasoning model' },\n 'chatgpt-4o-latest': { name: 'ChatGPT-4o Latest', description: 'Latest ChatGPT model' },\n };\n\n /**\n * Prefixes for chat-capable models (filter out embeddings, tts, whisper, dall-e, etc.)\n */\n private static readonly CHAT_MODEL_PREFIXES = ['gpt-', 'o1', 'o3', 'o4', 'chatgpt-'];\n\n // ============================================================================\n // Provider-Embedded Tools\n // ============================================================================\n\n /**\n * Provider-embedded tools using defineTool().\n * These are OpenAI's built-in tools that execute on OpenAI's servers.\n * The execute function is a no-op since execution is handled by the provider.\n */\n private static readonly TOOLS: Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> = {\n web_search: defineTool({\n description: 'Search the web for up-to-date information with citations',\n args: z.object({\n query: z.string().describe('Search query'),\n searchContextSize: z.enum(['low', 'medium', 'high']).default('medium').describe('Amount of context to gather'),\n }),\n execute: async (_state, _args) => {\n // Execution handled by OpenAI - this is a passthrough\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n userLocation: z.string().optional().describe('User location for relevant results'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n file_search: defineTool({\n description: 'Search through uploaded files using vector embeddings',\n args: z.object({\n query: z.string().describe('Search query'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n vectorStoreId: z.string().describe('OpenAI Vector Store ID'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n code_interpreter: defineTool({\n description: 'Execute Python code in a sandboxed environment',\n args: z.object({\n code: z.string().describe('Python code to execute'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n containerId: z.string().optional().describe('Code interpreter container ID'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n image_generation: defineTool({\n description: 'Generate images using GPT-image-1',\n args: z.object({\n prompt: z.string().describe('Image generation prompt'),\n quality: z.enum(['standard', 'hd']).default('standard').describe('Image quality'),\n size: z.enum(['1024x1024', '1792x1024', '1024x1792']).default('1024x1024').describe('Image size'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n };\n\n /**\n * Which tools are available for each model.\n */\n private static readonly MODEL_TOOLS: Record<string, string[]> = {\n 'gpt-4o': ['web_search', 'file_search', 'code_interpreter', 'image_generation'],\n 'gpt-4o-mini': ['web_search', 'file_search', 'code_interpreter'],\n 'o1': ['web_search', 'code_interpreter'],\n 'o3-mini': ['web_search', 'code_interpreter'],\n 'o4-mini': ['web_search', 'file_search', 'code_interpreter', 'image_generation'],\n };\n\n /**\n * Get tools embedded in this provider.\n * These are OpenAI's built-in tools with tenv requirements.\n *\n * @param modelId - Optional filter to get tools available for a specific model\n * @returns Record of tool name to tool definition\n */\n getTools(modelId?: string): Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> {\n // For OpenAI, return all tools by default - most modern models support all provider tools\n // If a specific model has restrictions, we can filter, but default to returning all\n if (!modelId) {\n return { ...OpenAIProvider.TOOLS };\n }\n\n // Check if we have model-specific restrictions\n let toolNames = OpenAIProvider.MODEL_TOOLS[modelId];\n if (!toolNames) {\n for (const [prefix, tools] of Object.entries(OpenAIProvider.MODEL_TOOLS)) {\n if (modelId.startsWith(prefix)) {\n toolNames = tools;\n break;\n }\n }\n }\n\n // If no specific mapping found, return all tools (OpenAI default)\n if (!toolNames) {\n return { ...OpenAIProvider.TOOLS };\n }\n\n const result: Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> = {};\n for (const name of toolNames) {\n if (OpenAIProvider.TOOLS[name]) {\n result[name] = OpenAIProvider.TOOLS[name];\n }\n }\n return result;\n }\n\n /**\n * Fetch models from OpenAI API with caching.\n */\n private async fetchModelsWithCache(): Promise<OpenAIModelInfo[]> {\n const now = Date.now();\n\n // Return cached data if still valid\n if (\n OpenAIProvider.modelsCache &&\n now - OpenAIProvider.modelsCacheTime < OpenAIProvider.CACHE_TTL\n ) {\n return OpenAIProvider.modelsCache;\n }\n\n // Fetch from OpenAI API\n const client = await this.getClient();\n const response = await client.models.list();\n\n // Convert to array (the response is a Page object)\n const models: OpenAIModelInfo[] = [];\n for await (const model of response) {\n models.push(model as OpenAIModelInfo);\n }\n\n OpenAIProvider.modelsCache = models;\n OpenAIProvider.modelsCacheTime = now;\n\n return models;\n }\n\n /**\n * Check if a model ID is a chat-capable model.\n */\n private isChatModel(modelId: string): boolean {\n return OpenAIProvider.CHAT_MODEL_PREFIXES.some((prefix) => modelId.startsWith(prefix));\n }\n\n /**\n * Get human-readable name for a model.\n */\n private getModelName(modelId: string): string {\n // Check exact match first\n if (OpenAIProvider.MODEL_METADATA[modelId]) {\n return OpenAIProvider.MODEL_METADATA[modelId].name;\n }\n\n // Check prefix match\n for (const [prefix, meta] of Object.entries(OpenAIProvider.MODEL_METADATA)) {\n if (modelId.startsWith(prefix + '-')) {\n return `${meta.name} (${modelId.slice(prefix.length + 1)})`;\n }\n }\n\n // Fallback: format the ID nicely\n return modelId\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n }\n\n /**\n * Get description for a model.\n */\n private getModelDescription(modelId: string): string {\n // Check exact match first\n if (OpenAIProvider.MODEL_METADATA[modelId]) {\n return OpenAIProvider.MODEL_METADATA[modelId].description;\n }\n\n // Check prefix match\n for (const [prefix, meta] of Object.entries(OpenAIProvider.MODEL_METADATA)) {\n if (modelId.startsWith(prefix + '-')) {\n return meta.description;\n }\n }\n\n return '';\n }\n\n /**\n * Map OpenAI model info to ProviderModelInfo.\n */\n private mapToProviderModelInfo(model: OpenAIModelInfo): ProviderModelInfo {\n // Get capabilities for context length\n const caps = OpenAIProvider.MODEL_CAPABILITIES[model.id];\n let contextLength = caps?.maxContextTokens;\n\n // If no exact match, try prefix match\n if (!contextLength) {\n for (const [prefix, prefixCaps] of Object.entries(OpenAIProvider.MODEL_CAPABILITIES)) {\n if (model.id.startsWith(prefix)) {\n contextLength = prefixCaps.maxContextTokens;\n break;\n }\n }\n }\n\n return {\n id: model.id,\n name: this.getModelName(model.id),\n description: this.getModelDescription(model.id),\n contextLength,\n iconId: this.getIcon(model.id),\n };\n }\n\n /**\n * Get list of available models from OpenAI.\n * Fetches from the OpenAI API with caching.\n *\n * @param filter - Optional search string to filter models by name/id\n */\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n try {\n const rawModels = await this.fetchModelsWithCache();\n\n // Filter to chat models only and map to ProviderModelInfo\n let models = rawModels\n .filter((m) => this.isChatModel(m.id))\n .map((m) => this.mapToProviderModelInfo(m))\n .sort((a, b) => {\n // Sort by name for consistent ordering\n return a.name.localeCompare(b.name);\n });\n\n if (filter) {\n const lowerFilter = filter.toLowerCase();\n models = models.filter(\n (m) =>\n m.id.toLowerCase().includes(lowerFilter) ||\n m.name.toLowerCase().includes(lowerFilter) ||\n (m.description && m.description.toLowerCase().includes(lowerFilter))\n );\n }\n\n return models;\n } catch (error) {\n console.error('Failed to fetch models from OpenAI:', error);\n return [];\n }\n }\n\n // ============================================================================\n // Generation Methods\n // ============================================================================\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const client = await this.getClient();\n\n try {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n const response = await client.responses.create(\n { ...params, stream: false },\n { signal: request.signal }\n );\n\n return transformResponse(response);\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const client = await this.getClient();\n const self = this;\n\n try {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n\n const stream = await client.responses.create(\n { ...params, stream: true },\n { signal: request.signal }\n );\n\n return {\n async *[Symbol.asyncIterator]() {\n const state = createStreamState();\n\n try {\n for await (const event of stream) {\n const chunks = processStreamEvent(event, state);\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n // A stream that ends with no terminal event must not read as an\n // empty successful completion. A caller abort ends the stream too,\n // but the runtime already treats that as a stop.\n const unterminated = request.signal?.aborted ? null : unterminatedStreamError(state);\n if (unterminated) yield unterminated;\n } catch (error) {\n const providerError = self.toProviderError(error);\n yield createErrorChunk(providerError.message, providerError.code);\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n // ============================================================================\n // Error Handling\n // ============================================================================\n\n /**\n * True when a 403 is an edge/CDN block page (HTML challenge such as\n * Cloudflare's \"Unable to load site\") rather than a real API auth error.\n * Real API 403s carry a JSON error body; edge blocks carry HTML.\n */\n private static isEdgeBlock(error: { message?: string; error?: unknown }): boolean {\n const parts = [error?.message];\n if (typeof error?.error === 'string') parts.push(error.error);\n const body = parts.filter(Boolean).join(' ');\n return /<html|<!doctype|unable to load site|ray id|cloudflare|attention required/i.test(body);\n }\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const anyError = error as any;\n const status = anyError.status || anyError.statusCode;\n const retryAfter = anyError.headers?.['retry-after']\n ? parseInt(anyError.headers['retry-after'], 10)\n : undefined;\n\n if (status === 429) {\n return new ProviderError(error.message, 'rate_limit', status, retryAfter, { cause: error });\n }\n if (status === 403 && OpenAIProvider.isEdgeBlock(anyError)) {\n // A Cloudflare-fronted backend (e.g. the ChatGPT Codex backend) returns\n // an HTML \"Unable to load site\" challenge page when it rate-blocks the\n // caller's IP under bursty traffic. That is a transient edge block, NOT\n // an auth failure — classify it retryable AND ask the retry loop to\n // pause a few seconds first, since the block clears within seconds of\n // slowing down (an immediate retry just re-trips the same burst limit).\n return new ProviderError(error.message, 'server_error', status, retryAfter ?? 3, { cause: error });\n }\n if (status === 401 || status === 403) {\n return new ProviderError(error.message, 'auth_error', status, undefined, { cause: error });\n }\n if (status === 400) {\n return new ProviderError(error.message, 'invalid_request', status, undefined, { cause: error });\n }\n if (status >= 500) {\n return new ProviderError(error.message, 'server_error', status, undefined, { cause: error });\n }\n if (error.name === 'AbortError' || anyError.code === 'ETIMEDOUT') {\n return new ProviderError(error.message, 'timeout', undefined, undefined, { cause: error });\n }\n\n return new ProviderError(error.message, 'unknown', status, undefined, { cause: error });\n }\n\n return new ProviderError(String(error), 'unknown', undefined, undefined, { cause: error });\n }\n\n // ============================================================================\n // Inspection\n // ============================================================================\n\n /**\n * Transform a ProviderRequest to OpenAI Responses API format for inspection.\n * Returns the exact request body that would be sent to OpenAI, with base64 data truncated.\n */\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n return {\n body: truncateBase64(params as unknown as Record<string, unknown>),\n messagesPath: 'input',\n metadata: {\n endpoint: 'responses.create',\n },\n };\n }\n}\n","/**\n * Discrete transformer functions for OpenAI Responses API provider.\n * These functions convert between Standard Agent types and OpenAI Responses API types.\n * Kept as pure functions for easy testing.\n */\n\nimport type {\n ProviderRequest,\n ProviderResponse,\n ProviderMessage,\n ProviderTool,\n ProviderToolCallPart,\n ProviderFinishReason,\n ProviderUsage,\n ProviderStreamChunk,\n ContentPart,\n ImageUrlPart,\n ProviderReasoningDetail,\n ProviderGeneratedImage,\n ProviderExecutedToolResult,\n} from '@standardagents/spec';\nimport { ProviderError, mapReasoningLevel } from '@standardagents/spec';\nimport type { ProviderErrorCode } from '@standardagents/spec';\nimport type OpenAI from 'openai';\nimport { calculateOpenAIUsageCost } from './pricing';\n\n// ============================================================================\n// Type aliases for OpenAI Responses API types\n// ============================================================================\n\ntype ResponseInputItem = OpenAI.Responses.ResponseInputItem;\ntype ResponseInput = OpenAI.Responses.ResponseInput;\ntype ResponseOutputItem = OpenAI.Responses.ResponseOutputItem;\ntype FunctionTool = OpenAI.Responses.FunctionTool;\ntype ResponseCreateParams = OpenAI.Responses.ResponseCreateParams;\ntype ResponseIncludable = OpenAI.Responses.ResponseIncludable;\ntype Response = OpenAI.Responses.Response;\ntype ResponseStreamEvent = OpenAI.Responses.ResponseStreamEvent;\n\n/**\n * Content type for function call output with multimodal content.\n * Note: The OpenAI API accepts arrays here, but the SDK types only allow strings.\n * We serialize this to JSON for type safety.\n */\ntype FunctionCallOutputContent =\n | { type: 'input_text'; text: string }\n | { type: 'input_image'; image_url: string; detail?: 'auto' | 'low' | 'high' };\n\n/** Default reasoning level mapping for OpenAI o-series models */\nexport const DEFAULT_REASONING_LEVELS: Record<number, string | null> = {\n 0: null,\n 33: 'low',\n 66: 'medium',\n 100: 'high',\n};\n\n/**\n * OpenAI built-in tool names that are executed by OpenAI on their side.\n * These should NOT be sent as function_call items - their results come back\n * as native response types (e.g., image_generation_call, web_search_call).\n */\nexport const OPENAI_NATIVE_TOOLS = new Set([\n 'image_generation',\n 'web_search',\n 'code_interpreter',\n 'file_search',\n]);\n\n// ============================================================================\n// Input Content Transformers\n// ============================================================================\n\n/**\n * Transform a single content part to Responses API input format.\n */\nexport function transformContentPart(\n part: ContentPart\n): OpenAI.Responses.ResponseInputContent {\n if (part.type === 'text') {\n return { type: 'input_text', text: part.text };\n }\n if (part.type === 'image') {\n // Guard against undefined data (e.g., file not loaded)\n const data = part.data || '';\n const imageUrl = data.startsWith('data:')\n ? data\n : `data:${part.mediaType || 'image/png'};base64,${data}`;\n return {\n type: 'input_image',\n image_url: imageUrl,\n detail: part.detail || 'auto',\n };\n }\n // Handle image_url format (stored format uses this instead of 'image')\n if (part.type === 'image_url') {\n // TypeScript narrows to ImageUrlPart here\n const url = part.image_url?.url || '';\n const detail = part.image_url?.detail || 'auto';\n // If URL is a path (not data URI or http), it needs to be loaded separately\n // For now, just pass through - the inspect endpoint should load the data\n return {\n type: 'input_image',\n image_url: url,\n detail,\n };\n }\n // File parts\n // Guard against undefined data\n const fileData = part.data || '';\n return {\n type: 'input_file',\n filename: part.filename,\n file_data: fileData.startsWith('data:')\n ? fileData\n : `data:${part.mediaType || 'application/octet-stream'};base64,${fileData}`,\n };\n}\n\n/**\n * Transform message content (string or parts array) to Responses API format.\n */\nexport function transformMessageContent(\n content: string | ContentPart[]\n): string | OpenAI.Responses.ResponseInputContent[] {\n if (typeof content === 'string') {\n return content;\n }\n return content.map(transformContentPart);\n}\n\n// ============================================================================\n// Message Transformers\n// ============================================================================\n\n/**\n * Transform a user message to Responses API input item.\n */\nexport function transformUserMessage(\n msg: ProviderMessage & { role: 'user' }\n): OpenAI.Responses.EasyInputMessage {\n const content = transformMessageContent(msg.content);\n return {\n role: 'user',\n // Always emit STRUCTURED content parts, never a bare string. Both are\n // valid on api.openai.com, but the canonical Responses shape (an array of\n // typed `input_text`/`input_image` parts) is what the assistant path\n // already emits and what the stricter ChatGPT Codex backend requires — a\n // plain string there earns a bodyless 400.\n content: typeof content === 'string' ? [{ type: 'input_text', text: content }] : content,\n };\n}\n\n/**\n * Transform an assistant message to Responses API input item.\n * Assistant messages from previous turns need special handling.\n */\nexport function transformAssistantMessage(\n msg: ProviderMessage & { role: 'assistant' }\n): ResponseInputItem[] {\n const items: ResponseInputItem[] = [];\n\n // Add assistant message if there's content OR if there are tool calls\n // The assistant message helps the model understand turn structure\n const hasToolCalls = msg.toolCalls && msg.toolCalls.length > 0;\n if (msg.content || hasToolCalls) {\n items.push({\n type: 'message',\n role: 'assistant',\n content: msg.content\n ? [{ type: 'output_text', text: msg.content }]\n : [], // Empty content array when only tool calls\n } as OpenAI.Responses.ResponseOutputMessage);\n }\n\n // Add reasoning if present.\n // OpenAI expects each reasoning item to be passed back EXACTLY as received.\n // Multiple reasoning items can exist with different IDs - we must group by ID\n // and create separate ResponseReasoningItem for each.\n //\n // Replay is strictly limited to items OpenAI itself produced: a provider-\n // supplied `rs_` id together with its `encrypted_content` blob. Requests are\n // always sent with `store: false`, so the API resolves a replayed item by\n // decrypting that blob — an item without it triggers a server-side lookup of\n // an id that was never persisted and fails the WHOLE request with\n // `404 Item with id 'rs_…' not found`. That rules out fabricating ids for\n // reasoning that other providers wrote into the history (Novita/OpenRouter\n // `text` details, the runtime's synthetic flat string): mid-thread model or\n // agent switches would otherwise poison every later OpenAI turn. Reasoning\n // that cannot be replayed verbatim is dropped from the item list; its text\n // still reaches the model wherever the runtime inlines it.\n if (msg.reasoningDetails) {\n // Group reasoning details by ID - each unique ID becomes a separate reasoning item\n const reasoningItemsById = new Map<string, OpenAI.Responses.ResponseReasoningItem>();\n\n const getOrCreateItem = (id: string): OpenAI.Responses.ResponseReasoningItem => {\n let item = reasoningItemsById.get(id);\n if (!item) {\n item = {\n id,\n type: 'reasoning',\n summary: [],\n };\n reasoningItemsById.set(id, item);\n }\n return item;\n };\n\n for (const detail of msg.reasoningDetails) {\n // No provider-supplied id → not an OpenAI reasoning item → not replayable.\n if (!detail.id) continue;\n const item = getOrCreateItem(detail.id);\n\n if (detail.type === 'encrypted' && detail.data) {\n // Each reasoning item gets its own encrypted_content\n item.encrypted_content = detail.data;\n } else if ((detail.type === 'summary' || detail.type === 'text') && detail.text) {\n item.summary.push({ type: 'summary_text', text: detail.text });\n }\n }\n\n // Only items whose encrypted payload survived are valid under store:false.\n const replayableItems = Array.from(reasoningItemsById.values()).filter(\n (item) => item.encrypted_content\n );\n\n // Fold the legacy flat msg.reasoning string into an existing replayable\n // item's summary — never fabricate an item for it. Skip when the same text\n // already arrived via reasoningDetails: the runtime may populate the flat\n // field FROM the details' text entries, and replaying the chain twice\n // inflates the request and confuses the model.\n if (msg.reasoning && typeof msg.reasoning === 'string' && replayableItems.length > 0) {\n const alreadyPresent = replayableItems.some((item) =>\n item.summary.some((s) => s.text === msg.reasoning)\n );\n if (!alreadyPresent) {\n replayableItems[0].summary.unshift({ type: 'summary_text', text: msg.reasoning });\n }\n }\n\n // Push all replayable reasoning items - preserves ID and encrypted_content\n for (const item of replayableItems) {\n items.push(item);\n }\n }\n\n // Add tool calls if present\n // Note: image_generation is included as function_call for history reconstruction,\n // even though OpenAI executes it. This allows us to return the result as\n // function_call_output with the image, which the model can \"see\" in stateless mode.\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n for (const tc of msg.toolCalls) {\n // Skip other native OpenAI tools (web_search, code_interpreter, etc.)\n // but include image_generation as a pseudo-function-call\n if (OPENAI_NATIVE_TOOLS.has(tc.name) && tc.name !== 'image_generation') {\n continue;\n }\n items.push({\n type: 'function_call',\n call_id: tc.id,\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n } as OpenAI.Responses.ResponseFunctionToolCall);\n }\n }\n\n return items;\n}\n\n/**\n * Transform a tool result message to Responses API input items.\n *\n * For image_generation (OpenAI's native tool), we treat it as a pseudo-function-call\n * in history reconstruction. This allows us to return the generated image as a\n * function_call_output with input_image content, which the model can \"see\" in\n * stateless mode. (The actual image_generation_call format requires stored IDs.)\n *\n * For other tools, returns standard function_call_output.\n */\nexport function transformToolMessage(\n msg: ProviderMessage & { role: 'tool' }\n): ResponseInputItem[] {\n // Standard function call output\n let output: string;\n\n if (typeof msg.content === 'string') {\n output = msg.content;\n } else if ('type' in msg.content) {\n if (msg.content.type === 'text') {\n output = msg.content.text;\n } else if (msg.content.type === 'error') {\n output = `Error: ${msg.content.error}`;\n } else {\n output = JSON.stringify(msg.content);\n }\n } else {\n output = JSON.stringify(msg.content);\n }\n\n // Handle image attachments from any tool (not just image_generation)\n // OpenAI API accepts function_call_output with array content including images.\n // See: https://platform.openai.com/docs/guides/function-calling#formatting-results\n if (msg.attachments?.length) {\n const imageAttachments = msg.attachments.filter(a => a.type === 'image' && a.data);\n if (imageAttachments.length > 0) {\n const outputContent: FunctionCallOutputContent[] = [];\n\n // Add text content first (ResponseInputText format)\n if (output) {\n outputContent.push({\n type: 'input_text',\n text: output,\n });\n }\n\n // Add image content (ResponseInputImage format)\n for (const attachment of imageAttachments) {\n const attachmentData = attachment.data || '';\n const imageData = attachmentData.startsWith('data:')\n ? attachmentData\n : `data:${attachment.mediaType || 'image/png'};base64,${attachmentData}`;\n\n outputContent.push({\n type: 'input_image',\n image_url: imageData,\n detail: 'auto',\n });\n }\n\n // Return array content directly - OpenAI API supports this for multimodal output\n // The SDK types are narrower than what the API accepts, so we use type assertion\n return [{\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output: outputContent as unknown as string,\n }];\n }\n }\n\n return [{\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output,\n }];\n}\n\n/**\n * Transform an array of ProviderMessages to Responses API input format.\n * Returns both the input items and extracted system instructions.\n */\nexport function transformMessages(messages: ProviderMessage[]): {\n input: ResponseInput;\n instructions: string | undefined;\n} {\n let instructions: string | undefined;\n const input: ResponseInput = [];\n\n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n // System messages become instructions\n instructions = instructions\n ? `${instructions}\\n\\n${msg.content}`\n : msg.content;\n break;\n\n case 'user':\n input.push(transformUserMessage(msg));\n break;\n\n case 'assistant':\n input.push(...transformAssistantMessage(msg));\n break;\n\n case 'tool':\n input.push(...transformToolMessage(msg));\n break;\n }\n }\n\n return { input, instructions };\n}\n\n// ============================================================================\n// Tool Transformers\n// ============================================================================\n\n/**\n * Native OpenAI tool types for the Responses API.\n */\ntype NativeToolType = OpenAI.Responses.Tool;\n\n/**\n * Transform a single ProviderTool to Responses API function tool.\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isObjectJsonSchema(schema: Record<string, unknown>): boolean {\n const type = schema.type;\n return type === 'object' || (Array.isArray(type) && type.includes('object'));\n}\n\nconst ANY_OF_ANNOTATION_KEYS = ['description', 'title'] as const;\n\n/**\n * Normalize a JSON Schema to OpenAI Structured Outputs strict-mode rules:\n * every object sets `additionalProperties: false` and lists ALL of its\n * properties in `required` (optional fields must be modelled as nullable by\n * the schema author), and an `anyOf` node carries no structural siblings.\n */\nfunction normalizeStrictFunctionSchema(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => normalizeStrictFunctionSchema(item));\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n // Strict mode rejects `anyOf` combined with structural sibling keywords\n // (`type`, `properties`, `additionalProperties`, ...) at the same node — the\n // 2026-10-06 subagent_create incident. Keep only the variants plus\n // annotations; each variant is normalized on its own.\n if (Array.isArray(value.anyOf)) {\n const normalized: Record<string, unknown> = {\n anyOf: value.anyOf.map((item) => normalizeStrictFunctionSchema(item)),\n };\n for (const key of ANY_OF_ANNOTATION_KEYS) {\n if (key in value) normalized[key] = value[key];\n }\n return normalized;\n }\n\n const normalized: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n normalized[key] = normalizeStrictFunctionSchema(child);\n }\n\n if (isObjectJsonSchema(normalized)) {\n const properties = isRecord(normalized.properties) ? normalized.properties : {};\n normalized.properties = properties;\n normalized.required = Object.keys(properties);\n normalized.additionalProperties = false;\n }\n\n return normalized;\n}\n\nfunction normalizeStrictFunctionParameters(inputParams: unknown): Record<string, unknown> {\n const schema = isRecord(inputParams)\n ? inputParams\n : {\n type: 'object',\n properties: {},\n };\n const normalized = normalizeStrictFunctionSchema(schema);\n return isRecord(normalized) ? normalized : { type: 'object', properties: {}, required: [], additionalProperties: false };\n}\n\nexport function transformTool(tool: ProviderTool): FunctionTool {\n // OpenAI strict mode requires every object schema to reject additional\n // properties and mark every declared property as required.\n // Ensure we always have a valid schema, even for tools with no parameters\n const inputParams = tool.function.parameters as Record<string, unknown> | null | undefined;\n\n const parameters = normalizeStrictFunctionParameters(inputParams);\n\n return {\n type: 'function',\n name: tool.function.name,\n description: tool.function.description || undefined,\n parameters,\n strict: true,\n };\n}\n\n/**\n * Transform an array of ProviderTools to Responses API format.\n * Separates function tools (for local execution) from native tools (executed by OpenAI).\n *\n * @returns Object with functionTools (regular tools) and nativeTools (OpenAI built-ins)\n */\nexport function transformTools(tools: ProviderTool[]): {\n functionTools: FunctionTool[];\n nativeTools: NativeToolType[];\n} {\n const functionTools: FunctionTool[] = [];\n const nativeTools: NativeToolType[] = [];\n\n for (const tool of tools) {\n const toolName = tool.function.name;\n\n // Check if this is an OpenAI native tool\n if (tool.executionMode === 'provider' && OPENAI_NATIVE_TOOLS.has(toolName)) {\n // Add as native tool type\n nativeTools.push({ type: toolName } as NativeToolType);\n } else {\n // Regular function tool\n functionTools.push(transformTool(tool));\n }\n }\n\n return { functionTools, nativeTools };\n}\n\n/**\n * Legacy function for backward compatibility - transforms all tools as function tools.\n * @deprecated Use transformTools() which properly handles native tools\n */\nexport function transformToolsLegacy(tools: ProviderTool[]): FunctionTool[] {\n return tools.map(transformTool);\n}\n\n/**\n * Transform tool choice option to Responses API format.\n */\nexport function transformToolChoice(\n choice: ProviderRequest['toolChoice']\n): ResponseCreateParams['tool_choice'] {\n if (choice === 'auto') {\n return 'auto';\n }\n if (choice === 'none') {\n return 'none';\n }\n if (choice === 'required') {\n return 'required';\n }\n if (typeof choice === 'object' && 'name' in choice) {\n return { type: 'function', name: choice.name };\n }\n return 'auto';\n}\n\n// ============================================================================\n// Response Transformers\n// ============================================================================\n\n/**\n * Map Responses API status/incomplete_details to Provider finish reason.\n */\nexport function mapFinishReason(response: Response): ProviderFinishReason {\n if (response.status === 'failed') {\n return 'error';\n }\n if (response.status === 'incomplete') {\n if (response.incomplete_details?.reason === 'max_output_tokens') {\n return 'length';\n }\n if (response.incomplete_details?.reason === 'content_filter') {\n return 'content_filter';\n }\n }\n\n // Check if there are function calls in the output\n const hasToolCalls = response.output.some(\n (item) => item.type === 'function_call'\n );\n if (hasToolCalls) {\n return 'tool_calls';\n }\n\n return 'stop';\n}\n\n/**\n * A terminal Responses API result that carries NO usable output is a provider\n * failure, not a finish. Returns the error to raise, or null when the response\n * is a real completion.\n *\n * - `status: \"failed\"` is always an error (the upstream `error` object, if any,\n * supplies message and code).\n * - `status: \"incomplete\"` with zero output — no assistant text and no function\n * call — is an error. Mapping it to a `length` finish (2026-10-06 incident:\n * an upstream rejection surfaced as `finish_reason: \"length\"` with 0 tokens)\n * made the runtime log a $0 SUCCESS, skip model fallbacks and spin its\n * empty-response retry loop. An `incomplete` that DID produce partial text or\n * a tool call stays a `length` / `content_filter` finish.\n */\nexport function unusableResponseError(\n response: Pick<Response, 'status' | 'output' | 'error' | 'incomplete_details'>\n): { message: string; code: string } | null {\n if (response.status === 'failed') {\n return {\n message: response.error?.message || 'Response generation failed',\n code: response.error?.code || 'server_error',\n };\n }\n if (response.status !== 'incomplete') return null;\n const output = Array.isArray(response.output) ? response.output : [];\n const hasToolCalls = output.some((item) => item.type === 'function_call');\n const text = extractTextContent(output);\n if (hasToolCalls || (text !== null && text.length > 0)) return null;\n const reason = response.incomplete_details?.reason ?? 'unknown';\n return {\n message:\n `OpenAI returned an incomplete response with no output (reason: ${reason})` +\n (response.error?.message ? `: ${response.error.message}` : ''),\n code: response.error?.code || 'invalid_request',\n };\n}\n\n/**\n * Extract text content from response output items.\n */\nexport function extractTextContent(output: ResponseOutputItem[]): string | null {\n const textParts: string[] = [];\n\n for (const item of output) {\n if (item.type === 'message' && item.role === 'assistant') {\n for (const content of item.content) {\n if (content.type === 'output_text') {\n textParts.push(content.text);\n }\n }\n }\n }\n\n return textParts.length > 0 ? textParts.join('') : null;\n}\n\n/**\n * Extract reasoning content from response output items.\n */\nexport function extractReasoningContent(output: ResponseOutputItem[]): {\n reasoning: string | null;\n reasoningDetails: ProviderReasoningDetail[] | undefined;\n} {\n let reasoning: string | null = null;\n const reasoningDetails: ProviderReasoningDetail[] = [];\n\n for (const item of output) {\n if (item.type === 'reasoning') {\n // Capture the original reasoning ID for multi-turn context (OpenAI uses rs_xxx format)\n const reasoningId = item.id;\n\n // Extract summary text\n if (item.summary && item.summary.length > 0) {\n const summaryText = item.summary\n .map((s) => s.text)\n .join('\\n');\n reasoning = reasoning ? `${reasoning}\\n${summaryText}` : summaryText;\n reasoningDetails.push({ type: 'summary', id: reasoningId, text: summaryText });\n }\n\n // Note: ResponseReasoningItem from OpenAI SDK only exposes summary and encrypted_content\n // There's no public `content` array in the SDK type - text reasoning comes via streaming events\n\n // Extract encrypted content for stateless multi-turn\n if (item.encrypted_content) {\n reasoningDetails.push({ type: 'encrypted', id: reasoningId, data: item.encrypted_content });\n }\n }\n }\n\n return {\n reasoning,\n reasoningDetails: reasoningDetails.length > 0 ? reasoningDetails : undefined,\n };\n}\n\n/**\n * Extract tool calls from response output items.\n */\nexport function extractToolCalls(\n output: ResponseOutputItem[]\n): ProviderToolCallPart[] | undefined {\n const toolCalls: ProviderToolCallPart[] = [];\n\n for (const item of output) {\n if (item.type === 'function_call') {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = item.arguments ? JSON.parse(item.arguments) : {};\n } catch {\n // Keep empty object on parse failure\n }\n\n toolCalls.push({\n id: item.call_id,\n name: item.name,\n arguments: parsedArgs,\n });\n }\n }\n\n return toolCalls.length > 0 ? toolCalls : undefined;\n}\n\n/**\n * Extract generated images from image_generation_call output items.\n */\nexport function extractProviderImages(\n output: ResponseOutputItem[]\n): ProviderGeneratedImage[] | undefined {\n const images: ProviderGeneratedImage[] = [];\n\n for (const item of output) {\n if (item.type === 'image_generation_call' && item.result) {\n images.push({\n id: item.id,\n toolName: 'image_generation',\n data: item.result,\n mediaType: 'image/png',\n // Note: OpenAI SDK ImageGenerationCall doesn't expose revised_prompt\n });\n }\n }\n\n return images.length > 0 ? images : undefined;\n}\n\nfunction normalizeProviderToolStatus(status: unknown): ProviderExecutedToolResult['status'] {\n if (status === 'completed') return 'completed';\n if (status === 'failed' || status === 'incomplete') return 'failed';\n return 'in_progress';\n}\n\nfunction getStringValue(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction extractOpenAIWebSearchActions(item: unknown): ProviderExecutedToolResult['result'] {\n if (!isRecord(item)) return undefined;\n const action = item.action;\n if (!isRecord(action)) return undefined;\n\n const type = getStringValue(action, 'type') ?? 'search';\n const query = getStringValue(action, 'query');\n const url = getStringValue(action, 'url');\n const pattern = getStringValue(action, 'pattern');\n const rawSources = action.sources;\n const sources = Array.isArray(rawSources)\n ? rawSources\n .filter(isRecord)\n .map((source) => ({\n type: getStringValue(source, 'type'),\n url: getStringValue(source, 'url') ?? '',\n title: getStringValue(source, 'title'),\n }))\n .filter((source) => source.url)\n : undefined;\n\n return {\n actions: [{\n type,\n ...(query ? { query } : {}),\n ...(url ? { url } : {}),\n ...(pattern ? { pattern } : {}),\n ...(sources && sources.length > 0 ? { sources } : {}),\n }],\n };\n}\n\nfunction extractOpenAIFileSearchResult(item: unknown): ProviderExecutedToolResult['result'] {\n if (!isRecord(item)) return undefined;\n const queries = item.queries;\n const results = item.results;\n return {\n ...(Array.isArray(queries) ? { input: { queries } } : {}),\n ...(Array.isArray(results) ? { results } : {}),\n };\n}\n\nfunction extractOpenAICodeInterpreterResult(item: unknown): ProviderExecutedToolResult['result'] {\n if (!isRecord(item)) return undefined;\n const code = getStringValue(item, 'code');\n const containerId = getStringValue(item, 'container_id');\n const outputs = item.outputs;\n const logs = Array.isArray(outputs)\n ? outputs\n .filter(isRecord)\n .map((output) => getStringValue(output, 'logs'))\n .filter((value): value is string => typeof value === 'string')\n .join('\\n')\n : '';\n\n return {\n ...(code || containerId ? { input: { ...(code ? { code } : {}), ...(containerId ? { containerId } : {}) } } : {}),\n ...(logs ? { output: logs } : {}),\n ...(Array.isArray(outputs) ? { results: outputs } : {}),\n };\n}\n\nfunction providerToolResult(\n name: string,\n id: string,\n status: unknown,\n result?: ProviderExecutedToolResult['result']\n): ProviderExecutedToolResult {\n return {\n name,\n type: name,\n provider: 'openai',\n id,\n status: normalizeProviderToolStatus(status),\n ...(result ? { result } : {}),\n };\n}\n\nexport function extractProviderToolResults(\n output: unknown[]\n): ProviderExecutedToolResult[] | undefined {\n const providerTools: ProviderExecutedToolResult[] = [];\n\n for (const item of output) {\n if (!isRecord(item)) continue;\n\n const type = getStringValue(item, 'type');\n const id = getStringValue(item, 'id');\n if (!type || !id) continue;\n\n if (type === 'web_search_call') {\n providerTools.push(providerToolResult(\n 'web_search',\n id,\n getStringValue(item, 'status'),\n extractOpenAIWebSearchActions(item)\n ));\n } else if (type === 'image_generation_call') {\n providerTools.push(providerToolResult(\n 'image_generation',\n id,\n getStringValue(item, 'status'),\n {\n artifacts: [{\n type: 'image',\n id,\n mediaType: 'image/png',\n }],\n }\n ));\n } else if (type === 'file_search_call') {\n providerTools.push(providerToolResult(\n 'file_search',\n id,\n getStringValue(item, 'status'),\n extractOpenAIFileSearchResult(item)\n ));\n } else if (type === 'code_interpreter_call') {\n providerTools.push(providerToolResult(\n 'code_interpreter',\n id,\n getStringValue(item, 'status'),\n extractOpenAICodeInterpreterResult(item)\n ));\n }\n }\n\n return providerTools.length > 0 ? providerTools : undefined;\n}\n\n/**\n * Transform Responses API usage to Provider usage format.\n */\nexport function transformUsage(\n usage: Response['usage'] | undefined,\n modelId?: string\n): ProviderUsage {\n if (!usage) {\n return {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n }\n\n const transformed: ProviderUsage = {\n promptTokens: usage.input_tokens || 0,\n completionTokens: usage.output_tokens || 0,\n totalTokens: usage.total_tokens || 0,\n reasoningTokens: usage.output_tokens_details?.reasoning_tokens,\n cachedTokens: usage.input_tokens_details?.cached_tokens,\n };\n\n if (modelId) {\n const cost = calculateOpenAIUsageCost(modelId, transformed);\n if (cost !== undefined) {\n transformed.cost = cost;\n }\n }\n\n return transformed;\n}\n\n/**\n * Transform a complete Responses API response to ProviderResponse.\n */\nexport function transformResponse(response: Response): ProviderResponse {\n const unusable = unusableResponseError(response);\n if (unusable) {\n throw new ProviderError(unusable.message, toProviderErrorCode(unusable.code), undefined, undefined, {\n cause: response,\n });\n }\n const content = extractTextContent(response.output);\n const { reasoning, reasoningDetails } = extractReasoningContent(response.output);\n const toolCalls = extractToolCalls(response.output);\n const images = extractProviderImages(response.output);\n const providerTools = extractProviderToolResults(response.output);\n\n return {\n content,\n reasoning,\n reasoningDetails,\n toolCalls,\n images,\n providerTools,\n finishReason: mapFinishReason(response),\n usage: transformUsage(response.usage, response.model),\n metadata: {\n model: response.model,\n provider: 'openai',\n requestId: response.id,\n },\n };\n}\n\n// ============================================================================\n// Request Builder\n// ============================================================================\n\n/**\n * Build a Responses API create request from a ProviderRequest.\n */\nexport function buildCreateParams(\n request: ProviderRequest,\n reasoningLevels: Record<number, string | null> = DEFAULT_REASONING_LEVELS\n): ResponseCreateParams {\n const { input, instructions } = transformMessages(request.messages);\n\n const params: ResponseCreateParams = {\n model: request.model,\n input,\n store: false, // Always stateless\n };\n\n if (instructions) {\n params.instructions = instructions;\n }\n\n // Tools\n if (request.tools && request.tools.length > 0) {\n const { functionTools, nativeTools } = transformTools(request.tools);\n\n // Check if any native tools were already used in this conversation\n // If so, exclude them from the tools list to avoid confusing the model\n // (The model sees them as function_call/function_call_output in history,\n // but having them also available as native tools causes regeneration loops)\n const usedNativeTools = new Set<string>();\n for (const msg of request.messages) {\n if (msg.role === 'tool' && msg.toolName && OPENAI_NATIVE_TOOLS.has(msg.toolName)) {\n usedNativeTools.add(msg.toolName);\n }\n }\n\n // Filter out native tools that were already used\n const availableNativeTools = nativeTools.filter(tool => {\n const toolType = (tool as { type: string }).type;\n return !usedNativeTools.has(toolType);\n });\n\n // Combine function tools and native OpenAI tools\n // Native tools (image_generation, web_search, etc.) must be added as their native types\n params.tools = [\n ...functionTools,\n ...availableNativeTools,\n ];\n\n // Include web search results if web_search tool is available\n const hasWebSearch = availableNativeTools.some(\n tool => (tool as { type: string }).type === 'web_search'\n );\n if (hasWebSearch) {\n const includeList: ResponseIncludable[] = params.include || [];\n if (!includeList.includes('web_search_call.results')) {\n includeList.push('web_search_call.results');\n }\n params.include = includeList;\n }\n\n if (request.toolChoice !== undefined) {\n params.tool_choice = transformToolChoice(request.toolChoice);\n }\n\n if (request.parallelToolCalls !== undefined) {\n params.parallel_tool_calls = request.parallelToolCalls;\n }\n }\n\n // Generation parameters\n if (request.maxOutputTokens !== undefined) {\n params.max_output_tokens = request.maxOutputTokens;\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n params.top_p = request.topP;\n }\n\n // Reasoning (o-series models)\n if (request.reasoning?.level !== undefined) {\n const effort = mapReasoningLevel(request.reasoning.level, reasoningLevels);\n if (effort) {\n params.reasoning = {\n effort: effort as 'low' | 'medium' | 'high',\n summary: 'auto',\n };\n\n // Include encrypted reasoning for stateless multi-turn\n // Note: reasoning.summary is not a valid include value - summaries come by default\n const includeList: ResponseIncludable[] = params.include || [];\n if (!includeList.includes('reasoning.encrypted_content')) {\n includeList.push('reasoning.encrypted_content');\n }\n params.include = includeList;\n }\n }\n\n // Response format\n if (request.responseFormat) {\n if (request.responseFormat.type === 'json') {\n if (request.responseFormat.schema) {\n params.text = {\n format: {\n type: 'json_schema',\n name: 'response',\n schema: request.responseFormat.schema,\n strict: true,\n },\n };\n } else {\n params.text = {\n format: { type: 'json_object' },\n };\n }\n }\n }\n\n // Merge provider-specific options (but don't let them override our managed include array)\n if (request.providerOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { include: _providerInclude, ...otherOptions } = request.providerOptions as Record<string, unknown>;\n Object.assign(params, otherOptions);\n // Note: We intentionally ignore providerOptions.include - the include array is managed\n // by buildCreateParams based on reasoning settings. User-provided include values like\n // 'reasoning.summary' are invalid and would cause API errors.\n }\n\n return params;\n}\n\n// ============================================================================\n// Stream State and Chunk Transformers\n// ============================================================================\n\nexport interface StreamState {\n toolCalls: Map<string, { id: string; name: string; arguments: string }>;\n toolCallIdsByItemId: Map<string, string>;\n imageGenerations: Map<string, { id: string; status: string }>;\n webSearches: Map<string, { id: string; status: string }>;\n reasoningContent: string;\n hasContent: boolean;\n hasReasoning: boolean;\n currentItemId: string | null;\n imageIndex: number;\n /** True once a terminal event (completed / incomplete / failed / error) arrived. */\n terminal: boolean;\n}\n\nexport function createStreamState(): StreamState {\n return {\n toolCalls: new Map(),\n toolCallIdsByItemId: new Map(),\n imageGenerations: new Map(),\n webSearches: new Map(),\n reasoningContent: '',\n hasContent: false,\n hasReasoning: false,\n currentItemId: null,\n imageIndex: 0,\n terminal: false,\n };\n}\n\ninterface CurrentReasoningDeltaEvent {\n type: 'response.reasoning.delta';\n delta: string;\n}\n\nfunction isCurrentReasoningDeltaEvent(event: unknown): event is CurrentReasoningDeltaEvent {\n return isRecord(event) && event.type === 'response.reasoning.delta' && typeof event.delta === 'string';\n}\n\nfunction resolveToolCallId(state: StreamState, itemId: string): string {\n return state.toolCallIdsByItemId.get(itemId) ?? itemId;\n}\n\nfunction getToolCallForItem(\n state: StreamState,\n itemId: string\n): { id: string; name: string; arguments: string } | undefined {\n return state.toolCalls.get(resolveToolCallId(state, itemId));\n}\n\nfunction parseToolCallArguments(argumentsJson: string): Record<string, unknown> {\n try {\n const parsed: unknown = argumentsJson ? JSON.parse(argumentsJson) : {};\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction getFunctionCallItemField(event: unknown, field: string): string | undefined {\n if (!isRecord(event) || !isRecord(event.item)) {\n return undefined;\n }\n const value = event.item[field];\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Process a stream event and return provider stream chunks.\n */\nexport function processStreamEvent(\n event: ResponseStreamEvent,\n state: StreamState\n): ProviderStreamChunk[] {\n const chunks: ProviderStreamChunk[] = [];\n const rawEvent: unknown = event;\n\n if (isCurrentReasoningDeltaEvent(rawEvent)) {\n state.hasReasoning = true;\n state.reasoningContent += rawEvent.delta;\n chunks.push({ type: 'reasoning-delta', delta: rawEvent.delta });\n return chunks;\n }\n\n switch (event.type) {\n // Text content streaming\n case 'response.output_text.delta':\n state.hasContent = true;\n chunks.push({ type: 'content-delta', delta: event.delta });\n break;\n\n case 'response.output_text.done':\n // Content done is emitted at the end\n break;\n\n // Reasoning streaming\n case 'response.reasoning_text.delta':\n state.hasReasoning = true;\n if (isRecord(event) && typeof event.delta === 'string') {\n state.reasoningContent += event.delta;\n chunks.push({ type: 'reasoning-delta', delta: event.delta });\n }\n break;\n\n case 'response.reasoning_text.done':\n // Reasoning done is emitted at the end\n break;\n\n // Function call and image generation streaming\n case 'response.output_item.added':\n if (event.item.type === 'function_call') {\n const itemId = event.item.id ?? event.item.call_id;\n state.toolCallIdsByItemId.set(itemId, event.item.call_id);\n state.toolCallIdsByItemId.set(event.item.call_id, event.item.call_id);\n state.toolCalls.set(event.item.call_id, {\n id: event.item.call_id,\n name: event.item.name,\n arguments: event.item.arguments ?? '',\n });\n chunks.push({\n type: 'tool-call-start',\n id: event.item.call_id,\n name: event.item.name,\n });\n } else if (event.item.type === 'image_generation_call') {\n // Track image generation for when it completes\n state.imageGenerations.set(event.item.id, {\n id: event.item.id,\n status: event.item.status,\n });\n } else if (event.item.type === 'web_search_call') {\n // Track web search for when it completes\n state.webSearches.set(event.item.id, {\n id: event.item.id,\n status: event.item.status,\n });\n }\n break;\n\n case 'response.output_item.done':\n // Handle completed image generation\n if (event.item.type === 'image_generation_call') {\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'image_generation',\n event.item.id,\n event.item.status,\n event.item.result\n ? {\n artifacts: [{\n type: 'image',\n id: event.item.id,\n mediaType: 'image/png',\n }],\n }\n : undefined\n ),\n });\n\n // Emit image when we have result data - don't require status to be 'completed'\n // OpenAI may return status='generating' even when the result is ready\n if (event.item.result) {\n const imageIndex = state.imageIndex;\n state.imageIndex++;\n chunks.push({\n type: 'image-done',\n index: imageIndex,\n image: {\n id: event.item.id,\n toolName: 'image_generation',\n data: event.item.result,\n mediaType: 'image/png',\n // Note: OpenAI SDK ImageGenerationCall doesn't expose revised_prompt\n },\n });\n }\n // Clean up tracking\n state.imageGenerations.delete(event.item.id);\n } else if (event.item.type === 'web_search_call') {\n // Handle completed web search\n // Extract search actions if available (requires include: ['web_search_call.results'])\n const webSearchItem = event.item as any; // Type assertion needed as SDK types may not include action\n const actions: Array<{\n type: 'search' | 'open_page' | 'find';\n query?: string;\n url?: string;\n pattern?: string;\n sources?: Array<{ type: 'url'; url: string; title?: string }>;\n }> = [];\n\n if (webSearchItem.action) {\n actions.push({\n type: webSearchItem.action.type,\n query: webSearchItem.action.query,\n url: webSearchItem.action.url,\n pattern: webSearchItem.action.pattern,\n sources: webSearchItem.action.sources,\n });\n }\n\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'web_search',\n event.item.id,\n event.item.status,\n actions.length > 0 ? { actions } : undefined\n ),\n });\n\n // Clean up tracking\n state.webSearches.delete(event.item.id);\n } else if (event.item.type === 'file_search_call') {\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'file_search',\n event.item.id,\n event.item.status,\n extractOpenAIFileSearchResult(event.item)\n ),\n });\n } else if (event.item.type === 'code_interpreter_call') {\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'code_interpreter',\n event.item.id,\n event.item.status,\n extractOpenAICodeInterpreterResult(event.item)\n ),\n });\n }\n break;\n\n case 'response.function_call_arguments.delta': {\n const deltaToolCall = getToolCallForItem(state, event.item_id);\n if (deltaToolCall) {\n deltaToolCall.arguments += event.delta;\n chunks.push({\n type: 'tool-call-delta',\n id: deltaToolCall.id,\n argumentsDelta: event.delta,\n });\n }\n break;\n }\n\n case 'response.function_call_arguments.done': {\n const doneToolCall = getToolCallForItem(state, event.item_id);\n if (doneToolCall) {\n const finalArguments =\n event.arguments ||\n getFunctionCallItemField(rawEvent, 'arguments') ||\n doneToolCall.arguments;\n doneToolCall.arguments = finalArguments;\n const parsedArgs = parseToolCallArguments(finalArguments);\n chunks.push({\n type: 'tool-call-done',\n id: doneToolCall.id,\n arguments: parsedArgs,\n });\n }\n break;\n }\n\n // Response completion\n case 'response.completed': {\n state.terminal = true;\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n\n // Extract reasoning details (including encrypted content) for multi-turn continuity\n const { reasoningDetails } = extractReasoningContent(event.response.output);\n\n chunks.push({\n type: 'finish',\n finishReason: mapFinishReason(event.response),\n usage: transformUsage(event.response.usage, event.response.model),\n reasoningDetails,\n });\n break;\n }\n\n case 'response.failed':\n state.terminal = true;\n chunks.push(\n upstreamErrorChunk(\n event.response.error?.message || 'Response generation failed',\n event.response.error?.code\n )\n );\n break;\n\n case 'response.incomplete': {\n state.terminal = true;\n // Zero output is a provider failure, not a `length` finish (see\n // unusableResponseError). Tool calls / text streamed earlier count as\n // output even when the terminal snapshot omits them.\n const unusable =\n state.hasContent || state.toolCalls.size > 0\n ? null\n : unusableResponseError(event.response);\n if (unusable) {\n chunks.push(upstreamErrorChunk(unusable.message, unusable.code));\n break;\n }\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n\n // Extract reasoning details even for incomplete responses\n const { reasoningDetails: incompleteReasoningDetails } = extractReasoningContent(event.response.output);\n\n chunks.push({\n type: 'finish',\n finishReason: mapFinishReason(event.response),\n usage: transformUsage(event.response.usage, event.response.model),\n reasoningDetails: incompleteReasoningDetails,\n });\n break;\n }\n\n // Stream-level error event (`{ type: \"error\", code, message }`): the\n // upstream aborted the response. Previously ignored, which let the stream\n // end silently and read as an empty successful completion.\n case 'error': {\n state.terminal = true;\n const errorEvent = event as { message?: string; code?: string | null };\n chunks.push(upstreamErrorChunk(errorEvent.message || 'OpenAI stream error', errorEvent.code));\n break;\n }\n\n // Ignore other events\n default:\n break;\n }\n\n return chunks;\n}\n\n/**\n * Error chunk carrying the spec error code; the raw upstream code stays in the\n * message so logs keep it (e.g. `invalid_json_schema`).\n */\nfunction upstreamErrorChunk(message: string, rawCode: string | null | undefined): ProviderStreamChunk {\n const code = toProviderErrorCode(rawCode);\n const error = rawCode && rawCode !== code ? `${message} (${rawCode})` : message;\n return { type: 'error', error, code };\n}\n\n/**\n * Stream ended without any terminal event (completed / incomplete / failed /\n * error). Returns the error chunk to emit, or null when the stream finished.\n */\nexport function unterminatedStreamError(state: StreamState): ProviderStreamChunk | null {\n if (state.terminal) return null;\n return {\n type: 'error',\n error: 'OpenAI stream ended without a terminal response event',\n code: 'server_error',\n };\n}\n\n/**\n * Map an upstream (OpenAI or router) error code onto the spec's\n * ProviderErrorCode vocabulary. Unknown codes keep the request a hard\n * failure (logged + fallbacks) without claiming it is retryable.\n */\nexport function toProviderErrorCode(code: string | null | undefined): ProviderErrorCode {\n switch (code) {\n case 'rate_limit':\n case 'rate_limit_exceeded':\n return 'rate_limit';\n case 'server_error':\n case 'server_is_overloaded':\n case 'internal_error':\n return 'server_error';\n case 'timeout':\n return 'timeout';\n case 'auth_error':\n case 'invalid_api_key':\n return 'auth_error';\n case 'unknown':\n return 'unknown';\n default:\n return 'invalid_request';\n }\n}\n\n/**\n * Create error chunk.\n */\nexport function createErrorChunk(error: string, code?: string): ProviderStreamChunk {\n return { type: 'error', error, code };\n}\n\n// ============================================================================\n// Inspection Utilities\n// ============================================================================\n\n/**\n * Check if a string looks like base64 data that should be truncated.\n * Matches data URIs and long strings with base64-like character patterns.\n */\nfunction isBase64Like(str: string): boolean {\n // Data URIs (data:image/png;base64,...)\n if (str.startsWith('data:')) return true;\n\n // Very long strings (>200 chars) that look like base64\n // Base64 only contains A-Z, a-z, 0-9, +, /, and = for padding\n if (str.length > 200) {\n const base64Pattern = /^[A-Za-z0-9+/]+=*$/;\n // Check first 200 chars to avoid regex on huge strings\n return base64Pattern.test(str.substring(0, 200));\n }\n\n return false;\n}\n\n/**\n * Truncate a base64 string for display, preserving the start and showing length.\n */\nfunction truncateBase64String(str: string, maxLength: number = 50): string {\n if (str.length <= maxLength) return str;\n\n const preview = str.substring(0, maxLength);\n return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;\n}\n\n/**\n * Recursively truncate base64 data in an object for inspection.\n * Detects base64 strings (data URIs and long base64-like strings) and truncates them.\n *\n * @param obj - The object to process\n * @param maxLength - Maximum length for base64 preview (default 50)\n * @returns A new object with base64 data truncated\n */\nexport function truncateBase64<T>(obj: T, maxLength: number = 50): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n // Handle strings\n if (typeof obj === 'string') {\n if (isBase64Like(obj)) {\n return truncateBase64String(obj, maxLength) as T;\n }\n return obj;\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map(item => truncateBase64(item, maxLength)) as T;\n }\n\n // Handle objects\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = truncateBase64(value, maxLength);\n }\n return result as T;\n }\n\n // Return primitives as-is\n return obj;\n}\n","import OPENAI_ICON_FILE from './vendor-icons/openai.svg';\n\n/**\n * OpenAI icon asset.\n */\nexport const OPENAI_ICON = OPENAI_ICON_FILE;\n\n/**\n * Convert SVG string to data URI for use in img src.\n */\nexport function svgToDataUri(svg: string): string {\n const encoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n return `data:image/svg+xml,${encoded}`;\n}\n\nfunction normalizeIcon(icon: string): string {\n if (icon.startsWith('data:') || icon.endsWith('.svg') || icon.includes('.svg?')) {\n return icon;\n }\n return svgToDataUri(icon);\n}\n\n/**\n * Get the OpenAI icon as a data URI.\n */\nexport function getOpenAIIconDataUri(): string {\n return normalizeIcon(OPENAI_ICON);\n}\n","/**\n * OpenAI provider options schema.\n *\n * Defines typed providerOptions for OpenAI models, providing\n * TypeScript autocompletion and runtime validation.\n *\n * @see https://platform.openai.com/docs/api-reference/chat/create\n * @module\n */\n\nimport { z } from 'zod';\n\n/**\n * OpenAI provider options schema.\n *\n * These options are passed directly to the OpenAI API and control\n * various aspects of request handling and generation.\n *\n * @example\n * ```typescript\n * providerOptions: {\n * service_tier: 'default',\n * user: 'user-123',\n * seed: 42,\n * }\n * ```\n */\nexport const openaiProviderOptions = z.object({\n /** Service tier for request: 'auto', 'default', or 'flex' */\n service_tier: z.enum(['auto', 'default', 'flex']).optional(),\n\n /** User identifier for abuse monitoring */\n user: z.string().optional(),\n\n /** Seed for deterministic outputs (beta feature) */\n seed: z.number().int().optional(),\n\n /** Frequency penalty (-2.0 to 2.0) - reduces repetition of tokens */\n frequency_penalty: z.number().min(-2).max(2).optional(),\n\n /** Presence penalty (-2.0 to 2.0) - encourages new topics */\n presence_penalty: z.number().min(-2).max(2).optional(),\n\n /** Whether to return log probabilities of output tokens */\n logprobs: z.boolean().optional(),\n\n /** Number of most likely tokens to return at each position (0-20) */\n top_logprobs: z.number().int().min(0).max(20).optional(),\n\n /** Whether to store the completion for future reference */\n store: z.boolean().optional(),\n\n /** Metadata for stored completions */\n metadata: z.record(z.string(), z.string()).optional(),\n}).passthrough(); // Allow unknown keys for forward compatibility\n\n/**\n * TypeScript type for OpenAI provider options.\n * Inferred from the Zod schema for type-safe usage.\n */\nexport type OpenAIProviderOptions = z.infer<typeof openaiProviderOptions>;\n","import type { ProviderFactoryWithOptions, ProviderFactoryConfig, ProviderConfigSlots } from '@standardagents/spec';\nimport { OpenAIProvider } from './OpenAIProvider';\nimport { openaiProviderOptions } from './providerOptions';\n\n/**\n * OpenAI provider factory for Standard Agents\n *\n * Includes typed providerOptions for OpenAI-specific configuration.\n *\n * @example\n * ```typescript\n * import { defineModel } from '@standardagents/builder';\n * import { openai } from '@standardagents/openai';\n *\n * export default defineModel({\n * name: 'gpt-4o',\n * provider: openai,\n * model: 'gpt-4o',\n * inputPrice: 2.5,\n * outputPrice: 10,\n * capabilities: {\n * supportsImages: true,\n * supportsToolCalls: true,\n * supportsJsonMode: true,\n * maxContextTokens: 128000,\n * },\n * providerOptions: {\n * service_tier: 'default',\n * },\n * });\n * ```\n */\nexport const openai: ProviderFactoryWithOptions<typeof openaiProviderOptions> =\n Object.assign(\n (config: ProviderFactoryConfig) => new OpenAIProvider(config),\n {\n providerOptions: openaiProviderOptions,\n configSlots: {\n apiKey: {\n type: 'secret',\n required: true,\n defaultEnv: 'OPENAI_API_KEY',\n overridable: true,\n description: 'OpenAI API key used to authenticate provider requests.',\n },\n baseUrl: {\n type: 'url',\n required: false,\n default: 'https://api.openai.com/v1',\n overridable: true,\n description: 'OpenAI-compatible API base URL.',\n },\n timeout: {\n type: 'number',\n required: false,\n default: 30000,\n overridable: true,\n description: 'Provider request timeout in milliseconds.',\n },\n } satisfies ProviderConfigSlots,\n }\n );\n\n// Re-export the provider options schema and types\nexport { openaiProviderOptions, type OpenAIProviderOptions } from './providerOptions';\n\n// Re-export the provider class for advanced usage\nexport { OpenAIProvider } from './OpenAIProvider';\n\nexport {\n calculateOpenAIUsageCost,\n getOpenAIModelPricing,\n type OpenAIModelPricing,\n} from './pricing';\n"],"mappings":"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","names":["ProviderError","normalized","ProviderError","z"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@standardagents/openai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.42.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -32,15 +32,15 @@
|
|
|
32
32
|
"test:run": "cd ../.. && vitest run --dir packages/openai"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@standardagents/provider-pricing": "0.
|
|
35
|
+
"@standardagents/provider-pricing": "0.42.0",
|
|
36
36
|
"openai": "^6.5.0",
|
|
37
37
|
"zod": "^4.3.5"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"@standardagents/spec": "^0.
|
|
40
|
+
"@standardagents/spec": "^0.42.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@standardagents/spec": "0.
|
|
43
|
+
"@standardagents/spec": "0.42.0",
|
|
44
44
|
"tsup": "^8.3.5",
|
|
45
45
|
"typescript": "^5.9.0"
|
|
46
46
|
},
|