dreadnode 2.0.2__tar.gz → 2.0.3__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.
- {dreadnode-2.0.2 → dreadnode-2.0.3}/PKG-INFO +2 -1
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/api/client.py +52 -3
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/airt.py +38 -28
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/capability.py +2 -2
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/dataset.py +9 -7
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/evaluation.py +22 -8
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/main.py +16 -8
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/model.py +9 -7
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/optimize.py +40 -16
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/shared.py +15 -13
- dreadnode-2.0.3/dreadnode/app/cli/task.py +275 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/train.py +138 -46
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/worlds.py +66 -50
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/main.py +159 -1
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/print_mode.py +2 -2
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/server/app.py +53 -16
- dreadnode-2.0.3/dreadnode/app/server/auth.py +53 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/server/session.py +21 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/app.py +583 -190
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/client.py +128 -11
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/commands.py +1 -6
- dreadnode-2.0.3/dreadnode/app/tui/connection.py +325 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/dreadnode.tcss +244 -118
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/event_contract.py +14 -0
- dreadnode-2.0.3/dreadnode/app/tui/runtime_cache.py +97 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/__init__.py +2 -2
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/auth.py +32 -4
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/base.py +30 -20
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/capabilities.py +67 -21
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/console.py +16 -4
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/environments.py +10 -9
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/evaluations.py +41 -11
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/model_picker.py +6 -6
- dreadnode-2.0.3/dreadnode/app/tui/screens/runtimes.py +1059 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/sandboxes.py +41 -11
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/secrets.py +10 -7
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/sessions.py +28 -27
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/screens/traces.py +16 -17
- dreadnode-2.0.3/dreadnode/app/tui/screens/workspaces.py +651 -0
- dreadnode-2.0.3/dreadnode/app/tui/theme.py +122 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/turn_reducer.py +25 -0
- dreadnode-2.0.3/dreadnode/app/tui/update_check.py +105 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/agent_dialog.py +22 -21
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/composer.py +17 -9
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/header_bar.py +3 -3
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/help_panel.py +27 -30
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/mcp_dialog.py +14 -18
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/mention_overlay.py +9 -4
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/skills_dialog.py +6 -9
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/slash_overlay.py +9 -4
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/status_bar.py +32 -16
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/tools_dialog.py +10 -18
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/welcome.py +32 -11
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/capabilities/loader.py +5 -5
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/jobs.py +60 -24
- dreadnode-2.0.3/dreadnode/packaging/task_validation.py +438 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/credentials.py +4 -5
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/prompt_leak.py +3 -4
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/storage/__init__.py +2 -2
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/version.py +4 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/pyproject.toml +13 -1
- dreadnode-2.0.2/dreadnode/app/cli/task.py +0 -139
- dreadnode-2.0.2/dreadnode/app/tui/screens/hub.py +0 -224
- dreadnode-2.0.2/dreadnode/app/tui/screens/runtimes.py +0 -314
- dreadnode-2.0.2/dreadnode/app/tui/theme.py +0 -48
- {dreadnode-2.0.2 → dreadnode-2.0.3}/.gitignore +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/LICENSE +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/README.md +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/agent.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/events.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/hooks.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/tools.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/assessment.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/api/models.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/server/default-agent/tools/coding.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/server/default-agent/tools/subagent.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/server/system-prompt.md +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/context_bar.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/conversation.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/tool.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/generator/base.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/generator/litellm_.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.2 → dreadnode-2.0.3}/dreadnode/transforms/xml_tools.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dreadnode
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.3
|
|
4
4
|
Summary: Dreadnode SDK
|
|
5
5
|
Project-URL: Homepage, https://dreadnode.io
|
|
6
6
|
Project-URL: Documentation, https://docs.dreadnode.io
|
|
@@ -27,6 +27,7 @@ Requires-Dist: moviepy<3.0.0,>=2.1.2
|
|
|
27
27
|
Requires-Dist: numpy<=2.3.5,>=2.3.0
|
|
28
28
|
Requires-Dist: optuna<5.0.0,>=4.5.0
|
|
29
29
|
Requires-Dist: orjson>=3.11.5
|
|
30
|
+
Requires-Dist: packaging>=24.0
|
|
30
31
|
Requires-Dist: pandas<3.0.0,>=2.2.3
|
|
31
32
|
Requires-Dist: pillow<12.0.0,>=11.2.1
|
|
32
33
|
Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
|
|
@@ -229,9 +229,9 @@ class ApiClient:
|
|
|
229
229
|
response = self.request("GET", "/user/preferences")
|
|
230
230
|
return t.cast("dict[str, t.Any]", response.json())
|
|
231
231
|
|
|
232
|
-
def provision_inference_key(self) -> dict[str, t.Any]:
|
|
233
|
-
"""POST /api/v1/inference/keys - Provision a litellm virtual key."""
|
|
234
|
-
response = self.request("POST", "/inference/keys")
|
|
232
|
+
def provision_inference_key(self, org_key: str) -> dict[str, t.Any]:
|
|
233
|
+
"""POST /api/v1/org/{org}/inference/keys - Provision a litellm virtual key."""
|
|
234
|
+
response = self.request("POST", f"/org/{org_key}/inference/keys")
|
|
235
235
|
return t.cast("dict[str, t.Any]", response.json())
|
|
236
236
|
|
|
237
237
|
# =========================================================================
|
|
@@ -463,6 +463,20 @@ class ApiClient:
|
|
|
463
463
|
response = self.request("GET", f"/org/{org}/ws/{workspace}")
|
|
464
464
|
return Workspace(**response.json())
|
|
465
465
|
|
|
466
|
+
def create_workspace(
|
|
467
|
+
self,
|
|
468
|
+
org: str,
|
|
469
|
+
name: str,
|
|
470
|
+
key: str,
|
|
471
|
+
description: str | None = None,
|
|
472
|
+
) -> Workspace:
|
|
473
|
+
"""POST /org/{org}/ws - Create a new workspace."""
|
|
474
|
+
payload: dict[str, t.Any] = {"name": name, "key": key}
|
|
475
|
+
if description:
|
|
476
|
+
payload["description"] = description
|
|
477
|
+
response = self.request("POST", f"/org/{org}/ws", json_data=payload)
|
|
478
|
+
return Workspace(**response.json())
|
|
479
|
+
|
|
466
480
|
# =========================================================================
|
|
467
481
|
# Projects
|
|
468
482
|
# =========================================================================
|
|
@@ -500,6 +514,10 @@ class ApiClient:
|
|
|
500
514
|
response = self.request("POST", f"/org/{org}/ws/{workspace}/projects", json_data=payload)
|
|
501
515
|
return Project(**response.json())
|
|
502
516
|
|
|
517
|
+
def delete_project(self, org: str, workspace: str, project: str) -> None:
|
|
518
|
+
"""DELETE /org/{org}/ws/{workspace}/projects/{project} - Delete a project."""
|
|
519
|
+
self.request("DELETE", f"/org/{org}/ws/{workspace}/projects/{project}")
|
|
520
|
+
|
|
503
521
|
# =========================================================================
|
|
504
522
|
# OCI Registry
|
|
505
523
|
# =========================================================================
|
|
@@ -795,6 +813,25 @@ class ApiClient:
|
|
|
795
813
|
)
|
|
796
814
|
return t.cast("dict[str, t.Any]", response.json())
|
|
797
815
|
|
|
816
|
+
def start_runtime(
|
|
817
|
+
self,
|
|
818
|
+
org: str,
|
|
819
|
+
workspace: str,
|
|
820
|
+
runtime_id: str,
|
|
821
|
+
*,
|
|
822
|
+
secret_ids: list[str] | None = None,
|
|
823
|
+
) -> dict[str, t.Any]:
|
|
824
|
+
"""POST /org/{org}/ws/{workspace}/runtimes/{runtime_id}/start - Start or resume a runtime."""
|
|
825
|
+
json_data = None
|
|
826
|
+
if secret_ids is not None:
|
|
827
|
+
json_data = {"secret_ids": secret_ids}
|
|
828
|
+
response = self.request(
|
|
829
|
+
"POST",
|
|
830
|
+
f"/org/{org}/ws/{workspace}/runtimes/{runtime_id}/start",
|
|
831
|
+
json_data=json_data,
|
|
832
|
+
)
|
|
833
|
+
return t.cast("dict[str, t.Any]", response.json())
|
|
834
|
+
|
|
798
835
|
def pause_sandbox(self, org: str, sandbox_id: str) -> dict[str, t.Any]:
|
|
799
836
|
"""POST /org/{org}/sandboxes/{sandbox_id}/pause - Pause a sandbox."""
|
|
800
837
|
response = self.request("POST", f"/org/{org}/sandboxes/{sandbox_id}/pause")
|
|
@@ -809,6 +846,18 @@ class ApiClient:
|
|
|
809
846
|
"""DELETE /org/{org}/sandboxes/{sandbox_id} - Delete (kill) a sandbox."""
|
|
810
847
|
self.request("DELETE", f"/org/{org}/sandboxes/{sandbox_id}")
|
|
811
848
|
|
|
849
|
+
def get_sandbox_logs(self, org: str, sandbox_id: str) -> str:
|
|
850
|
+
"""GET /org/{org}/sandboxes/{sandbox_id}/logs - Get sandbox server logs.
|
|
851
|
+
|
|
852
|
+
Args:
|
|
853
|
+
sandbox_id: The provider sandbox ID (e.g. E2B sandbox ID).
|
|
854
|
+
|
|
855
|
+
Returns:
|
|
856
|
+
Log contents as a string.
|
|
857
|
+
"""
|
|
858
|
+
response = self.request("GET", f"/org/{org}/sandboxes/{sandbox_id}/logs")
|
|
859
|
+
return t.cast("str", response.json().get("logs", ""))
|
|
860
|
+
|
|
812
861
|
def keepalive_sandbox(
|
|
813
862
|
self, org: str, sandbox_id: str, *, extend_seconds: int = 300
|
|
814
863
|
) -> dict[str, t.Any]:
|
|
@@ -29,14 +29,22 @@ def create(
|
|
|
29
29
|
*,
|
|
30
30
|
name: str,
|
|
31
31
|
project_id: str,
|
|
32
|
-
description: str | None = None,
|
|
33
|
-
session_id: str | None = None,
|
|
34
|
-
target_config:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
description: t.Annotated[str | None, cyclopts.Parameter(help="Assessment description")] = None,
|
|
33
|
+
session_id: t.Annotated[str | None, cyclopts.Parameter(help="Session ID to associate")] = None,
|
|
34
|
+
target_config: t.Annotated[
|
|
35
|
+
str | None, cyclopts.Parameter(help="Target configuration as JSON")
|
|
36
|
+
] = None,
|
|
37
|
+
attacker_config: t.Annotated[
|
|
38
|
+
str | None, cyclopts.Parameter(help="Attacker configuration as JSON")
|
|
39
|
+
] = None,
|
|
40
|
+
attack_manifest: t.Annotated[
|
|
41
|
+
str | None, cyclopts.Parameter(help="Attack manifest as JSON")
|
|
42
|
+
] = None,
|
|
43
|
+
workflow_run_id: t.Annotated[str | None, cyclopts.Parameter(help="Workflow run ID")] = None,
|
|
44
|
+
workflow_script: t.Annotated[
|
|
45
|
+
str | None, cyclopts.Parameter(help="Workflow script content")
|
|
46
|
+
] = None,
|
|
47
|
+
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
40
48
|
platform: PlatformConfig = PlatformConfig(),
|
|
41
49
|
) -> None:
|
|
42
50
|
"""Create a new AIRT assessment."""
|
|
@@ -55,7 +63,7 @@ def create(
|
|
|
55
63
|
workflow_run_id=workflow_run_id,
|
|
56
64
|
workflow_script=workflow_script,
|
|
57
65
|
)
|
|
58
|
-
_render_airt_assessment(payload, as_json=
|
|
66
|
+
_render_airt_assessment(payload, as_json=as_json)
|
|
59
67
|
|
|
60
68
|
|
|
61
69
|
# ---------------------------------------------------------------------------
|
|
@@ -66,10 +74,10 @@ def create(
|
|
|
66
74
|
@cli.command(name="list")
|
|
67
75
|
def list_(
|
|
68
76
|
*,
|
|
69
|
-
project_id: str | None = None,
|
|
77
|
+
project_id: t.Annotated[str | None, cyclopts.Parameter(help="Project ID filter")] = None,
|
|
70
78
|
page: int = 1,
|
|
71
79
|
page_size: int = 50,
|
|
72
|
-
|
|
80
|
+
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
73
81
|
platform: PlatformConfig = PlatformConfig(),
|
|
74
82
|
) -> None:
|
|
75
83
|
"""List AIRT assessments."""
|
|
@@ -82,7 +90,7 @@ def list_(
|
|
|
82
90
|
page=page,
|
|
83
91
|
page_size=page_size,
|
|
84
92
|
)
|
|
85
|
-
_render_airt_assessment_list(payload, as_json=
|
|
93
|
+
_render_airt_assessment_list(payload, as_json=as_json)
|
|
86
94
|
|
|
87
95
|
|
|
88
96
|
# ---------------------------------------------------------------------------
|
|
@@ -94,14 +102,14 @@ def list_(
|
|
|
94
102
|
def get(
|
|
95
103
|
assessment_id: str,
|
|
96
104
|
*,
|
|
97
|
-
|
|
105
|
+
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
98
106
|
platform: PlatformConfig = PlatformConfig(),
|
|
99
107
|
) -> None:
|
|
100
108
|
"""Get an AIRT assessment by ID."""
|
|
101
109
|
dn = configured_dreadnode(platform)
|
|
102
110
|
org, workspace, client = require_workspace_context(dn, label="AIRT")
|
|
103
111
|
payload = client.get_airt_assessment(org, workspace, assessment_id)
|
|
104
|
-
_render_airt_assessment(payload, as_json=
|
|
112
|
+
_render_airt_assessment(payload, as_json=as_json)
|
|
105
113
|
|
|
106
114
|
|
|
107
115
|
# ---------------------------------------------------------------------------
|
|
@@ -113,13 +121,15 @@ def get(
|
|
|
113
121
|
def update(
|
|
114
122
|
assessment_id: str,
|
|
115
123
|
*,
|
|
116
|
-
name: str | None = None,
|
|
117
|
-
description:
|
|
124
|
+
name: t.Annotated[str | None, cyclopts.Parameter(help="New assessment name")] = None,
|
|
125
|
+
description: t.Annotated[
|
|
126
|
+
str | None, cyclopts.Parameter(help="New assessment description")
|
|
127
|
+
] = None,
|
|
118
128
|
status: t.Annotated[
|
|
119
129
|
t.Literal["pending", "running", "completed", "failed"] | None,
|
|
120
130
|
cyclopts.Parameter(help="Assessment status"),
|
|
121
131
|
] = None,
|
|
122
|
-
|
|
132
|
+
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
123
133
|
platform: PlatformConfig = PlatformConfig(),
|
|
124
134
|
) -> None:
|
|
125
135
|
"""Update an AIRT assessment."""
|
|
@@ -133,7 +143,7 @@ def update(
|
|
|
133
143
|
name=name,
|
|
134
144
|
description=description,
|
|
135
145
|
)
|
|
136
|
-
_render_airt_assessment(payload, as_json=
|
|
146
|
+
_render_airt_assessment(payload, as_json=as_json)
|
|
137
147
|
|
|
138
148
|
|
|
139
149
|
# ---------------------------------------------------------------------------
|
|
@@ -163,14 +173,14 @@ def delete(
|
|
|
163
173
|
def reports(
|
|
164
174
|
assessment_id: str,
|
|
165
175
|
*,
|
|
166
|
-
|
|
176
|
+
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
167
177
|
platform: PlatformConfig = PlatformConfig(),
|
|
168
178
|
) -> None:
|
|
169
179
|
"""List reports for an AIRT assessment."""
|
|
170
180
|
dn = configured_dreadnode(platform)
|
|
171
181
|
org, workspace, client = require_workspace_context(dn, label="AIRT")
|
|
172
182
|
payload = client.list_airt_reports(org, workspace, assessment_id)
|
|
173
|
-
_render_airt_reports(payload, as_json=
|
|
183
|
+
_render_airt_reports(payload, as_json=as_json)
|
|
174
184
|
|
|
175
185
|
|
|
176
186
|
# ---------------------------------------------------------------------------
|
|
@@ -255,10 +265,10 @@ def attacks(
|
|
|
255
265
|
def trials(
|
|
256
266
|
assessment_id: str,
|
|
257
267
|
*,
|
|
258
|
-
attack_name: str | None = None,
|
|
259
|
-
min_score: float | None = None,
|
|
268
|
+
attack_name: t.Annotated[str | None, cyclopts.Parameter(help="Filter by attack name")] = None,
|
|
269
|
+
min_score: t.Annotated[float | None, cyclopts.Parameter(help="Minimum score filter")] = None,
|
|
260
270
|
jailbreaks_only: t.Annotated[bool, cyclopts.Parameter(negative=())] = False,
|
|
261
|
-
limit: int = 100,
|
|
271
|
+
limit: t.Annotated[int, cyclopts.Parameter(help="Maximum results to return")] = 100,
|
|
262
272
|
platform: PlatformConfig = PlatformConfig(),
|
|
263
273
|
) -> None:
|
|
264
274
|
"""Get trial spans for an AIRT assessment."""
|
|
@@ -303,10 +313,10 @@ def project_summary(
|
|
|
303
313
|
def findings(
|
|
304
314
|
project: str,
|
|
305
315
|
*,
|
|
306
|
-
severity: str | None = None,
|
|
307
|
-
category: str | None = None,
|
|
308
|
-
attack_name: str | None = None,
|
|
309
|
-
min_score: float | None = None,
|
|
316
|
+
severity: t.Annotated[str | None, cyclopts.Parameter(help="Severity filter")] = None,
|
|
317
|
+
category: t.Annotated[str | None, cyclopts.Parameter(help="Category filter")] = None,
|
|
318
|
+
attack_name: t.Annotated[str | None, cyclopts.Parameter(help="Attack name filter")] = None,
|
|
319
|
+
min_score: t.Annotated[float | None, cyclopts.Parameter(help="Minimum score filter")] = None,
|
|
310
320
|
sort_by: t.Literal["score", "severity", "category", "attack_name", "created_at"] = "score",
|
|
311
321
|
sort_dir: t.Literal["asc", "desc"] = "desc",
|
|
312
322
|
page: int = 1,
|
|
@@ -342,7 +352,7 @@ def generate_project_report(
|
|
|
342
352
|
project: str,
|
|
343
353
|
*,
|
|
344
354
|
format: t.Literal["markdown", "json", "both"] = "both",
|
|
345
|
-
model_profile: str | None = None,
|
|
355
|
+
model_profile: t.Annotated[str | None, cyclopts.Parameter(help="Model profile as JSON")] = None,
|
|
346
356
|
platform: PlatformConfig = PlatformConfig(),
|
|
347
357
|
) -> None:
|
|
348
358
|
"""Generate a report for an AIRT project."""
|
|
@@ -65,14 +65,14 @@ def list_(
|
|
|
65
65
|
name: str | None = None,
|
|
66
66
|
limit: int = 50,
|
|
67
67
|
offset: int = 0,
|
|
68
|
-
|
|
68
|
+
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
69
69
|
registry: RegistryConfig = RegistryConfig(),
|
|
70
70
|
) -> None:
|
|
71
71
|
"""List capability artifacts in the organization."""
|
|
72
72
|
dn = configured_dreadnode(registry)
|
|
73
73
|
org, client = require_registry_context(dn)
|
|
74
74
|
payload = client.list_capabilities(org, name=name, limit=limit, offset=offset)
|
|
75
|
-
_render_capability_list(payload, as_json=
|
|
75
|
+
_render_capability_list(payload, as_json=as_json)
|
|
76
76
|
|
|
77
77
|
|
|
78
78
|
# ---------------------------------------------------------------------------
|
|
@@ -11,7 +11,6 @@ from dreadnode.app.cli.shared import (
|
|
|
11
11
|
_render_package_list,
|
|
12
12
|
configured_dreadnode,
|
|
13
13
|
require_registry_context,
|
|
14
|
-
resolved_name,
|
|
15
14
|
)
|
|
16
15
|
|
|
17
16
|
cli = cyclopts.App(name="dataset", help="Manage datasets.")
|
|
@@ -32,17 +31,20 @@ def push(
|
|
|
32
31
|
) -> None:
|
|
33
32
|
"""Build and push a dataset artifact."""
|
|
34
33
|
dn = configured_dreadnode(registry)
|
|
35
|
-
dataset = dn.load_dataset(path)
|
|
36
34
|
result = dn.push_dataset(path, name=name, skip_upload=skip_upload)
|
|
37
35
|
if not result.success:
|
|
38
36
|
raise SystemExit("; ".join(result.errors) or "Dataset push failed")
|
|
39
37
|
|
|
40
|
-
|
|
38
|
+
if result.package_name is None or result.package_version is None:
|
|
39
|
+
raise SystemExit("Dataset push returned incomplete metadata")
|
|
40
|
+
|
|
41
|
+
display_name = result.package_name
|
|
42
|
+
display_version = result.package_version
|
|
41
43
|
if skip_upload or not dn.can_sync:
|
|
42
|
-
print(f"Built {
|
|
44
|
+
print(f"Built {display_name}@{display_version}")
|
|
43
45
|
return
|
|
44
46
|
digest = result.manifest_digest or "unknown"
|
|
45
|
-
print(f"Pushed {
|
|
47
|
+
print(f"Pushed {display_name}@{display_version} ({digest})")
|
|
46
48
|
|
|
47
49
|
|
|
48
50
|
# ---------------------------------------------------------------------------
|
|
@@ -53,14 +55,14 @@ def push(
|
|
|
53
55
|
@cli.command(name="list")
|
|
54
56
|
def list_(
|
|
55
57
|
*,
|
|
56
|
-
|
|
58
|
+
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
57
59
|
registry: RegistryConfig = RegistryConfig(),
|
|
58
60
|
) -> None:
|
|
59
61
|
"""List dataset artifacts in the organization."""
|
|
60
62
|
dn = configured_dreadnode(registry)
|
|
61
63
|
org, client = require_registry_context(dn)
|
|
62
64
|
packages = client.list_datasets(org)
|
|
63
|
-
_render_package_list(packages, as_json=
|
|
65
|
+
_render_package_list(packages, as_json=as_json)
|
|
64
66
|
|
|
65
67
|
|
|
66
68
|
# ---------------------------------------------------------------------------
|
|
@@ -33,10 +33,14 @@ def create(
|
|
|
33
33
|
name="--task", negative_iterable=(), help="Task name (repeatable, required)"
|
|
34
34
|
),
|
|
35
35
|
],
|
|
36
|
-
runtime_id: str | None = None,
|
|
37
|
-
model: str | None = None,
|
|
38
|
-
concurrency:
|
|
39
|
-
|
|
36
|
+
runtime_id: t.Annotated[str | None, cyclopts.Parameter(help="Runtime environment ID")] = None,
|
|
37
|
+
model: t.Annotated[str | None, cyclopts.Parameter(help="Model identifier")] = None,
|
|
38
|
+
concurrency: t.Annotated[
|
|
39
|
+
int | None, cyclopts.Parameter(help="Maximum concurrent evaluation jobs")
|
|
40
|
+
] = None,
|
|
41
|
+
task_timeout_sec: t.Annotated[
|
|
42
|
+
int | None, cyclopts.Parameter(help="Timeout per task in seconds")
|
|
43
|
+
] = None,
|
|
40
44
|
cleanup_policy: CleanupPolicy | None = None,
|
|
41
45
|
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
42
46
|
platform: PlatformConfig = PlatformConfig(),
|
|
@@ -72,17 +76,27 @@ EvaluationStatus = t.Literal["pending", "running", "completed", "failed", "cance
|
|
|
72
76
|
@cli.command(name="list")
|
|
73
77
|
def list_(
|
|
74
78
|
*,
|
|
79
|
+
page: t.Annotated[int, cyclopts.Parameter(validator=cyclopts.validators.Number(gte=1))] = 1,
|
|
80
|
+
page_size: t.Annotated[
|
|
81
|
+
int,
|
|
82
|
+
cyclopts.Parameter(validator=cyclopts.validators.Number(gte=1)),
|
|
83
|
+
] = 50,
|
|
75
84
|
status: EvaluationStatus | None = None,
|
|
85
|
+
project_id: t.Annotated[str | None, cyclopts.Parameter(help="Project ID filter")] = None,
|
|
76
86
|
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
77
87
|
platform: PlatformConfig = PlatformConfig(),
|
|
78
88
|
) -> None:
|
|
79
89
|
"""List evaluations."""
|
|
80
90
|
dn = configured_dreadnode(platform)
|
|
81
91
|
org, workspace, client = require_evaluation_context(dn)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
92
|
+
payload = client.list_evaluation_jobs(
|
|
93
|
+
org,
|
|
94
|
+
workspace,
|
|
95
|
+
page=page,
|
|
96
|
+
page_size=page_size,
|
|
97
|
+
status=status,
|
|
98
|
+
project_id=project_id,
|
|
99
|
+
)
|
|
86
100
|
_render_evaluation_list(payload, as_json=as_json)
|
|
87
101
|
|
|
88
102
|
|
|
@@ -289,14 +289,22 @@ def _login_with_device_code(
|
|
|
289
289
|
@cli.command()
|
|
290
290
|
def serve(
|
|
291
291
|
*,
|
|
292
|
-
host: str | None = None,
|
|
293
|
-
port: int | None = None,
|
|
294
|
-
working_dir:
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
292
|
+
host: t.Annotated[str | None, cyclopts.Parameter(help="Server bind host")] = None,
|
|
293
|
+
port: t.Annotated[int | None, cyclopts.Parameter(help="Server bind port")] = None,
|
|
294
|
+
working_dir: t.Annotated[
|
|
295
|
+
str | None, cyclopts.Parameter(help="Working directory for the server")
|
|
296
|
+
] = None,
|
|
297
|
+
platform_server: t.Annotated[
|
|
298
|
+
str | None, cyclopts.Parameter(help="Platform API URL override")
|
|
299
|
+
] = None,
|
|
300
|
+
api_key: t.Annotated[
|
|
301
|
+
str | None, cyclopts.Parameter(help="API key for platform authentication")
|
|
302
|
+
] = None,
|
|
303
|
+
organization: t.Annotated[
|
|
304
|
+
str | None, cyclopts.Parameter(help="Organization slug override")
|
|
305
|
+
] = None,
|
|
306
|
+
workspace: t.Annotated[str | None, cyclopts.Parameter(help="Workspace slug override")] = None,
|
|
307
|
+
project: t.Annotated[str | None, cyclopts.Parameter(help="Project slug override")] = None,
|
|
300
308
|
verbose: t.Annotated[
|
|
301
309
|
bool,
|
|
302
310
|
cyclopts.Parameter(negative=(), help="Enable verbose trace logging for the local server"),
|
|
@@ -11,7 +11,6 @@ from dreadnode.app.cli.shared import (
|
|
|
11
11
|
_render_package_list,
|
|
12
12
|
configured_dreadnode,
|
|
13
13
|
require_registry_context,
|
|
14
|
-
resolved_name,
|
|
15
14
|
)
|
|
16
15
|
|
|
17
16
|
cli = cyclopts.App(name="model", help="Manage models.")
|
|
@@ -32,17 +31,20 @@ def push(
|
|
|
32
31
|
) -> None:
|
|
33
32
|
"""Build and push a model artifact."""
|
|
34
33
|
dn = configured_dreadnode(registry)
|
|
35
|
-
model = dn.load_model(path)
|
|
36
34
|
result = dn.push_model(path, name=name, skip_upload=skip_upload)
|
|
37
35
|
if not result.success:
|
|
38
36
|
raise SystemExit("; ".join(result.errors) or "Model push failed")
|
|
39
37
|
|
|
40
|
-
|
|
38
|
+
if result.package_name is None or result.package_version is None:
|
|
39
|
+
raise SystemExit("Model push returned incomplete metadata")
|
|
40
|
+
|
|
41
|
+
display_name = result.package_name
|
|
42
|
+
display_version = result.package_version
|
|
41
43
|
if skip_upload or not dn.can_sync:
|
|
42
|
-
print(f"Built {
|
|
44
|
+
print(f"Built {display_name}@{display_version}")
|
|
43
45
|
return
|
|
44
46
|
digest = result.manifest_digest or "unknown"
|
|
45
|
-
print(f"Pushed {
|
|
47
|
+
print(f"Pushed {display_name}@{display_version} ({digest})")
|
|
46
48
|
|
|
47
49
|
|
|
48
50
|
# ---------------------------------------------------------------------------
|
|
@@ -53,14 +55,14 @@ def push(
|
|
|
53
55
|
@cli.command(name="list")
|
|
54
56
|
def list_(
|
|
55
57
|
*,
|
|
56
|
-
|
|
58
|
+
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
57
59
|
registry: RegistryConfig = RegistryConfig(),
|
|
58
60
|
) -> None:
|
|
59
61
|
"""List model artifacts in the organization."""
|
|
60
62
|
dn = configured_dreadnode(registry)
|
|
61
63
|
org, client = require_registry_context(dn)
|
|
62
64
|
packages = client.list_models(org)
|
|
63
|
-
_render_package_list(packages, as_json=
|
|
65
|
+
_render_package_list(packages, as_json=as_json)
|
|
64
66
|
|
|
65
67
|
|
|
66
68
|
# ---------------------------------------------------------------------------
|
|
@@ -44,10 +44,10 @@ cli = cyclopts.App(name="optimize", help="Optimize agents with jobs.")
|
|
|
44
44
|
# ---------------------------------------------------------------------------
|
|
45
45
|
|
|
46
46
|
|
|
47
|
-
@cli.
|
|
47
|
+
@cli.command(name="submit")
|
|
48
48
|
def submit(
|
|
49
49
|
*,
|
|
50
|
-
model: str,
|
|
50
|
+
model: t.Annotated[str, cyclopts.Parameter(help="Model identifier")],
|
|
51
51
|
capability: t.Annotated[
|
|
52
52
|
str,
|
|
53
53
|
cyclopts.Parameter(help="Capability ref in NAME@VERSION form"),
|
|
@@ -68,7 +68,9 @@ def submit(
|
|
|
68
68
|
help="Optional validation dataset ref in NAME@VERSION form",
|
|
69
69
|
),
|
|
70
70
|
] = None,
|
|
71
|
-
reward_params:
|
|
71
|
+
reward_params: t.Annotated[
|
|
72
|
+
str | None, cyclopts.Parameter(help="Reward recipe parameters as JSON")
|
|
73
|
+
] = None,
|
|
72
74
|
agent_name: t.Annotated[
|
|
73
75
|
str | None,
|
|
74
76
|
cyclopts.Parameter(
|
|
@@ -83,17 +85,29 @@ def submit(
|
|
|
83
85
|
str | None,
|
|
84
86
|
cyclopts.Parameter(help="Optional optimization job name"),
|
|
85
87
|
] = None,
|
|
86
|
-
project_ref:
|
|
87
|
-
|
|
88
|
+
project_ref: t.Annotated[
|
|
89
|
+
str | None, cyclopts.Parameter(help="Project reference for tracking")
|
|
90
|
+
] = None,
|
|
91
|
+
run_ref: t.Annotated[str | None, cyclopts.Parameter(help="Run reference for tracking")] = None,
|
|
88
92
|
tag: t.Annotated[
|
|
89
93
|
list[str] | None,
|
|
90
|
-
cyclopts.Parameter(negative_iterable=()),
|
|
94
|
+
cyclopts.Parameter(negative_iterable=(), help="Tag for the job (repeatable)"),
|
|
95
|
+
] = None,
|
|
96
|
+
seed: t.Annotated[
|
|
97
|
+
int | None, cyclopts.Parameter(help="Random seed for reproducibility")
|
|
98
|
+
] = None,
|
|
99
|
+
max_metric_calls: t.Annotated[
|
|
100
|
+
int | None, cyclopts.Parameter(help="Maximum metric evaluation calls")
|
|
101
|
+
] = None,
|
|
102
|
+
reflection_lm: t.Annotated[
|
|
103
|
+
str | None, cyclopts.Parameter(help="Language model for reflection steps")
|
|
104
|
+
] = None,
|
|
105
|
+
max_reflection_examples: t.Annotated[
|
|
106
|
+
int | None, cyclopts.Parameter(help="Maximum examples for reflection")
|
|
107
|
+
] = None,
|
|
108
|
+
max_side_info_chars: t.Annotated[
|
|
109
|
+
int | None, cyclopts.Parameter(help="Maximum characters of side information")
|
|
91
110
|
] = None,
|
|
92
|
-
seed: int | None = None,
|
|
93
|
-
max_metric_calls: int | None = None,
|
|
94
|
-
reflection_lm: str | None = None,
|
|
95
|
-
max_reflection_examples: int | None = None,
|
|
96
|
-
max_side_info_chars: int | None = None,
|
|
97
111
|
track_best_outputs: t.Annotated[
|
|
98
112
|
bool,
|
|
99
113
|
cyclopts.Parameter(negative=()),
|
|
@@ -117,9 +131,13 @@ def submit(
|
|
|
117
131
|
wait: t.Annotated[bool, cyclopts.Parameter(negative=())] = False,
|
|
118
132
|
poll_interval_sec: t.Annotated[
|
|
119
133
|
float,
|
|
120
|
-
cyclopts.Parameter(
|
|
134
|
+
cyclopts.Parameter(
|
|
135
|
+
validator=cyclopts.validators.Number(gt=0), help="Polling interval in seconds"
|
|
136
|
+
),
|
|
121
137
|
] = 5.0,
|
|
122
|
-
timeout_sec:
|
|
138
|
+
timeout_sec: t.Annotated[
|
|
139
|
+
float | None, cyclopts.Parameter(help="Timeout in seconds for waiting")
|
|
140
|
+
] = None,
|
|
123
141
|
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
124
142
|
platform: PlatformConfig = PlatformConfig(),
|
|
125
143
|
) -> None:
|
|
@@ -234,7 +252,9 @@ def list_(
|
|
|
234
252
|
status: OptimizationStatus | None = None,
|
|
235
253
|
backend: OptimizationBackend | None = None,
|
|
236
254
|
target_kind: TargetKind | None = None,
|
|
237
|
-
project_ref:
|
|
255
|
+
project_ref: t.Annotated[
|
|
256
|
+
str | None, cyclopts.Parameter(help="Project reference filter")
|
|
257
|
+
] = None,
|
|
238
258
|
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
239
259
|
platform: PlatformConfig = PlatformConfig(),
|
|
240
260
|
) -> None:
|
|
@@ -284,9 +304,13 @@ def wait(
|
|
|
284
304
|
*,
|
|
285
305
|
poll_interval_sec: t.Annotated[
|
|
286
306
|
float,
|
|
287
|
-
cyclopts.Parameter(
|
|
307
|
+
cyclopts.Parameter(
|
|
308
|
+
validator=cyclopts.validators.Number(gt=0), help="Polling interval in seconds"
|
|
309
|
+
),
|
|
288
310
|
] = 5.0,
|
|
289
|
-
timeout_sec:
|
|
311
|
+
timeout_sec: t.Annotated[
|
|
312
|
+
float | None, cyclopts.Parameter(help="Timeout in seconds for waiting")
|
|
313
|
+
] = None,
|
|
290
314
|
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
291
315
|
platform: PlatformConfig = PlatformConfig(),
|
|
292
316
|
) -> None:
|
|
@@ -34,19 +34,19 @@ class PlatformConfig:
|
|
|
34
34
|
] = None
|
|
35
35
|
api_key: t.Annotated[
|
|
36
36
|
str | None,
|
|
37
|
-
cyclopts.Parameter(group=PLATFORM_GROUP),
|
|
37
|
+
cyclopts.Parameter(group=PLATFORM_GROUP, help="API key for authentication"),
|
|
38
38
|
] = None
|
|
39
39
|
organization: t.Annotated[
|
|
40
40
|
str | None,
|
|
41
|
-
cyclopts.Parameter(group=PLATFORM_GROUP),
|
|
41
|
+
cyclopts.Parameter(group=PLATFORM_GROUP, help="Organization slug override"),
|
|
42
42
|
] = None
|
|
43
43
|
workspace: t.Annotated[
|
|
44
44
|
str | None,
|
|
45
|
-
cyclopts.Parameter(group=PLATFORM_GROUP),
|
|
45
|
+
cyclopts.Parameter(group=PLATFORM_GROUP, help="Workspace slug override"),
|
|
46
46
|
] = None
|
|
47
47
|
project: t.Annotated[
|
|
48
48
|
str | None,
|
|
49
|
-
cyclopts.Parameter(group=PLATFORM_GROUP),
|
|
49
|
+
cyclopts.Parameter(group=PLATFORM_GROUP, help="Project slug override"),
|
|
50
50
|
] = None
|
|
51
51
|
|
|
52
52
|
|
|
@@ -64,11 +64,11 @@ class RegistryConfig:
|
|
|
64
64
|
] = None
|
|
65
65
|
api_key: t.Annotated[
|
|
66
66
|
str | None,
|
|
67
|
-
cyclopts.Parameter(group=REGISTRY_GROUP),
|
|
67
|
+
cyclopts.Parameter(group=REGISTRY_GROUP, help="API key for authentication"),
|
|
68
68
|
] = None
|
|
69
69
|
organization: t.Annotated[
|
|
70
70
|
str | None,
|
|
71
|
-
cyclopts.Parameter(group=REGISTRY_GROUP),
|
|
71
|
+
cyclopts.Parameter(group=REGISTRY_GROUP, help="Organization slug override"),
|
|
72
72
|
] = None
|
|
73
73
|
|
|
74
74
|
|
|
@@ -187,13 +187,6 @@ def _render_profile_context(profile: t.Any) -> str:
|
|
|
187
187
|
return "/".join(parts)
|
|
188
188
|
|
|
189
189
|
|
|
190
|
-
def resolved_name(name: str | None, default_name: str, dreadnode: t.Any) -> str:
|
|
191
|
-
resolved = name or default_name
|
|
192
|
-
if "/" not in resolved and dreadnode.can_sync:
|
|
193
|
-
resolved = f"{dreadnode.session.org_key}/{resolved}"
|
|
194
|
-
return resolved
|
|
195
|
-
|
|
196
|
-
|
|
197
190
|
def require_registry_context(dreadnode: t.Any) -> tuple[str, t.Any]:
|
|
198
191
|
if not dreadnode.can_sync:
|
|
199
192
|
raise SystemExit(
|
|
@@ -480,6 +473,15 @@ def _render_training_job(job: t.Any, *, as_json: bool) -> None:
|
|
|
480
473
|
_render(job, as_json=as_json, summary=_summarize_training_job)
|
|
481
474
|
|
|
482
475
|
|
|
476
|
+
def _render_training_job_list(job_list: t.Any, *, as_json: bool) -> None:
|
|
477
|
+
_render_list(
|
|
478
|
+
job_list,
|
|
479
|
+
as_json=as_json,
|
|
480
|
+
summary=_summarize_training_job,
|
|
481
|
+
empty_msg="No training jobs found",
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
|
|
483
485
|
def _render_training_logs(logs: t.Any, *, as_json: bool) -> None:
|
|
484
486
|
_render_logs(logs, as_json=as_json)
|
|
485
487
|
|