/** * Responses API Handler for Workers * Converts Chat Completions to Codex Responses API format */ import { handleChatCore } from "./chatCore.js"; import { convertResponsesApiFormat } from "../translator/helpers/responsesApiHelper.js"; import { createResponsesApiTransformStream } from "../transformer/responsesTransformer.js"; /** * Handle /v1/responses request * @param {object} options * @param {object} options.body - Request body (Responses API format) * @param {object} options.modelInfo - { provider, model } * @param {object} options.credentials - Provider credentials * @param {object} options.log - Logger instance (optional) * @param {function} options.onCredentialsRefreshed - Callback when credentials are refreshed * @param {function} options.onRequestSuccess - Callback when request succeeds * @param {function} options.onDisconnect - Callback when client disconnects * @returns {Promise<{success: boolean, response?: Response, status?: number, error?: string}>} */ export async function handleResponsesCore({ body, modelInfo, credentials, log, onCredentialsRefreshed, onRequestSuccess, onDisconnect }) { // Convert Responses API format to Chat Completions format const convertedBody = convertResponsesApiFormat(body); // Ensure stream is enabled convertedBody.stream = true; // Call chat core handler const result = await handleChatCore({ body: convertedBody, modelInfo, credentials, log, onCredentialsRefreshed, onRequestSuccess, onDisconnect }); if (!result.success || !result.response) { return result; } const response = result.response; const contentType = response.headers.get("Content-Type") || ""; // If not SSE or error, return as-is if (!contentType.includes("text/event-stream") || response.status !== 200) { return result; } // Transform SSE stream to Responses API format (no logging in worker) const transformStream = createResponsesApiTransformStream(null); const transformedBody = response.body.pipeThrough(transformStream); return { success: true, response: new Response(transformedBody, { status: 200, headers: { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", "Connection": "keep-alive", "Access-Control-Allow-Origin": "*" } }) }; }