openai_gateway_grok_cache_tool_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package service
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "github.com/stretchr/testify/require"
  6. "github.com/tidwall/gjson"
  7. )
  8. func TestAppendMissingGrokFreeCacheNativeTools_PureClientFunctionNoInject(t *testing.T) {
  9. body := []byte(`{
  10. "model": "grok-4.5",
  11. "tools": [
  12. {"type":"function","name":"view_image","description":"View image","parameters":{"type":"object","properties":{"path":{"type":"string"}},"required":["path"]}}
  13. ],
  14. "tool_choice": "auto"
  15. }`)
  16. result, err := appendMissingGrokFreeCacheNativeTools(body)
  17. require.NoError(t, err)
  18. tools := gjson.GetBytes(result, "tools").Array()
  19. for _, tool := range tools {
  20. toolType := tool.Get("type").String()
  21. assert.NotEqual(t, "web_search", toolType, "should not inject web_search for pure client functions")
  22. assert.NotEqual(t, "x_search", toolType, "should not inject x_search for pure client functions")
  23. }
  24. }
  25. func TestAppendMissingGrokFreeCacheNativeTools_FunctionPlusWebSearchInjects(t *testing.T) {
  26. body := []byte(`{
  27. "model": "grok-4.5",
  28. "tools": [
  29. {"type":"function","name":"view_image","description":"View","parameters":{"type":"object","properties":{"path":{"type":"string"}},"required":["path"]}},
  30. {"type":"function","name":"web_search","description":"Search","parameters":{"type":"object","properties":{"query":{"type":"string"}},"required":["query"]}}
  31. ]
  32. }`)
  33. result, err := appendMissingGrokFreeCacheNativeTools(body)
  34. require.NoError(t, err)
  35. tools := gjson.GetBytes(result, "tools").Array()
  36. types := make(map[string]bool)
  37. for _, tool := range tools {
  38. types[tool.Get("type").String()] = true
  39. }
  40. assert.True(t, types["web_search"], "web_search should be present (converted from function)")
  41. assert.True(t, types["x_search"], "x_search should be injected when web_search is present alongside client functions")
  42. }
  43. func TestAppendMissingGrokFreeCacheNativeTools_NativeSearchAlreadyPresent(t *testing.T) {
  44. body := []byte(`{
  45. "model": "grok-4.5",
  46. "tools": [
  47. {"type":"function","name":"view_image","description":"View","parameters":{"type":"object","properties":{"path":{"type":"string"}},"required":["path"]}},
  48. {"type":"web_search"}
  49. ]
  50. }`)
  51. result, err := appendMissingGrokFreeCacheNativeTools(body)
  52. require.NoError(t, err)
  53. tools := gjson.GetBytes(result, "tools").Array()
  54. types := make(map[string]bool)
  55. for _, tool := range tools {
  56. types[tool.Get("type").String()] = true
  57. }
  58. assert.True(t, types["web_search"])
  59. assert.True(t, types["x_search"], "x_search should be injected when web_search is already present")
  60. }
  61. func TestAppendMissingGrokFreeCacheNativeTools_MultipleFunctionsNoSearch(t *testing.T) {
  62. body := []byte(`{
  63. "model": "grok-4.5",
  64. "tools": [
  65. {"type":"function","name":"view_image","description":"View","parameters":{"type":"object","properties":{"path":{"type":"string"}},"required":["path"]}},
  66. {"type":"function","name":"read_file","description":"Read","parameters":{"type":"object","properties":{"path":{"type":"string"}},"required":["path"]}}
  67. ]
  68. }`)
  69. result, err := appendMissingGrokFreeCacheNativeTools(body)
  70. require.NoError(t, err)
  71. tools := gjson.GetBytes(result, "tools").Array()
  72. require.Len(t, tools, 2, "no tools should be injected for pure client functions")
  73. }