diff --git a/backend/internal/provider/custom/client.go b/backend/internal/provider/custom/client.go index c011249..ccf3e3d 100644 --- a/backend/internal/provider/custom/client.go +++ b/backend/internal/provider/custom/client.go @@ -55,7 +55,7 @@ func sanitizeErr(err error) string { return "upstream request failed" } -func httpClient() *http.Client { return &http.Client{Timeout: 20 * time.Minute} } +func httpClient() *http.Client { return &http.Client{Timeout: 30 * time.Minute} } // GenerateImage calls the upstream OpenAI image API. With reference images it // uses /v1/images/edits (multipart); otherwise /v1/images/generations. Returns diff --git a/backend/internal/provider/grok/console.go b/backend/internal/provider/grok/console.go index 71adf2a..1f9e7b7 100644 --- a/backend/internal/provider/grok/console.go +++ b/backend/internal/provider/grok/console.go @@ -46,7 +46,7 @@ const ( consoleMaxEditImages = 3 consoleVideoPollEvery = 2 * time.Second - consoleVideoDeadline = 20 * time.Minute + consoleVideoDeadline = 30 * time.Minute ) // consoleSession is one minted DPoP token plus the key it is bound to. skew is diff --git a/backend/internal/provider/grok/video.go b/backend/internal/provider/grok/video.go index 290f66f..2b2061d 100644 --- a/backend/internal/provider/grok/video.go +++ b/backend/internal/provider/grok/video.go @@ -291,7 +291,7 @@ func (c *Client) createPost(ctx context.Context, client tlsclient.HttpClient, to // assets.grok.com is not anti-bot gated) until grok finishes rendering it. // 404 means "still rendering"; auth failures abort. func (c *Client) waitForAsset(ctx context.Context, client tlsclient.HttpClient, token, url string) error { - deadline := time.Now().Add(20 * time.Minute) + deadline := time.Now().Add(30 * time.Minute) for { if err := ctx.Err(); err != nil { return err diff --git a/backend/internal/service/v1.go b/backend/internal/service/v1.go index e087b58..67c87cf 100644 --- a/backend/internal/service/v1.go +++ b/backend/internal/service/v1.go @@ -1506,8 +1506,8 @@ func (s *V1Service) finishUnimplementedEvent(ctx context.Context, eventID string } // videoGenBudget caps one video render end-to-end (submit + poll + download). -// 上游慢的时候(seedance 长镜头)12 分钟不够,统一给 20 分钟。 -const videoGenBudget = 20 * time.Minute +// 上游慢的时候(seedance 长镜头)12 分钟不够,统一给 30 分钟。 +const videoGenBudget = 30 * time.Minute // grokConcurrencyPerAccount is how many simultaneous generations one grok account // may run (grok tolerates 10, unlike the 1-per-account default elsewhere).