@@ -19,6 +19,7 @@ import (
19 "github.com/charmbracelet/catwalk/pkg/catwalk"
19 "github.com/charmbracelet/catwalk/pkg/catwalk"
20 "github.com/charmbracelet/crush/internal/config"
20 "github.com/charmbracelet/crush/internal/config"
21 "github.com/charmbracelet/crush/internal/llm/tools"
21 "github.com/charmbracelet/crush/internal/llm/tools"
22+ "github.com/charmbracelet/crush/internal/log"
22 "github.com/charmbracelet/crush/internal/message"
23 "github.com/charmbracelet/crush/internal/message"
@@ -77,6 +78,12 @@ func createAnthropicClient(opts providerClientOptions, tp AnthropicClientType) a
77 } else if hasBearerAuth {
78 } else if hasBearerAuth {
78 slog.Debug("Skipping X-Api-Key header because Authorization header is provided")
79 slog.Debug("Skipping X-Api-Key header because Authorization header is provided")
82+ if config.Get().Options.Debug {
83+ httpClient := log.NewHTTPClient()
84+ anthropicClientOptions = append(anthropicClientOptions, option.WithHTTPClient(httpClient))
80 switch tp {
87 switch tp {
81 case AnthropicClientTypeBedrock:
88 case AnthropicClientTypeBedrock:
82 anthropicClientOptions = append(anthropicClientOptions, bedrock.WithLoadDefaultConfig(context.Background()))
89 anthropicClientOptions = append(anthropicClientOptions, bedrock.WithLoadDefaultConfig(context.Background()))
@@ -271,17 +278,11 @@ func (a *anthropicClient) preparedMessages(messages []anthropic.MessageParam, to
273func (a *anthropicClient) send(ctx context.Context, messages []message.Message, tools []tools.BaseTool) (response *ProviderResponse, err error) {
280func (a *anthropicClient) send(ctx context.Context, messages []message.Message, tools []tools.BaseTool) (response *ProviderResponse, err error) {
276 attempts := 0
281 attempts := 0
278 attempts++
283 attempts++
279 // Prepare messages on each attempt in case max_tokens was adjusted
284 // Prepare messages on each attempt in case max_tokens was adjusted
280 preparedMessages := a.preparedMessages(a.convertMessages(messages), a.convertTools(tools))
285 preparedMessages := a.preparedMessages(a.convertMessages(messages), a.convertTools(tools))
281− if cfg.Options.Debug {
282− jsonData, _ := json.Marshal(preparedMessages)
283− slog.Debug("Prepared messages", "messages", string(jsonData))
286 var opts []option.RequestOption
287 var opts []option.RequestOption
287 if a.isThinkingEnabled() {
288 if a.isThinkingEnabled() {
@@ -294,7 +295,7 @@ func (a *anthropicClient) send(ctx context.Context, messages []message.Message,
295 // If there is an error we are going to see if we can retry the call
296 // If there is an error we are going to see if we can retry the call
296 if err != nil {
297 if err != nil {
297− slog.Error("Error in Anthropic API call", "error", err)
298+ slog.Error("Anthropic API error", "error", err.Error(), "attempt", attempts, "max_retries", maxRetries)
298 retry, after, retryErr := a.shouldRetry(attempts, err)
299 retry, after, retryErr := a.shouldRetry(attempts, err)
299 if retryErr != nil {
300 if retryErr != nil {
300 return nil, retryErr
301 return nil, retryErr
@@ -327,7 +328,6 @@ func (a *anthropicClient) send(ctx context.Context, messages []message.Message,
329func (a *anthropicClient) stream(ctx context.Context, messages []message.Message, tools []tools.BaseTool) <-chan ProviderEvent {
330func (a *anthropicClient) stream(ctx context.Context, messages []message.Message, tools []tools.BaseTool) <-chan ProviderEvent {
331 attempts := 0
331 attempts := 0
332 eventChan := make(chan ProviderEvent)
332 eventChan := make(chan ProviderEvent)
333 go func() {
333 go func() {
@@ -335,10 +335,6 @@ func (a *anthropicClient) stream(ctx context.Context, messages []message.Message
335 attempts++
335 attempts++
336 // Prepare messages on each attempt in case max_tokens was adjusted
336 // Prepare messages on each attempt in case max_tokens was adjusted
337 preparedMessages := a.preparedMessages(a.convertMessages(messages), a.convertTools(tools))
337 preparedMessages := a.preparedMessages(a.convertMessages(messages), a.convertTools(tools))
338− if cfg.Options.Debug {
339− jsonData, _ := json.Marshal(preparedMessages)
340− slog.Debug("Prepared messages", "messages", string(jsonData))
343 var opts []option.RequestOption
339 var opts []option.RequestOption
344 if a.isThinkingEnabled() {
340 if a.isThinkingEnabled() {