Enforce shorter AI responses and prevent cut-off sentences
- Reduce max_tokens from 100 to 75 for shorter output - Add truncate_to_complete_sentence() to trim at last punctuation - Applied to both chat and auto-respond paths Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -569,6 +569,25 @@ async def hangup():
|
|||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
def truncate_to_complete_sentence(text: str) -> str:
|
||||||
|
"""Truncate text to the last complete sentence ending with punctuation."""
|
||||||
|
text = text.strip()
|
||||||
|
if not text:
|
||||||
|
return text
|
||||||
|
# If already ends with sentence-ending punctuation, return as-is
|
||||||
|
if text[-1] in '.!?':
|
||||||
|
return text
|
||||||
|
# Find the last sentence-ending punctuation
|
||||||
|
last_period = text.rfind('.')
|
||||||
|
last_excl = text.rfind('!')
|
||||||
|
last_quest = text.rfind('?')
|
||||||
|
last_end = max(last_period, last_excl, last_quest)
|
||||||
|
if last_end > 0:
|
||||||
|
return text[:last_end + 1]
|
||||||
|
# No complete sentence found — add a period
|
||||||
|
return text + '.'
|
||||||
|
|
||||||
|
|
||||||
def clean_for_tts(text: str) -> str:
|
def clean_for_tts(text: str) -> str:
|
||||||
"""Strip out non-speakable content and fix phonetic spellings for TTS"""
|
"""Strip out non-speakable content and fix phonetic spellings for TTS"""
|
||||||
# Remove content in parentheses: (laughs), (pausing), (looking away), etc.
|
# Remove content in parentheses: (laughs), (pausing), (looking away), etc.
|
||||||
@@ -635,6 +654,7 @@ async def chat(request: ChatRequest):
|
|||||||
|
|
||||||
# Clean response for TTS (remove parenthetical actions, asterisks, etc.)
|
# Clean response for TTS (remove parenthetical actions, asterisks, etc.)
|
||||||
response = clean_for_tts(response)
|
response = clean_for_tts(response)
|
||||||
|
response = truncate_to_complete_sentence(response)
|
||||||
|
|
||||||
print(f"[Chat] Cleaned: {response[:100] if response else '(empty)'}...")
|
print(f"[Chat] Cleaned: {response[:100] if response else '(empty)'}...")
|
||||||
|
|
||||||
@@ -1010,6 +1030,7 @@ async def _check_ai_auto_respond(real_caller_text: str, real_caller_name: str):
|
|||||||
system_prompt=system_prompt,
|
system_prompt=system_prompt,
|
||||||
)
|
)
|
||||||
response = clean_for_tts(response)
|
response = clean_for_tts(response)
|
||||||
|
response = truncate_to_complete_sentence(response)
|
||||||
if not response or not response.strip():
|
if not response or not response.strip():
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ class LLMService:
|
|||||||
json={
|
json={
|
||||||
"model": self.openrouter_model,
|
"model": self.openrouter_model,
|
||||||
"messages": messages,
|
"messages": messages,
|
||||||
"max_tokens": 100,
|
"max_tokens": 75,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
|
|||||||
Reference in New Issue
Block a user