
















@@ -406,16 +406,21 @@ describe("capability cli", () => {
406406);
407407expect(mocks.completeWithPreparedSimpleCompletionModel).toHaveBeenCalledWith(
408408expect.objectContaining({
409-context: {
409+context: expect.objectContaining({
410410messages: [
411411expect.objectContaining({
412412role: "user",
413413content: "hello",
414414}),
415415],
416-},
416+}),
417417}),
418418);
419+const calls = mocks.completeWithPreparedSimpleCompletionModel.mock.calls as unknown as Array<
420+[{ context?: { systemPrompt?: string } }]
421+>;
422+const call = calls[0]?.[0];
423+expect(call.context).not.toHaveProperty("systemPrompt");
419424});
420425421426it("passes image files to local model probes", async () => {
@@ -438,7 +443,7 @@ describe("capability cli", () => {
438443439444expect(mocks.completeWithPreparedSimpleCompletionModel).toHaveBeenCalledWith(
440445expect.objectContaining({
441-context: {
446+context: expect.objectContaining({
442447messages: [
443448expect.objectContaining({
444449role: "user",
@@ -448,9 +453,14 @@ describe("capability cli", () => {
448453],
449454}),
450455],
451-},
456+}),
452457}),
453458);
459+const calls = mocks.completeWithPreparedSimpleCompletionModel.mock.calls as unknown as Array<
460+[{ context?: { systemPrompt?: string } }]
461+>;
462+const call = calls[0]?.[0];
463+expect(call.context).not.toHaveProperty("systemPrompt");
454464expect(mocks.runtime.writeJson).toHaveBeenCalledWith(
455465expect.objectContaining({
456466inputs: [
@@ -463,6 +473,55 @@ describe("capability cli", () => {
463473);
464474});
465475476+it("adds minimal instructions only for openai-codex local model probes", async () => {
477+mocks.prepareSimpleCompletionModelForAgent.mockResolvedValueOnce({
478+selection: {
479+provider: "openai-codex",
480+modelId: "gpt-5.5",
481+agentDir: "/tmp/agent",
482+},
483+model: {
484+provider: "openai-codex",
485+id: "gpt-5.5",
486+api: "openai-codex-responses",
487+maxTokens: 128,
488+},
489+auth: {
490+apiKey: "codex-app-server",
491+source: "codex-app-server",
492+mode: "token",
493+},
494+} as never);
495+496+await runRegisteredCli({
497+register: registerCapabilityCli as (program: Command) => void,
498+argv: [
499+"capability",
500+"model",
501+"run",
502+"--model",
503+"openai-codex/gpt-5.5",
504+"--prompt",
505+"hello",
506+"--json",
507+],
508+});
509+510+expect(mocks.completeWithPreparedSimpleCompletionModel).toHaveBeenCalledWith(
511+expect.objectContaining({
512+context: expect.objectContaining({
513+systemPrompt: "You are a personal assistant running inside OpenClaw.",
514+messages: [
515+expect.objectContaining({
516+role: "user",
517+content: "hello",
518+}),
519+],
520+}),
521+}),
522+);
523+});
524+466525it("passes image files to gateway model probes as attachments", async () => {
467526const tempInput = path.join(os.tmpdir(), `openclaw-model-run-gateway-image-${Date.now()}.png`);
468527await fs.writeFile(tempInput, Buffer.from(PNG_1X1_BASE64, "base64"));
@@ -547,6 +606,26 @@ describe("capability cli", () => {
547606expect(mocks.runtime.writeJson).not.toHaveBeenCalled();
548607});
549608609+it("surfaces provider errors when local model probes return no text output", async () => {
610+mocks.completeWithPreparedSimpleCompletionModel.mockResolvedValueOnce({
611+content: [],
612+stopReason: "error",
613+errorMessage: '{"detail":"Instructions are required"}',
614+} as never);
615+616+await expect(
617+runRegisteredCli({
618+register: registerCapabilityCli as (program: Command) => void,
619+argv: ["capability", "model", "run", "--prompt", "hello", "--json"],
620+}),
621+).rejects.toThrow("exit 1");
622+623+expect(mocks.runtime.error).toHaveBeenCalledWith(
624+expect.stringContaining('{"detail":"Instructions are required"}'),
625+);
626+expect(mocks.runtime.writeJson).not.toHaveBeenCalled();
627+});
628+550629it("rejects local Codex provider probes before simple-completion dispatch", async () => {
551630mocks.prepareSimpleCompletionModelForAgent.mockResolvedValueOnce({
552631selection: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。