Skip to content

Commit b85df0b

Browse files
authored
Better handle anonymization (#17207)
* Better handle anonymization * Fix tests
1 parent bcc35a6 commit b85df0b

File tree

2 files changed

+22
-39
lines changed

2 files changed

+22
-39
lines changed

litellm/proxy/guardrails/guardrail_hooks/aim/aim.py

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ async def call_aim_guardrail(
117117
self._handle_block_action(res["analysis_result"], required_action)
118118
elif action_type == "anonymize_action":
119119
return self._anonymize_request(
120-
res["analysis_result"], required_action, data
120+
res, data
121121
)
122122
else:
123123
verbose_proxy_logger.error(f"Aim: {action_type} action")
@@ -133,27 +133,18 @@ def _handle_block_action(self, analysis_result: Any, required_action: Any) -> No
133133
raise HTTPException(status_code=400, detail=detection_message)
134134

135135
def _anonymize_request(
136-
self, analysis_result: Any, required_action: Any, data: dict
136+
self, res: Any, data: dict
137137
) -> dict:
138138
verbose_proxy_logger.info("Aim: anonymize action")
139-
redaction_result = required_action and required_action.get(
140-
"chat_redaction_result"
141-
)
142-
if not redaction_result:
139+
redacted_chat = res.get("redacted_chat")
140+
if not redacted_chat:
143141
return data
144-
if analysis_result and analysis_result.get("session_entities"):
145-
self._set_dlp_entities(analysis_result.get("session_entities"))
146142
data["messages"] = [
147-
{
148-
"role": redaction_result["redacted_new_message"]["role"],
149-
"content": redaction_result["redacted_new_message"]["content"],
150-
}
151-
] + [
152143
{
153144
"role": message["role"],
154145
"content": message["content"],
155146
}
156-
for message in redaction_result["all_redacted_messages"]
147+
for message in redacted_chat["all_redacted_messages"]
157148
]
158149
return data
159150

@@ -185,7 +176,11 @@ async def call_aim_guardrail_on_output(
185176
return self._handle_block_action_on_output(
186177
res["analysis_result"], required_action
187178
)
188-
return self._deanonymize_output(output)
179+
redacted_chat = res.get("redacted_chat", None)
180+
181+
if action_type and action_type == "anonymize_action" and redacted_chat:
182+
return {"redacted_output": redacted_chat["all_redacted_messages"][-1]["content"]}
183+
return {"redacted_output": output}
189184

190185
def _handle_block_action_on_output(
191186
self, analysis_result: Any, required_action: Any
@@ -199,15 +194,6 @@ def _handle_block_action_on_output(
199194
)
200195
return {"detection_message": detection_message}
201196

202-
def _deanonymize_output(self, output: str) -> dict | None:
203-
try:
204-
for entity in self.dlp_entities:
205-
output = output.replace(f"[{entity['name']}]", entity["content"])
206-
return {"redacted_output": output}
207-
except Exception as e:
208-
verbose_proxy_logger.error(f"Aim: Error while redacting output: {e}")
209-
return None
210-
211197
def _build_aim_headers(
212198
self,
213199
*,
@@ -323,9 +309,6 @@ async def forward_the_stream_to_aim(
323309
await websocket.send(chunk)
324310
await websocket.send(json.dumps({"done": True}))
325311

326-
def _set_dlp_entities(self, entities: list[dict]) -> None:
327-
self.dlp_entities = entities[: self._max_dlp_entities]
328-
329312
@staticmethod
330313
def get_config_model() -> Optional[Type["GuardrailConfigModel"]]:
331314
from litellm.types.proxy.guardrails.guardrail_hooks.aim import (

tests/local_testing/test_aim_guardrails.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -443,23 +443,23 @@ async def connect_mock(*args, **kwargs):
443443
"required_action": {
444444
"action_type": "anonymize_action",
445445
"policy_name": "PII",
446-
"chat_redaction_result": {
447-
"all_redacted_messages": [
448-
{
449-
"content": "Hi my name is [NAME_1]",
450-
"role": "user",
451-
"additional_contents": [],
452-
"received_message_id": "0",
453-
"extra_fields": {},
454-
}
455-
],
456-
"redacted_new_message": {
446+
},
447+
"redacted_chat": {
448+
"all_redacted_messages": [
449+
{
457450
"content": "Hi my name is [NAME_1]",
458451
"role": "user",
459452
"additional_contents": [],
460453
"received_message_id": "0",
461454
"extra_fields": {},
462-
},
455+
}
456+
],
457+
"redacted_new_message": {
458+
"content": "Hi my name is [NAME_1]",
459+
"role": "user",
460+
"additional_contents": [],
461+
"received_message_id": "0",
462+
"extra_fields": {},
463463
},
464464
},
465465
},

0 commit comments

Comments
 (0)