openai_messages_replay_guard_test.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "testing"
  6. "github.com/Wei-Shaw/sub2api/internal/pkg/apicompat"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func TestApplyAnthropicCompatFullReplayGuard_TrimsOldMessages(t *testing.T) {
  10. t.Parallel()
  11. req := &apicompat.AnthropicRequest{Messages: make([]apicompat.AnthropicMessage, 0, openAICompatAnthropicReplayMaxTailMessages+3)}
  12. for i := 0; i < openAICompatAnthropicReplayMaxTailMessages+3; i++ {
  13. req.Messages = append(req.Messages, apicompat.AnthropicMessage{
  14. Role: "user",
  15. Content: json.RawMessage(fmt.Sprintf(`"message-%02d"`, i)),
  16. })
  17. }
  18. trimmed := applyAnthropicCompatFullReplayGuard(req)
  19. require.True(t, trimmed)
  20. require.Len(t, req.Messages, openAICompatAnthropicReplayMaxTailMessages)
  21. require.JSONEq(t, `"message-03"`, string(req.Messages[0].Content))
  22. require.JSONEq(t, `"message-14"`, string(req.Messages[len(req.Messages)-1].Content))
  23. }
  24. func TestApplyAnthropicCompatFullReplayGuard_KeepsToolBoundaryIntact(t *testing.T) {
  25. t.Parallel()
  26. req := &apicompat.AnthropicRequest{Messages: make([]apicompat.AnthropicMessage, 0, openAICompatAnthropicReplayMaxTailMessages+3)}
  27. for i := 0; i < openAICompatAnthropicReplayMaxTailMessages+3; i++ {
  28. role := "user"
  29. content := json.RawMessage(fmt.Sprintf(`"message-%02d"`, i))
  30. if i == 1 {
  31. role = "assistant"
  32. content = json.RawMessage(`[{"type":"tool_use","id":"toolu_keep","name":"Read","input":{"file_path":"main.go"}}]`)
  33. }
  34. if i == 3 {
  35. content = json.RawMessage(`[{"type":"tool_result","tool_use_id":"toolu_keep","content":"ok"}]`)
  36. }
  37. req.Messages = append(req.Messages, apicompat.AnthropicMessage{
  38. Role: role,
  39. Content: content,
  40. })
  41. }
  42. trimmed := applyAnthropicCompatFullReplayGuard(req)
  43. require.True(t, trimmed)
  44. require.Len(t, req.Messages, openAICompatAnthropicReplayMaxTailMessages+2)
  45. require.Equal(t, "assistant", req.Messages[0].Role)
  46. require.Contains(t, string(req.Messages[0].Content), `"toolu_keep"`)
  47. require.Contains(t, string(req.Messages[2].Content), `"tool_result"`)
  48. }