openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
78 lines (77 loc) • 3.44 kB
JavaScript
import { l as normalizeOptionalString } from "./string-coerce-6kR-86XC.mjs";
import { A as resolveExpiresAtMsFromEpochSeconds } from "./number-coercion-Dq1l5muL.mjs";
import { a as asOptionalRecord, i as asOptionalObjectRecord } from "./record-coerce-TIsquoVR.mjs";
import "./string-coerce-runtime-B1b8UNzb.mjs";
import "./number-runtime-DyNDaYIV.mjs";
//#region extensions/openai/realtime-provider-shared.ts
const OPENAI_REALTIME_API_BASE_URL = "https://api.openai.com/v1";
const OPENAI_REALTIME_SSRF_POLICY = {
allowRfc2544BenchmarkRange: true,
allowIpv6UniqueLocalRange: true,
hostnameAllowlist: [new URL(OPENAI_REALTIME_API_BASE_URL).hostname]
};
const OPENAI_REALTIME_CLIENT_SECRET_REQUEST_TIMEOUT_MS = 3e4;
function readRealtimeErrorDetail(error) {
if (typeof error === "string" && error) return error;
const message = asOptionalRecord(error)?.message;
if (typeof message === "string" && message) return message;
return "Unknown error";
}
function resolveOpenAIProviderConfigRecord(config) {
const providers = asOptionalRecord(config.providers);
return asOptionalRecord(providers?.openai) ?? asOptionalRecord(config.openai) ?? asOptionalRecord(config);
}
async function createOpenAIRealtimeSecret(params, { createProviderHttpError, readProviderJsonResponse, resolveProviderRequestHeaders, fetchWithSsrFGuard }, label) {
const url = `${OPENAI_REALTIME_API_BASE_URL}/realtime/client_secrets`;
const { response, release } = await fetchWithSsrFGuard({
url,
init: {
method: "POST",
headers: resolveProviderRequestHeaders({
provider: "openai",
baseUrl: url,
capability: "audio",
transport: "http",
defaultHeaders: {
Authorization: `Bearer ${params.authToken}`,
"Content-Type": "application/json"
}
}) ?? {
Authorization: `Bearer ${params.authToken}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ session: params.session })
},
policy: OPENAI_REALTIME_SSRF_POLICY,
timeoutMs: OPENAI_REALTIME_CLIENT_SECRET_REQUEST_TIMEOUT_MS,
auditContext: params.auditContext
});
let payload;
try {
if (!response.ok) {
const error = await createProviderHttpError(response, `${label} client secret failed`);
if (response.status === 401 && params.authRejectedMessage) error.message = params.authRejectedMessage;
throw error;
}
payload = await readProviderJsonResponse(response, "openai.realtime-session");
} finally {
await release();
}
const record = asOptionalObjectRecord(payload);
const nestedSecret = record?.client_secret;
const clientSecret = normalizeOptionalString(asOptionalRecord(payload)?.value) ?? normalizeOptionalString(asOptionalRecord(nestedSecret)?.value);
if (!clientSecret) throw new Error(`${label} client secret response did not include a value`);
const expiresAtMs = resolveExpiresAtMsFromEpochSeconds(record?.expires_at);
return {
value: clientSecret,
...expiresAtMs === void 0 ? {} : { expiresAt: expiresAtMs }
};
}
async function createOpenAIRealtimeClientSecret(params, runtime) {
return createOpenAIRealtimeSecret(params, runtime, "OpenAI Realtime");
}
async function createOpenAIRealtimeTranscriptionClientSecret(params, runtime) {
return createOpenAIRealtimeSecret(params, runtime, "OpenAI Realtime transcription");
}
//#endregion
export { resolveOpenAIProviderConfigRecord as i, createOpenAIRealtimeTranscriptionClientSecret as n, readRealtimeErrorDetail as r, createOpenAIRealtimeClientSecret as t };