responses_anthropic_cache_creation_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package apicompat
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "github.com/stretchr/testify/require"
  6. )
  7. func TestAnthropicUsageFromResponsesUsage_CacheCreation(t *testing.T) {
  8. usage := &ResponsesUsage{
  9. InputTokens: 20,
  10. OutputTokens: 5,
  11. CacheCreationInputTokens: 6,
  12. InputTokensDetails: &ResponsesInputTokensDetails{
  13. CachedTokens: 4,
  14. },
  15. }
  16. got := anthropicUsageFromResponsesUsage(usage)
  17. assert.Equal(t, 10, got.InputTokens, "input = total(20) - cache_read(4) - cache_creation(6)")
  18. assert.Equal(t, 5, got.OutputTokens)
  19. assert.Equal(t, 4, got.CacheReadInputTokens)
  20. assert.Equal(t, 6, got.CacheCreationInputTokens, "cache creation must be preserved")
  21. }
  22. func TestAnthropicUsageFromResponsesUsage_NoCacheCreation(t *testing.T) {
  23. usage := &ResponsesUsage{
  24. InputTokens: 10,
  25. OutputTokens: 5,
  26. InputTokensDetails: &ResponsesInputTokensDetails{
  27. CachedTokens: 3,
  28. },
  29. }
  30. got := anthropicUsageFromResponsesUsage(usage)
  31. assert.Equal(t, 7, got.InputTokens)
  32. assert.Equal(t, 3, got.CacheReadInputTokens)
  33. assert.Equal(t, 0, got.CacheCreationInputTokens)
  34. }
  35. func TestResponsesEventToAnthropicEvents_StreamingCacheCreation(t *testing.T) {
  36. state := NewResponsesEventToAnthropicState()
  37. state.MessageStartSent = true
  38. completedEvt := &ResponsesStreamEvent{
  39. Type: "response.completed",
  40. Response: &ResponsesResponse{
  41. Status: "completed",
  42. Usage: &ResponsesUsage{
  43. InputTokens: 20,
  44. OutputTokens: 5,
  45. CacheCreationInputTokens: 6,
  46. InputTokensDetails: &ResponsesInputTokensDetails{
  47. CachedTokens: 4,
  48. },
  49. },
  50. },
  51. }
  52. events := ResponsesEventToAnthropicEvents(completedEvt, state)
  53. var deltaEvt *AnthropicStreamEvent
  54. for i := range events {
  55. if events[i].Type == "message_delta" {
  56. deltaEvt = &events[i]
  57. break
  58. }
  59. }
  60. require.NotNil(t, deltaEvt, "should have message_delta event")
  61. require.NotNil(t, deltaEvt.Usage)
  62. assert.Equal(t, 6, deltaEvt.Usage.CacheCreationInputTokens, "streaming cache_creation must be preserved")
  63. assert.Equal(t, 10, deltaEvt.Usage.InputTokens, "input = 20 - 4(read) - 6(creation)")
  64. assert.Equal(t, 4, deltaEvt.Usage.CacheReadInputTokens)
  65. }
  66. func TestAnthropicToResponsesResponse_CacheCreation(t *testing.T) {
  67. resp := AnthropicResponse{
  68. ID: "msg_test",
  69. Type: "message",
  70. Role: "assistant",
  71. Model: "claude-opus-4-6",
  72. Usage: AnthropicUsage{
  73. InputTokens: 10,
  74. OutputTokens: 5,
  75. CacheReadInputTokens: 4,
  76. CacheCreationInputTokens: 6,
  77. },
  78. StopReason: AnthropicStopReasonPtr("end_turn"),
  79. }
  80. out := AnthropicToResponsesResponse(&resp)
  81. require.NotNil(t, out.Usage)
  82. assert.Equal(t, 20, out.Usage.InputTokens, "total = input(10) + cache_read(4) + cache_creation(6)")
  83. assert.Equal(t, 6, out.Usage.CacheCreationInputTokens, "cache creation must round-trip")
  84. }