mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
204038ec60
* feat: add extended thinking support for Anthropic models Support configurable thinking levels (off/low/medium/high/xhigh/adaptive) via `agents.defaults.thinking_level` config field. - "adaptive": uses Anthropic's adaptive thinking API (Claude 4.6+) - "low/medium/high/xhigh": uses budget_tokens (all thinking-capable models) - "off": disables thinking (default) API constraints handled: - Temperature cleared when thinking is enabled - budget_tokens clamped to max_tokens-1 - Thinking response blocks parsed into Reasoning field Relates to #645, #966 * fix: address PR review feedback for thinking support - Add ThinkingCapable interface for provider capability detection - Warn when thinking_level is set but provider doesn't support it - Warn when temperature is cleared due to thinking enabled - Adjust budget values per Anthropic best practices (medium=16K, xhigh=64K) - Add budget clamp warning and 80% threshold warning - Add parseResponse thinking block tests - Add thinking_level field to config.example.json * refactor: move ThinkingLevel from AgentDefaults to ModelConfig Thinking is a model-level capability, not a global agent property. Per-model config avoids silent ignoring on non-Anthropic providers and eliminates spurious warning logs in multi-provider setups. Addresses PR #1076 review feedback from @yinwm.
36 lines
982 B
Go
36 lines
982 B
Go
package agent
|
|
|
|
import "testing"
|
|
|
|
func TestParseThinkingLevel(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
want ThinkingLevel
|
|
}{
|
|
{"off", "off", ThinkingOff},
|
|
{"empty", "", ThinkingOff},
|
|
{"low", "low", ThinkingLow},
|
|
{"medium", "medium", ThinkingMedium},
|
|
{"high", "high", ThinkingHigh},
|
|
{"xhigh", "xhigh", ThinkingXHigh},
|
|
{"adaptive", "adaptive", ThinkingAdaptive},
|
|
{"unknown", "unknown", ThinkingOff},
|
|
// Case-insensitive and whitespace-tolerant
|
|
{"upper_Medium", "Medium", ThinkingMedium},
|
|
{"upper_HIGH", "HIGH", ThinkingHigh},
|
|
{"mixed_Adaptive", "Adaptive", ThinkingAdaptive},
|
|
{"leading_space", " high", ThinkingHigh},
|
|
{"trailing_space", "low ", ThinkingLow},
|
|
{"both_spaces", " medium ", ThinkingMedium},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := parseThinkingLevel(tt.input); got != tt.want {
|
|
t.Errorf("parseThinkingLevel(%q) = %q, want %q", tt.input, got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|