Skip to content

Commit

Permalink
fix: Add token caching and refresh mechanism in YandexGPTService (#5)
Browse files Browse the repository at this point in the history
fix: Add token caching and refresh mechanism in YandexGPTService
  • Loading branch information
azalio authored Jan 1, 2025
1 parent 7eb5bdd commit f673e14
Showing 1 changed file with 43 additions and 2 deletions.
45 changes: 43 additions & 2 deletions internal/service/yandex_gpt_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"fmt"
"net/http"
"strings"
"sync"
"time"

"github.com/azalio/meme-bot/internal/config"
"github.com/azalio/meme-bot/pkg/logger"
Expand All @@ -22,6 +24,9 @@ type YandexGPTServiceImpl struct {
config *config.Config
logger *logger.Logger
authService YandexAuthService
mu sync.RWMutex
token string
lastRefresh time.Time
}

// NewYandexGPTService создает новый экземпляр GPT сервиса
Expand All @@ -30,13 +35,39 @@ func NewYandexGPTService(cfg *config.Config, log *logger.Logger, auth YandexAuth
config: cfg,
logger: log,
authService: auth,
mu: sync.RWMutex{},
}
}

func (s *YandexGPTServiceImpl) getToken(ctx context.Context) (string, error) {
s.mu.RLock()
token := s.token
lastRefresh := s.lastRefresh
s.mu.RUnlock()

// Если токен есть и он свежий (менее 11 часов), используем его
if token != "" && time.Since(lastRefresh) < 11*time.Hour {
return token, nil
}

// Получаем новый токен
newToken, err := s.authService.GetIAMToken(ctx)
if err != nil {
return "", err
}

s.mu.Lock()
s.token = newToken
s.lastRefresh = time.Now()
s.mu.Unlock()

return newToken, nil
}

// GenerateImagePrompt генерирует промпт и подпись для создания изображения
func (s *YandexGPTServiceImpl) GenerateImagePrompt(ctx context.Context, userPrompt string) (string, string, error) {
s.logger.Debug(ctx, "Requesting IAM token from auth service", nil)
iamToken, err := s.authService.GetIAMToken(ctx)
s.logger.Debug(ctx, "Requesting IAM token", nil)
iamToken, err := s.getToken(ctx)
if err != nil {
return "", "", fmt.Errorf("getting IAM token: %w", err)
}
Expand Down Expand Up @@ -166,6 +197,16 @@ func (s *YandexGPTServiceImpl) sendGPTRequest(ctx context.Context, iamToken stri
s.logger.Debug(ctx, "Received GPT response", map[string]interface{}{
"status_code": resp.StatusCode,
})
if resp.StatusCode == http.StatusUnauthorized {
// Сбрасываем токен и пробуем еще раз
s.mu.Lock()
s.token = ""
s.mu.Unlock()

s.logger.Info(ctx, "Token expired, retrying with new token", nil)
return s.sendGPTRequest(ctx, iamToken, request)
}

if resp.StatusCode != http.StatusOK {
// Пытаемся прочитать тело ошибки
var errResponse GPTErrorResponse
Expand Down

0 comments on commit f673e14

Please sign in to comment.