Fix: Sync asyncCompletion config in zod-schema.ts to resolve "Unrecog… (#63618)

Merged via squash.

Prepared head SHA: dcce839c07
Co-authored-by: qiziAI <17017936+qiziAI@users.noreply.github.com>
Co-authored-by: altaywtf <9790196+altaywtf@users.noreply.github.com>
Reviewed-by: @altaywtf
This commit is contained in:
qiziAI
2026-04-11 18:12:09 +08:00
committed by GitHub
parent e0a2c568b2
commit e339038cc0
3 changed files with 31 additions and 0 deletions

View File

@@ -150,6 +150,7 @@ Docs: https://docs.openclaw.ai
- Browser/security: reject strict-policy hostname navigation unless the hostname is an explicit allowlist exception or IP literal, and route CDP HTTP discovery through the pinned SSRF fetch path. (#64367) Thanks @eleqtrizit.
- Models/vLLM: ignore empty `tool_calls` arrays from reasoning-model OpenAI-compatible replies, reset false `toolUse` stop reasons when no actual tool calls were parsed, and stop sending `tool_choice` unless tools are present so vLLM reasoning responses no longer hang indefinitely. (#61197, #61534) Thanks @balajisiva.
- Heartbeat/scheduling: spread interval heartbeats across stable per-agent phases derived from gateway identity, so provider traffic is distributed more uniformly across the configured interval instead of clustering around startup-relative times. (#64560) Thanks @odysseus0.
- Config/media: accept `tools.media.asyncCompletion.directSend` in strict config validation so gateways no longer reject the generated-schema-backed async media completion setting at startup. (#63618) Thanks @qiziAI.
## 2026.4.9

View File

@@ -253,6 +253,19 @@ describe("config schema regressions", () => {
expect(res.ok).toBe(false);
});
it("accepts tools.media.asyncCompletion.directSend", () => {
const res = validateConfigObject({
tools: {
media: {
asyncCompletion: {
directSend: true,
},
},
},
});
expect(res.ok).toBe(true);
});
it("accepts discovery.wideArea.domain for unicast DNS-SD", () => {
const res = validateConfigObject({
discovery: {

View File

@@ -9,6 +9,7 @@ import {
import { normalizeStringEntries } from "../shared/string-normalization.js";
import type { ModelCompatConfig } from "./types.models.js";
import { MODEL_APIS } from "./types.models.js";
import type { MediaToolsConfig } from "./types.tools.js";
import { createAllowDenyChannelRulesSchema } from "./zod-schema.allowdeny.js";
import { sensitive } from "./zod-schema.sensitive.js";
@@ -772,6 +773,12 @@ export const ToolsMediaSchema = z
.object({
models: z.array(MediaUnderstandingModelSchema).optional(),
concurrency: z.number().int().positive().optional(),
asyncCompletion: z
.object({
directSend: z.boolean().optional(),
})
.strict()
.optional(),
image: ToolsMediaUnderstandingSchema.optional(),
audio: ToolsMediaUnderstandingSchema.optional(),
video: ToolsMediaUnderstandingSchema.optional(),
@@ -779,6 +786,16 @@ export const ToolsMediaSchema = z
.strict()
.optional();
type ToolsMediaConfigFromSchema = NonNullable<z.infer<typeof ToolsMediaSchema>>;
type _ToolsMediaAsyncCompletionSchemaAssignableToType = AssertAssignable<
ToolsMediaConfigFromSchema["asyncCompletion"],
MediaToolsConfig["asyncCompletion"]
>;
type _ToolsMediaAsyncCompletionTypeAssignableToSchema = AssertAssignable<
MediaToolsConfig["asyncCompletion"],
ToolsMediaConfigFromSchema["asyncCompletion"]
>;
export const LinkModelSchema = z
.object({
type: z.literal("cli").optional(),