diff --git a/CHANGELOG.md b/CHANGELOG.md index 95057663b3c..fefa2f8085e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ Docs: https://docs.openclaw.ai - Config/Plugins entries: treat unknown `plugins.entries.*` ids as startup warnings (ignored stale keys) instead of hard validation failures that can crash-loop gateway boot. Landed from contributor PR #27506 by @Sid-Qin. (#27455) - Auth/Auth profiles: normalize `auth-profiles.json` alias fields (`mode -> type`, `apiKey -> key`) before credential validation so entries copied from `openclaw.json` auth examples are no longer silently dropped. (#26950) thanks @byungsker. - Models/Profile suffix parsing: centralize trailing `@profile` parsing and only treat `@` as a profile separator when it appears after the final `/`, preserving model IDs like `openai/@cf/...` and `openrouter/@preset/...` across `/model` directive parsing and allowlist model resolution, with regression coverage. +- Models/OpenAI Codex config schema parity: accept `openai-codex-responses` in the config model API schema and TypeScript `ModelApi` union, with regression coverage for config validation. Landed from contributor PR #27501 by @AytuncYildizli. Thanks @AytuncYildizli. - Agents/Models config: preserve agent-level provider `apiKey` and `baseUrl` during merge-mode `models.json` updates when agent values are present. (#27293) thanks @Sid-Qin. - Cron/Hooks isolated routing: preserve canonical `agent:*` session keys in isolated runs so already-qualified keys are not double-prefixed (for example `agent:main:main` no longer becomes `agent:main:agent:main:main`). Landed from contributor PR #27333 by @MaheshBhushan. (#27289, #27282) - Pairing/Multi-account isolation: keep non-default account pairing allowlists and pending requests strictly account-scoped, while default account continues to use channel-scoped pairing allowlist storage. Thanks @gumadeiras. diff --git a/src/config/config.secrets-schema.test.ts b/src/config/config.secrets-schema.test.ts index aa1b9ab8aa6..56b0f2e06e3 100644 --- a/src/config/config.secrets-schema.test.ts +++ b/src/config/config.secrets-schema.test.ts @@ -35,6 +35,22 @@ describe("config secret refs schema", () => { expect(result.ok).toBe(true); }); + it("accepts openai-codex-responses as a model api value", () => { + const result = validateConfigObjectRaw({ + models: { + providers: { + "openai-codex": { + baseUrl: "https://chatgpt.com/backend-api", + api: "openai-codex-responses", + models: [{ id: "gpt-5.3-codex", name: "gpt-5.3-codex" }], + }, + }, + }, + }); + + expect(result.ok).toBe(true); + }); + it("accepts googlechat serviceAccount refs", () => { const result = validateConfigObjectRaw({ channels: { diff --git a/src/config/types.models.ts b/src/config/types.models.ts index 9e97c675935..b367553982f 100644 --- a/src/config/types.models.ts +++ b/src/config/types.models.ts @@ -3,6 +3,7 @@ import type { SecretInput } from "./types.secrets.js"; export type ModelApi = | "openai-completions" | "openai-responses" + | "openai-codex-responses" | "anthropic-messages" | "google-generative-ai" | "github-copilot"