Skip to content

Filter out empty messages from LLM prompt construction#3967

Open
IanCal wants to merge 2 commits intomainfrom
claude/remove-empty-llm-messages-FNkEO
Open

Filter out empty messages from LLM prompt construction#3967
IanCal wants to merge 2 commits intomainfrom
claude/remove-empty-llm-messages-FNkEO

Conversation

@IanCal
Copy link
Contributor

@IanCal IanCal commented Feb 10, 2026

Empty messages (with no content and no tool calls) could be sent to the
LLM, which is wasteful and potentially causes issues. This change:

  • Skips assistant messages with empty body and no tool calls during
    history construction (matching the existing guard on user messages)
  • Adds a safety filter (hasMessageContent) on the final messages array
    to catch any empty messages from any source, while preserving
    assistant messages with tool calls and tool response messages

CS-10116

https://claude.ai/code/session_01JMzG85yR6uQUXVfnUTegXz

Empty messages (with no content and no tool calls) could be sent to the
LLM, which is wasteful and potentially causes issues. This change:

- Skips assistant messages with empty body and no tool calls during
  history construction (matching the existing guard on user messages)
- Adds a safety filter (hasMessageContent) on the final messages array
  to catch any empty messages from any source, while preserving
  assistant messages with tool calls and tool response messages

CS-10116

https://claude.ai/code/session_01JMzG85yR6uQUXVfnUTegXz
- Remove hasMessageContent filter: it was redundant with the inline
  guards already present for each message type and would silently
  mask construction bugs rather than surfacing them
- Fix test: use correct field name `id` instead of `toolCallId` for
  encoded command requests (matching all other tests in the file)
- Add tool result assertions to verify the assistant+tool message
  pairing is preserved when assistant body is empty

https://claude.ai/code/session_01JMzG85yR6uQUXVfnUTegXz
@github-actions
Copy link

Host Test Results

    1 files  ±0      1 suites  ±0   1h 49m 13s ⏱️ +23s
1 949 tests ±0  1 932 ✅ ±0  17 💤 ±0  0 ❌ ±0 
1 964 runs  ±0  1 947 ✅ ±0  17 💤 ±0  0 ❌ ±0 

Results for commit 01b3b74. ± Comparison against base commit 8def5b2.

@IanCal
Copy link
Contributor Author

IanCal commented Feb 10, 2026

@claude iterate to fix the linting and test issues. One of the matrix tests is failing because there is an expect for one attached file that should be checking the count is 2.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This pull request filters out empty messages from LLM prompt construction to prevent wasteful and potentially problematic API calls. The change modifies the history construction logic to skip assistant messages that have both an empty body and no tool calls, matching the existing filtering behavior for user messages.

Changes:

  • Modified buildPromptForModel to conditionally add assistant messages only when they have content or tool calls
  • Added comprehensive test coverage for empty message filtering scenarios

Reviewed changes

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

File Description
packages/runtime-common/ai/prompt.ts Updated assistant message construction to filter out empty messages while preserving messages with tool calls
packages/ai-bot/tests/prompt-construction-test.ts Added three new tests to verify empty message filtering for assistant and user messages

💡 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.

3 participants

Comments