feat: add sanitize_notes() method to LLMClient
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -977,6 +977,51 @@ class LLMClient:
|
|||||||
"profile_update": profile_update,
|
"profile_update": profile_update,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async def sanitize_notes(self, notes: str) -> str:
|
||||||
|
"""Rewrite user notes to remove any quoted toxic/offensive language.
|
||||||
|
|
||||||
|
Returns the sanitized notes string, or the original on failure.
|
||||||
|
"""
|
||||||
|
if not notes or len(notes.strip()) == 0:
|
||||||
|
return notes
|
||||||
|
|
||||||
|
system_prompt = (
|
||||||
|
"Rewrite the following user behavior notes. Remove any quoted offensive language, "
|
||||||
|
"slurs, or profanity. Replace toxic quotes with abstract descriptions of the behavior "
|
||||||
|
"(e.g. 'directed a personal insult at another user' instead of quoting the insult). "
|
||||||
|
"Preserve all non-toxic observations, timestamps, and behavioral patterns exactly. "
|
||||||
|
"Return ONLY the rewritten notes, nothing else."
|
||||||
|
)
|
||||||
|
user_content = notes
|
||||||
|
if self._no_think:
|
||||||
|
user_content += "\n/no_think"
|
||||||
|
|
||||||
|
t0 = time.monotonic()
|
||||||
|
async with self._semaphore:
|
||||||
|
try:
|
||||||
|
temp_kwargs = {"temperature": 0.1} if self._supports_temperature else {}
|
||||||
|
response = await self._client.chat.completions.create(
|
||||||
|
model=self.model,
|
||||||
|
messages=[
|
||||||
|
{"role": "system", "content": system_prompt},
|
||||||
|
{"role": "user", "content": user_content},
|
||||||
|
],
|
||||||
|
**temp_kwargs,
|
||||||
|
max_completion_tokens=1024,
|
||||||
|
)
|
||||||
|
elapsed = int((time.monotonic() - t0) * 1000)
|
||||||
|
result = response.choices[0].message.content
|
||||||
|
if result and result.strip():
|
||||||
|
self._log_llm("sanitize_notes", elapsed, True, notes[:300], result[:300])
|
||||||
|
return result.strip()
|
||||||
|
self._log_llm("sanitize_notes", elapsed, False, notes[:300], error="Empty response")
|
||||||
|
return notes
|
||||||
|
except Exception as e:
|
||||||
|
elapsed = int((time.monotonic() - t0) * 1000)
|
||||||
|
logger.error("LLM sanitize_notes error: %s", e)
|
||||||
|
self._log_llm("sanitize_notes", elapsed, False, notes[:300], error=str(e))
|
||||||
|
return notes
|
||||||
|
|
||||||
async def analyze_image(
|
async def analyze_image(
|
||||||
self,
|
self,
|
||||||
image_bytes: bytes,
|
image_bytes: bytes,
|
||||||
|
|||||||
Reference in New Issue
Block a user