
















@@ -21,6 +21,8 @@ const manifest = JSON.parse(
2121choiceHint?: string;
2222choiceId?: string;
2323deprecatedChoiceIds?: string[];
24+groupId?: string;
25+groupLabel?: string;
2426groupHint?: string;
2527}>;
2628};
@@ -66,6 +68,19 @@ function providerWizardByKey() {
6668return wizards;
6769}
687071+function expectWizardFields(
72+wizard: Record<string, unknown> | undefined,
73+choice: ReturnType<typeof manifestComparableWizardFields>,
74+key: string,
75+) {
76+if (!wizard) {
77+throw new Error(`Missing wizard for ${key}`);
78+}
79+for (const [field, value] of Object.entries(choice)) {
80+expect(wizard[field], `${key}.${field}`).toBe(value);
81+}
82+}
83+6984describe("OpenAI plugin manifest", () => {
7085it("keeps runtime dependencies in the package manifest", () => {
7186expect(packageJson.dependencies?.["@earendil-works/pi-ai"]).toBe("0.74.0");
@@ -81,17 +96,12 @@ describe("OpenAI plugin manifest", () => {
8196});
82978398it("keeps Codex media-understanding manifest metadata aligned with runtime audio support", () => {
84-expect(manifest.mediaUnderstandingProviderMetadata?.["openai-codex"]).toMatchObject({
85-capabilities: ["image", "audio"],
86-defaultModels: {
87-image: "gpt-5.5",
88-audio: "gpt-4o-transcribe",
89-},
90-autoPriority: {
91-image: 20,
92-audio: 20,
93-},
94-});
99+const metadata = manifest.mediaUnderstandingProviderMetadata?.["openai-codex"];
100+expect(metadata?.capabilities).toEqual(["image", "audio"]);
101+expect(metadata?.defaultModels?.image).toBe("gpt-5.5");
102+expect(metadata?.defaultModels?.audio).toBe("gpt-4o-transcribe");
103+expect(metadata?.autoPriority?.image).toBe(20);
104+expect(metadata?.autoPriority?.audio).toBe(20);
95105});
9610697107it("labels OpenAI API key and Codex auth choices without stale mixed OAuth wording", () => {
@@ -104,26 +114,20 @@ describe("OpenAI plugin manifest", () => {
104114(choice) => choice.provider === "openai" && choice.method === "api-key",
105115);
106116107-expect(codexBrowserLogin).toMatchObject({
108-choiceLabel: "OpenAI Codex Browser Login",
109-choiceHint: "Sign in with OpenAI in your browser",
110-groupId: "openai-codex",
111-groupLabel: "OpenAI Codex",
112-groupHint: "ChatGPT/Codex sign-in",
113-});
114-expect(codexDeviceCode).toMatchObject({
115-choiceLabel: "OpenAI Codex Device Pairing",
116-choiceHint: "Pair in browser with a device code",
117-groupId: "openai-codex",
118-groupLabel: "OpenAI Codex",
119-groupHint: "ChatGPT/Codex sign-in",
120-});
121-expect(apiKey).toMatchObject({
122-choiceLabel: "OpenAI API Key",
123-groupId: "openai",
124-groupLabel: "OpenAI",
125-groupHint: "Direct API key",
126-});
117+expect(codexBrowserLogin?.choiceLabel).toBe("OpenAI Codex Browser Login");
118+expect(codexBrowserLogin?.choiceHint).toBe("Sign in with OpenAI in your browser");
119+expect(codexBrowserLogin?.groupId).toBe("openai-codex");
120+expect(codexBrowserLogin?.groupLabel).toBe("OpenAI Codex");
121+expect(codexBrowserLogin?.groupHint).toBe("ChatGPT/Codex sign-in");
122+expect(codexDeviceCode?.choiceLabel).toBe("OpenAI Codex Device Pairing");
123+expect(codexDeviceCode?.choiceHint).toBe("Pair in browser with a device code");
124+expect(codexDeviceCode?.groupId).toBe("openai-codex");
125+expect(codexDeviceCode?.groupLabel).toBe("OpenAI Codex");
126+expect(codexDeviceCode?.groupHint).toBe("ChatGPT/Codex sign-in");
127+expect(apiKey?.choiceLabel).toBe("OpenAI API Key");
128+expect(apiKey?.groupId).toBe("openai");
129+expect(apiKey?.groupLabel).toBe("OpenAI");
130+expect(apiKey?.groupHint).toBe("Direct API key");
127131expect(choices.map((choice) => choice.choiceLabel)).not.toContain(
128132"OpenAI Codex (ChatGPT OAuth)",
129133);
@@ -137,7 +141,7 @@ describe("OpenAI plugin manifest", () => {
137141for (const choice of manifest.providerAuthChoices ?? []) {
138142const key = `${choice.provider}:${choice.method}`;
139143140-expect(wizards.get(key), key).toMatchObject(manifestComparableWizardFields(choice));
144+expectWizardFields(wizards.get(key), manifestComparableWizardFields(choice), key);
141145}
142146});
143147});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。