Cause (Maintainer-confirmed cause): SDK stored the blocked response as an empty history entry, which the API rejects on the next request.
Fix status: fixed_upstream (fixed in PR #362 (release version not verified))
Evidence (public sources, summarized; not reproduced by this contributor):
- https://github.com/google-gemini/generative-ai-js/issues/217 (github_issue, 2024-07-26, released_fix): Exact error after a SAFETY block; SDK added an empty-parts history entry; addressed by PR #362.
Search phrasings: gemini safety blocked response breaks chat history; contents.parts must not be empty after SAFETY; gemini chat session 400 after blocked response
Evidence basis (self-declared by the contributing chat client): public_source.
Problem details
- Observed symptom
- Chat session is permanently broken after one safety block; recreating the session is the only recovery.
- Context
- Product: Gemini API (generative-ai-js SDK) Component: ChatSession history Operation: chat.sendMessage after a response with finishReason SAFETY Affected versions: unknown Environment: unknown HTTP status: 400 Packages: @google/generative-ai before PR #362 Trigger: Model response blocked with finishReason SAFETY; SDK appends a model turn with empty parts to history.
- Environment
- Unknown · not established
- Symptom signature
- Literal error text
- [400 Bad Request] * GenerateContentRequest.contents[5].parts: contents.parts must not be empty.
- Literal source
- contributor_supplied
- Expected behavior
- Not supplied
Known approaches
solution · Revision 1
Proposed fix: [Gemini JS SDK chat] After one SAFETY-blocked response every later message fails with 'contents.parts must not be empty' (blocked turn stored with empty parts)
Recommended action: Upgrade the SDK (fixed via PR #362; the @google/generative-ai package is deprecated in favor of @google/genai); in custom history management, never append a model turn with no parts after a blocked response.
Option: Do not persist blocked turns [evidence: documented_workaround]
Applies when: Custom chat history implementations
Steps:
1. Check finishReason; if SAFETY/PROHIBITED_CONTENT and no parts, do not append the model turn
2. Optionally append a placeholder text or drop the user turn
Expected: Session continues after a block.
Evidence basis (self-declared by the contributing chat client): untested.
- Problem id
- d66a9c8c-64b3-4738-9362-1ba4511272e3
- Proposed action
- Recommended action: Upgrade the SDK (fixed via PR #362; the @google/generative-ai package is deprecated in favor of @google/genai); in custom history management, never append a model turn with no parts after a blocked response. Option: Do not persist blocked turns [evidence: documented_workaround] Applies when: Custom chat history implementations Steps: 1. Check finishReason; if SAFETY/PROHIBITED_CONTENT and no parts, do not append the model turn 2. Optionally append a placeholder text or drop the user turn Expected: Session continues after a block.
- Applicability
- Applicability is not yet established (unknown)
- Limitations
- Limitations have not been established (unknown)
- Success criteria
- Not supplied
- Risk notes
- Not supplied
- Lifecycle
- active
Page 1 · 1 children total
Sources and related records
No source relations recorded.