chatgot更新换号重试
This commit is contained in:
@@ -898,7 +898,8 @@ func (c *Client) startImageGeneration(ctx context.Context, session tlsclient.Htt
|
|||||||
// image generation task actually started" signal, so when it is absent (and
|
// image generation task actually started" signal, so when it is absent (and
|
||||||
// nothing was streamed inline) treat the attempt as a transient upstream
|
// nothing was streamed inline) treat the attempt as a transient upstream
|
||||||
// failure. That is retryable: a fresh submission reliably engages the pipeline,
|
// failure. That is retryable: a fresh submission reliably engages the pipeline,
|
||||||
// so the pool's same-account retry recovers instead of failing the request.
|
// so the pool retries the same account a few times and then fails over to
|
||||||
|
// another account (换号重试) instead of failing the request.
|
||||||
if !asyncStarted && len(fileIDs) == 0 && len(sedimentIDs) == 0 {
|
if !asyncStarted && len(fileIDs) == 0 && len(sedimentIDs) == 0 {
|
||||||
return "", nil, nil, fmt.Errorf("%w: image generation did not start (no async marker)", ErrTemporaryUpstream)
|
return "", nil, nil, fmt.Errorf("%w: image generation did not start (no async marker)", ErrTemporaryUpstream)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2318,8 +2318,11 @@ func (s *V1Service) generateChatGPTImage(ctx context.Context, eventID string, mo
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Round-robin order; same-account retry on transient errors, fail over to the
|
// Round-robin order; on a transient upstream error (e.g. "image generation
|
||||||
// next account on auth/quota (see runPoolWithFailover).
|
// did not start (no async marker)") retry the same account a few times then
|
||||||
|
// FAIL OVER to the next account (tempFailover=true, capped at
|
||||||
|
// maxTempDeadAccounts) — never mark the account dead. Auth/quota fail over
|
||||||
|
// immediately (see runPoolWithFailover).
|
||||||
return s.runPoolWithFailover(ctx, eventID, "chatgpt", active, "image", func(token model.TokenAccount) ([]byte, error) {
|
return s.runPoolWithFailover(ctx, eventID, "chatgpt", active, "image", func(token model.TokenAccount) ([]byte, error) {
|
||||||
data, _, genErr := s.chatgpt.GenerateImage(ctx, token.Value, in.Prompt, modelItem.ID, aspectRatio, resolution, refs)
|
data, _, genErr := s.chatgpt.GenerateImage(ctx, token.Value, in.Prompt, modelItem.ID, aspectRatio, resolution, refs)
|
||||||
if genErr == nil {
|
if genErr == nil {
|
||||||
@@ -2330,7 +2333,7 @@ func (s *V1Service) generateChatGPTImage(ctx context.Context, eventID string, mo
|
|||||||
return data, genErr
|
return data, genErr
|
||||||
}, func(e error) (bool, bool, bool, bool) {
|
}, func(e error) (bool, bool, bool, bool) {
|
||||||
return errors.Is(e, chatgpt.ErrAuth), errors.Is(e, chatgpt.ErrQuotaExhausted), errors.Is(e, chatgpt.ErrTemporaryUpstream), false
|
return errors.Is(e, chatgpt.ErrAuth), errors.Is(e, chatgpt.ErrQuotaExhausted), errors.Is(e, chatgpt.ErrTemporaryUpstream), false
|
||||||
}, nil, false) // chatgpt token IS the credential — no cookie to refresh
|
}, nil, true) // chatgpt token IS the credential — no cookie to refresh; switch accounts on transient errors
|
||||||
}
|
}
|
||||||
|
|
||||||
// leonardoResetAfter returns when a Leonardo account's daily free tokens renew.
|
// leonardoResetAfter returns when a Leonardo account's daily free tokens renew.
|
||||||
|
|||||||
Reference in New Issue
Block a user