dreadnode 2.0.9__tar.gz → 2.0.10__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.9 → dreadnode-2.0.10}/PKG-INFO +2 -2
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/agent.py +10 -15
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/tools.py +4 -2
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/beast.py +3 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/crescendo.py +3 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/deep_inception.py +3 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/drattack.py +3 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/goat.py +3 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/gptfuzzer.py +3 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/pair.py +3 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/rainbow.py +3 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/renellm.py +3 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/api/client.py +61 -26
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/api/models.py +31 -12
- dreadnode-2.0.10/dreadnode/app/cli/airt.py +1057 -0
- dreadnode-2.0.10/dreadnode/app/cli/capability.py +1218 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/evaluation.py +96 -2
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/shared.py +4 -0
- dreadnode-2.0.10/dreadnode/app/cli/task.py +2277 -0
- dreadnode-2.0.10/dreadnode/app/cli/templates/__init__.py +1 -0
- dreadnode-2.0.10/dreadnode/app/cli/templates/init/__init__.py +1 -0
- dreadnode-2.0.10/dreadnode/app/cli/templates/init/challenge/Dockerfile +4 -0
- dreadnode-2.0.10/dreadnode/app/cli/templates/init/docker-compose.yaml +10 -0
- dreadnode-2.0.10/dreadnode/app/cli/templates/init/provision.sh +27 -0
- dreadnode-2.0.10/dreadnode/app/cli/templates/init/solution.sh +21 -0
- dreadnode-2.0.10/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +120 -0
- dreadnode-2.0.10/dreadnode/app/cli/templates/init/task.yaml.tmpl +99 -0
- dreadnode-2.0.10/dreadnode/app/cli/templates/init/teardown.sh +22 -0
- dreadnode-2.0.10/dreadnode/app/cli/templates/init/verify.sh +28 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/config.py +2 -1
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/main.py +1 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/server/app.py +302 -49
- dreadnode-2.0.10/dreadnode/app/server/prompt.py +217 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/app.py +661 -77
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/client.py +12 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/commands.py +7 -1
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/dreadnode.tcss +141 -33
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/event_contract.py +13 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/__init__.py +6 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/base.py +1 -1
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/capabilities.py +185 -147
- dreadnode-2.0.10/dreadnode/app/tui/screens/capability_docs.py +301 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/environments.py +185 -24
- dreadnode-2.0.10/dreadnode/app/tui/screens/models.py +875 -0
- dreadnode-2.0.10/dreadnode/app/tui/screens/raw_spans.py +186 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/runtimes.py +221 -135
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/sessions.py +12 -2
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/workspaces.py +104 -13
- dreadnode-2.0.10/dreadnode/app/tui/spans_reader.py +134 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/composer.py +36 -6
- dreadnode-2.0.10/dreadnode/builtin_capabilities/__init__.py +79 -0
- dreadnode-2.0.10/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +54 -0
- dreadnode-2.0.10/dreadnode/builtin_capabilities/dreadnode/capability.yaml +4 -0
- dreadnode-2.0.10/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-runtime-reference/SKILL.md +78 -0
- dreadnode-2.0.10/dreadnode/builtin_capabilities/dreadnode/system-prompt.md +7 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/base.py +7 -0
- dreadnode-2.0.10/dreadnode/optimization/adapters/stack.py +601 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/backends/gepa.py +2 -1
- dreadnode-2.0.10/dreadnode/packaging/task_validation.py +993 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/skills/creating-capabilities/SKILL.md +6 -0
- dreadnode-2.0.10/dreadnode/skills/creating-capabilities/capability-improvement.md +339 -0
- dreadnode-2.0.10/dreadnode/skills/creating-capabilities/runtime-default-capability.md +262 -0
- dreadnode-2.0.10/dreadnode/skills/dreadnode-cli/SKILL.md +109 -0
- dreadnode-2.0.10/dreadnode/skills/dreadnode-cli/references/command-groups.md +224 -0
- dreadnode-2.0.10/dreadnode/skills/dreadnode-cli/references/tui-crosswalk.md +27 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/__init__.py +35 -9
- dreadnode-2.0.10/dreadnode/tools/dreadnode_cli.py +63 -0
- dreadnode-2.0.10/dreadnode/tools/report.py +95 -0
- dreadnode-2.0.10/dreadnode/tools/trajectory_search.py +63 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/recipes.py +7 -5
- {dreadnode-2.0.9 → dreadnode-2.0.10}/pyproject.toml +2 -2
- dreadnode-2.0.9/dreadnode/app/cli/airt.py +0 -415
- dreadnode-2.0.9/dreadnode/app/cli/capability.py +0 -610
- dreadnode-2.0.9/dreadnode/app/cli/task.py +0 -868
- dreadnode-2.0.9/dreadnode/app/server/prompt.py +0 -182
- dreadnode-2.0.9/dreadnode/packaging/task_validation.py +0 -475
- {dreadnode-2.0.9 → dreadnode-2.0.10}/.gitignore +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/LICENSE +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/README.md +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/events.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/hooks.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/assessment.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/args.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/main.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/console.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/mcp.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/model_picker.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/turn_reducer.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/context_bar.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/conversation.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/help_panel.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/tool.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/loader.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/litellm_.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/jobs.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/skills/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/skills/creating-capabilities/capability-components.md +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/version.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.10
|
|
4
4
|
Summary: Dreadnode SDK
|
|
5
5
|
Project-URL: Homepage, https://dreadnode.io
|
|
6
6
|
Project-URL: Documentation, https://docs.dreadnode.io
|
|
@@ -19,7 +19,7 @@ Requires-Dist: gepa>=0.1.1
|
|
|
19
19
|
Requires-Dist: httpx<1.0.0,>=0.28.0
|
|
20
20
|
Requires-Dist: jsonpath-ng>=1.7.0
|
|
21
21
|
Requires-Dist: jsonref>=1.1.0
|
|
22
|
-
Requires-Dist: litellm<=1.
|
|
22
|
+
Requires-Dist: litellm<=1.83.0,>=1.83.0
|
|
23
23
|
Requires-Dist: logfire<=3.20.0,>=3.5.3
|
|
24
24
|
Requires-Dist: loguru>=0.7.3
|
|
25
25
|
Requires-Dist: mcp<2.0.0,>=1.25.0
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import inspect
|
|
3
3
|
import typing as t
|
|
4
|
-
from contextlib import AsyncExitStack, asynccontextmanager,
|
|
4
|
+
from contextlib import AsyncExitStack, asynccontextmanager, suppress
|
|
5
5
|
from copy import deepcopy
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from textwrap import dedent
|
|
@@ -586,7 +586,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
586
586
|
agent_name=self.name,
|
|
587
587
|
inputs={"goal": self._current_input},
|
|
588
588
|
params={
|
|
589
|
-
"session_id": str(
|
|
589
|
+
"session_id": str(traj.session_id),
|
|
590
590
|
"max_steps": self.max_steps,
|
|
591
591
|
**({"model": self.model_name} if self.model_name else {}),
|
|
592
592
|
**({"tools": [tool.name for tool in self.all_tools]} if self.all_tools else {}),
|
|
@@ -683,7 +683,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
683
683
|
)
|
|
684
684
|
|
|
685
685
|
# Check stop conditions INSIDE span
|
|
686
|
-
if any(cond(
|
|
686
|
+
if any(cond(traj.steps) for cond in self.stop_conditions):
|
|
687
687
|
logger.info("A stop condition was met. Ending run.")
|
|
688
688
|
gen_end = GenerationEnd(
|
|
689
689
|
agent_id=self.agent_id,
|
|
@@ -872,7 +872,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
872
872
|
)
|
|
873
873
|
|
|
874
874
|
# Check stop conditions again INSIDE span
|
|
875
|
-
if any(cond(
|
|
875
|
+
if any(cond(traj.steps) for cond in self.stop_conditions):
|
|
876
876
|
break
|
|
877
877
|
|
|
878
878
|
except Continue as e:
|
|
@@ -899,7 +899,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
899
899
|
stop_reason = "error"
|
|
900
900
|
elif max_steps_reached:
|
|
901
901
|
stop_reason = "max_steps_reached"
|
|
902
|
-
elif
|
|
902
|
+
elif traj.steps and isinstance(traj.steps[-1], AgentStalled):
|
|
903
903
|
stop_reason = "stalled"
|
|
904
904
|
|
|
905
905
|
async for event in self._dispatch(
|
|
@@ -961,17 +961,12 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
961
961
|
if hasattr(tool_container, "__aenter__") and hasattr(tool_container, "__aexit__"):
|
|
962
962
|
await stack.enter_async_context(tool_container)
|
|
963
963
|
|
|
964
|
-
# Parent span only on new conversation (not when borrowing external trajectory)
|
|
965
964
|
display_name = self.name or str(self.agent_id)[:8]
|
|
966
|
-
ctx = (
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
tags=["agent"],
|
|
972
|
-
)
|
|
973
|
-
if reset and trajectory is None
|
|
974
|
-
else nullcontext()
|
|
965
|
+
ctx = dreadnode.task_span(
|
|
966
|
+
f"agent:{display_name}",
|
|
967
|
+
type="agent",
|
|
968
|
+
label=display_name,
|
|
969
|
+
tags=["agent"],
|
|
975
970
|
)
|
|
976
971
|
|
|
977
972
|
with ctx as parent_span:
|
|
@@ -170,7 +170,8 @@ async def offload_tool_output(
|
|
|
170
170
|
working_dir: Path,
|
|
171
171
|
) -> tuple[str, Path]:
|
|
172
172
|
"""Write tool output to disk and return middle-out summary plus file path."""
|
|
173
|
-
|
|
173
|
+
output_root = working_dir if working_dir.name == ".dreadnode" else working_dir / ".dreadnode"
|
|
174
|
+
output_dir = output_root / "tool-output"
|
|
174
175
|
await asyncio.to_thread(output_dir.mkdir, parents=True, exist_ok=True)
|
|
175
176
|
|
|
176
177
|
safe_id = re.sub(r"[^a-zA-Z0-9_-]", "_", tool_call_id)
|
|
@@ -178,7 +179,8 @@ async def offload_tool_output(
|
|
|
178
179
|
async with aiofiles.open(file_path, "w") as f:
|
|
179
180
|
await f.write(content)
|
|
180
181
|
|
|
181
|
-
|
|
182
|
+
relative_base = working_dir.parent if working_dir.name == ".dreadnode" else working_dir
|
|
183
|
+
relative_path = file_path.relative_to(relative_base)
|
|
182
184
|
|
|
183
185
|
half = OFFLOAD_THRESHOLD // 2
|
|
184
186
|
start = content[:half]
|
|
@@ -18,6 +18,7 @@ from dreadnode.airt.compliance import (
|
|
|
18
18
|
tag_attack,
|
|
19
19
|
)
|
|
20
20
|
from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
|
|
21
|
+
from dreadnode.core.meta import TrialCandidate
|
|
21
22
|
from dreadnode.core.scorer import Scorer
|
|
22
23
|
from dreadnode.core.transforms import Transform, TransformsLike
|
|
23
24
|
from dreadnode.generators.generator import GenerateParams, Generator, get_generator
|
|
@@ -232,6 +233,7 @@ def beast_attack(
|
|
|
232
233
|
llm_judge(
|
|
233
234
|
evaluator_model,
|
|
234
235
|
rubric,
|
|
236
|
+
input=TrialCandidate(),
|
|
235
237
|
min_score=1,
|
|
236
238
|
max_score=10,
|
|
237
239
|
)
|
|
@@ -247,6 +249,7 @@ def beast_attack(
|
|
|
247
249
|
target=target,
|
|
248
250
|
fitted_transforms=fitted_transforms,
|
|
249
251
|
scorer=prompt_judge,
|
|
252
|
+
include_input=True,
|
|
250
253
|
)
|
|
251
254
|
|
|
252
255
|
attack = Study[str](
|
|
@@ -11,6 +11,7 @@ from dreadnode.airt.compliance import (
|
|
|
11
11
|
tag_attack,
|
|
12
12
|
)
|
|
13
13
|
from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
|
|
14
|
+
from dreadnode.core.meta import TrialCandidate
|
|
14
15
|
from dreadnode.core.scorer import Scorer
|
|
15
16
|
from dreadnode.core.transforms import Transform, TransformsLike
|
|
16
17
|
from dreadnode.generators.generator import Generator, get_generator
|
|
@@ -221,6 +222,7 @@ Return ONLY the question text."""
|
|
|
221
222
|
llm_judge(
|
|
222
223
|
evaluator_model,
|
|
223
224
|
eval_rubric,
|
|
225
|
+
input=TrialCandidate(),
|
|
224
226
|
min_score=0,
|
|
225
227
|
max_score=1,
|
|
226
228
|
)
|
|
@@ -235,6 +237,7 @@ Return ONLY the question text."""
|
|
|
235
237
|
target=target,
|
|
236
238
|
fitted_transforms=fitted_transforms,
|
|
237
239
|
scorer=objective_judge,
|
|
240
|
+
include_input=True,
|
|
238
241
|
)
|
|
239
242
|
|
|
240
243
|
# Resolve model names for span attributes
|
|
@@ -18,6 +18,7 @@ from dreadnode.airt.compliance import (
|
|
|
18
18
|
tag_attack,
|
|
19
19
|
)
|
|
20
20
|
from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
|
|
21
|
+
from dreadnode.core.meta import TrialCandidate
|
|
21
22
|
from dreadnode.core.scorer import Scorer
|
|
22
23
|
from dreadnode.core.transforms import Transform, TransformsLike
|
|
23
24
|
from dreadnode.generators.generator import Generator
|
|
@@ -135,6 +136,7 @@ def deep_inception_attack(
|
|
|
135
136
|
llm_judge(
|
|
136
137
|
evaluator_model,
|
|
137
138
|
rubric,
|
|
139
|
+
input=TrialCandidate(),
|
|
138
140
|
min_score=1,
|
|
139
141
|
max_score=10,
|
|
140
142
|
)
|
|
@@ -150,6 +152,7 @@ def deep_inception_attack(
|
|
|
150
152
|
target=target,
|
|
151
153
|
fitted_transforms=fitted_transforms,
|
|
152
154
|
scorer=prompt_judge,
|
|
155
|
+
include_input=True,
|
|
153
156
|
)
|
|
154
157
|
|
|
155
158
|
attack = Study[str](
|
|
@@ -19,6 +19,7 @@ from dreadnode.airt.compliance import (
|
|
|
19
19
|
tag_attack,
|
|
20
20
|
)
|
|
21
21
|
from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
|
|
22
|
+
from dreadnode.core.meta import TrialCandidate
|
|
22
23
|
from dreadnode.core.scorer import Scorer
|
|
23
24
|
from dreadnode.core.transforms import Transform, TransformsLike
|
|
24
25
|
from dreadnode.generators.generator import GenerateParams, Generator, get_generator
|
|
@@ -137,6 +138,7 @@ def drattack(
|
|
|
137
138
|
llm_judge(
|
|
138
139
|
evaluator_model,
|
|
139
140
|
rubric,
|
|
141
|
+
input=TrialCandidate(),
|
|
140
142
|
min_score=1,
|
|
141
143
|
max_score=10,
|
|
142
144
|
)
|
|
@@ -152,6 +154,7 @@ def drattack(
|
|
|
152
154
|
target=target,
|
|
153
155
|
fitted_transforms=fitted_transforms,
|
|
154
156
|
scorer=prompt_judge,
|
|
157
|
+
include_input=True,
|
|
155
158
|
)
|
|
156
159
|
|
|
157
160
|
attack = Study[str](
|
|
@@ -8,6 +8,7 @@ from dreadnode.airt.compliance import (
|
|
|
8
8
|
tag_attack,
|
|
9
9
|
)
|
|
10
10
|
from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
|
|
11
|
+
from dreadnode.core.meta import TrialCandidate
|
|
11
12
|
from dreadnode.core.scorer import Scorer
|
|
12
13
|
from dreadnode.core.transforms import Transform, TransformsLike
|
|
13
14
|
from dreadnode.generators.generator import Generator
|
|
@@ -114,6 +115,7 @@ def goat_attack(
|
|
|
114
115
|
llm_judge(
|
|
115
116
|
evaluator_model,
|
|
116
117
|
rubric,
|
|
118
|
+
input=TrialCandidate(),
|
|
117
119
|
min_score=1,
|
|
118
120
|
max_score=10,
|
|
119
121
|
)
|
|
@@ -141,6 +143,7 @@ def goat_attack(
|
|
|
141
143
|
target=target,
|
|
142
144
|
fitted_transforms=fitted_transforms,
|
|
143
145
|
scorer=prompt_judge,
|
|
146
|
+
include_input=True,
|
|
144
147
|
)
|
|
145
148
|
|
|
146
149
|
# Resolve model names for span attributes
|
|
@@ -17,6 +17,7 @@ from dreadnode.airt.compliance import (
|
|
|
17
17
|
tag_attack,
|
|
18
18
|
)
|
|
19
19
|
from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
|
|
20
|
+
from dreadnode.core.meta import TrialCandidate
|
|
20
21
|
from dreadnode.core.scorer import Scorer
|
|
21
22
|
from dreadnode.core.transforms import Transform, TransformsLike
|
|
22
23
|
from dreadnode.generators.generator import Generator
|
|
@@ -150,6 +151,7 @@ def gptfuzzer_attack(
|
|
|
150
151
|
llm_judge(
|
|
151
152
|
evaluator_model,
|
|
152
153
|
rubric,
|
|
154
|
+
input=TrialCandidate(),
|
|
153
155
|
min_score=1,
|
|
154
156
|
max_score=10,
|
|
155
157
|
)
|
|
@@ -165,6 +167,7 @@ def gptfuzzer_attack(
|
|
|
165
167
|
target=target,
|
|
166
168
|
fitted_transforms=fitted_transforms,
|
|
167
169
|
scorer=prompt_judge,
|
|
170
|
+
include_input=True,
|
|
168
171
|
)
|
|
169
172
|
|
|
170
173
|
attack = Study[str](
|
|
@@ -15,6 +15,7 @@ from dreadnode.airt.compliance import (
|
|
|
15
15
|
tag_attack,
|
|
16
16
|
)
|
|
17
17
|
from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
|
|
18
|
+
from dreadnode.core.meta import TrialCandidate
|
|
18
19
|
from dreadnode.core.scorer import Scorer
|
|
19
20
|
from dreadnode.core.transforms import Transform, TransformsLike
|
|
20
21
|
from dreadnode.generators.generator import Generator
|
|
@@ -142,6 +143,7 @@ def pair_attack(
|
|
|
142
143
|
llm_judge(
|
|
143
144
|
evaluator_model,
|
|
144
145
|
rubric,
|
|
146
|
+
input=TrialCandidate(),
|
|
145
147
|
min_score=1,
|
|
146
148
|
max_score=10,
|
|
147
149
|
)
|
|
@@ -157,6 +159,7 @@ def pair_attack(
|
|
|
157
159
|
target=target,
|
|
158
160
|
fitted_transforms=fitted_transforms,
|
|
159
161
|
scorer=prompt_judge,
|
|
162
|
+
include_input=True,
|
|
160
163
|
)
|
|
161
164
|
|
|
162
165
|
# Resolve model names for span attributes
|
|
@@ -18,6 +18,7 @@ from dreadnode.airt.compliance import (
|
|
|
18
18
|
tag_attack,
|
|
19
19
|
)
|
|
20
20
|
from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
|
|
21
|
+
from dreadnode.core.meta import TrialCandidate
|
|
21
22
|
from dreadnode.core.scorer import Scorer
|
|
22
23
|
from dreadnode.core.transforms import Transform, TransformsLike
|
|
23
24
|
from dreadnode.generators.generator import Generator
|
|
@@ -170,6 +171,7 @@ def rainbow_attack(
|
|
|
170
171
|
llm_judge(
|
|
171
172
|
evaluator_model,
|
|
172
173
|
rubric,
|
|
174
|
+
input=TrialCandidate(),
|
|
173
175
|
min_score=1,
|
|
174
176
|
max_score=10,
|
|
175
177
|
)
|
|
@@ -185,6 +187,7 @@ def rainbow_attack(
|
|
|
185
187
|
target=target,
|
|
186
188
|
fitted_transforms=fitted_transforms,
|
|
187
189
|
scorer=prompt_judge,
|
|
190
|
+
include_input=True,
|
|
188
191
|
)
|
|
189
192
|
|
|
190
193
|
attack = Study[str](
|
|
@@ -18,6 +18,7 @@ from dreadnode.airt.compliance import (
|
|
|
18
18
|
tag_attack,
|
|
19
19
|
)
|
|
20
20
|
from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
|
|
21
|
+
from dreadnode.core.meta import TrialCandidate
|
|
21
22
|
from dreadnode.core.scorer import Scorer
|
|
22
23
|
from dreadnode.core.transforms import Transform, TransformsLike
|
|
23
24
|
from dreadnode.generators.generator import GenerateParams, Generator, get_generator
|
|
@@ -165,6 +166,7 @@ def renellm_attack(
|
|
|
165
166
|
llm_judge(
|
|
166
167
|
evaluator_model,
|
|
167
168
|
rubric,
|
|
169
|
+
input=TrialCandidate(),
|
|
168
170
|
min_score=1,
|
|
169
171
|
max_score=10,
|
|
170
172
|
)
|
|
@@ -180,6 +182,7 @@ def renellm_attack(
|
|
|
180
182
|
target=target,
|
|
181
183
|
fitted_transforms=fitted_transforms,
|
|
182
184
|
scorer=prompt_judge,
|
|
185
|
+
include_input=True,
|
|
183
186
|
)
|
|
184
187
|
|
|
185
188
|
attack = Study[str](
|
|
@@ -239,6 +239,45 @@ class ApiClient:
|
|
|
239
239
|
response = self.request("GET", "/inference")
|
|
240
240
|
return t.cast("list[dict[str, t.Any]]", response.json().get("models", []))
|
|
241
241
|
|
|
242
|
+
def list_catalog_models(
|
|
243
|
+
self,
|
|
244
|
+
*,
|
|
245
|
+
query: str | None = None,
|
|
246
|
+
limit: int | None = None,
|
|
247
|
+
provider: str | None = None,
|
|
248
|
+
capabilities: list[str] | None = None,
|
|
249
|
+
open_weights: bool | None = None,
|
|
250
|
+
min_context: int | None = None,
|
|
251
|
+
max_context: int | None = None,
|
|
252
|
+
min_price: float | None = None,
|
|
253
|
+
max_price: float | None = None,
|
|
254
|
+
featured: bool = False,
|
|
255
|
+
) -> list[dict[str, t.Any]]:
|
|
256
|
+
"""GET /api/v1/inference/catalog - List featured or searched BYOK catalog models."""
|
|
257
|
+
params: dict[str, t.Any] = {}
|
|
258
|
+
if query is not None:
|
|
259
|
+
params["query"] = query
|
|
260
|
+
if limit is not None:
|
|
261
|
+
params["limit"] = limit
|
|
262
|
+
if provider is not None:
|
|
263
|
+
params["provider"] = provider
|
|
264
|
+
if capabilities:
|
|
265
|
+
params["capabilities"] = capabilities
|
|
266
|
+
if open_weights is not None:
|
|
267
|
+
params["open_weights"] = open_weights
|
|
268
|
+
if min_context is not None:
|
|
269
|
+
params["min_context"] = min_context
|
|
270
|
+
if max_context is not None:
|
|
271
|
+
params["max_context"] = max_context
|
|
272
|
+
if min_price is not None:
|
|
273
|
+
params["min_price"] = min_price
|
|
274
|
+
if max_price is not None:
|
|
275
|
+
params["max_price"] = max_price
|
|
276
|
+
if featured:
|
|
277
|
+
params["featured"] = True
|
|
278
|
+
response = self.request("GET", "/inference/catalog", params=params)
|
|
279
|
+
return t.cast("list[dict[str, t.Any]]", response.json().get("models", []))
|
|
280
|
+
|
|
242
281
|
def get_user_preferences(self) -> dict[str, t.Any]:
|
|
243
282
|
"""GET /api/v1/user/preferences - Get user's enabled models with status."""
|
|
244
283
|
response = self.request("GET", "/user/preferences")
|
|
@@ -1729,7 +1768,6 @@ class ApiClient:
|
|
|
1729
1768
|
*,
|
|
1730
1769
|
page: int = 1,
|
|
1731
1770
|
limit: int = 50,
|
|
1732
|
-
category: list[str] | None = None,
|
|
1733
1771
|
difficulty: list[str] | None = None,
|
|
1734
1772
|
tags: list[str] | None = None,
|
|
1735
1773
|
search: str | None = None,
|
|
@@ -1741,8 +1779,6 @@ class ApiClient:
|
|
|
1741
1779
|
params: dict[str, t.Any] = {}
|
|
1742
1780
|
params["page"] = page
|
|
1743
1781
|
params["limit"] = limit
|
|
1744
|
-
if category is not None:
|
|
1745
|
-
params["category"] = category
|
|
1746
1782
|
if difficulty is not None:
|
|
1747
1783
|
params["difficulty"] = difficulty
|
|
1748
1784
|
if tags is not None:
|
|
@@ -1762,7 +1798,6 @@ class ApiClient:
|
|
|
1762
1798
|
self,
|
|
1763
1799
|
org: str,
|
|
1764
1800
|
*,
|
|
1765
|
-
category: list[str] | None = None,
|
|
1766
1801
|
difficulty: list[str] | None = None,
|
|
1767
1802
|
search: str | None = None,
|
|
1768
1803
|
tags: list[str] | None = None,
|
|
@@ -1772,8 +1807,6 @@ class ApiClient:
|
|
|
1772
1807
|
) -> dict[str, t.Any]:
|
|
1773
1808
|
"""GET /org/{org}/tasks/facets - Get task filter facets."""
|
|
1774
1809
|
params: dict[str, t.Any] = {"include_public": include_public}
|
|
1775
|
-
if category is not None:
|
|
1776
|
-
params["category"] = category
|
|
1777
1810
|
if difficulty is not None:
|
|
1778
1811
|
params["difficulty"] = difficulty
|
|
1779
1812
|
if search is not None:
|
|
@@ -1900,11 +1933,18 @@ class ApiClient:
|
|
|
1900
1933
|
page: int = 1,
|
|
1901
1934
|
page_size: int = 20,
|
|
1902
1935
|
project_id: str | None = None,
|
|
1936
|
+
user_id: str | None = None,
|
|
1903
1937
|
) -> dict[str, t.Any]:
|
|
1904
|
-
"""GET /org/{org}/ws/{workspace}/sessions - List sessions.
|
|
1938
|
+
"""GET /org/{org}/ws/{workspace}/sessions - List sessions.
|
|
1939
|
+
|
|
1940
|
+
The platform endpoint defaults to workspace-wide. Pass ``user_id``
|
|
1941
|
+
to scope to a single creator (e.g. the TUI's "my sessions" view).
|
|
1942
|
+
"""
|
|
1905
1943
|
params: dict[str, t.Any] = {"page": page, "page_size": page_size}
|
|
1906
1944
|
if project_id is not None:
|
|
1907
1945
|
params["project_id"] = project_id
|
|
1946
|
+
if user_id is not None:
|
|
1947
|
+
params["user_id"] = user_id
|
|
1908
1948
|
response = self.request("GET", f"/org/{org}/ws/{workspace}/sessions", params=params)
|
|
1909
1949
|
return t.cast("dict[str, t.Any]", response.json())
|
|
1910
1950
|
|
|
@@ -1928,22 +1968,6 @@ class ApiClient:
|
|
|
1928
1968
|
)
|
|
1929
1969
|
return t.cast("dict[str, t.Any]", response.json())
|
|
1930
1970
|
|
|
1931
|
-
def ingest_session_events(
|
|
1932
|
-
self,
|
|
1933
|
-
org: str,
|
|
1934
|
-
workspace: str,
|
|
1935
|
-
session_id: str,
|
|
1936
|
-
events: list[dict[str, t.Any]],
|
|
1937
|
-
wal_offset: int,
|
|
1938
|
-
) -> dict[str, t.Any]:
|
|
1939
|
-
"""POST /org/{org}/ws/{workspace}/sessions/{session_id}/events - Ingest events."""
|
|
1940
|
-
response = self.request(
|
|
1941
|
-
"POST",
|
|
1942
|
-
f"/org/{org}/ws/{workspace}/sessions/{session_id}/events",
|
|
1943
|
-
json_data={"events": events, "wal_offset": wal_offset},
|
|
1944
|
-
)
|
|
1945
|
-
return t.cast("dict[str, t.Any]", response.json())
|
|
1946
|
-
|
|
1947
1971
|
# ------------------------------------------------------------------
|
|
1948
1972
|
# Session transcripts (message-level persistence)
|
|
1949
1973
|
# ------------------------------------------------------------------
|
|
@@ -1994,6 +2018,7 @@ class ApiClient:
|
|
|
1994
2018
|
messages: list[t.Any],
|
|
1995
2019
|
*,
|
|
1996
2020
|
context: dict[str, t.Any] | None = None,
|
|
2021
|
+
usage_by_uuid: dict[str, dict[str, int]] | None = None,
|
|
1997
2022
|
) -> dict[str, t.Any]:
|
|
1998
2023
|
"""POST /org/{org}/ws/{workspace}/sessions/{session_id}/transcript — Append messages.
|
|
1999
2024
|
|
|
@@ -2004,10 +2029,20 @@ class ApiClient:
|
|
|
2004
2029
|
messages: List of SDK Message objects to persist.
|
|
2005
2030
|
context: Optional dict with ``model``, ``agent``, ``system_prompt``
|
|
2006
2031
|
— include on first call or when agent/model changes.
|
|
2032
|
+
usage_by_uuid: Optional mapping of message uuid (str) → usage dict
|
|
2033
|
+
with ``input_tokens`` / ``output_tokens`` /
|
|
2034
|
+
``cache_read_input_tokens`` / ``cache_creation_input_tokens``.
|
|
2035
|
+
Entries are attached to the matching message payload.
|
|
2007
2036
|
"""
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2037
|
+
payload_messages: list[dict[str, t.Any]] = []
|
|
2038
|
+
for m in messages:
|
|
2039
|
+
d = self._message_to_transcript_dict(m)
|
|
2040
|
+
msg_id = d.get("id")
|
|
2041
|
+
if usage_by_uuid and isinstance(msg_id, str) and msg_id in usage_by_uuid:
|
|
2042
|
+
d["usage"] = usage_by_uuid[msg_id]
|
|
2043
|
+
payload_messages.append(d)
|
|
2044
|
+
|
|
2045
|
+
payload: dict[str, t.Any] = {"messages": payload_messages}
|
|
2011
2046
|
if context is not None:
|
|
2012
2047
|
payload["context"] = context
|
|
2013
2048
|
|
|
@@ -16,6 +16,20 @@ if t.TYPE_CHECKING:
|
|
|
16
16
|
|
|
17
17
|
AnyDict = dict[str, t.Any]
|
|
18
18
|
|
|
19
|
+
|
|
20
|
+
def _normalize_default_agent_fields(data: t.Any) -> t.Any:
|
|
21
|
+
"""Normalize legacy `default` agent/capability inputs to no override."""
|
|
22
|
+
if not isinstance(data, dict):
|
|
23
|
+
return data
|
|
24
|
+
|
|
25
|
+
normalized = dict(data)
|
|
26
|
+
for field in ("agent", "capability"):
|
|
27
|
+
value = normalized.get(field)
|
|
28
|
+
if isinstance(value, str) and value.strip().lower() == "default":
|
|
29
|
+
normalized[field] = None
|
|
30
|
+
return normalized
|
|
31
|
+
|
|
32
|
+
|
|
19
33
|
# -----------------------------------------------------------------------------
|
|
20
34
|
# Type Aliases for Exports
|
|
21
35
|
# -----------------------------------------------------------------------------
|
|
@@ -749,6 +763,11 @@ class ChatRequest(BaseModel):
|
|
|
749
763
|
|
|
750
764
|
model_config = ConfigDict(populate_by_name=True)
|
|
751
765
|
|
|
766
|
+
@model_validator(mode="before")
|
|
767
|
+
@classmethod
|
|
768
|
+
def _normalize_default_agent(cls, data: t.Any) -> t.Any:
|
|
769
|
+
return _normalize_default_agent_fields(data)
|
|
770
|
+
|
|
752
771
|
|
|
753
772
|
class ChatResponse(BaseModel):
|
|
754
773
|
"""Response body for chat completion."""
|
|
@@ -798,6 +817,11 @@ class SessionCreateRequest(BaseModel):
|
|
|
798
817
|
|
|
799
818
|
model_config = ConfigDict(populate_by_name=True)
|
|
800
819
|
|
|
820
|
+
@model_validator(mode="before")
|
|
821
|
+
@classmethod
|
|
822
|
+
def _normalize_default_agent(cls, data: t.Any) -> t.Any:
|
|
823
|
+
return _normalize_default_agent_fields(data)
|
|
824
|
+
|
|
801
825
|
|
|
802
826
|
class SessionRestoreRequest(BaseModel):
|
|
803
827
|
"""Request body for restoring a server-side session runtime."""
|
|
@@ -809,6 +833,11 @@ class SessionRestoreRequest(BaseModel):
|
|
|
809
833
|
messages: list[SessionMessage] = Field(default_factory=list)
|
|
810
834
|
trajectory: dict[str, t.Any] | None = None
|
|
811
835
|
|
|
836
|
+
@model_validator(mode="before")
|
|
837
|
+
@classmethod
|
|
838
|
+
def _normalize_default_agent(cls, data: t.Any) -> t.Any:
|
|
839
|
+
return _normalize_default_agent_fields(data)
|
|
840
|
+
|
|
812
841
|
|
|
813
842
|
class SessionRestoreResponse(BaseModel):
|
|
814
843
|
"""Response returned after restoring a server-side session runtime."""
|
|
@@ -853,7 +882,7 @@ class CapabilityAgentInfo(BaseModel):
|
|
|
853
882
|
class ComponentStatusInfo(BaseModel):
|
|
854
883
|
"""Component-level load/runtime status."""
|
|
855
884
|
|
|
856
|
-
kind: t.Literal["agent", "tool", "skill", "mcp_server", "capability", "check"]
|
|
885
|
+
kind: t.Literal["agent", "tool", "hook", "skill", "mcp_server", "capability", "check"]
|
|
857
886
|
name: str
|
|
858
887
|
status: t.Literal["ok", "error", "degraded"]
|
|
859
888
|
error: str | None = None
|
|
@@ -871,6 +900,7 @@ class CapabilityInfo(BaseModel):
|
|
|
871
900
|
name: str
|
|
872
901
|
display_name: str
|
|
873
902
|
canonical_name: str | None = None
|
|
903
|
+
local_path: str | None = None
|
|
874
904
|
source: t.Literal["runtime", "local", "package"] | None = None
|
|
875
905
|
provenance: t.Literal["local", "org", "public"] | None = None
|
|
876
906
|
version: str | None = None
|
|
@@ -997,17 +1027,6 @@ class PlatformSessionResponse(BaseModel):
|
|
|
997
1027
|
"""Update timestamp."""
|
|
998
1028
|
|
|
999
1029
|
|
|
1000
|
-
class PlatformSessionEvent(BaseModel):
|
|
1001
|
-
"""Session event for platform ingestion (maps to API SessionEventCreate)."""
|
|
1002
|
-
|
|
1003
|
-
event_type: str
|
|
1004
|
-
"""Event type (e.g. 'message', 'tool_use')."""
|
|
1005
|
-
data: dict[str, t.Any] = Field(default_factory=dict)
|
|
1006
|
-
"""Event payload."""
|
|
1007
|
-
timestamp: datetime | None = None
|
|
1008
|
-
"""Event timestamp."""
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
1030
|
# -----------------------------------------------------------------------------
|
|
1012
1031
|
# Training
|
|
1013
1032
|
# -----------------------------------------------------------------------------
|