mirror of
https://github.com/openai/codex.git
synced 2026-04-26 23:55:25 +00:00
###### Summary - Add input_modalities to model metadata so clients can determine supported input types. - Gate image paste/attach in TUI when the selected model does not support images. - Block submits that include images for unsupported models and show a clear warning. - Propagate modality metadata through app-server protocol/model-list responses. - Update related tests/fixtures. ###### Rationale - Models support different input modalities. - Clients need an explicit capability signal to prevent unsupported requests. - Backward-compatible defaults preserve existing behavior when modality metadata is absent. ###### Scope - codex-rs/protocol, codex-rs/core, codex-rs/tui - codex-rs/app-server-protocol, codex-rs/app-server - Generated app-server types / schema fixtures ###### Trade-offs - Default behavior assumes text + image when field is absent for compatibility. - Server-side validation remains the source of truth. ###### Follow-up - Non-TUI clients should consume input_modalities to disable unsupported attachments. - Model catalogs should explicitly set input_modalities for text-only models. ###### Testing - cargo fmt --all - cargo test -p codex-tui - env -u GITHUB_APP_KEY cargo test -p codex-core --lib - just write-app-server-schema - cargo run -p codex-cli --bin codex -- app-server generate-ts --out app-server-types - test against local backend <img width="695" height="199" alt="image" src="https://github.com/user-attachments/assets/d22dd04f-5eba-4db9-a7c5-a2506f60ec44" /> --------- Co-authored-by: Josh McKinney <joshka@openai.com>
123 lines
2.7 KiB
JSON
123 lines
2.7 KiB
JSON
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"definitions": {
|
|
"InputModality": {
|
|
"description": "Canonical user-input modality tags advertised by a model.",
|
|
"oneOf": [
|
|
{
|
|
"description": "Plain text turns and tool payloads.",
|
|
"enum": [
|
|
"text"
|
|
],
|
|
"type": "string"
|
|
},
|
|
{
|
|
"description": "Image attachments included in user turns.",
|
|
"enum": [
|
|
"image"
|
|
],
|
|
"type": "string"
|
|
}
|
|
]
|
|
},
|
|
"Model": {
|
|
"properties": {
|
|
"defaultReasoningEffort": {
|
|
"$ref": "#/definitions/ReasoningEffort"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"displayName": {
|
|
"type": "string"
|
|
},
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"inputModalities": {
|
|
"default": [
|
|
"text",
|
|
"image"
|
|
],
|
|
"items": {
|
|
"$ref": "#/definitions/InputModality"
|
|
},
|
|
"type": "array"
|
|
},
|
|
"isDefault": {
|
|
"type": "boolean"
|
|
},
|
|
"model": {
|
|
"type": "string"
|
|
},
|
|
"supportedReasoningEfforts": {
|
|
"items": {
|
|
"$ref": "#/definitions/ReasoningEffortOption"
|
|
},
|
|
"type": "array"
|
|
},
|
|
"supportsPersonality": {
|
|
"default": false,
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": [
|
|
"defaultReasoningEffort",
|
|
"description",
|
|
"displayName",
|
|
"id",
|
|
"isDefault",
|
|
"model",
|
|
"supportedReasoningEfforts"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"ReasoningEffort": {
|
|
"description": "See https://platform.openai.com/docs/guides/reasoning?api-mode=responses#get-started-with-reasoning",
|
|
"enum": [
|
|
"none",
|
|
"minimal",
|
|
"low",
|
|
"medium",
|
|
"high",
|
|
"xhigh"
|
|
],
|
|
"type": "string"
|
|
},
|
|
"ReasoningEffortOption": {
|
|
"properties": {
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"reasoningEffort": {
|
|
"$ref": "#/definitions/ReasoningEffort"
|
|
}
|
|
},
|
|
"required": [
|
|
"description",
|
|
"reasoningEffort"
|
|
],
|
|
"type": "object"
|
|
}
|
|
},
|
|
"properties": {
|
|
"data": {
|
|
"items": {
|
|
"$ref": "#/definitions/Model"
|
|
},
|
|
"type": "array"
|
|
},
|
|
"nextCursor": {
|
|
"description": "Opaque cursor to pass to the next call to continue after the last item. If None, there are no more items to return.",
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"data"
|
|
],
|
|
"title": "ModelListResponse",
|
|
"type": "object"
|
|
} |