Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion src/codex/catalog/provider-fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -923,7 +923,16 @@ export function catalogHintsFromModelsApiItem(providerName: string, item: Provid
item.max_context_length,
);
const maxInputTokens = positiveSafeInteger(limits?.max_input_tokens, item.max_input_tokens);
const rawReasoningEfforts = capabilityRecord?.reasoning_effort ?? item.reasoning_efforts;
// Some OpenAI-compatible catalogs expose the selectable ladder under
// `reasoning_parameters.efforts` instead of the older `reasoning_efforts` key.
// Treat both as model metadata: otherwise a valid upstream capability disappears
// before client exporters (including omp) can advertise it.
const reasoningParameters = plainRecord(item.reasoning_parameters)
?? plainRecord(metadata?.reasoning_parameters)
?? plainRecord(capabilityRecord?.reasoning_parameters);
const rawReasoningEfforts = capabilityRecord?.reasoning_effort
?? item.reasoning_efforts
?? reasoningParameters?.efforts;
const listedReasoningEfforts = normalizedStringList(rawReasoningEfforts, 8, 24);
const reasoningEfforts = listedReasoningEfforts
? sanitizeCodexReasoningEfforts(listedReasoningEfforts)
Expand Down
7 changes: 7 additions & 0 deletions tests/provider-model-discovery-contract.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,13 @@ describe("registry-owned provider model discovery", () => {
})).toEqual({});
});

test("preserves nested reasoning_parameters effort ladders from OpenAI-compatible catalogs", () => {
expect(catalogHintsFromModelsApiItem("example", {
id: "reasoning-model",
reasoning_parameters: { efforts: ["low", "high", "max"] },
})).toEqual({ reasoningEfforts: ["low", "high", "max"] });
});

test("drops untrusted metadata tokens containing control characters", () => {
expect(catalogHintsFromModelsApiItem("example", {
id: "controlled",
Expand Down
Loading