Source code for pyrit.orchestrator.models.orchestrator_result
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
import logging
from typing import Literal
from colorama import Fore, Style
from pyrit.common.display_response import display_image_response
from pyrit.memory import CentralMemory
from pyrit.models import Score
logger = logging.getLogger(__name__)
OrchestratorResultStatus = Literal["success", "failure", "pruned", "adversarial_generation", "in_progress", "error"]
[docs]
class OrchestratorResult:
"""The result of an orchestrator."""
[docs]
def __init__(
self,
conversation_id: str,
objective: str,
status: OrchestratorResultStatus = "in_progress",
score: Score = None,
confidence: float = 0.1,
):
self.conversation_id = conversation_id
self.objective = objective
self.status = status
self.score = score
self.confidence = confidence
self._memory = CentralMemory.get_memory_instance()
[docs]
async def print_conversation_async(self):
"""Prints the conversation between the objective target and the adversarial chat, including the scores.
Args:
prompt_target_conversation_id (str): the conversation ID for the prompt target.
"""
target_messages = self._memory.get_conversation(conversation_id=self.conversation_id)
if not target_messages or len(target_messages) == 0:
print("No conversation with the target")
return
if self.status == "success":
print(
f"{Style.BRIGHT}{Fore.RED}The multi-turn orchestrator has completed the conversation and achieved "
f"the objective: {self.objective}"
)
elif self.status == "failure":
print(
f"{Style.BRIGHT}{Fore.RED}The multi-turn orchestrator has not achieved the objective: "
f"{self.objective}"
)
else:
print(
f"{Style.BRIGHT}{Fore.RED}The multi-turn orchestrator with objective: {self.objective} "
f"has ended with status: {self.status}"
)
return
for message in target_messages:
for piece in message.request_pieces:
if piece.role == "user":
print(f"{Style.BRIGHT}{Fore.BLUE}{piece.role}:")
if piece.converted_value != piece.original_value:
print(f"Original value: {piece.original_value}")
print(f"Converted value: {piece.converted_value}")
else:
print(f"{Style.NORMAL}{Fore.YELLOW}{piece.role}: {piece.converted_value}")
await display_image_response(piece)
if self.score:
print(f"{Style.RESET_ALL}score: {self.score} : {self.score.score_rationale}")