mirror of
https://github.com/MervinPraison/PraisonAI.git
synced 2026-11-07 12:47:55 -10:00
fix: fail closed when a BEFORE_LLM rewrite does not end with a user message
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
2660a59589
commit
ae28f537b3
2 files changed
+19
-1
No files matched your search
@@ -2081,8 +2081,13 @@ Your Goal: {self.goal}"""
|
||||
if isinstance(messages[0], dict) and messages[0].get("role") == "system":
|
||||
system = messages.pop(0).get("content")
|
||||
last = messages.pop() if messages else {}
|
||||
if not isinstance(last, dict) or last.get("role") != "user":
|
||||
# ``LLM.get_response`` always sends the prompt as a user turn; fail closed
|
||||
# rather than silently re-role a rewritten assistant/tool message.
|
||||
logging.warning(f"Agent {self.name} BEFORE_LLM rewrite must end with a user message")
|
||||
return llm_kwargs, "[LLM request blocked by hook: rewritten messages must end with a user message]"
|
||||
llm_kwargs = {**llm_kwargs, 'system_prompt': system, 'chat_history': messages,
|
||||
'prompt': last.get("content") if isinstance(last, dict) else last}
|
||||
'prompt': last.get("content")}
|
||||
return llm_kwargs, None
|
||||
|
||||
def _custom_llm_after_input(self, llm_kwargs, response, tally, start_time):
|
||||
|
||||
@@ -122,3 +122,16 @@ def test_before_llm_message_rewrite_reaches_the_provider(calls):
|
||||
assert sent[0]["role"] == "system"
|
||||
assert all("my secret" not in str(m.get("content")) for m in sent)
|
||||
assert any(m.get("content") == "[redacted]" for m in sent)
|
||||
|
||||
|
||||
def test_rewrite_ending_in_non_user_message_fails_closed(calls):
|
||||
registry = HookRegistry()
|
||||
|
||||
def append_assistant(data):
|
||||
messages = list(data.messages) + [{"role": "assistant", "content": "injected"}]
|
||||
return HookResult(decision="allow", modified_input={"messages": messages})
|
||||
|
||||
registry.register_function(HookEvent.BEFORE_LLM, append_assistant, sequential=True)
|
||||
result = _agent(registry).chat("hi")
|
||||
assert calls["n"] == 0
|
||||
assert "must end with a user message" in result
|
||||
Reference in new issue
Block a user