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.
Files changed (153) hide show
  1. checksums.yaml +7 -0
  2. data/.envrc +1 -0
  3. data/.github/workflows/deploy-github-pages.yml +52 -0
  4. data/.github/workflows/deploy-yard-docs.yml +52 -0
  5. data/CHANGELOG.md +55 -0
  6. data/COMMITS.md +196 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +332 -0
  9. data/Rakefile +67 -0
  10. data/docs/api/adapters/anthropic.md +121 -0
  11. data/docs/api/adapters/gemini.md +133 -0
  12. data/docs/api/adapters/index.md +104 -0
  13. data/docs/api/adapters/openai.md +134 -0
  14. data/docs/api/core/index.md +113 -0
  15. data/docs/api/core/memory.md +314 -0
  16. data/docs/api/core/network.md +291 -0
  17. data/docs/api/core/robot.md +273 -0
  18. data/docs/api/core/state.md +273 -0
  19. data/docs/api/core/tool.md +353 -0
  20. data/docs/api/history/active-record-adapter.md +195 -0
  21. data/docs/api/history/config.md +191 -0
  22. data/docs/api/history/index.md +132 -0
  23. data/docs/api/history/thread-manager.md +144 -0
  24. data/docs/api/index.md +82 -0
  25. data/docs/api/mcp/client.md +221 -0
  26. data/docs/api/mcp/index.md +111 -0
  27. data/docs/api/mcp/server.md +225 -0
  28. data/docs/api/mcp/transports.md +264 -0
  29. data/docs/api/messages/index.md +67 -0
  30. data/docs/api/messages/text-message.md +102 -0
  31. data/docs/api/messages/tool-call-message.md +144 -0
  32. data/docs/api/messages/tool-result-message.md +154 -0
  33. data/docs/api/messages/user-message.md +171 -0
  34. data/docs/api/streaming/context.md +174 -0
  35. data/docs/api/streaming/events.md +237 -0
  36. data/docs/api/streaming/index.md +108 -0
  37. data/docs/architecture/core-concepts.md +243 -0
  38. data/docs/architecture/index.md +138 -0
  39. data/docs/architecture/message-flow.md +320 -0
  40. data/docs/architecture/network-orchestration.md +216 -0
  41. data/docs/architecture/robot-execution.md +243 -0
  42. data/docs/architecture/state-management.md +323 -0
  43. data/docs/assets/css/custom.css +56 -0
  44. data/docs/assets/images/robot_lab.jpg +0 -0
  45. data/docs/concepts.md +216 -0
  46. data/docs/examples/basic-chat.md +193 -0
  47. data/docs/examples/index.md +129 -0
  48. data/docs/examples/mcp-server.md +290 -0
  49. data/docs/examples/multi-robot-network.md +312 -0
  50. data/docs/examples/rails-application.md +420 -0
  51. data/docs/examples/tool-usage.md +310 -0
  52. data/docs/getting-started/configuration.md +230 -0
  53. data/docs/getting-started/index.md +56 -0
  54. data/docs/getting-started/installation.md +179 -0
  55. data/docs/getting-started/quick-start.md +203 -0
  56. data/docs/guides/building-robots.md +376 -0
  57. data/docs/guides/creating-networks.md +366 -0
  58. data/docs/guides/history.md +359 -0
  59. data/docs/guides/index.md +68 -0
  60. data/docs/guides/mcp-integration.md +356 -0
  61. data/docs/guides/memory.md +309 -0
  62. data/docs/guides/rails-integration.md +432 -0
  63. data/docs/guides/streaming.md +314 -0
  64. data/docs/guides/using-tools.md +394 -0
  65. data/docs/index.md +160 -0
  66. data/examples/01_simple_robot.rb +38 -0
  67. data/examples/02_tools.rb +106 -0
  68. data/examples/03_network.rb +103 -0
  69. data/examples/04_mcp.rb +219 -0
  70. data/examples/05_streaming.rb +124 -0
  71. data/examples/06_prompt_templates.rb +324 -0
  72. data/examples/07_network_memory.rb +329 -0
  73. data/examples/prompts/assistant/system.txt.erb +2 -0
  74. data/examples/prompts/assistant/user.txt.erb +1 -0
  75. data/examples/prompts/billing/system.txt.erb +7 -0
  76. data/examples/prompts/billing/user.txt.erb +1 -0
  77. data/examples/prompts/classifier/system.txt.erb +4 -0
  78. data/examples/prompts/classifier/user.txt.erb +1 -0
  79. data/examples/prompts/entity_extractor/system.txt.erb +11 -0
  80. data/examples/prompts/entity_extractor/user.txt.erb +3 -0
  81. data/examples/prompts/escalation/system.txt.erb +35 -0
  82. data/examples/prompts/escalation/user.txt.erb +34 -0
  83. data/examples/prompts/general/system.txt.erb +4 -0
  84. data/examples/prompts/general/user.txt.erb +1 -0
  85. data/examples/prompts/github_assistant/system.txt.erb +6 -0
  86. data/examples/prompts/github_assistant/user.txt.erb +1 -0
  87. data/examples/prompts/helper/system.txt.erb +1 -0
  88. data/examples/prompts/helper/user.txt.erb +1 -0
  89. data/examples/prompts/keyword_extractor/system.txt.erb +8 -0
  90. data/examples/prompts/keyword_extractor/user.txt.erb +3 -0
  91. data/examples/prompts/order_support/system.txt.erb +27 -0
  92. data/examples/prompts/order_support/user.txt.erb +22 -0
  93. data/examples/prompts/product_support/system.txt.erb +30 -0
  94. data/examples/prompts/product_support/user.txt.erb +32 -0
  95. data/examples/prompts/sentiment_analyzer/system.txt.erb +9 -0
  96. data/examples/prompts/sentiment_analyzer/user.txt.erb +3 -0
  97. data/examples/prompts/synthesizer/system.txt.erb +14 -0
  98. data/examples/prompts/synthesizer/user.txt.erb +15 -0
  99. data/examples/prompts/technical/system.txt.erb +7 -0
  100. data/examples/prompts/technical/user.txt.erb +1 -0
  101. data/examples/prompts/triage/system.txt.erb +16 -0
  102. data/examples/prompts/triage/user.txt.erb +17 -0
  103. data/lib/generators/robot_lab/install_generator.rb +78 -0
  104. data/lib/generators/robot_lab/robot_generator.rb +55 -0
  105. data/lib/generators/robot_lab/templates/initializer.rb.tt +41 -0
  106. data/lib/generators/robot_lab/templates/migration.rb.tt +32 -0
  107. data/lib/generators/robot_lab/templates/result_model.rb.tt +52 -0
  108. data/lib/generators/robot_lab/templates/robot.rb.tt +46 -0
  109. data/lib/generators/robot_lab/templates/robot_test.rb.tt +32 -0
  110. data/lib/generators/robot_lab/templates/routing_robot.rb.tt +53 -0
  111. data/lib/generators/robot_lab/templates/thread_model.rb.tt +40 -0
  112. data/lib/robot_lab/adapters/anthropic.rb +163 -0
  113. data/lib/robot_lab/adapters/base.rb +85 -0
  114. data/lib/robot_lab/adapters/gemini.rb +193 -0
  115. data/lib/robot_lab/adapters/openai.rb +159 -0
  116. data/lib/robot_lab/adapters/registry.rb +81 -0
  117. data/lib/robot_lab/configuration.rb +143 -0
  118. data/lib/robot_lab/error.rb +32 -0
  119. data/lib/robot_lab/errors.rb +70 -0
  120. data/lib/robot_lab/history/active_record_adapter.rb +146 -0
  121. data/lib/robot_lab/history/config.rb +115 -0
  122. data/lib/robot_lab/history/thread_manager.rb +93 -0
  123. data/lib/robot_lab/mcp/client.rb +210 -0
  124. data/lib/robot_lab/mcp/server.rb +84 -0
  125. data/lib/robot_lab/mcp/transports/base.rb +56 -0
  126. data/lib/robot_lab/mcp/transports/sse.rb +117 -0
  127. data/lib/robot_lab/mcp/transports/stdio.rb +133 -0
  128. data/lib/robot_lab/mcp/transports/streamable_http.rb +139 -0
  129. data/lib/robot_lab/mcp/transports/websocket.rb +108 -0
  130. data/lib/robot_lab/memory.rb +882 -0
  131. data/lib/robot_lab/memory_change.rb +123 -0
  132. data/lib/robot_lab/message.rb +357 -0
  133. data/lib/robot_lab/network.rb +350 -0
  134. data/lib/robot_lab/rails/engine.rb +29 -0
  135. data/lib/robot_lab/rails/railtie.rb +42 -0
  136. data/lib/robot_lab/robot.rb +560 -0
  137. data/lib/robot_lab/robot_result.rb +205 -0
  138. data/lib/robot_lab/robotic_model.rb +324 -0
  139. data/lib/robot_lab/state_proxy.rb +188 -0
  140. data/lib/robot_lab/streaming/context.rb +144 -0
  141. data/lib/robot_lab/streaming/events.rb +95 -0
  142. data/lib/robot_lab/streaming/sequence_counter.rb +48 -0
  143. data/lib/robot_lab/task.rb +117 -0
  144. data/lib/robot_lab/tool.rb +223 -0
  145. data/lib/robot_lab/tool_config.rb +112 -0
  146. data/lib/robot_lab/tool_manifest.rb +234 -0
  147. data/lib/robot_lab/user_message.rb +118 -0
  148. data/lib/robot_lab/version.rb +5 -0
  149. data/lib/robot_lab/waiter.rb +73 -0
  150. data/lib/robot_lab.rb +195 -0
  151. data/mkdocs.yml +214 -0
  152. data/sig/robot_lab.rbs +4 -0
  153. 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>