test(openai): add docker image auth e2e

This commit is contained in:
Peter Steinberger
2026-04-23 23:12:46 +01:00
parent f523bbfcd1
commit 467fcb1791
9 changed files with 332 additions and 3 deletions

View File

@@ -10,6 +10,7 @@ const {
postMultipartRequestMock,
assertOkOrThrowHttpErrorMock,
resolveProviderHttpRequestConfigMock,
sanitizeConfiguredModelProviderRequestMock,
} = vi.hoisted(() => ({
ensureAuthProfileStoreMock: vi.fn(() => ({ version: 1, profiles: {} })),
isProviderApiKeyConfiguredMock: vi.fn<
@@ -33,10 +34,11 @@ const {
assertOkOrThrowHttpErrorMock: vi.fn(async () => {}),
resolveProviderHttpRequestConfigMock: vi.fn((params) => ({
baseUrl: params.baseUrl ?? params.defaultBaseUrl,
allowPrivateNetwork: Boolean(params.allowPrivateNetwork),
allowPrivateNetwork: Boolean(params.allowPrivateNetwork ?? params.request?.allowPrivateNetwork),
headers: new Headers(params.defaultHeaders),
dispatcherPolicy: undefined,
})),
sanitizeConfiguredModelProviderRequestMock: vi.fn((request) => request),
}));
vi.mock("openclaw/plugin-sdk/provider-auth", () => ({
@@ -54,6 +56,7 @@ vi.mock("openclaw/plugin-sdk/provider-http", () => ({
postJsonRequest: postJsonRequestMock,
postMultipartRequest: postMultipartRequestMock,
resolveProviderHttpRequestConfig: resolveProviderHttpRequestConfigMock,
sanitizeConfiguredModelProviderRequest: sanitizeConfiguredModelProviderRequestMock,
}));
function mockGeneratedPngResponse() {
@@ -135,6 +138,7 @@ describe("openai image generation provider", () => {
postMultipartRequestMock.mockReset();
assertOkOrThrowHttpErrorMock.mockClear();
resolveProviderHttpRequestConfigMock.mockClear();
sanitizeConfiguredModelProviderRequestMock.mockClear();
vi.unstubAllEnvs();
});
@@ -483,6 +487,49 @@ describe("openai image generation provider", () => {
expect(result.images[0]?.buffer).toEqual(Buffer.from("codex-image"));
});
it("honors configured Codex transport overrides for OAuth image generation", async () => {
mockCodexAuthOnly();
mockCodexImageStream({ imageData: "codex-image" });
const provider = buildOpenAIImageGenerationProvider();
const authStore = createCodexOAuthAuthStore();
const result = await provider.generateImage({
provider: "openai",
model: "gpt-image-2",
prompt: "Draw through a configured Codex endpoint",
cfg: {
models: {
providers: {
"openai-codex": {
baseUrl: "http://127.0.0.1:44220/backend-api/codex",
api: "openai-codex-responses",
request: { allowPrivateNetwork: true },
models: [],
},
},
},
},
authStore,
});
expect(sanitizeConfiguredModelProviderRequestMock).toHaveBeenCalledWith({
allowPrivateNetwork: true,
});
expect(resolveProviderHttpRequestConfigMock).toHaveBeenCalledWith(
expect.objectContaining({
baseUrl: "http://127.0.0.1:44220/backend-api/codex",
request: { allowPrivateNetwork: true },
}),
);
expect(postJsonRequestMock).toHaveBeenCalledWith(
expect.objectContaining({
url: "http://127.0.0.1:44220/backend-api/codex/responses",
allowPrivateNetwork: true,
}),
);
expect(result.images[0]?.buffer).toEqual(Buffer.from("codex-image"));
});
it("uses direct OpenAI auth when custom OpenAI image config is explicit", async () => {
mockGeneratedPngResponse();
resolveApiKeyForProviderMock.mockImplementation(async (params?: { provider?: string }) => {

View File

@@ -17,6 +17,7 @@ import {
postJsonRequest,
postMultipartRequest,
resolveProviderHttpRequestConfig,
sanitizeConfiguredModelProviderRequest,
} from "openclaw/plugin-sdk/provider-http";
import { OPENAI_DEFAULT_IMAGE_MODEL as DEFAULT_OPENAI_IMAGE_MODEL } from "./default-models.js";
import { resolveConfiguredOpenAIBaseUrl } from "./shared.js";
@@ -344,13 +345,16 @@ async function generateOpenAICodexImage(params: {
}): Promise<ImageGenerationResult> {
const { req, apiKey } = params;
const inputImages = req.inputImages ?? [];
const codexProviderConfig = req.cfg?.models?.providers?.["openai-codex"];
const { baseUrl, allowPrivateNetwork, headers, dispatcherPolicy } =
resolveProviderHttpRequestConfig({
baseUrl: codexProviderConfig?.baseUrl,
defaultBaseUrl: DEFAULT_OPENAI_CODEX_IMAGE_BASE_URL,
defaultHeaders: {
Authorization: `Bearer ${apiKey}`,
Accept: "text/event-stream",
},
request: sanitizeConfiguredModelProviderRequest(codexProviderConfig?.request),
provider: "openai-codex",
api: "openai-codex-responses",
capability: "image",