Summary
I hit repeated retries with:
Retryable(Empty completion received - no content, tool calls, or valid finish reason)
when using Forge against BigModel (open.bigmodel.cn) with glm-5-turbo during a long Sage session.
This seems to happen after a successful upstream connection/response event, but before Forge can build a non-empty final completion.
Environment
- Forge: local build (
0.1.0-dev)
- OS: macOS
- Provider:
big_model
- Model:
glm-5-turbo
- Endpoint:
https://open.bigmodel.cn/api/paas/v4/chat/completions
What happened
During a deep analysis run, previous turns worked, then at message_count: 82 Forge started retrying the same turn and failed 8 times with the empty completion error.
Relevant log excerpt (sanitized):
{"timestamp":" 297.233908375s","level":"INFO","fields":{"message":"Connecting Upstream","url":"https://open.bigmodel.cn/api/paas/v4/chat/completions","model":"glm-5-turbo","message_count":"82","message_cache_count":"81"}}
{"timestamp":" 300.078292042s","level":"DEBUG","fields":{"message":"Received completion from Upstream"}}
{"timestamp":" 300.078443209s","level":"ERROR","fields":{"message":"Retry attempt due to error","error":"Retryable(Empty completion received - no content, tool calls, or valid finish reason)","model":"glm-5-turbo"}}
Then the same pattern repeated multiple times for the same turn.
Raw SSE capture / replay
I captured/replayed the exact request payload shape (82 messages) via direct curl to BigModel and got valid SSE endings in repeated runs:
- some runs ended with
finish_reason: "stop" + [DONE]
- some runs ended with
finish_reason: "tool_calls" + [DONE]
- no raw replay run reproduced an empty terminal completion
Example tail (stop):
data: {"choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{...}}
data: [DONE]
Example tail (tool_calls):
data: {"choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{...}}
data: [DONE]
Why I think this may be Forge-side (or at least needs better diagnostics)
The error is thrown when the aggregated stream result has:
- empty content
- no tool calls
- no finish reason
- no thought signature
Given the upstream was connected and a completion event was observed, this is hard to debug without raw response chunk logging at failure time.
Web/docs checks
- No obvious duplicate issue found in this repo for the exact error text.
- Z.ai docs note that abnormal SSE termination should indicate reason via
finish_reason.
Request
Could maintainers please:
- Investigate this edge case in OpenAI-compatible stream aggregation for BigModel/GLM-5, and
- Add optional debug logging/dump of terminal parsed chunk state when
EmptyCompletion is raised (to distinguish provider empty stream vs local parse/aggregation gap).
Artifacts
Sanitized artifacts are in this gist:
https://gist.github.com/chindris-mihai-alexandru/43f711cbb45e214d3307025d25a28425
(contains core Forge log excerpt, SSE tails, replay summary, and duplicate-search notes)
Summary
I hit repeated retries with:
Retryable(Empty completion received - no content, tool calls, or valid finish reason)when using Forge against BigModel (
open.bigmodel.cn) withglm-5-turboduring a long Sage session.This seems to happen after a successful upstream connection/response event, but before Forge can build a non-empty final completion.
Environment
0.1.0-dev)big_modelglm-5-turbohttps://open.bigmodel.cn/api/paas/v4/chat/completionsWhat happened
During a deep analysis run, previous turns worked, then at
message_count: 82Forge started retrying the same turn and failed 8 times with the empty completion error.Relevant log excerpt (sanitized):
{"timestamp":" 297.233908375s","level":"INFO","fields":{"message":"Connecting Upstream","url":"https://open.bigmodel.cn/api/paas/v4/chat/completions","model":"glm-5-turbo","message_count":"82","message_cache_count":"81"}} {"timestamp":" 300.078292042s","level":"DEBUG","fields":{"message":"Received completion from Upstream"}} {"timestamp":" 300.078443209s","level":"ERROR","fields":{"message":"Retry attempt due to error","error":"Retryable(Empty completion received - no content, tool calls, or valid finish reason)","model":"glm-5-turbo"}}Then the same pattern repeated multiple times for the same turn.
Raw SSE capture / replay
I captured/replayed the exact request payload shape (82 messages) via direct
curlto BigModel and got valid SSE endings in repeated runs:finish_reason: "stop"+[DONE]finish_reason: "tool_calls"+[DONE]Example tail (
stop):Example tail (
tool_calls):Why I think this may be Forge-side (or at least needs better diagnostics)
The error is thrown when the aggregated stream result has:
Given the upstream was connected and a completion event was observed, this is hard to debug without raw response chunk logging at failure time.
Web/docs checks
finish_reason.Request
Could maintainers please:
EmptyCompletionis raised (to distinguish provider empty stream vs local parse/aggregation gap).Artifacts
Sanitized artifacts are in this gist:
https://gist.github.com/chindris-mihai-alexandru/43f711cbb45e214d3307025d25a28425
(contains core Forge log excerpt, SSE tails, replay summary, and duplicate-search notes)