diff --git a/README.md b/README.md
index fce611b..91264da 100644
--- a/README.md
+++ b/README.md
@@ -117,6 +117,7 @@ curl http://127.0.0.1:8000/v1/chat/completions \
- `gpt-5.1`
- `gpt-5.2`
- `gpt-5-codex`
+- `gpt-5.2-codex`
- `gpt-5.1-codex`
- `gpt-5.1-codex-max`
- `gpt-5.1-codex-mini`
@@ -128,7 +129,7 @@ curl http://127.0.0.1:8000/v1/chat/completions \
- `--reasoning-effort` (choice of minimal,low,medium,high,xhigh)
GPT-5 has a configurable amount of "effort" it can put into thinking, which may cause it to take more time for a response to return, but may overall give a smarter answer. Applying this parameter after `serve` forces the server to use this reasoning effort by default, unless overrided by the API request with a different effort set. The default reasoning effort without setting this parameter is `medium`.
- The `gpt-5.1` family (including codex) supports `low`, `medium`, and `high` while `gpt-5.1-codex-max` adds `xhigh`. `gpt-5.2` supports `low`, `medium`, `high`, and `xhigh`.
+ The `gpt-5.1` family (including codex) supports `low`, `medium`, and `high` while `gpt-5.1-codex-max` adds `xhigh`. The `gpt-5.2` family (including codex) supports `low`, `medium`, `high`, and `xhigh`.
### Thinking summaries
@@ -173,4 +174,3 @@ When the model returns a thinking summary, the model will send back thinking tag
[](https://www.star-history.com/#RayBytes/ChatMock&Timeline)
-
diff --git a/chatmock/routes_ollama.py b/chatmock/routes_ollama.py
index 76f704a..413adff 100644
--- a/chatmock/routes_ollama.py
+++ b/chatmock/routes_ollama.py
@@ -71,7 +71,7 @@ def ollama_version() -> Response:
def _instructions_for_model(model: str) -> str:
base = current_app.config.get("BASE_INSTRUCTIONS", BASE_INSTRUCTIONS)
- if model.startswith("gpt-5-codex") or model.startswith("gpt-5.1-codex"):
+ if model.startswith("gpt-5-codex") or model.startswith("gpt-5.1-codex") or model.startswith("gpt-5.2-codex"):
codex = current_app.config.get("GPT5_CODEX_INSTRUCTIONS") or GPT5_CODEX_INSTRUCTIONS
if isinstance(codex, str) and codex.strip():
return codex
@@ -98,6 +98,7 @@ def ollama_tags() -> Response:
"gpt-5.1",
"gpt-5.2",
"gpt-5-codex",
+ "gpt-5.2-codex",
"gpt-5.1-codex",
"gpt-5.1-codex-max",
"gpt-5.1-codex-mini",
@@ -120,6 +121,10 @@ def ollama_tags() -> Response:
"gpt-5-codex-high",
"gpt-5-codex-medium",
"gpt-5-codex-low",
+ "gpt-5.2-codex-xhigh",
+ "gpt-5.2-codex-high",
+ "gpt-5.2-codex-medium",
+ "gpt-5.2-codex-low",
"gpt-5.1-codex-high",
"gpt-5.1-codex-medium",
"gpt-5.1-codex-low",
diff --git a/chatmock/routes_openai.py b/chatmock/routes_openai.py
index 75a01b1..c7a2c94 100644
--- a/chatmock/routes_openai.py
+++ b/chatmock/routes_openai.py
@@ -59,7 +59,7 @@ def _wrap_stream_logging(label: str, iterator, enabled: bool):
def _instructions_for_model(model: str) -> str:
base = current_app.config.get("BASE_INSTRUCTIONS", BASE_INSTRUCTIONS)
- if model.startswith("gpt-5-codex") or model.startswith("gpt-5.1-codex"):
+ if model.startswith("gpt-5-codex") or model.startswith("gpt-5.1-codex") or model.startswith("gpt-5.2-codex"):
codex = current_app.config.get("GPT5_CODEX_INSTRUCTIONS") or GPT5_CODEX_INSTRUCTIONS
if isinstance(codex, str) and codex.strip():
return codex
@@ -536,6 +536,7 @@ def list_models() -> Response:
("gpt-5.1", ["high", "medium", "low"]),
("gpt-5.2", ["xhigh", "high", "medium", "low"]),
("gpt-5-codex", ["high", "medium", "low"]),
+ ("gpt-5.2-codex", ["xhigh", "high", "medium", "low"]),
("gpt-5.1-codex", ["high", "medium", "low"]),
("gpt-5.1-codex-max", ["xhigh", "high", "medium", "low"]),
("gpt-5.1-codex-mini", []),
diff --git a/chatmock/upstream.py b/chatmock/upstream.py
index 52261f1..4803954 100644
--- a/chatmock/upstream.py
+++ b/chatmock/upstream.py
@@ -45,6 +45,9 @@ def normalize_model_name(name: str | None, debug_model: str | None = None) -> st
"gpt5.2": "gpt-5.2",
"gpt-5.2": "gpt-5.2",
"gpt-5.2-latest": "gpt-5.2",
+ "gpt5.2-codex": "gpt-5.2-codex",
+ "gpt-5.2-codex": "gpt-5.2-codex",
+ "gpt-5.2-codex-latest": "gpt-5.2-codex",
"gpt5-codex": "gpt-5-codex",
"gpt-5-codex": "gpt-5-codex",
"gpt-5-codex-latest": "gpt-5-codex",