llm-proxy / src /types.ts
relfa's picture
feat: Generalize Gemini API routing to `/v1beta/*` for all methods and dynamically forward the original request method and body.
5a6f847
/** Shared TypeScript types for the proxy server. */
/** Per-provider upstream configuration used by the generic forwarder. */
export interface ProviderConfig {
/** Human-readable name for logging (e.g. "anthropic", "gemini"). */
readonly name: string;
/** Upstream base URL (e.g. "https://api.anthropic.com"). */
readonly baseUrl: string;
/** The API key value to inject into upstream requests. */
readonly apiKey: string;
/** The header name for the API key (e.g. "x-api-key" for Anthropic, "x-goog-api-key" for Gemini). */
readonly apiKeyHeader: string;
/** Headers from the client request that should be forwarded upstream. */
readonly forwardedHeaders: ReadonlyArray<string>;
}
/** Typed server configuration derived from environment variables. */
export interface ProxyConfig {
/** Anthropic API key (undefined = Anthropic relay disabled). */
readonly anthropicApiKey: string | undefined;
/** Shared secret token for client authentication. */
readonly proxyAuthToken: string;
/** Server listen port. */
readonly port: number;
/** Server listen host. */
readonly host: string;
/** Pino log level. */
readonly logLevel: string;
/** Max requests per rate-limit window per IP. */
readonly rateLimitMax: number;
/** Rate-limit window duration in ms. */
readonly rateLimitWindowMs: number;
/** Max request body size in bytes. */
readonly bodyLimit: number;
/** CORS origin (empty string = disabled). */
readonly corsOrigin: string;
/** Upstream Anthropic base URL. */
readonly anthropicBaseUrl: string;
/** Upstream request timeout in ms. */
readonly upstreamTimeoutMs: number;
/** Gemini API key (undefined = Gemini relay disabled). */
readonly geminiApiKey: string | undefined;
/** Upstream Gemini base URL. */
readonly geminiBaseUrl: string;
}
/** Headers forwarded to the Anthropic upstream API. */
export const ANTHROPIC_FORWARDED_HEADERS: ReadonlyArray<string> = [
'anthropic-beta',
'anthropic-version',
'content-type',
'accept',
'x-request-id',
] as const;
/** Headers forwarded to the Gemini upstream API. */
export const GEMINI_FORWARDED_HEADERS: ReadonlyArray<string> = [
'content-type',
'accept',
'x-request-id',
] as const;
/** Hop-by-hop headers that must be stripped before forwarding. */
export const HOP_BY_HOP_HEADERS: ReadonlyArray<string> = [
'connection', // Controls if the network connection stays open after the current transaction.
'keep-alive', // Settings for persistent connections.
'transfer-encoding', // Specifies the form of encoding used to safely transfer the payload.
'upgrade', // Mechanism for switching to a different protocol (e.g., WebSocket).
'proxy-authorization', // Credentials for authenticating the client with a proxy.
'te', // Specifies the transfer encodings the user agent is willing to accept.
'trailer', // Indicates that specific headers will be present in the trailer of a chunked message.
] as const;
/** Allowed Anthropic proxy route paths. */
export const ANTHROPIC_ROUTES = [
'/v1/messages',
'/v1/messages/count_tokens',
] as const;
export type AnthropicRoute = (typeof ANTHROPIC_ROUTES)[number];