responses_to_anthropic_instructions_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package apicompat
  2. import (
  3. "encoding/json"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/stretchr/testify/require"
  7. )
  8. func TestResponsesToAnthropicRequest_Instructions(t *testing.T) {
  9. t.Run("instructions_becomes_system", func(t *testing.T) {
  10. req := &ResponsesRequest{
  11. Model: "claude-sonnet-4-20250514",
  12. Instructions: "You are a helpful assistant.",
  13. Input: json.RawMessage(`[{"role":"user","content":"hello"}]`),
  14. }
  15. result, err := ResponsesToAnthropicRequest(req)
  16. require.NoError(t, err)
  17. var system string
  18. require.NoError(t, json.Unmarshal(result.System, &system))
  19. assert.Equal(t, "You are a helpful assistant.", system)
  20. assert.NotEmpty(t, result.Messages)
  21. })
  22. t.Run("empty_instructions_no_system", func(t *testing.T) {
  23. req := &ResponsesRequest{
  24. Model: "claude-sonnet-4-20250514",
  25. Input: json.RawMessage(`[{"role":"user","content":"hello"}]`),
  26. }
  27. result, err := ResponsesToAnthropicRequest(req)
  28. require.NoError(t, err)
  29. assert.Nil(t, result.System)
  30. })
  31. t.Run("instructions_and_system_item_concatenated", func(t *testing.T) {
  32. req := &ResponsesRequest{
  33. Model: "claude-sonnet-4-20250514",
  34. Instructions: "Top-level instruction.",
  35. Input: json.RawMessage(`[
  36. {"role":"system","content":"Input-level system prompt."},
  37. {"role":"user","content":"hello"}
  38. ]`),
  39. }
  40. result, err := ResponsesToAnthropicRequest(req)
  41. require.NoError(t, err)
  42. var system string
  43. require.NoError(t, json.Unmarshal(result.System, &system))
  44. assert.Contains(t, system, "Top-level instruction.")
  45. assert.Contains(t, system, "Input-level system prompt.")
  46. })
  47. t.Run("instructions_with_string_input", func(t *testing.T) {
  48. req := &ResponsesRequest{
  49. Model: "claude-sonnet-4-20250514",
  50. Instructions: "Be concise.",
  51. Input: json.RawMessage(`"What is Go?"`),
  52. }
  53. result, err := ResponsesToAnthropicRequest(req)
  54. require.NoError(t, err)
  55. var system string
  56. require.NoError(t, json.Unmarshal(result.System, &system))
  57. assert.Equal(t, "Be concise.", system)
  58. require.Len(t, result.Messages, 1)
  59. assert.Equal(t, "user", result.Messages[0].Role)
  60. })
  61. }
  62. func TestConvertResponsesInputToAnthropic_DeveloperRole(t *testing.T) {
  63. t.Run("developer_becomes_system", func(t *testing.T) {
  64. input := `[
  65. {"role":"developer","content":[{"type":"input_text","text":"You are a code reviewer."}]},
  66. {"role":"user","content":"review this code"}
  67. ]`
  68. system, messages, err := convertResponsesInputToAnthropic("", json.RawMessage(input))
  69. require.NoError(t, err)
  70. var systemText string
  71. require.NoError(t, json.Unmarshal(system, &systemText))
  72. assert.Equal(t, "You are a code reviewer.", systemText)
  73. require.Len(t, messages, 1)
  74. assert.Equal(t, "user", messages[0].Role)
  75. })
  76. t.Run("developer_does_not_become_user", func(t *testing.T) {
  77. input := `[
  78. {"role":"developer","content":[{"type":"input_text","text":"System prompt."}]},
  79. {"role":"user","content":"hi"}
  80. ]`
  81. _, messages, err := convertResponsesInputToAnthropic("", json.RawMessage(input))
  82. require.NoError(t, err)
  83. for _, m := range messages {
  84. if m.Role == "user" {
  85. var s string
  86. if json.Unmarshal(m.Content, &s) == nil {
  87. assert.NotContains(t, s, "System prompt.")
  88. }
  89. }
  90. }
  91. })
  92. t.Run("instructions_and_developer_concatenated_in_order", func(t *testing.T) {
  93. input := `[
  94. {"role":"developer","content":"Extra context."},
  95. {"role":"user","content":"hello"}
  96. ]`
  97. system, _, err := convertResponsesInputToAnthropic("Main instruction.", json.RawMessage(input))
  98. require.NoError(t, err)
  99. var systemText string
  100. require.NoError(t, json.Unmarshal(system, &systemText))
  101. assert.Equal(t, "Main instruction.\n\nExtra context.", systemText)
  102. })
  103. }