robot_lab 0.0.1
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 +7 -0
- data/.envrc +1 -0
- data/.github/workflows/deploy-github-pages.yml +52 -0
- data/.github/workflows/deploy-yard-docs.yml +52 -0
- data/CHANGELOG.md +55 -0
- data/COMMITS.md +196 -0
- data/LICENSE.txt +21 -0
- data/README.md +332 -0
- data/Rakefile +67 -0
- data/docs/api/adapters/anthropic.md +121 -0
- data/docs/api/adapters/gemini.md +133 -0
- data/docs/api/adapters/index.md +104 -0
- data/docs/api/adapters/openai.md +134 -0
- data/docs/api/core/index.md +113 -0
- data/docs/api/core/memory.md +314 -0
- data/docs/api/core/network.md +291 -0
- data/docs/api/core/robot.md +273 -0
- data/docs/api/core/state.md +273 -0
- data/docs/api/core/tool.md +353 -0
- data/docs/api/history/active-record-adapter.md +195 -0
- data/docs/api/history/config.md +191 -0
- data/docs/api/history/index.md +132 -0
- data/docs/api/history/thread-manager.md +144 -0
- data/docs/api/index.md +82 -0
- data/docs/api/mcp/client.md +221 -0
- data/docs/api/mcp/index.md +111 -0
- data/docs/api/mcp/server.md +225 -0
- data/docs/api/mcp/transports.md +264 -0
- data/docs/api/messages/index.md +67 -0
- data/docs/api/messages/text-message.md +102 -0
- data/docs/api/messages/tool-call-message.md +144 -0
- data/docs/api/messages/tool-result-message.md +154 -0
- data/docs/api/messages/user-message.md +171 -0
- data/docs/api/streaming/context.md +174 -0
- data/docs/api/streaming/events.md +237 -0
- data/docs/api/streaming/index.md +108 -0
- data/docs/architecture/core-concepts.md +243 -0
- data/docs/architecture/index.md +138 -0
- data/docs/architecture/message-flow.md +320 -0
- data/docs/architecture/network-orchestration.md +216 -0
- data/docs/architecture/robot-execution.md +243 -0
- data/docs/architecture/state-management.md +323 -0
- data/docs/assets/css/custom.css +56 -0
- data/docs/assets/images/robot_lab.jpg +0 -0
- data/docs/concepts.md +216 -0
- data/docs/examples/basic-chat.md +193 -0
- data/docs/examples/index.md +129 -0
- data/docs/examples/mcp-server.md +290 -0
- data/docs/examples/multi-robot-network.md +312 -0
- data/docs/examples/rails-application.md +420 -0
- data/docs/examples/tool-usage.md +310 -0
- data/docs/getting-started/configuration.md +230 -0
- data/docs/getting-started/index.md +56 -0
- data/docs/getting-started/installation.md +179 -0
- data/docs/getting-started/quick-start.md +203 -0
- data/docs/guides/building-robots.md +376 -0
- data/docs/guides/creating-networks.md +366 -0
- data/docs/guides/history.md +359 -0
- data/docs/guides/index.md +68 -0
- data/docs/guides/mcp-integration.md +356 -0
- data/docs/guides/memory.md +309 -0
- data/docs/guides/rails-integration.md +432 -0
- data/docs/guides/streaming.md +314 -0
- data/docs/guides/using-tools.md +394 -0
- data/docs/index.md +160 -0
- data/examples/01_simple_robot.rb +38 -0
- data/examples/02_tools.rb +106 -0
- data/examples/03_network.rb +103 -0
- data/examples/04_mcp.rb +219 -0
- data/examples/05_streaming.rb +124 -0
- data/examples/06_prompt_templates.rb +324 -0
- data/examples/07_network_memory.rb +329 -0
- data/examples/prompts/assistant/system.txt.erb +2 -0
- data/examples/prompts/assistant/user.txt.erb +1 -0
- data/examples/prompts/billing/system.txt.erb +7 -0
- data/examples/prompts/billing/user.txt.erb +1 -0
- data/examples/prompts/classifier/system.txt.erb +4 -0
- data/examples/prompts/classifier/user.txt.erb +1 -0
- data/examples/prompts/entity_extractor/system.txt.erb +11 -0
- data/examples/prompts/entity_extractor/user.txt.erb +3 -0
- data/examples/prompts/escalation/system.txt.erb +35 -0
- data/examples/prompts/escalation/user.txt.erb +34 -0
- data/examples/prompts/general/system.txt.erb +4 -0
- data/examples/prompts/general/user.txt.erb +1 -0
- data/examples/prompts/github_assistant/system.txt.erb +6 -0
- data/examples/prompts/github_assistant/user.txt.erb +1 -0
- data/examples/prompts/helper/system.txt.erb +1 -0
- data/examples/prompts/helper/user.txt.erb +1 -0
- data/examples/prompts/keyword_extractor/system.txt.erb +8 -0
- data/examples/prompts/keyword_extractor/user.txt.erb +3 -0
- data/examples/prompts/order_support/system.txt.erb +27 -0
- data/examples/prompts/order_support/user.txt.erb +22 -0
- data/examples/prompts/product_support/system.txt.erb +30 -0
- data/examples/prompts/product_support/user.txt.erb +32 -0
- data/examples/prompts/sentiment_analyzer/system.txt.erb +9 -0
- data/examples/prompts/sentiment_analyzer/user.txt.erb +3 -0
- data/examples/prompts/synthesizer/system.txt.erb +14 -0
- data/examples/prompts/synthesizer/user.txt.erb +15 -0
- data/examples/prompts/technical/system.txt.erb +7 -0
- data/examples/prompts/technical/user.txt.erb +1 -0
- data/examples/prompts/triage/system.txt.erb +16 -0
- data/examples/prompts/triage/user.txt.erb +17 -0
- data/lib/generators/robot_lab/install_generator.rb +78 -0
- data/lib/generators/robot_lab/robot_generator.rb +55 -0
- data/lib/generators/robot_lab/templates/initializer.rb.tt +41 -0
- data/lib/generators/robot_lab/templates/migration.rb.tt +32 -0
- data/lib/generators/robot_lab/templates/result_model.rb.tt +52 -0
- data/lib/generators/robot_lab/templates/robot.rb.tt +46 -0
- data/lib/generators/robot_lab/templates/robot_test.rb.tt +32 -0
- data/lib/generators/robot_lab/templates/routing_robot.rb.tt +53 -0
- data/lib/generators/robot_lab/templates/thread_model.rb.tt +40 -0
- data/lib/robot_lab/adapters/anthropic.rb +163 -0
- data/lib/robot_lab/adapters/base.rb +85 -0
- data/lib/robot_lab/adapters/gemini.rb +193 -0
- data/lib/robot_lab/adapters/openai.rb +159 -0
- data/lib/robot_lab/adapters/registry.rb +81 -0
- data/lib/robot_lab/configuration.rb +143 -0
- data/lib/robot_lab/error.rb +32 -0
- data/lib/robot_lab/errors.rb +70 -0
- data/lib/robot_lab/history/active_record_adapter.rb +146 -0
- data/lib/robot_lab/history/config.rb +115 -0
- data/lib/robot_lab/history/thread_manager.rb +93 -0
- data/lib/robot_lab/mcp/client.rb +210 -0
- data/lib/robot_lab/mcp/server.rb +84 -0
- data/lib/robot_lab/mcp/transports/base.rb +56 -0
- data/lib/robot_lab/mcp/transports/sse.rb +117 -0
- data/lib/robot_lab/mcp/transports/stdio.rb +133 -0
- data/lib/robot_lab/mcp/transports/streamable_http.rb +139 -0
- data/lib/robot_lab/mcp/transports/websocket.rb +108 -0
- data/lib/robot_lab/memory.rb +882 -0
- data/lib/robot_lab/memory_change.rb +123 -0
- data/lib/robot_lab/message.rb +357 -0
- data/lib/robot_lab/network.rb +350 -0
- data/lib/robot_lab/rails/engine.rb +29 -0
- data/lib/robot_lab/rails/railtie.rb +42 -0
- data/lib/robot_lab/robot.rb +560 -0
- data/lib/robot_lab/robot_result.rb +205 -0
- data/lib/robot_lab/robotic_model.rb +324 -0
- data/lib/robot_lab/state_proxy.rb +188 -0
- data/lib/robot_lab/streaming/context.rb +144 -0
- data/lib/robot_lab/streaming/events.rb +95 -0
- data/lib/robot_lab/streaming/sequence_counter.rb +48 -0
- data/lib/robot_lab/task.rb +117 -0
- data/lib/robot_lab/tool.rb +223 -0
- data/lib/robot_lab/tool_config.rb +112 -0
- data/lib/robot_lab/tool_manifest.rb +234 -0
- data/lib/robot_lab/user_message.rb +118 -0
- data/lib/robot_lab/version.rb +5 -0
- data/lib/robot_lab/waiter.rb +73 -0
- data/lib/robot_lab.rb +195 -0
- data/mkdocs.yml +214 -0
- data/sig/robot_lab.rbs +4 -0
- metadata +442 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Installation
|
|
2
|
+
|
|
3
|
+
This guide covers installing RobotLab in your Ruby project.
|
|
4
|
+
|
|
5
|
+
## Requirements
|
|
6
|
+
|
|
7
|
+
- **Ruby**: 3.1 or higher
|
|
8
|
+
- **Bundler**: 2.0 or higher (recommended)
|
|
9
|
+
|
|
10
|
+
## Install via Bundler
|
|
11
|
+
|
|
12
|
+
Add RobotLab to your `Gemfile`:
|
|
13
|
+
|
|
14
|
+
```ruby
|
|
15
|
+
gem "robot_lab"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Then install:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
bundle install
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Install via RubyGems
|
|
25
|
+
|
|
26
|
+
Or install directly:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
gem install robot_lab
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Dependencies
|
|
33
|
+
|
|
34
|
+
RobotLab automatically installs these dependencies:
|
|
35
|
+
|
|
36
|
+
| Gem | Purpose |
|
|
37
|
+
|-----|---------|
|
|
38
|
+
| `ruby_llm` | LLM provider integrations |
|
|
39
|
+
| `ruby_llm-template` | Template rendering for prompts |
|
|
40
|
+
| `simple_flow` | Workflow execution |
|
|
41
|
+
|
|
42
|
+
### Optional Dependencies
|
|
43
|
+
|
|
44
|
+
For specific features, you may need additional gems:
|
|
45
|
+
|
|
46
|
+
=== "MCP WebSocket Transport"
|
|
47
|
+
|
|
48
|
+
```ruby
|
|
49
|
+
gem "async-websocket"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
=== "MCP HTTP Transport"
|
|
53
|
+
|
|
54
|
+
```ruby
|
|
55
|
+
gem "async-http"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
=== "Rails Integration"
|
|
59
|
+
|
|
60
|
+
```ruby
|
|
61
|
+
# Rails is detected automatically
|
|
62
|
+
gem "rails", ">= 7.0"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Verify Installation
|
|
66
|
+
|
|
67
|
+
Create a test file to verify everything works:
|
|
68
|
+
|
|
69
|
+
```ruby
|
|
70
|
+
# test_robot_lab.rb
|
|
71
|
+
require "robot_lab"
|
|
72
|
+
|
|
73
|
+
puts "RobotLab version: #{RobotLab::VERSION}"
|
|
74
|
+
puts "Installation successful!"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Run it:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
ruby test_robot_lab.rb
|
|
81
|
+
# => RobotLab version: 0.0.1
|
|
82
|
+
# => Installation successful!
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Rails Installation
|
|
86
|
+
|
|
87
|
+
For Rails applications, use the install generator:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
rails generate robot_lab:install
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
This creates:
|
|
94
|
+
|
|
95
|
+
- `config/initializers/robot_lab.rb` - Configuration file
|
|
96
|
+
- `db/migrate/*_create_robot_lab_tables.rb` - Database migrations
|
|
97
|
+
- `app/models/robot_lab_thread.rb` - Thread model
|
|
98
|
+
- `app/models/robot_lab_result.rb` - Result model
|
|
99
|
+
- `app/robots/` - Directory for robot definitions
|
|
100
|
+
- `app/tools/` - Directory for tool definitions
|
|
101
|
+
|
|
102
|
+
Then run migrations:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
rails db:migrate
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Environment Setup
|
|
109
|
+
|
|
110
|
+
Before using RobotLab, set up your API keys as environment variables:
|
|
111
|
+
|
|
112
|
+
=== "Anthropic (Recommended)"
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
export ANTHROPIC_API_KEY="sk-ant-..."
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
=== "OpenAI"
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
export OPENAI_API_KEY="sk-..."
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
=== "Google Gemini"
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
export GEMINI_API_KEY="..."
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
!!! tip "Using dotenv"
|
|
131
|
+
For development, consider using the [dotenv](https://github.com/bkeepers/dotenv) gem to manage environment variables:
|
|
132
|
+
|
|
133
|
+
```ruby
|
|
134
|
+
# Gemfile
|
|
135
|
+
gem "dotenv-rails", groups: [:development, :test]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# .env
|
|
140
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Troubleshooting
|
|
144
|
+
|
|
145
|
+
### Gem Installation Fails
|
|
146
|
+
|
|
147
|
+
If you encounter SSL or network errors:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# Update RubyGems
|
|
151
|
+
gem update --system
|
|
152
|
+
|
|
153
|
+
# Try installing with verbose output
|
|
154
|
+
gem install robot_lab --verbose
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Missing Dependencies
|
|
158
|
+
|
|
159
|
+
If you see "LoadError" for optional gems:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# Install the specific gem mentioned in the error
|
|
163
|
+
bundle add async-websocket
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### API Key Issues
|
|
167
|
+
|
|
168
|
+
If you see authentication errors:
|
|
169
|
+
|
|
170
|
+
1. Verify your API key is set: `echo $ANTHROPIC_API_KEY`
|
|
171
|
+
2. Check the key is valid in your provider's console
|
|
172
|
+
3. Ensure you're using the correct environment variable name
|
|
173
|
+
|
|
174
|
+
## Next Steps
|
|
175
|
+
|
|
176
|
+
Now that RobotLab is installed:
|
|
177
|
+
|
|
178
|
+
- [:octicons-arrow-right-24: Quick Start](quick-start.md) - Build your first robot
|
|
179
|
+
- [:octicons-arrow-right-24: Configuration](configuration.md) - Configure defaults
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# Quick Start
|
|
2
|
+
|
|
3
|
+
Build your first RobotLab application in 5 minutes.
|
|
4
|
+
|
|
5
|
+
## Step 1: Configure RobotLab
|
|
6
|
+
|
|
7
|
+
First, set up your API credentials:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
require "robot_lab"
|
|
11
|
+
|
|
12
|
+
RobotLab.configure do |config|
|
|
13
|
+
config.anthropic_api_key = ENV["ANTHROPIC_API_KEY"]
|
|
14
|
+
config.default_model = "claude-sonnet-4"
|
|
15
|
+
end
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Step 2: Create a Robot
|
|
19
|
+
|
|
20
|
+
Build a simple assistant robot:
|
|
21
|
+
|
|
22
|
+
```ruby
|
|
23
|
+
assistant = RobotLab.build do
|
|
24
|
+
name "assistant"
|
|
25
|
+
description "A helpful AI assistant"
|
|
26
|
+
|
|
27
|
+
template <<~PROMPT
|
|
28
|
+
You are a helpful AI assistant. You provide clear, accurate,
|
|
29
|
+
and concise answers to questions. Be friendly but professional.
|
|
30
|
+
PROMPT
|
|
31
|
+
end
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Step 3: Create a Network
|
|
35
|
+
|
|
36
|
+
Add your robot to a network:
|
|
37
|
+
|
|
38
|
+
```ruby
|
|
39
|
+
network = RobotLab.create_network do
|
|
40
|
+
name "my_first_network"
|
|
41
|
+
add_robot assistant
|
|
42
|
+
end
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Step 4: Run It!
|
|
46
|
+
|
|
47
|
+
Execute the network with a message:
|
|
48
|
+
|
|
49
|
+
```ruby
|
|
50
|
+
# Create state with your message
|
|
51
|
+
state = RobotLab.create_state(message: "What is Ruby on Rails?")
|
|
52
|
+
|
|
53
|
+
# Run the network
|
|
54
|
+
result = network.run(state: state)
|
|
55
|
+
|
|
56
|
+
# Get the response
|
|
57
|
+
response = result.last_result.output.first.content
|
|
58
|
+
puts response
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Complete Example
|
|
62
|
+
|
|
63
|
+
Here's everything together in one file:
|
|
64
|
+
|
|
65
|
+
```ruby title="hello_robot.rb"
|
|
66
|
+
require "robot_lab"
|
|
67
|
+
|
|
68
|
+
# Configure
|
|
69
|
+
RobotLab.configure do |config|
|
|
70
|
+
config.anthropic_api_key = ENV["ANTHROPIC_API_KEY"]
|
|
71
|
+
config.default_model = "claude-sonnet-4"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Build robot
|
|
75
|
+
assistant = RobotLab.build do
|
|
76
|
+
name "assistant"
|
|
77
|
+
description "A helpful AI assistant"
|
|
78
|
+
template "You are a helpful AI assistant."
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Create network
|
|
82
|
+
network = RobotLab.create_network do
|
|
83
|
+
name "hello_network"
|
|
84
|
+
add_robot assistant
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Run
|
|
88
|
+
state = RobotLab.create_state(message: "Hello! What can you help me with?")
|
|
89
|
+
result = network.run(state: state)
|
|
90
|
+
|
|
91
|
+
puts result.last_result.output.first.content
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Run it:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
ruby hello_robot.rb
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Adding a Tool
|
|
101
|
+
|
|
102
|
+
Make your robot more capable with tools:
|
|
103
|
+
|
|
104
|
+
```ruby
|
|
105
|
+
assistant = RobotLab.build do
|
|
106
|
+
name "assistant"
|
|
107
|
+
description "An assistant that can tell time"
|
|
108
|
+
|
|
109
|
+
template <<~PROMPT
|
|
110
|
+
You are a helpful assistant. Use the current_time tool
|
|
111
|
+
when users ask about the time.
|
|
112
|
+
PROMPT
|
|
113
|
+
|
|
114
|
+
tool :current_time do
|
|
115
|
+
description "Get the current date and time"
|
|
116
|
+
handler { Time.now.strftime("%Y-%m-%d %H:%M:%S") }
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Now the robot can respond to "What time is it?" by calling the tool.
|
|
122
|
+
|
|
123
|
+
## Multi-Robot Example
|
|
124
|
+
|
|
125
|
+
Create a network with multiple specialized robots:
|
|
126
|
+
|
|
127
|
+
```ruby
|
|
128
|
+
# Classifier robot
|
|
129
|
+
classifier = RobotLab.build do
|
|
130
|
+
name "classifier"
|
|
131
|
+
description "Classifies incoming requests"
|
|
132
|
+
template <<~PROMPT
|
|
133
|
+
Classify the user's request into one category:
|
|
134
|
+
- QUESTION: General knowledge questions
|
|
135
|
+
- MATH: Mathematical calculations
|
|
136
|
+
- OTHER: Everything else
|
|
137
|
+
|
|
138
|
+
Respond with only the category name.
|
|
139
|
+
PROMPT
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Question answerer
|
|
143
|
+
answerer = RobotLab.build do
|
|
144
|
+
name "answerer"
|
|
145
|
+
description "Answers general questions"
|
|
146
|
+
template "You answer general knowledge questions accurately."
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Calculator
|
|
150
|
+
calculator = RobotLab.build do
|
|
151
|
+
name "calculator"
|
|
152
|
+
description "Handles math problems"
|
|
153
|
+
template "You solve mathematical problems step by step."
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Network with routing
|
|
157
|
+
network = RobotLab.create_network do
|
|
158
|
+
name "smart_assistant"
|
|
159
|
+
add_robot classifier
|
|
160
|
+
add_robot answerer
|
|
161
|
+
add_robot calculator
|
|
162
|
+
|
|
163
|
+
router ->(args) {
|
|
164
|
+
case args.call_count
|
|
165
|
+
when 0
|
|
166
|
+
:classifier
|
|
167
|
+
when 1
|
|
168
|
+
result = args.last_result&.output&.first&.content&.strip
|
|
169
|
+
case result
|
|
170
|
+
when "QUESTION" then :answerer
|
|
171
|
+
when "MATH" then :calculator
|
|
172
|
+
else :answerer
|
|
173
|
+
end
|
|
174
|
+
else
|
|
175
|
+
nil
|
|
176
|
+
end
|
|
177
|
+
}
|
|
178
|
+
end
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## What's Next?
|
|
182
|
+
|
|
183
|
+
You've built your first RobotLab application! Here's where to go next:
|
|
184
|
+
|
|
185
|
+
<div class="grid cards" markdown>
|
|
186
|
+
|
|
187
|
+
- [:octicons-gear-24: **Configuration**](configuration.md)
|
|
188
|
+
|
|
189
|
+
Learn all configuration options
|
|
190
|
+
|
|
191
|
+
- [:octicons-cpu-24: **Building Robots**](../guides/building-robots.md)
|
|
192
|
+
|
|
193
|
+
Deep dive into robot creation
|
|
194
|
+
|
|
195
|
+
- [:octicons-tools-24: **Using Tools**](../guides/using-tools.md)
|
|
196
|
+
|
|
197
|
+
Give robots custom capabilities
|
|
198
|
+
|
|
199
|
+
- [:octicons-git-branch-24: **Creating Networks**](../guides/creating-networks.md)
|
|
200
|
+
|
|
201
|
+
Advanced network patterns
|
|
202
|
+
|
|
203
|
+
</div>
|