Repository navigation
PyRIT v1.2.0
What's changed?
PyRIT v1.2.0 delivers a major upgrade to the CoPyRIT GUI, making it easier to launch, monitor, compare, and report on security assessments. Reusable scenario configurations, grouped launches, persistent engagements and findings, and richer result analytics turn individual scans into repeatable, reviewable workflows. The release also expands attack techniques, targets, converters, datasets, and scoring options.
Python support is now >=3.11, <3.15.
🌟 Highlights
- A major CoPyRIT GUI update brings scan launch, live progress, history, scoring, comparison, and review into one workflow.
- Scenario presets and suites make assessments reusable and allow related scenario configurations to be launched together.
- Operations and Findings organize engagements, capture human-reviewed issues and evidence, and support reporting.
- New attacks and targets expand coverage with GOAT, role-play and jailbreak techniques, A2A, HackAPrompt, and GitHub Copilot.
- More scoring and benchmark options add ASSERT, Microsoft decision-model scoring, local scorers, and several major datasets.
- Improved reliability and security strengthen execution cleanup, resume behavior, validation, authorization, and persistence.
🤝 Community contributions
Community contributors drove a substantial part of this release: 108 external contributors authored 507 merged pull requests—58% of the 882 release pull requests identified from the release cut. Thank you to everyone who contributed features, datasets, tests, documentation, bug fixes, and reviews to PyRIT v1.2.0. See the New Contributors section below.
⚠️ Breaking changes
- Python 3.10 is no longer supported. Upgrade to Python 3.11–3.14 before installing PyRIT 1.2.0.
- Backend and client artifacts must match exactly. Compatibility-enforcing CoPyRIT backends reject CLI or browser clients built from a different source commit, even when the package version matches. Deploy the backend, frontend, and CLI from the same source commit, and do not roll back below the first compatibility-enforcing backend while newer clients remain active (#2829).
- Scenario construction and dataset configuration changed. Custom scenarios must use the current parameter/context APIs and argument-free
initialize_async(). Dataset selection now uses explicit sources, fetch policies, and limits; use"all"rather thanNonefor unlimited selection (#3404, #2956, #2849, #2904, #3143). - Backend scenario reads are async-only. Integrations using synchronous scenario-read methods must migrate to and await the asynchronous APIs (#2953).
- Custom
MessageScorersubclasses must use the expectation-aware scoring hook. Replace overrides of_score_piece_async(..., objective=...)with_score_piece_with_expectation_async(..., expectation=...)and read scoring context from the expectation (#3312). - The Gandalf target and scorer were removed. Remove imports and configuration references, and migrate to another supported or custom target/scorer (#3467).
- Some API target creation now requires administrator access. Non-admin users can no longer create targets that use server-stored credentials or execute model-repository code; use an administrator-created target or caller-provided credentials where supported (#3247, #3173).
- API-created HTTP target uploads now use a server-selected folder. Callers must use the returned server location rather than relying on a requested upload path (#3172).
🧩 Framework, scenarios, and analytics
- Added scenario presets—named, reusable configurations for one scenario—and scenario suites, which group ordered preset references for one-click launch and GUI editing (#3490, #2931, #3407).
- Added explicit scenario dataset sources, limits, and generation providers across the SDK, CLI, and GUI (#2956, #3116, #3143).
- Added structured run-size bounds, clearer progress roles, role-aware attempt accounting, and parent/child result browsing (#2739, #2997, #3062, #3611).
- Added persistent Operations for grouping assessment activity and Findings for recording human-reviewed issues with linked attack evidence. Added attack analytics, saved-result analysis in CoPyRIT, and findings export to Word and Markdown (#3066, #3059, #3149, #3168, #3493).
- Added
technique.executefor running one technique directly against an objective (#3118).
⚔️ Attacks, targets, and converters
- Added GOAT, context-wrap, character-split, tool role-play, and multi-turn jailbreak-delivery techniques (#2763, #3549, #3381, #3584, #3657).
- Added GCG capability preflight checks before workers start (#3338).
- Added A2A and HackAPrompt targets, a GitHub Copilot SDK target, and pluggable tools for the OpenAI Responses target (#2771, #2801, #2828, #2718).
- Added a no-key authentication mode for OpenAI-compatible targets (#3809).
- Added
PromptTemplateConverter, nested and multiple conversion markers, multimodal chat pipelines, grid composition, image steganography, and configurable URL safety (#2845, #3002, #2699, #2936, #3256, #3402).
📊 Scoring and evaluation
- Added seed scoring expectations and an observation lifecycle for surface scoring (#2738, #3156).
- Added standalone ASSERT conversation scoring, native ASSERT prompt generation, Microsoft decision-model scoring, and explicit true/false verdict setting (#3539, #3271, #3188, #3317).
- Added local CPU refusal and violence scorers, agent-threat rules, known-bad signature detection, and message tool-call scoring (#2772, #2626, #2624, #3009, #2854).
- Expanded credential-leak and shell-command detection and improved scorer evaluation reporting for abstentions and coverage (#3286, #3832, #2860).
- Fixed score inversion, rationale preservation, category matching, invalid thresholds, and malformed or out-of-range judge scores.
📚 Datasets and benchmarks
- Added CyberSecEval prompt-injection and MITRE datasets, Anthropic model-written evaluations, MASK, HarmEval, FORTRESS, and SemGuard Arabic datasets (#3419, #3028, #2986, #1904, #2794, #1805, #2468).
- Expanded Garak and privacy-leakage benchmark coverage.
- Added dataset catalog navigation, paginated seed browsing, media previews, and import of dataset prompts and conversations into chat (#3071, #2989, #3251, #3670).
🖥️ GUI, CLI, and backend
- Added a workflow-focused Home experience with scan results, live chats, latest-response scoring, consolidated history, contextual help, automatic refresh, and an expandable sidebar (#3642, #3643, #3644, #3645, #3646, #3649, #3650).
- Added paired outcome comparison, scorer and technique registries, improved conversation branching, and saved chat drafts (#3337, #3408, #3187).
- Added JSON and HTML report formats and output-file generation (#2733).
- Added dataset summary APIs and exposed the scorer registry through the backend API (#2762, #2990).
- Improved GUI result consistency, draft preservation, preset-save behavior, loading states, and history navigation.
🛠️ Reliability and operations
- Improved scenario cancellation, resume behavior, worker shutdown, nested task cleanup, and concurrent-run/attempt accounting (#2851, #2857, #2856, #2695, #3774).
- Added request-size, field-length, and path-parameter validation for backend-created components (#2960, #3594, #3595).
- Improved SQLite cancellation cleanup, findings-export pagination safety, media conversion cleanup, and image/audio/video edge-case handling (#2982, #4008, #3836, #3240).
- Declared
aiohttpas a runtime dependency to prevent installation-time failures (#4174).
🗄️ Upgrade notes
This release includes Alembic migrations affecting persisted scores, scenarios, conversations, target identities, observations, and attack results. Back up production databases and verify the migration path before upgrading. Treat rollback as a coordinated application-and-database operation.
For compatibility-enforcing CoPyRIT deployments, stage matching frontend, CLI, and backend artifacts before switching traffic. Keep those matching client artifacts available and do not roll back the backend below the first compatibility-enforcing release while newer clients remain active.
🔒 Security
No known high-priority security issues.
- Hardened API authorization for target creation that uses server-stored credentials or executes model-repository code (#3247, #3173).
- Restricted API-created HTTP target uploads to server-selected folders and added backend request-size, field-length, and path-parameter validation (#3172, #2960, #3594, #3595).
- Updated dependencies with available security patches.
New Contributors
- Umerkhan Golandaz (@UmerkhanGolandaz) made their first contribution in #2593
- Ching Wei Kang (@WilliamK112) made their first contribution in #2604
- Sylvester Kaczmarek (@sylvesterkaczmarek) made their first contribution in #2560
- Chirag Gupta (@chiruu12) made their first contribution in #2602
- Javier Valero (@jav1er8) made their first contribution in #2613
- Akshar Gothi (@akshar27) made their first contribution in #2598
- Mallika Kalangi (@bhargavikvmpl-2001) made their first contribution in #2657
- dvd233 (@dvd233) made their first contribution in #2648
- ZedingZhang (@ZedingZhang) made their first contribution in #2643
- Saurabh Yadav (@onlyysaurabh) made their first contribution in #2663
- Nantha kumar (@Nanduu24) made their first contribution in #2649
- Amruth Vamshi (@AmruthVamshi) made their first contribution in #2502
- 寇依 (@hey-Chloe) made their first contribution in #2538
- Vimal Sahani (@VimalN2005) made their first contribution in #2547
- Akshay Babbar (@akshay-babbar) made their first contribution in #2517
- Ray Winkelman (@rwinkelman) made their first contribution in #2524
- Abdallah Abughallous (@AbdaullahAG) made their first contribution in #2468
- Juhie (@juhiechandra) made their first contribution in #2573
- Joel (@aspire488) made their first contribution in #2762
- Tech Guy (@lukiod) made their first contribution in #2777
- Jin (@huiq777) made their first contribution in #2830
- arafat k Elharoun (@ahcrm-core) made their first contribution in #2799
- JAI (@jboiie) made their first contribution in #2763
- Jayanth Yarlagadda (@JayYarlagadda) made their first contribution in #2884
- Radek (Sixi) (@radeksixi) made their first contribution in #2771
- Garyouki made their first contribution in #2934
- Jackson Severino da Rocha (@jacksonsr451) made their first contribution in #2989
- Akshat Shah (@akshatshahh) made their first contribution in #3048
- Abdelhadi Salmaoui (@abdelhadi703) made their first contribution in #3009
- RohithPariki made their first contribution in #2972
- inchang-ing made their first contribution in #3053
- SteeveCrypto (@Steeve-Crypto) made their first contribution in #2986
- Nimit Jain (@Nimit3418) made their first contribution in #3062
- Julio César Suástegui (@juliosuas) made their first contribution in #3071
- Zhibo Lin (@LE0-Lin) made their first contribution in #3000
- Varun Poojari (@Varunpoojari) made their first contribution in #3028
- Kushal Talati (@kushaltalati) made their first contribution in #3127
- Mr.X (@MRX-72) made their first contribution in #3134
- Mamidala Som Praneeth Babu (@praann07) made their first contribution in #3154
- Aizen__28 (@Yudeeswaran) made their first contribution in #3175
- Shivam Maurya (@shivampwm2020) made their first contribution in #3208
- Isaac Emmanuel (@1cbyc) made their first contribution in #3198
- Edson (@Zhuoxi2000) made their first contribution in #3006
- Pushpak Siva Sai (@Pushpak731) made their first contribution in #2962
- Absarahmedofficial made their first contribution in #3256
- 成功したナイロンカエル (@vito233) made their first contribution in #3266
- Ruiqi Wang (@RachelWanggg) made their first contribution in #3253
- Nikhil Gupta (@Denimworld12) made their first contribution in #3155
- Wade (@Sriram-PR) made their first contribution in #3241
- Merge_Conflict - Pasi (@pasmud) made their first contribution in #3326
- Authensor (@AUTHENSOR) made their first contribution in #3322
- Yashvardhan Thanvi (@Thanatos9404) made their first contribution in #3318
- ARJUN K (@arjun-k047) made their first contribution in #3392
- Jacqueline122 made their first contribution in #3414
- Niladri Das (@bniladridas) made their first contribution in #3520
- Nithin (@nithin42) made their first contribution in #3469
- Mohammad Aatif Shaikh (@aatif101) made their first contribution in #3471
- mehmetl33t made their first contribution in #3686
- Dylan Duan (@Kiddo4993) made their first contribution in #3767
- Mert Erbak (@merterbak) made their first contribution in #3766
- Pratik Gandhi (@pratikgx) made their first contribution in #3695
- Fazeel Usmani (@FazeelUsmani) made their first contribution in #3611
- Mohammed Shoaib Choudry (@DevShoaib78) made their first contribution in #3758
- nabeleon94 made their first contribution in #3791
- Rohitpro1 made their first contribution in #3813
- KVR Vishnu (@VISHNU0906) made their first contribution in #3814
- Roydon Sequeira (@roydonsequeira) made their first contribution in #3669
- Darshika5 (@Darshika140) made their first contribution in #3887
- qwist1233-cpu made their first contribution in #3922
- 小卡塔克 (@Goldloli) made their first contribution in #3905
- K L Aadithya (@Aadithya-kl) made their first contribution in #3890
- Víctor Fernández Ayllón (@vayllon301) made their first contribution in #3980
- Krishna vamsi Dhulipalla (@krishna-dhulipalla) made their first contribution in #3919
- Shawn Russ (@shawnrruss) made their first contribution in #3815
- thelastbackspace made their first contribution in #3875
- Jay (@jay23606) made their first contribution in #3938
Full changelog
See every merged change in v1.1.0...v1.2.0.