fix: isolate reasoning chunks from assistant spoken reply history and Web UI final reply
This commit is contained in:
+13
-5
@@ -451,6 +451,7 @@ class HermesLLM(FrameProcessor):
|
||||
if not suppress_output:
|
||||
await self.push_frame(LLMFullResponseStartFrame())
|
||||
chunks: list[str] = []
|
||||
spoken_chunks: list[str] = []
|
||||
|
||||
if self._keep_open:
|
||||
await self._ensure_persistent_proc()
|
||||
@@ -470,9 +471,9 @@ class HermesLLM(FrameProcessor):
|
||||
pass
|
||||
|
||||
if server_ok or self._use_server:
|
||||
await self._run_turn_server(utterance, chunks)
|
||||
await self._run_turn_server(utterance, chunks, spoken_chunks)
|
||||
else:
|
||||
await self._run_turn_cli(utterance, chunks)
|
||||
await self._run_turn_cli(utterance, chunks, spoken_chunks)
|
||||
|
||||
t1 = time.perf_counter()
|
||||
total_ms = int((t1 - t0) * 1000)
|
||||
@@ -491,7 +492,7 @@ class HermesLLM(FrameProcessor):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
full_reply = _clean_spoken_text(" ".join(chunks))
|
||||
full_reply = _clean_spoken_text(" ".join(spoken_chunks)) if 'spoken_chunks' in locals() and spoken_chunks else _clean_spoken_text(" ".join(chunks))
|
||||
if full_reply:
|
||||
self._history.append({"role": "assistant", "content": full_reply})
|
||||
logger.info(f"Hermes LLM ({self._model or 'default'}): {full_reply}")
|
||||
@@ -504,8 +505,10 @@ class HermesLLM(FrameProcessor):
|
||||
if self._on_reply:
|
||||
self._on_reply(full_reply)
|
||||
|
||||
async def _run_turn_server(self, utterance: str, chunks: list[str]):
|
||||
async def _run_turn_server(self, utterance: str, chunks: list[str], spoken_chunks: list[str] | None = None):
|
||||
"""Run turn via Hermes OpenAI-compatible Gateway API using SSE streaming (stream: true)."""
|
||||
if spoken_chunks is None:
|
||||
spoken_chunks = chunks
|
||||
try:
|
||||
ok, _ = await check_hermes_server_active(self._port)
|
||||
if not ok:
|
||||
@@ -616,6 +619,7 @@ class HermesLLM(FrameProcessor):
|
||||
if not cleaned_sent.endswith((".", "!", "?")):
|
||||
cleaned_sent += "."
|
||||
chunks.append(cleaned_sent)
|
||||
spoken_chunks.append(cleaned_sent)
|
||||
await self.push_frame(LLMTextFrame(cleaned_sent))
|
||||
try:
|
||||
import web_server
|
||||
@@ -639,6 +643,7 @@ class HermesLLM(FrameProcessor):
|
||||
if not cleaned_rem.endswith((".", "!", "?")):
|
||||
cleaned_rem += "."
|
||||
chunks.append(cleaned_rem)
|
||||
spoken_chunks.append(cleaned_rem)
|
||||
await self.push_frame(LLMTextFrame(cleaned_rem))
|
||||
try:
|
||||
import web_server
|
||||
@@ -666,8 +671,10 @@ class HermesLLM(FrameProcessor):
|
||||
pass
|
||||
await self._run_turn_cli(utterance, chunks)
|
||||
|
||||
async def _run_turn_cli(self, utterance: str, chunks: list[str]):
|
||||
async def _run_turn_cli(self, utterance: str, chunks: list[str], spoken_chunks: list[str] | None = None):
|
||||
"""Run turn via Hermes CLI using persistent session tracking."""
|
||||
if spoken_chunks is None:
|
||||
spoken_chunks = chunks
|
||||
cmd = [self._cli_path, "chat", "-q", utterance, "-Q", "--source", "voice", "--reasoning", "none"]
|
||||
if self._session_id:
|
||||
cmd.extend(["-r", self._session_id])
|
||||
@@ -735,6 +742,7 @@ class HermesLLM(FrameProcessor):
|
||||
cleaned = _clean_spoken_text(text_line)
|
||||
if cleaned:
|
||||
chunks.append(cleaned)
|
||||
spoken_chunks.append(cleaned)
|
||||
await self.push_frame(LLMTextFrame(cleaned))
|
||||
try:
|
||||
import web_server
|
||||
|
||||
Reference in New Issue
Block a user