Skip to content

Commit a187df0

Browse files
committed
chore(protocol): tidy codegen postprocess\n\n- Rename awkward Record3Cstring2Cnever3E to EmptyObject in generated types\n- Drop unused optional Field(...) fixup; keep semantics from schema\n- Disable datamodel-codegen timestamp to reduce diff noise
1 parent db920e4 commit a187df0

4 files changed

Lines changed: 26 additions & 56 deletions

File tree

.github/workflows/codex-autoreview.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ on:
55
types: [opened, synchronize, reopened, ready_for_review]
66
issue_comment:
77
types: [created]
8-
pull_request_review:
9-
types: [submitted]
108
pull_request_review_comment:
119
types: [created]
1210

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ gen-protocol:
6868
--use-union-operator \
6969
--use-standard-collections \
7070
--use-title-as-name \
71+
--disable-timestamp \
7172
--target-python-version 3.12 \
7273
--output codex/protocol/types.py
7374
@python3 scripts/postprocess_protocol_types.py

codex/protocol/types.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# generated by datamodel-codegen:
22
# ruff: noqa: F821
33
# filename: protocol.schema.json
4-
# timestamp: 2025-09-14T17:06:06+00:00
54

65
from __future__ import annotations
76

@@ -440,8 +439,8 @@ class ResponseItem2(BaseModelWithExtras):
440439

441440
class ResponseItem3(BaseModelWithExtras):
442441
action: LocalShellAction
443-
call_id: str | None = Field(None, description="Set when using the Responses API.")
444-
id: str | None = Field(None, description="Set when using the chat completions API.")
442+
call_id: str | None = Field(..., description="Set when using the Responses API.")
443+
id: str | None = Field(..., description="Set when using the chat completions API.")
445444
status: LocalShellStatus
446445
type: Literal["local_shell_call"]
447446

@@ -963,16 +962,16 @@ class InputItemLocalImage(BaseModelWithExtras):
963962
type: Literal["localImage"]
964963

965964

966-
class Record3Cstring2Cnever3E(RootModel[dict[str, Any] | None]):
965+
class EmptyObject(RootModel[dict[str, Any] | None]):
967966
root: dict[str, Any] | None = None
968967

969968

970969
class AddConversationListenerParams(BaseModelWithExtras):
971970
conversationId: ConversationId
972971

973972

974-
class AgentReasoningSectionBreakEvent(RootModel[Record3Cstring2Cnever3E]):
975-
root: Record3Cstring2Cnever3E
973+
class AgentReasoningSectionBreakEvent(RootModel[EmptyObject]):
974+
root: EmptyObject
976975

977976

978977
class Annotations(BaseModelWithExtras):
@@ -1023,8 +1022,8 @@ class ArchiveConversationParams(BaseModelWithExtras):
10231022
rolloutPath: str
10241023

10251024

1026-
class ArchiveConversationResponse(RootModel[Record3Cstring2Cnever3E]):
1027-
root: Record3Cstring2Cnever3E
1025+
class ArchiveConversationResponse(RootModel[EmptyObject]):
1026+
root: EmptyObject
10281027

10291028

10301029
class AudioContent(BaseModelWithExtras):
@@ -1034,8 +1033,8 @@ class AudioContent(BaseModelWithExtras):
10341033
type: str
10351034

10361035

1037-
class CancelLoginChatGptResponse(RootModel[Record3Cstring2Cnever3E]):
1038-
root: Record3Cstring2Cnever3E
1036+
class CancelLoginChatGptResponse(RootModel[EmptyObject]):
1037+
root: EmptyObject
10391038

10401039

10411040
class EmbeddedResourceResource(RootModel[TextResourceContents | BlobResourceContents]):
@@ -1112,8 +1111,8 @@ class InterruptConversationResponse(BaseModelWithExtras):
11121111
abortReason: TurnAbortReason
11131112

11141113

1115-
class LogoutChatGptResponse(RootModel[Record3Cstring2Cnever3E]):
1116-
root: Record3Cstring2Cnever3E
1114+
class LogoutChatGptResponse(RootModel[EmptyObject]):
1115+
root: EmptyObject
11171116

11181117

11191118
class NewConversationParams(BaseModelWithExtras):
@@ -1169,8 +1168,8 @@ class Profile(BaseModelWithExtras):
11691168
modelVerbosity: Verbosity | None = None
11701169

11711170

1172-
class RemoveConversationSubscriptionResponse(RootModel[Record3Cstring2Cnever3E]):
1173-
root: Record3Cstring2Cnever3E
1171+
class RemoveConversationSubscriptionResponse(RootModel[EmptyObject]):
1172+
root: EmptyObject
11741173

11751174

11761175
class ResourceLink(BaseModelWithExtras):
@@ -1230,8 +1229,8 @@ class SendUserMessageParams(BaseModelWithExtras):
12301229
items: list[InputItem]
12311230

12321231

1233-
class SendUserMessageResponse(RootModel[Record3Cstring2Cnever3E]):
1234-
root: Record3Cstring2Cnever3E
1232+
class SendUserMessageResponse(RootModel[EmptyObject]):
1233+
root: EmptyObject
12351234

12361235

12371236
class SendUserTurnParams(BaseModelWithExtras):
@@ -1245,8 +1244,8 @@ class SendUserTurnParams(BaseModelWithExtras):
12451244
summary: ReasoningSummary
12461245

12471246

1248-
class SendUserTurnResponse(RootModel[Record3Cstring2Cnever3E]):
1249-
root: Record3Cstring2Cnever3E
1247+
class SendUserTurnResponse(RootModel[EmptyObject]):
1248+
root: EmptyObject
12501249

12511250

12521251
class ServerCapabilities(BaseModelWithExtras):

scripts/postprocess_protocol_types.py

Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -49,42 +49,14 @@ def main() -> int:
4949
lines.insert(insert_at, "# ruff: noqa: F821")
5050
s = "\n".join(lines) + ("\n" if not s.endswith("\n") else "")
5151

52-
# Convert optional fields that were marked required via Field(...)
53-
# Examples to fix:
54-
# foo: str | None = Field(..., description='x') -> Field(None, ...)
55-
# foo: Optional[int] = Field(...) -> Field(None)
56-
def _fix_optional_field_required(text: str) -> str:
57-
# With kwargs, union syntax
58-
text = re.sub(
59-
r"^(\s+[A-Za-z_][A-Za-z0-9_]*\s*:\s*[^\n=]*\|\s*None\s*=\s*)Field\(\s*\.\.\.(\s*,[^)]*)\)",
60-
r"\1Field(None\2)",
61-
text,
62-
flags=re.M,
63-
)
64-
# Without kwargs, union syntax
65-
text = re.sub(
66-
r"^(\s+[A-Za-z_][A-Za-z0-9_]*\s*:\s*[^\n=]*\|\s*None\s*=\s*)Field\(\s*\.\.\.\s*\)",
67-
r"\1Field(None)",
68-
text,
69-
flags=re.M,
70-
)
71-
# With kwargs, Optional[...] syntax
72-
text = re.sub(
73-
r"^(\s+[A-Za-z_][A-Za-z0-9_]*\s*:\s*Optional\[[^\]]+\]\s*=\s*)Field\(\s*\.\.\.(\s*,[^)]*)\)",
74-
r"\1Field(None\2)",
75-
text,
76-
flags=re.M,
77-
)
78-
# Without kwargs, Optional[...] syntax
79-
text = re.sub(
80-
r"^(\s+[A-Za-z_][A-Za-z0-9_]*\s*:\s*Optional\[[^\]]+\]\s*=\s*)Field\(\s*\.\.\.\s*\)",
81-
r"\1Field(None)",
82-
text,
83-
flags=re.M,
84-
)
85-
return text
86-
87-
s = _fix_optional_field_required(s)
52+
# Rename awkward auto-generated aliases to more readable names.
53+
# Example: datamodel-codegen renders TS Record<string, never> as "Record3Cstring2Cnever3E".
54+
rename_map = {
55+
"Record3Cstring2Cnever3E": "EmptyObject",
56+
}
57+
for old, new in rename_map.items():
58+
# Replace class declarations and all references (word boundary safe)
59+
s = re.sub(rf"\b{old}\b", new, s)
8860

8961
# Append model_rebuild() calls for union RootModel wrappers to resolve forward refs
9062
wrappers = [

0 commit comments

Comments
 (0)