Skip to content

fix(ai): disable retry for streaming AI requests to prevent duplicate responses (#1700)#1894

Open
HandSonic wants to merge 1 commit into
OtterMind:mainfrom
HandSonic:fix/1700-ai-duplicate-responses
Open

fix(ai): disable retry for streaming AI requests to prevent duplicate responses (#1700)#1894
HandSonic wants to merge 1 commit into
OtterMind:mainfrom
HandSonic:fix/1700-ai-duplicate-responses

Conversation

@HandSonic

Copy link
Copy Markdown
Contributor

Problem

所有 AI provider(OpenAI/Claude/Gemini)使用 RetryTemplate.defaultInstance(),默认最多重试 3 次。对于流式响应,重试会从头重新发送整个流,而前端通过 accumulatedContent += newContent 简单拼接,导致 AI 回答重复出现。

Fix

将三个 provider 的 RetryTemplate.defaultInstance() 替换为 new RetryTemplate()(maxAttempts=1,不重试)。

  • AiModelFactory.java:97 — OpenAI
  • AiModelFactory.java:130 — Claude
  • AiModelFactory.java:163 — Gemini

Related

Fixes #1700

@HandSonic
HandSonic force-pushed the fix/1700-ai-duplicate-responses branch from e23af3c to 71ded68 Compare July 21, 2026 08:15
@openai0229

Copy link
Copy Markdown
Contributor

Thanks for working on this. This change does not actually disable retries. The resolved dependency is Spring Retry 2.0.12, and new RetryTemplate() initializes a SimpleRetryPolicy(3), so it still allows three attempts just like RetryTemplate.defaultInstance(). Please use an explicit policy such as RetryTemplate.builder().maxAttempts(1).build() or NeverRetryPolicy. Also note that AiModelFactory.create() is used by both chatSync and stream; if retries should only be disabled for streaming responses, the two paths need separate retry configurations.

…sponses

Replace new RetryTemplate() with RetryTemplate.builder().maxAttempts(1).build()
for all three AI providers (OpenAI, Claude, Gemini).

The default RetryTemplate constructor uses SimpleRetryPolicy(3), which retries
failed requests up to 3 times. For streaming AI responses, retries cause
duplicate content. Using maxAttempts(1) ensures no retries occur.
@HandSonic
HandSonic force-pushed the fix/1700-ai-duplicate-responses branch from 71ded68 to 0991b47 Compare July 21, 2026 12:34
@HandSonic

Copy link
Copy Markdown
Contributor Author

Fixed. Replaced new RetryTemplate() with RetryTemplate.builder().maxAttempts(1).build() for all three AI providers (OpenAI, Claude, Gemini), ensuring no retries occur.

Regarding whether streaming and sync paths need separate retry configs: disabling retries uniformly in AiModelFactory.create() is reasonable, since even for sync requests, duplicate calls waste tokens and add latency. If differentiation is needed later, the two paths can be split into separate retry configurations.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: 创建新表会重复生成很多个一样的回答

2 participants