fix: let Codex start with computer control enabled (#102944)

* fix(agents): make computer schema Codex-compatible

* docs(changelog): note Codex computer schema fix
This commit is contained in:
Peter Steinberger 2026-07-09 16:15:24 +01:00 committed by GitHub
parent 12ceefcb03
commit 14558dee87
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 34 additions and 2 deletions

View file

@ -23,6 +23,7 @@ Docs: https://docs.openclaw.ai
### Fixes
- **Codex computer control:** publish fixed-length coordinate pairs as homogeneous array schemas so Codex app-server can start threads with the `computer` tool instead of rejecting tuple-valued `items`.
- **Google Chat request deadlines:** bound control calls to 30 seconds while giving media transfers size-aware total budgets and a separate 30-second stalled-body guard, preventing hung Chat API requests without breaking large attachment uploads. (#102227) Thanks @hugenshen.
- **Google Gemini prefixed model IDs:** recognize `google/gemini-*` and `models/gemini-*` when selecting multimodal function-response behavior, preserving the Gemini 2 image fallback without regressing Gemini 3 inline image responses. (#102382) Thanks @LiLan0125.
- **Generated provider model catalogs:** keep MiniMax and NVIDIA catalog rows when they advertise audio or video metadata while projecting runtime model inputs to text/image, preventing configured multimodal primaries from being dropped and falling back. (#97858, #97048) Thanks @ly-wang19 and @zackchiutw.

View file

@ -125,6 +125,31 @@ describe("buildComputerActParams", () => {
});
});
describe("createComputerTool schema", () => {
it("publishes Codex-compatible fixed-size coordinate arrays", () => {
const properties = (
createComputerTool().parameters as {
properties?: Record<string, Record<string, unknown>>;
}
).properties;
for (const key of ["coordinate", "startCoordinate"] as const) {
const schema = properties?.[key];
if (!schema) {
throw new Error(`missing ${key} schema`);
}
expect(schema).toMatchObject({
type: "array",
items: { type: "number" },
minItems: 2,
maxItems: 2,
});
expect(Array.isArray(schema.items)).toBe(false);
expect(schema).not.toHaveProperty("additionalItems");
}
});
});
describe("createComputerTool node resolution", () => {
beforeEach(() => {
listNodesMock.mockReset();

View file

@ -123,13 +123,19 @@ const ComputerToolSchema = Type.Object({
"Paired node id or display name. Omit when exactly one connected computer-capable node exists.",
}),
),
// Codex accepts a single schema in array `items`, not tuple item arrays.
// Fixed bounds preserve the coordinate-pair contract across runtimes.
coordinate: Type.Optional(
Type.Tuple([Type.Number(), Type.Number()], {
Type.Array(Type.Number(), {
minItems: 2,
maxItems: 2,
description: "[x, y] target in pixels of the most recent screenshot.",
}),
),
startCoordinate: Type.Optional(
Type.Tuple([Type.Number(), Type.Number()], {
Type.Array(Type.Number(), {
minItems: 2,
maxItems: 2,
description: "left_click_drag: [x, y] drag origin in screenshot pixels.",
}),
),