Summary
When using Bub with Telegram and an OpenAI model over the Responses API path, a turn can fail after a successful tool call because a completed response with no extracted text/tool calls is treated as empty response, retried 4 times, and then surfaced to the user as:
An error occurred at stage 'turn': temporary: openai:gpt-5.4-pro: LLM call failed after retries
This was observed on March 11, 2026.
Environment
- bub: 0.3.0a1
- republic: 0.5.4
- channel: Telegram
- model:
openai:gpt-5.4-pro
- transport:
responses (from Bub payload logging)
- deployment: Docker
Steps To Reproduce
- Start Bub with Telegram enabled.
- Send a simple Telegram message such as
h.
- Let the agent respond through the Telegram skill/tool path.
- After the tool call succeeds, Bub starts the next loop step.
- The provider returns a Responses payload that appears to be completed, but Bub retries it as
empty response until the turn fails.
Actual Behavior
- The tool call succeeds.
- Bub logs
openai:gpt-5.4-pro: empty response 4 times.
- The turn ends with
temporary: openai:gpt-5.4-pro: LLM call failed after retries.
- Bub dispatches an error message back to the Telegram chat.
Expected Behavior
- A completed Responses payload with
status=completed and incomplete_details=null should not be retried as an error in this case.
Sanitized Log Excerpt
2026-03-11 11:42:01 INFO session.message received active session_id=telegram:<chat_id>
content={"message":"h","message_id":<redacted>,"type":"text","username":"<redacted>","full_name":"<redacted>","sender_id":"<user_id>","sender_is_bot":false,"date":<redacted>}
2026-03-11 11:42:02 INFO loop.step step=1 tape=<tape_id> model=openai:gpt-5.4-pro
2026-03-11 11:42:07 INFO tool.call.start name=bash cmd="uv run /app/src/bub_skills/telegram/scripts/telegram_send.py --chat-id <chat_id> --message '<redacted>' ..."
2026-03-11 11:42:13 INFO tool.call.success name=bash elapsed_time=6154.95ms
2026-03-11 11:42:13 INFO loop.step step=2 tape=<tape_id> model=openai:gpt-5.4-pro
[openai:gpt-5.4-pro] attempt 1/4 failed: [temporary] openai:gpt-5.4-pro: empty response
WARNING llm.empty_response_payload provider=openai model=gpt-5.4-pro transport=responses payload_type=ResponseResource payload={"id":"<response_id>","object":"response","status":"completed","incomplete_details":null,"model":"gpt-5.4-pro",...}
[openai:gpt-5.4-pro] attempt 2/4 failed: [temporary] openai:gpt-5.4-pro: empty response
WARNING llm.empty_response_payload provider=openai model=gpt-5.4-pro transport=responses payload_type=ResponseResource payload={"id":"<response_id>","object":"response","status":"completed","incomplete_details":null,"model":"gpt-5.4-pro",...}
[openai:gpt-5.4-pro] attempt 3/4 failed: [temporary] openai:gpt-5.4-pro: empty response
WARNING llm.empty_response_payload provider=openai model=gpt-5.4-pro transport=responses payload_type=ResponseResource payload={"id":"<response_id>","object":"response","status":"completed","incomplete_details":null,"model":"gpt-5.4-pro",...}
[openai:gpt-5.4-pro] attempt 4/4 failed: [temporary] openai:gpt-5.4-pro: empty response
WARNING llm.empty_response_payload provider=openai model=gpt-5.4-pro transport=responses payload_type=ResponseResource payload={"id":"<response_id>","object":"response","status":"completed","incomplete_details":null,"model":"gpt-5.4-pro",...}
2026-03-11 11:42:24 INFO session.run.outbound session_id=telegram:<chat_id>
content=An error occurred at stage 'turn': temporary: openai:gpt-5.4-pro: LLM call failed after retries
Notes
From the logged payload shape, this looks like a completed Responses API payload rather than an incomplete/failed one.
Summary
When using Bub with Telegram and an OpenAI model over the Responses API path, a turn can fail after a successful tool call because a completed response with no extracted text/tool calls is treated as
empty response, retried 4 times, and then surfaced to the user as:An error occurred at stage 'turn': temporary: openai:gpt-5.4-pro: LLM call failed after retriesThis was observed on March 11, 2026.
Environment
openai:gpt-5.4-proresponses(from Bub payload logging)Steps To Reproduce
h.empty responseuntil the turn fails.Actual Behavior
openai:gpt-5.4-pro: empty response4 times.temporary: openai:gpt-5.4-pro: LLM call failed after retries.Expected Behavior
status=completedandincomplete_details=nullshould not be retried as an error in this case.Sanitized Log Excerpt
Notes
From the logged payload shape, this looks like a completed Responses API payload rather than an incomplete/failed one.