// Generates docs/provider-research/openai.models.json from GET /v1/models (models-list.json, captured 2026-09-08) // merged with the per-model documentation pages and the probe results. No API calls, no secrets. import fs from "node:fs"; type Cap = { text: boolean; vision: boolean | null; audioInput: boolean; audioOutput: boolean; imageGeneration: boolean; video: boolean; reasoning: boolean; tools: boolean; structuredOutput: boolean | null; streaming: boolean; files: boolean | null; webSearch: boolean | null }; type P = "supported" | "unsupported" | "conditional" | null; type Params = { temperature: P; topP: P; topK: P; maxTokens: P; reasoningEffort: P; thinkingBudget: P; stop: P; seed: P; frequencyPenalty: P; presencePenalty: P; verbosity: P }; type Fam = { family: string; displayName: string; context: number | null; maxOut: number | null; price: [number | null, number | null, number | null]; reasoning: boolean; efforts?: string[] | null; defaultEffort?: string | null; vision?: boolean | null; webSearch?: boolean | null; files?: boolean | null; structured?: boolean | null; apis: string[]; verbosity?: P; sampling?: P; penalties?: P; status?: "active" | "preview" | "deprecated"; notes: string; verified?: string; cutoff?: string | null }; const listed = JSON.parse(fs.readFileSync("models-list.json", "utf8")).models as { id: string }[]; const raw = fs.readFileSync("models-raw.txt", "utf8"); const shutdown: Record = {}; for (const m of raw.matchAll(/^(\S+) \{"shutdown_date":("([^"]+)"|null)\}$/gm)) shutdown[m[1]] = m[3] ?? null; // Family table (docs: developers.openai.com/api/docs/models/, fetched 2026-09-08; probes: research/openai/results/*.json) const F: Record = { "gpt-6-astra": { family: "gpt-6", displayName: "GPT-6 Astra", context: 1_050_000, maxOut: 128_000, price: [10, 1, 50], reasoning: true, efforts: ["low", "medium", "high", "xhigh", "max"], defaultEffort: "medium", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "unsupported", penalties: "unsupported", cutoff: "2026-04-30", notes: "Flagship. reasoning.effort 'none'/'minimal' rejected (400 unsupported_value). temperature/top_p/frequency_penalty/presence_penalty rejected ('Unsupported parameter ... is not supported with this model'); logprobs rejected. Cache write $12.50/M; >272K input tokens billed 2x input / 1.5x output. reasoning.context defaults to all_turns. prompt_cache_retention accepted but docs say use prompt_cache_options.ttl='30m'.", verified: "basic, stream, params, tools, structured, vision(detail high, effort low), chat completions" }, "gpt-5.6-sol": { family: "gpt-5.6", displayName: "GPT-5.6 Sol", context: 1_050_000, maxOut: 128_000, price: [4, 0.4, 20], reasoning: true, efforts: ["none", "low", "medium", "high", "xhigh", "max"], defaultEffort: "medium", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "conditional", penalties: "conditional", cutoff: "2026-02-16", notes: "Alias 'gpt-5.6' resolves here (verified: response.model = gpt-5.6-sol). temperature/top_p/penalties rejected unless reasoning.effort='none' (verified). Supports reasoning.mode 'standard'|'pro' (pro = replacement for *-pro models, not probed), reasoning.context all_turns (default), prompt_cache_options.ttl '30m', explicit cache breakpoints. Recommended replacement for gpt-5, o3, gpt-4o, o1, gpt-4-turbo.", verified: "basic, stream (reasoning_summary events seen), params, tools, structured, vision(effort none)" }, "gpt-5.6-terra": { family: "gpt-5.6", displayName: "GPT-5.6 Terra", context: 1_050_000, maxOut: 128_000, price: [2, 0.2, 12], reasoning: true, efforts: ["none", "low", "medium", "high", "xhigh", "max"], defaultEffort: "medium", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "conditional", penalties: "conditional", cutoff: "2026-02-16", notes: "Max input 922,000 tokens. Recommended replacement for gpt-5-mini, o4-mini, gpt-3.5-turbo. Param matrix assumed identical to gpt-5.6-sol (not individually probed).", verified: "basic" }, "gpt-5.6-luna": { family: "gpt-5.6", displayName: "GPT-5.6 Luna", context: 1_050_000, maxOut: 128_000, price: [0.2, 0.02, 1.2], reasoning: true, efforts: ["none", "low", "medium", "high", "xhigh", "max"], defaultEffort: "medium", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "conditional", penalties: "conditional", cutoff: "2026-02-16", notes: "Cheapest 5.6. Recommended replacement for gpt-5-nano and gpt-4.1-nano. Param matrix assumed identical to gpt-5.6-sol (not individually probed).", verified: "basic" }, "gpt-5.5": { family: "gpt-5.5", displayName: "GPT-5.5", context: 1_050_000, maxOut: 128_000, price: [5, 0.5, 30], reasoning: true, efforts: ["none", "low", "medium", "high", "xhigh"], defaultEffort: "medium", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "conditional", penalties: "conditional", cutoff: "2025-12-01", notes: "Snapshot gpt-5.5-2026-04-23. 'minimal' and 'max' efforts rejected (400 unsupported_value). temperature/top_p/penalties rejected unless reasoning.effort='none' (verified both ways). >272K input tokens billed 2x/1.5x. Default top_p echoed as 0.98. Chat Completions: temperature other than 1 rejected ('Only the default (1) value is supported').", verified: "basic, stream, params, tools(+round trip), structured, vision(effort none), web_search (url_citation annotations), encrypted reasoning round trip, chat completions" }, "gpt-5.5-pro": { family: "gpt-5.5", displayName: "GPT-5.5 Pro", context: 1_050_000, maxOut: 128_000, price: [30, null, 180], reasoning: true, efforts: ["medium", "high", "xhigh"], defaultEffort: "high", apis: ["responses", "batch"], verbosity: "supported", sampling: "unsupported", penalties: "unsupported", cutoff: "2025-12-01", notes: "Responses API only (no Chat Completions). No cached-input price. Slow: docs recommend background:true. One tiny probe answered in 7.3 s. Docs: streaming listed but not verified.", verified: "basic" }, "gpt-5.4": { family: "gpt-5.4", displayName: "GPT-5.4", context: 1_050_000, maxOut: 128_000, price: [2.5, 0.25, 15], reasoning: true, efforts: ["none", "low", "medium", "high", "xhigh"], defaultEffort: "none", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "conditional", penalties: "conditional", cutoff: "2025-08-31", notes: "Snapshot gpt-5.4-2026-03-05. Default effort 'none' (verified echo) so sampling params work by default; assumed rejected once effort >= low (pattern verified on gpt-5.5/5.6).", verified: "basic" }, "gpt-5.4-mini": { family: "gpt-5.4", displayName: "GPT-5.4 mini", context: 400_000, maxOut: 128_000, price: [0.75, 0.075, 4.5], reasoning: true, efforts: ["none", "low", "medium", "high", "xhigh"], defaultEffort: "none", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "conditional", penalties: "conditional", cutoff: "2025-08-31", notes: "Snapshot gpt-5.4-mini-2026-03-17. Default effort 'none': temperature, top_p, frequency_penalty, presence_penalty, logprobs all ACCEPTED at default (verified). 'minimal'/'max' rejected. PDF input (input_file file_data) verified. previous_response_id verified. service_tier 'flex' accepted.", verified: "basic, stream, params, tools(+previous_response_id), structured, vision, web_search, pdf, flex" }, "gpt-5.4-nano": { family: "gpt-5.4", displayName: "GPT-5.4 nano", context: 400_000, maxOut: 128_000, price: [0.2, 0.02, 1.25], reasoning: true, efforts: ["none", "low", "medium", "high", "xhigh"], defaultEffort: "none", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "conditional", penalties: "conditional", cutoff: "2025-08-31", notes: "Snapshot gpt-5.4-nano-2026-03-17. Model page lists web_search among tools but computer use/tool_search absent.", verified: "basic" }, "gpt-5.4-pro": { family: "gpt-5.4", displayName: "GPT-5.4 Pro", context: 1_050_000, maxOut: 128_000, price: [30, null, 180], reasoning: true, efforts: ["medium", "high", "xhigh"], defaultEffort: "medium", apis: ["responses"], verbosity: "supported", sampling: "unsupported", penalties: "unsupported", cutoff: "2025-08-31", notes: "Responses API only. Not probed (cost). Docs: no structured outputs listed for pro variants of 5.4? (page lists function calling, web search, MCP; structured outputs not listed) -> structuredOutput null.", structured: null, verified: "none" }, "gpt-5.3-chat-latest": { family: "gpt-5.3", displayName: "GPT-5.3 Chat (ChatGPT Instant)", context: 128_000, maxOut: 16_384, price: [1.75, 0.175, 14], reasoning: false, apis: ["responses", "chat"], verbosity: null, sampling: null, penalties: null, status: "deprecated", cutoff: "2025-08-31", notes: "Listed by GET /v1/models with shutdown_date 2026-08-10 but requests return 404 model_not_found (verified). Docs: 'This model has been deprecated. We recommend GPT-6 Astra'. Use chat-latest instead.", verified: "basic -> 404" }, "gpt-5.3-codex": { family: "gpt-5.3", displayName: "GPT-5.3 Codex", context: 400_000, maxOut: 128_000, price: [1.75, 0.175, 14], reasoning: true, efforts: ["low", "medium", "high", "xhigh"], defaultEffort: "none", apis: ["responses"], verbosity: "supported", sampling: null, penalties: null, cutoff: "2025-08-31", notes: "Agentic-coding model, Responses API only. Probe echoed reasoning.effort 'none' as default although docs list low..xhigh. Not a general chat model.", verified: "basic" }, "gpt-5.2": { family: "gpt-5.2", displayName: "GPT-5.2", context: 400_000, maxOut: 128_000, price: [1.75, 0.175, 14], reasoning: true, efforts: ["none", "low", "medium", "high", "xhigh"], defaultEffort: "none", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "conditional", penalties: "conditional", cutoff: "2025-08-31", notes: "Snapshot gpt-5.2-2025-12-11. Docs recommend GPT-6 Astra instead.", verified: "basic" }, "gpt-5.2-pro": { family: "gpt-5.2", displayName: "GPT-5.2 Pro", context: 400_000, maxOut: 128_000, price: [21, null, 168], reasoning: true, efforts: ["medium", "high", "xhigh"], defaultEffort: "medium", apis: ["responses"], verbosity: "supported", sampling: "unsupported", penalties: "unsupported", cutoff: "2025-08-31", structured: null, notes: "Responses API only; docs recommend GPT-5.5 Pro. Not probed.", verified: "none" }, "gpt-5.2-chat-latest": { family: "gpt-5.2", displayName: "GPT-5.2 Chat", context: 128_000, maxOut: 16_384, price: [1.75, 0.175, 14], reasoning: false, apis: ["responses", "chat"], status: "deprecated", cutoff: "2025-08-31", notes: "shutdown_date 2026-08-10; requests return 404 model_not_found (verified).", verified: "basic -> 404" }, "gpt-5.2-codex": { family: "gpt-5.2", displayName: "GPT-5.2 Codex", context: 400_000, maxOut: 128_000, price: [null, null, null], reasoning: true, apis: ["responses"], status: "deprecated", notes: "shutdown_date 2026-07-23 (passed). Not probed; siblings gpt-5-codex/gpt-5.1-codex return 404. Pricing unknown (page not fetched).", verified: "none" }, "gpt-5.1": { family: "gpt-5.1", displayName: "GPT-5.1", context: 400_000, maxOut: 128_000, price: [1.25, 0.125, 10], reasoning: true, efforts: ["none", "low", "medium", "high"], defaultEffort: "none", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "conditional", penalties: "conditional", cutoff: "2024-09-30", notes: "Snapshot gpt-5.1-2025-11-13. No xhigh.", verified: "basic" }, "gpt-5.1-chat-latest": { family: "gpt-5.1", displayName: "GPT-5.1 Chat", context: 128_000, maxOut: 16_384, price: [1.25, 0.125, 10], reasoning: false, apis: ["responses", "chat"], status: "deprecated", notes: "shutdown_date 2026-07-23; requests return 404 model_not_found (verified).", verified: "basic -> 404" }, "gpt-5.1-codex": { family: "gpt-5.1", displayName: "GPT-5.1 Codex", context: 400_000, maxOut: 128_000, price: [null, null, null], reasoning: true, apis: ["responses"], status: "deprecated", notes: "shutdown_date 2026-07-23; 404 model_not_found (verified). Pricing unknown.", verified: "basic -> 404" }, "gpt-5.1-codex-max": { family: "gpt-5.1", displayName: "GPT-5.1 Codex Max", context: null, maxOut: null, price: [null, null, null], reasoning: true, apis: ["responses"], status: "deprecated", notes: "shutdown_date 2026-07-23 (passed). Not probed; context/pricing unknown.", verified: "none" }, "gpt-5.1-codex-mini": { family: "gpt-5.1", displayName: "GPT-5.1 Codex Mini", context: null, maxOut: null, price: [null, null, null], reasoning: true, apis: ["responses"], status: "deprecated", notes: "shutdown_date 2026-07-23 (passed). Not probed; context/pricing unknown.", verified: "none" }, "gpt-5": { family: "gpt-5", displayName: "GPT-5", context: 400_000, maxOut: 128_000, price: [1.25, 0.125, 10], reasoning: true, efforts: ["minimal", "low", "medium", "high"], defaultEffort: "medium", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "unsupported", penalties: "unsupported", cutoff: "2024-09-30", notes: "Alias still active but snapshot gpt-5-2025-08-07 has shutdown_date 2026-12-11 -> replacement gpt-5.6-sol. Uses 'minimal' (not 'none'); temperature not supported at any effort (docs). Reasoning items appear in output by default.", verified: "basic" }, "gpt-5-mini": { family: "gpt-5", displayName: "GPT-5 mini", context: 400_000, maxOut: 128_000, price: [0.25, 0.025, 2], reasoning: true, efforts: ["minimal", "low", "medium", "high"], defaultEffort: "medium", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "unsupported", penalties: "unsupported", cutoff: "2024-05-31", notes: "Snapshot gpt-5-mini-2025-08-07 shuts down 2026-12-11 -> gpt-5.6-terra.", verified: "basic" }, "gpt-5-nano": { family: "gpt-5", displayName: "GPT-5 nano", context: 400_000, maxOut: 128_000, price: [0.05, 0.005, 0.4], reasoning: true, efforts: ["minimal", "low", "medium", "high"], defaultEffort: "medium", apis: ["responses", "chat", "batch"], verbosity: "supported", sampling: "unsupported", penalties: "unsupported", cutoff: "2024-05-31", notes: "Snapshot gpt-5-nano-2025-08-07 shuts down 2026-12-11 -> gpt-5.6-luna. Probe at default effort burned all 200 output tokens on reasoning (status incomplete) -> set effort minimal/low for short answers.", verified: "basic (incomplete at 200 tokens)" }, "gpt-5-pro": { family: "gpt-5", displayName: "GPT-5 Pro", context: 400_000, maxOut: 272_000, price: [15, null, 120], reasoning: true, efforts: ["high"], defaultEffort: "high", apis: ["responses", "batch"], verbosity: null, sampling: "unsupported", penalties: "unsupported", cutoff: "2024-09-30", notes: "Only reasoning.effort high. Snapshot gpt-5-pro-2025-10-06 shuts down 2026-12-11 -> gpt-5.6-sol with reasoning.mode pro. Not probed.", verified: "none" }, "gpt-5-chat-latest": { family: "gpt-5", displayName: "GPT-5 Chat", context: 128_000, maxOut: 16_384, price: [1.25, 0.125, 10], reasoning: false, apis: ["responses", "chat"], status: "deprecated", notes: "shutdown_date 2026-07-23; 404 model_not_found (verified).", verified: "basic -> 404" }, "gpt-5-codex": { family: "gpt-5", displayName: "GPT-5 Codex", context: 400_000, maxOut: 128_000, price: [null, null, null], reasoning: true, apis: ["responses"], status: "deprecated", notes: "shutdown_date 2026-07-23; 404 model_not_found (verified).", verified: "basic -> 404" }, "gpt-5-search-api": { family: "gpt-5", displayName: "GPT-5 Search API (Chat Completions web search)", context: null, maxOut: null, price: [null, null, null], reasoning: false, apis: ["chat"], webSearch: true, status: "preview", notes: "Chat Completions ONLY: Responses returns 400 model_not_found 'not supported with the Responses API' (verified); chat.completions works (verified, resolves gpt-5-search-api-2025-10-14). Model page 404 -> context/pricing unknown. Prefer web_search tool on a normal model.", verified: "chat only" }, "chat-latest": { family: "chat-latest", displayName: "ChatGPT Instant (chat-latest)", context: 400_000, maxOut: 128_000, price: [5, 0.5, 30], reasoning: false, apis: ["responses", "chat"], verbosity: "supported", sampling: null, penalties: null, cutoff: "2025-08-31", notes: "Latest ChatGPT Instant model; non-reasoning (probe echoed reasoning.effort medium but 0 reasoning tokens). Max input 272,000. No Batch. Docs recommend GPT-6 Astra for production. Sampling params not probed.", verified: "basic" }, "gpt-4.1": { family: "gpt-4.1", displayName: "GPT-4.1", context: 1_047_576, maxOut: 32_768, price: [2, 0.5, 8], reasoning: false, apis: ["responses", "chat", "batch", "assistants", "fine-tuning"], verbosity: "unsupported", sampling: "supported", penalties: "supported", cutoff: "2024-06-01", notes: "Snapshot gpt-4.1-2025-04-14. Non-reasoning; classic sampling params; text.verbosity only 'medium'. Web search supported.", verified: "basic" }, "gpt-4.1-mini": { family: "gpt-4.1", displayName: "GPT-4.1 mini", context: 1_047_576, maxOut: 32_768, price: [0.4, 0.1, 1.6], reasoning: false, apis: ["responses", "chat", "batch", "assistants", "fine-tuning"], verbosity: "unsupported", sampling: "supported", penalties: "supported", cutoff: "2024-06-01", notes: "temperature/top_p/frequency_penalty/presence_penalty/logprobs accepted; reasoning.effort rejected ('Unsupported parameter'); text.verbosity 'low' rejected ('Supported values are: medium'); seed/stop unknown_parameter in Responses (available in Chat Completions). web_search verified with url_citation annotations.", verified: "basic, stream, params, tools, structured, vision, web_search, chat completions" }, "gpt-4.1-nano": { family: "gpt-4.1", displayName: "GPT-4.1 nano", context: 1_047_576, maxOut: 32_768, price: [0.1, 0.025, 0.4], reasoning: false, apis: ["responses", "chat", "batch", "assistants", "fine-tuning"], verbosity: "unsupported", sampling: "supported", penalties: "supported", webSearch: false, cutoff: "2024-06-01", status: "deprecated", notes: "shutdown_date 2026-10-23 (still answers, verified) -> replacement gpt-5.6-luna. No web_search tool.", verified: "basic" }, "gpt-4o": { family: "gpt-4o", displayName: "GPT-4o", context: 128_000, maxOut: 16_384, price: [2.5, 1.25, 10], reasoning: false, apis: ["responses", "chat", "batch", "assistants", "fine-tuning"], verbosity: "unsupported", sampling: "supported", penalties: "supported", cutoff: "2023-10-01", notes: "Alias resolves to gpt-4o-2024-08-06 (verified). Snapshot 2024-05-13 shuts down 2026-10-23 -> gpt-5.6-sol. Cached input is only 50% (older cache pricing).", verified: "basic" }, "gpt-4o-mini": { family: "gpt-4o", displayName: "GPT-4o mini", context: 128_000, maxOut: 16_384, price: [0.15, 0.075, 0.6], reasoning: false, apis: ["responses", "chat", "batch", "assistants", "fine-tuning"], verbosity: "unsupported", sampling: "supported", penalties: "supported", cutoff: "2023-10-01", notes: "Snapshot gpt-4o-mini-2024-07-18.", verified: "basic" }, "gpt-4o-search-preview": { family: "gpt-4o", displayName: "GPT-4o Search Preview", context: 128_000, maxOut: 16_384, price: [2.5, null, 10], reasoning: false, apis: ["chat"], webSearch: true, status: "preview", notes: "Chat Completions only (Responses -> 400 'not supported with the Responses API', verified). Snapshot 2025-03-11 has shutdown_date 2026-07-23. Legacy; use web_search tool instead.", verified: "responses -> 400" }, "gpt-4o-mini-search-preview": { family: "gpt-4o", displayName: "GPT-4o mini Search Preview", context: 128_000, maxOut: 16_384, price: [null, null, null], reasoning: false, apis: ["chat"], webSearch: true, status: "preview", notes: "Chat Completions only (by analogy with gpt-4o-search-preview; not probed). Snapshot shutdown_date 2026-07-23. Pricing page not fetched -> null.", verified: "none" }, "gpt-4-turbo": { family: "gpt-4", displayName: "GPT-4 Turbo", context: 128_000, maxOut: 4_096, price: [10, null, 30], reasoning: false, apis: ["responses", "chat", "batch", "assistants"], verbosity: "unsupported", sampling: "supported", penalties: "supported", webSearch: false, files: null, cutoff: "2023-12-01", status: "deprecated", notes: "shutdown_date 2026-10-23 -> gpt-5.6-sol. Still answers (verified). No prompt caching.", verified: "basic" }, "gpt-4": { family: "gpt-4", displayName: "GPT-4", context: 8_192, maxOut: 8_192, price: [30, null, 60], reasoning: false, apis: ["responses", "chat", "batch", "assistants", "fine-tuning"], verbosity: "unsupported", sampling: "supported", penalties: "supported", vision: false, webSearch: false, files: false, structured: false, cutoff: "2023-12-01", status: "deprecated", notes: "shutdown_date 2026-10-23 -> gpt-5.6-sol. Text only, no structured outputs (JSON mode only). Not probed.", verified: "none" }, "gpt-3.5-turbo": { family: "gpt-3.5", displayName: "GPT-3.5 Turbo", context: 16_385, maxOut: 4_096, price: [0.5, null, 1.5], reasoning: false, apis: ["responses", "chat", "batch", "fine-tuning"], verbosity: "unsupported", sampling: "supported", penalties: "supported", vision: false, webSearch: false, files: false, structured: false, status: "deprecated", notes: "Alias -> gpt-3.5-turbo-0125 (verified). shutdown_date 2026-10-23 (-1106 and -instruct: 2026-09-28) -> gpt-5.6-terra. Text only, JSON mode only.", verified: "basic" }, "o1": { family: "o-series", displayName: "o1", context: 200_000, maxOut: 100_000, price: [15, 7.5, 60], reasoning: true, efforts: ["low", "medium", "high"], defaultEffort: "medium", apis: ["responses", "chat", "batch", "assistants"], verbosity: "unsupported", sampling: "unsupported", penalties: "unsupported", webSearch: false, cutoff: "2023-10-01", status: "deprecated", notes: "shutdown_date 2026-10-23 -> gpt-5.6-sol. Still answers (verified; 32-token probe came back incomplete because of reasoning).", verified: "basic (incomplete)" }, "o1-pro": { family: "o-series", displayName: "o1-pro", context: 200_000, maxOut: 100_000, price: [150, null, 600], reasoning: true, efforts: null, defaultEffort: null, apis: ["responses", "batch"], verbosity: "unsupported", sampling: "unsupported", penalties: "unsupported", webSearch: false, status: "deprecated", notes: "shutdown_date 2026-10-23 -> gpt-5.6-sol with reasoning.mode pro. Responses only. Not probed (cost).", verified: "none" }, "o3": { family: "o-series", displayName: "o3", context: 200_000, maxOut: 100_000, price: [2, 0.5, 8], reasoning: true, efforts: ["low", "medium", "high"], defaultEffort: "medium", apis: ["responses", "chat", "batch"], verbosity: "unsupported", sampling: "unsupported", penalties: "unsupported", cutoff: "2024-06-01", notes: "Alias active; snapshot o3-2025-04-16 shuts down 2026-12-11 -> gpt-5.6-sol. Docs: 'o3 is succeeded by GPT-5'.", verified: "basic" }, "o3-pro": { family: "o-series", displayName: "o3-pro", context: 200_000, maxOut: 100_000, price: [20, null, 80], reasoning: true, efforts: null, defaultEffort: null, apis: ["responses", "batch"], verbosity: "unsupported", sampling: "unsupported", penalties: "unsupported", notes: "Responses only, background mode recommended; streaming not indicated in docs. Snapshot o3-pro-2025-06-10 shuts down 2026-12-11. Not probed.", verified: "none" }, "o3-mini": { family: "o-series", displayName: "o3-mini", context: 200_000, maxOut: 100_000, price: [1.1, 0.55, 4.4], reasoning: true, efforts: ["low", "medium", "high"], defaultEffort: "medium", apis: ["responses", "chat", "batch", "assistants"], verbosity: "unsupported", sampling: "unsupported", penalties: "unsupported", vision: false, webSearch: false, cutoff: "2023-10-01", status: "deprecated", notes: "TEXT ONLY (no image input). shutdown_date 2026-10-23 -> gpt-5.6-sol. Still answers (verified).", verified: "basic" }, "o4-mini": { family: "o-series", displayName: "o4-mini", context: 200_000, maxOut: 100_000, price: [1.1, 0.275, 4.4], reasoning: true, efforts: ["low", "medium", "high"], defaultEffort: "medium", apis: ["responses", "chat", "batch", "fine-tuning"], verbosity: "unsupported", sampling: "unsupported", penalties: "unsupported", cutoff: "2024-06-01", status: "deprecated", notes: "shutdown_date 2026-10-23 -> gpt-5.6-terra. Verified: effort none/minimal/xhigh/max rejected ('Supported values are: low, medium, and high'); temperature/top_p/penalties/logprobs rejected; text.verbosity only 'medium'. Heavy reasoner: at max_output_tokens 200 the tool-call, structured and vision probes all came back incomplete (all tokens spent on reasoning) -> give it >= 1-2k output tokens. Reasoning summaries stream (response.reasoning_summary_*).", verified: "basic, stream, params, structured/vision/tools (incomplete at 200 tokens), chat completions" }, "o3-deep-research": { family: "o-series", displayName: "o3 Deep Research", context: 200_000, maxOut: 100_000, price: [null, null, null], reasoning: true, apis: ["responses"], webSearch: true, status: "deprecated", notes: "shutdown_date 2026-07-23; 404 model_not_found (verified). Agentic research model, not a chat model.", verified: "basic -> 404" }, "o4-mini-deep-research": { family: "o-series", displayName: "o4-mini Deep Research", context: 200_000, maxOut: 100_000, price: [null, null, null], reasoning: true, apis: ["responses"], webSearch: true, status: "deprecated", notes: "shutdown_date 2026-07-23 (passed). Not probed; sibling o3-deep-research returns 404.", verified: "none" }, }; // snapshot id -> family key const SNAP: Record = { "gpt-5.5-2026-04-23": "gpt-5.5", "gpt-5.5-pro-2026-04-23": "gpt-5.5-pro", "gpt-5.4-2026-03-05": "gpt-5.4", "gpt-5.4-mini-2026-03-17": "gpt-5.4-mini", "gpt-5.4-nano-2026-03-17": "gpt-5.4-nano", "gpt-5.4-pro-2026-03-05": "gpt-5.4-pro", "gpt-5.2-2025-12-11": "gpt-5.2", "gpt-5.2-pro-2025-12-11": "gpt-5.2-pro", "gpt-5.1-2025-11-13": "gpt-5.1", "gpt-5-2025-08-07": "gpt-5", "gpt-5-mini-2025-08-07": "gpt-5-mini", "gpt-5-nano-2025-08-07": "gpt-5-nano", "gpt-5-pro-2025-10-06": "gpt-5-pro", "gpt-5-search-api-2025-10-14": "gpt-5-search-api", "gpt-4.1-2025-04-14": "gpt-4.1", "gpt-4.1-mini-2025-04-14": "gpt-4.1-mini", "gpt-4.1-nano-2025-04-14": "gpt-4.1-nano", "gpt-4o-2024-05-13": "gpt-4o", "gpt-4o-2024-08-06": "gpt-4o", "gpt-4o-2024-11-20": "gpt-4o", "gpt-4o-mini-2024-07-18": "gpt-4o-mini", "gpt-4o-search-preview-2025-03-11": "gpt-4o-search-preview", "gpt-4o-mini-search-preview-2025-03-11": "gpt-4o-mini-search-preview", "gpt-4-0613": "gpt-4", "gpt-4-turbo-2024-04-09": "gpt-4-turbo", "gpt-3.5-turbo-0125": "gpt-3.5-turbo", "gpt-3.5-turbo-1106": "gpt-3.5-turbo", "gpt-3.5-turbo-16k": "gpt-3.5-turbo", "o1-2024-12-17": "o1", "o1-pro-2025-03-19": "o1-pro", "o3-2025-04-16": "o3", "o3-pro-2025-06-10": "o3-pro", "o3-mini-2025-01-31": "o3-mini", "o4-mini-2025-04-16": "o4-mini", "o3-deep-research-2025-06-26": "o3-deep-research", "o4-mini-deep-research-2025-06-26": "o4-mini-deep-research", }; const NON_CHAT = /^(babbage|davinci|chatgpt-image|gpt-3\.5-turbo-instruct|gpt-4o-mini-transcribe|gpt-4o-transcribe|gpt-4o-mini-tts|gpt-audio|gpt-image|gpt-live-transcribe|gpt-realtime|gpt-transcribe|omni-moderation|sora|text-embedding|tts-|whisper)/; const DEFAULT_ALIASES: Record = { "gpt-4o": "gpt-4o-2024-08-06", "gpt-3.5-turbo": "gpt-3.5-turbo-0125" }; const out: any[] = []; for (const { id } of listed) { if (NON_CHAT.test(id)) continue; const famKey = F[id] ? id : SNAP[id]; if (!famKey) { console.error("UNMAPPED chat-like model:", id); continue; } const f = F[famKey]; const isSnapshot = famKey !== id; const sd = shutdown[id] ?? null; const dead = ["gpt-5.3-chat-latest", "gpt-5.2-chat-latest", "gpt-5.1-chat-latest", "gpt-5-chat-latest", "gpt-5-codex", "gpt-5.1-codex", "o3-deep-research", "gpt-5.2-codex", "gpt-5.1-codex-max", "gpt-5.1-codex-mini", "o4-mini-deep-research", "o3-deep-research-2025-06-26", "o4-mini-deep-research-2025-06-26"].includes(id) || (sd !== null && sd < "2026-09-08"); const status: "active" | "preview" | "deprecated" = dead || sd ? "deprecated" : (f.status ?? "active"); const vision = f.vision ?? true; const caps: Cap = { text: true, vision, audioInput: false, audioOutput: false, imageGeneration: f.apis.includes("responses") && !["gpt-4", "gpt-3.5", "o-series"].includes(f.family) ? true : false, video: false, reasoning: f.reasoning, tools: true, structuredOutput: f.structured === undefined ? true : f.structured, streaming: true, files: f.files === undefined ? vision : f.files, webSearch: f.webSearch === undefined ? f.apis.includes("responses") : f.webSearch }; if (["o3", "o4-mini", "gpt-5.5-pro", "gpt-5.4-pro", "gpt-5.2-pro", "gpt-5-pro", "o3-pro"].includes(famKey)) caps.imageGeneration = true; // model pages list image_generation tool if (["o1", "o1-pro", "o3-mini"].includes(famKey)) caps.imageGeneration = false; const sampling = f.sampling === undefined ? (f.reasoning ? "unsupported" : "supported") : f.sampling; const penalties = f.penalties === undefined ? sampling : f.penalties; const params: Params = { temperature: sampling, topP: sampling, topK: "unsupported", maxTokens: "supported", reasoningEffort: f.reasoning ? "supported" : "unsupported", thinkingBudget: "unsupported", stop: f.apis.includes("chat") && !f.reasoning ? "conditional" : "unsupported", seed: f.apis.includes("chat") && !f.reasoning ? "conditional" : "unsupported", frequencyPenalty: penalties, presencePenalty: penalties, verbosity: f.verbosity === undefined ? (f.reasoning ? "supported" : "unsupported") : f.verbosity }; const notes = [ isSnapshot ? `Dated snapshot of ${famKey}.` : (DEFAULT_ALIASES[id] ? `Alias; currently resolves to ${DEFAULT_ALIASES[id]}.` : ""), sd ? `shutdown_date (from GET /v1/models): ${sd}${sd < "2026-09-08" ? " (already passed)" : ""}.` : "", dead ? "Listed by /v1/models but no longer serves requests (404 model_not_found) or past shutdown." : "", f.notes, `Verified by probe: ${f.verified ?? "none"}.`, "Param legend: supported | unsupported | conditional (sampling params only accepted when reasoning.effort='none'; stop/seed only via Chat Completions) | null = unknown.", caps.files === true ? "files = PDF via input_file (docs: any vision model); verified only on gpt-5.4-mini." : "", "audioInput/audioOutput false: Responses API rejects input_audio ('Audio input is not available', verified); audio requires gpt-audio-*/gpt-realtime-* via Chat Completions/Realtime. imageGeneration = via the built-in image_generation tool (gpt-image-2), not native output. video false everywhere (Sora/Videos API deprecated, shutdown 2026-09-24).", ].filter(Boolean).join(" "); out.push({ id, displayName: isSnapshot ? `${f.displayName} (${id.slice(famKey.length + 1) || id})` : f.displayName, family: f.family, contextTokens: f.context, maxOutputTokens: f.maxOut, capabilities: caps, parameters: params, pricing: { inputPerMillion: f.price[0], cachedInputPerMillion: f.price[1], outputPerMillion: f.price[2] }, status, notes, reasoningEfforts: f.reasoning ? (f.efforts ?? null) : null, defaultReasoningEffort: f.reasoning ? (f.defaultEffort ?? null) : null, apis: f.apis, knowledgeCutoff: f.cutoff ?? null, shutdownDate: sd, snapshotOf: isSnapshot ? famKey : null }); } // alias not returned by /v1/models but verified to work out.push({ id: "gpt-5.6", displayName: "GPT-5.6 (alias -> gpt-5.6-sol)", family: "gpt-5.6", contextTokens: 1_050_000, maxOutputTokens: 128_000, capabilities: out.find(m => m.id === "gpt-5.6-sol").capabilities, parameters: out.find(m => m.id === "gpt-5.6-sol").parameters, pricing: out.find(m => m.id === "gpt-5.6-sol").pricing, status: "active", notes: "NOT returned by GET /v1/models for this key, but documented and verified: a request for 'gpt-5.6' returns response.model = 'gpt-5.6-sol'. Included so the registry can resolve it.", reasoningEfforts: ["none", "low", "medium", "high", "xhigh", "max"], defaultReasoningEffort: "medium", apis: ["responses", "chat", "batch"], knowledgeCutoff: "2026-02-16", shutdownDate: null, snapshotOf: "gpt-5.6-sol" }); fs.mkdirSync("../../docs/provider-research", { recursive: true }); fs.writeFileSync("../../docs/provider-research/openai.models.json", JSON.stringify(out, null, 2) + "\n"); console.log(`wrote ${out.length} models; status counts:`, out.reduce((a, m) => (a[m.status] = (a[m.status] ?? 0) + 1, a), {} as any)); console.log("active:", out.filter(m => m.status === "active").map(m => m.id).join(" "));