Spaces:
Sleeping
Sleeping
| """Devil's Advocate agent: 1st-person worst-case scenario for a flagged clause.""" | |
| from __future__ import annotations | |
| import logging | |
| from typing import ClassVar | |
| from app.agents.base import BaseAgent | |
| from app.schemas import AgentName, Clause | |
| logger = logging.getLogger(__name__) | |
| class DevilAdvocateAgent(BaseAgent): | |
| name: ClassVar[AgentName] = "devil_advocate" | |
| prompt_file: ClassVar[str] = "devil" | |
| async def run(self, clause: Clause) -> str: | |
| user_prompt = _format_prompt(clause) | |
| response = await self._call( | |
| user_prompt, | |
| max_tokens=350, | |
| temperature=0.4, | |
| clause_id=clause.id, | |
| log_label=f"severity={clause.severity}", | |
| ) | |
| scenario = response.text.strip().strip("`").strip('"').strip() | |
| if scenario: | |
| self._emit_message(f"[Worst case] {scenario}", clause_id=clause.id) | |
| return scenario | |
| def _format_prompt(clause: Clause) -> str: | |
| return ( | |
| f"Clause type: {clause.type}\n" | |
| f"Severity assigned by Risk Analyst: {clause.severity}\n" | |
| f"Risk Analyst's rationale: {clause.rationale}\n\n" | |
| f"<clause>\n{clause.text}\n</clause>\n\n" | |
| "Now write the worst-case scenario paragraph described in your role instructions." | |
| ) | |