Skip to content

Commit 4520285

Browse files
committed
fix: bedrock interleaved_thinking defaults to true and add logging for provider_opts mismatches
- Default interleaved_thinking to true, matching schema documentation - Warn when thinking_budget is set but interleaved_thinking is explicitly disabled - Add debug logging in providerutil when provider_opts values have wrong types Assisted-By: docker-agent
1 parent dc6878c commit 4520285

3 files changed

Lines changed: 37 additions & 4 deletions

File tree

pkg/model/provider/bedrock/client.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,21 @@ func (c *Client) buildInferenceConfig(thinkingEnabled bool) *types.InferenceConf
279279
}
280280

281281
func (c *Client) interleavedThinkingEnabled() bool {
282-
return getProviderOpt[bool](c.ModelConfig.ProviderOpts, "interleaved_thinking")
282+
// Default to true, matching the documented schema behavior.
283+
v, ok := c.ModelConfig.ProviderOpts["interleaved_thinking"]
284+
if !ok {
285+
return true
286+
}
287+
b, ok := v.(bool)
288+
if !ok {
289+
slog.Warn("Bedrock provider_opts type mismatch",
290+
"key", "interleaved_thinking",
291+
"expected_type", "bool",
292+
"actual_type", fmt.Sprintf("%T", v),
293+
"value", v)
294+
return true
295+
}
296+
return b
283297
}
284298

285299
// isThinkingEnabled returns true if a valid thinking budget is configured.
@@ -349,6 +363,9 @@ func (c *Client) buildAdditionalModelRequestFields() document.Interface {
349363
if c.interleavedThinkingEnabled() {
350364
fields["anthropic_beta"] = []string{"interleaved-thinking-2025-05-14"}
351365
slog.Debug("Bedrock request using interleaved thinking beta")
366+
} else {
367+
slog.Warn("Bedrock thinking_budget is set but interleaved_thinking is explicitly disabled; " +
368+
"the anthropic_beta header will not be sent, which may cause the thinking budget to be ignored")
352369
}
353370
}
354371
}

pkg/model/provider/bedrock/client_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ func TestInterleavedThinkingEnabled_NotSet(t *testing.T) {
854854
},
855855
}
856856

857-
assert.False(t, client.interleavedThinkingEnabled())
857+
assert.True(t, client.interleavedThinkingEnabled())
858858
}
859859

860860
func TestInterleavedThinkingEnabled_NilProviderOpts(t *testing.T) {
@@ -870,7 +870,7 @@ func TestInterleavedThinkingEnabled_NilProviderOpts(t *testing.T) {
870870
},
871871
}
872872

873-
assert.False(t, client.interleavedThinkingEnabled())
873+
assert.True(t, client.interleavedThinkingEnabled())
874874
}
875875

876876
func TestBuildAdditionalModelRequestFields_WithInterleavedThinking(t *testing.T) {

pkg/model/provider/providerutil/provider_opts.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package providerutil
22

3-
import "math"
3+
import (
4+
"fmt"
5+
"log/slog"
6+
"math"
7+
)
48

59
// GetProviderOptFloat64 extracts a float64 value from provider opts.
610
// YAML may parse numbers as float64 or int, so this handles both.
@@ -22,6 +26,11 @@ func GetProviderOptFloat64(opts map[string]any, key string) (float64, bool) {
2226
case int64:
2327
return float64(n), true
2428
default:
29+
slog.Debug("provider_opts type mismatch, ignoring",
30+
"key", key,
31+
"expected_type", "numeric",
32+
"actual_type", fmt.Sprintf("%T", v),
33+
"value", v)
2534
return 0, false
2635
}
2736
}
@@ -45,8 +54,15 @@ func GetProviderOptInt64(opts map[string]any, key string) (int64, bool) {
4554
if n == math.Trunc(n) && n >= math.MinInt64 && n <= math.MaxInt64 {
4655
return int64(n), true
4756
}
57+
slog.Debug("provider_opts: float64 value is not a valid integer",
58+
"key", key, "value", v)
4859
return 0, false
4960
default:
61+
slog.Debug("provider_opts type mismatch, ignoring",
62+
"key", key,
63+
"expected_type", "integer",
64+
"actual_type", fmt.Sprintf("%T", v),
65+
"value", v)
5066
return 0, false
5167
}
5268
}

0 commit comments

Comments
 (0)