From 0023a9250988fa588c20bef16bc7cff8b4799edc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 8 Sep 2026 22:23:32 +0000 Subject: [PATCH 1/3] Initial plan From 6602fe134b7779132b59f0ce19aa52d704ed8c4e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 8 Sep 2026 22:26:02 +0000 Subject: [PATCH 2/3] refactor: centralize provider adapter registration Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com> --- containers/api-proxy/providers/index.js | 17 +++++---- containers/api-proxy/providers/index.test.js | 38 ++++++++++++++++++++ 2 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 containers/api-proxy/providers/index.test.js 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..b97b2e540 --- /dev/null +++ b/containers/api-proxy/providers/index.test.js @@ -0,0 +1,38 @@ +'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, + ]); + }); +}); From 99b6b4b8ddbf24e9e0e843b613ead269eb8cf5da Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 9 Sep 2026 06:40:13 -0700 Subject: [PATCH 3/3] Add test for copilotBodyTransform function Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- containers/api-proxy/providers/index.test.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/containers/api-proxy/providers/index.test.js b/containers/api-proxy/providers/index.test.js index b97b2e540..3e7875377 100644 --- a/containers/api-proxy/providers/index.test.js +++ b/containers/api-proxy/providers/index.test.js @@ -34,5 +34,10 @@ describe('createAllAdapters', () => { transforms.geminiBodyTransform, transforms.vertexBodyTransform, ]); + + const copilotBody = Buffer.from('{}'); + transforms.copilotBodyTransform.mockReturnValue(null); + adapters[2].getBodyTransform()(copilotBody); + expect(transforms.copilotBodyTransform).toHaveBeenCalledWith(copilotBody); }); });