claude_swarm 1.0.1 → 1.0.2
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.
- checksums.yaml +4 -4
- data/.claude/commands/release.md +1 -1
- data/.claude/hooks/lint-code-files.rb +65 -0
- data/.rubocop.yml +22 -2
- data/CHANGELOG.md +14 -1
- data/CLAUDE.md +1 -1
- data/CONTRIBUTING.md +69 -0
- data/README.md +27 -2
- data/Rakefile +71 -3
- data/analyze_coverage.rb +94 -0
- data/docs/v2/CHANGELOG.swarm_cli.md +43 -0
- data/docs/v2/CHANGELOG.swarm_memory.md +379 -0
- data/docs/v2/CHANGELOG.swarm_sdk.md +362 -0
- data/docs/v2/README.md +308 -0
- data/docs/v2/guides/claude-code-agents.md +262 -0
- data/docs/v2/guides/complete-tutorial.md +3088 -0
- data/docs/v2/guides/getting-started.md +1456 -0
- data/docs/v2/guides/memory-adapters.md +998 -0
- data/docs/v2/guides/plugins.md +816 -0
- data/docs/v2/guides/quick-start-cli.md +1745 -0
- data/docs/v2/guides/rails-integration.md +1902 -0
- data/docs/v2/guides/swarm-memory.md +599 -0
- data/docs/v2/reference/cli.md +729 -0
- data/docs/v2/reference/ruby-dsl.md +2154 -0
- data/docs/v2/reference/yaml.md +1835 -0
- data/docs-team-swarm.yml +2222 -0
- data/examples/learning-assistant/assistant.md +7 -0
- data/examples/learning-assistant/example-memories/concept-example.md +90 -0
- data/examples/learning-assistant/example-memories/experience-example.md +66 -0
- data/examples/learning-assistant/example-memories/fact-example.md +76 -0
- data/examples/learning-assistant/example-memories/memory-index.md +78 -0
- data/examples/learning-assistant/example-memories/skill-example.md +168 -0
- data/examples/learning-assistant/learning_assistant.rb +34 -0
- data/examples/learning-assistant/learning_assistant.yml +20 -0
- data/examples/v2/dsl/01_basic.rb +44 -0
- data/examples/v2/dsl/02_core_parameters.rb +59 -0
- data/examples/v2/dsl/03_capabilities.rb +71 -0
- data/examples/v2/dsl/04_llm_parameters.rb +56 -0
- data/examples/v2/dsl/05_advanced_flags.rb +73 -0
- data/examples/v2/dsl/06_permissions.rb +80 -0
- data/examples/v2/dsl/07_mcp_server.rb +62 -0
- data/examples/v2/dsl/08_swarm_hooks.rb +53 -0
- data/examples/v2/dsl/09_agent_hooks.rb +67 -0
- data/examples/v2/dsl/10_all_agents_hooks.rb +67 -0
- data/examples/v2/dsl/11_delegation.rb +60 -0
- data/examples/v2/dsl/12_complete_integration.rb +137 -0
- data/examples/v2/file_tools_swarm.yml +102 -0
- data/examples/v2/hooks/01_basic_hooks.rb +133 -0
- data/examples/v2/hooks/02_usage_tracking.rb +201 -0
- data/examples/v2/hooks/03_production_monitoring.rb +429 -0
- data/examples/v2/hooks/agent_stop_exit_0.yml +21 -0
- data/examples/v2/hooks/agent_stop_exit_1.yml +21 -0
- data/examples/v2/hooks/agent_stop_exit_2.yml +26 -0
- data/examples/v2/hooks/multiple_hooks_all_pass.yml +37 -0
- data/examples/v2/hooks/multiple_hooks_first_fails.yml +37 -0
- data/examples/v2/hooks/multiple_hooks_second_fails.yml +37 -0
- data/examples/v2/hooks/multiple_hooks_warnings.yml +37 -0
- data/examples/v2/hooks/post_tool_use_exit_0.yml +24 -0
- data/examples/v2/hooks/post_tool_use_exit_1.yml +24 -0
- data/examples/v2/hooks/post_tool_use_exit_2.yml +24 -0
- data/examples/v2/hooks/post_tool_use_multi_matcher_exit_0.yml +26 -0
- data/examples/v2/hooks/post_tool_use_multi_matcher_exit_1.yml +26 -0
- data/examples/v2/hooks/post_tool_use_multi_matcher_exit_2.yml +26 -0
- data/examples/v2/hooks/pre_tool_use_exit_0.yml +24 -0
- data/examples/v2/hooks/pre_tool_use_exit_1.yml +24 -0
- data/examples/v2/hooks/pre_tool_use_exit_2.yml +24 -0
- data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_0.yml +26 -0
- data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_1.yml +26 -0
- data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_2.yml +27 -0
- data/examples/v2/hooks/swarm_summary.sh +44 -0
- data/examples/v2/hooks/user_prompt_exit_0.yml +21 -0
- data/examples/v2/hooks/user_prompt_exit_1.yml +21 -0
- data/examples/v2/hooks/user_prompt_exit_2.yml +21 -0
- data/examples/v2/hooks/validate_bash.rb +59 -0
- data/examples/v2/multi_directory_permissions.yml +221 -0
- data/examples/v2/node_context_demo.rb +127 -0
- data/examples/v2/node_workflow.rb +173 -0
- data/examples/v2/path_resolution_demo.rb +216 -0
- data/examples/v2/simple-swarm-v2.rb +90 -0
- data/examples/v2/simple-swarm-v2.yml +62 -0
- data/examples/v2/swarm.yml +71 -0
- data/examples/v2/swarm_with_hooks.yml +61 -0
- data/examples/v2/swarm_with_hooks_simple.yml +25 -0
- data/examples/v2/think_tool_demo.rb +62 -0
- data/exe/swarm +6 -0
- data/lib/claude_swarm/claude_mcp_server.rb +0 -6
- data/lib/claude_swarm/cli.rb +10 -3
- data/lib/claude_swarm/commands/ps.rb +19 -20
- data/lib/claude_swarm/commands/show.rb +1 -1
- data/lib/claude_swarm/configuration.rb +10 -12
- data/lib/claude_swarm/mcp_generator.rb +10 -1
- data/lib/claude_swarm/orchestrator.rb +73 -49
- data/lib/claude_swarm/system_utils.rb +37 -11
- data/lib/claude_swarm/version.rb +1 -1
- data/lib/claude_swarm/worktree_manager.rb +1 -0
- data/lib/claude_swarm/yaml_loader.rb +22 -0
- data/lib/claude_swarm.rb +6 -2
- data/lib/swarm_cli/cli.rb +201 -0
- data/lib/swarm_cli/command_registry.rb +61 -0
- data/lib/swarm_cli/commands/mcp_serve.rb +130 -0
- data/lib/swarm_cli/commands/mcp_tools.rb +148 -0
- data/lib/swarm_cli/commands/migrate.rb +55 -0
- data/lib/swarm_cli/commands/run.rb +173 -0
- data/lib/swarm_cli/config_loader.rb +97 -0
- data/lib/swarm_cli/formatters/human_formatter.rb +711 -0
- data/lib/swarm_cli/formatters/json_formatter.rb +51 -0
- data/lib/swarm_cli/interactive_repl.rb +918 -0
- data/lib/swarm_cli/mcp_serve_options.rb +44 -0
- data/lib/swarm_cli/mcp_tools_options.rb +59 -0
- data/lib/swarm_cli/migrate_options.rb +54 -0
- data/lib/swarm_cli/migrator.rb +132 -0
- data/lib/swarm_cli/options.rb +151 -0
- data/lib/swarm_cli/ui/components/agent_badge.rb +33 -0
- data/lib/swarm_cli/ui/components/content_block.rb +120 -0
- data/lib/swarm_cli/ui/components/divider.rb +57 -0
- data/lib/swarm_cli/ui/components/panel.rb +62 -0
- data/lib/swarm_cli/ui/components/usage_stats.rb +70 -0
- data/lib/swarm_cli/ui/formatters/cost.rb +49 -0
- data/lib/swarm_cli/ui/formatters/number.rb +58 -0
- data/lib/swarm_cli/ui/formatters/text.rb +77 -0
- data/lib/swarm_cli/ui/formatters/time.rb +73 -0
- data/lib/swarm_cli/ui/icons.rb +59 -0
- data/lib/swarm_cli/ui/renderers/event_renderer.rb +188 -0
- data/lib/swarm_cli/ui/state/agent_color_cache.rb +45 -0
- data/lib/swarm_cli/ui/state/depth_tracker.rb +40 -0
- data/lib/swarm_cli/ui/state/spinner_manager.rb +170 -0
- data/lib/swarm_cli/ui/state/usage_tracker.rb +62 -0
- data/lib/swarm_cli/version.rb +5 -0
- data/lib/swarm_cli.rb +44 -0
- data/lib/swarm_memory/adapters/base.rb +141 -0
- data/lib/swarm_memory/adapters/filesystem_adapter.rb +845 -0
- data/lib/swarm_memory/chat_extension.rb +34 -0
- data/lib/swarm_memory/cli/commands.rb +306 -0
- data/lib/swarm_memory/core/entry.rb +37 -0
- data/lib/swarm_memory/core/frontmatter_parser.rb +108 -0
- data/lib/swarm_memory/core/metadata_extractor.rb +68 -0
- data/lib/swarm_memory/core/path_normalizer.rb +75 -0
- data/lib/swarm_memory/core/semantic_index.rb +244 -0
- data/lib/swarm_memory/core/storage.rb +288 -0
- data/lib/swarm_memory/core/storage_read_tracker.rb +63 -0
- data/lib/swarm_memory/dsl/builder_extension.rb +40 -0
- data/lib/swarm_memory/dsl/memory_config.rb +113 -0
- data/lib/swarm_memory/embeddings/embedder.rb +36 -0
- data/lib/swarm_memory/embeddings/informers_embedder.rb +152 -0
- data/lib/swarm_memory/errors.rb +21 -0
- data/lib/swarm_memory/integration/cli_registration.rb +30 -0
- data/lib/swarm_memory/integration/configuration.rb +43 -0
- data/lib/swarm_memory/integration/registration.rb +31 -0
- data/lib/swarm_memory/integration/sdk_plugin.rb +531 -0
- data/lib/swarm_memory/optimization/analyzer.rb +244 -0
- data/lib/swarm_memory/optimization/defragmenter.rb +863 -0
- data/lib/swarm_memory/prompts/memory.md.erb +109 -0
- data/lib/swarm_memory/prompts/memory_assistant.md.erb +181 -0
- data/lib/swarm_memory/prompts/memory_researcher.md.erb +281 -0
- data/lib/swarm_memory/prompts/memory_retrieval.md.erb +78 -0
- data/lib/swarm_memory/search/semantic_search.rb +112 -0
- data/lib/swarm_memory/search/text_search.rb +42 -0
- data/lib/swarm_memory/search/text_similarity.rb +80 -0
- data/lib/swarm_memory/skills/meta/deep-learning.md +101 -0
- data/lib/swarm_memory/skills/meta/deep-learning.yml +14 -0
- data/lib/swarm_memory/tools/load_skill.rb +313 -0
- data/lib/swarm_memory/tools/memory_defrag.rb +382 -0
- data/lib/swarm_memory/tools/memory_delete.rb +99 -0
- data/lib/swarm_memory/tools/memory_edit.rb +185 -0
- data/lib/swarm_memory/tools/memory_glob.rb +160 -0
- data/lib/swarm_memory/tools/memory_grep.rb +247 -0
- data/lib/swarm_memory/tools/memory_multi_edit.rb +281 -0
- data/lib/swarm_memory/tools/memory_read.rb +123 -0
- data/lib/swarm_memory/tools/memory_write.rb +231 -0
- data/lib/swarm_memory/utils.rb +50 -0
- data/lib/swarm_memory/version.rb +5 -0
- data/lib/swarm_memory.rb +166 -0
- data/lib/swarm_sdk/agent/RETRY_LOGIC.md +127 -0
- data/lib/swarm_sdk/agent/builder.rb +461 -0
- data/lib/swarm_sdk/agent/chat/context_tracker.rb +314 -0
- data/lib/swarm_sdk/agent/chat/hook_integration.rb +372 -0
- data/lib/swarm_sdk/agent/chat/logging_helpers.rb +116 -0
- data/lib/swarm_sdk/agent/chat/system_reminder_injector.rb +152 -0
- data/lib/swarm_sdk/agent/chat.rb +1159 -0
- data/lib/swarm_sdk/agent/context.rb +112 -0
- data/lib/swarm_sdk/agent/context_manager.rb +309 -0
- data/lib/swarm_sdk/agent/definition.rb +556 -0
- data/lib/swarm_sdk/claude_code_agent_adapter.rb +205 -0
- data/lib/swarm_sdk/configuration.rb +296 -0
- data/lib/swarm_sdk/context_compactor/metrics.rb +147 -0
- data/lib/swarm_sdk/context_compactor/token_counter.rb +106 -0
- data/lib/swarm_sdk/context_compactor.rb +340 -0
- data/lib/swarm_sdk/hooks/adapter.rb +359 -0
- data/lib/swarm_sdk/hooks/context.rb +197 -0
- data/lib/swarm_sdk/hooks/definition.rb +80 -0
- data/lib/swarm_sdk/hooks/error.rb +29 -0
- data/lib/swarm_sdk/hooks/executor.rb +146 -0
- data/lib/swarm_sdk/hooks/registry.rb +147 -0
- data/lib/swarm_sdk/hooks/result.rb +150 -0
- data/lib/swarm_sdk/hooks/shell_executor.rb +254 -0
- data/lib/swarm_sdk/hooks/tool_call.rb +35 -0
- data/lib/swarm_sdk/hooks/tool_result.rb +62 -0
- data/lib/swarm_sdk/log_collector.rb +51 -0
- data/lib/swarm_sdk/log_stream.rb +69 -0
- data/lib/swarm_sdk/markdown_parser.rb +75 -0
- data/lib/swarm_sdk/model_aliases.json +5 -0
- data/lib/swarm_sdk/models.json +1 -0
- data/lib/swarm_sdk/models.rb +120 -0
- data/lib/swarm_sdk/node/agent_config.rb +49 -0
- data/lib/swarm_sdk/node/builder.rb +439 -0
- data/lib/swarm_sdk/node/transformer_executor.rb +248 -0
- data/lib/swarm_sdk/node_context.rb +170 -0
- data/lib/swarm_sdk/node_orchestrator.rb +384 -0
- data/lib/swarm_sdk/permissions/config.rb +239 -0
- data/lib/swarm_sdk/permissions/error_formatter.rb +121 -0
- data/lib/swarm_sdk/permissions/path_matcher.rb +35 -0
- data/lib/swarm_sdk/permissions/validator.rb +173 -0
- data/lib/swarm_sdk/permissions_builder.rb +122 -0
- data/lib/swarm_sdk/plugin.rb +147 -0
- data/lib/swarm_sdk/plugin_registry.rb +101 -0
- data/lib/swarm_sdk/prompts/base_system_prompt.md.erb +243 -0
- data/lib/swarm_sdk/providers/openai_with_responses.rb +582 -0
- data/lib/swarm_sdk/result.rb +97 -0
- data/lib/swarm_sdk/swarm/agent_initializer.rb +334 -0
- data/lib/swarm_sdk/swarm/all_agents_builder.rb +140 -0
- data/lib/swarm_sdk/swarm/builder.rb +586 -0
- data/lib/swarm_sdk/swarm/mcp_configurator.rb +151 -0
- data/lib/swarm_sdk/swarm/tool_configurator.rb +419 -0
- data/lib/swarm_sdk/swarm.rb +982 -0
- data/lib/swarm_sdk/tools/bash.rb +274 -0
- data/lib/swarm_sdk/tools/clock.rb +44 -0
- data/lib/swarm_sdk/tools/delegate.rb +164 -0
- data/lib/swarm_sdk/tools/document_converters/base_converter.rb +83 -0
- data/lib/swarm_sdk/tools/document_converters/docx_converter.rb +99 -0
- data/lib/swarm_sdk/tools/document_converters/html_converter.rb +101 -0
- data/lib/swarm_sdk/tools/document_converters/pdf_converter.rb +78 -0
- data/lib/swarm_sdk/tools/document_converters/xlsx_converter.rb +194 -0
- data/lib/swarm_sdk/tools/edit.rb +150 -0
- data/lib/swarm_sdk/tools/glob.rb +158 -0
- data/lib/swarm_sdk/tools/grep.rb +228 -0
- data/lib/swarm_sdk/tools/image_extractors/docx_image_extractor.rb +43 -0
- data/lib/swarm_sdk/tools/image_extractors/pdf_image_extractor.rb +163 -0
- data/lib/swarm_sdk/tools/image_formats/tiff_builder.rb +65 -0
- data/lib/swarm_sdk/tools/multi_edit.rb +232 -0
- data/lib/swarm_sdk/tools/path_resolver.rb +43 -0
- data/lib/swarm_sdk/tools/read.rb +251 -0
- data/lib/swarm_sdk/tools/registry.rb +93 -0
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_list.rb +96 -0
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_read.rb +76 -0
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_write.rb +91 -0
- data/lib/swarm_sdk/tools/stores/read_tracker.rb +61 -0
- data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +224 -0
- data/lib/swarm_sdk/tools/stores/storage.rb +148 -0
- data/lib/swarm_sdk/tools/stores/todo_manager.rb +65 -0
- data/lib/swarm_sdk/tools/think.rb +95 -0
- data/lib/swarm_sdk/tools/todo_write.rb +216 -0
- data/lib/swarm_sdk/tools/web_fetch.rb +261 -0
- data/lib/swarm_sdk/tools/write.rb +117 -0
- data/lib/swarm_sdk/utils.rb +50 -0
- data/lib/swarm_sdk/version.rb +5 -0
- data/lib/swarm_sdk.rb +157 -0
- data/llm.v2.txt +13407 -0
- data/rubocop/cop/security/no_reflection_methods.rb +47 -0
- data/rubocop/cop/security/no_ruby_llm_logger.rb +32 -0
- data/swarm_cli.gemspec +57 -0
- data/swarm_memory.gemspec +28 -0
- data/swarm_sdk.gemspec +41 -0
- data/team.yml +1 -1
- data/team_full.yml +1875 -0
- data/{team_v2.yml → team_sdk.yml} +121 -52
- metadata +247 -4
- data/EXAMPLES.md +0 -164
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Manual Test 3: Agent Capabilities
|
|
5
|
+
#
|
|
6
|
+
# Tests: tools, delegates_to, directory
|
|
7
|
+
#
|
|
8
|
+
# Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/03_capabilities.rb
|
|
9
|
+
|
|
10
|
+
require "swarm_sdk"
|
|
11
|
+
require_relative "../../../swarm_sdk/swarm_builder"
|
|
12
|
+
require_relative "../../../swarm_sdk/agent_builder"
|
|
13
|
+
|
|
14
|
+
ENV["OPENAI_API_KEY"] = "test-key"
|
|
15
|
+
|
|
16
|
+
swarm = SwarmSDK.build do
|
|
17
|
+
name("Capabilities Test")
|
|
18
|
+
lead(:coordinator)
|
|
19
|
+
|
|
20
|
+
agent(:coordinator) do
|
|
21
|
+
model("gpt-5-nano")
|
|
22
|
+
provider("openai")
|
|
23
|
+
system_prompt("You coordinate work and delegate to workers. Use TodoWrite for multi-step tasks.")
|
|
24
|
+
description("Coordinator testing delegation")
|
|
25
|
+
|
|
26
|
+
# Multiple tools
|
|
27
|
+
tools(:Read, :Grep, :Glob, :TodoWrite)
|
|
28
|
+
|
|
29
|
+
# Delegation
|
|
30
|
+
delegates_to(:worker)
|
|
31
|
+
|
|
32
|
+
# Working directory
|
|
33
|
+
directory(".")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
agent(:worker) do
|
|
37
|
+
model("gpt-5-nano")
|
|
38
|
+
provider("openai")
|
|
39
|
+
system_prompt("You are a worker agent. Answer concisely.")
|
|
40
|
+
description("Worker agent for delegation testing")
|
|
41
|
+
|
|
42
|
+
tools(:Read)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
puts "✅ Swarm with capabilities built!"
|
|
47
|
+
puts ""
|
|
48
|
+
|
|
49
|
+
# Verify configuration using public API
|
|
50
|
+
coordinator_def = swarm.agent_definition(:coordinator)
|
|
51
|
+
worker_def = swarm.agent_definition(:worker)
|
|
52
|
+
|
|
53
|
+
puts "Coordinator:"
|
|
54
|
+
puts " tools: #{coordinator_def.tools.map { |t| t[:name] }.join(", ")}"
|
|
55
|
+
puts " delegates_to: #{coordinator_def.delegates_to.join(", ")}"
|
|
56
|
+
puts " directory: #{coordinator_def.directory}"
|
|
57
|
+
puts ""
|
|
58
|
+
|
|
59
|
+
puts "Worker:"
|
|
60
|
+
puts " tools: #{worker_def.tools.map { |t| t[:name] }.join(", ")}"
|
|
61
|
+
puts ""
|
|
62
|
+
|
|
63
|
+
puts "Testing delegation..."
|
|
64
|
+
result = swarm.execute("Delegate a simple task to the worker: ask them what 5 + 3 equals")
|
|
65
|
+
|
|
66
|
+
puts ""
|
|
67
|
+
puts "Response: #{result.content}"
|
|
68
|
+
puts "Agents involved: #{result.agents_involved.join(", ")}"
|
|
69
|
+
puts "Success: #{result.success?}"
|
|
70
|
+
puts ""
|
|
71
|
+
puts "✅ Tools, delegation, and directory work!"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Manual Test 4: LLM Parameters
|
|
5
|
+
#
|
|
6
|
+
# Tests: parameters (temperature, max_tokens, reasoning), timeout
|
|
7
|
+
#
|
|
8
|
+
# Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/04_llm_parameters.rb
|
|
9
|
+
|
|
10
|
+
require "swarm_sdk"
|
|
11
|
+
require_relative "../../../swarm_sdk/swarm_builder"
|
|
12
|
+
require_relative "../../../swarm_sdk/agent_builder"
|
|
13
|
+
|
|
14
|
+
ENV["OPENAI_API_KEY"] = "test-key"
|
|
15
|
+
|
|
16
|
+
swarm = SwarmSDK.build do
|
|
17
|
+
name("LLM Parameters Test")
|
|
18
|
+
lead(:configured_agent)
|
|
19
|
+
|
|
20
|
+
agent(:configured_agent) do
|
|
21
|
+
model("gpt-5-nano")
|
|
22
|
+
provider("openai")
|
|
23
|
+
system_prompt("You test LLM parameters. Be concise.")
|
|
24
|
+
description("Agent with custom LLM parameters")
|
|
25
|
+
tools(:Read)
|
|
26
|
+
|
|
27
|
+
# LLM parameters hash
|
|
28
|
+
parameters(
|
|
29
|
+
temperature: 0.3,
|
|
30
|
+
max_tokens: 100,
|
|
31
|
+
reasoning: "low",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# HTTP timeout
|
|
35
|
+
timeout(60)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
puts "✅ Swarm with LLM parameters built!"
|
|
40
|
+
puts ""
|
|
41
|
+
|
|
42
|
+
agent_def = swarm.agent_definition(:configured_agent)
|
|
43
|
+
|
|
44
|
+
puts "Parameter Verification:"
|
|
45
|
+
puts " parameters: #{agent_def.parameters.inspect}"
|
|
46
|
+
puts " timeout: #{agent_def.timeout}"
|
|
47
|
+
puts ""
|
|
48
|
+
|
|
49
|
+
puts "Running test query with configured parameters..."
|
|
50
|
+
result = swarm.execute("Count to 3")
|
|
51
|
+
|
|
52
|
+
puts ""
|
|
53
|
+
puts "Response: #{result.content}"
|
|
54
|
+
puts "Success: #{result.success?}"
|
|
55
|
+
puts ""
|
|
56
|
+
puts "✅ LLM parameters and timeout work!"
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Manual Test 5: Advanced Flags
|
|
5
|
+
#
|
|
6
|
+
# Tests: disable_default_tools, bypass_permissions, coding_agent, assume_model_exists
|
|
7
|
+
#
|
|
8
|
+
# Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/05_advanced_flags.rb
|
|
9
|
+
|
|
10
|
+
require "swarm_sdk"
|
|
11
|
+
require_relative "../../../swarm_sdk/swarm_builder"
|
|
12
|
+
require_relative "../../../swarm_sdk/agent_builder"
|
|
13
|
+
require_relative "../../../swarm_sdk/permissions_builder"
|
|
14
|
+
|
|
15
|
+
ENV["OPENAI_API_KEY"] = "test-key"
|
|
16
|
+
|
|
17
|
+
swarm = SwarmSDK.build do
|
|
18
|
+
name("Advanced Flags Test")
|
|
19
|
+
lead(:test_agent)
|
|
20
|
+
|
|
21
|
+
agent(:test_agent) do
|
|
22
|
+
model("gpt-5-nano")
|
|
23
|
+
provider("openai")
|
|
24
|
+
description("Agent testing advanced flags")
|
|
25
|
+
|
|
26
|
+
# Test skip_base_prompt: true (custom prompt only)
|
|
27
|
+
coding_agent(false)
|
|
28
|
+
system_prompt("You are a test agent. You only have Read tool. Say 'flags work' when asked.")
|
|
29
|
+
|
|
30
|
+
# Test assume_model_exists: true (skip model validation)
|
|
31
|
+
assume_model_exists(true)
|
|
32
|
+
|
|
33
|
+
# Test bypass_permissions: false (respect permissions)
|
|
34
|
+
bypass_permissions(false)
|
|
35
|
+
|
|
36
|
+
# Only Read tool (no defaults) - using include_default: false
|
|
37
|
+
tools(:Read, include_default: false)
|
|
38
|
+
|
|
39
|
+
# Add permissions to verify bypass_permissions: false respects them
|
|
40
|
+
permissions do
|
|
41
|
+
tool(:Read).deny_paths("tmp/secret.txt")
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
puts "✅ Swarm with advanced flags built!"
|
|
47
|
+
puts ""
|
|
48
|
+
|
|
49
|
+
agent_def = swarm.agent_definition(:test_agent)
|
|
50
|
+
|
|
51
|
+
puts "Advanced Flags Verification:"
|
|
52
|
+
puts " coding_agent: #{agent_def.coding_agent}"
|
|
53
|
+
puts " disable_default_tools: #{agent_def.disable_default_tools}"
|
|
54
|
+
puts " bypass_permissions: #{agent_def.bypass_permissions}"
|
|
55
|
+
puts " assume_model_exists: #{agent_def.assume_model_exists}"
|
|
56
|
+
puts " system_prompt: #{agent_def.system_prompt[0..80]}..."
|
|
57
|
+
puts ""
|
|
58
|
+
|
|
59
|
+
# Verify agent tools (should NOT include defaults like Grep, Glob)
|
|
60
|
+
agent_chat = swarm.agent(:test_agent)
|
|
61
|
+
tool_names = agent_chat.tools.keys
|
|
62
|
+
puts "Agent tools (should be ONLY Read, no defaults):"
|
|
63
|
+
puts " #{tool_names.join(", ")}"
|
|
64
|
+
puts ""
|
|
65
|
+
|
|
66
|
+
puts "Running test query..."
|
|
67
|
+
result = swarm.execute("Are the flags working?")
|
|
68
|
+
|
|
69
|
+
puts ""
|
|
70
|
+
puts "Response: #{result.content}"
|
|
71
|
+
puts "Success: #{result.success?}"
|
|
72
|
+
puts ""
|
|
73
|
+
puts "✅ All advanced flags work correctly!"
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Manual Test 6: Permissions DSL
|
|
5
|
+
#
|
|
6
|
+
# Tests: all_agents permissions, agent permissions, path and command restrictions
|
|
7
|
+
#
|
|
8
|
+
# Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/06_permissions.rb
|
|
9
|
+
|
|
10
|
+
require "swarm_sdk"
|
|
11
|
+
require_relative "../../../swarm_sdk/swarm_builder"
|
|
12
|
+
require_relative "../../../swarm_sdk/agent_builder"
|
|
13
|
+
require_relative "../../../swarm_sdk/all_agents_builder"
|
|
14
|
+
require_relative "../../../swarm_sdk/permissions_builder"
|
|
15
|
+
require "fileutils"
|
|
16
|
+
|
|
17
|
+
ENV["OPENAI_API_KEY"] = "test-key"
|
|
18
|
+
|
|
19
|
+
# Setup test environment
|
|
20
|
+
FileUtils.mkdir_p("tmp/allowed")
|
|
21
|
+
FileUtils.mkdir_p("tmp/forbidden")
|
|
22
|
+
File.write("tmp/allowed/test.txt", "allowed content")
|
|
23
|
+
File.write("tmp/forbidden/secret.txt", "secret content")
|
|
24
|
+
|
|
25
|
+
swarm = SwarmSDK.build do
|
|
26
|
+
name("Permissions Test")
|
|
27
|
+
lead(:restricted_agent)
|
|
28
|
+
|
|
29
|
+
# Default permissions for all agents
|
|
30
|
+
all_agents do
|
|
31
|
+
tools(:Write)
|
|
32
|
+
|
|
33
|
+
permissions do
|
|
34
|
+
tool(:Write).allow_paths("tmp/allowed/**/*")
|
|
35
|
+
tool(:Write).deny_paths("tmp/forbidden/**/*")
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
agent(:restricted_agent) do
|
|
40
|
+
model("gpt-5-nano")
|
|
41
|
+
provider("openai")
|
|
42
|
+
system_prompt("You test file permissions. Try to write to allowed and forbidden paths.")
|
|
43
|
+
description("Agent with write restrictions")
|
|
44
|
+
|
|
45
|
+
tools(:Read, :Bash)
|
|
46
|
+
|
|
47
|
+
# Agent-specific Bash permissions
|
|
48
|
+
permissions do
|
|
49
|
+
tool(:Bash).allow_commands("^ls", "^pwd$", "^echo")
|
|
50
|
+
tool(:Bash).deny_commands("^rm", "^dd")
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
puts "✅ Swarm with permissions built!"
|
|
56
|
+
puts ""
|
|
57
|
+
|
|
58
|
+
agent_def = swarm.agent_definition(:restricted_agent)
|
|
59
|
+
|
|
60
|
+
puts "Permissions Verification:"
|
|
61
|
+
puts " Default (Write): #{agent_def.default_permissions}"
|
|
62
|
+
puts " Agent (Bash): #{agent_def.agent_permissions}"
|
|
63
|
+
puts ""
|
|
64
|
+
|
|
65
|
+
puts "Testing simple query with permissions in place..."
|
|
66
|
+
result = swarm.execute("Say 'permissions configured'")
|
|
67
|
+
|
|
68
|
+
puts ""
|
|
69
|
+
puts "Response: #{result.content}"
|
|
70
|
+
puts "Success: #{result.success?}"
|
|
71
|
+
puts ""
|
|
72
|
+
puts "✅ Permissions DSL configured correctly!"
|
|
73
|
+
puts ""
|
|
74
|
+
puts "Note: Permissions are enforced - agent can only:"
|
|
75
|
+
puts " - Write to tmp/allowed/** (not tmp/forbidden/**)"
|
|
76
|
+
puts " - Run Bash: ls, pwd, echo (not rm, dd)"
|
|
77
|
+
|
|
78
|
+
# Cleanup
|
|
79
|
+
FileUtils.rm_rf("tmp/allowed")
|
|
80
|
+
FileUtils.rm_rf("tmp/forbidden")
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Manual Test 7: MCP Server Configuration
|
|
5
|
+
#
|
|
6
|
+
# Tests: mcp_server with filesystem MCP server (stdio transport)
|
|
7
|
+
#
|
|
8
|
+
# Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/07_mcp_server.rb
|
|
9
|
+
|
|
10
|
+
require "swarm_sdk"
|
|
11
|
+
require_relative "../../../swarm_sdk/swarm_builder"
|
|
12
|
+
require_relative "../../../swarm_sdk/agent_builder"
|
|
13
|
+
|
|
14
|
+
ENV["OPENAI_API_KEY"] = "test-key"
|
|
15
|
+
|
|
16
|
+
swarm = SwarmSDK.build do
|
|
17
|
+
name("MCP Server Test")
|
|
18
|
+
lead(:mcp_agent)
|
|
19
|
+
|
|
20
|
+
agent(:mcp_agent) do
|
|
21
|
+
model("gpt-5-nano")
|
|
22
|
+
provider("openai")
|
|
23
|
+
system_prompt("You have access to MCP tools from filesystem server. List available tools when asked.")
|
|
24
|
+
description("Agent with MCP server access")
|
|
25
|
+
|
|
26
|
+
tools(:Read)
|
|
27
|
+
|
|
28
|
+
# Add example MCP server (filesystem-mcp for demonstration)
|
|
29
|
+
mcp_server(
|
|
30
|
+
:filesystem,
|
|
31
|
+
type: :stdio,
|
|
32
|
+
command: "npx",
|
|
33
|
+
args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
|
|
34
|
+
env: {},
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
puts "✅ Swarm with MCP server built!"
|
|
40
|
+
puts ""
|
|
41
|
+
|
|
42
|
+
agent_def = swarm.agent_definition(:mcp_agent)
|
|
43
|
+
|
|
44
|
+
puts "MCP Server Verification:"
|
|
45
|
+
puts " Servers configured: #{agent_def.mcp_servers.size}"
|
|
46
|
+
agent_def.mcp_servers.each do |server|
|
|
47
|
+
puts " - #{server[:name]} (#{server[:type]})"
|
|
48
|
+
puts " command: #{server[:command]}"
|
|
49
|
+
puts " args: #{server[:args].inspect}"
|
|
50
|
+
end
|
|
51
|
+
puts ""
|
|
52
|
+
|
|
53
|
+
puts "Testing MCP server connection..."
|
|
54
|
+
puts "(Agent should have access to filesystem MCP tools)"
|
|
55
|
+
puts ""
|
|
56
|
+
|
|
57
|
+
result = swarm.execute("What tools do you have access to? List them.")
|
|
58
|
+
|
|
59
|
+
puts "Response: #{result.content[0..300]}..."
|
|
60
|
+
puts "Success: #{result.success?}"
|
|
61
|
+
puts ""
|
|
62
|
+
puts "✅ MCP server configuration works!"
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Manual Test 8: Swarm-Level Hooks
|
|
5
|
+
#
|
|
6
|
+
# Tests: hook :swarm_start, hook :swarm_stop (Ruby blocks)
|
|
7
|
+
#
|
|
8
|
+
# Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/08_swarm_hooks.rb
|
|
9
|
+
|
|
10
|
+
require "swarm_sdk"
|
|
11
|
+
require_relative "../../../swarm_sdk/swarm_builder"
|
|
12
|
+
require_relative "../../../swarm_sdk/agent_builder"
|
|
13
|
+
|
|
14
|
+
ENV["OPENAI_API_KEY"] = "test-key"
|
|
15
|
+
|
|
16
|
+
swarm = SwarmSDK.build do
|
|
17
|
+
name("Swarm Hooks Test")
|
|
18
|
+
lead(:agent)
|
|
19
|
+
|
|
20
|
+
# Swarm-level hook: swarm_start
|
|
21
|
+
hook(:swarm_start) do |ctx|
|
|
22
|
+
puts "🪝 swarm_start hook fired!"
|
|
23
|
+
puts " Prompt: #{ctx.metadata[:prompt]}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Swarm-level hook: swarm_stop
|
|
27
|
+
hook(:swarm_stop) do |ctx|
|
|
28
|
+
puts "🪝 swarm_stop hook fired!"
|
|
29
|
+
puts " Success: #{ctx.metadata[:success]}"
|
|
30
|
+
puts " Cost: $#{ctx.metadata[:total_cost]}"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
agent(:agent) do
|
|
34
|
+
model("gpt-5-nano")
|
|
35
|
+
provider("openai")
|
|
36
|
+
system_prompt("You test swarm hooks. Say 'hooks work'.")
|
|
37
|
+
description("Test agent")
|
|
38
|
+
tools(:Read)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
puts "✅ Swarm with swarm-level hooks built!"
|
|
43
|
+
puts ""
|
|
44
|
+
puts "Running execution to trigger hooks..."
|
|
45
|
+
puts ""
|
|
46
|
+
|
|
47
|
+
result = swarm.execute("Say 'swarm hooks test'")
|
|
48
|
+
|
|
49
|
+
puts ""
|
|
50
|
+
puts "Response: #{result.content}"
|
|
51
|
+
puts ""
|
|
52
|
+
puts "✅ Swarm-level hooks work correctly!"
|
|
53
|
+
puts "(Check output above for 🪝 markers)"
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Manual Test 9: Agent-Level Hooks
|
|
5
|
+
#
|
|
6
|
+
# Tests: hook :pre_tool_use, hook :post_tool_use, hook :user_prompt (Ruby blocks)
|
|
7
|
+
#
|
|
8
|
+
# Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/09_agent_hooks.rb
|
|
9
|
+
|
|
10
|
+
require "swarm_sdk"
|
|
11
|
+
require_relative "../../../swarm_sdk/swarm_builder"
|
|
12
|
+
require_relative "../../../swarm_sdk/agent_builder"
|
|
13
|
+
|
|
14
|
+
ENV["OPENAI_API_KEY"] = "test-key"
|
|
15
|
+
|
|
16
|
+
swarm = SwarmSDK.build do
|
|
17
|
+
name("Agent Hooks Test")
|
|
18
|
+
lead(:agent)
|
|
19
|
+
|
|
20
|
+
agent(:agent) do
|
|
21
|
+
model("gpt-5-nano")
|
|
22
|
+
provider("openai")
|
|
23
|
+
system_prompt("You test agent hooks. Use Read tool to read tmp/test.txt")
|
|
24
|
+
description("Test agent with hooks")
|
|
25
|
+
tools(:Read)
|
|
26
|
+
|
|
27
|
+
# Hook: user_prompt (before sending to LLM)
|
|
28
|
+
hook(:user_prompt) do |ctx|
|
|
29
|
+
puts "🪝 user_prompt hook fired!"
|
|
30
|
+
puts " Prompt: #{ctx.metadata[:prompt][0..50]}..."
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Hook: pre_tool_use (before tool execution)
|
|
34
|
+
hook(:pre_tool_use, matcher: "Read") do |ctx|
|
|
35
|
+
puts "🪝 pre_tool_use hook fired!"
|
|
36
|
+
puts " Tool: #{ctx.tool_call.name}"
|
|
37
|
+
puts " File: #{ctx.tool_call.parameters[:file_path]}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Hook: post_tool_use (after tool execution)
|
|
41
|
+
hook(:post_tool_use, matcher: "Read") do |ctx|
|
|
42
|
+
puts "🪝 post_tool_use hook fired!"
|
|
43
|
+
puts " Result length: #{ctx.tool_result.content.to_s.length} chars"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Setup test file
|
|
49
|
+
require "fileutils"
|
|
50
|
+
FileUtils.mkdir_p("tmp")
|
|
51
|
+
File.write("tmp/test.txt", "test content for hooks")
|
|
52
|
+
|
|
53
|
+
puts "✅ Swarm with agent-level hooks built!"
|
|
54
|
+
puts ""
|
|
55
|
+
puts "Running execution to trigger hooks..."
|
|
56
|
+
puts ""
|
|
57
|
+
|
|
58
|
+
result = swarm.execute("Read the file tmp/test.txt")
|
|
59
|
+
|
|
60
|
+
puts ""
|
|
61
|
+
puts "Response: #{result.content}"
|
|
62
|
+
puts ""
|
|
63
|
+
puts "✅ Agent-level hooks work correctly!"
|
|
64
|
+
puts "(Hooks fired - check output above for 🪝 markers)"
|
|
65
|
+
|
|
66
|
+
# Cleanup
|
|
67
|
+
File.delete("tmp/test.txt") if File.exist?("tmp/test.txt")
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Manual Test 10: All-Agents Hooks
|
|
5
|
+
#
|
|
6
|
+
# Tests: all_agents { hook } (applies to all agents)
|
|
7
|
+
#
|
|
8
|
+
# Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/10_all_agents_hooks.rb
|
|
9
|
+
|
|
10
|
+
require "swarm_sdk"
|
|
11
|
+
require_relative "../../../swarm_sdk/swarm_builder"
|
|
12
|
+
require_relative "../../../swarm_sdk/agent_builder"
|
|
13
|
+
require_relative "../../../swarm_sdk/all_agents_builder"
|
|
14
|
+
|
|
15
|
+
ENV["OPENAI_API_KEY"] = "test-key"
|
|
16
|
+
|
|
17
|
+
swarm = SwarmSDK.build do
|
|
18
|
+
name("All-Agents Hooks Test")
|
|
19
|
+
lead(:agent1)
|
|
20
|
+
|
|
21
|
+
# Hook that applies to ALL agents
|
|
22
|
+
all_agents do
|
|
23
|
+
hook(:pre_tool_use, matcher: "Read") do |ctx|
|
|
24
|
+
agent = ctx.agent_name
|
|
25
|
+
puts "🪝 all_agents hook fired for: #{agent}"
|
|
26
|
+
puts " Tool: #{ctx.tool_call.name}"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
agent(:agent1) do
|
|
31
|
+
model("gpt-5-nano")
|
|
32
|
+
provider("openai")
|
|
33
|
+
system_prompt("You test all_agents hooks. Use Read tool. Delegate to agent2.")
|
|
34
|
+
description("First test agent")
|
|
35
|
+
tools(:Read)
|
|
36
|
+
delegates_to(:agent2)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
agent(:agent2) do
|
|
40
|
+
model("gpt-5-nano")
|
|
41
|
+
provider("openai")
|
|
42
|
+
system_prompt("You are agent2. Use Read tool when asked.")
|
|
43
|
+
description("Second test agent")
|
|
44
|
+
tools(:Read)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Setup test file
|
|
49
|
+
require "fileutils"
|
|
50
|
+
FileUtils.mkdir_p("tmp")
|
|
51
|
+
File.write("tmp/all_agents_test.txt", "testing all_agents hooks")
|
|
52
|
+
|
|
53
|
+
puts "✅ Swarm with all_agents hooks built!"
|
|
54
|
+
puts ""
|
|
55
|
+
puts "Running execution to trigger hooks across agents..."
|
|
56
|
+
puts ""
|
|
57
|
+
|
|
58
|
+
result = swarm.execute("Read tmp/all_agents_test.txt, then delegate to agent2 to also read it")
|
|
59
|
+
|
|
60
|
+
puts ""
|
|
61
|
+
puts "Response: #{result.content[0..150]}..."
|
|
62
|
+
puts ""
|
|
63
|
+
puts "✅ All-agents hooks work correctly!"
|
|
64
|
+
puts "(Check output above for 🪝 markers showing hook fired for multiple agents)"
|
|
65
|
+
|
|
66
|
+
# Cleanup
|
|
67
|
+
File.delete("tmp/all_agents_test.txt") if File.exist?("tmp/all_agents_test.txt")
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Manual Test 11: Agent Delegation
|
|
5
|
+
#
|
|
6
|
+
# Tests: Multi-agent delegation with delegates_to
|
|
7
|
+
#
|
|
8
|
+
# Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/11_delegation.rb
|
|
9
|
+
|
|
10
|
+
require "swarm_sdk"
|
|
11
|
+
require_relative "../../../swarm_sdk/swarm_builder"
|
|
12
|
+
require_relative "../../../swarm_sdk/agent_builder"
|
|
13
|
+
|
|
14
|
+
ENV["OPENAI_API_KEY"] = "test-key"
|
|
15
|
+
|
|
16
|
+
swarm = SwarmSDK.build do
|
|
17
|
+
name("Delegation Test")
|
|
18
|
+
lead(:coordinator)
|
|
19
|
+
|
|
20
|
+
agent(:coordinator) do
|
|
21
|
+
model("gpt-5-nano")
|
|
22
|
+
provider("openai")
|
|
23
|
+
system_prompt("You coordinate tasks. Delegate math to calculator, text to writer.")
|
|
24
|
+
description("Coordinator")
|
|
25
|
+
tools(:TodoWrite)
|
|
26
|
+
delegates_to(:calculator, :writer)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
agent(:calculator) do
|
|
30
|
+
model("gpt-5-nano")
|
|
31
|
+
provider("openai")
|
|
32
|
+
system_prompt("You do math. Answer with just the number.")
|
|
33
|
+
description("Math specialist")
|
|
34
|
+
tools(:Read)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
agent(:writer) do
|
|
38
|
+
model("gpt-5-nano")
|
|
39
|
+
provider("openai")
|
|
40
|
+
system_prompt("You write text. Be creative and concise.")
|
|
41
|
+
description("Writing specialist")
|
|
42
|
+
tools(:Read)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
puts "✅ Swarm with delegation built!"
|
|
47
|
+
puts ""
|
|
48
|
+
|
|
49
|
+
coordinator_def = swarm.agent_definition(:coordinator)
|
|
50
|
+
puts "Coordinator can delegate to: #{coordinator_def.delegates_to.join(", ")}"
|
|
51
|
+
puts ""
|
|
52
|
+
|
|
53
|
+
puts "Testing multi-agent delegation..."
|
|
54
|
+
result = swarm.execute("Delegate to calculator: what is 7 + 8? Then delegate to writer: write a haiku about swarms")
|
|
55
|
+
|
|
56
|
+
puts ""
|
|
57
|
+
puts "Response: #{result.content}"
|
|
58
|
+
puts "Success: #{result.success?}"
|
|
59
|
+
puts ""
|
|
60
|
+
puts "✅ Delegation works!"
|