FEAT: Chain-of-Thought Rendering for Attack Results - #2269
Conversation
There was a problem hiding this comment.
Pull request overview
Adds opt-in provider reasoning-summary rendering across conversation, attack-result, and scenario-result output.
Changes:
- Parses and validates OpenAI reasoning-summary payloads.
- Adds pretty and Markdown rendering with reasoning hidden by default.
- Propagates reasoning options through helpers and adds unit coverage.
Reviewed changes
Copilot reviewed 15 out of 15 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
pyrit/output/conversation/base.py |
Adds reasoning filtering and parsing. |
pyrit/output/conversation/pretty.py |
Renders pretty reasoning blocks. |
pyrit/output/conversation/markdown.py |
Renders Markdown reasoning blocks. |
pyrit/output/attack_result/base.py |
Extends the rendering contract. |
pyrit/output/attack_result/pretty.py |
Propagates reasoning through pretty output. |
pyrit/output/attack_result/markdown.py |
Propagates reasoning through Markdown output. |
pyrit/output/scenario_result/base.py |
Extends the scenario rendering contract. |
pyrit/output/scenario_result/pretty.py |
Adds scenario-level reasoning output. |
pyrit/output/helpers.py |
Exposes reasoning options in helpers. |
tests/unit/output/conftest.py |
Adds shared reasoning fixtures. |
tests/unit/output/conversation/test_reasoning.py |
Tests parsing, visibility, and formatting. |
tests/unit/output/attack_result/test_pretty.py |
Tests pretty attack reasoning. |
tests/unit/output/attack_result/test_markdown.py |
Tests Markdown attack reasoning. |
tests/unit/output/scenario_result/test_pretty.py |
Tests scenario reasoning output. |
tests/unit/output/test_helpers.py |
Tests helper argument forwarding. |
…c to _render_attack_reasoning_summaries_async for clarity.
…://github.com/ValbuenaVC/PyRIT into vvalbuena-microsoft-plan-cot-output-rendering Merge latest changes from main.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 17 out of 17 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
pyrit/output/scenario_result/pretty.py:341
- When scenario reasoning is enabled, this nested attack printer renders each full objective conversation, and
PrettyConversationMemoryPrinterdisplays everyimage_pathpiece in notebooks. Because this printer is always created with its defaultblur_images=Falseandoutput_scenario_asyncexposes no blur option, requesting reasoning summaries can unexpectedly display unblurred attack images with no way for callers to opt into the safety control available onoutput_attack_async. Please either render only the reasoning blocks or plumb the image-blur settings through the scenario API and nested printer.
attack_result_printer = PrettyAttackResultMemoryPrinter(
sink=sink,
width=width,
indent_size=indent_size,
enable_colors=enable_colors,
)
behnam-o
left a comment
There was a problem hiding this comment.
Looks great! I just have these two comments, one about whether scenario results should even expose this feature and another about how we seem to silently just not print a reasoning section if the model hasn't "reasoned" (I think in that case, it's good to expose/render this fact rather than treating it the same as if the model does not "support/generate" reasoning at all)
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…://github.com/ValbuenaVC/PyRIT into vvalbuena-microsoft-plan-cot-output-rendering Resolve merge confict. Adds documentation update to remote.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
plans to add this to the scanner ? |
Co-authored-by: hannahwestra25 <hannahwestra@microsoft.com>
…://github.com/ValbuenaVC/PyRIT into vvalbuena-microsoft-plan-cot-output-rendering Merging in remote changes from PR review.
Not unless you feel it belongs there. Do users want to see the full reasoning trace during a scanner run? I'm not opposed to it, but I assumed the answer was no, though I may be wrong. |
…and applied example to OpenAI responses documentation.
…://github.com/ValbuenaVC/PyRIT into vvalbuena-microsoft-plan-cot-output-rendering Merge in latest changes from main.
…or valid reasoning responses with no contents.
…king reasoning error checking

Description
Adds opt-in rendering of OpenAI Responses API reasoning summaries across PyRIT’s output layer.
This PR:
include_reasoning_summaries=Falseto conversation and attack-result APIs.No breaking behavior is introduced because reasoning remains opt-in.
Background and Scope
The original story also requested investigation into JSON Schema adoption for scorers and attacks.
That infrastructure and adoption already landed through:
Schemas remain domain-specific; this PR does not introduce a universal response schema or change target/scorer/attack semantics.
CoPyRIT already maps persisted reasoning pieces into its existing Reasoning panel and has mapper/component test coverage. This PR adds the missing PyRIT output parity. CoPyRIT currently has no scenario-results UI, so scenario frontend rendering is outside this PR.
Tests and Documentation
Added or expanded unit coverage for:
Local results:
171 passedpyrit.output:98%statement coverageUpdated the paired output documentation with conversation, attack, and scenario examples and clarification that OpenAI exposes summaries rather than raw chain-of-thought.