























@@ -1,14 +1,33 @@
1-import { streamSimpleOpenAICompletions, type Model } from "@mariozechner/pi-ai";
1+import type { Model } from "@mariozechner/pi-ai";
22import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
33import type { ModelProviderConfig } from "../config/config.js";
4-import { withFetchPreconnect } from "../test-utils/fetch-mock.js";
54import type { AuthProfileStore } from "./auth-profiles.js";
65import {
76CUSTOM_LOCAL_AUTH_MARKER,
87GCP_VERTEX_CREDENTIALS_MARKER,
98NON_ENV_SECRETREF_MARKER,
109} from "./model-auth-markers.js";
111011+vi.mock("../plugins/plugin-registry.js", () => ({
12+loadPluginManifestRegistryForPluginRegistry: () => ({
13+diagnostics: [],
14+plugins: [
15+{
16+origin: "bundled",
17+nonSecretAuthMarkers: ["gcp-vertex-credentials"],
18+},
19+],
20+}),
21+}));
22+23+vi.mock("../plugins/providers.js", () => ({
24+resolveOwningPluginIdsForProvider: () => [],
25+}));
26+27+vi.mock("../plugins/setup-registry.js", () => ({
28+resolvePluginSetupProvider: () => undefined,
29+}));
30+1231vi.mock("../plugins/provider-runtime.js", async () => {
1332const actual = await vi.importActual<typeof import("../plugins/provider-runtime.js")>(
1433"../plugins/provider-runtime.js",
@@ -939,33 +958,11 @@ describe("resolveApiKeyForProvider – synthetic local auth for custom providers
939958});
940959941960describe("applyLocalNoAuthHeaderOverride", () => {
942-const originalFetch = globalThis.fetch;
943-944961afterEach(() => {
945-globalThis.fetch = originalFetch;
946962vi.restoreAllMocks();
947963});
948964949-it("clears Authorization for synthetic local OpenAI-compatible auth markers", async () => {
950-let capturedAuthorization: string | null | undefined;
951-let capturedXTest: string | null | undefined;
952-let resolveRequest: (() => void) | undefined;
953-const requestSeen = new Promise<void>((resolve) => {
954-resolveRequest = resolve;
955-});
956-globalThis.fetch = withFetchPreconnect(
957-vi.fn(async (_input, init) => {
958-const headers = new Headers(init?.headers);
959-capturedAuthorization = headers.get("Authorization");
960-capturedXTest = headers.get("X-Test");
961-resolveRequest?.();
962-return new Response(JSON.stringify({ error: { message: "unauthorized" } }), {
963-status: 401,
964-headers: { "content-type": "application/json" },
965-});
966-}),
967-);
968-965+it("marks synthetic local OpenAI-compatible auth so SDK request headers clear Authorization", () => {
969966const model = applyLocalNoAuthHeaderOverride(
970967{
971968id: "local-llm",
@@ -987,26 +984,10 @@ describe("applyLocalNoAuthHeaderOverride", () => {
987984},
988985);
989986990-streamSimpleOpenAICompletions(
991-model,
992-{
993-messages: [
994-{
995-role: "user",
996-content: "hello",
997-timestamp: Date.now(),
998-},
999-],
1000-},
1001-{
1002-apiKey: CUSTOM_LOCAL_AUTH_MARKER,
1003-},
1004-);
1005-1006-await requestSeen;
1007-1008-expect(capturedAuthorization).toBeNull();
1009-expect(capturedXTest).toBe("1");
987+expect(model.headers).toMatchObject({
988+Authorization: null,
989+"X-Test": "1",
990+});
1010991});
1011992});
1012993此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。