@opengeni/xai-subscription 0.1.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/LICENSE +190 -0
- package/README.md +20 -0
- package/dist/bounded-operation.d.ts +8 -0
- package/dist/chunk-JEFGIUGN.js +80 -0
- package/dist/chunk-JEFGIUGN.js.map +1 -0
- package/dist/constants.d.ts +32 -0
- package/dist/constants.js +69 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/fetch.d.ts +7 -0
- package/dist/images.d.ts +22 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +1245 -0
- package/dist/index.js.map +1 -0
- package/dist/models.d.ts +18 -0
- package/dist/normalize.d.ts +6 -0
- package/dist/oauth.d.ts +55 -0
- package/dist/proxy.d.ts +17 -0
- package/dist/quota.d.ts +24 -0
- package/dist/request-context.d.ts +26 -0
- package/dist/video.d.ts +53 -0
- package/package.json +45 -0
- package/src/bounded-operation.ts +33 -0
- package/src/constants.ts +53 -0
- package/src/errors.ts +34 -0
- package/src/fetch.ts +234 -0
- package/src/images.ts +176 -0
- package/src/index.ts +12 -0
- package/src/models.ts +99 -0
- package/src/normalize.ts +146 -0
- package/src/oauth.ts +335 -0
- package/src/proxy.ts +86 -0
- package/src/quota.ts +101 -0
- package/src/request-context.ts +31 -0
- package/src/video.ts +388 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/bounded-operation.ts","../src/oauth.ts","../src/request-context.ts","../src/normalize.ts","../src/fetch.ts","../src/proxy.ts","../src/quota.ts","../src/models.ts","../src/images.ts","../src/video.ts"],"sourcesContent":["export type XaiSubscriptionErrorKind =\n | \"invalid_response\"\n | \"not_enabled\"\n | \"authorization_denied\"\n | \"device_code_expired\"\n | \"relogin_required\"\n | \"transient\"\n | \"provider_rejected\"\n | \"timeout\";\n\nexport class XaiSubscriptionError extends Error {\n constructor(\n readonly kind: XaiSubscriptionErrorKind,\n message: string,\n readonly status?: number,\n ) {\n super(message);\n this.name = \"XaiSubscriptionError\";\n }\n}\n\nexport class XaiSubscriptionReloginRequired extends XaiSubscriptionError {\n constructor(message = \"The SuperGrok connection is no longer valid. Reconnect the account.\") {\n super(\"relogin_required\", message);\n this.name = \"XaiSubscriptionReloginRequired\";\n }\n}\n\nexport class XaiSubscriptionTransientError extends XaiSubscriptionError {\n constructor(message: string, status?: number) {\n super(\"transient\", message, status);\n this.name = \"XaiSubscriptionTransientError\";\n }\n}\n","export type XaiOperationFailureReason = \"network_error\" | \"timeout\";\n\nexport async function runBoundedXaiOperation<T>(\n operation: (signal: AbortSignal) => Promise<T>,\n timeoutMs: number,\n): Promise<{ ok: true; value: T } | { ok: false; reason: XaiOperationFailureReason }> {\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error(\"xAI operation timeout must be positive\");\n }\n const controller = new AbortController();\n let timedOut = false;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const work = operation(controller.signal).then(\n (value) => ({ ok: true as const, value }),\n () => ({\n ok: false as const,\n reason:\n timedOut || controller.signal.aborted ? (\"timeout\" as const) : (\"network_error\" as const),\n }),\n );\n const deadline = new Promise<{ ok: false; reason: \"timeout\" }>((resolve) => {\n timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n resolve({ ok: false, reason: \"timeout\" });\n }, timeoutMs);\n });\n try {\n return await Promise.race([work, deadline]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n","import {\n OAUTH_MAX_RESPONSE_BYTES,\n readResponseJsonBounded,\n validateHttpUrl,\n} from \"@opengeni/network\";\n\nimport { runBoundedXaiOperation } from \"./bounded-operation\";\nimport {\n XAI_CLIENT_VERSION,\n XAI_DEVICE_AUTHORIZATION_URL,\n XAI_DEVICE_CODE_GRANT_TYPE,\n XAI_OAUTH_CLIENT_ID,\n XAI_OAUTH_OPERATION_TIMEOUT_MS,\n XAI_OAUTH_SCOPES,\n XAI_TOKEN_URL,\n XAI_USERINFO_URL,\n} from \"./constants\";\nimport {\n XaiSubscriptionError,\n XaiSubscriptionReloginRequired,\n XaiSubscriptionTransientError,\n} from \"./errors\";\n\nexport type XaiFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport type XaiDeviceCode = {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string | null;\n expiresInSeconds: number;\n intervalSeconds: number;\n};\n\nexport type XaiOAuthTokens = {\n accessToken: string;\n refreshToken: string;\n idToken: string | null;\n tokenType: string | null;\n scope: string | null;\n expiresInSeconds: number;\n};\n\nexport type XaiDevicePollResult =\n | { status: \"pending\"; intervalSeconds: number }\n | { status: \"slow_down\"; intervalSeconds: number }\n | { status: \"expired\" }\n | { status: \"denied\" }\n | { status: \"authorized\"; tokens: XaiOAuthTokens };\n\nexport type XaiVerifiedIdentity = {\n subject: string;\n email: string | null;\n emailVerified: boolean | null;\n name: string | null;\n};\n\ntype XaiOAuthOptions = {\n fetch?: XaiFetch;\n clientId?: string;\n deviceAuthorizationUrl?: string;\n tokenUrl?: string;\n userinfoUrl?: string;\n timeoutMs?: number;\n};\n\nfunction oauthHeaders(): Headers {\n return new Headers({\n accept: \"application/json\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": `opengeni/${XAI_CLIENT_VERSION}`,\n \"x-grok-client-version\": XAI_CLIENT_VERSION,\n \"x-grok-client-surface\": \"headless\",\n });\n}\n\nfunction positiveSeconds(value: unknown, fallback: number): number {\n const number = Number(value);\n return Number.isFinite(number) && number > 0 ? Math.ceil(number) : fallback;\n}\n\nfunction requireNonEmptyString(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new XaiSubscriptionError(\"invalid_response\", `xAI OAuth response is missing ${field}`);\n }\n return value;\n}\n\nfunction nullableString(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nfunction validateUserCode(userCode: string): void {\n if (![...userCode].every((char) => /[A-Za-z0-9-]/.test(char))) {\n throw new XaiSubscriptionError(\"invalid_response\", \"xAI returned an invalid user code\");\n }\n}\n\nfunction validateVerificationUri(uri: string): string {\n try {\n return validateHttpUrl(uri, {\n allowLoopbackHttp: true,\n label: \"xAI device verification\",\n });\n } catch {\n throw new XaiSubscriptionError(\"invalid_response\", \"xAI returned an invalid verification URL\");\n }\n}\n\nasync function boundedFetchJson(\n label: string,\n input: string,\n init: RequestInit,\n options: Pick<XaiOAuthOptions, \"fetch\" | \"timeoutMs\">,\n): Promise<{ response: Response; body: Record<string, unknown> }> {\n const fetchImpl = options.fetch ?? fetch;\n const timeoutMs = options.timeoutMs ?? XAI_OAUTH_OPERATION_TIMEOUT_MS;\n const fetched = await runBoundedXaiOperation(async (signal) => {\n const response = await fetchImpl(input, { ...init, signal });\n const body = await readResponseJsonBounded<Record<string, unknown>>(\n response,\n OAUTH_MAX_RESPONSE_BYTES,\n label,\n { signal },\n );\n return { response, body };\n }, timeoutMs);\n if (!fetched.ok) {\n throw new XaiSubscriptionTransientError(`xAI ${label} ${fetched.reason}`);\n }\n return fetched.value;\n}\n\nexport async function requestXaiDeviceCode(options: XaiOAuthOptions = {}): Promise<XaiDeviceCode> {\n const { response, body } = await boundedFetchJson(\n \"device code request\",\n options.deviceAuthorizationUrl ?? XAI_DEVICE_AUTHORIZATION_URL,\n {\n method: \"POST\",\n headers: oauthHeaders(),\n body: new URLSearchParams({\n client_id: options.clientId ?? XAI_OAUTH_CLIENT_ID,\n scope: XAI_OAUTH_SCOPES.join(\" \"),\n referrer: \"opengeni\",\n }).toString(),\n },\n options,\n );\n if (response.status === 404) {\n throw new XaiSubscriptionError(\n \"not_enabled\",\n \"SuperGrok device-code login is not enabled by xAI\",\n 404,\n );\n }\n if (!response.ok) {\n throw new XaiSubscriptionTransientError(\n `xAI device code request failed (${response.status})`,\n response.status,\n );\n }\n\n const deviceCode = requireNonEmptyString(body.device_code, \"device_code\");\n const userCode = requireNonEmptyString(body.user_code, \"user_code\");\n const verificationUri = validateVerificationUri(\n requireNonEmptyString(body.verification_uri, \"verification_uri\"),\n );\n const verificationUriComplete = nullableString(body.verification_uri_complete);\n validateUserCode(userCode);\n\n return {\n deviceCode,\n userCode,\n verificationUri,\n verificationUriComplete: verificationUriComplete\n ? validateVerificationUri(verificationUriComplete)\n : null,\n expiresInSeconds: positiveSeconds(body.expires_in, 5 * 60),\n intervalSeconds: Math.max(1, positiveSeconds(body.interval, 5)),\n };\n}\n\nexport async function pollXaiDeviceCode(\n input: { deviceCode: string; intervalSeconds: number },\n options: XaiOAuthOptions = {},\n): Promise<XaiDevicePollResult> {\n const { response, body } = await boundedFetchJson(\n \"device token exchange\",\n options.tokenUrl ?? XAI_TOKEN_URL,\n {\n method: \"POST\",\n headers: oauthHeaders(),\n body: new URLSearchParams({\n grant_type: XAI_DEVICE_CODE_GRANT_TYPE,\n client_id: options.clientId ?? XAI_OAUTH_CLIENT_ID,\n device_code: input.deviceCode,\n }).toString(),\n },\n options,\n );\n\n if (response.ok) {\n return { status: \"authorized\", tokens: parseTokenResponse(body, true) };\n }\n const code = nullableString(body.error);\n if (code === \"authorization_pending\") {\n return { status: \"pending\", intervalSeconds: Math.max(1, input.intervalSeconds) };\n }\n if (code === \"slow_down\") {\n return { status: \"slow_down\", intervalSeconds: Math.max(1, input.intervalSeconds) + 5 };\n }\n if (code === \"access_denied\" || code === \"authorization_denied\") {\n return { status: \"denied\" };\n }\n if (code === \"expired_token\") {\n return { status: \"expired\" };\n }\n throw new XaiSubscriptionTransientError(\n `xAI device token exchange failed (${response.status})`,\n response.status,\n );\n}\n\nexport async function refreshXaiToken(\n refreshToken: string,\n options: XaiOAuthOptions = {},\n): Promise<XaiOAuthTokens> {\n const { response, body } = await boundedFetchJson(\n \"token refresh\",\n options.tokenUrl ?? XAI_TOKEN_URL,\n {\n method: \"POST\",\n headers: oauthHeaders(),\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n client_id: options.clientId ?? XAI_OAUTH_CLIENT_ID,\n }).toString(),\n },\n options,\n );\n if (!response.ok) {\n const code = nullableString(body.error);\n if (\n response.status === 401 ||\n code === \"invalid_grant\" ||\n code === \"invalid_token\" ||\n code === \"access_denied\"\n ) {\n throw new XaiSubscriptionReloginRequired();\n }\n throw new XaiSubscriptionTransientError(\n `xAI token refresh failed (${response.status})`,\n response.status,\n );\n }\n const parsed = parseTokenResponse(body, false);\n return {\n ...parsed,\n refreshToken: parsed.refreshToken || refreshToken,\n };\n}\n\nfunction parseTokenResponse(\n body: Record<string, unknown>,\n requireRefresh: boolean,\n): XaiOAuthTokens {\n const accessToken = requireNonEmptyString(body.access_token, \"access_token\");\n const refreshToken = nullableString(body.refresh_token);\n if (requireRefresh && !refreshToken) {\n throw new XaiSubscriptionError(\n \"invalid_response\",\n \"xAI OAuth response is missing refresh_token\",\n );\n }\n return {\n accessToken,\n refreshToken: refreshToken ?? \"\",\n idToken: nullableString(body.id_token),\n tokenType: nullableString(body.token_type),\n scope: nullableString(body.scope),\n expiresInSeconds: positiveSeconds(body.expires_in, 60 * 60),\n };\n}\n\nexport async function fetchXaiVerifiedIdentity(\n accessToken: string,\n options: XaiOAuthOptions = {},\n): Promise<XaiVerifiedIdentity> {\n const headers = new Headers({\n accept: \"application/json\",\n authorization: `Bearer ${accessToken}`,\n \"user-agent\": `opengeni/${XAI_CLIENT_VERSION}`,\n \"x-grok-client-version\": XAI_CLIENT_VERSION,\n });\n const { response, body } = await boundedFetchJson(\n \"userinfo request\",\n options.userinfoUrl ?? XAI_USERINFO_URL,\n { method: \"GET\", headers },\n options,\n );\n if (response.status === 401 || response.status === 403) {\n throw new XaiSubscriptionReloginRequired();\n }\n if (!response.ok) {\n throw new XaiSubscriptionTransientError(\n `xAI userinfo request failed (${response.status})`,\n response.status,\n );\n }\n return {\n subject: requireNonEmptyString(body.sub, \"userinfo sub\"),\n email: nullableString(body.email),\n emailVerified: typeof body.email_verified === \"boolean\" ? body.email_verified : null,\n name: nullableString(body.name),\n };\n}\n\nexport function decodeXaiJwtPayload(jwt: string): Record<string, unknown> | null {\n const payload = jwt.split(\".\")[1];\n if (!payload) return null;\n try {\n return JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as Record<\n string,\n unknown\n >;\n } catch {\n return null;\n }\n}\n\nexport function xaiAccessTokenExpiry(accessToken: string): Date | null {\n const payload = decodeXaiJwtPayload(accessToken);\n return typeof payload?.exp === \"number\" ? new Date(payload.exp * 1_000) : null;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type XaiSubscriptionTokenSnapshot = {\n accessToken: string;\n userId: string;\n};\n\nexport type XaiHostedSearchOptions = {\n webSearch?: boolean | Record<string, unknown>;\n xSearch?: boolean | Record<string, unknown>;\n};\n\nexport type XaiFinalContextUsage = {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n};\n\nexport type XaiSubscriptionRequestContext = {\n clientVersion: string;\n sessionId: string;\n turnId: string;\n getToken: () => Promise<XaiSubscriptionTokenSnapshot>;\n refresh: () => Promise<XaiSubscriptionTokenSnapshot>;\n resolveModel: (slug: string) => string;\n hostedSearch?: XaiHostedSearchOptions;\n onFinalContextUsage?: (usage: XaiFinalContextUsage) => void;\n nextRequestId?: () => string;\n};\n\nexport const xaiSubscriptionRequestStorage = new AsyncLocalStorage<XaiSubscriptionRequestContext>();\n","import type { XaiHostedSearchOptions } from \"./request-context\";\n\nconst XAI_INTERNAL_MODEL_HANDOFF_PREFIX = \"supergrok/\";\n\nexport function normalizeXaiSubscriptionRequestBody(\n value: unknown,\n resolveModel: (slug: string) => string,\n hostedSearch?: XaiHostedSearchOptions,\n): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"SuperGrok subscription request body must be a JSON object\");\n }\n const body = { ...(value as Record<string, unknown>) };\n if (typeof body.model !== \"string\") {\n throw new Error(\"SuperGrok subscription request is missing model\");\n }\n const candidate = body.model.startsWith(XAI_INTERNAL_MODEL_HANDOFF_PREFIX)\n ? body.model.slice(XAI_INTERNAL_MODEL_HANDOFF_PREFIX.length)\n : body.model;\n body.model = resolveModel(candidate);\n body.store = false;\n\n const include = Array.isArray(body.include)\n ? body.include.filter((entry): entry is string => typeof entry === \"string\")\n : [];\n if (!include.includes(\"reasoning.encrypted_content\")) {\n include.push(\"reasoning.encrypted_content\");\n }\n body.include = include;\n\n const tools = Array.isArray(body.tools) ? body.tools.map(normalizeXaiSubscriptionTool) : [];\n appendHostedTool(tools, \"web_search\", hostedSearch?.webSearch);\n appendHostedTool(tools, \"x_search\", hostedSearch?.xSearch);\n if (tools.length > 0) body.tools = tools;\n return body;\n}\n\nfunction normalizeXaiSubscriptionTool(tool: unknown): unknown {\n if (!tool || typeof tool !== \"object\" || Array.isArray(tool)) return tool;\n const record = tool as Record<string, unknown>;\n if (record.type !== \"web_search\") return tool;\n // OpenAI's Responses tool factory adds this tuning hint. Grok's CLI proxy\n // supports native web_search but rejects the OpenAI-only argument.\n const { search_context_size: _unsupported, ...supported } = record;\n return supported;\n}\n\nfunction appendHostedTool(\n tools: unknown[],\n type: \"web_search\" | \"x_search\",\n options: boolean | Record<string, unknown> | undefined,\n): void {\n if (!options) return;\n if (\n tools.some(\n (tool) =>\n tool &&\n typeof tool === \"object\" &&\n !Array.isArray(tool) &&\n (tool as Record<string, unknown>).type === type,\n )\n ) {\n return;\n }\n tools.push(normalizeXaiSubscriptionTool(options === true ? { type } : { type, ...options }));\n}\n\nexport function normalizeXaiResponseEventJson(value: unknown): {\n value: unknown;\n finalContextTokens: number | null;\n} {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return { value, finalContextTokens: null };\n }\n const event = value as Record<string, unknown>;\n const response =\n event.response && typeof event.response === \"object\" && !Array.isArray(event.response)\n ? { ...(event.response as Record<string, unknown>) }\n : null;\n if (!response) return { value, finalContextTokens: null };\n\n let changed = false;\n if (Array.isArray(response.tools)) {\n const filtered = response.tools.filter((tool) => isOpenAiSdkResponseTool(tool));\n if (filtered.length !== response.tools.length) {\n response.tools = filtered;\n changed = true;\n }\n }\n\n let finalContextTokens: number | null = null;\n if (event.type === \"response.completed\" || event.type === \"response.incomplete\") {\n const usage =\n response.usage && typeof response.usage === \"object\" && !Array.isArray(response.usage)\n ? { ...(response.usage as Record<string, unknown>) }\n : null;\n const context =\n usage?.context_details &&\n typeof usage.context_details === \"object\" &&\n !Array.isArray(usage.context_details)\n ? (usage.context_details as Record<string, unknown>)\n : null;\n const inputTokens = finiteNonNegativeInteger(context?.input_tokens);\n const outputTokens = finiteNonNegativeInteger(context?.output_tokens);\n if (usage && inputTokens !== null && outputTokens !== null) {\n finalContextTokens = inputTokens + outputTokens;\n usage.total_tokens = finalContextTokens;\n response.usage = usage;\n changed = true;\n }\n }\n return {\n value: changed ? { ...event, response } : value,\n finalContextTokens,\n };\n}\n\nfunction finiteNonNegativeInteger(value: unknown): number | null {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : null;\n}\n\n// The OpenAI SDK knows these Responses tool declaration families. x_search is\n// intentionally absent: xAI executes it server-side and echoes it only in the\n// response.tools declaration list, while its output items remain untouched.\nfunction isOpenAiSdkResponseTool(tool: unknown): boolean {\n if (!tool || typeof tool !== \"object\" || Array.isArray(tool)) return false;\n const type = (tool as Record<string, unknown>).type;\n return (\n typeof type === \"string\" &&\n [\n \"function\",\n \"file_search\",\n \"computer_use_preview\",\n \"computer\",\n \"web_search\",\n \"web_search_preview\",\n \"code_interpreter\",\n \"image_generation\",\n \"local_shell\",\n \"shell\",\n \"apply_patch\",\n \"mcp\",\n \"custom\",\n ].includes(type)\n );\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport { XAI_CLIENT_MODE, XAI_CLIENT_VERSION, XAI_TOKEN_AUTH_HEADER_VALUE } from \"./constants\";\nimport { normalizeXaiResponseEventJson, normalizeXaiSubscriptionRequestBody } from \"./normalize\";\nimport { type XaiFinalContextUsage, xaiSubscriptionRequestStorage } from \"./request-context\";\n\nexport type XaiFetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nconst REPLAYABLE_REQUEST_BODY_FACTORY = Symbol.for(\"opengeni.replayable-request-body-factory\");\ntype ReplayableRequestInit = RequestInit & {\n [REPLAYABLE_REQUEST_BODY_FACTORY]?: () => ReadableStream<Uint8Array>;\n};\n\nexport const XAI_SUBSCRIPTION_TRANSPORT_ERROR_HEADER =\n \"x-opengeni-xai-subscription-transport-error\";\nexport const XAI_SUBSCRIPTION_REQUEST_BODY_NORMALIZED_HEADER =\n \"x-opengeni-xai-subscription-body-normalized\";\nexport const XAI_SUBSCRIPTION_REQUEST_MODEL_HEADER = \"x-opengeni-xai-subscription-model\";\nexport const XAI_SUBSCRIPTION_REQUEST_ID_HEADER = \"x-opengeni-xai-subscription-request-id\";\n\nconst MAX_ERROR_BODY_BYTES = 64 * 1024;\n\nexport function xaiSubscriptionFetch(base: XaiFetchLike): XaiFetchLike {\n return async (input, init) => {\n const context = xaiSubscriptionRequestStorage.getStore();\n if (!context) throw new Error(\"SuperGrok subscription request context is unavailable\");\n\n const originalUrl = input instanceof Request ? input.url : String(input);\n const url = new URL(originalUrl);\n if (!url.pathname.endsWith(\"/responses\")) {\n throw new Error(\"SuperGrok subscription models require the Responses API\");\n }\n const originalHeaders = new Headers(input instanceof Request ? input.headers : undefined);\n if (init?.headers) {\n new Headers(init.headers).forEach((value, key) => originalHeaders.set(key, value));\n }\n const normalized = originalHeaders.get(XAI_SUBSCRIPTION_REQUEST_BODY_NORMALIZED_HEADER) === \"1\";\n const requestId = originalHeaders.get(XAI_SUBSCRIPTION_REQUEST_ID_HEADER) ?? randomUUID();\n const handedOffModel = originalHeaders.get(XAI_SUBSCRIPTION_REQUEST_MODEL_HEADER);\n originalHeaders.delete(XAI_SUBSCRIPTION_REQUEST_BODY_NORMALIZED_HEADER);\n originalHeaders.delete(XAI_SUBSCRIPTION_REQUEST_ID_HEADER);\n originalHeaders.delete(XAI_SUBSCRIPTION_REQUEST_MODEL_HEADER);\n\n const replayableBodyFactory = (init as ReplayableRequestInit | undefined)?.[\n REPLAYABLE_REQUEST_BODY_FACTORY\n ];\n const body = await requestBodyText(input, init, replayableBodyFactory);\n const parsed = body ? (JSON.parse(body) as unknown) : {};\n const normalizedBody = normalized\n ? (parsed as Record<string, unknown>)\n : normalizeXaiSubscriptionRequestBody(parsed, context.resolveModel, context.hostedSearch);\n const model =\n handedOffModel ??\n (typeof normalizedBody.model === \"string\" ? normalizedBody.model : \"grok-4.6\");\n\n const send = async (refresh: boolean): Promise<Response> => {\n const token = refresh ? await context.refresh() : await context.getToken();\n const headers = new Headers(originalHeaders);\n headers.set(\"authorization\", `Bearer ${token.accessToken}`);\n headers.set(\"content-type\", \"application/json\");\n headers.set(\"accept\", \"text/event-stream\");\n headers.set(\"user-agent\", `opengeni/${context.clientVersion || XAI_CLIENT_VERSION}`);\n headers.set(\"x-grok-client-version\", context.clientVersion || XAI_CLIENT_VERSION);\n headers.set(\"x-grok-client-identifier\", \"opengeni\");\n headers.set(\"x-grok-client-mode\", XAI_CLIENT_MODE);\n headers.set(\"x-authenticateresponse\", \"authenticate-response\");\n headers.set(\"x-xai-token-auth\", XAI_TOKEN_AUTH_HEADER_VALUE);\n headers.set(\"x-userid\", token.userId);\n headers.set(\"x-grok-user-id\", token.userId);\n headers.set(\"x-grok-conv-id\", context.sessionId);\n headers.set(\"x-grok-session-id\", context.sessionId);\n headers.set(\"x-grok-req-id\", requestId);\n headers.set(\"x-grok-agent-id\", context.turnId);\n headers.set(\"x-grok-model-override\", model);\n return await base(url, {\n ...init,\n method: init?.method ?? (input instanceof Request ? input.method : \"POST\"),\n headers,\n body: JSON.stringify(normalizedBody),\n });\n };\n\n let response = await send(false);\n if (response.status === 401) {\n await response.body?.cancel().catch(() => undefined);\n response = await send(true);\n }\n return await normalizeResponse(response, context.onFinalContextUsage);\n };\n}\n\nasync function requestBodyText(\n input: string | URL | Request,\n init: RequestInit | undefined,\n replayableBodyFactory: (() => ReadableStream<Uint8Array>) | undefined,\n): Promise<string> {\n if (typeof init?.body === \"string\") return init.body;\n if (input instanceof Request) return await input.clone().text();\n if (replayableBodyFactory) return await new Response(replayableBodyFactory()).text();\n if (init?.body === undefined || init.body === null) return \"\";\n throw new Error(\"SuperGrok subscription request body must be replayable JSON text\");\n}\n\nasync function normalizeResponse(\n response: Response,\n onFinalContextUsage: ((usage: XaiFinalContextUsage) => void) | undefined,\n): Promise<Response> {\n if (!response.ok) {\n const bytes = new Uint8Array(await response.arrayBuffer());\n const bounded =\n bytes.byteLength > MAX_ERROR_BODY_BYTES ? bytes.slice(0, MAX_ERROR_BODY_BYTES) : bytes;\n const headers = new Headers(response.headers);\n headers.set(XAI_SUBSCRIPTION_TRANSPORT_ERROR_HEADER, \"1\");\n return new Response(bounded, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n }\n if (!response.body) return response;\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"text/event-stream\")) {\n const value = await response.json();\n const normalized = normalizeXaiResponseEventJson({\n type: \"response.completed\",\n response: value,\n });\n emitContextUsage(normalized.value, normalized.finalContextTokens, onFinalContextUsage);\n const responseValue =\n normalized.value && typeof normalized.value === \"object\" && !Array.isArray(normalized.value)\n ? (normalized.value as Record<string, unknown>).response\n : value;\n return Response.json(responseValue, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n let pending = \"\";\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n const chunk = await reader.read();\n pending += decoder.decode(chunk.value, { stream: !chunk.done });\n const parts = pending.split(\"\\n\\n\");\n pending = parts.pop() ?? \"\";\n for (const part of parts)\n controller.enqueue(encoder.encode(`${normalizeSseEvent(part, onFinalContextUsage)}\\n\\n`));\n if (chunk.done) {\n if (pending)\n controller.enqueue(encoder.encode(normalizeSseEvent(pending, onFinalContextUsage)));\n controller.close();\n }\n },\n cancel(reason) {\n return reader.cancel(reason);\n },\n });\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n\nfunction normalizeSseEvent(\n block: string,\n onFinalContextUsage: ((usage: XaiFinalContextUsage) => void) | undefined,\n): string {\n const lines = block.split(\"\\n\");\n return lines\n .map((line) => {\n if (!line.startsWith(\"data:\")) return line;\n const data = line.slice(5).trimStart();\n if (!data || data === \"[DONE]\") return line;\n try {\n const normalized = normalizeXaiResponseEventJson(JSON.parse(data));\n emitContextUsage(normalized.value, normalized.finalContextTokens, onFinalContextUsage);\n return `data: ${JSON.stringify(normalized.value)}`;\n } catch {\n return line;\n }\n })\n .join(\"\\n\");\n}\n\nfunction emitContextUsage(\n value: unknown,\n finalContextTokens: number | null,\n sink: ((usage: XaiFinalContextUsage) => void) | undefined,\n): void {\n if (finalContextTokens === null || !sink) return;\n const response =\n value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>).response\n : null;\n const usage =\n response && typeof response === \"object\" && !Array.isArray(response)\n ? (response as Record<string, unknown>).usage\n : null;\n const context =\n usage && typeof usage === \"object\" && !Array.isArray(usage)\n ? (usage as Record<string, unknown>).context_details\n : null;\n if (!context || typeof context !== \"object\" || Array.isArray(context)) return;\n const inputTokens = Number((context as Record<string, unknown>).input_tokens);\n const outputTokens = Number((context as Record<string, unknown>).output_tokens);\n if (!Number.isSafeInteger(inputTokens) || !Number.isSafeInteger(outputTokens)) return;\n try {\n sink({ inputTokens, outputTokens, totalTokens: finalContextTokens });\n } catch {\n // Usage observation must never alter model transport.\n }\n}\n\nexport function isXaiSubscriptionTransportError(error: unknown): boolean {\n let current: unknown = error;\n for (let depth = 0; depth < 6 && current && typeof current === \"object\"; depth += 1) {\n const value = current as Record<string, unknown>;\n const headers = value.headers;\n if (\n headers &&\n typeof headers === \"object\" &&\n typeof (headers as { get?: unknown }).get === \"function\" &&\n (headers as Headers).get(XAI_SUBSCRIPTION_TRANSPORT_ERROR_HEADER) === \"1\"\n ) {\n return true;\n }\n current = value.cause;\n }\n return false;\n}\n","import { OAUTH_MAX_RESPONSE_BYTES, pinnedFetch, readResponseJsonBounded } from \"@opengeni/network\";\n\nimport { runBoundedXaiOperation } from \"./bounded-operation\";\nimport {\n XAI_CLIENT_MODE,\n XAI_CLIENT_VERSION,\n XAI_SUBSCRIPTION_PROXY_BASE_URL,\n XAI_TOKEN_AUTH_HEADER_VALUE,\n} from \"./constants\";\nimport { XaiSubscriptionReloginRequired, XaiSubscriptionTransientError } from \"./errors\";\nimport type { XaiFetchLike } from \"./fetch\";\nimport type { XaiSubscriptionTokenSnapshot } from \"./request-context\";\n\nexport type XaiProxyAuthContext = {\n clientVersion?: string;\n getToken: () => Promise<XaiSubscriptionTokenSnapshot>;\n refresh: () => Promise<XaiSubscriptionTokenSnapshot>;\n};\n\nconst defaultProxyFetch: XaiFetchLike = async (input, init) =>\n await pinnedFetch(\n input,\n init,\n { environment: \"production\", integrationsAllowPrivateNetworkTargets: false },\n { label: \"xAI subscription proxy\", requireHttpsOutsideLocalTest: true },\n );\n\nexport async function fetchXaiProxyJson<T>(input: {\n path: string;\n context: XaiProxyAuthContext;\n fetch?: XaiFetchLike;\n timeoutMs?: number;\n maxBytes?: number;\n baseUrl?: string;\n label: string;\n}): Promise<T> {\n const fetchImpl = input.fetch ?? defaultProxyFetch;\n const timeoutMs = input.timeoutMs ?? 15_000;\n const maxBytes = input.maxBytes ?? OAUTH_MAX_RESPONSE_BYTES;\n const url = `${(input.baseUrl ?? XAI_SUBSCRIPTION_PROXY_BASE_URL).replace(/\\/+$/, \"\")}/${input.path.replace(/^\\/+/, \"\")}`;\n const request = async (token: XaiSubscriptionTokenSnapshot, signal: AbortSignal) => {\n const headers = xaiSubscriptionProxyHeaders(token, input.context.clientVersion);\n return await fetchImpl(url, { method: \"GET\", redirect: \"error\", headers, signal });\n };\n const fetched = await runBoundedXaiOperation(async (signal) => {\n let response = await request(await input.context.getToken(), signal);\n if (response.status === 401) {\n await response.body?.cancel().catch(() => undefined);\n response = await request(await input.context.refresh(), signal);\n }\n if (response.status === 401 || response.status === 403) {\n await response.body?.cancel().catch(() => undefined);\n throw new XaiSubscriptionReloginRequired();\n }\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined);\n throw new XaiSubscriptionTransientError(\n `xAI ${input.label} failed (${response.status})`,\n response.status,\n );\n }\n return await readResponseJsonBounded<T>(response, maxBytes, `xAI ${input.label}`, { signal });\n }, timeoutMs);\n if (!fetched.ok) {\n throw new XaiSubscriptionTransientError(`xAI ${input.label} ${fetched.reason}`);\n }\n return fetched.value;\n}\n\nexport function xaiSubscriptionProxyHeaders(\n token: XaiSubscriptionTokenSnapshot,\n clientVersion = XAI_CLIENT_VERSION,\n): Headers {\n return new Headers({\n accept: \"application/json\",\n authorization: `Bearer ${token.accessToken}`,\n \"user-agent\": `opengeni/${clientVersion}`,\n \"x-grok-client-version\": clientVersion,\n \"x-grok-client-identifier\": \"opengeni\",\n \"x-grok-client-mode\": XAI_CLIENT_MODE,\n \"x-authenticateresponse\": \"authenticate-response\",\n \"x-xai-token-auth\": XAI_TOKEN_AUTH_HEADER_VALUE,\n \"x-userid\": token.userId,\n \"x-grok-user-id\": token.userId,\n });\n}\n","import type { XaiFetchLike } from \"./fetch\";\nimport { fetchXaiProxyJson, type XaiProxyAuthContext } from \"./proxy\";\n\nexport type XaiUsagePeriod = {\n type: string | null;\n start: Date | null;\n end: Date | null;\n};\n\nexport type XaiSubscriptionQuota = {\n usedPercent: number | null;\n period: XaiUsagePeriod | null;\n prepaidBalanceCents: number | null;\n onDemandCapCents: number | null;\n onDemandUsedCents: number | null;\n onDemandEnabled: boolean | null;\n unifiedBilling: boolean | null;\n subscriptionTier: string | null;\n checkedAt: Date;\n};\n\nexport async function fetchXaiSubscriptionQuota(input: {\n context: XaiProxyAuthContext;\n fetch?: XaiFetchLike;\n timeoutMs?: number;\n baseUrl?: string;\n}): Promise<XaiSubscriptionQuota> {\n const body = await fetchXaiProxyJson<Record<string, unknown>>({\n path: \"billing?format=credits\",\n context: input.context,\n ...(input.fetch ? { fetch: input.fetch } : {}),\n ...(input.timeoutMs ? { timeoutMs: input.timeoutMs } : {}),\n ...(input.baseUrl ? { baseUrl: input.baseUrl } : {}),\n label: \"billing request\",\n });\n const config = record(body.config);\n const currentPeriod = record(config?.currentPeriod ?? config?.current_period);\n const monthlyLimit = cents(config?.monthlyLimit ?? config?.monthly_limit);\n const used = cents(config?.used);\n const directPercent = finitePercent(config?.creditUsagePercent ?? config?.credit_usage_percent);\n const derivedPercent =\n monthlyLimit !== null && monthlyLimit > 0 && used !== null\n ? Math.max(0, Math.min(100, (used / monthlyLimit) * 100))\n : null;\n const period = currentPeriod\n ? {\n type: stringOrNull(currentPeriod.type),\n start: dateOrNull(currentPeriod.start),\n end: dateOrNull(currentPeriod.end),\n }\n : legacyPeriod(config);\n return {\n usedPercent: directPercent ?? derivedPercent,\n period,\n prepaidBalanceCents: cents(config?.prepaidBalance ?? config?.prepaid_balance),\n onDemandCapCents: cents(config?.onDemandCap ?? config?.on_demand_cap),\n onDemandUsedCents: cents(config?.onDemandUsed ?? config?.on_demand_used),\n onDemandEnabled: booleanOrNull(body.onDemandEnabled ?? body.on_demand_enabled),\n unifiedBilling: booleanOrNull(config?.isUnifiedBillingUser ?? config?.is_unified_billing_user),\n subscriptionTier: stringOrNull(body.subscriptionTier ?? body.subscription_tier),\n checkedAt: new Date(),\n };\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction cents(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return value;\n const object = record(value);\n const candidate = object?.val;\n return typeof candidate === \"number\" && Number.isSafeInteger(candidate) ? candidate : null;\n}\n\nfunction finitePercent(value: unknown): number | null {\n const candidate = Number(value);\n return Number.isFinite(candidate) ? Math.max(0, Math.min(100, candidate)) : null;\n}\n\nfunction stringOrNull(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nfunction booleanOrNull(value: unknown): boolean | null {\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction dateOrNull(value: unknown): Date | null {\n if (typeof value !== \"string\") return null;\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction legacyPeriod(config: Record<string, unknown> | null): XaiUsagePeriod | null {\n const start = dateOrNull(config?.billingPeriodStart ?? config?.billing_period_start);\n const end = dateOrNull(config?.billingPeriodEnd ?? config?.billing_period_end);\n return start || end ? { type: null, start, end } : null;\n}\n","import {\n XAI_SUBSCRIPTION_AUTO_COMPACTION_PERCENT,\n XAI_SUBSCRIPTION_EFFECTIVE_CONTEXT_PERCENT,\n} from \"./constants\";\nimport type { XaiFetchLike } from \"./fetch\";\nimport { fetchXaiProxyJson, type XaiProxyAuthContext } from \"./proxy\";\n\nexport type XaiSubscriptionModelMetadata = {\n slug: string;\n name: string;\n contextWindowTokens: number;\n effectiveContextWindowTokens: number;\n autoCompactTokenLimit: number;\n maxCompletionTokens: number | null;\n apiBackend: \"responses\" | \"chat_completions\" | \"messages\";\n};\n\nexport async function fetchXaiSubscriptionModels(input: {\n context: XaiProxyAuthContext;\n fetch?: XaiFetchLike;\n timeoutMs?: number;\n baseUrl?: string;\n}): Promise<XaiSubscriptionModelMetadata[]> {\n const body = await fetchXaiProxyJson<unknown>({\n path: \"models\",\n context: input.context,\n ...(input.fetch ? { fetch: input.fetch } : {}),\n ...(input.timeoutMs ? { timeoutMs: input.timeoutMs } : {}),\n ...(input.baseUrl ? { baseUrl: input.baseUrl } : {}),\n maxBytes: 4 * 1024 * 1024,\n label: \"model metadata request\",\n });\n const values = Array.isArray(body)\n ? body\n : body && typeof body === \"object\" && Array.isArray((body as Record<string, unknown>).data)\n ? ((body as Record<string, unknown>).data as unknown[])\n : [];\n return values.flatMap((value) => {\n const parsed = parseXaiSubscriptionModelMetadata(value);\n return parsed ? [parsed] : [];\n });\n}\n\nexport function parseXaiSubscriptionModelMetadata(\n value: unknown,\n): XaiSubscriptionModelMetadata | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const object = value as Record<string, unknown>;\n const meta =\n object._meta && typeof object._meta === \"object\" && !Array.isArray(object._meta)\n ? (object._meta as Record<string, unknown>)\n : {};\n const slug = firstString(object.model, object.modelId, object.id, meta.model, meta.modelId);\n const contextWindowTokens = firstPositiveInteger(\n object.contextWindow,\n object.context_window,\n meta.contextWindow,\n meta.totalContextTokens,\n );\n if (!slug || contextWindowTokens === null) return null;\n const effectivePercent =\n firstPositiveInteger(\n object.effectiveContextWindowPercent,\n object.effective_context_window_percent,\n ) ?? XAI_SUBSCRIPTION_EFFECTIVE_CONTEXT_PERCENT;\n const autoCompactPercent =\n firstPositiveInteger(\n object.autoCompactThresholdPercent,\n object.auto_compact_threshold_percent,\n ) ?? XAI_SUBSCRIPTION_AUTO_COMPACTION_PERCENT;\n const backend = firstString(object.apiBackend, object.api_backend);\n return {\n slug,\n name: firstString(object.name) ?? slug,\n contextWindowTokens,\n effectiveContextWindowTokens: Math.floor((contextWindowTokens * effectivePercent) / 100),\n autoCompactTokenLimit: Math.floor((contextWindowTokens * autoCompactPercent) / 100),\n maxCompletionTokens: firstPositiveInteger(\n object.maxCompletionTokens,\n object.max_completion_tokens,\n ),\n apiBackend: backend === \"chat_completions\" || backend === \"messages\" ? backend : \"responses\",\n };\n}\n\nfunction firstString(...values: unknown[]): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return null;\n}\n\nfunction firstPositiveInteger(...values: unknown[]): number | null {\n for (const value of values) {\n const number = Number(value);\n if (Number.isSafeInteger(number) && number > 0) return number;\n }\n return null;\n}\n","import { pinnedFetch, readJsonBase64Field, readResponseTextBounded } from \"@opengeni/network\";\n\nimport {\n XAI_CLIENT_VERSION,\n XAI_IMAGE_MODEL,\n XAI_IMAGE_REQUEST_TIMEOUT_MS,\n XAI_PUBLIC_API_BASE_URL,\n} from \"./constants\";\nimport { XaiSubscriptionError } from \"./errors\";\nimport type { XaiFetchLike } from \"./fetch\";\nimport type { XaiSubscriptionTokenSnapshot } from \"./request-context\";\n\nconst XAI_IMAGE_RESPONSE_MAX_BYTES = 90 * 1024 * 1024;\nconst XAI_IMAGE_MAX_BYTES = 64 * 1024 * 1024;\nconst XAI_IMAGE_ERROR_MAX_BYTES = 64 * 1024;\n\nexport type XaiImageReference = Readonly<{\n mediaType: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n bytes: Uint8Array;\n}>;\n\nconst defaultImageFetch: XaiFetchLike = async (input, init) =>\n await pinnedFetch(\n input,\n init,\n { environment: \"production\", integrationsAllowPrivateNetworkTargets: false },\n { label: \"xAI image generation\", requireHttpsOutsideLocalTest: true },\n );\n\nexport type XaiGeneratedImage = {\n bytes: Uint8Array;\n declaredMediaType: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n};\n\nexport async function generateXaiSubscriptionImage(input: {\n prompt: string;\n aspectRatio?: string;\n references?: readonly XaiImageReference[];\n sessionId?: string;\n getToken: () => Promise<XaiSubscriptionTokenSnapshot>;\n refresh: () => Promise<XaiSubscriptionTokenSnapshot>;\n abortSignal?: AbortSignal;\n fetch?: XaiFetchLike;\n requestTimeoutMs?: number;\n baseUrl?: string;\n}): Promise<XaiGeneratedImage> {\n const timeoutMs = input.requestTimeoutMs ?? XAI_IMAGE_REQUEST_TIMEOUT_MS;\n const deadline = new AbortController();\n const timer = setTimeout(\n () => deadline.abort(new XaiSubscriptionError(\"timeout\", \"xAI image generation timed out\")),\n timeoutMs,\n );\n const signal = input.abortSignal\n ? AbortSignal.any([input.abortSignal, deadline.signal])\n : deadline.signal;\n const fetchImpl = input.fetch ?? defaultImageFetch;\n const references = input.references ?? [];\n if (references.length > 3) {\n throw new XaiSubscriptionError(\n \"provider_rejected\",\n \"xAI image editing supports at most three references\",\n );\n }\n const url = `${(input.baseUrl ?? XAI_PUBLIC_API_BASE_URL).replace(/\\/+$/, \"\")}/images/${references.length > 0 ? \"edits\" : \"generations\"}`;\n const request = async (token: XaiSubscriptionTokenSnapshot): Promise<Response> =>\n await fetchImpl(url, {\n method: \"POST\",\n redirect: \"error\",\n headers: {\n accept: \"application/json\",\n authorization: `Bearer ${token.accessToken}`,\n \"content-type\": \"application/json\",\n \"user-agent\": `opengeni/${XAI_CLIENT_VERSION}`,\n \"x-grok-client-version\": XAI_CLIENT_VERSION,\n \"x-grok-client-identifier\": \"opengeni\",\n ...(input.sessionId ? { \"x-grok-session-id\": input.sessionId } : {}),\n },\n body: JSON.stringify(\n references.length > 0\n ? {\n model: XAI_IMAGE_MODEL,\n prompt: input.prompt,\n n: 1,\n resolution: \"1k\",\n response_format: \"b64_json\",\n ...(references.length === 1\n ? { image: referencePayload(references[0]!) }\n : {\n images: references.map(referencePayload),\n aspect_ratio: input.aspectRatio ?? \"auto\",\n }),\n }\n : {\n model: XAI_IMAGE_MODEL,\n prompt: input.prompt,\n n: 1,\n aspect_ratio: input.aspectRatio ?? \"auto\",\n resolution: \"1k\",\n response_format: \"b64_json\",\n },\n ),\n signal,\n });\n try {\n let response = await request(await input.getToken());\n if (response.status === 401) {\n await response.body?.cancel().catch(() => undefined);\n response = await request(await input.refresh());\n }\n if (!response.ok) {\n const detail = await readResponseTextBounded(\n response,\n XAI_IMAGE_ERROR_MAX_BYTES,\n \"xAI image generation error\",\n { signal },\n ).catch(() => \"\");\n throw new XaiSubscriptionError(\n \"provider_rejected\",\n `xAI image generation failed (${response.status})${detail ? `: ${boundedMessage(detail)}` : \"\"}`,\n response.status,\n );\n }\n const bytes = await readJsonBase64Field(response, {\n fieldName: \"b64_json\",\n shape: \"string\",\n maxResponseBytes: XAI_IMAGE_RESPONSE_MAX_BYTES,\n maxDecodedBytes: XAI_IMAGE_MAX_BYTES,\n label: \"xAI image generation\",\n signal,\n });\n return { bytes, declaredMediaType: detectImageMediaType(bytes) };\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction referencePayload(reference: XaiImageReference): { url: string } {\n return {\n url: `data:${reference.mediaType};base64,${Buffer.from(reference.bytes).toString(\"base64\")}`,\n };\n}\n\nfunction detectImageMediaType(bytes: Uint8Array): XaiGeneratedImage[\"declaredMediaType\"] {\n if (\n bytes.byteLength >= 8 &&\n [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].every((byte, index) => bytes[index] === byte)\n ) {\n return \"image/png\";\n }\n if (bytes.byteLength >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {\n return \"image/jpeg\";\n }\n if (\n bytes.byteLength >= 12 &&\n String.fromCharCode(...bytes.subarray(0, 4)) === \"RIFF\" &&\n String.fromCharCode(...bytes.subarray(8, 12)) === \"WEBP\"\n ) {\n return \"image/webp\";\n }\n throw new XaiSubscriptionError(\"invalid_response\", \"xAI returned an unsupported image format\");\n}\n\nfunction boundedMessage(body: string): string {\n try {\n const value = JSON.parse(body) as Record<string, unknown>;\n const error =\n value.error && typeof value.error === \"object\" && !Array.isArray(value.error)\n ? (value.error as Record<string, unknown>)\n : null;\n const message = error?.message ?? value.message;\n if (typeof message === \"string\") return message.replace(/\\s+/g, \" \").trim().slice(0, 1_000);\n } catch {\n // Preserve only a bounded normalized provider diagnostic.\n }\n return body.replace(/\\s+/g, \" \").trim().slice(0, 1_000);\n}\n","import {\n pinnedFetch,\n readResponseBodyBounded,\n readResponseJsonBounded,\n readResponseTextBounded,\n validateHttpUrl,\n} from \"@opengeni/network\";\n\nimport {\n XAI_PUBLIC_API_BASE_URL,\n XAI_CLIENT_MODE,\n XAI_CLIENT_VERSION,\n XAI_VIDEO_DOWNLOAD_TIMEOUT_MS,\n XAI_VIDEO_GENERATION_TIMEOUT_MS,\n XAI_VIDEO_MODEL,\n XAI_VIDEO_POLL_INTERVAL_MS,\n XAI_VIDEO_POLL_REQUEST_TIMEOUT_MS,\n XAI_VIDEO_START_TIMEOUT_MS,\n} from \"./constants\";\nimport { XaiSubscriptionError } from \"./errors\";\nimport type { XaiFetchLike } from \"./fetch\";\nimport type { XaiSubscriptionTokenSnapshot } from \"./request-context\";\n\nconst XAI_VIDEO_MAX_BYTES = 256 * 1024 * 1024;\nconst XAI_VIDEO_ERROR_MAX_BYTES = 64 * 1024;\n\nconst defaultVideoFetch: XaiFetchLike = async (input, init) =>\n await pinnedFetch(\n input,\n init,\n {\n environment: \"production\",\n integrationsAllowPrivateNetworkTargets: false,\n },\n { label: \"xAI video generation\", requireHttpsOutsideLocalTest: true },\n );\n\nexport type XaiGeneratedVideo = {\n bytes: Uint8Array;\n declaredMediaType: \"video/mp4\";\n requestId: string;\n};\n\nexport type XaiVideoStatus =\n | Readonly<{ status: \"pending\" }>\n | Readonly<{ status: \"completed\"; outputUrl: string; mediaType: \"video/mp4\" }>\n | Readonly<{ status: \"error\"; publicReason: string }>;\n\n/** One-shot durable start. The caller owns replay/idempotency policy. */\nexport async function startXaiSubscriptionVideoWithBody(input: {\n body: Record<string, unknown>;\n getToken: () => Promise<XaiSubscriptionTokenSnapshot>;\n refresh: () => Promise<XaiSubscriptionTokenSnapshot>;\n sessionId?: string;\n signal?: AbortSignal;\n fetch?: XaiFetchLike;\n baseUrl?: string;\n}): Promise<{ providerJobId: string }> {\n const fetchImpl = input.fetch ?? defaultVideoFetch;\n const baseUrl = (input.baseUrl ?? XAI_PUBLIC_API_BASE_URL).replace(/\\/+$/, \"\");\n const request = async (token: XaiSubscriptionTokenSnapshot) =>\n await fetchWithDeadline(\n fetchImpl,\n `${baseUrl}/videos/generations`,\n {\n method: \"POST\",\n redirect: \"error\",\n headers: publicVideoHeaders(token, input.sessionId, true),\n body: JSON.stringify(input.body),\n ...(input.signal ? { signal: input.signal } : {}),\n },\n XAI_VIDEO_START_TIMEOUT_MS,\n input.signal ?? AbortSignal.timeout(XAI_VIDEO_START_TIMEOUT_MS),\n );\n let response = await request(await input.getToken());\n if (response.status === 401) {\n await response.body?.cancel().catch(() => undefined);\n response = await request(await input.refresh());\n }\n if (!response.ok)\n throw await providerError(\"start\", response, input.signal ?? new AbortController().signal);\n const body = await readResponseJsonBounded<Record<string, unknown>>(\n response,\n 1024 * 1024,\n \"xAI video start\",\n input.signal ? { signal: input.signal } : {},\n );\n if (typeof body.request_id !== \"string\" || !body.request_id.trim()) {\n throw new XaiSubscriptionError(\"invalid_response\", \"xAI video start response is malformed\");\n }\n return { providerJobId: body.request_id };\n}\n\nexport async function getXaiSubscriptionVideoStatus(input: {\n providerJobId: string;\n getToken: () => Promise<XaiSubscriptionTokenSnapshot>;\n refresh: () => Promise<XaiSubscriptionTokenSnapshot>;\n sessionId?: string;\n signal?: AbortSignal;\n fetch?: XaiFetchLike;\n baseUrl?: string;\n}): Promise<XaiVideoStatus> {\n if (!input.providerJobId.trim() || input.providerJobId.length > 1024) {\n throw new Error(\"xAI video job identity is invalid\");\n }\n const fetchImpl = input.fetch ?? defaultVideoFetch;\n const baseUrl = (input.baseUrl ?? XAI_PUBLIC_API_BASE_URL).replace(/\\/+$/, \"\");\n const request = async (token: XaiSubscriptionTokenSnapshot) =>\n await fetchWithDeadline(\n fetchImpl,\n `${baseUrl}/videos/${encodeURIComponent(input.providerJobId)}`,\n {\n method: \"GET\",\n redirect: \"error\",\n headers: publicVideoHeaders(token, input.sessionId, false),\n ...(input.signal ? { signal: input.signal } : {}),\n },\n XAI_VIDEO_POLL_REQUEST_TIMEOUT_MS,\n input.signal ?? AbortSignal.timeout(XAI_VIDEO_POLL_REQUEST_TIMEOUT_MS),\n );\n let response = await request(await input.getToken());\n if (response.status === 401) {\n await response.body?.cancel().catch(() => undefined);\n response = await request(await input.refresh());\n }\n if (!response.ok && response.status !== 202) {\n throw await providerError(\"poll\", response, input.signal ?? new AbortController().signal);\n }\n const body = await readResponseJsonBounded<Record<string, unknown>>(\n response,\n 1024 * 1024,\n \"xAI video poll\",\n input.signal ? { signal: input.signal } : {},\n );\n if (body.status === \"pending\" || body.status === \"queued\" || body.status === \"running\") {\n return { status: \"pending\" };\n }\n if (body.status === \"failed\" || body.status === \"expired\") {\n return {\n status: \"error\",\n publicReason: `xAI video generation ${body.status}`,\n };\n }\n const video =\n body.video && typeof body.video === \"object\" && !Array.isArray(body.video)\n ? (body.video as Record<string, unknown>)\n : null;\n if (body.status !== \"done\" || typeof video?.url !== \"string\") {\n throw new XaiSubscriptionError(\"invalid_response\", \"xAI video poll response is malformed\");\n }\n return {\n status: \"completed\",\n outputUrl: validateMediaUrl(video.url),\n mediaType: \"video/mp4\",\n };\n}\n\nfunction publicVideoHeaders(\n token: XaiSubscriptionTokenSnapshot,\n sessionId: string | undefined,\n json: boolean,\n): Headers {\n return new Headers({\n accept: \"application/json\",\n authorization: `Bearer ${token.accessToken}`,\n \"user-agent\": `opengeni/${XAI_CLIENT_VERSION}`,\n \"x-grok-client-version\": XAI_CLIENT_VERSION,\n \"x-grok-client-identifier\": \"opengeni\",\n \"x-grok-client-mode\": XAI_CLIENT_MODE,\n ...(sessionId ? { \"x-grok-session-id\": sessionId } : {}),\n ...(json ? { \"content-type\": \"application/json\" } : {}),\n });\n}\n\nexport async function generateXaiSubscriptionVideo(input: {\n prompt: string;\n durationSeconds?: number;\n aspectRatio?: string;\n resolution?: \"480p\" | \"720p\";\n imageUrl?: string;\n referenceImageUrls?: readonly string[];\n getToken: () => Promise<XaiSubscriptionTokenSnapshot>;\n refresh: () => Promise<XaiSubscriptionTokenSnapshot>;\n abortSignal?: AbortSignal;\n fetch?: XaiFetchLike;\n sleep?: (ms: number, signal: AbortSignal) => Promise<void>;\n baseUrl?: string;\n generationTimeoutMs?: number;\n}): Promise<XaiGeneratedVideo> {\n const baseUrl = (input.baseUrl ?? XAI_PUBLIC_API_BASE_URL).replace(/\\/+$/, \"\");\n const fetchImpl = input.fetch ?? defaultVideoFetch;\n const deadline = new AbortController();\n const timeoutMs = input.generationTimeoutMs ?? XAI_VIDEO_GENERATION_TIMEOUT_MS;\n const timer = setTimeout(\n () => deadline.abort(new XaiSubscriptionError(\"timeout\", \"xAI video generation timed out\")),\n timeoutMs,\n );\n const signal = input.abortSignal\n ? AbortSignal.any([input.abortSignal, deadline.signal])\n : deadline.signal;\n const references = (input.referenceImageUrls ?? []).map(validateMediaUrl);\n const image = input.imageUrl ? validateMediaUrl(input.imageUrl) : undefined;\n const request = async (token: XaiSubscriptionTokenSnapshot): Promise<Response> =>\n await fetchWithDeadline(\n fetchImpl,\n `${baseUrl}/videos/generations`,\n {\n method: \"POST\",\n redirect: \"error\",\n headers: {\n accept: \"application/json\",\n authorization: `Bearer ${token.accessToken}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n model: XAI_VIDEO_MODEL,\n prompt: input.prompt,\n ...(image ? { image: { url: image } } : {}),\n ...(references.length > 0\n ? { reference_images: references.map((url) => ({ url })) }\n : {}),\n ...(input.durationSeconds ? { duration: input.durationSeconds } : {}),\n aspect_ratio: input.aspectRatio ?? \"16:9\",\n resolution: input.resolution ?? \"480p\",\n }),\n signal,\n },\n XAI_VIDEO_START_TIMEOUT_MS,\n signal,\n );\n try {\n let start = await request(await input.getToken());\n if (start.status === 401) {\n await start.body?.cancel().catch(() => undefined);\n start = await request(await input.refresh());\n }\n if (!start.ok) throw await providerError(\"start\", start, signal);\n const started = await readResponseJsonBounded<Record<string, unknown>>(\n start,\n 1024 * 1024,\n \"xAI video start\",\n { signal },\n );\n const requestId =\n typeof started.request_id === \"string\" && started.request_id.length > 0\n ? started.request_id\n : null;\n if (!requestId) {\n throw new XaiSubscriptionError(\n \"invalid_response\",\n \"xAI video generation did not return request_id\",\n );\n }\n const sleep = input.sleep ?? abortableSleep;\n for (;;) {\n await sleep(XAI_VIDEO_POLL_INTERVAL_MS, signal);\n let poll = await pollVideo(fetchImpl, baseUrl, requestId, await input.getToken(), signal);\n if (poll.status === 401) {\n await poll.body?.cancel().catch(() => undefined);\n poll = await pollVideo(fetchImpl, baseUrl, requestId, await input.refresh(), signal);\n }\n if (!poll.ok && poll.status !== 202) throw await providerError(\"poll\", poll, signal);\n const status = await readResponseJsonBounded<Record<string, unknown>>(\n poll,\n 1024 * 1024,\n \"xAI video poll\",\n { signal },\n );\n if (status.status === \"failed\" || status.status === \"expired\") {\n throw new XaiSubscriptionError(\n \"provider_rejected\",\n `xAI video generation ${status.status}`,\n );\n }\n if (status.status !== \"done\") continue;\n const video =\n status.video && typeof status.video === \"object\" && !Array.isArray(status.video)\n ? (status.video as Record<string, unknown>)\n : null;\n const downloadUrl = typeof video?.url === \"string\" ? validateMediaUrl(video.url) : null;\n if (!downloadUrl) {\n throw new XaiSubscriptionError(\n \"invalid_response\",\n \"xAI video generation completed without a download URL\",\n );\n }\n const download = await fetchWithDeadline(\n fetchImpl,\n downloadUrl,\n { method: \"GET\", redirect: \"error\", signal },\n XAI_VIDEO_DOWNLOAD_TIMEOUT_MS,\n signal,\n );\n if (!download.ok) throw await providerError(\"download\", download, signal);\n const bytes = await readResponseBodyBounded(\n download,\n XAI_VIDEO_MAX_BYTES,\n \"xAI video download\",\n { signal },\n );\n return { bytes, declaredMediaType: \"video/mp4\", requestId };\n }\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function pollVideo(\n fetchImpl: XaiFetchLike,\n baseUrl: string,\n requestId: string,\n token: XaiSubscriptionTokenSnapshot,\n signal: AbortSignal,\n): Promise<Response> {\n return await fetchWithDeadline(\n fetchImpl,\n `${baseUrl}/videos/${encodeURIComponent(requestId)}`,\n {\n method: \"GET\",\n redirect: \"error\",\n headers: {\n accept: \"application/json\",\n authorization: `Bearer ${token.accessToken}`,\n },\n signal,\n },\n XAI_VIDEO_POLL_REQUEST_TIMEOUT_MS,\n signal,\n );\n}\n\nasync function fetchWithDeadline(\n fetchImpl: XaiFetchLike,\n url: string,\n init: RequestInit,\n timeoutMs: number,\n outerSignal: AbortSignal,\n): Promise<Response> {\n const timeout = AbortSignal.timeout(timeoutMs);\n return await fetchImpl(url, {\n ...init,\n signal: AbortSignal.any([outerSignal, timeout]),\n });\n}\n\nasync function providerError(\n phase: string,\n response: Response,\n signal: AbortSignal,\n): Promise<XaiSubscriptionError> {\n const detail = await readResponseTextBounded(\n response,\n XAI_VIDEO_ERROR_MAX_BYTES,\n `xAI video ${phase} error`,\n { signal },\n ).catch(() => \"\");\n return new XaiSubscriptionError(\n \"provider_rejected\",\n `xAI video ${phase} failed (${response.status})${detail ? `: ${detail.replace(/\\s+/g, \" \").trim().slice(0, 1_000)}` : \"\"}`,\n response.status,\n );\n}\n\nfunction validateMediaUrl(value: string): string {\n try {\n return validateHttpUrl(value, { label: \"xAI media\" });\n } catch {\n throw new XaiSubscriptionError(\"invalid_response\", \"xAI returned an invalid media URL\");\n }\n}\n\nasync function abortableSleep(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) throw signal.reason;\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(done, ms);\n const onAbort = () => done(signal.reason);\n function done(error?: unknown) {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n if (error === undefined) {\n resolve();\n } else {\n reject(error);\n }\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n"],"mappings":"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","names":["record","OAUTH_MAX_RESPONSE_BYTES","readResponseJsonBounded","OAUTH_MAX_RESPONSE_BYTES","readResponseJsonBounded","pinnedFetch","pinnedFetch","pinnedFetch","readResponseJsonBounded","readResponseTextBounded","validateHttpUrl","pinnedFetch","readResponseJsonBounded","readResponseTextBounded","validateHttpUrl"]}
|
package/dist/models.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { XaiFetchLike } from "./fetch.js";
|
|
2
|
+
import { type XaiProxyAuthContext } from "./proxy.js";
|
|
3
|
+
export type XaiSubscriptionModelMetadata = {
|
|
4
|
+
slug: string;
|
|
5
|
+
name: string;
|
|
6
|
+
contextWindowTokens: number;
|
|
7
|
+
effectiveContextWindowTokens: number;
|
|
8
|
+
autoCompactTokenLimit: number;
|
|
9
|
+
maxCompletionTokens: number | null;
|
|
10
|
+
apiBackend: "responses" | "chat_completions" | "messages";
|
|
11
|
+
};
|
|
12
|
+
export declare function fetchXaiSubscriptionModels(input: {
|
|
13
|
+
context: XaiProxyAuthContext;
|
|
14
|
+
fetch?: XaiFetchLike;
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
}): Promise<XaiSubscriptionModelMetadata[]>;
|
|
18
|
+
export declare function parseXaiSubscriptionModelMetadata(value: unknown): XaiSubscriptionModelMetadata | null;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { XaiHostedSearchOptions } from "./request-context.js";
|
|
2
|
+
export declare function normalizeXaiSubscriptionRequestBody(value: unknown, resolveModel: (slug: string) => string, hostedSearch?: XaiHostedSearchOptions): Record<string, unknown>;
|
|
3
|
+
export declare function normalizeXaiResponseEventJson(value: unknown): {
|
|
4
|
+
value: unknown;
|
|
5
|
+
finalContextTokens: number | null;
|
|
6
|
+
};
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export type XaiFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
2
|
+
export type XaiDeviceCode = {
|
|
3
|
+
deviceCode: string;
|
|
4
|
+
userCode: string;
|
|
5
|
+
verificationUri: string;
|
|
6
|
+
verificationUriComplete: string | null;
|
|
7
|
+
expiresInSeconds: number;
|
|
8
|
+
intervalSeconds: number;
|
|
9
|
+
};
|
|
10
|
+
export type XaiOAuthTokens = {
|
|
11
|
+
accessToken: string;
|
|
12
|
+
refreshToken: string;
|
|
13
|
+
idToken: string | null;
|
|
14
|
+
tokenType: string | null;
|
|
15
|
+
scope: string | null;
|
|
16
|
+
expiresInSeconds: number;
|
|
17
|
+
};
|
|
18
|
+
export type XaiDevicePollResult = {
|
|
19
|
+
status: "pending";
|
|
20
|
+
intervalSeconds: number;
|
|
21
|
+
} | {
|
|
22
|
+
status: "slow_down";
|
|
23
|
+
intervalSeconds: number;
|
|
24
|
+
} | {
|
|
25
|
+
status: "expired";
|
|
26
|
+
} | {
|
|
27
|
+
status: "denied";
|
|
28
|
+
} | {
|
|
29
|
+
status: "authorized";
|
|
30
|
+
tokens: XaiOAuthTokens;
|
|
31
|
+
};
|
|
32
|
+
export type XaiVerifiedIdentity = {
|
|
33
|
+
subject: string;
|
|
34
|
+
email: string | null;
|
|
35
|
+
emailVerified: boolean | null;
|
|
36
|
+
name: string | null;
|
|
37
|
+
};
|
|
38
|
+
type XaiOAuthOptions = {
|
|
39
|
+
fetch?: XaiFetch;
|
|
40
|
+
clientId?: string;
|
|
41
|
+
deviceAuthorizationUrl?: string;
|
|
42
|
+
tokenUrl?: string;
|
|
43
|
+
userinfoUrl?: string;
|
|
44
|
+
timeoutMs?: number;
|
|
45
|
+
};
|
|
46
|
+
export declare function requestXaiDeviceCode(options?: XaiOAuthOptions): Promise<XaiDeviceCode>;
|
|
47
|
+
export declare function pollXaiDeviceCode(input: {
|
|
48
|
+
deviceCode: string;
|
|
49
|
+
intervalSeconds: number;
|
|
50
|
+
}, options?: XaiOAuthOptions): Promise<XaiDevicePollResult>;
|
|
51
|
+
export declare function refreshXaiToken(refreshToken: string, options?: XaiOAuthOptions): Promise<XaiOAuthTokens>;
|
|
52
|
+
export declare function fetchXaiVerifiedIdentity(accessToken: string, options?: XaiOAuthOptions): Promise<XaiVerifiedIdentity>;
|
|
53
|
+
export declare function decodeXaiJwtPayload(jwt: string): Record<string, unknown> | null;
|
|
54
|
+
export declare function xaiAccessTokenExpiry(accessToken: string): Date | null;
|
|
55
|
+
export {};
|
package/dist/proxy.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { XaiFetchLike } from "./fetch.js";
|
|
2
|
+
import type { XaiSubscriptionTokenSnapshot } from "./request-context.js";
|
|
3
|
+
export type XaiProxyAuthContext = {
|
|
4
|
+
clientVersion?: string;
|
|
5
|
+
getToken: () => Promise<XaiSubscriptionTokenSnapshot>;
|
|
6
|
+
refresh: () => Promise<XaiSubscriptionTokenSnapshot>;
|
|
7
|
+
};
|
|
8
|
+
export declare function fetchXaiProxyJson<T>(input: {
|
|
9
|
+
path: string;
|
|
10
|
+
context: XaiProxyAuthContext;
|
|
11
|
+
fetch?: XaiFetchLike;
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
maxBytes?: number;
|
|
14
|
+
baseUrl?: string;
|
|
15
|
+
label: string;
|
|
16
|
+
}): Promise<T>;
|
|
17
|
+
export declare function xaiSubscriptionProxyHeaders(token: XaiSubscriptionTokenSnapshot, clientVersion?: string): Headers;
|
package/dist/quota.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { XaiFetchLike } from "./fetch.js";
|
|
2
|
+
import { type XaiProxyAuthContext } from "./proxy.js";
|
|
3
|
+
export type XaiUsagePeriod = {
|
|
4
|
+
type: string | null;
|
|
5
|
+
start: Date | null;
|
|
6
|
+
end: Date | null;
|
|
7
|
+
};
|
|
8
|
+
export type XaiSubscriptionQuota = {
|
|
9
|
+
usedPercent: number | null;
|
|
10
|
+
period: XaiUsagePeriod | null;
|
|
11
|
+
prepaidBalanceCents: number | null;
|
|
12
|
+
onDemandCapCents: number | null;
|
|
13
|
+
onDemandUsedCents: number | null;
|
|
14
|
+
onDemandEnabled: boolean | null;
|
|
15
|
+
unifiedBilling: boolean | null;
|
|
16
|
+
subscriptionTier: string | null;
|
|
17
|
+
checkedAt: Date;
|
|
18
|
+
};
|
|
19
|
+
export declare function fetchXaiSubscriptionQuota(input: {
|
|
20
|
+
context: XaiProxyAuthContext;
|
|
21
|
+
fetch?: XaiFetchLike;
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
baseUrl?: string;
|
|
24
|
+
}): Promise<XaiSubscriptionQuota>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
export type XaiSubscriptionTokenSnapshot = {
|
|
3
|
+
accessToken: string;
|
|
4
|
+
userId: string;
|
|
5
|
+
};
|
|
6
|
+
export type XaiHostedSearchOptions = {
|
|
7
|
+
webSearch?: boolean | Record<string, unknown>;
|
|
8
|
+
xSearch?: boolean | Record<string, unknown>;
|
|
9
|
+
};
|
|
10
|
+
export type XaiFinalContextUsage = {
|
|
11
|
+
inputTokens: number;
|
|
12
|
+
outputTokens: number;
|
|
13
|
+
totalTokens: number;
|
|
14
|
+
};
|
|
15
|
+
export type XaiSubscriptionRequestContext = {
|
|
16
|
+
clientVersion: string;
|
|
17
|
+
sessionId: string;
|
|
18
|
+
turnId: string;
|
|
19
|
+
getToken: () => Promise<XaiSubscriptionTokenSnapshot>;
|
|
20
|
+
refresh: () => Promise<XaiSubscriptionTokenSnapshot>;
|
|
21
|
+
resolveModel: (slug: string) => string;
|
|
22
|
+
hostedSearch?: XaiHostedSearchOptions;
|
|
23
|
+
onFinalContextUsage?: (usage: XaiFinalContextUsage) => void;
|
|
24
|
+
nextRequestId?: () => string;
|
|
25
|
+
};
|
|
26
|
+
export declare const xaiSubscriptionRequestStorage: AsyncLocalStorage<XaiSubscriptionRequestContext>;
|
package/dist/video.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { XaiFetchLike } from "./fetch.js";
|
|
2
|
+
import type { XaiSubscriptionTokenSnapshot } from "./request-context.js";
|
|
3
|
+
export type XaiGeneratedVideo = {
|
|
4
|
+
bytes: Uint8Array;
|
|
5
|
+
declaredMediaType: "video/mp4";
|
|
6
|
+
requestId: string;
|
|
7
|
+
};
|
|
8
|
+
export type XaiVideoStatus = Readonly<{
|
|
9
|
+
status: "pending";
|
|
10
|
+
}> | Readonly<{
|
|
11
|
+
status: "completed";
|
|
12
|
+
outputUrl: string;
|
|
13
|
+
mediaType: "video/mp4";
|
|
14
|
+
}> | Readonly<{
|
|
15
|
+
status: "error";
|
|
16
|
+
publicReason: string;
|
|
17
|
+
}>;
|
|
18
|
+
/** One-shot durable start. The caller owns replay/idempotency policy. */
|
|
19
|
+
export declare function startXaiSubscriptionVideoWithBody(input: {
|
|
20
|
+
body: Record<string, unknown>;
|
|
21
|
+
getToken: () => Promise<XaiSubscriptionTokenSnapshot>;
|
|
22
|
+
refresh: () => Promise<XaiSubscriptionTokenSnapshot>;
|
|
23
|
+
sessionId?: string;
|
|
24
|
+
signal?: AbortSignal;
|
|
25
|
+
fetch?: XaiFetchLike;
|
|
26
|
+
baseUrl?: string;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
providerJobId: string;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function getXaiSubscriptionVideoStatus(input: {
|
|
31
|
+
providerJobId: string;
|
|
32
|
+
getToken: () => Promise<XaiSubscriptionTokenSnapshot>;
|
|
33
|
+
refresh: () => Promise<XaiSubscriptionTokenSnapshot>;
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
signal?: AbortSignal;
|
|
36
|
+
fetch?: XaiFetchLike;
|
|
37
|
+
baseUrl?: string;
|
|
38
|
+
}): Promise<XaiVideoStatus>;
|
|
39
|
+
export declare function generateXaiSubscriptionVideo(input: {
|
|
40
|
+
prompt: string;
|
|
41
|
+
durationSeconds?: number;
|
|
42
|
+
aspectRatio?: string;
|
|
43
|
+
resolution?: "480p" | "720p";
|
|
44
|
+
imageUrl?: string;
|
|
45
|
+
referenceImageUrls?: readonly string[];
|
|
46
|
+
getToken: () => Promise<XaiSubscriptionTokenSnapshot>;
|
|
47
|
+
refresh: () => Promise<XaiSubscriptionTokenSnapshot>;
|
|
48
|
+
abortSignal?: AbortSignal;
|
|
49
|
+
fetch?: XaiFetchLike;
|
|
50
|
+
sleep?: (ms: number, signal: AbortSignal) => Promise<void>;
|
|
51
|
+
baseUrl?: string;
|
|
52
|
+
generationTimeoutMs?: number;
|
|
53
|
+
}): Promise<XaiGeneratedVideo>;
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@opengeni/xai-subscription",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "SuperGrok/xAI connected-subscription auth and transport. Pure HTTP, request context, quota/model metadata, and media helpers; no database dependency.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/Cloudgeni-ai/opengeni.git",
|
|
9
|
+
"directory": "packages/xai-subscription"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"src"
|
|
14
|
+
],
|
|
15
|
+
"type": "module",
|
|
16
|
+
"sideEffects": false,
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"module": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"import": "./dist/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./constants": {
|
|
26
|
+
"types": "./dist/constants.d.ts",
|
|
27
|
+
"import": "./dist/constants.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public",
|
|
32
|
+
"provenance": true
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"build": "bun ../../scripts/build-typescript-package.ts",
|
|
37
|
+
"prepublishOnly": "bash ../../scripts/prepublish-guard"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@opengeni/network": "^0.2.2"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=18"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type XaiOperationFailureReason = "network_error" | "timeout";
|
|
2
|
+
|
|
3
|
+
export async function runBoundedXaiOperation<T>(
|
|
4
|
+
operation: (signal: AbortSignal) => Promise<T>,
|
|
5
|
+
timeoutMs: number,
|
|
6
|
+
): Promise<{ ok: true; value: T } | { ok: false; reason: XaiOperationFailureReason }> {
|
|
7
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
8
|
+
throw new Error("xAI operation timeout must be positive");
|
|
9
|
+
}
|
|
10
|
+
const controller = new AbortController();
|
|
11
|
+
let timedOut = false;
|
|
12
|
+
let timeout: ReturnType<typeof setTimeout> | undefined;
|
|
13
|
+
const work = operation(controller.signal).then(
|
|
14
|
+
(value) => ({ ok: true as const, value }),
|
|
15
|
+
() => ({
|
|
16
|
+
ok: false as const,
|
|
17
|
+
reason:
|
|
18
|
+
timedOut || controller.signal.aborted ? ("timeout" as const) : ("network_error" as const),
|
|
19
|
+
}),
|
|
20
|
+
);
|
|
21
|
+
const deadline = new Promise<{ ok: false; reason: "timeout" }>((resolve) => {
|
|
22
|
+
timeout = setTimeout(() => {
|
|
23
|
+
timedOut = true;
|
|
24
|
+
controller.abort();
|
|
25
|
+
resolve({ ok: false, reason: "timeout" });
|
|
26
|
+
}, timeoutMs);
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
return await Promise.race([work, deadline]);
|
|
30
|
+
} finally {
|
|
31
|
+
if (timeout) clearTimeout(timeout);
|
|
32
|
+
}
|
|
33
|
+
}
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Verified against xAI's public OIDC discovery document and Grok Build 1.0.3.
|
|
2
|
+
|
|
3
|
+
export const XAI_OAUTH_ISSUER = "https://auth.x.ai";
|
|
4
|
+
export const XAI_OAUTH_CLIENT_ID = "b1a00492-073a-47ea-816f-4c329264a828";
|
|
5
|
+
export const XAI_OAUTH_SCOPES = [
|
|
6
|
+
"openid",
|
|
7
|
+
"profile",
|
|
8
|
+
"email",
|
|
9
|
+
"offline_access",
|
|
10
|
+
"grok-cli:access",
|
|
11
|
+
"api:access",
|
|
12
|
+
] as const;
|
|
13
|
+
export const XAI_DEVICE_AUTHORIZATION_URL = `${XAI_OAUTH_ISSUER}/oauth2/device/code`;
|
|
14
|
+
export const XAI_TOKEN_URL = `${XAI_OAUTH_ISSUER}/oauth2/token`;
|
|
15
|
+
export const XAI_USERINFO_URL = `${XAI_OAUTH_ISSUER}/oauth2/userinfo`;
|
|
16
|
+
export const XAI_DEVICE_CODE_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:device_code";
|
|
17
|
+
|
|
18
|
+
// Subscription inference goes through the Grok CLI session proxy. The existing
|
|
19
|
+
// xai/* API-key provider continues to use api.x.ai and remains a distinct rail.
|
|
20
|
+
export const XAI_SUBSCRIPTION_PROXY_BASE_URL = "https://cli-chat-proxy.grok.com/v1";
|
|
21
|
+
export const XAI_PUBLIC_API_BASE_URL = "https://api.x.ai/v1";
|
|
22
|
+
export const XAI_TOKEN_AUTH_HEADER_VALUE = "xai-grok-cli";
|
|
23
|
+
export const XAI_CLIENT_VERSION = "1.0.3";
|
|
24
|
+
export const XAI_CLIENT_MODE = "opengeni";
|
|
25
|
+
|
|
26
|
+
export const XAI_SUBSCRIPTION_PROVIDER_ID = "supergrok-subscription";
|
|
27
|
+
export const XAI_SUBSCRIPTION_MODEL_ID_PREFIX = "supergrok/";
|
|
28
|
+
export const XAI_SUBSCRIPTION_MODEL_SLUGS = ["grok-4.6"] as const;
|
|
29
|
+
|
|
30
|
+
// Static product limits used by the OpenGeni catalog, matching the Codex seam.
|
|
31
|
+
export const XAI_SUBSCRIPTION_MODEL_CONTEXT_WINDOW_TOKENS = 500_000;
|
|
32
|
+
export const XAI_SUBSCRIPTION_EFFECTIVE_CONTEXT_PERCENT = 95;
|
|
33
|
+
export const XAI_SUBSCRIPTION_MODEL_EFFECTIVE_CONTEXT_WINDOW_TOKENS = Math.floor(
|
|
34
|
+
(XAI_SUBSCRIPTION_MODEL_CONTEXT_WINDOW_TOKENS * XAI_SUBSCRIPTION_EFFECTIVE_CONTEXT_PERCENT) / 100,
|
|
35
|
+
);
|
|
36
|
+
export const XAI_SUBSCRIPTION_AUTO_COMPACTION_PERCENT = 80;
|
|
37
|
+
export const XAI_SUBSCRIPTION_MODEL_AUTO_COMPACT_TOKEN_LIMIT = Math.floor(
|
|
38
|
+
(XAI_SUBSCRIPTION_MODEL_CONTEXT_WINDOW_TOKENS * XAI_SUBSCRIPTION_AUTO_COMPACTION_PERCENT) / 100,
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
export const XAI_IMAGE_MODEL = "grok-imagine-image-quality";
|
|
42
|
+
export const XAI_VIDEO_MODEL = "grok-imagine-video-1.5";
|
|
43
|
+
|
|
44
|
+
export const XAI_OAUTH_OPERATION_TIMEOUT_MS = 15_000;
|
|
45
|
+
export const XAI_REFRESH_WINDOW_MS = 2 * 60_000;
|
|
46
|
+
export const XAI_REFRESH_FALLBACK_MS = 60 * 60_000;
|
|
47
|
+
export const XAI_RESPONSE_SDK_OUTER_TIMEOUT_MS = 35 * 60_000;
|
|
48
|
+
export const XAI_IMAGE_REQUEST_TIMEOUT_MS = 5 * 60_000;
|
|
49
|
+
export const XAI_VIDEO_START_TIMEOUT_MS = 60_000;
|
|
50
|
+
export const XAI_VIDEO_POLL_REQUEST_TIMEOUT_MS = 30_000;
|
|
51
|
+
export const XAI_VIDEO_POLL_INTERVAL_MS = 5_000;
|
|
52
|
+
export const XAI_VIDEO_GENERATION_TIMEOUT_MS = 5 * 60_000;
|
|
53
|
+
export const XAI_VIDEO_DOWNLOAD_TIMEOUT_MS = 2 * 60_000;
|
package/src/errors.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type XaiSubscriptionErrorKind =
|
|
2
|
+
| "invalid_response"
|
|
3
|
+
| "not_enabled"
|
|
4
|
+
| "authorization_denied"
|
|
5
|
+
| "device_code_expired"
|
|
6
|
+
| "relogin_required"
|
|
7
|
+
| "transient"
|
|
8
|
+
| "provider_rejected"
|
|
9
|
+
| "timeout";
|
|
10
|
+
|
|
11
|
+
export class XaiSubscriptionError extends Error {
|
|
12
|
+
constructor(
|
|
13
|
+
readonly kind: XaiSubscriptionErrorKind,
|
|
14
|
+
message: string,
|
|
15
|
+
readonly status?: number,
|
|
16
|
+
) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = "XaiSubscriptionError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class XaiSubscriptionReloginRequired extends XaiSubscriptionError {
|
|
23
|
+
constructor(message = "The SuperGrok connection is no longer valid. Reconnect the account.") {
|
|
24
|
+
super("relogin_required", message);
|
|
25
|
+
this.name = "XaiSubscriptionReloginRequired";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export class XaiSubscriptionTransientError extends XaiSubscriptionError {
|
|
30
|
+
constructor(message: string, status?: number) {
|
|
31
|
+
super("transient", message, status);
|
|
32
|
+
this.name = "XaiSubscriptionTransientError";
|
|
33
|
+
}
|
|
34
|
+
}
|