@@ -7,6 +7,8 @@ import (
8 "charm.land/catwalk/pkg/catwalk"
8 "charm.land/catwalk/pkg/catwalk"
9 "charm.land/fantasy"
9 "charm.land/fantasy"
10+ "charm.land/fantasy/providers/anthropic"
11+ "charm.land/fantasy/providers/bedrock"
10 "github.com/charmbracelet/crush/internal/config"
12 "github.com/charmbracelet/crush/internal/config"
11 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
14 "github.com/stretchr/testify/require"
@@ -383,3 +385,36 @@ func TestUpdateParentSessionCost(t *testing.T) {
383 assert.InDelta(t, 0.0, updated.Cost, 1e-9)
385 assert.InDelta(t, 0.0, updated.Cost, 1e-9)
389+func TestGetProviderOptionsReasoningEffort(t *testing.T) {
390+ // Bedrock is Fantasy's Anthropic under a different provider name; options
391+ // must land under anthropic.Name so the Anthropic language model picks them up.
394+ providerType catwalk.Type
396+ {"anthropic honors reasoning_effort", catwalk.Type(anthropic.Name)},
397+ {"bedrock honors reasoning_effort", catwalk.Type(bedrock.Name)},
399+ for _, tc := range tests {
400+ t.Run(tc.name, func(t *testing.T) {
402+ CatwalkCfg: catwalk.Model{ID: "claude-opus-4-7"},
403+ ModelCfg: config.SelectedModel{
405+ ReasoningEffort: "max",
408+ providerCfg := config.ProviderConfig{ID: "test", Type: tc.providerType}
410+ opts := getProviderOptions(model, providerCfg)
412+ raw, ok := opts[anthropic.Name]
413+ require.True(t, ok, "options should be keyed under anthropic.Name for type %q", tc.providerType)
414+ parsed, ok := raw.(*anthropic.ProviderOptions)
416+ require.NotNil(t, parsed.Effort)
417+ assert.Equal(t, anthropic.Effort("max"), *parsed.Effort)