





















@@ -491,6 +491,14 @@ describe("capability cli", () => {
491491expect(firstPreparedModelParams()?.modelRef).toBe(modelRef);
492492}
493493494+function runtimeErrorMessages(): string[] {
495+return mocks.runtime.error.mock.calls.map((call) => String(call[0] ?? ""));
496+}
497+498+function expectRuntimeErrorContains(expected: string): void {
499+expect(runtimeErrorMessages().some((message) => message.includes(expected))).toBe(true);
500+}
501+494502it("lists canonical capabilities", async () => {
495503await runRegisteredCli({
496504register: registerCapabilityCli as (program: Command) => void,
@@ -726,9 +734,7 @@ describe("capability cli", () => {
726734}),
727735).rejects.toThrow("exit 1");
728736729-expect(mocks.runtime.error).toHaveBeenCalledWith(
730-expect.stringContaining("Only image files are supported"),
731-);
737+expectRuntimeErrorContains("Only image files are supported");
732738expect(mocks.completeWithPreparedSimpleCompletionModel).not.toHaveBeenCalled();
733739expect(mocks.callGateway).not.toHaveBeenCalled();
734740});
@@ -745,9 +751,7 @@ describe("capability cli", () => {
745751}),
746752).rejects.toThrow("exit 1");
747753748-expect(mocks.runtime.error).toHaveBeenCalledWith(
749-expect.stringContaining('No text output returned for provider "openai" model "gpt-5.4"'),
750-);
754+expectRuntimeErrorContains('No text output returned for provider "openai" model "gpt-5.4"');
751755expect(mocks.runtime.writeJson).not.toHaveBeenCalled();
752756});
753757@@ -765,9 +769,7 @@ describe("capability cli", () => {
765769}),
766770).rejects.toThrow("exit 1");
767771768-expect(mocks.runtime.error).toHaveBeenCalledWith(
769-expect.stringContaining('{"detail":"Instructions are required"}'),
770-);
772+expectRuntimeErrorContains('{"detail":"Instructions are required"}');
771773expect(mocks.runtime.writeJson).not.toHaveBeenCalled();
772774});
773775@@ -806,9 +808,7 @@ describe("capability cli", () => {
806808}),
807809).rejects.toThrow("exit 1");
808810809-expect(mocks.runtime.error).toHaveBeenCalledWith(
810-expect.stringContaining("Codex app-server agent runtime"),
811-);
811+expectRuntimeErrorContains("Codex app-server agent runtime");
812812expect(mocks.completeWithPreparedSimpleCompletionModel).not.toHaveBeenCalled();
813813expect(mocks.runtime.writeJson).not.toHaveBeenCalled();
814814});
@@ -823,9 +823,7 @@ describe("capability cli", () => {
823823}),
824824).rejects.toThrow("exit 1");
825825826-expect(mocks.runtime.error).toHaveBeenCalledWith(
827-expect.stringContaining("--prompt cannot be empty or whitespace-only."),
828-);
826+expectRuntimeErrorContains("--prompt cannot be empty or whitespace-only.");
829827expect(mocks.prepareSimpleCompletionModelForAgent).not.toHaveBeenCalled();
830828expect(mocks.completeWithPreparedSimpleCompletionModel).not.toHaveBeenCalled();
831829expect(mocks.callGateway).not.toHaveBeenCalled();
@@ -995,9 +993,7 @@ describe("capability cli", () => {
995993}),
996994).rejects.toThrow("exit 1");
997995998-expect(mocks.runtime.error).toHaveBeenCalledWith(
999-expect.stringContaining("Invalid thinking level."),
1000-);
996+expectRuntimeErrorContains("Invalid thinking level.");
1001997expect(mocks.prepareSimpleCompletionModelForAgent).not.toHaveBeenCalled();
1002998expect(mocks.completeWithPreparedSimpleCompletionModel).not.toHaveBeenCalled();
1003999expect(mocks.callGateway).not.toHaveBeenCalled();
@@ -1012,9 +1008,7 @@ describe("capability cli", () => {
10121008}),
10131009).rejects.toThrow("exit 1");
101410101015-expect(mocks.runtime.error).toHaveBeenCalledWith(
1016-expect.stringContaining("--prompt cannot be empty or whitespace-only."),
1017-);
1011+expectRuntimeErrorContains("--prompt cannot be empty or whitespace-only.");
10181012expect(mocks.callGateway).not.toHaveBeenCalled();
10191013expect(mocks.runtime.writeJson).not.toHaveBeenCalled();
10201014});
@@ -1161,12 +1155,8 @@ describe("capability cli", () => {
11611155argv: ["capability", "image", "describe", "--file", "photo.jpg", "--json"],
11621156}),
11631157).rejects.toThrow("exit 1");
1164-expect(mocks.runtime.error).toHaveBeenCalledWith(
1165-expect.stringContaining("No image understanding provider is configured or ready"),
1166-);
1167-expect(mocks.runtime.error).toHaveBeenCalledWith(
1168-expect.stringContaining("agents.defaults.imageModel.primary"),
1169-);
1158+expectRuntimeErrorContains("No image understanding provider is configured or ready");
1159+expectRuntimeErrorContains("agents.defaults.imageModel.primary");
11701160});
1171116111721162it("reports missing image understanding configuration for image describe-many", async () => {
@@ -1185,9 +1175,7 @@ describe("capability cli", () => {
11851175argv: ["capability", "image", "describe-many", "--file", "photo.jpg", "--json"],
11861176}),
11871177).rejects.toThrow("exit 1");
1188-expect(mocks.runtime.error).toHaveBeenCalledWith(
1189-expect.stringContaining("No image understanding provider is configured or ready"),
1190-);
1178+expectRuntimeErrorContains("No image understanding provider is configured or ready");
11911179});
1192118011931181it("rewrites mismatched explicit image output extensions to the detected file type", async () => {
@@ -1616,9 +1604,7 @@ describe("capability cli", () => {
16161604argv: ["capability", "video", "generate", "--prompt", "friendly lobster", "--json"],
16171605}),
16181606).rejects.toThrow("exit 1");
1619-expect(mocks.runtime.error).toHaveBeenCalledWith(
1620-expect.stringContaining("Video asset at index 0 has neither buffer nor url"),
1621-);
1607+expectRuntimeErrorContains("Video asset at index 0 has neither buffer nor url");
16221608});
1623160916241610it("routes audio transcribe through transcription, not realtime", async () => {
@@ -1665,12 +1651,8 @@ describe("capability cli", () => {
16651651argv: ["capability", "audio", "transcribe", "--file", "memo.m4a", "--json"],
16661652}),
16671653).rejects.toThrow("exit 1");
1668-expect(mocks.runtime.error).toHaveBeenCalledWith(
1669-expect.stringContaining("No audio transcription provider is configured or ready"),
1670-);
1671-expect(mocks.runtime.error).toHaveBeenCalledWith(
1672-expect.stringContaining("tools.media.audio.models"),
1673-);
1654+expectRuntimeErrorContains("No audio transcription provider is configured or ready");
1655+expectRuntimeErrorContains("tools.media.audio.models");
16741656});
1675165716761658it("surfaces the underlying transcription failure for audio transcribe", async () => {
@@ -1808,9 +1790,7 @@ describe("capability cli", () => {
18081790}),
18091791).rejects.toThrow("exit 1");
181017921811-expect(mocks.runtime.error).toHaveBeenCalledWith(
1812-expect.stringContaining("--output is not supported for remote gateway TTS yet"),
1813-);
1793+expectRuntimeErrorContains("--output is not supported for remote gateway TTS yet");
18141794});
1815179518161796it("uses only embedding providers for embedding creation", async () => {
@@ -1919,9 +1899,7 @@ describe("capability cli", () => {
19191899}),
19201900).rejects.toThrow("exit 1");
192119011922-expect(mocks.runtime.error).toHaveBeenCalledWith(
1923-expect.stringContaining("Failed to remove saved auth profiles for provider openai."),
1924-);
1902+expectRuntimeErrorContains("Failed to remove saved auth profiles for provider openai.");
19251903});
1926190419271905it("rejects providerless audio model overrides", async () => {
@@ -1941,9 +1919,7 @@ describe("capability cli", () => {
19411919}),
19421920).rejects.toThrow("exit 1");
194319211944-expect(mocks.runtime.error).toHaveBeenCalledWith(
1945-expect.stringContaining("Model overrides must use the form <provider/model>."),
1946-);
1922+expectRuntimeErrorContains("Model overrides must use the form <provider/model>.");
19471923expect(mocks.transcribeAudioFile).not.toHaveBeenCalled();
19481924});
19491925@@ -1964,9 +1940,7 @@ describe("capability cli", () => {
19641940}),
19651941).rejects.toThrow("exit 1");
196619421967-expect(mocks.runtime.error).toHaveBeenCalledWith(
1968-expect.stringContaining("Model overrides must use the form <provider/model>."),
1969-);
1943+expectRuntimeErrorContains("Model overrides must use the form <provider/model>.");
19701944expect(mocks.describeImageFile).not.toHaveBeenCalled();
19711945});
19721946@@ -1994,9 +1968,7 @@ describe("capability cli", () => {
19941968}),
19951969).rejects.toThrow("exit 1");
199619701997-expect(mocks.runtime.error).toHaveBeenCalledWith(
1998-expect.stringContaining("Model overrides must use the form <provider/model>."),
1999-);
1971+expectRuntimeErrorContains("Model overrides must use the form <provider/model>.");
20001972expect(vi.mocked(mediaRuntime.describeVideoFile)).not.toHaveBeenCalled();
20011973});
20021974此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。