fciannella commited on
Commit
e9446cb
·
1 Parent(s): 378e880

Modified the langgraph service

Browse files
examples/voice_agent_webrtc_langgraph/langgraph_llm_service.py CHANGED
@@ -33,6 +33,30 @@ from pipecat.services.openai.llm import OpenAILLMService
33
 
34
  load_dotenv()
35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  class LangGraphLLMService(OpenAILLMService):
37
  """Pipecat LLM service that delegates responses to a LangGraph agent.
38
 
@@ -184,7 +208,7 @@ class LangGraphLLMService(OpenAILLMService):
184
  self._emitted_texts.clear()
185
  if part_text not in self._emitted_texts:
186
  self._emitted_texts.add(part_text)
187
- await self.push_frame(LLMTextFrame(part_text))
188
 
189
  # Final value-style events (values mode)
190
  if event == "values":
@@ -204,7 +228,7 @@ class LangGraphLLMService(OpenAILLMService):
204
  self._emitted_texts.clear()
205
  # Emit final explanation as its own message
206
  await self.push_frame(LLMFullResponseStartFrame())
207
- await self.push_frame(LLMTextFrame(final_text))
208
  await self.push_frame(LLMFullResponseEndFrame())
209
 
210
  # Messages mode: look for an array of messages
@@ -227,7 +251,7 @@ class LangGraphLLMService(OpenAILLMService):
227
  self._emitted_texts.clear()
228
  if content not in self._emitted_texts:
229
  self._emitted_texts.add(content)
230
- await self.push_frame(LLMTextFrame(content))
231
  except Exception as exc: # noqa: BLE001
232
  logger.debug(f"LangGraph messages parsing error: {exc}")
233
  # If payload is a plain string, emit it
@@ -240,7 +264,7 @@ class LangGraphLLMService(OpenAILLMService):
240
  self._emitted_texts.clear()
241
  if txt not in self._emitted_texts:
242
  self._emitted_texts.add(txt)
243
- await self.push_frame(LLMTextFrame(txt))
244
  except Exception as exc: # noqa: BLE001
245
  logger.error(f"LangGraph stream error: {exc}")
246
 
 
33
 
34
  load_dotenv()
35
 
36
+ # TTS sanitize helper: normalize curly quotes/dashes and non-breaking spaces to ASCII
37
+ def _tts_sanitize(text: str) -> str:
38
+ try:
39
+ if not isinstance(text, str):
40
+ text = str(text)
41
+ replacements = {
42
+ "\u2018": "'", # left single quote
43
+ "\u2019": "'", # right single quote / apostrophe
44
+ "\u201C": '"', # left double quote
45
+ "\u201D": '"', # right double quote
46
+ "\u00AB": '"', # left angle quote
47
+ "\u00BB": '"', # right angle quote
48
+ "\u2013": "-", # en dash
49
+ "\u2014": "-", # em dash
50
+ "\u2026": "...",# ellipsis
51
+ "\u00A0": " ", # non-breaking space
52
+ "\u202F": " ", # narrow no-break space
53
+ }
54
+ for k, v in replacements.items():
55
+ text = text.replace(k, v)
56
+ return text
57
+ except Exception:
58
+ return text
59
+
60
  class LangGraphLLMService(OpenAILLMService):
61
  """Pipecat LLM service that delegates responses to a LangGraph agent.
62
 
 
208
  self._emitted_texts.clear()
209
  if part_text not in self._emitted_texts:
210
  self._emitted_texts.add(part_text)
211
+ await self.push_frame(LLMTextFrame(_tts_sanitize(part_text)))
212
 
213
  # Final value-style events (values mode)
214
  if event == "values":
 
228
  self._emitted_texts.clear()
229
  # Emit final explanation as its own message
230
  await self.push_frame(LLMFullResponseStartFrame())
231
+ await self.push_frame(LLMTextFrame(_tts_sanitize(final_text)))
232
  await self.push_frame(LLMFullResponseEndFrame())
233
 
234
  # Messages mode: look for an array of messages
 
251
  self._emitted_texts.clear()
252
  if content not in self._emitted_texts:
253
  self._emitted_texts.add(content)
254
+ await self.push_frame(LLMTextFrame(_tts_sanitize(content)))
255
  except Exception as exc: # noqa: BLE001
256
  logger.debug(f"LangGraph messages parsing error: {exc}")
257
  # If payload is a plain string, emit it
 
264
  self._emitted_texts.clear()
265
  if txt not in self._emitted_texts:
266
  self._emitted_texts.add(txt)
267
+ await self.push_frame(LLMTextFrame(_tts_sanitize(txt)))
268
  except Exception as exc: # noqa: BLE001
269
  logger.error(f"LangGraph stream error: {exc}")
270