Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 36 additions & 3 deletions packages/gateway/src/vercel-environment.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,39 @@
import { getContext } from '@vercel/oidc';
export { getVercelOidcToken } from '@vercel/oidc';
/**
* Lazily imports `@vercel/oidc` to avoid module resolution failures in
* environments where the package cannot be resolved (e.g. React Native
* with Metro bundler — see https://github.com/vercel/ai/issues/12313).
*
* `@vercel/oidc` is only functional inside Vercel Functions, so it is
* safe to return graceful fallbacks when the module is unavailable.
*/
async function loadVercelOidc(): Promise<
typeof import('@vercel/oidc') | undefined
> {
try {
return await import('@vercel/oidc');
} catch (error: unknown) {
if (
error instanceof Error &&
error.message.includes('Cannot find module')
) {
return undefined;
}
throw error;
}
}

export async function getVercelOidcToken(): Promise<string> {
const oidc = await loadVercelOidc();
if (!oidc) {
throw new Error(
'@vercel/oidc is not available in this environment. ' +
'Provide an API key via the AI_GATEWAY_API_KEY environment variable instead.',
);
}
return oidc.getVercelOidcToken();
}

export async function getVercelRequestId(): Promise<string | undefined> {
return getContext().headers?.['x-vercel-id'];
const oidc = await loadVercelOidc();
return oidc?.getContext().headers?.['x-vercel-id'];
}