openai_responses_ingress_compat_test.go 5.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package service
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/require"
  5. "github.com/tidwall/gjson"
  6. )
  7. func TestNormalizeOpenAIResponsesLegacyIngressMessagesOnly(t *testing.T) {
  8. body := []byte(`{"model":"gpt-5.4","stream":false,"messages":[{"role":"system","content":"repo policy"},{"role":"assistant","tool_calls":[{"id":"call_1","type":"function","function":{"name":"lookup","arguments":"{\"q\":\"hello\"}"}}]},{"role":"tool","tool_call_id":"call_1","content":"ok"}],"previous_response_id":"resp_stale"}`)
  9. normalized, changed, err := normalizeOpenAIResponsesLegacyIngress(body)
  10. require.NoError(t, err)
  11. require.True(t, changed)
  12. require.False(t, gjson.GetBytes(normalized, "messages").Exists())
  13. require.False(t, gjson.GetBytes(normalized, "previous_response_id").Exists())
  14. require.Equal(t, "system", gjson.GetBytes(normalized, "input.0.role").String())
  15. require.Equal(t, "repo policy", gjson.GetBytes(normalized, "input.0.content").String())
  16. require.Equal(t, "function_call", gjson.GetBytes(normalized, "input.1.type").String())
  17. require.Equal(t, "call_1", gjson.GetBytes(normalized, "input.1.call_id").String())
  18. require.Equal(t, "function_call_output", gjson.GetBytes(normalized, "input.2.type").String())
  19. require.Equal(t, "call_1", gjson.GetBytes(normalized, "input.2.call_id").String())
  20. require.Equal(t, gjson.False, gjson.GetBytes(normalized, "stream").Type)
  21. }
  22. func TestNormalizeOpenAIResponsesLegacyIngressConvertsChatTopLevelFields(t *testing.T) {
  23. body := []byte(`{"model":"gpt-4.1","messages":[{"role":"user","content":"weather?"}],"tools":[{"type":"function","function":{"name":"lookup","description":"Lookup weather","parameters":{"type":"object"}}}],"tool_choice":{"type":"function","function":{"name":"lookup"}},"max_tokens":64,"reasoning_effort":"high","service_tier":"flex","temperature":0.2,"top_p":0.7}`)
  24. normalized, changed, err := normalizeOpenAIResponsesLegacyIngress(body)
  25. require.NoError(t, err)
  26. require.True(t, changed)
  27. require.Equal(t, "user", gjson.GetBytes(normalized, "input.0.role").String())
  28. require.Equal(t, "function", gjson.GetBytes(normalized, "tools.0.type").String())
  29. require.Equal(t, "lookup", gjson.GetBytes(normalized, "tools.0.name").String())
  30. require.False(t, gjson.GetBytes(normalized, "tools.0.function").Exists())
  31. require.Equal(t, "function", gjson.GetBytes(normalized, "tool_choice.type").String())
  32. require.Equal(t, "lookup", gjson.GetBytes(normalized, "tool_choice.name").String())
  33. require.False(t, gjson.GetBytes(normalized, "tool_choice.function").Exists())
  34. require.Equal(t, int64(128), gjson.GetBytes(normalized, "max_output_tokens").Int())
  35. require.Equal(t, "high", gjson.GetBytes(normalized, "reasoning.effort").String())
  36. require.Equal(t, "auto", gjson.GetBytes(normalized, "reasoning.summary").String())
  37. require.Equal(t, "flex", gjson.GetBytes(normalized, "service_tier").String())
  38. require.False(t, gjson.GetBytes(normalized, "max_tokens").Exists())
  39. require.False(t, gjson.GetBytes(normalized, "reasoning_effort").Exists())
  40. }
  41. func TestNormalizeOpenAIResponsesLegacyIngressNativeInputRemainsAuthoritative(t *testing.T) {
  42. body := []byte(`{"model":"gpt-5.4","input":[{"id":"msg_native","type":"message","role":"user","content":[{"type":"input_text","text":"keep me"}]}],"messages":[{"role":"user","content":"do not merge"}],"tools":[{"type":"function","function":{"name":"native_shape"}}],"tool_choice":{"type":"function","function":{"name":"native_shape"}},"previous_response_id":"resp_keep"}`)
  43. normalized, changed, err := normalizeOpenAIResponsesLegacyIngress(body)
  44. require.NoError(t, err)
  45. require.True(t, changed)
  46. require.False(t, gjson.GetBytes(normalized, "messages").Exists())
  47. require.Equal(t, "msg_native", gjson.GetBytes(normalized, "input.0.id").String())
  48. require.Equal(t, int64(1), gjson.GetBytes(normalized, "input.#").Int())
  49. require.Equal(t, "native_shape", gjson.GetBytes(normalized, "tools.0.function.name").String())
  50. require.False(t, gjson.GetBytes(normalized, "tools.0.name").Exists())
  51. require.Equal(t, "native_shape", gjson.GetBytes(normalized, "tool_choice.function.name").String())
  52. require.Equal(t, "resp_keep", gjson.GetBytes(normalized, "previous_response_id").String())
  53. }
  54. func TestNormalizeOpenAIResponsesLegacyIngressKeepsPromptAliasAndDropsCommands(t *testing.T) {
  55. body := []byte(`{"model":"gpt-4.1","prompt":"hello","commands":[{"name":"legacy"}]}`)
  56. normalized, changed, err := normalizeOpenAIResponsesLegacyIngress(body)
  57. require.NoError(t, err)
  58. require.True(t, changed)
  59. require.Equal(t, "hello", gjson.GetBytes(normalized, "input").String())
  60. require.False(t, gjson.GetBytes(normalized, "prompt").Exists())
  61. require.False(t, gjson.GetBytes(normalized, "commands").Exists())
  62. }
  63. func TestNormalizeOpenAIResponsesLegacyIngressPreservesNativePromptTemplate(t *testing.T) {
  64. body := []byte(`{"model":"gpt-5.4","prompt":{"id":"pmpt_abc","version":"7","variables":{"topic":"ownership"}}}`)
  65. normalized, changed, err := normalizeOpenAIResponsesLegacyIngress(body)
  66. require.NoError(t, err)
  67. require.False(t, changed)
  68. require.JSONEq(t, string(body), string(normalized))
  69. require.Equal(t, "pmpt_abc", gjson.GetBytes(normalized, "prompt.id").String())
  70. require.False(t, gjson.GetBytes(normalized, "input").Exists())
  71. }
  72. func TestNormalizeOpenAIResponsesLegacyIngressPreservesUnknownPromptShapeWhileDroppingCommands(t *testing.T) {
  73. body := []byte(`{"model":"gpt-5.4","prompt":["one","two"],"commands":[{"name":"legacy"}]}`)
  74. normalized, changed, err := normalizeOpenAIResponsesLegacyIngress(body)
  75. require.NoError(t, err)
  76. require.True(t, changed)
  77. require.Equal(t, int64(2), gjson.GetBytes(normalized, "prompt.#").Int())
  78. require.False(t, gjson.GetBytes(normalized, "input").Exists())
  79. require.False(t, gjson.GetBytes(normalized, "commands").Exists())
  80. }