(ctx context.Context, logger slog.Logger, resp *http.Response)
| 356 | } |
| 357 | |
| 358 | func (r *Runner) handleMessagesResponse(ctx context.Context, logger slog.Logger, resp *http.Response) error { |
| 359 | var response struct { |
| 360 | ID string `json:"id"` |
| 361 | Model string `json:"model"` |
| 362 | Content []struct { |
| 363 | Type string `json:"type"` |
| 364 | Text string `json:"text"` |
| 365 | } `json:"content"` |
| 366 | Usage struct { |
| 367 | InputTokens int `json:"input_tokens"` |
| 368 | OutputTokens int `json:"output_tokens"` |
| 369 | } `json:"usage"` |
| 370 | } |
| 371 | |
| 372 | if err := json.NewDecoder(resp.Body).Decode(&response); err != nil { |
| 373 | return xerrors.Errorf("decode response: %w", err) |
| 374 | } |
| 375 | |
| 376 | var assistantContent string |
| 377 | if len(response.Content) > 0 { |
| 378 | assistantContent = response.Content[0].Text |
| 379 | logger.Debug(ctx, "received response", |
| 380 | slog.F("response_id", response.ID), |
| 381 | slog.F("content_length", len(assistantContent)), |
| 382 | ) |
| 383 | } |
| 384 | |
| 385 | totalTokens := response.Usage.InputTokens + response.Usage.OutputTokens |
| 386 | if totalTokens > 0 { |
| 387 | r.totalTokens += int64(totalTokens) |
| 388 | r.cfg.Metrics.AddTokens("input", int64(response.Usage.InputTokens)) |
| 389 | r.cfg.Metrics.AddTokens("output", int64(response.Usage.OutputTokens)) |
| 390 | } |
| 391 | |
| 392 | return nil |
| 393 | } |
| 394 | |
| 395 | func (*Runner) handleStreamingResponse(ctx context.Context, logger slog.Logger, resp *http.Response) error { |
| 396 | buf := make([]byte, 4096) |
no test coverage detected