From c9e6535b01e9f6d61fc2b2ec45ad22dbffb2a525 Mon Sep 17 00:00:00 2001 From: xaeon2026 Date: Mon, 9 Mar 2026 15:16:41 -0400 Subject: [PATCH] fix(config): accept agents.list[].params in schema validation The runtime type definition (types.agents.ts) includes an optional params field on agent list entries for per-agent model overrides like cacheRetention and temperature. However, the zod validation schema (AgentEntrySchema) was missing this field, causing 'openclaw config validate' to reject documented configs. Fixes #41160 --- src/config/zod-schema.agent-params.test.ts | 36 ++++++++++++++++++++++ src/config/zod-schema.agent-runtime.ts | 2 ++ 2 files changed, 38 insertions(+) create mode 100644 src/config/zod-schema.agent-params.test.ts diff --git a/src/config/zod-schema.agent-params.test.ts b/src/config/zod-schema.agent-params.test.ts new file mode 100644 index 00000000000..83b712c2d00 --- /dev/null +++ b/src/config/zod-schema.agent-params.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from "vitest"; +import { AgentEntrySchema } from "./zod-schema.agent-runtime.js"; + +describe("AgentEntrySchema params field", () => { + it("accepts agents.list[].params with cacheRetention", () => { + const result = AgentEntrySchema.safeParse({ + id: "main", + params: { cacheRetention: "none" }, + }); + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.params).toEqual({ cacheRetention: "none" }); + } + }); + + it("accepts agents.list[].params with arbitrary model overrides", () => { + const result = AgentEntrySchema.safeParse({ + id: "main", + params: { temperature: 0.7, maxTokens: 4096 }, + }); + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.params).toEqual({ temperature: 0.7, maxTokens: 4096 }); + } + }); + + it("accepts agents.list[] without params (optional)", () => { + const result = AgentEntrySchema.safeParse({ + id: "main", + }); + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.params).toBeUndefined(); + } + }); +}); diff --git a/src/config/zod-schema.agent-runtime.ts b/src/config/zod-schema.agent-runtime.ts index 3ede7218b80..8114ada1241 100644 --- a/src/config/zod-schema.agent-runtime.ts +++ b/src/config/zod-schema.agent-runtime.ts @@ -726,6 +726,8 @@ export const AgentEntrySchema = z heartbeat: HeartbeatSchema, identity: IdentitySchema, groupChat: GroupChatSchema, + /** Per-agent model params (e.g. cacheRetention, temperature). Merged on top of agents.defaults.models[...].params. */ + params: z.record(z.string(), z.unknown()).optional(), subagents: z .object({ allowAgents: z.array(z.string()).optional(),