mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-12 09:41:11 +00:00
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:
@@ -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
|
||||
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user