openai_messages_dispatch_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package service
  2. import (
  3. "testing"
  4. "github.com/Wei-Shaw/sub2api/internal/pkg/xai"
  5. "github.com/stretchr/testify/require"
  6. )
  7. func TestNormalizeOpenAIMessagesDispatchModelConfig(t *testing.T) {
  8. t.Parallel()
  9. cfg := normalizeOpenAIMessagesDispatchModelConfig(OpenAIMessagesDispatchModelConfig{
  10. OpusMappedModel: " gpt-5.4-high ",
  11. SonnetMappedModel: "gpt-5.3-codex",
  12. HaikuMappedModel: " gpt-5.4-mini-medium ",
  13. ExactModelMappings: map[string]string{
  14. " claude-sonnet-4-5-20250929 ": " gpt-5.2-high ",
  15. "": "gpt-5.4",
  16. "claude-opus-4-6": " ",
  17. },
  18. })
  19. require.Equal(t, "gpt-5.4", cfg.OpusMappedModel)
  20. require.Equal(t, "gpt-5.3-codex", cfg.SonnetMappedModel)
  21. require.Equal(t, "gpt-5.4-mini", cfg.HaikuMappedModel)
  22. require.Equal(t, map[string]string{
  23. "claude-sonnet-4-5-20250929": "gpt-5.2",
  24. }, cfg.ExactModelMappings)
  25. }
  26. func TestGroupResolveMessagesDispatchModel_GrokRequiresCrossClientMapping(t *testing.T) {
  27. original := xai.RuntimeModelMappingOptions()
  28. t.Cleanup(func() { xai.SetRuntimeModelMappingOptions(original) })
  29. group := &Group{Platform: PlatformGrok}
  30. xai.SetRuntimeModelMappingOptions(xai.ModelMappingOptions{})
  31. require.Empty(t, group.ResolveMessagesDispatchModel("claude-sonnet-4-5"))
  32. xai.SetRuntimeModelMappingOptions(xai.ModelMappingOptions{
  33. DefaultText: "grok-build-0.1",
  34. EnableCrossClientMap: true,
  35. })
  36. require.Equal(t, "grok-build-0.1", group.ResolveMessagesDispatchModel("claude-sonnet-4-5"))
  37. require.Equal(t, "grok-build-0.1", group.ResolveMessagesDispatchModel("claude-opus-4-6"))
  38. require.Equal(t, "grok-build-0.1", group.ResolveMessagesDispatchModel("claude-haiku-4-5"))
  39. require.Empty(t, group.ResolveMessagesDispatchModel("grok"))
  40. require.Empty(t, group.ResolveMessagesDispatchModel("gpt-5.3-codex"))
  41. }
  42. func TestSanitizeGroupMessagesDispatchFields_ClearsNonOpenAIPlatform(t *testing.T) {
  43. t.Parallel()
  44. group := &Group{
  45. Platform: PlatformAnthropic,
  46. AllowMessagesDispatch: true,
  47. DefaultMappedModel: "gpt-5.6-sol",
  48. MessagesDispatchModelConfig: OpenAIMessagesDispatchModelConfig{
  49. SonnetMappedModel: "gpt-5.3-codex",
  50. ExactModelMappings: map[string]string{
  51. "claude-fable-5": "gpt-5.6-sol",
  52. },
  53. },
  54. }
  55. sanitizeGroupMessagesDispatchFields(group)
  56. require.False(t, group.AllowMessagesDispatch)
  57. require.Empty(t, group.DefaultMappedModel)
  58. require.Equal(t, OpenAIMessagesDispatchModelConfig{}, group.MessagesDispatchModelConfig)
  59. }
  60. func TestSanitizeGroupMessagesDispatchFields_PreservesCompositeDispatchToggle(t *testing.T) {
  61. t.Parallel()
  62. group := &Group{
  63. Platform: PlatformComposite,
  64. AllowMessagesDispatch: true,
  65. DefaultMappedModel: "gpt-5.6-sol",
  66. MessagesDispatchModelConfig: OpenAIMessagesDispatchModelConfig{
  67. SonnetMappedModel: "gpt-5.3-codex",
  68. ExactModelMappings: map[string]string{
  69. "claude-fable-5": "gpt-5.6-sol",
  70. },
  71. },
  72. }
  73. sanitizeGroupMessagesDispatchFields(group)
  74. require.True(t, group.AllowMessagesDispatch)
  75. require.Empty(t, group.DefaultMappedModel)
  76. require.Equal(t, OpenAIMessagesDispatchModelConfig{}, group.MessagesDispatchModelConfig)
  77. }