openai_profit_control_legacy_diagnostics_test.go 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package service
  2. import (
  3. "errors"
  4. "strings"
  5. "testing"
  6. "time"
  7. "github.com/Wei-Shaw/sub2api/internal/config"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func legacyProfitDiagnosticService(accounts []Account) *OpenAIGatewayService {
  11. return &OpenAIGatewayService{
  12. accountRepo: stubOpenAIAccountRepo{accounts: accounts},
  13. cfg: &config.Config{},
  14. rateLimitService: newOpenAIAdvancedSchedulerRateLimitService("false"),
  15. concurrencyService: NewConcurrencyService(stubConcurrencyCache{}),
  16. }
  17. }
  18. func legacyProfitDiagnosticAccount(id int64) *Account {
  19. now := time.Now()
  20. a := upstreamCostTestAccount(id, UpstreamBillingProbeStatusOK, 0.9, now.Add(-time.Minute), 30*time.Minute)
  21. a.Status = StatusActive
  22. a.Schedulable = true
  23. a.Concurrency = 1
  24. return a
  25. }
  26. func TestSelectAccountWithScheduler_LegacyProfitDiagnostics(t *testing.T) {
  27. groupID := int64(5313)
  28. ctx := profitControlTestCtx(profitControlTestGroup(groupID, 0.5, 0))
  29. t.Run("threshold reports deterministic pool count", func(t *testing.T) {
  30. account := legacyProfitDiagnosticAccount(53131)
  31. profitControlTestAccountWithRate(account, 0.9)
  32. svc := legacyProfitDiagnosticService([]Account{*account})
  33. selection, _, err := svc.SelectAccountWithScheduler(ctx, &groupID, "", "", "gpt-test", nil, OpenAIUpstreamTransportAny, false)
  34. require.Nil(t, selection)
  35. require.ErrorIs(t, err, ErrNoAvailableAccounts)
  36. require.Contains(t, err.Error(), "pool=1, filtered: profit_threshold=1")
  37. })
  38. t.Run("missing account rate reports invalid rate", func(t *testing.T) {
  39. account := upstreamCostTestOAuthAccount(53132)
  40. account.Status = StatusActive
  41. account.Schedulable = true
  42. account.Concurrency = 1
  43. svc := legacyProfitDiagnosticService([]Account{*account})
  44. selection, _, err := svc.SelectAccountWithScheduler(ctx, &groupID, "", "", "gpt-test", nil, OpenAIUpstreamTransportAny, false)
  45. require.Nil(t, selection)
  46. require.ErrorIs(t, err, ErrNoAvailableAccounts)
  47. require.Contains(t, err.Error(), "profit_invalid_account_rate=1")
  48. })
  49. t.Run("model support gate does not report profit reasons", func(t *testing.T) {
  50. account := legacyProfitDiagnosticAccount(53133)
  51. profitControlTestAccountWithRate(account, 0.9)
  52. account.Credentials = map[string]any{"model_mapping": map[string]any{"other-model": "other-model"}}
  53. svc := legacyProfitDiagnosticService([]Account{*account})
  54. selection, _, err := svc.SelectAccountWithScheduler(ctx, &groupID, "", "", "gpt-test", nil, OpenAIUpstreamTransportAny, false)
  55. require.Nil(t, selection)
  56. require.ErrorIs(t, err, ErrNoAvailableAccounts)
  57. require.Contains(t, err.Error(), "ineligible=1")
  58. require.NotContains(t, err.Error(), openAIProfitFilterReasonThreshold)
  59. require.NotContains(t, err.Error(), openAIProfitFilterReasonInvalidAccountRate)
  60. })
  61. t.Run("compact preserves compact sentinel", func(t *testing.T) {
  62. account := legacyProfitDiagnosticAccount(53134)
  63. account.Extra = map[string]any{"openai_compact_supported": false}
  64. profitControlTestAccountWithRate(account, 0.4)
  65. svc := legacyProfitDiagnosticService([]Account{*account})
  66. selection, _, err := svc.SelectAccountWithScheduler(ctx, &groupID, "", "", "gpt-test", nil, OpenAIUpstreamTransportAny, true)
  67. require.Nil(t, selection)
  68. require.ErrorIs(t, err, ErrNoAvailableCompactAccounts)
  69. require.False(t, strings.Contains(err.Error(), "pool="), err)
  70. require.False(t, errors.Is(err, ErrNoAvailableAccounts))
  71. })
  72. }