Skip to content

fix(examples): guard against empty choices and message=None in LLM calls - #299

Open
qizwiz wants to merge 1 commit into
nvidia-cosmos:mainfrom
qizwiz:fix/guard-empty-llm-response
Open

fix(examples): guard against empty choices and message=None in LLM calls#299
qizwiz wants to merge 1 commit into
nvidia-cosmos:mainfrom
qizwiz:fix/guard-empty-llm-response

Conversation

@qizwiz

@qizwiz qizwiz commented May 18, 2026

Copy link
Copy Markdown

What

Add explicit guards at three LLM call sites in example scripts before accessing response.choices[0].message.content.

Why

client.chat.completions.create() can return two empty-response shapes:

  1. choices = [] — on content-policy rejections, rate-limit errors, or provider failures
  2. choices[0].message = None — e.g. Gemini 2.5 Flash (via OpenAI-compatible endpoint) returns HTTP 200 with finish_reason: PROHIBITED_CONTENT and message=None

Both crash with IndexError or AttributeError.

Files changed

File Fix
docs/getting_started/nebius/reason2/src/cosmos_reason2_tests.py Guard before response.choices[0].message.content
scripts/examples/reason1/av_video_caption_vqa/model_openai.py Guard before response.choices[0].message.content
scripts/examples/reason1/temporal_localization/process_video_openai_api.py Guard before resp.choices[0].message.content
# Before
result = response.choices[0].message.content

# After
if not response.choices or response.choices[0].message is None:
    raise ValueError("LLM returned empty or filtered response")
result = response.choices[0].message.content

Corpus context

Detected by pact (llm_response_unguarded mode), a Z3-verified static analyzer for LLM crash vectors. This pattern was found across 13.8k violations in 800+ repos.

client.chat.completions.create() can return choices=[] on content-policy
rejections or provider errors, and choices[0].message=None on filtered
responses (e.g. Gemini PROHIBITED_CONTENT via OpenAI-compatible endpoint).
Both crash with IndexError/AttributeError. Guards added at all three
access sites across reason1 and reason2 example scripts.
Copilot AI review requested due to automatic review settings May 18, 2026 07:51

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR hardens three example scripts against OpenAI-compatible chat completion responses that return either an empty choices list or a None message, preventing IndexError/AttributeError crashes when accessing choices[0].message.content.

Changes:

  • Add a guard for not response.choices before indexing choices[0].
  • Add a guard for choices[0].message is None before reading message.content.
  • Raise a clear ValueError when the response is empty/filtered.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
docs/getting_started/nebius/reason2/src/cosmos_reason2_tests.py Adds response-shape validation before printing/returning the LLM result in the Reason2 test runner.
scripts/examples/reason1/av_video_caption_vqa/model_openai.py Adds response-shape validation before returning generated text from the OpenAI wrapper.
scripts/examples/reason1/temporal_localization/process_video_openai_api.py Adds response-shape validation before returning caption/localization output from video processing.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

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.

2 participants