diff --git a/containers/api-proxy/providers/index.js b/containers/api-proxy/providers/index.js index d027dd92e..b8e557de8 100644 --- a/containers/api-proxy/providers/index.js +++ b/containers/api-proxy/providers/index.js @@ -14,6 +14,14 @@ const { createAnthropicAdapter } = require('./anthropic'); const { createCopilotAdapter } = require('./copilot'); const { GOOGLE_PROVIDER_ADAPTER_FACTORIES } = require('./google-adapter'); +const PROVIDER_ADAPTER_FACTORIES = [ + [createOpenAIAdapter, 'openaiBodyTransform'], + [createAnthropicAdapter, 'anthropicBodyTransform'], + [createCopilotAdapter, 'copilotBodyTransform'], + [GOOGLE_PROVIDER_ADAPTER_FACTORIES.gemini, 'geminiBodyTransform'], + [GOOGLE_PROVIDER_ADAPTER_FACTORIES.vertex, 'vertexBodyTransform'], +]; + /** * @typedef {Object} ProbeConfig * @property {string} url - URL to probe @@ -100,13 +108,8 @@ const { GOOGLE_PROVIDER_ADAPTER_FACTORIES } = require('./google-adapter'); * @returns {ProviderAdapter[]} */ function createAllAdapters(env, deps = {}) { - const openai = createOpenAIAdapter(env, { bodyTransform: deps.openaiBodyTransform || null }); - const anthropic = createAnthropicAdapter(env, { bodyTransform: deps.anthropicBodyTransform || null }); - const copilot = createCopilotAdapter(env, { bodyTransform: deps.copilotBodyTransform || null }); - const gemini = GOOGLE_PROVIDER_ADAPTER_FACTORIES.gemini(env, { bodyTransform: deps.geminiBodyTransform || null }); - const vertex = GOOGLE_PROVIDER_ADAPTER_FACTORIES.vertex(env, { bodyTransform: deps.vertexBodyTransform || null }); - - return [openai, anthropic, copilot, gemini, vertex]; + return PROVIDER_ADAPTER_FACTORIES.map(([createAdapter, bodyTransformKey]) => + createAdapter(env, { bodyTransform: deps[bodyTransformKey] || null })); } module.exports = { diff --git a/containers/api-proxy/providers/index.test.js b/containers/api-proxy/providers/index.test.js new file mode 100644 index 000000000..3e7875377 --- /dev/null +++ b/containers/api-proxy/providers/index.test.js @@ -0,0 +1,43 @@ +'use strict'; + +const { createAllAdapters } = require('./index'); + +describe('createAllAdapters', () => { + it('creates providers in port order and wires each transform to its provider', () => { + const transforms = { + openaiBodyTransform: jest.fn(), + anthropicBodyTransform: jest.fn(), + copilotBodyTransform: jest.fn(), + geminiBodyTransform: jest.fn(), + vertexBodyTransform: jest.fn(), + }; + + const adapters = createAllAdapters({ + OPENAI_API_KEY: 'openai-key', + ANTHROPIC_API_KEY: 'anthropic-key', + COPILOT_GITHUB_TOKEN: 'copilot-token', + GEMINI_API_KEY: 'gemini-key', + GOOGLE_API_KEY: 'vertex-key', + }, transforms); + + expect(adapters.map(({ name, port }) => ({ name, port }))).toEqual([ + { name: 'openai', port: 10000 }, + { name: 'anthropic', port: 10001 }, + { name: 'copilot', port: 10002 }, + { name: 'gemini', port: 10003 }, + { name: 'vertex', port: 10004 }, + ]); + expect(adapters.map(adapter => adapter.getBodyTransform())).toEqual([ + transforms.openaiBodyTransform, + transforms.anthropicBodyTransform, + expect.any(Function), + transforms.geminiBodyTransform, + transforms.vertexBodyTransform, + ]); + + const copilotBody = Buffer.from('{}'); + transforms.copilotBodyTransform.mockReturnValue(null); + adapters[2].getBodyTransform()(copilotBody); + expect(transforms.copilotBodyTransform).toHaveBeenCalledWith(copilotBody); + }); +});