Skip to content

Commit 57a7c85

Browse files
wip
1 parent 5716def commit 57a7c85

File tree

4 files changed

+43
-1
lines changed

4 files changed

+43
-1
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "solana-agent"
3-
version = "31.2.2-dev1"
3+
version = "31.2.2-dev2"
44
description = "AI Agents for Solana"
55
authors = ["Bevan Hunt <bevan@bevanhunt.com>"]
66
license = "MIT"

solana_agent/adapters/openai_realtime_ws.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,6 +1254,24 @@ def iter_output_transcript(self) -> AsyncGenerator[str, None]: # pragma: no cov
12541254
def set_tool_executor(self, executor): # pragma: no cover
12551255
self._tool_executor = executor
12561256

1257+
def reset_output_stream(self) -> None: # pragma: no cover
1258+
"""Drain any queued output audio and clear per-response text buffers.
1259+
This avoids replaying stale audio if the client failed to consume previous chunks."""
1260+
try:
1261+
while True:
1262+
try:
1263+
_ = self._audio_queue.get_nowait()
1264+
except asyncio.QueueEmpty:
1265+
break
1266+
except Exception:
1267+
break
1268+
try:
1269+
self._out_text_buffers.clear()
1270+
except Exception:
1271+
pass
1272+
except Exception:
1273+
pass
1274+
12571275
# Expose whether a function/tool call is currently pending
12581276
def has_pending_tool_call(self) -> bool: # pragma: no cover
12591277
try:
@@ -1615,3 +1633,7 @@ async def _empty():
16151633
def set_tool_executor(self, executor): # pragma: no cover
16161634
# Not applicable for transcription-only
16171635
return
1636+
1637+
def reset_output_stream(self) -> None: # pragma: no cover
1638+
# No audio output stream to reset
1639+
return

solana_agent/services/query.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,12 @@ async def _exec(tool_name: str, args: Dict[str, Any]) -> Dict[str, Any]:
669669
await rt.clear_input()
670670
except Exception:
671671
pass
672+
# Also reset any leftover output audio so new turn doesn't replay old chunks
673+
try:
674+
if hasattr(rt, "reset_output_stream"):
675+
rt.reset_output_stream()
676+
except Exception:
677+
pass
672678

673679
# Persist once per turn
674680
turn_id = await self.realtime_begin_turn(user_id)

solana_agent/services/realtime.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,13 @@ def iter_events(self) -> AsyncGenerator[Dict[str, Any], None]: # pragma: no cov
185185
def iter_output_audio(self) -> AsyncGenerator[bytes, None]: # pragma: no cover
186186
return self._session.iter_output_audio()
187187

188+
def reset_output_stream(self) -> None: # pragma: no cover
189+
try:
190+
if hasattr(self._session, "reset_output_stream"):
191+
self._session.reset_output_stream()
192+
except Exception:
193+
pass
194+
188195
async def iter_output_audio_encoded(
189196
self,
190197
) -> AsyncGenerator[bytes, None]: # pragma: no cover
@@ -447,6 +454,13 @@ def iter_events(self) -> AsyncGenerator[Dict[str, Any], None]: # pragma: no cov
447454
def iter_output_audio(self) -> AsyncGenerator[bytes, None]: # pragma: no cover
448455
return self._conv.iter_output_audio()
449456

457+
def reset_output_stream(self) -> None: # pragma: no cover
458+
try:
459+
if hasattr(self._conv, "reset_output_stream"):
460+
self._conv.reset_output_stream()
461+
except Exception:
462+
pass
463+
450464
async def iter_output_audio_encoded(
451465
self,
452466
) -> AsyncGenerator[bytes, None]: # pragma: no cover

0 commit comments

Comments
 (0)