


























@@ -123,6 +123,7 @@ vi.mock("../plugins/provider-runtime.js", async () => {
123123124124let applyAuthHeaderOverride: typeof import("./model-auth.js").applyAuthHeaderOverride;
125125let applyLocalNoAuthHeaderOverride: typeof import("./model-auth.js").applyLocalNoAuthHeaderOverride;
126+let formatMissingAuthError: typeof import("./model-auth.js").formatMissingAuthError;
126127let hasUsableCustomProviderApiKey: typeof import("./model-auth.js").hasUsableCustomProviderApiKey;
127128let hasSyntheticLocalProviderAuthConfig: typeof import("./model-auth.js").hasSyntheticLocalProviderAuthConfig;
128129let requireApiKey: typeof import("./model-auth.js").requireApiKey;
@@ -141,6 +142,7 @@ beforeAll(async () => {
141142({
142143 applyAuthHeaderOverride,
143144 applyLocalNoAuthHeaderOverride,
145+ formatMissingAuthError,
144146 hasSyntheticLocalProviderAuthConfig,
145147 hasUsableCustomProviderApiKey,
146148 requireApiKey,
@@ -354,6 +356,20 @@ describe("resolveModelAuthMode", () => {
354356});
355357356358describe("requireApiKey", () => {
359+it("formats missing auth errors with the checked credential source", () => {
360+expect(
361+formatMissingAuthError(
362+{
363+source: "env: OPENAI_API_KEY",
364+mode: "api-key",
365+},
366+"openai",
367+),
368+).toBe(
369+'No API key resolved for provider "openai" (auth mode: api-key, checked: env: OPENAI_API_KEY).',
370+);
371+});
372+357373it("normalizes line breaks in resolved API keys", () => {
358374const key = requireApiKey(
359375{
@@ -376,7 +392,9 @@ describe("requireApiKey", () => {
376392},
377393"openai",
378394),
379-).toThrow('No API key resolved for provider "openai"');
395+).toThrow(
396+'No API key resolved for provider "openai" (auth mode: api-key, checked: env: OPENAI_API_KEY).',
397+);
380398});
381399});
382400此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。