refactor: standardize developer text and identifiers in English
This commit is contained in:
@@ -196,7 +196,7 @@ class ChatCompletionsApiModelHandler(BaseOpenAICompatibleHandler):
|
||||
if self.stream:
|
||||
create_kwargs["stream_options"] = {"include_usage": True}
|
||||
|
||||
# Svuota i parametri dei tool per evitare il blocco 400 di NVIDIA NIM
|
||||
# Remove tool parameters to avoid NVIDIA NIM's HTTP 400 response.
|
||||
create_kwargs.pop("tools", None)
|
||||
create_kwargs.pop("tool_choice", None)
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ LLM Output Processor
|
||||
Intercepts LLM output to:
|
||||
1. Extract tool calls and send them via text_output_queue
|
||||
2. Forward clean text to TTS pipeline
|
||||
3. 2026-09-25: SANITIZE APIPILOT internal markers before clients / TTS (anti-leak tecnico)
|
||||
3. Sanitize ApiPilot internal markers before sending output to clients or TTS
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -17,16 +17,15 @@ from queue import Queue
|
||||
from speech_to_speech.baseHandler import BaseHandler
|
||||
from speech_to_speech.pipeline.events import AssistantTextEvent, ResponseFailedEvent, TokenUsageEvent
|
||||
|
||||
# 2026-09-25 SANITIZE APIPILOT CALL/RESULT markers in LLM output BEFORE:
|
||||
# (a) AssistantTextEvent viene mandato ai client WS (e loggato come <<< TEXT:/ASSISTANT:)
|
||||
# (b) TTSInput viene mandato a Qwen3-TTS (che lo pronuncerebbe ad alta voce).
|
||||
# Formati osservati reali oggi (upstream Vocero start_pipeline_rag):
|
||||
# 1) <<<APIPILOT_CALL:NAME=tool,ARGUMENTS=json>>> standard 3x
|
||||
# Sanitize ApiPilot CALL/RESULT markers before emitting AssistantTextEvent
|
||||
# to WebSocket clients or TTSInput to Qwen3-TTS, which would speak the markers.
|
||||
# Observed formats from upstream Vocero start_pipeline_rag:
|
||||
# 1) <<<APIPILOT_CALL:NAME=tool,ARGUMENTS=json>>> standard triple brackets
|
||||
# 2) <APIPILOT_CALL:NAME=get_user_briefing,ARGUMENTS={"format":"voice"}
|
||||
# singolo '<' '>' + args inventati da AI (format=voice)
|
||||
# 3) <<<APIPILOT_CALL:...}> \n>> spezzato multi-riga
|
||||
# 4) >>>APIPILOT_CALL:...<<< invertito (errore sintassi AI)
|
||||
# 5) <<<APIPILOT_RESULT:PASS2>>> + blocco result.
|
||||
# single brackets and model-generated arguments
|
||||
# 3) <<<APIPILOT_CALL:...}> \n>> split across lines
|
||||
# 4) >>>APIPILOT_CALL:...<<< inverted brackets
|
||||
# 5) <<<APIPILOT_RESULT:PASS2>>> followed by a result block
|
||||
_APIPILOT_CALL_NORM = re.compile(
|
||||
r"[<]{1,3}\s*APIPILOT_CALL:NAME=([A-Za-z0-9_.-]+),ARGUMENTS=(.*?)[>]{1,3}",
|
||||
re.IGNORECASE | re.DOTALL,
|
||||
@@ -64,7 +63,7 @@ def _sanitize_apipilot_before_client_and_tts(text: str) -> tuple[str, bool, str]
|
||||
if _APIPILOT_RESULT.search(new_text):
|
||||
new_text = _APIPILOT_RESULT.sub(" ", new_text)
|
||||
found_result = True
|
||||
# safety catchall frammenti marker senza wrapper (se marker troncato mid-stream)
|
||||
# Catch marker fragments without a wrapper, including mid-stream truncation.
|
||||
low = new_text.lower()
|
||||
if "apipilot" in low and ("call" in low or "result" in low or "name=" in low or "arguments=" in low):
|
||||
new_text = re.sub(r"(?i)\bAPIPILOT(?:_CALL|_RESULT)?\b", " ", new_text)
|
||||
@@ -184,8 +183,8 @@ class LMOutputProcessor(BaseHandler[LLMOut, TTSIn]):
|
||||
|
||||
logger.debug(f"LM processor: text='{lm_output.text}', tools={lm_output.tools}")
|
||||
|
||||
# 2026-09-25 SANITIZE SINGOLO PUNTO CENTRALE: PRIMA di AssistantTextEvent (client/log)
|
||||
# E PRIMA di TTSInput (Qwen3-TTS che pronuncerebbe marker APIPILOT CALL).
|
||||
# Sanitize centrally before AssistantTextEvent and TTSInput so neither
|
||||
# clients nor Qwen3-TTS receive internal ApiPilot markers.
|
||||
clean_text = lm_output.text
|
||||
any_sanitized = False
|
||||
sanitize_tag = ""
|
||||
@@ -193,14 +192,14 @@ class LMOutputProcessor(BaseHandler[LLMOut, TTSIn]):
|
||||
clean_text, any_sanitized, sanitize_tag = _sanitize_apipilot_before_client_and_tts(clean_text)
|
||||
if any_sanitized:
|
||||
logger.warning(
|
||||
"[LM-OUTPUT-APIPILOT-SANITIZE] %s — tool=%s rawLen=%d cleanLen=%d (rimosso / sostituito con placeholder spagnolo PRIMA di client + TTS).",
|
||||
"[LM-OUTPUT-APIPILOT-SANITIZE] %s — tool=%s rawLen=%d cleanLen=%d (removed or replaced with the Spanish placeholder before client/TTS output).",
|
||||
sanitize_tag or "-",
|
||||
(sanitize_tag if sanitize_tag else "marker"),
|
||||
len(lm_output.text or ""),
|
||||
len(clean_text or ""),
|
||||
)
|
||||
# evita che lo stesso chunk (marker solo) arrivi a TTS come "" → Hello.
|
||||
# Se dopo sanitize testo vuoto MA avevamo trovato marker → placeholder.
|
||||
# Use the placeholder when sanitization removes the entire chunk,
|
||||
# avoiding empty text that would trigger the TTS greeting fallback.
|
||||
if not clean_text.strip():
|
||||
clean_text = _APIPILOT_SPANISH_PLACEHOLDER
|
||||
|
||||
|
||||
Reference in New Issue
Block a user