diff options
| author | t <t@tjp.lol> | 2026-06-13 23:45:59 -0600 |
|---|---|---|
| committer | t <t@tjp.lol> | 2026-06-15 15:08:32 -0600 |
| commit | 02b4c7a35ac0b714bc045d54fb4bb45d1ce4e490 (patch) | |
| tree | 134196a82dd6fdd55b735be4c0cf38428c85038d /src/models_toml.zig | |
| parent | 71643a5d69ffc40882c9fcde3cc8a3bcf02d7396 (diff) | |
Add Codex Responses support and session debugging
Teach provider config and auth resolution about the Codex Responses
dialect, including user-facing `style = "openai_responses"` with
`dialect = "codex"`. Serialize and parse Responses traffic with
provider-specific reasoning replay, assistant phase metadata, and robust
function-call assembly keyed by `output_index` so streamed tool inputs
survive proxy quirks and empty terminal payloads.
Also persist thinking origins and message metadata across sessions, add
the Anthropic interleaved-thinking header switch, write per-session
debug logs, and improve the TUI and scripts for inspecting tool output
and session costs.
Diffstat (limited to 'src/models_toml.zig')
| -rw-r--r-- | src/models_toml.zig | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/src/models_toml.zig b/src/models_toml.zig index 955640d..622bdf6 100644 --- a/src/models_toml.zig +++ b/src/models_toml.zig @@ -21,7 +21,8 @@ //! //! # anthropic_messages-only knobs: //! api_version = <string> # Anthropic-Version header; default "2023-06-01" -//! thinking = <string> # disabled | enabled | adaptive (default: disabled) +//! thinking = <string> # disabled | enabled | adaptive (default: disabled, +//! # or adaptive when `effort` is present) //! effort = <string> # low | medium | high | xhigh | max (default: medium) //! # only used when thinking = "adaptive" //! thinking_budget_tokens = <int> # max reasoning tokens for thinking = "enabled" @@ -268,13 +269,15 @@ fn ingestModel( break :blk null; }; + const has_effort = v.get("effort") != null; + const thinking: Thinking = blk: { if (v.get("thinking")) |t| { if (t.asString()) |s| { break :blk std.meta.stringToEnum(Thinking, s) orelse .disabled; } } - break :blk .disabled; + break :blk if (has_effort) .adaptive else .disabled; }; const effort: Effort = blk: { @@ -527,6 +530,39 @@ test "parseInto: anthropic adaptive thinking with effort" { try testing.expectEqual(false, def.thinking_interleaved); // default } +test "parseInto: anthropic effort implies adaptive thinking" { + var models = emptyModels(testing.allocator); + defer models.deinit(); + + const src = + \\[anthropic.opus] + \\model = "claude-opus-4-8" + \\effort = "high" + ; + try parseInto(&models, src); + + const def = models.defs.get("anthropic", "opus").?; + try testing.expectEqual(Thinking.adaptive, def.thinking); + try testing.expectEqual(Effort.high, def.effort); +} + +test "parseInto: explicit thinking overrides effort-implied adaptive thinking" { + var models = emptyModels(testing.allocator); + defer models.deinit(); + + const src = + \\[anthropic.haiku] + \\model = "claude-haiku-4-5-20251001" + \\thinking = "disabled" + \\effort = "high" + ; + try parseInto(&models, src); + + const def = models.defs.get("anthropic", "haiku").?; + try testing.expectEqual(Thinking.disabled, def.thinking); + try testing.expectEqual(Effort.high, def.effort); +} + test "parseInto: anthropic thinking disabled" { var models = emptyModels(testing.allocator); defer models.deinit(); |
