diff --git a/containers/api-proxy/Dockerfile b/containers/api-proxy/Dockerfile index 53a3fbba..52144684 100644 --- a/containers/api-proxy/Dockerfile +++ b/containers/api-proxy/Dockerfile @@ -31,7 +31,7 @@ COPY server.js logging.js metrics.js rate-limiter.js rate-limiter-window.js \ upstream-log.js upstream-retry.js upstream-token.js \ anthropic-cache.js otel.js otel-exporters.js otel-serialization.js \ token-budget-log.js blocked-request-diagnostics.js \ - provider-env-constants.js provider-names.js \ + provider-env-constants.js provider-env-constants.json provider-names.js \ model-api-mapping.js model-api-mapping.json ./ COPY guards/ ./guards/ COPY providers/ ./providers/ diff --git a/containers/api-proxy/provider-env-constants.js b/containers/api-proxy/provider-env-constants.js index d22430e8..25632b3b 100644 --- a/containers/api-proxy/provider-env-constants.js +++ b/containers/api-proxy/provider-env-constants.js @@ -3,46 +3,7 @@ /** * Environment variable name constants for the API proxy provider adapters. * - * The TypeScript equivalent lives in src/api-proxy-env-constants.ts. - * Keep both files in sync; src/api-proxy-env-constants-sync.test.ts enforces parity. + * Single source of truth: provider-env-constants.json + * The TypeScript host re-exports from the same JSON via src/api-proxy-env-constants.ts. */ - -/** Environment variable names for the OpenAI provider adapter. */ -const OPENAI_ENV = /** @type {const} */ ({ - KEY: 'OPENAI_API_KEY', - TARGET: 'OPENAI_API_TARGET', - BASE_PATH: 'OPENAI_API_BASE_PATH', - AUTH_HEADER: 'AWF_OPENAI_AUTH_HEADER', -}); - -/** Environment variable names for the Anthropic provider adapter. */ -const ANTHROPIC_ENV = /** @type {const} */ ({ - KEY: 'ANTHROPIC_API_KEY', - TARGET: 'ANTHROPIC_API_TARGET', - BASE_PATH: 'ANTHROPIC_API_BASE_PATH', - AUTH_HEADER: 'AWF_ANTHROPIC_AUTH_HEADER', -}); - -/** Environment variable names for the Gemini provider adapter. */ -const GEMINI_ENV = /** @type {const} */ ({ - KEY: 'GEMINI_API_KEY', - TARGET: 'GEMINI_API_TARGET', - BASE_PATH: 'GEMINI_API_BASE_PATH', -}); - -/** Environment variable names for the Copilot provider adapter. */ -const COPILOT_ENV = /** @type {const} */ ({ - GITHUB_TOKEN: 'COPILOT_GITHUB_TOKEN', - PROVIDER_API_KEY: 'COPILOT_PROVIDER_API_KEY', - PROVIDER_TYPE: 'COPILOT_PROVIDER_TYPE', - PROVIDER_BASE_URL: 'COPILOT_PROVIDER_BASE_URL', - API_TARGET: 'COPILOT_API_TARGET', - API_BASE_PATH: 'COPILOT_API_BASE_PATH', -}); - -module.exports = { - OPENAI_ENV, - ANTHROPIC_ENV, - GEMINI_ENV, - COPILOT_ENV, -}; +module.exports = require('./provider-env-constants.json'); diff --git a/containers/api-proxy/provider-env-constants.json b/containers/api-proxy/provider-env-constants.json new file mode 100644 index 00000000..6fe19860 --- /dev/null +++ b/containers/api-proxy/provider-env-constants.json @@ -0,0 +1,27 @@ +{ + "OPENAI_ENV": { + "KEY": "OPENAI_API_KEY", + "TARGET": "OPENAI_API_TARGET", + "BASE_PATH": "OPENAI_API_BASE_PATH", + "AUTH_HEADER": "AWF_OPENAI_AUTH_HEADER" + }, + "ANTHROPIC_ENV": { + "KEY": "ANTHROPIC_API_KEY", + "TARGET": "ANTHROPIC_API_TARGET", + "BASE_PATH": "ANTHROPIC_API_BASE_PATH", + "AUTH_HEADER": "AWF_ANTHROPIC_AUTH_HEADER" + }, + "GEMINI_ENV": { + "KEY": "GEMINI_API_KEY", + "TARGET": "GEMINI_API_TARGET", + "BASE_PATH": "GEMINI_API_BASE_PATH" + }, + "COPILOT_ENV": { + "GITHUB_TOKEN": "COPILOT_GITHUB_TOKEN", + "PROVIDER_API_KEY": "COPILOT_PROVIDER_API_KEY", + "PROVIDER_TYPE": "COPILOT_PROVIDER_TYPE", + "PROVIDER_BASE_URL": "COPILOT_PROVIDER_BASE_URL", + "API_TARGET": "COPILOT_API_TARGET", + "API_BASE_PATH": "COPILOT_API_BASE_PATH" + } +} diff --git a/src/api-proxy-env-constants-sync.test.ts b/src/api-proxy-env-constants-sync.test.ts index 2d41906a..d8318df8 100644 --- a/src/api-proxy-env-constants-sync.test.ts +++ b/src/api-proxy-env-constants-sync.test.ts @@ -9,7 +9,7 @@ const providerEnvConstants = require('../containers/api-proxy/provider-env-const }; describe('API proxy provider env constants', () => { - it('stays in sync between TypeScript host code and JS sidecar code', () => { + it('TypeScript host and JS sidecar both load from the same JSON source', () => { expect(providerEnvConstants.OPENAI_ENV).toEqual(OPENAI_ENV); expect(providerEnvConstants.ANTHROPIC_ENV).toEqual(ANTHROPIC_ENV); expect(providerEnvConstants.GEMINI_ENV).toEqual(GEMINI_ENV); diff --git a/src/api-proxy-env-constants.ts b/src/api-proxy-env-constants.ts index e9c3fb72..8932daf3 100644 --- a/src/api-proxy-env-constants.ts +++ b/src/api-proxy-env-constants.ts @@ -1,42 +1,19 @@ /** * Environment variable name constants for the API proxy provider adapters. * - * The CommonJS equivalent lives in containers/api-proxy/provider-env-constants.js. - * Keep both files in sync; src/api-proxy-env-constants-sync.test.ts enforces parity. + * Single source of truth: containers/api-proxy/provider-env-constants.json + * The CommonJS sidecar loads the same JSON via containers/api-proxy/provider-env-constants.js. */ +import providerEnvConstants from '../containers/api-proxy/provider-env-constants.json'; /** Environment variable names for the OpenAI provider adapter. */ -export const OPENAI_ENV = { - KEY: 'OPENAI_API_KEY', - TARGET: 'OPENAI_API_TARGET', - BASE_PATH: 'OPENAI_API_BASE_PATH', - AUTH_HEADER: 'AWF_OPENAI_AUTH_HEADER', -} as const; - +export const OPENAI_ENV = providerEnvConstants.OPENAI_ENV; /** Environment variable names for the Anthropic provider adapter. */ -export const ANTHROPIC_ENV = { - KEY: 'ANTHROPIC_API_KEY', - TARGET: 'ANTHROPIC_API_TARGET', - BASE_PATH: 'ANTHROPIC_API_BASE_PATH', - AUTH_HEADER: 'AWF_ANTHROPIC_AUTH_HEADER', -} as const; - +export const ANTHROPIC_ENV = providerEnvConstants.ANTHROPIC_ENV; /** Environment variable names for the Gemini provider adapter. */ -export const GEMINI_ENV = { - KEY: 'GEMINI_API_KEY', - TARGET: 'GEMINI_API_TARGET', - BASE_PATH: 'GEMINI_API_BASE_PATH', -} as const; - +export const GEMINI_ENV = providerEnvConstants.GEMINI_ENV; /** Environment variable names for the Copilot provider adapter. */ -export const COPILOT_ENV = { - GITHUB_TOKEN: 'COPILOT_GITHUB_TOKEN', - PROVIDER_API_KEY: 'COPILOT_PROVIDER_API_KEY', - PROVIDER_TYPE: 'COPILOT_PROVIDER_TYPE', - PROVIDER_BASE_URL: 'COPILOT_PROVIDER_BASE_URL', - API_TARGET: 'COPILOT_API_TARGET', - API_BASE_PATH: 'COPILOT_API_BASE_PATH', -} as const; +export const COPILOT_ENV = providerEnvConstants.COPILOT_ENV; /** * OIDC authentication env var mappings.