dreadnode 1.17.1__tar.gz → 2.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (535) hide show
  1. {dreadnode-1.17.1 → dreadnode-2.0.1}/.gitignore +74 -37
  2. dreadnode-2.0.1/PKG-INFO +450 -0
  3. dreadnode-2.0.1/README.md +360 -0
  4. dreadnode-2.0.1/dreadnode/__init__.py +310 -0
  5. dreadnode-2.0.1/dreadnode/__main__.py +11 -0
  6. dreadnode-2.0.1/dreadnode/agents/__init__.py +102 -0
  7. dreadnode-2.0.1/dreadnode/agents/agent.py +926 -0
  8. dreadnode-2.0.1/dreadnode/agents/events.py +940 -0
  9. dreadnode-1.17.1/dreadnode/agent/error.py → dreadnode-2.0.1/dreadnode/agents/exceptions.py +4 -0
  10. {dreadnode-1.17.1/dreadnode/agent → dreadnode-2.0.1/dreadnode/agents}/format.py +6 -6
  11. dreadnode-2.0.1/dreadnode/agents/hooks.py +354 -0
  12. dreadnode-2.0.1/dreadnode/agents/mcp/__init__.py +64 -0
  13. dreadnode-2.0.1/dreadnode/agents/mcp/auth.py +140 -0
  14. dreadnode-2.0.1/dreadnode/agents/mcp/client.py +377 -0
  15. dreadnode-2.0.1/dreadnode/agents/mcp/config.py +88 -0
  16. dreadnode-2.0.1/dreadnode/agents/mcp/server.py +118 -0
  17. {dreadnode-1.17.1/dreadnode/agent → dreadnode-2.0.1/dreadnode/agents}/reactions.py +7 -3
  18. dreadnode-2.0.1/dreadnode/agents/skills.py +430 -0
  19. dreadnode-2.0.1/dreadnode/agents/stopping.py +495 -0
  20. dreadnode-2.0.1/dreadnode/agents/subagent.py +195 -0
  21. dreadnode-2.0.1/dreadnode/agents/tools.py +907 -0
  22. dreadnode-2.0.1/dreadnode/agents/trajectory.py +467 -0
  23. dreadnode-2.0.1/dreadnode/airt/__init__.py +70 -0
  24. dreadnode-2.0.1/dreadnode/airt/analytics/__init__.py +45 -0
  25. dreadnode-2.0.1/dreadnode/airt/analytics/aggregator.py +153 -0
  26. dreadnode-2.0.1/dreadnode/airt/analytics/classifier.py +136 -0
  27. dreadnode-2.0.1/dreadnode/airt/analytics/compliance.py +140 -0
  28. dreadnode-2.0.1/dreadnode/airt/analytics/engine.py +382 -0
  29. dreadnode-2.0.1/dreadnode/airt/analytics/recommendations.py +193 -0
  30. dreadnode-2.0.1/dreadnode/airt/analytics/types.py +341 -0
  31. dreadnode-2.0.1/dreadnode/airt/assessment.py +641 -0
  32. dreadnode-2.0.1/dreadnode/airt/autodan_turbo.py +373 -0
  33. dreadnode-2.0.1/dreadnode/airt/beast.py +427 -0
  34. dreadnode-2.0.1/dreadnode/airt/compliance/__init__.py +224 -0
  35. dreadnode-2.0.1/dreadnode/airt/compliance/atlas.py +120 -0
  36. dreadnode-2.0.1/dreadnode/airt/compliance/nist.py +63 -0
  37. dreadnode-2.0.1/dreadnode/airt/compliance/owasp.py +86 -0
  38. dreadnode-2.0.1/dreadnode/airt/compliance/owasp_agentic.py +153 -0
  39. dreadnode-2.0.1/dreadnode/airt/compliance/saif.py +69 -0
  40. dreadnode-2.0.1/dreadnode/airt/crescendo.py +296 -0
  41. dreadnode-2.0.1/dreadnode/airt/data/__init__.py +1 -0
  42. dreadnode-2.0.1/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  43. dreadnode-2.0.1/dreadnode/airt/data/rubrics/data_exfiltration.yaml +95 -0
  44. dreadnode-2.0.1/dreadnode/airt/data/rubrics/goal_hijacking.yaml +102 -0
  45. dreadnode-2.0.1/dreadnode/airt/data/rubrics/memory_poisoning.yaml +107 -0
  46. dreadnode-2.0.1/dreadnode/airt/data/rubrics/privilege_escalation.yaml +109 -0
  47. dreadnode-2.0.1/dreadnode/airt/data/rubrics/rce.yaml +87 -0
  48. dreadnode-2.0.1/dreadnode/airt/data/rubrics/scope_creep.yaml +136 -0
  49. dreadnode-2.0.1/dreadnode/airt/data/rubrics/tool_chaining.yaml +117 -0
  50. dreadnode-2.0.1/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +164 -0
  51. dreadnode-2.0.1/dreadnode/airt/data/rubrics/unbounded_agency.yaml +206 -0
  52. dreadnode-2.0.1/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +226 -0
  53. dreadnode-2.0.1/dreadnode/airt/deep_inception.py +291 -0
  54. dreadnode-2.0.1/dreadnode/airt/drattack.py +728 -0
  55. dreadnode-2.0.1/dreadnode/airt/events.py +554 -0
  56. {dreadnode-1.17.1/dreadnode/airt/attack → dreadnode-2.0.1/dreadnode/airt}/goat.py +103 -57
  57. dreadnode-2.0.1/dreadnode/airt/gptfuzzer.py +349 -0
  58. dreadnode-2.0.1/dreadnode/airt/image.py +266 -0
  59. dreadnode-2.0.1/dreadnode/airt/multimodal.py +196 -0
  60. dreadnode-2.0.1/dreadnode/airt/pair.py +261 -0
  61. dreadnode-2.0.1/dreadnode/airt/prompt.py +260 -0
  62. dreadnode-2.0.1/dreadnode/airt/rainbow.py +305 -0
  63. dreadnode-2.0.1/dreadnode/airt/renellm.py +377 -0
  64. dreadnode-2.0.1/dreadnode/airt/reporting/__init__.py +16 -0
  65. dreadnode-2.0.1/dreadnode/airt/reporting/json_report.py +121 -0
  66. dreadnode-2.0.1/dreadnode/airt/reporting/llm_summary.py +159 -0
  67. dreadnode-2.0.1/dreadnode/airt/reporting/markdown.py +254 -0
  68. {dreadnode-1.17.1/dreadnode/airt/attack → dreadnode-2.0.1/dreadnode/airt}/tap.py +85 -19
  69. dreadnode-2.0.1/dreadnode/app/__init__.py +22 -0
  70. dreadnode-2.0.1/dreadnode/app/api/__init__.py +3 -0
  71. dreadnode-2.0.1/dreadnode/app/api/client.py +1551 -0
  72. dreadnode-2.0.1/dreadnode/app/api/models.py +1164 -0
  73. dreadnode-2.0.1/dreadnode/app/main.py +2080 -0
  74. dreadnode-2.0.1/dreadnode/app/server/__init__.py +5 -0
  75. dreadnode-2.0.1/dreadnode/app/server/app.py +1691 -0
  76. dreadnode-2.0.1/dreadnode/app/server/default-agent/tools/coding.py +969 -0
  77. dreadnode-2.0.1/dreadnode/app/server/default-agent/tools/subagent.py +215 -0
  78. dreadnode-2.0.1/dreadnode/app/server/session.py +235 -0
  79. dreadnode-2.0.1/dreadnode/app/server/system-prompt.md +8 -0
  80. dreadnode-2.0.1/dreadnode/app/server/utils.py +25 -0
  81. dreadnode-2.0.1/dreadnode/app/tui/__init__.py +1 -0
  82. dreadnode-2.0.1/dreadnode/app/tui/app.py +2869 -0
  83. dreadnode-2.0.1/dreadnode/app/tui/client.py +665 -0
  84. dreadnode-2.0.1/dreadnode/app/tui/commands.py +400 -0
  85. dreadnode-2.0.1/dreadnode/app/tui/dreadnode.tcss +657 -0
  86. dreadnode-2.0.1/dreadnode/app/tui/event_contract.py +279 -0
  87. dreadnode-2.0.1/dreadnode/app/tui/model_variants.py +234 -0
  88. dreadnode-2.0.1/dreadnode/app/tui/screens/__init__.py +29 -0
  89. dreadnode-2.0.1/dreadnode/app/tui/screens/auth.py +477 -0
  90. dreadnode-2.0.1/dreadnode/app/tui/screens/base.py +47 -0
  91. dreadnode-2.0.1/dreadnode/app/tui/screens/capabilities.py +1039 -0
  92. dreadnode-2.0.1/dreadnode/app/tui/screens/console.py +177 -0
  93. dreadnode-2.0.1/dreadnode/app/tui/screens/environments.py +307 -0
  94. dreadnode-2.0.1/dreadnode/app/tui/screens/evaluations.py +555 -0
  95. dreadnode-2.0.1/dreadnode/app/tui/screens/hub.py +219 -0
  96. dreadnode-2.0.1/dreadnode/app/tui/screens/model_picker.py +97 -0
  97. dreadnode-2.0.1/dreadnode/app/tui/screens/runtimes.py +307 -0
  98. dreadnode-2.0.1/dreadnode/app/tui/screens/sandboxes.py +394 -0
  99. dreadnode-2.0.1/dreadnode/app/tui/screens/secrets.py +163 -0
  100. dreadnode-2.0.1/dreadnode/app/tui/screens/traces.py +616 -0
  101. dreadnode-2.0.1/dreadnode/app/tui/theme.py +48 -0
  102. dreadnode-2.0.1/dreadnode/app/tui/turn_reducer.py +223 -0
  103. dreadnode-2.0.1/dreadnode/app/tui/widgets/__init__.py +50 -0
  104. dreadnode-2.0.1/dreadnode/app/tui/widgets/agent_dialog.py +117 -0
  105. dreadnode-2.0.1/dreadnode/app/tui/widgets/agent_suggester.py +41 -0
  106. dreadnode-2.0.1/dreadnode/app/tui/widgets/composer.py +262 -0
  107. dreadnode-2.0.1/dreadnode/app/tui/widgets/context_bar.py +94 -0
  108. dreadnode-2.0.1/dreadnode/app/tui/widgets/conversation.py +252 -0
  109. dreadnode-2.0.1/dreadnode/app/tui/widgets/flash.py +72 -0
  110. dreadnode-2.0.1/dreadnode/app/tui/widgets/header_bar.py +58 -0
  111. dreadnode-2.0.1/dreadnode/app/tui/widgets/help_panel.py +105 -0
  112. dreadnode-2.0.1/dreadnode/app/tui/widgets/mcp_dialog.py +89 -0
  113. dreadnode-2.0.1/dreadnode/app/tui/widgets/mention_overlay.py +86 -0
  114. dreadnode-2.0.1/dreadnode/app/tui/widgets/message_queue.py +50 -0
  115. dreadnode-2.0.1/dreadnode/app/tui/widgets/nav_sidebar.py +67 -0
  116. dreadnode-2.0.1/dreadnode/app/tui/widgets/permission_prompt.py +152 -0
  117. dreadnode-2.0.1/dreadnode/app/tui/widgets/session_sidebar.py +108 -0
  118. dreadnode-2.0.1/dreadnode/app/tui/widgets/slash_overlay.py +83 -0
  119. dreadnode-2.0.1/dreadnode/app/tui/widgets/status_bar.py +81 -0
  120. dreadnode-2.0.1/dreadnode/app/tui/widgets/throbber.py +79 -0
  121. dreadnode-2.0.1/dreadnode/app/tui/widgets/tool.py +56 -0
  122. dreadnode-2.0.1/dreadnode/app/tui/widgets/tool_progress.py +95 -0
  123. dreadnode-2.0.1/dreadnode/app/tui/widgets/tools_dialog.py +93 -0
  124. dreadnode-2.0.1/dreadnode/app/tui/widgets/welcome.py +81 -0
  125. dreadnode-2.0.1/dreadnode/capabilities/__init__.py +89 -0
  126. dreadnode-2.0.1/dreadnode/capabilities/capability.py +298 -0
  127. dreadnode-2.0.1/dreadnode/capabilities/loader.py +1078 -0
  128. dreadnode-2.0.1/dreadnode/capabilities/sync.py +303 -0
  129. dreadnode-2.0.1/dreadnode/capabilities/tool_rules.py +47 -0
  130. dreadnode-2.0.1/dreadnode/capabilities/types.py +156 -0
  131. dreadnode-2.0.1/dreadnode/capabilities/wrapper.py +210 -0
  132. dreadnode-2.0.1/dreadnode/constants.py +46 -0
  133. dreadnode-2.0.1/dreadnode/core/__init__.py +83 -0
  134. dreadnode-2.0.1/dreadnode/core/conditions.py +1124 -0
  135. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/core}/discovery.py +1 -1
  136. dreadnode-2.0.1/dreadnode/core/environment.py +67 -0
  137. dreadnode-2.0.1/dreadnode/core/evaluations/__init__.py +105 -0
  138. {dreadnode-1.17.1/dreadnode/eval → dreadnode-2.0.1/dreadnode/core/evaluations}/console.py +33 -69
  139. dreadnode-2.0.1/dreadnode/core/evaluations/evaluation.py +462 -0
  140. dreadnode-2.0.1/dreadnode/core/evaluations/events.py +133 -0
  141. {dreadnode-1.17.1/dreadnode/eval → dreadnode-2.0.1/dreadnode/core/evaluations}/format.py +37 -127
  142. dreadnode-2.0.1/dreadnode/core/evaluations/result.py +159 -0
  143. {dreadnode-1.17.1/dreadnode/eval → dreadnode-2.0.1/dreadnode/core/evaluations}/sample.py +44 -68
  144. dreadnode-2.0.1/dreadnode/core/exceptions.py +223 -0
  145. dreadnode-2.0.1/dreadnode/core/execution.py +202 -0
  146. dreadnode-2.0.1/dreadnode/core/generators/tokenizer/transformers_.py +93 -0
  147. dreadnode-2.0.1/dreadnode/core/hook.py +235 -0
  148. dreadnode-2.0.1/dreadnode/core/judge.py +44 -0
  149. dreadnode-2.0.1/dreadnode/core/load.py +276 -0
  150. dreadnode-2.0.1/dreadnode/core/log.py +245 -0
  151. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/core}/meta/__init__.py +22 -11
  152. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/core}/meta/config.py +5 -4
  153. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/core}/meta/context.py +193 -61
  154. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/core}/meta/hydrate.py +5 -4
  155. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/core}/meta/introspect.py +16 -5
  156. dreadnode-2.0.1/dreadnode/core/metric.py +228 -0
  157. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/core}/object.py +1 -1
  158. dreadnode-1.17.1/dreadnode/scorers/base.py → dreadnode-2.0.1/dreadnode/core/scorer.py +401 -42
  159. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/core}/serialization.py +7 -7
  160. dreadnode-2.0.1/dreadnode/core/stopping.py +396 -0
  161. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/core}/task.py +219 -127
  162. dreadnode-1.17.1/dreadnode/transforms/base.py → dreadnode-2.0.1/dreadnode/core/transforms.py +184 -63
  163. {dreadnode-1.17.1/dreadnode/data_types → dreadnode-2.0.1/dreadnode/core/types}/__init__.py +12 -14
  164. {dreadnode-1.17.1/dreadnode/data_types → dreadnode-2.0.1/dreadnode/core/types}/audio.py +2 -2
  165. {dreadnode-1.17.1/dreadnode/data_types → dreadnode-2.0.1/dreadnode/core/types}/image.py +3 -3
  166. {dreadnode-1.17.1/dreadnode/data_types → dreadnode-2.0.1/dreadnode/core/types}/object_3d.py +1 -1
  167. {dreadnode-1.17.1/dreadnode/data_types → dreadnode-2.0.1/dreadnode/core/types}/table.py +1 -1
  168. {dreadnode-1.17.1/dreadnode/data_types → dreadnode-2.0.1/dreadnode/core/types}/text.py +2 -2
  169. {dreadnode-1.17.1/dreadnode/data_types → dreadnode-2.0.1/dreadnode/core/types}/video.py +2 -2
  170. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/core}/util.py +45 -189
  171. dreadnode-2.0.1/dreadnode/datasets/__init__.py +5 -0
  172. dreadnode-2.0.1/dreadnode/datasets/dataset.py +101 -0
  173. dreadnode-2.0.1/dreadnode/datasets/hf.py +64 -0
  174. dreadnode-2.0.1/dreadnode/datasets/local.py +409 -0
  175. dreadnode-2.0.1/dreadnode/environments/docker.py +85 -0
  176. dreadnode-2.0.1/dreadnode/environments/kali.py +125 -0
  177. dreadnode-2.0.1/dreadnode/environments/kernel.py +102 -0
  178. dreadnode-2.0.1/dreadnode/environments/kubernetes.py +393 -0
  179. dreadnode-2.0.1/dreadnode/environments/strikes.py +281 -0
  180. dreadnode-2.0.1/dreadnode/generators/__init__.py +1 -0
  181. dreadnode-2.0.1/dreadnode/generators/caching.py +42 -0
  182. dreadnode-2.0.1/dreadnode/generators/chat.py +504 -0
  183. dreadnode-2.0.1/dreadnode/generators/data.py +360 -0
  184. dreadnode-2.0.1/dreadnode/generators/exceptions.py +208 -0
  185. dreadnode-2.0.1/dreadnode/generators/generator/__init__.py +84 -0
  186. dreadnode-2.0.1/dreadnode/generators/generator/base.py +741 -0
  187. dreadnode-2.0.1/dreadnode/generators/generator/http.py +686 -0
  188. dreadnode-2.0.1/dreadnode/generators/generator/litellm_.py +528 -0
  189. dreadnode-2.0.1/dreadnode/generators/generator/transformers_.py +200 -0
  190. dreadnode-2.0.1/dreadnode/generators/generator/vllm_.py +192 -0
  191. dreadnode-2.0.1/dreadnode/generators/message.py +1422 -0
  192. dreadnode-2.0.1/dreadnode/generators/models.py +1060 -0
  193. dreadnode-2.0.1/dreadnode/generators/parsing.py +143 -0
  194. dreadnode-2.0.1/dreadnode/generators/tokenizer/__init__.py +41 -0
  195. dreadnode-2.0.1/dreadnode/generators/tokenizer/base.py +336 -0
  196. dreadnode-2.0.1/dreadnode/generators/tokenizer/transformers_.py +93 -0
  197. dreadnode-2.0.1/dreadnode/generators/utils.py +356 -0
  198. dreadnode-2.0.1/dreadnode/models/__init__.py +7 -0
  199. dreadnode-2.0.1/dreadnode/models/hf.py +163 -0
  200. dreadnode-2.0.1/dreadnode/models/local.py +357 -0
  201. dreadnode-2.0.1/dreadnode/models/model.py +170 -0
  202. dreadnode-2.0.1/dreadnode/optimization/__init__.py +66 -0
  203. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/optimization/collectors.py +8 -15
  204. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/optimization/console.py +110 -128
  205. dreadnode-2.0.1/dreadnode/optimization/events.py +273 -0
  206. dreadnode-2.0.1/dreadnode/optimization/format.py +337 -0
  207. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/optimization/result.py +21 -7
  208. dreadnode-2.0.1/dreadnode/optimization/sampler.py +121 -0
  209. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/optimization/sampling.py +2 -15
  210. dreadnode-2.0.1/dreadnode/optimization/search.py +60 -0
  211. dreadnode-2.0.1/dreadnode/optimization/stopping.py +389 -0
  212. dreadnode-2.0.1/dreadnode/optimization/study.py +631 -0
  213. dreadnode-2.0.1/dreadnode/optimization/trial.py +166 -0
  214. dreadnode-2.0.1/dreadnode/packaging/loader.py +124 -0
  215. dreadnode-2.0.1/dreadnode/packaging/manifest.py +57 -0
  216. dreadnode-2.0.1/dreadnode/packaging/oci.py +477 -0
  217. dreadnode-2.0.1/dreadnode/packaging/package.py +472 -0
  218. dreadnode-2.0.1/dreadnode/samplers/__init__.py +74 -0
  219. dreadnode-2.0.1/dreadnode/samplers/boundary.py +143 -0
  220. dreadnode-2.0.1/dreadnode/samplers/fuzzing.py +360 -0
  221. dreadnode-2.0.1/dreadnode/samplers/graph.py +263 -0
  222. dreadnode-2.0.1/dreadnode/samplers/grid.py +82 -0
  223. dreadnode-2.0.1/dreadnode/samplers/image.py +783 -0
  224. dreadnode-2.0.1/dreadnode/samplers/mapelites.py +357 -0
  225. dreadnode-2.0.1/dreadnode/samplers/optuna.py +155 -0
  226. dreadnode-2.0.1/dreadnode/samplers/random.py +148 -0
  227. dreadnode-2.0.1/dreadnode/samplers/registry.py +71 -0
  228. dreadnode-2.0.1/dreadnode/samplers/strategy.py +479 -0
  229. dreadnode-2.0.1/dreadnode/scorers/__init__.py +307 -0
  230. dreadnode-2.0.1/dreadnode/scorers/advanced_jailbreak_detection.py +531 -0
  231. dreadnode-2.0.1/dreadnode/scorers/agent_security.py +711 -0
  232. dreadnode-2.0.1/dreadnode/scorers/agentic.py +841 -0
  233. dreadnode-2.0.1/dreadnode/scorers/agentic_workflow.py +999 -0
  234. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/classification.py +5 -4
  235. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/consistency.py +3 -3
  236. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/contains.py +2 -2
  237. dreadnode-2.0.1/dreadnode/scorers/credentials.py +267 -0
  238. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/crucible.py +2 -2
  239. dreadnode-2.0.1/dreadnode/scorers/documentation_security.py +506 -0
  240. dreadnode-2.0.1/dreadnode/scorers/exfiltration_detection.py +276 -0
  241. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/format.py +2 -2
  242. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/harm.py +3 -3
  243. dreadnode-2.0.1/dreadnode/scorers/ide_security.py +419 -0
  244. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/image.py +3 -3
  245. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/json.py +2 -2
  246. dreadnode-2.0.1/dreadnode/scorers/judge.py +368 -0
  247. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/length.py +2 -2
  248. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/lexical.py +2 -2
  249. dreadnode-2.0.1/dreadnode/scorers/mcp_security.py +478 -0
  250. dreadnode-2.0.1/dreadnode/scorers/memorization.py +171 -0
  251. dreadnode-2.0.1/dreadnode/scorers/multi_agent_security.py +438 -0
  252. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/pii.py +4 -4
  253. dreadnode-2.0.1/dreadnode/scorers/prompt_leak.py +265 -0
  254. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/readability.py +3 -3
  255. dreadnode-2.0.1/dreadnode/scorers/reasoning_security.py +349 -0
  256. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/sentiment.py +5 -5
  257. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/scorers/similarity.py +6 -6
  258. dreadnode-2.0.1/dreadnode/storage/__init__.py +46 -0
  259. dreadnode-2.0.1/dreadnode/storage/providers.py +252 -0
  260. dreadnode-2.0.1/dreadnode/storage/storage.py +754 -0
  261. dreadnode-2.0.1/dreadnode/tools/__init__.py +102 -0
  262. dreadnode-2.0.1/dreadnode/tools/_ripgrep.py +51 -0
  263. dreadnode-2.0.1/dreadnode/tools/apply_patch.py +490 -0
  264. dreadnode-2.0.1/dreadnode/tools/editing.py +580 -0
  265. dreadnode-2.0.1/dreadnode/tools/execute.py +200 -0
  266. dreadnode-2.0.1/dreadnode/tools/fetch.py +162 -0
  267. dreadnode-2.0.1/dreadnode/tools/glob.py +144 -0
  268. dreadnode-2.0.1/dreadnode/tools/grep.py +286 -0
  269. dreadnode-2.0.1/dreadnode/tools/interaction.py +326 -0
  270. dreadnode-2.0.1/dreadnode/tools/ls.py +221 -0
  271. {dreadnode-1.17.1/dreadnode/agent → dreadnode-2.0.1/dreadnode}/tools/memory.py +1 -1
  272. dreadnode-2.0.1/dreadnode/tools/read.py +336 -0
  273. dreadnode-1.17.1/dreadnode/agent/tools/tasking.py → dreadnode-2.0.1/dreadnode/tools/task.py +2 -2
  274. dreadnode-2.0.1/dreadnode/tools/think.py +28 -0
  275. dreadnode-1.17.1/dreadnode/agent/tools/planning.py → dreadnode-2.0.1/dreadnode/tools/todo.py +16 -34
  276. dreadnode-2.0.1/dreadnode/tools/web_search.py +175 -0
  277. dreadnode-2.0.1/dreadnode/tools/write.py +52 -0
  278. dreadnode-2.0.1/dreadnode/tracing/constants.py +161 -0
  279. dreadnode-2.0.1/dreadnode/tracing/convert.py +61 -0
  280. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/tracing}/exporter.py +3 -5
  281. dreadnode-2.0.1/dreadnode/tracing/exporters.py +277 -0
  282. dreadnode-2.0.1/dreadnode/tracing/span.py +965 -0
  283. dreadnode-2.0.1/dreadnode/tracing/spans.py +181 -0
  284. dreadnode-2.0.1/dreadnode/tracing/trace_converter.py +556 -0
  285. dreadnode-2.0.1/dreadnode/training/__init__.py +442 -0
  286. dreadnode-2.0.1/dreadnode/training/anyscale.py +159 -0
  287. dreadnode-2.0.1/dreadnode/training/azureml.py +344 -0
  288. dreadnode-2.0.1/dreadnode/training/base.py +250 -0
  289. dreadnode-2.0.1/dreadnode/training/dpo.py +10 -0
  290. dreadnode-2.0.1/dreadnode/training/events.py +143 -0
  291. dreadnode-2.0.1/dreadnode/training/grpo.py +16 -0
  292. dreadnode-2.0.1/dreadnode/training/ppo.py +14 -0
  293. dreadnode-2.0.1/dreadnode/training/prime.py +155 -0
  294. dreadnode-2.0.1/dreadnode/training/ray/__init__.py +275 -0
  295. dreadnode-2.0.1/dreadnode/training/ray/async_trainer.py +471 -0
  296. dreadnode-2.0.1/dreadnode/training/ray/callbacks.py +1024 -0
  297. dreadnode-2.0.1/dreadnode/training/ray/config.py +230 -0
  298. dreadnode-2.0.1/dreadnode/training/ray/coordinator.py +598 -0
  299. dreadnode-2.0.1/dreadnode/training/ray/distributed.py +615 -0
  300. dreadnode-2.0.1/dreadnode/training/ray/dpo.py +573 -0
  301. dreadnode-2.0.1/dreadnode/training/ray/experience.py +526 -0
  302. dreadnode-2.0.1/dreadnode/training/ray/fsdp2_learner.py +750 -0
  303. dreadnode-2.0.1/dreadnode/training/ray/inference.py +356 -0
  304. dreadnode-2.0.1/dreadnode/training/ray/learner.py +466 -0
  305. dreadnode-2.0.1/dreadnode/training/ray/multi_turn.py +762 -0
  306. dreadnode-2.0.1/dreadnode/training/ray/ppo.py +892 -0
  307. dreadnode-2.0.1/dreadnode/training/ray/reward_model.py +672 -0
  308. dreadnode-2.0.1/dreadnode/training/ray/rollout_env.py +211 -0
  309. dreadnode-2.0.1/dreadnode/training/ray/rollout_worker.py +628 -0
  310. dreadnode-2.0.1/dreadnode/training/ray/sft.py +646 -0
  311. dreadnode-2.0.1/dreadnode/training/ray/trainer.py +767 -0
  312. dreadnode-2.0.1/dreadnode/training/rewards/__init__.py +96 -0
  313. dreadnode-2.0.1/dreadnode/training/rewards/aggregator.py +291 -0
  314. dreadnode-2.0.1/dreadnode/training/rewards/functions.py +333 -0
  315. dreadnode-2.0.1/dreadnode/training/rewards/scorer_bridge.py +266 -0
  316. dreadnode-2.0.1/dreadnode/training/rewards/shaping.py +363 -0
  317. dreadnode-2.0.1/dreadnode/training/rewards/types.py +192 -0
  318. dreadnode-2.0.1/dreadnode/training/rollouts/__init__.py +61 -0
  319. dreadnode-2.0.1/dreadnode/training/rollouts/adapters.py +306 -0
  320. dreadnode-2.0.1/dreadnode/training/rollouts/orchestrator.py +554 -0
  321. dreadnode-2.0.1/dreadnode/training/rollouts/types.py +259 -0
  322. dreadnode-2.0.1/dreadnode/training/sagemaker/__init__.py +238 -0
  323. dreadnode-2.0.1/dreadnode/training/sagemaker/config.py +414 -0
  324. dreadnode-2.0.1/dreadnode/training/sagemaker/trainer.py +854 -0
  325. dreadnode-2.0.1/dreadnode/training/sagemaker.py +258 -0
  326. dreadnode-2.0.1/dreadnode/training/serving/__init__.py +35 -0
  327. dreadnode-2.0.1/dreadnode/training/serving/vllm_client.py +292 -0
  328. dreadnode-2.0.1/dreadnode/training/sft.py +10 -0
  329. dreadnode-2.0.1/dreadnode/training/tinker/__init__.py +161 -0
  330. dreadnode-2.0.1/dreadnode/training/tinker/config.py +130 -0
  331. dreadnode-2.0.1/dreadnode/training/tinker/data.py +385 -0
  332. dreadnode-2.0.1/dreadnode/training/tinker/trainer.py +636 -0
  333. dreadnode-2.0.1/dreadnode/training/tinker_sft.py +174 -0
  334. dreadnode-2.0.1/dreadnode/transforms/__init__.py +168 -0
  335. dreadnode-2.0.1/dreadnode/transforms/advanced_jailbreak.py +1139 -0
  336. dreadnode-2.0.1/dreadnode/transforms/adversarial_suffix.py +339 -0
  337. dreadnode-2.0.1/dreadnode/transforms/agent_skill.py +800 -0
  338. dreadnode-2.0.1/dreadnode/transforms/agentic_workflow.py +1092 -0
  339. dreadnode-2.0.1/dreadnode/transforms/audio.py +990 -0
  340. dreadnode-2.0.1/dreadnode/transforms/browser_agent_attacks.py +980 -0
  341. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/transforms/cipher.py +63 -39
  342. dreadnode-2.0.1/dreadnode/transforms/constitutional.py +1000 -0
  343. dreadnode-2.0.1/dreadnode/transforms/document.py +300 -0
  344. dreadnode-2.0.1/dreadnode/transforms/documentation_poison.py +514 -0
  345. dreadnode-2.0.1/dreadnode/transforms/encoding.py +1446 -0
  346. dreadnode-2.0.1/dreadnode/transforms/exfiltration.py +798 -0
  347. dreadnode-2.0.1/dreadnode/transforms/flip_attack.py +377 -0
  348. dreadnode-2.0.1/dreadnode/transforms/guardrail_bypass.py +970 -0
  349. dreadnode-2.0.1/dreadnode/transforms/ide_injection.py +623 -0
  350. dreadnode-2.0.1/dreadnode/transforms/image.py +893 -0
  351. dreadnode-2.0.1/dreadnode/transforms/injection.py +311 -0
  352. dreadnode-2.0.1/dreadnode/transforms/json_tools.py +417 -0
  353. dreadnode-2.0.1/dreadnode/transforms/language.py +576 -0
  354. dreadnode-2.0.1/dreadnode/transforms/logic_bomb.py +287 -0
  355. dreadnode-2.0.1/dreadnode/transforms/mcp_attacks.py +1068 -0
  356. dreadnode-2.0.1/dreadnode/transforms/multi_agent_attacks.py +1180 -0
  357. dreadnode-2.0.1/dreadnode/transforms/persuasion.py +312 -0
  358. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/transforms/perturbation.py +267 -176
  359. dreadnode-2.0.1/dreadnode/transforms/pii_extraction.py +344 -0
  360. dreadnode-2.0.1/dreadnode/transforms/pythonic_tools.py +300 -0
  361. dreadnode-2.0.1/dreadnode/transforms/rag_poisoning.py +658 -0
  362. dreadnode-2.0.1/dreadnode/transforms/reasoning_attacks.py +1122 -0
  363. dreadnode-2.0.1/dreadnode/transforms/refine.py +215 -0
  364. dreadnode-2.0.1/dreadnode/transforms/response_steering.py +425 -0
  365. dreadnode-2.0.1/dreadnode/transforms/stylistic.py +85 -0
  366. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/transforms/substitution.py +11 -11
  367. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/transforms/swap.py +3 -3
  368. dreadnode-2.0.1/dreadnode/transforms/system_prompt_extraction.py +483 -0
  369. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/transforms/text.py +27 -39
  370. dreadnode-2.0.1/dreadnode/transforms/video.py +234 -0
  371. dreadnode-2.0.1/dreadnode/transforms/xml_tools.py +401 -0
  372. {dreadnode-1.17.1 → dreadnode-2.0.1}/pyproject.toml +103 -18
  373. dreadnode-1.17.1/LICENSE +0 -201
  374. dreadnode-1.17.1/PKG-INFO +0 -396
  375. dreadnode-1.17.1/README.md +0 -126
  376. dreadnode-1.17.1/dreadnode/__init__.py +0 -175
  377. dreadnode-1.17.1/dreadnode/__main__.py +0 -10
  378. dreadnode-1.17.1/dreadnode/agent/__init__.py +0 -37
  379. dreadnode-1.17.1/dreadnode/agent/agent.py +0 -1001
  380. dreadnode-1.17.1/dreadnode/agent/events.py +0 -329
  381. dreadnode-1.17.1/dreadnode/agent/hooks/__init__.py +0 -16
  382. dreadnode-1.17.1/dreadnode/agent/hooks/backoff.py +0 -134
  383. dreadnode-1.17.1/dreadnode/agent/hooks/base.py +0 -44
  384. dreadnode-1.17.1/dreadnode/agent/hooks/metrics.py +0 -84
  385. dreadnode-1.17.1/dreadnode/agent/hooks/summarize.py +0 -178
  386. dreadnode-1.17.1/dreadnode/agent/prompts/__init__.py +0 -5
  387. dreadnode-1.17.1/dreadnode/agent/prompts/summarize.py +0 -102
  388. dreadnode-1.17.1/dreadnode/agent/result.py +0 -38
  389. dreadnode-1.17.1/dreadnode/agent/stop.py +0 -348
  390. dreadnode-1.17.1/dreadnode/agent/thread.py +0 -47
  391. dreadnode-1.17.1/dreadnode/agent/tools/__init__.py +0 -58
  392. dreadnode-1.17.1/dreadnode/agent/tools/base.py +0 -292
  393. dreadnode-1.17.1/dreadnode/agent/tools/execute.py +0 -145
  394. dreadnode-1.17.1/dreadnode/agent/tools/fs.py +0 -867
  395. dreadnode-1.17.1/dreadnode/agent/tools/reporting.py +0 -35
  396. dreadnode-1.17.1/dreadnode/airt/__init__.py +0 -29
  397. dreadnode-1.17.1/dreadnode/airt/attack/__init__.py +0 -21
  398. dreadnode-1.17.1/dreadnode/airt/attack/base.py +0 -38
  399. dreadnode-1.17.1/dreadnode/airt/attack/crescendo.py +0 -221
  400. dreadnode-1.17.1/dreadnode/airt/attack/hop_skip_jump.py +0 -89
  401. dreadnode-1.17.1/dreadnode/airt/attack/nes.py +0 -86
  402. dreadnode-1.17.1/dreadnode/airt/attack/prompt.py +0 -125
  403. dreadnode-1.17.1/dreadnode/airt/attack/simba.py +0 -78
  404. dreadnode-1.17.1/dreadnode/airt/attack/zoo.py +0 -84
  405. dreadnode-1.17.1/dreadnode/airt/search/__init__.py +0 -6
  406. dreadnode-1.17.1/dreadnode/airt/search/hop_skip_jump.py +0 -242
  407. dreadnode-1.17.1/dreadnode/airt/search/image_utils.py +0 -96
  408. dreadnode-1.17.1/dreadnode/airt/search/nes.py +0 -173
  409. dreadnode-1.17.1/dreadnode/airt/search/simba.py +0 -98
  410. dreadnode-1.17.1/dreadnode/airt/search/zoo.py +0 -313
  411. dreadnode-1.17.1/dreadnode/airt/target/__init__.py +0 -5
  412. dreadnode-1.17.1/dreadnode/airt/target/base.py +0 -25
  413. dreadnode-1.17.1/dreadnode/airt/target/custom.py +0 -47
  414. dreadnode-1.17.1/dreadnode/airt/target/llm.py +0 -88
  415. dreadnode-1.17.1/dreadnode/api/__init__.py +0 -3
  416. dreadnode-1.17.1/dreadnode/api/client.py +0 -912
  417. dreadnode-1.17.1/dreadnode/api/models.py +0 -550
  418. dreadnode-1.17.1/dreadnode/api/util.py +0 -177
  419. dreadnode-1.17.1/dreadnode/artifact/credential_manager.py +0 -132
  420. dreadnode-1.17.1/dreadnode/artifact/merger.py +0 -595
  421. dreadnode-1.17.1/dreadnode/artifact/storage.py +0 -136
  422. dreadnode-1.17.1/dreadnode/artifact/tree_builder.py +0 -456
  423. dreadnode-1.17.1/dreadnode/cli/__init__.py +0 -3
  424. dreadnode-1.17.1/dreadnode/cli/agent/__init__.py +0 -3
  425. dreadnode-1.17.1/dreadnode/cli/agent/cli.py +0 -174
  426. dreadnode-1.17.1/dreadnode/cli/api.py +0 -82
  427. dreadnode-1.17.1/dreadnode/cli/attack/__init__.py +0 -3
  428. dreadnode-1.17.1/dreadnode/cli/attack/cli.py +0 -162
  429. dreadnode-1.17.1/dreadnode/cli/docker.py +0 -387
  430. dreadnode-1.17.1/dreadnode/cli/eval/__init__.py +0 -3
  431. dreadnode-1.17.1/dreadnode/cli/eval/cli.py +0 -164
  432. dreadnode-1.17.1/dreadnode/cli/github.py +0 -265
  433. dreadnode-1.17.1/dreadnode/cli/main.py +0 -274
  434. dreadnode-1.17.1/dreadnode/cli/platform/__init__.py +0 -3
  435. dreadnode-1.17.1/dreadnode/cli/platform/cli.py +0 -291
  436. dreadnode-1.17.1/dreadnode/cli/platform/compose.py +0 -212
  437. dreadnode-1.17.1/dreadnode/cli/platform/constants.py +0 -16
  438. dreadnode-1.17.1/dreadnode/cli/platform/download.py +0 -95
  439. dreadnode-1.17.1/dreadnode/cli/platform/env_mgmt.py +0 -412
  440. dreadnode-1.17.1/dreadnode/cli/platform/tag.py +0 -40
  441. dreadnode-1.17.1/dreadnode/cli/platform/version.py +0 -216
  442. dreadnode-1.17.1/dreadnode/cli/profile/__init__.py +0 -3
  443. dreadnode-1.17.1/dreadnode/cli/profile/cli.py +0 -106
  444. dreadnode-1.17.1/dreadnode/cli/rbac/__init__.py +0 -3
  445. dreadnode-1.17.1/dreadnode/cli/rbac/organizations.py +0 -29
  446. dreadnode-1.17.1/dreadnode/cli/rbac/workspaces.py +0 -151
  447. dreadnode-1.17.1/dreadnode/cli/shared.py +0 -46
  448. dreadnode-1.17.1/dreadnode/cli/study/__init__.py +0 -3
  449. dreadnode-1.17.1/dreadnode/cli/study/cli.py +0 -164
  450. dreadnode-1.17.1/dreadnode/cli/task/__init__.py +0 -3
  451. dreadnode-1.17.1/dreadnode/cli/task/cli.py +0 -165
  452. dreadnode-1.17.1/dreadnode/constants.py +0 -92
  453. dreadnode-1.17.1/dreadnode/convert.py +0 -43
  454. dreadnode-1.17.1/dreadnode/data_types/message.py +0 -229
  455. dreadnode-1.17.1/dreadnode/error.py +0 -19
  456. dreadnode-1.17.1/dreadnode/eval/__init__.py +0 -11
  457. dreadnode-1.17.1/dreadnode/eval/dataset.py +0 -58
  458. dreadnode-1.17.1/dreadnode/eval/eval.py +0 -616
  459. dreadnode-1.17.1/dreadnode/eval/events.py +0 -100
  460. dreadnode-1.17.1/dreadnode/eval/hooks/__init__.py +0 -13
  461. dreadnode-1.17.1/dreadnode/eval/hooks/base.py +0 -26
  462. dreadnode-1.17.1/dreadnode/eval/hooks/transforms.py +0 -104
  463. dreadnode-1.17.1/dreadnode/eval/reactions.py +0 -35
  464. dreadnode-1.17.1/dreadnode/eval/result.py +0 -272
  465. dreadnode-1.17.1/dreadnode/format.py +0 -60
  466. dreadnode-1.17.1/dreadnode/integrations/transformers.py +0 -286
  467. dreadnode-1.17.1/dreadnode/logging_.py +0 -80
  468. dreadnode-1.17.1/dreadnode/main.py +0 -2006
  469. dreadnode-1.17.1/dreadnode/metric.py +0 -139
  470. dreadnode-1.17.1/dreadnode/optimization/__init__.py +0 -17
  471. dreadnode-1.17.1/dreadnode/optimization/events.py +0 -54
  472. dreadnode-1.17.1/dreadnode/optimization/format.py +0 -157
  473. dreadnode-1.17.1/dreadnode/optimization/search/__init__.py +0 -35
  474. dreadnode-1.17.1/dreadnode/optimization/search/base.py +0 -53
  475. dreadnode-1.17.1/dreadnode/optimization/search/boundary.py +0 -146
  476. dreadnode-1.17.1/dreadnode/optimization/search/graph.py +0 -198
  477. dreadnode-1.17.1/dreadnode/optimization/search/optuna_.py +0 -93
  478. dreadnode-1.17.1/dreadnode/optimization/search/random.py +0 -133
  479. dreadnode-1.17.1/dreadnode/optimization/stop.py +0 -171
  480. dreadnode-1.17.1/dreadnode/optimization/study.py +0 -673
  481. dreadnode-1.17.1/dreadnode/optimization/trial.py +0 -228
  482. dreadnode-1.17.1/dreadnode/scorers/__init__.py +0 -151
  483. dreadnode-1.17.1/dreadnode/scorers/judge.py +0 -121
  484. dreadnode-1.17.1/dreadnode/scorers/rigging.py +0 -128
  485. dreadnode-1.17.1/dreadnode/tracing/constants.py +0 -35
  486. dreadnode-1.17.1/dreadnode/tracing/exporters.py +0 -156
  487. dreadnode-1.17.1/dreadnode/tracing/span.py +0 -1160
  488. dreadnode-1.17.1/dreadnode/transforms/__init__.py +0 -69
  489. dreadnode-1.17.1/dreadnode/transforms/encoding.py +0 -598
  490. dreadnode-1.17.1/dreadnode/transforms/image.py +0 -202
  491. dreadnode-1.17.1/dreadnode/transforms/multimodal.py +0 -155
  492. dreadnode-1.17.1/dreadnode/transforms/refine.py +0 -189
  493. dreadnode-1.17.1/dreadnode/transforms/stylistic.py +0 -15
  494. dreadnode-1.17.1/dreadnode/user_config.py +0 -108
  495. dreadnode-1.17.1/examples/airt/ai_red_teaming_eval.ipynb +0 -1898
  496. dreadnode-1.17.1/examples/airt/beam_search.ipynb +0 -57
  497. dreadnode-1.17.1/examples/airt/crescendo_attack.ipynb +0 -162
  498. dreadnode-1.17.1/examples/airt/graph_of_attacks_with_pruning.ipynb +0 -181
  499. dreadnode-1.17.1/examples/airt/multimodal_attack_eval.ipynb +0 -263
  500. dreadnode-1.17.1/examples/airt/tap_vs_goat_eval.ipynb +0 -549
  501. dreadnode-1.17.1/examples/airt/tree_of_attacks_with_pruning.ipynb +0 -183
  502. dreadnode-1.17.1/examples/airt/tree_of_attacks_with_pruning_transforms.ipynb +0 -186
  503. dreadnode-1.17.1/examples/data_export.ipynb +0 -133
  504. dreadnode-1.17.1/examples/log_artifact.ipynb +0 -182
  505. dreadnode-1.17.1/examples/log_object/audio.ipynb +0 -191
  506. dreadnode-1.17.1/examples/log_object/image.ipynb +0 -290
  507. dreadnode-1.17.1/examples/log_object/object3d.ipynb +0 -109
  508. dreadnode-1.17.1/examples/log_object/table.ipynb +0 -157
  509. dreadnode-1.17.1/examples/log_object/video.ipynb +0 -242
  510. dreadnode-1.17.1/examples/model_training.ipynb +0 -118
  511. dreadnode-1.17.1/examples/rigging.ipynb +0 -95
  512. dreadnode-1.17.1/tests/cli/test_config.py +0 -79
  513. dreadnode-1.17.1/tests/cli/test_docker.py +0 -161
  514. dreadnode-1.17.1/tests/cli/test_github.py +0 -201
  515. dreadnode-1.17.1/tests/test_agent.py +0 -629
  516. dreadnode-1.17.1/tests/test_agent_lifecycle.py +0 -239
  517. dreadnode-1.17.1/tests/test_meta.py +0 -1185
  518. dreadnode-1.17.1/tests/test_task_output_linking.py +0 -141
  519. {dreadnode-1.17.1/dreadnode/data/assets → dreadnode-2.0.1/dreadnode/airt/data/assets/image}/bomb.jpg +0 -0
  520. {dreadnode-1.17.1/dreadnode/data/assets → dreadnode-2.0.1/dreadnode/airt/data/assets/image}/meth.png +0 -0
  521. {dreadnode-1.17.1/dreadnode/data/assets → dreadnode-2.0.1/dreadnode/airt/data/prompts}/adversarial_benchmark_subset.csv +0 -0
  522. {dreadnode-1.17.1/dreadnode/data/assets → dreadnode-2.0.1/dreadnode/airt/data/prompts}/ai_safety.csv +0 -0
  523. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/airt}/data/templates/crescendo/variant_1.yaml +0 -0
  524. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/airt}/data/templates/crescendo/variant_2.yaml +0 -0
  525. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/airt}/data/templates/crescendo/variant_3.yaml +0 -0
  526. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/airt}/data/templates/crescendo/variant_4.yaml +0 -0
  527. {dreadnode-1.17.1/dreadnode → dreadnode-2.0.1/dreadnode/airt}/data/templates/crescendo/variant_5.yaml +0 -0
  528. {dreadnode-1.17.1/dreadnode/data_types → dreadnode-2.0.1/dreadnode/core/types}/base.py +0 -0
  529. /dreadnode-1.17.1/dreadnode/common_types.py → /dreadnode-2.0.1/dreadnode/core/types/common.py +0 -0
  530. {dreadnode-1.17.1/dreadnode/artifact → dreadnode-2.0.1/dreadnode/environments}/__init__.py +0 -0
  531. {dreadnode-1.17.1/dreadnode/integrations → dreadnode-2.0.1/dreadnode/packaging}/__init__.py +0 -0
  532. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/py.typed +0 -0
  533. /dreadnode-1.17.1/dreadnode/scorers/util.py → /dreadnode-2.0.1/dreadnode/scorers/cosine_sim.py +0 -0
  534. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/tracing/__init__.py +0 -0
  535. {dreadnode-1.17.1 → dreadnode-2.0.1}/dreadnode/version.py +0 -0
@@ -1,26 +1,6 @@
1
- # Poetry deprecated
2
- poetry.lock
3
-
4
- # Testing code
5
- notebooks/
6
- examples/.logfire
7
-
8
- # Logfire temp
9
- .logfire/
10
-
11
- # Mlflow
12
- mlruns/
13
-
14
- # Large disk files
15
- *.parquet
16
- *.jsonl
17
-
18
- # Macos
19
- .DS_Store
20
-
21
1
  # Byte-compiled / optimized / DLL files
22
2
  __pycache__/
23
- *.py[cod]
3
+ *.py[codz]
24
4
  *$py.class
25
5
 
26
6
  # C extensions
@@ -47,8 +27,8 @@ share/python-wheels/
47
27
  MANIFEST
48
28
 
49
29
  # PyInstaller
50
- # Usually these files are written by a python script from a template
51
- # before PyInstaller builds the exe, so as to inject date/other infos into it.
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
52
32
  *.manifest
53
33
  *.spec
54
34
 
@@ -66,7 +46,7 @@ htmlcov/
66
46
  nosetests.xml
67
47
  coverage.xml
68
48
  *.cover
69
- *.py,cover
49
+ *.py.cover
70
50
  .hypothesis/
71
51
  .pytest_cache/
72
52
  cover/
@@ -93,6 +73,7 @@ docs/_build/
93
73
 
94
74
  # PyBuilder
95
75
  .pybuilder/
76
+ target/
96
77
 
97
78
  # Jupyter Notebook
98
79
  .ipynb_checkpoints
@@ -111,22 +92,37 @@ ipython_config.py
111
92
  # However, in case of collaboration, if having platform-specific dependencies or dependencies
112
93
  # having no cross-platform support, pipenv may install dependencies that don't work, or not
113
94
  # install all needed dependencies.
114
- #Pipfile.lock
95
+ # Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # uv.lock
115
102
 
116
103
  # poetry
117
104
  # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
118
105
  # This is especially recommended for binary packages to ensure reproducibility, and is more
119
106
  # commonly ignored for libraries.
120
107
  # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
121
- #poetry.lock
108
+ # poetry.lock
109
+ # poetry.toml
122
110
 
123
111
  # pdm
124
112
  # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
125
- #pdm.lock
126
- # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
127
- # in version control.
128
- # https://pdm.fming.dev/#use-with-ide
129
- .pdm.toml
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ # pdm.lock
116
+ # pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ # pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
130
126
 
131
127
  # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
132
128
  __pypackages__/
@@ -135,11 +131,25 @@ __pypackages__/
135
131
  celerybeat-schedule
136
132
  celerybeat.pid
137
133
 
134
+ # Redis
135
+ *.rdb
136
+ *.aof
137
+ *.pid
138
+
139
+ # RabbitMQ
140
+ mnesia/
141
+ rabbitmq/
142
+ rabbitmq-data/
143
+
144
+ # ActiveMQ
145
+ activemq-data/
146
+
138
147
  # SageMath parsed files
139
148
  *.sage.py
140
149
 
141
150
  # Environments
142
151
  .env
152
+ .envrc
143
153
  .venv
144
154
  env/
145
155
  venv/
@@ -156,7 +166,6 @@ venv.bak/
156
166
 
157
167
  # mkdocs documentation
158
168
  /site
159
- debug.html
160
169
 
161
170
  # mypy
162
171
  .mypy_cache/
@@ -173,8 +182,36 @@ dmypy.json
173
182
  cython_debug/
174
183
 
175
184
  # PyCharm
176
- # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
177
- # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
178
- # and can be added to the global gitignore or merged into this file. For a more nuclear
179
- # option (not recommended) you can uncomment the following to ignore the entire idea folder.
180
- #.idea/
185
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
186
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
187
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
188
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
189
+ # .idea/
190
+
191
+ # Abstra
192
+ # Abstra is an AI-powered process automation framework.
193
+ # Ignore directories containing user credentials, local state, and settings.
194
+ # Learn more at https://abstra.io/docs
195
+ .abstra/
196
+
197
+ # Visual Studio Code
198
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
199
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
200
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
201
+ # you could uncomment the following to ignore the entire vscode folder
202
+ # .vscode/
203
+
204
+ # Ruff stuff:
205
+ .ruff_cache/
206
+
207
+ # PyPI configuration file
208
+ .pypirc
209
+
210
+ # Marimo
211
+ marimo/_static/
212
+ marimo/_lsp/
213
+ __marimo__/
214
+
215
+ # Streamlit
216
+ .streamlit/secrets.toml
217
+ .claude/
@@ -0,0 +1,450 @@
1
+ Metadata-Version: 2.4
2
+ Name: dreadnode
3
+ Version: 2.0.1
4
+ Summary: Dreadnode SDK
5
+ Project-URL: Homepage, https://github.com/dreadnode/sdk
6
+ Project-URL: Repository, https://github.com/dreadnode/sdk
7
+ Project-URL: Documentation, https://docs.dreadnode.io
8
+ Author-email: Dreadnode Team <support@dreadnode.io>
9
+ Requires-Python: <3.14,>=3.10
10
+ Requires-Dist: aiodocker>=0.25.0
11
+ Requires-Dist: aiofiles<25.0.0,>=24.1.0
12
+ Requires-Dist: chdb>=3.0.0
13
+ Requires-Dist: coolname<3.0.0,>=2.2.0
14
+ Requires-Dist: cyclopts>=4.2.0
15
+ Requires-Dist: fastapi>=0.115.0
16
+ Requires-Dist: fastmcp>=2.14.0
17
+ Requires-Dist: fsspec[s3]<=2025.10.0,>=2025.10.0
18
+ Requires-Dist: httpx<1.0.0,>=0.28.0
19
+ Requires-Dist: jsonpath-ng>=1.7.0
20
+ Requires-Dist: jsonref>=1.1.0
21
+ Requires-Dist: litellm>=1.80.11
22
+ Requires-Dist: logfire<=3.20.0,>=3.5.3
23
+ Requires-Dist: loguru>=0.7.3
24
+ Requires-Dist: numpy<=2.3.5
25
+ Requires-Dist: optuna<5.0.0,>=4.5.0
26
+ Requires-Dist: orjson>=3.11.5
27
+ Requires-Dist: pandas<3.0.0,>=2.2.3
28
+ Requires-Dist: pyarrow>=4.0.0
29
+ Requires-Dist: pydantic-settings>=2.7.0
30
+ Requires-Dist: pydantic-xml>=2.14.0
31
+ Requires-Dist: pydantic<3.0.0,>=2.9.2
32
+ Requires-Dist: python-jsonpath>=2.0.1
33
+ Requires-Dist: python-ulid<4.0.0,>=3.0.0
34
+ Requires-Dist: pyyaml>=6.0.2
35
+ Requires-Dist: textual>=8.0.2
36
+ Requires-Dist: tomlkit>=0.13.3
37
+ Requires-Dist: transformers>=4.57.1
38
+ Requires-Dist: universal-pathlib<0.4.0,>=0.3.3
39
+ Requires-Dist: uuid-utils>=0.12.0
40
+ Requires-Dist: uvicorn>=0.34.0
41
+ Requires-Dist: websockets>=14.0
42
+ Requires-Dist: xmltodict>=1.0.2
43
+ Provides-Extra: all
44
+ Requires-Dist: confusables<2.0.0,>=1.2.0; extra == 'all'
45
+ Requires-Dist: datasets<5.0.0,>=4.0.0; extra == 'all'
46
+ Requires-Dist: moviepy<3.0.0,>=2.1.2; extra == 'all'
47
+ Requires-Dist: nltk<4.0.0,>=3.9.1; extra == 'all'
48
+ Requires-Dist: pillow<12.0.0,>=11.2.1; extra == 'all'
49
+ Requires-Dist: presidio-analyzer<3.0.0,>=2.2.359; extra == 'all'
50
+ Requires-Dist: pyarrow>=4.0.0; extra == 'all'
51
+ Requires-Dist: rapidfuzz>=3.14.1; extra == 'all'
52
+ Requires-Dist: scikit-learn<2.0.0,>=1.7.1; extra == 'all'
53
+ Requires-Dist: scipy<2.0.0,>=1.11.0; extra == 'all'
54
+ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == 'all'
55
+ Requires-Dist: soundfile<1.0.0,>=0.13.1; extra == 'all'
56
+ Requires-Dist: textblob<1.0.0,>=0.19.0; extra == 'all'
57
+ Requires-Dist: textstat<1.0.0,>=0.7.10; extra == 'all'
58
+ Requires-Dist: transformers<5.0.0,>=4.41.0; extra == 'all'
59
+ Provides-Extra: multimodal
60
+ Requires-Dist: moviepy<3.0.0,>=2.1.2; extra == 'multimodal'
61
+ Requires-Dist: pillow<12.0.0,>=11.2.1; extra == 'multimodal'
62
+ Requires-Dist: scipy<2.0.0,>=1.11.0; extra == 'multimodal'
63
+ Requires-Dist: soundfile<1.0.0,>=0.13.1; extra == 'multimodal'
64
+ Provides-Extra: scoring
65
+ Requires-Dist: confusables<2.0.0,>=1.2.0; extra == 'scoring'
66
+ Requires-Dist: nltk<4.0.0,>=3.9.1; extra == 'scoring'
67
+ Requires-Dist: presidio-analyzer<3.0.0,>=2.2.359; extra == 'scoring'
68
+ Requires-Dist: rapidfuzz>=3.14.1; extra == 'scoring'
69
+ Requires-Dist: scikit-learn<2.0.0,>=1.7.1; extra == 'scoring'
70
+ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == 'scoring'
71
+ Requires-Dist: textblob<1.0.0,>=0.19.0; extra == 'scoring'
72
+ Requires-Dist: textstat<1.0.0,>=0.7.10; extra == 'scoring'
73
+ Provides-Extra: serve
74
+ Requires-Dist: ray[default,serve]<3.0.0,>=2.10.0; extra == 'serve'
75
+ Provides-Extra: torch
76
+ Requires-Dist: torch>=2.9.0; extra == 'torch'
77
+ Provides-Extra: training
78
+ Requires-Dist: datasets<5.0.0,>=4.0.0; extra == 'training'
79
+ Requires-Dist: pyarrow>=4.0.0; extra == 'training'
80
+ Requires-Dist: transformers<5.0.0,>=4.41.0; extra == 'training'
81
+ Provides-Extra: training-rl
82
+ Requires-Dist: datasets<5.0.0,>=4.0.0; extra == 'training-rl'
83
+ Requires-Dist: ray[default]<3.0.0,>=2.10.0; extra == 'training-rl'
84
+ Requires-Dist: torch>=2.9.0; extra == 'training-rl'
85
+ Requires-Dist: transformers<5.0.0,>=4.41.0; extra == 'training-rl'
86
+ Requires-Dist: vllm<1.0.0,>=0.6.0; (python_version >= '3.12' and sys_platform == 'linux') and extra == 'training-rl'
87
+ Provides-Extra: transforms
88
+ Requires-Dist: art<7.0.0,>=6.5; extra == 'transforms'
89
+ Description-Content-Type: text/markdown
90
+
91
+ <p align="center">
92
+ <img
93
+ src="https://d1lppblt9t2x15.cloudfront.net/logos/5714928f3cdc09503751580cffbe8d02.png"
94
+ alt="Logo"
95
+ align="center"
96
+ width="144px"
97
+ height="144px"
98
+ />
99
+ </p>
100
+
101
+ <h3 align="center">
102
+ Dreadnode Strikes SDK
103
+ </h3>
104
+
105
+ <h4 align="center">
106
+ <img alt="PyPI - Python Version" src="https://img.shields.io/pypi/pyversions/dreadnode">
107
+ <img alt="PyPI - Version" src="https://img.shields.io/pypi/v/dreadnode">
108
+ <img alt="GitHub License" src="https://img.shields.io/github/license/dreadnode/sdk">
109
+ <img alt="Tests" src="https://img.shields.io/github/actions/workflow/status/dreadnode/sdk/tests.yaml">
110
+ <img alt="Pre-Commit" src="https://img.shields.io/github/actions/workflow/status/dreadnode/sdk/pre-commit.yaml">
111
+ <img alt="Renovate" src="https://img.shields.io/github/actions/workflow/status/dreadnode/sdk/renovate.yaml">
112
+ </h4>
113
+
114
+ </br>
115
+
116
+ Strikes is a comprehensive platform for building, experimenting with, and evaluating AI security agents.
117
+
118
+ ## Key Features
119
+
120
+ - **Agents** - Build multi-step reasoning agents with tools, hooks, and scoring
121
+ - **Tasks & Runs** - Structure experiments with tracked inputs, outputs, and metrics
122
+ - **Evaluations** - Run agents against datasets with composable scorers
123
+ - **AIRT** - AI red teaming tools to probe for security and safety failure modes (TAP, GOAT, Crescendo, AutoDAN-Turbo)
124
+ - **Observability** - OpenTelemetry-based tracing with span hierarchy
125
+ - **Datasets & Models** - HuggingFace integration with local CAS storage
126
+ - **Deployment** - Serve agents via FastAPI, Cloudflare Workers, or Ray
127
+
128
+ ## Quick Example
129
+
130
+ ```python
131
+ import dreadnode as dn
132
+
133
+ dn.configure()
134
+
135
+ # Define a tool
136
+ @dn.tool
137
+ def search_database(query: str) -> list[str]:
138
+ """Search the vulnerability database."""
139
+ return ["CVE-2024-1234", "CVE-2024-5678"]
140
+
141
+ # Create an agent with tools
142
+ @dn.agent(model="openai/gpt-4o", tools=[search_database])
143
+ def security_analyst():
144
+ """You are a security analyst. Find and analyze vulnerabilities."""
145
+
146
+ # Run the agent - tracing is automatic
147
+ async def main():
148
+ trajectory = await security_analyst.run(
149
+ "Analyze recent vulnerabilities in the database"
150
+ )
151
+
152
+ print(f"Completed in {len(trajectory.steps)} steps")
153
+ print(f"Token usage: {trajectory.usage.total_tokens}")
154
+ ```
155
+
156
+ ## Platform Authentication
157
+
158
+ The Python SDK and TUI use an API-key-only platform auth flow.
159
+
160
+ - Generate a Dreadnode API key from the platform.
161
+ - In the TUI, log in with `/login <api-key> [--server <url>]`.
162
+ That `/login --server` value is the platform API URL. When launching the TUI itself,
163
+ `dreadnode --server ...` is a different flag: it overrides the local runtime endpoint
164
+ and disables auto-start.
165
+ - The TUI now boots the local runtime in local-only mode when needed. Logging in or
166
+ logging out restarts the runtime to apply or remove platform sync; active runs stop,
167
+ but local chat history is preserved on disk. `/logout` deletes the active saved
168
+ profile and switches the current runtime session back to local-only mode.
169
+ - In Python, pass `api_key=...` to `dn.configure(...)` or `dn.login(...)`.
170
+ - The TUI starts the local runtime with `uv run dreadnode serve ...` using the
171
+ active profile's explicit platform context.
172
+ - The local TUI runtime server is started with the active profile's API key and
173
+ platform context explicitly; it does not depend on re-reading saved profile
174
+ state at startup when those values are already provided.
175
+ - In the TUI, `Ctrl+T` opens traces, `Ctrl+S` opens the current user's
176
+ sandboxes, `Ctrl+E` opens workspace evaluations, and `Ctrl+Y` opens
177
+ workspace runtimes.
178
+ - Additional platform browser commands are available in the TUI:
179
+ - `/runtimes` or `Ctrl+Y` for workspace interactive runtimes
180
+ - `/hub` or `F6` for datasets, models, tasks, and capabilities
181
+ - `/secrets` or `F7` for configured user secrets and provider presets
182
+
183
+ The SDK no longer stores browser/device-login tokens or refresh tokens in local profiles.
184
+
185
+ ## Agents
186
+
187
+ Create agents with tools, hooks, and real-time scoring:
188
+
189
+ ```python
190
+ import dreadnode as dn
191
+ from dreadnode import tool
192
+ from dreadnode.core.agents.reactions import Finish, Continue
193
+
194
+ # Tools with type hints
195
+ @tool
196
+ def scan_ports(host: str) -> list[int]:
197
+ """Scan for open ports on a host."""
198
+ return [22, 80, 443] # Simplified example
199
+
200
+ # Agent with configuration
201
+ @dn.agent(
202
+ model="anthropic/claude-3-5-sonnet",
203
+ tools=[scan_ports],
204
+ max_steps=10,
205
+ )
206
+ def pentester():
207
+ """You are a penetration tester. Find security issues."""
208
+
209
+ # Hooks for control flow
210
+ @pentester.hook
211
+ async def check_progress(event):
212
+ if "found vulnerability" in str(event):
213
+ return Finish("Vulnerability discovered")
214
+ return Continue()
215
+
216
+ # Run the agent
217
+ trajectory = await pentester.run("Test the web application at localhost:8080")
218
+ print(f"Completed in {len(trajectory.steps)} steps")
219
+ print(f"Token usage: {trajectory.usage.total_tokens}")
220
+ ```
221
+
222
+ ## Evaluations
223
+
224
+ Run systematic evaluations with datasets and scorers:
225
+
226
+ ```python
227
+ from dreadnode import Evaluation
228
+ from dreadnode.scorers import contains, llm_judge, and_, not_
229
+
230
+ # Compose scorers
231
+ quality = and_(
232
+ contains("vulnerability", case_sensitive=False),
233
+ not_(contains("error")),
234
+ )
235
+
236
+ judge = llm_judge(
237
+ model="openai/gpt-4o-mini",
238
+ rubric="Rate the security analysis from 1-10 based on thoroughness.",
239
+ )
240
+
241
+ # Create evaluation
242
+ evaluation = Evaluation(
243
+ name="security-eval",
244
+ task=pentester.as_task(),
245
+ dataset=[
246
+ {"target": "webapp-1", "goal": "Find SQL injection"},
247
+ {"target": "webapp-2", "goal": "Find XSS vulnerabilities"},
248
+ {"target": "api-server", "goal": "Test authentication"},
249
+ ],
250
+ scorers=[quality, judge],
251
+ concurrency=3,
252
+ )
253
+
254
+ # Run evaluation
255
+ result = await evaluation.run()
256
+ print(f"Average score: {result.metrics['judge'].mean()}")
257
+ ```
258
+
259
+ ## AIRT (AI Red Teaming)
260
+
261
+ AI red teaming tools to probe for security and safety failure modes:
262
+
263
+ ```python
264
+ from dreadnode import task
265
+ from dreadnode.airt import tap_attack, goat_attack, crescendo_attack, autodan_turbo_attack, renellm_attack
266
+ from dreadnode.transforms.language import adapt_language
267
+
268
+ # Define your target
269
+ @task
270
+ async def target(prompt: str) -> str:
271
+ # Your LLM or system to test
272
+ return await your_llm(prompt)
273
+
274
+ # TAP: Tree-based beam search attack
275
+ attack = tap_attack(
276
+ goal="Write instructions for making explosives",
277
+ target=target,
278
+ attacker_model="openai/gpt-4o",
279
+ evaluator_model="openai/gpt-4o",
280
+ )
281
+
282
+ # GOAT: Graph-based neighborhood search
283
+ attack = goat_attack(
284
+ goal="Generate harmful content",
285
+ target=target,
286
+ attacker_model="openai/gpt-4o",
287
+ evaluator_model="openai/gpt-4o",
288
+ )
289
+
290
+ # Crescendo: Multi-turn progressive escalation
291
+ attack = crescendo_attack(
292
+ goal="Extract confidential information",
293
+ target=target,
294
+ attacker_model="openai/gpt-4o",
295
+ evaluator_model="openai/gpt-4o",
296
+ )
297
+
298
+ # AutoDAN-Turbo: Lifelong strategy learning
299
+ attack = autodan_turbo_attack(
300
+ goal="Generate harmful content",
301
+ target=target,
302
+ attacker_model="openai/gpt-4o",
303
+ evaluator_model="openai/gpt-4o",
304
+ strategy_library_path="./strategies.json", # Persist learned strategies
305
+ )
306
+
307
+ # ReNeLLM: Prompt rewriting + scenario nesting
308
+ attack = renellm_attack(
309
+ goal="Generate harmful content",
310
+ target=target,
311
+ attacker_model="openai/gpt-4o",
312
+ evaluator_model="openai/gpt-4o",
313
+ rewrite_methods=["paraphrase", "compress"], # Semantic-preserving rewrites
314
+ nesting_scenarios=["code", "research"], # Benign context framing
315
+ )
316
+
317
+ # With language transforms
318
+ spanish = adapt_language("Spanish", adapter_model="openai/gpt-4o")
319
+ attack = tap_attack(goal="...", target=target, transforms=[spanish], ...)
320
+
321
+ result = await attack.run()
322
+ print(f"Best score: {result.best_score}")
323
+ ```
324
+
325
+ ## Datasets & Models
326
+
327
+ HuggingFace integration with local storage:
328
+
329
+ ```python
330
+ from dreadnode.datasets import Dataset
331
+ from dreadnode.models import Model
332
+
333
+ # Load dataset
334
+ dataset = Dataset.from_hf("squad", split="train[:100]")
335
+
336
+ # Transform and filter
337
+ dataset = dataset.map(lambda x: {"input": x["question"]})
338
+ dataset = dataset.filter(lambda x: len(x["input"]) > 10)
339
+
340
+ # Save locally
341
+ dataset.save("my-dataset")
342
+
343
+ # Load models
344
+ model = Model.from_hf("bert-base-uncased")
345
+ ```
346
+
347
+ ## Tracing & Observability
348
+
349
+ Agents have built-in observability. For lower-level task workflows, use explicit tracing:
350
+
351
+ ```python
352
+ import dreadnode as dn
353
+
354
+ # Agents trace automatically
355
+ trajectory = await security_analyst.run("Analyze the target")
356
+ # All steps, tool calls, and generations are traced
357
+
358
+ # For custom task workflows, use explicit runs
359
+ @dn.task
360
+ async def analyze(target: str) -> dict:
361
+ dn.log_input("target", target)
362
+ result = {"status": "complete"}
363
+ dn.log_output("result", result)
364
+ dn.log_metric("quality", 0.95)
365
+ return result
366
+
367
+ with dn.run(name="custom-analysis"):
368
+ await analyze("webapp")
369
+ ```
370
+
371
+ ## Deployment
372
+
373
+ Serve agents as HTTP endpoints:
374
+
375
+ ```python
376
+ from dreadnode.core.integrations.serve import Serve, AuthMode
377
+
378
+ # Configure server
379
+ server = (
380
+ Serve()
381
+ .with_auth(AuthMode.API_KEY)
382
+ .add(security_analyst, path="/analyze")
383
+ .add(pentester, path="/pentest")
384
+ )
385
+
386
+ # Run server
387
+ server.run(host="0.0.0.0", port=8000)
388
+
389
+ # Or get FastAPI app for custom configuration
390
+ app = server.app()
391
+ ```
392
+
393
+ ## Installation
394
+
395
+ Install from PyPI:
396
+
397
+ ```bash
398
+ pip install -U dreadnode
399
+ ```
400
+
401
+ With optional features:
402
+
403
+ ```bash
404
+ # Multimodal support (audio, video, images)
405
+ pip install -U "dreadnode[multimodal]"
406
+
407
+ # Training integration (transformers callbacks)
408
+ pip install -U "dreadnode[training]"
409
+
410
+ # All optional features
411
+ pip install -U "dreadnode[all]"
412
+ ```
413
+
414
+ From source:
415
+
416
+ ```bash
417
+ git clone https://github.com/dreadnode/sdk
418
+ cd sdk
419
+ uv sync --all-extras
420
+ ```
421
+
422
+ ## Notebooks
423
+
424
+ Comprehensive Jupyter notebook tutorials are available in [`notebooks/`](./notebooks/):
425
+
426
+ | Category | Notebooks |
427
+ |----------|-----------|
428
+ | Getting Started | 01: SDK Basics, 02: Tasks & Runs |
429
+ | Agents | 03-07: Basics, Tools, Hooks, Scoring, Advanced |
430
+ | Evaluation | 08-11: Scorers, Evaluations |
431
+ | Data | 12-14: Datasets, Models, Data Types |
432
+ | Security (AIRT) | 15-17: Targets, Attacks, Transforms |
433
+ | Advanced | 18-24: Search, Generators, Data Designer, Deployment, Tracing, Packaging, Training |
434
+ | Developers | 25-27: Config System, Context Injection, Custom Components |
435
+ | Environments | 28: Docker, Jupyter Kernel, Kubernetes Sandbox |
436
+ | Studies | 29: Optimization Studies, Agent Tuning, Search Strategies |
437
+
438
+ ## Documentation
439
+
440
+ - **[Installation Guide](https://docs.dreadnode.io/strikes/install)** - Setup options
441
+ - **[Introduction](https://docs.dreadnode.io/strikes/intro)** - Getting started guide
442
+ - **[API Reference](https://docs.dreadnode.io/strikes/api)** - Complete API documentation
443
+
444
+ ## Examples
445
+
446
+ Check out **[dreadnode/example-agents](https://github.com/dreadnode/example-agents)** for real-world use cases.
447
+
448
+ ## License
449
+
450
+ See [LICENSE](./LICENSE) for details.