Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions pyrit/output/attack_result/markdown.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def __init__(
conversation_printer: MarkdownConversationPrinter | None = None,
score_printer: MarkdownScorePrinter | None = None,
blur_images: bool = False,
blur_radius: int = 20,
blur_radius: int | None = None,
blurred_dir: str | os.PathLike[str] | None = None,
) -> None:
"""
Expand All @@ -45,12 +45,14 @@ def __init__(
blur_images (bool): If True, write a blurred copy of each referenced
image and link to it instead of the original. Forwarded to the default
conversation printer when one is not supplied. Defaults to False.
blur_radius (int): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to 20.
blur_radius (int | None): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to ``DEFAULT_BLUR_RADIUS`` (20).
blurred_dir (str | PathLike | None): Directory to write blurred copies into
when ``blur_images`` is True. Defaults to None (sibling of the original).
"""
super().__init__(sink=sink)
if blur_radius is None:
blur_radius = self.DEFAULT_BLUR_RADIUS
self._display_inline = display_inline
self._score_printer = score_printer or MarkdownScorePrinter(sink=sink)
self._conversation_printer = conversation_printer or MarkdownConversationPrinter(
Expand Down Expand Up @@ -342,7 +344,7 @@ def __init__(
sink: Sink | None = None,
display_inline: bool = True,
blur_images: bool = False,
blur_radius: int = 20,
blur_radius: int | None = None,
blurred_dir: str | os.PathLike[str] | None = None,
) -> None:
"""
Expand All @@ -354,8 +356,8 @@ def __init__(
All output is routed through the sink. Defaults to True.
blur_images (bool): If True, write a blurred copy of each referenced
image and link to it instead of the original. Defaults to False.
blur_radius (int): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to 20.
blur_radius (int | None): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to ``DEFAULT_BLUR_RADIUS`` (20).
blurred_dir (str | PathLike | None): Directory to write blurred copies into.
Defaults to None (sibling of the original).
"""
Expand Down
24 changes: 14 additions & 10 deletions pyrit/output/attack_result/pretty.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,20 @@ def __init__(
self,
*,
sink: Sink | None = None,
width: int = 100,
width: int | None = None,
indent_size: int = 2,
enable_colors: bool = True,
conversation_printer: PrettyConversationPrinter | None = None,
score_printer: PrettyScorePrinter | None = None,
blur_images: bool = False,
blur_radius: int = 20,
blur_radius: int | None = None,
) -> None:
"""
Initialize the pretty printer.

Args:
sink (Sink | None): Output sink. Defaults to StdoutSink().
width (int): Maximum width for text wrapping. Defaults to 100.
width (int | None): Maximum width for text wrapping. Defaults to ``DEFAULT_WIDTH`` (100).
indent_size (int): Number of spaces for indentation. Defaults to 2.
enable_colors (bool): Whether to enable ANSI color output. Defaults to True.
conversation_printer (PrettyConversationPrinter | None): Conversation printer.
Expand All @@ -49,10 +49,14 @@ def __init__(
blur_images (bool): If True, apply a Gaussian blur to image outputs before
displaying them. Forwarded to the default conversation printer when one
is not supplied. Defaults to False.
blur_radius (int): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to 20.
blur_radius (int | None): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to ``DEFAULT_BLUR_RADIUS`` (20).
"""
super().__init__(sink=sink)
if width is None:
width = self.DEFAULT_WIDTH
if blur_radius is None:
blur_radius = self.DEFAULT_BLUR_RADIUS
self._width = width
self._indent = " " * indent_size
self._enable_colors = enable_colors
Expand Down Expand Up @@ -461,24 +465,24 @@ def __init__(
self,
*,
sink: Sink | None = None,
width: int = 100,
width: int | None = None,
indent_size: int = 2,
enable_colors: bool = True,
blur_images: bool = False,
blur_radius: int = 20,
blur_radius: int | None = None,
) -> None:
"""
Initialize the pretty printer with CentralMemory data source.

Args:
sink (Sink | None): Output sink. Defaults to StdoutSink().
width (int): Maximum width for text wrapping. Defaults to 100.
width (int | None): Maximum width for text wrapping. Defaults to ``DEFAULT_WIDTH`` (100).
indent_size (int): Number of spaces for indentation. Defaults to 2.
enable_colors (bool): Whether to enable ANSI color output. Defaults to True.
blur_images (bool): If True, apply a Gaussian blur to image outputs before
displaying them. Defaults to False.
blur_radius (int): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to 20.
blur_radius (int | None): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to ``DEFAULT_BLUR_RADIUS`` (20).
"""
from pyrit.memory import CentralMemory
from pyrit.output.conversation.pretty import PrettyConversationMemoryPrinter
Expand Down
5 changes: 4 additions & 1 deletion pyrit/output/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Licensed under the MIT license.

from abc import ABC, abstractmethod
from typing import Any
from typing import Any, ClassVar

from pyrit.output.sink import Sink, StdoutSink

Expand All @@ -16,6 +16,9 @@ class PrinterBase(ABC):
the result through the configured sink.
"""

DEFAULT_WIDTH: ClassVar[int] = 100
DEFAULT_BLUR_RADIUS: ClassVar[int] = 20

def __init__(self, *, sink: Sink | None = None) -> None:
"""
Initialize the printer base.
Expand Down
14 changes: 8 additions & 6 deletions pyrit/output/conversation/markdown.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def __init__(
sink: Sink | None = None,
score_printer: MarkdownScorePrinter | None = None,
blur_images: bool = False,
blur_radius: int = 20,
blur_radius: int | None = None,
blurred_dir: str | os.PathLike[str] | None = None,
) -> None:
"""
Expand All @@ -44,14 +44,16 @@ def __init__(
Note: blurred files are cached by path. If the original image content
changes but the blurred file already exists, the stale blurred copy
is reused. Callers are responsible for cleaning up blurred artifacts.
blur_radius (int): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to 20.
blur_radius (int | None): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to ``DEFAULT_BLUR_RADIUS`` (20).
blurred_dir (str | PathLike | None): Directory to write blurred copies into.
When None (default), blurred files are written as ``<stem>_blurred.png``
next to the original. When set, blurred files are written under this
directory using the original basename plus ``_blurred.png``.
"""
super().__init__(sink=sink)
if blur_radius is None:
blur_radius = self.DEFAULT_BLUR_RADIUS
self._score_printer = score_printer or MarkdownScorePrinter(sink=sink)
self._blur_images = blur_images
self._blur_radius = blur_radius
Expand Down Expand Up @@ -385,7 +387,7 @@ def __init__(
sink: Sink | None = None,
score_printer: MarkdownScorePrinter | None = None,
blur_images: bool = False,
blur_radius: int = 20,
blur_radius: int | None = None,
blurred_dir: str | os.PathLike[str] | None = None,
) -> None:
"""
Expand All @@ -396,8 +398,8 @@ def __init__(
score_printer (MarkdownScorePrinter | None): Score printer for inline score rendering.
blur_images (bool): If True, write a blurred copy next to each image and
link to it instead of the original. Defaults to False.
blur_radius (int): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to 20.
blur_radius (int | None): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to ``DEFAULT_BLUR_RADIUS`` (20).
blurred_dir (str | PathLike | None): Directory to write blurred copies into.
Defaults to None (sibling of the original).
"""
Expand Down
24 changes: 14 additions & 10 deletions pyrit/output/conversation/pretty.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,30 +27,34 @@ def __init__(
self,
*,
sink: Sink | None = None,
width: int = 100,
width: int | None = None,
indent_size: int = 2,
enable_colors: bool = True,
score_printer: PrettyScorePrinter | None = None,
blur_images: bool = False,
blur_radius: int = 20,
blur_radius: int | None = None,
) -> None:
"""
Initialize the pretty conversation printer.

Args:
sink (Sink | None): Output sink. Defaults to StdoutSink().
width (int): Maximum width for text wrapping. Defaults to 100.
width (int | None): Maximum width for text wrapping. Defaults to ``DEFAULT_WIDTH`` (100).
indent_size (int): Number of spaces for indentation. Defaults to 2.
enable_colors (bool): Whether to enable ANSI color output. Defaults to True.
score_printer (PrettyScorePrinter | None): Score printer for inline score rendering.
Defaults to a new PrettyScorePrinter with matching settings.
blur_images (bool): If True, apply a Gaussian blur to image outputs before
displaying them. Useful for reducing reviewer exposure to unsafe imagery
while still allowing the general content to be inspected. Defaults to False.
blur_radius (int): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to 20.
blur_radius (int | None): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to ``DEFAULT_BLUR_RADIUS`` (20).
"""
super().__init__(sink=sink)
if width is None:
width = self.DEFAULT_WIDTH
if blur_radius is None:
blur_radius = self.DEFAULT_BLUR_RADIUS
self._width = width
self._indent = " " * indent_size
self._enable_colors = enable_colors
Expand Down Expand Up @@ -254,26 +258,26 @@ def __init__(
self,
*,
sink: Sink | None = None,
width: int = 100,
width: int | None = None,
indent_size: int = 2,
enable_colors: bool = True,
score_printer: PrettyScorePrinter | None = None,
blur_images: bool = False,
blur_radius: int = 20,
blur_radius: int | None = None,
) -> None:
"""
Initialize the pretty conversation printer with CentralMemory data source.

Args:
sink (Sink | None): Output sink. Defaults to StdoutSink().
width (int): Maximum width for text wrapping. Defaults to 100.
width (int | None): Maximum width for text wrapping. Defaults to ``DEFAULT_WIDTH`` (100).
indent_size (int): Number of spaces for indentation. Defaults to 2.
enable_colors (bool): Whether to enable ANSI color output. Defaults to True.
score_printer (PrettyScorePrinter | None): Score printer for inline score rendering.
blur_images (bool): If True, apply a Gaussian blur to image outputs before
displaying them. Defaults to False.
blur_radius (int): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to 20.
blur_radius (int | None): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to ``DEFAULT_BLUR_RADIUS`` (20).
"""
super().__init__(
sink=sink,
Expand Down
12 changes: 6 additions & 6 deletions pyrit/output/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ async def output_attack_async(
include_pruned_conversations: bool = False,
include_adversarial_conversation: bool = False,
blur_images: bool = False,
blur_radius: int = 20,
blur_radius: int | None = None,
blurred_dir: str | os.PathLike[str] | None = None,
) -> None:
"""
Expand All @@ -56,8 +56,8 @@ async def output_attack_async(
is logged and a plain-text link to the original is emitted instead of an
inline image — the original is not silently rendered.
Defaults to False.
blur_radius (int): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to 20.
blur_radius (int | None): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to ``PrinterBase.DEFAULT_BLUR_RADIUS`` (20).
blurred_dir (str | PathLike | None): For "markdown" output, directory to write
blurred copies into. Defaults to None (sibling of the original). Ignored
when ``format != "markdown"``.
Expand Down Expand Up @@ -152,7 +152,7 @@ async def output_conversation_async(
include_scores: bool = False,
include_reasoning_trace: bool = False,
blur_images: bool = False,
blur_radius: int = 20,
blur_radius: int | None = None,
) -> None:
"""
Print a conversation message history in the specified format.
Expand All @@ -171,8 +171,8 @@ async def output_conversation_async(
not to enforce access control. If blurring fails for any reason, a warning
is logged and the original is shown (pretty path only).
Defaults to False.
blur_radius (int): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to 20.
blur_radius (int | None): Gaussian blur radius applied when ``blur_images`` is True.
Defaults to ``PrinterBase.DEFAULT_BLUR_RADIUS`` (20).

Raises:
ValueError: If ``format`` is not a supported value.
Expand Down
10 changes: 6 additions & 4 deletions pyrit/output/scenario_result/pretty.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def __init__(
self,
*,
sink: Sink | None = None,
width: int = 100,
width: int | None = None,
indent_size: int = 2,
enable_colors: bool = True,
scorer_printer: ScorerPrinterBase | None = None,
Expand All @@ -36,7 +36,7 @@ def __init__(

Args:
sink (Sink | None): Output sink. Defaults to StdoutSink().
width (int): Maximum width for text wrapping. Defaults to 100.
width (int | None): Maximum width for text wrapping. Defaults to ``DEFAULT_WIDTH`` (100).
indent_size (int): Number of spaces for indentation. Defaults to 2.
enable_colors (bool): Whether to enable ANSI color output. Defaults to True.
scorer_printer (ScorerPrinterBase | None): Scorer printer for rendering scorer
Expand All @@ -47,6 +47,8 @@ def __init__(
preserves insertion order.
"""
super().__init__(sink=sink)
if width is None:
width = self.DEFAULT_WIDTH
self._width = width
self._indent = " " * indent_size
self._enable_colors = enable_colors
Expand Down Expand Up @@ -267,7 +269,7 @@ def __init__(
self,
*,
sink: Sink | None = None,
width: int = 100,
width: int | None = None,
indent_size: int = 2,
enable_colors: bool = True,
sort_groups_by_success_rate: bool = False,
Expand All @@ -277,7 +279,7 @@ def __init__(

Args:
sink (Sink | None): Output sink. Defaults to StdoutSink().
width (int): Maximum width for text wrapping. Defaults to 100.
width (int | None): Maximum width for text wrapping. Defaults to ``DEFAULT_WIDTH`` (100).
indent_size (int): Number of spaces for indentation. Defaults to 2.
enable_colors (bool): Whether to enable ANSI color output. Defaults to True.
sort_groups_by_success_rate (bool): When True, the Per-Group Breakdown is sorted
Expand Down
6 changes: 4 additions & 2 deletions pyrit/output/score/pretty.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,20 @@ class PrettyScorePrinter(PrinterBase):
"""

def __init__(
self, *, sink: Sink | None = None, width: int = 100, indent_size: int = 2, enable_colors: bool = True
self, *, sink: Sink | None = None, width: int | None = None, indent_size: int = 2, enable_colors: bool = True
) -> None:
"""
Initialize the pretty score printer.

Args:
sink (Sink | None): Output sink. Defaults to StdoutSink().
width (int): Maximum width for text wrapping. Defaults to 100.
width (int | None): Maximum width for text wrapping. Defaults to ``DEFAULT_WIDTH`` (100).
indent_size (int): Number of spaces for indentation. Defaults to 2.
enable_colors (bool): Whether to enable ANSI color output. Defaults to True.
"""
super().__init__(sink=sink)
if width is None:
width = self.DEFAULT_WIDTH
self._width = width
self._indent = " " * indent_size
self._enable_colors = enable_colors
Expand Down
Loading