Issue Draft: Feishu/Lark streaming card still used when streaming=false
Title
Feishu/Lark: streaming card sessions are created even when channels.feishu.streaming=false (final message may show only tail / truncated)
Summary
In the Feishu/Lark channel, outbound replies sometimes use a streaming card (create card → update blocks → close) even though the config explicitly disables streaming:
channels.feishu.streaming = false
channels.feishu.accounts[<accountId>].streaming = false
When a streaming card is used, the final rendered message in Feishu can end up showing only the last part of the assistant’s output (appearing like earlier content is missing / overwritten).
Gateway logs confirm streaming is still being started (Created streaming card / Started streaming session / Updating streaming card...) during these cases.
Environment
- Platform: macOS (Apple Silicon)
- Channel: Feishu/Lark
- OpenClaw version: TBD (
openclaw --version)
- Feishu domain:
feishu
Current Config (relevant)
Steps to Reproduce
- Configure Feishu channel with streaming disabled (see config above).
- Chat with the bot and trigger an assistant reply (can be moderately long; may include markdown formatting).
- Observe in gateway logs that a streaming card is still created and updated, e.g.:
Created streaming card: <id>
Started streaming session: cardId=<id>, messageId=<id>
Updating streaming card with block text: <n> chars
- Observe in Feishu client that after completion, the final message may appear truncated (only the tail remains).
Expected Behavior
- When
channels.feishu.streaming=false (and/or account override streaming=false), no streaming card should be created.
- Replies should be sent as normal text messages (or chunked text) without streaming updates.
Actual Behavior
- Despite streaming=false, logs show streaming card sessions being created/updated.
- In Feishu UI, the final message can end up showing only the last part of the assistant output.
Logs (redacted)
(From /tmp/openclaw/openclaw-2026-02-06.log)
2026-02-06T02:39:52.175Z [feishu-streaming] Created streaming card: 76035764525602
2026-02-06T02:39:52.775Z [feishu-streaming] Sent streaming card message: om_x100b5761094bc4c3a622fe7bc657f
2026-02-06T02:39:52.777Z [feishu-streaming] Started streaming session: cardId=76035764525602, messageId=om_x100b5761094bc4c3a622fe7bc657f
2026-02-06T02:39:52.778Z [feishu-message] Started streaming card for chat <redacted_chat_id>
2026-02-06T02:40:01.562Z [feishu-message] Updating streaming card with block text: 569 chars
2026-02-06T02:42:48.848Z [feishu-streaming] Created streaming card: 76035771739124259
2026-02-06T02:42:49.520Z [feishu-streaming] Sent streaming card message: om_x100b57611c5d70c2c545de6dba5b5
2026-02-06T02:42:49.521Z [feishu-streaming] Started streaming session: cardId=76035771739124259, messageId=om_x100b57611c5d70c2c545de6dba5b5
2026-02-06T02:42:49.523Z [feishu-message] Started streaming card for chat <redacted_chat_id>
2026-02-06T02:43:57.745Z [feishu-streaming] Created streaming card: 76035774721058687
2026-02-06T02:43:58.332Z [feishu-streaming] Sent streaming card message: om_x100b5761181380c3b24ae8f43383b
2026-02-06T02:43:58.334Z [feishu-streaming] Started streaming session: cardId=76035774721058687, messageId=om_x100b5761181380c3b24ae8f43383b
2026-02-06T02:43:58.335Z [feishu-message] Started streaming card for chat <redacted_chat_id>
2026-02-06T02:44:11.781Z [feishu-message] Updating streaming card with block text: 810 chars
Notes / Hypotheses
- Might be related to how outbound reply code instantiates
FeishuStreamingSession:
const streamingSession = (feishuCfg.streaming ?? true) && ... ? new FeishuStreamingSession(...) : null;
- It should respect
feishuCfg.streaming=false consistently (including per-account overrides).
- There may also be interaction with
autoRichText (Markdown → Feishu post) or other reply paths.
Suggested Fix
- Ensure outbound logic never creates a
FeishuStreamingSession when config disables streaming (global or account-level).
- Add a regression test to verify
streaming=false results in normal text sends only.
- Optional: add a debug log that prints the resolved effective
feishuCfg.streaming value per account/chat for easier diagnosis.
Issue Draft: Feishu/Lark streaming card still used when
streaming=falseTitle
Feishu/Lark: streaming card sessions are created even when
channels.feishu.streaming=false(final message may show only tail / truncated)Summary
In the Feishu/Lark channel, outbound replies sometimes use a streaming card (create card → update blocks → close) even though the config explicitly disables streaming:
channels.feishu.streaming = falsechannels.feishu.accounts[<accountId>].streaming = falseWhen a streaming card is used, the final rendered message in Feishu can end up showing only the last part of the assistant’s output (appearing like earlier content is missing / overwritten).
Gateway logs confirm streaming is still being started (Created streaming card / Started streaming session / Updating streaming card...) during these cases.
Environment
openclaw --version)feishuCurrent Config (relevant)
{ "channels": { "feishu": { "streaming": false, "blockStreaming": true, "textChunkLimit": 8000, "chunkMode": "newline", "accounts": { "<accountId>": { "streaming": false, "blockStreaming": true } } } } }Steps to Reproduce
Created streaming card: <id>Started streaming session: cardId=<id>, messageId=<id>Updating streaming card with block text: <n> charsExpected Behavior
channels.feishu.streaming=false(and/or account override streaming=false), no streaming card should be created.Actual Behavior
Logs (redacted)
(From
/tmp/openclaw/openclaw-2026-02-06.log)Notes / Hypotheses
FeishuStreamingSession:const streamingSession = (feishuCfg.streaming ?? true) && ... ? new FeishuStreamingSession(...) : null;feishuCfg.streaming=falseconsistently (including per-account overrides).autoRichText(Markdown → Feishupost) or other reply paths.Suggested Fix
FeishuStreamingSessionwhen config disables streaming (global or account-level).streaming=falseresults in normal text sends only.feishuCfg.streamingvalue per account/chat for easier diagnosis.