chatcompletions_x_search_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package apicompat
  2. import (
  3. "encoding/json"
  4. "testing"
  5. "github.com/stretchr/testify/require"
  6. )
  7. func TestChatCompletionsToResponsesPreservesXSearchTool(t *testing.T) {
  8. enabled := true
  9. req := &ChatCompletionsRequest{
  10. Model: "grok-4.5",
  11. Messages: []ChatMessage{
  12. {Role: "user", Content: json.RawMessage(`"latest xAI post"`)},
  13. },
  14. Tools: []ChatTool{{
  15. Type: "x_search",
  16. AllowedXHandles: []string{"xai"},
  17. ExcludedXHandles: []string{"spam"},
  18. FromDate: "2026-08-01",
  19. ToDate: "2026-08-10",
  20. EnableImageUnderstanding: &enabled,
  21. EnableVideoUnderstanding: &enabled,
  22. }},
  23. ToolChoice: json.RawMessage(`{"type":"x_search"}`),
  24. }
  25. resp, err := ChatCompletionsToResponses(req)
  26. require.NoError(t, err)
  27. require.Len(t, resp.Tools, 1)
  28. require.Equal(t, "x_search", resp.Tools[0].Type)
  29. require.Equal(t, []string{"xai"}, resp.Tools[0].AllowedXHandles)
  30. require.Equal(t, []string{"spam"}, resp.Tools[0].ExcludedXHandles)
  31. require.Equal(t, "2026-08-01", resp.Tools[0].FromDate)
  32. require.Equal(t, "2026-08-10", resp.Tools[0].ToDate)
  33. require.NotNil(t, resp.Tools[0].EnableImageUnderstanding)
  34. require.True(t, *resp.Tools[0].EnableImageUnderstanding)
  35. require.NotNil(t, resp.Tools[0].EnableVideoUnderstanding)
  36. require.True(t, *resp.Tools[0].EnableVideoUnderstanding)
  37. require.JSONEq(t, `{"type":"x_search"}`, string(resp.ToolChoice))
  38. }
  39. func TestChatCompletionsToResponsesPreservesSupportedBuiltInTools(t *testing.T) {
  40. req := &ChatCompletionsRequest{
  41. Model: "claude-opus-4-6-thinking",
  42. Messages: []ChatMessage{{Role: "user", Content: json.RawMessage(`"hello"`)}},
  43. Tools: []ChatTool{
  44. {Type: "function", Function: &ChatFunction{Name: "read_file", Parameters: json.RawMessage(`{"type":"object"}`)}},
  45. {Type: "web_search"},
  46. {Type: "code_execution"},
  47. {Type: "unsupported_builtin"},
  48. {Type: "function"},
  49. },
  50. }
  51. resp, err := ChatCompletionsToResponses(req)
  52. require.NoError(t, err)
  53. require.Len(t, resp.Tools, 3)
  54. require.Equal(t, "function", resp.Tools[0].Type)
  55. require.Equal(t, "read_file", resp.Tools[0].Name)
  56. require.Equal(t, "web_search", resp.Tools[1].Type)
  57. require.Equal(t, "code_execution", resp.Tools[2].Type)
  58. }
  59. func TestResponsesToChatCompletionsPreservesXSearchTool(t *testing.T) {
  60. enabled := true
  61. req := &ResponsesRequest{
  62. Model: "grok-4.5",
  63. Input: json.RawMessage(`"latest xAI post"`),
  64. Tools: []ResponsesTool{{
  65. Type: "x_search",
  66. AllowedXHandles: []string{"xai"},
  67. ExcludedXHandles: []string{"spam"},
  68. FromDate: "2026-08-01",
  69. ToDate: "2026-08-10",
  70. EnableImageUnderstanding: &enabled,
  71. EnableVideoUnderstanding: &enabled,
  72. }},
  73. ToolChoice: json.RawMessage(`{"type":"x_search"}`),
  74. }
  75. chat, err := ResponsesToChatCompletionsRequest(req)
  76. require.NoError(t, err)
  77. require.Len(t, chat.Tools, 1)
  78. require.Equal(t, "x_search", chat.Tools[0].Type)
  79. require.Equal(t, []string{"xai"}, chat.Tools[0].AllowedXHandles)
  80. require.Equal(t, []string{"spam"}, chat.Tools[0].ExcludedXHandles)
  81. require.JSONEq(t, `{"type":"x_search"}`, string(chat.ToolChoice))
  82. }
  83. func TestResponsesToChatCompletionsXSearchToolChoiceString(t *testing.T) {
  84. chat, err := ResponsesToChatCompletionsRequest(&ResponsesRequest{
  85. Model: "grok-4.5",
  86. Input: json.RawMessage(`"latest xAI post"`),
  87. Tools: []ResponsesTool{{Type: "x_search"}},
  88. ToolChoice: json.RawMessage(`"x_search"`),
  89. })
  90. require.NoError(t, err)
  91. require.JSONEq(t, `"x_search"`, string(chat.ToolChoice))
  92. }