Split canonical ReasoningEffort::Max out of Xhigh (providers P0c-1)
OpenAI (Responses) and Anthropic (Messages) treat xhigh and max as
DISTINCT effort levels in 2026, and the Kimi K3 wire's top tier is max —
the old parse alias (max→Xhigh) conflated them. Canonical Max now exists:
parse/as_str/serde split, Messages mapping sends xhigh and max as their
own tokens (was Xhigh→"max"), and the K3 menu token max carries
canonical Max end to end.
Kimi wire is byte-identical in all four flows (menu pick, restored
legacy xhigh session, --reasoning-effort flag, /effort command) —
adversarially traced and pinned: kimi_compat's string-level xhigh→max
rename covers legacy tokens, max passes through verbatim.
From the review:
- Rollback safety: persisted reasoning_effort (session summaries, chat
history) deserializes leniently — unknown future tokens degrade to
None with a warning instead of hiding sessions or failing resume.
- Restore migration: a pre-split xhigh override onto a model whose menu
offers max but not xhigh (K3) migrates once, healing display/active-row
drift and re-persisting the live vocabulary.
- /effort max now rejects (with the offered list) on models whose menu
lacks a max row instead of silently applying xhigh; deliberate, tested.
- The interim Responses-backend Max→xhigh downgrade (async-openai has no
Max variant through 0.41) warns loudly; real max wiring lands with the
OpenAI provider cycle via post-serialize body patch.
- Two rusted ignored-e2e wire pins asserted the pre-adapt reasoning_effort
key (deleted by the body adapter since ea0ce9d); they now pin the real
thinking.effort=max shape.
This commit is contained in:
1 parent
c5ddaec71e
commit
83e6935189
13 files changed
+276
-37
No files matched your search
@@ -5,7 +5,10 @@ use kigi_shell::sampling::types::{ReasoningEffort, ReasoningEffortOption};
|
||||
use crate::slash::command::ArgItem;
|
||||
|
||||
/// Effort levels in the built-in fallback menu (strongest first). `none`/`minimal`
|
||||
/// are still accepted by `ReasoningEffort::from_str` for power users.
|
||||
/// are still accepted by `ReasoningEffort::from_str` for power users. `max` is
|
||||
/// deliberately absent: it exists only where a model's server menu offers it
|
||||
/// (e.g. Kimi K3) — the legacy fallback reproduces the historical rows, and
|
||||
/// offering `max` on models that reject it would 400.
|
||||
pub(crate) const EFFORT_LEVELS: &[ReasoningEffort] = &[
|
||||
ReasoningEffort::Xhigh,
|
||||
ReasoningEffort::High,
|
||||
@@ -20,7 +23,8 @@ pub(crate) fn effort_description(level: ReasoningEffort) -> &'static str {
|
||||
ReasoningEffort::Low => "Faster, lighter reasoning",
|
||||
ReasoningEffort::Medium => "Balanced reasoning",
|
||||
ReasoningEffort::High => "Heavy reasoning",
|
||||
ReasoningEffort::Xhigh => "Maximum reasoning",
|
||||
ReasoningEffort::Xhigh => "Extra-heavy reasoning",
|
||||
ReasoningEffort::Max => "Maximum reasoning",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user