fix(telegram): last draft push is the final text so the client folds it into the message
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
"""One ``sendMessageDraft`` stream per running turn (§3.8).
|
||||
|
||||
The client folds a draft into the message that follows only when their
|
||||
texts are identical - so the last push is the final text itself, rendered
|
||||
exactly as the outbox will send it, with no status line.
|
||||
|
||||
A draft is ephemeral and lives 30 s, Telegram throttles edits to about one
|
||||
per second per chat, and thinking or a tool call would otherwise look like a
|
||||
hang - so the draft opens with a status line straight away, is refreshed on
|
||||
@@ -74,15 +78,29 @@ class Draft:
|
||||
The final ``sendMessage`` must reach Telegram after the last draft,
|
||||
or the draft lands on top of the message and lingers for its 30 s.
|
||||
"""
|
||||
if self._task is None:
|
||||
return
|
||||
self._task.cancel()
|
||||
with contextlib.suppress(asyncio.CancelledError):
|
||||
await self._task
|
||||
self._task = None
|
||||
if self._task is not None:
|
||||
self._task.cancel()
|
||||
await asyncio.gather(self._task, return_exceptions=True)
|
||||
self._task = None
|
||||
if self._inflight is not None:
|
||||
with contextlib.suppress(Exception):
|
||||
await self._inflight
|
||||
self._inflight = None
|
||||
|
||||
async def finish(self, text: str) -> None:
|
||||
"""Last push: the final text verbatim, so the message replaces the draft."""
|
||||
await self.stop()
|
||||
if self._broken or not text.strip():
|
||||
return
|
||||
try:
|
||||
try:
|
||||
await self._send(to_html(text), "HTML")
|
||||
except TelegramBadRequest:
|
||||
await self._send(text, None)
|
||||
except TelegramAPIError as exc:
|
||||
_log.warning(
|
||||
"final draft to %s/%s failed: %s", self._chat_id, self._thread_id, exc
|
||||
)
|
||||
|
||||
async def _run(self) -> None:
|
||||
while not self._broken:
|
||||
|
||||
Reference in New Issue
Block a user