refresh_policy.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package service
  2. import "time"
  3. // ProviderRefreshErrorAction 定义 provider 在刷新失败时的处理动作。
  4. type ProviderRefreshErrorAction int
  5. const (
  6. // ProviderRefreshErrorReturn 失败即返回错误(不降级旧 token)。
  7. ProviderRefreshErrorReturn ProviderRefreshErrorAction = iota
  8. // ProviderRefreshErrorUseExistingToken 失败后继续使用现有 token。
  9. ProviderRefreshErrorUseExistingToken
  10. )
  11. // ProviderLockHeldAction 定义 provider 在刷新锁被占用时的处理动作。
  12. type ProviderLockHeldAction int
  13. const (
  14. // ProviderLockHeldUseExistingToken 直接使用现有 token。
  15. ProviderLockHeldUseExistingToken ProviderLockHeldAction = iota
  16. // ProviderLockHeldWaitForCache 等待后重试缓存读取。
  17. ProviderLockHeldWaitForCache
  18. )
  19. // ProviderRefreshPolicy 描述 provider 的平台差异策略。
  20. type ProviderRefreshPolicy struct {
  21. OnRefreshError ProviderRefreshErrorAction
  22. OnLockHeld ProviderLockHeldAction
  23. FailureTTL time.Duration
  24. }
  25. func ClaudeProviderRefreshPolicy() ProviderRefreshPolicy {
  26. return ProviderRefreshPolicy{
  27. OnRefreshError: ProviderRefreshErrorUseExistingToken,
  28. OnLockHeld: ProviderLockHeldWaitForCache,
  29. FailureTTL: time.Minute,
  30. }
  31. }
  32. func OpenAIProviderRefreshPolicy() ProviderRefreshPolicy {
  33. return ProviderRefreshPolicy{
  34. OnRefreshError: ProviderRefreshErrorUseExistingToken,
  35. OnLockHeld: ProviderLockHeldWaitForCache,
  36. FailureTTL: time.Minute,
  37. }
  38. }
  39. func GeminiProviderRefreshPolicy() ProviderRefreshPolicy {
  40. return ProviderRefreshPolicy{
  41. OnRefreshError: ProviderRefreshErrorReturn,
  42. OnLockHeld: ProviderLockHeldUseExistingToken,
  43. FailureTTL: 0,
  44. }
  45. }
  46. func AntigravityProviderRefreshPolicy() ProviderRefreshPolicy {
  47. return ProviderRefreshPolicy{
  48. OnRefreshError: ProviderRefreshErrorReturn,
  49. OnLockHeld: ProviderLockHeldUseExistingToken,
  50. FailureTTL: 0,
  51. }
  52. }
  53. func GrokProviderRefreshPolicy() ProviderRefreshPolicy {
  54. return ProviderRefreshPolicy{
  55. OnRefreshError: ProviderRefreshErrorReturn,
  56. OnLockHeld: ProviderLockHeldWaitForCache,
  57. FailureTTL: 0,
  58. }
  59. }
  60. // BackgroundSkipAction 定义后台刷新服务在“未实际刷新”场景的计数方式。
  61. type BackgroundSkipAction int
  62. const (
  63. // BackgroundSkipAsSkipped 计入 skipped(保持当前默认行为)。
  64. BackgroundSkipAsSkipped BackgroundSkipAction = iota
  65. // BackgroundSkipAsSuccess 计入 success(仅用于兼容旧统计口径时可选)。
  66. BackgroundSkipAsSuccess
  67. )
  68. // BackgroundRefreshPolicy 描述后台刷新服务的调用侧策略。
  69. type BackgroundRefreshPolicy struct {
  70. OnLockHeld BackgroundSkipAction
  71. OnAlreadyRefresh BackgroundSkipAction
  72. }
  73. func DefaultBackgroundRefreshPolicy() BackgroundRefreshPolicy {
  74. return BackgroundRefreshPolicy{
  75. OnLockHeld: BackgroundSkipAsSkipped,
  76. OnAlreadyRefresh: BackgroundSkipAsSkipped,
  77. }
  78. }
  79. func (p BackgroundRefreshPolicy) handleLockHeld() error {
  80. if p.OnLockHeld == BackgroundSkipAsSuccess {
  81. return nil
  82. }
  83. return errRefreshSkipped
  84. }
  85. func (p BackgroundRefreshPolicy) handleAlreadyRefreshed() error {
  86. if p.OnAlreadyRefresh == BackgroundSkipAsSuccess {
  87. return nil
  88. }
  89. return errRefreshSkipped
  90. }