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
data/lib/robot_lab.rb ADDED
@@ -0,0 +1,195 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeitwerk"
4
+ require "json"
5
+ require "securerandom"
6
+ require "digest"
7
+
8
+ # Core dependencies
9
+ require "ruby_llm"
10
+ require "async"
11
+
12
+ # Define the module first so Zeitwerk can populate it
13
+ #
14
+ # RobotLab is a Ruby framework for building and orchestrating multi-robot LLM workflows.
15
+ # It provides a modular architecture with adapters for multiple LLM providers (Anthropic,
16
+ # OpenAI, Gemini), MCP (Model Context Protocol) integration, streaming support, and
17
+ # history management.
18
+ #
19
+ # @example Basic usage with a single robot
20
+ # robot = RobotLab.build(name: "assistant", template: "chat.erb")
21
+ # result = robot.run("Hello, world!")
22
+ #
23
+ # @example Creating a network of robots
24
+ # network = RobotLab.create_network(name: "pipeline") do
25
+ # step :analyzer, analyzer, depends_on: :none
26
+ # step :writer, writer, depends_on: [:analyzer]
27
+ # step :reviewer, reviewer, depends_on: [:writer]
28
+ # end
29
+ # result = network.run(message: "Process this document")
30
+ #
31
+ # @example Configuration
32
+ # RobotLab.configure do |config|
33
+ # config.anthropic_api_key = ENV["ANTHROPIC_API_KEY"]
34
+ # config.template_path = "app/templates"
35
+ # end
36
+ #
37
+ module RobotLab
38
+ end
39
+
40
+ loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
41
+ loader.ignore("#{__dir__}/generators")
42
+ loader.ignore("#{__dir__}/robot_lab/rails")
43
+
44
+ # Custom inflections for classes that don't follow Zeitwerk naming conventions
45
+ loader.inflector.inflect(
46
+ "robot_lab" => "RobotLab",
47
+ "robotic_model" => "RoboticModel",
48
+ "mcp" => "MCP",
49
+ "openai" => "OpenAI",
50
+ "sse" => "SSE",
51
+ "streamable_http" => "StreamableHTTP",
52
+ "websocket" => "WebSocket"
53
+ )
54
+
55
+ # Note: adapters/ is NOT collapsed since files define RobotLab::Adapters::* classes
56
+
57
+ loader.setup
58
+
59
+ # Eager load for proper constant resolution
60
+ loader.eager_load
61
+
62
+ module RobotLab
63
+ # Error classes are defined in lib/robot_lab/error.rb
64
+
65
+ class << self
66
+ # @!attribute [w] configuration
67
+ # @return [Configuration] the configuration object
68
+ attr_writer :configuration
69
+
70
+ # Returns the current configuration object.
71
+ #
72
+ # @return [Configuration] the configuration instance
73
+ def configuration
74
+ @configuration ||= Configuration.new
75
+ end
76
+
77
+ # Yields the configuration object for modification.
78
+ #
79
+ # @yield [Configuration] the configuration object
80
+ # @return [void]
81
+ #
82
+ # @example
83
+ # RobotLab.configure do |config|
84
+ # config.anthropic_api_key = "sk-..."
85
+ # end
86
+ def configure
87
+ yield(configuration)
88
+ end
89
+
90
+ # Factory method to create a new Robot instance.
91
+ #
92
+ # @param name [String] the unique identifier for the robot
93
+ # @param template [Symbol, nil] the ERB template for the robot's prompt
94
+ # @param system_prompt [String, nil] inline system prompt (can be used alone or with template)
95
+ # @param context [Hash] variables to pass to the template
96
+ # @param enable_cache [Boolean] whether to enable semantic caching (default: true)
97
+ # @param options [Hash] additional options passed to Robot.new
98
+ # @return [Robot] a new Robot instance
99
+ # @raise [ArgumentError] if neither template nor system_prompt is provided
100
+ #
101
+ # @example Robot with template
102
+ # robot = RobotLab.build(
103
+ # name: "assistant",
104
+ # template: :assistant,
105
+ # context: { tone: "friendly" }
106
+ # )
107
+ #
108
+ # @example Robot with inline system prompt
109
+ # robot = RobotLab.build(
110
+ # name: "helper",
111
+ # system_prompt: "You are a helpful assistant."
112
+ # )
113
+ #
114
+ # @example Robot with both template and system prompt
115
+ # robot = RobotLab.build(
116
+ # name: "support",
117
+ # template: :support_agent,
118
+ # system_prompt: "Today's date is #{Date.today}."
119
+ # )
120
+ #
121
+ # @example Robot with caching disabled
122
+ # robot = RobotLab.build(
123
+ # name: "simple",
124
+ # system_prompt: "You are helpful.",
125
+ # enable_cache: false
126
+ # )
127
+ def build(name:, template: nil, system_prompt: nil, context: {}, enable_cache: true, **options)
128
+ Robot.new(
129
+ name: name,
130
+ template: template,
131
+ system_prompt: system_prompt,
132
+ context: context,
133
+ enable_cache: enable_cache,
134
+ **options
135
+ )
136
+ end
137
+
138
+ # Factory method to create a new Network of robots.
139
+ #
140
+ # @param name [String] the unique identifier for the network
141
+ # @param concurrency [Symbol] concurrency model (:auto, :threads, :async)
142
+ # @yield Block for defining pipeline steps
143
+ # @return [Network] a new Network instance
144
+ #
145
+ # @example Sequential pipeline
146
+ # network = RobotLab.create_network(name: "pipeline") do
147
+ # step :first, robot1, depends_on: :none
148
+ # step :second, robot2, depends_on: [:first]
149
+ # end
150
+ #
151
+ # @example With optional routing
152
+ # network = RobotLab.create_network(name: "support") do
153
+ # step :classifier, classifier, depends_on: :none
154
+ # step :billing, billing_robot, depends_on: :optional
155
+ # step :technical, technical_robot, depends_on: :optional
156
+ # end
157
+ #
158
+ # @example Parallel execution
159
+ # network = RobotLab.create_network(name: "analysis") do
160
+ # step :fetch, fetcher, depends_on: :none
161
+ # step :sentiment, sentiment_bot, depends_on: [:fetch]
162
+ # step :entities, entity_bot, depends_on: [:fetch]
163
+ # step :merge, merger, depends_on: [:sentiment, :entities]
164
+ # end
165
+ def create_network(name:, concurrency: :auto, &block)
166
+ Network.new(name: name, concurrency: concurrency, &block)
167
+ end
168
+
169
+ # Factory method to create a new Memory object.
170
+ #
171
+ # @param data [Hash] initial runtime data
172
+ # @param enable_cache [Boolean] whether to enable semantic caching (default: true)
173
+ # @param options [Hash] additional options passed to Memory.new
174
+ # @return [Memory] a new Memory instance
175
+ #
176
+ # @example Basic memory
177
+ # memory = RobotLab.create_memory(data: { user_id: 123 })
178
+ #
179
+ # @example Memory with custom values
180
+ # memory = RobotLab.create_memory(data: { category: nil })
181
+ # memory[:session_id] = "abc123"
182
+ #
183
+ # @example Memory with caching disabled
184
+ # memory = RobotLab.create_memory(data: {}, enable_cache: false)
185
+ def create_memory(data: {}, enable_cache: true, **options)
186
+ Memory.new(data: data, enable_cache: enable_cache, **options)
187
+ end
188
+ end
189
+ end
190
+
191
+ # Load Rails integration if Rails is defined
192
+ if defined?(Rails::Engine)
193
+ require "robot_lab/rails/engine"
194
+ require "robot_lab/rails/railtie"
195
+ end
data/mkdocs.yml ADDED
@@ -0,0 +1,214 @@
1
+ # MkDocs Configuration for RobotLab Documentation
2
+ site_name: RobotLab
3
+ site_description: Multi-robot LLM workflow orchestration for Ruby
4
+ site_author: Dewayne VanHoozer
5
+ site_url: https://madbomber.github.io/robot_lab
6
+ copyright: Copyright &copy; 2025 Dewayne VanHoozer
7
+
8
+ # Repository information
9
+ repo_name: madbomber/robot_lab
10
+ repo_url: https://github.com/madbomber/robot_lab
11
+ edit_uri: edit/main/docs/
12
+
13
+ # Configuration
14
+ theme:
15
+ name: material
16
+
17
+ # Color scheme
18
+ palette:
19
+ - scheme: default
20
+ primary: deep purple
21
+ accent: amber
22
+ toggle:
23
+ icon: material/brightness-7
24
+ name: Switch to dark mode
25
+
26
+ - scheme: slate
27
+ primary: deep purple
28
+ accent: amber
29
+ toggle:
30
+ icon: material/brightness-4
31
+ name: Switch to light mode
32
+
33
+ # Typography
34
+ font:
35
+ text: Roboto
36
+ code: Roboto Mono
37
+
38
+ # Logo and icon
39
+ icon:
40
+ repo: fontawesome/brands/github
41
+ logo: material/robot
42
+
43
+ # Theme features
44
+ features:
45
+ - navigation.instant
46
+ - navigation.tracking
47
+ - navigation.tabs
48
+ - navigation.tabs.sticky
49
+ - navigation.path
50
+ - navigation.indexes
51
+ - navigation.top
52
+ - navigation.footer
53
+ - toc.follow
54
+ - search.suggest
55
+ - search.highlight
56
+ - search.share
57
+ - header.autohide
58
+ - content.code.copy
59
+ - content.code.annotate
60
+ - content.tabs.link
61
+ - content.tooltips
62
+ - content.action.edit
63
+ - content.action.view
64
+
65
+ # Plugins
66
+ plugins:
67
+ - search:
68
+ separator: '[\s\-,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])'
69
+ - tags
70
+
71
+ # Extensions
72
+ markdown_extensions:
73
+ - abbr
74
+ - admonition
75
+ - attr_list
76
+ - def_list
77
+ - footnotes
78
+ - md_in_html
79
+ - tables
80
+ - toc:
81
+ permalink: true
82
+ title: On this page
83
+
84
+ - pymdownx.arithmatex:
85
+ generic: true
86
+ - pymdownx.betterem:
87
+ smart_enable: all
88
+ - pymdownx.caret
89
+ - pymdownx.critic
90
+ - pymdownx.details
91
+ - pymdownx.emoji:
92
+ emoji_generator: !!python/name:material.extensions.emoji.to_svg
93
+ emoji_index: !!python/name:material.extensions.emoji.twemoji
94
+ - pymdownx.highlight:
95
+ anchor_linenums: true
96
+ line_spans: __span
97
+ pygments_lang_class: true
98
+ - pymdownx.inlinehilite
99
+ - pymdownx.keys
100
+ - pymdownx.magiclink:
101
+ repo_url_shorthand: true
102
+ user: madbomber
103
+ repo: robot_lab
104
+ normalize_issue_symbols: true
105
+ - pymdownx.mark
106
+ - pymdownx.smartsymbols
107
+ - pymdownx.snippets:
108
+ check_paths: true
109
+ - pymdownx.superfences:
110
+ custom_fences:
111
+ - name: mermaid
112
+ class: mermaid
113
+ format: !!python/name:pymdownx.superfences.fence_code_format
114
+ - pymdownx.tabbed:
115
+ alternate_style: true
116
+ - pymdownx.tasklist:
117
+ custom_checkbox: true
118
+ - pymdownx.tilde
119
+
120
+ # Extra CSS
121
+ extra_css:
122
+ - assets/css/custom.css
123
+
124
+ # Social media and extra configuration
125
+ extra:
126
+ social:
127
+ - icon: fontawesome/brands/github
128
+ link: https://github.com/madbomber/robot_lab
129
+ name: RobotLab on GitHub
130
+ - icon: fontawesome/solid/gem
131
+ link: https://rubygems.org/gems/robot_lab
132
+ name: RobotLab on RubyGems
133
+
134
+ analytics:
135
+ feedback:
136
+ title: Was this page helpful?
137
+ ratings:
138
+ - icon: material/emoticon-happy-outline
139
+ name: This page was helpful
140
+ data: 1
141
+ note: Thanks for your feedback!
142
+ - icon: material/emoticon-sad-outline
143
+ name: This page could be improved
144
+ data: 0
145
+ note: Thanks for your feedback! Help us improve by creating an issue.
146
+
147
+ # Navigation
148
+ nav:
149
+ - Home:
150
+ - Overview: index.md
151
+ - Concepts: concepts.md
152
+ - Getting Started:
153
+ - getting-started/index.md
154
+ - Installation: getting-started/installation.md
155
+ - Quick Start: getting-started/quick-start.md
156
+ - Configuration: getting-started/configuration.md
157
+ - Architecture:
158
+ - architecture/index.md
159
+ - Core Concepts: architecture/core-concepts.md
160
+ - Robot Execution: architecture/robot-execution.md
161
+ - Network Orchestration: architecture/network-orchestration.md
162
+ - State Management: architecture/state-management.md
163
+ - Message Flow: architecture/message-flow.md
164
+ - Guides:
165
+ - guides/index.md
166
+ - Building Robots: guides/building-robots.md
167
+ - Creating Networks: guides/creating-networks.md
168
+ - Using Tools: guides/using-tools.md
169
+ - MCP Integration: guides/mcp-integration.md
170
+ - Streaming Responses: guides/streaming.md
171
+ - Conversation History: guides/history.md
172
+ - Memory System: guides/memory.md
173
+ - Rails Integration: guides/rails-integration.md
174
+ - API Reference:
175
+ - api/index.md
176
+ - Core Classes:
177
+ - api/core/index.md
178
+ - Robot: api/core/robot.md
179
+ - Network: api/core/network.md
180
+ - State: api/core/state.md
181
+ - Tool: api/core/tool.md
182
+ - Memory: api/core/memory.md
183
+ - Messages:
184
+ - api/messages/index.md
185
+ - UserMessage: api/messages/user-message.md
186
+ - TextMessage: api/messages/text-message.md
187
+ - ToolCallMessage: api/messages/tool-call-message.md
188
+ - ToolResultMessage: api/messages/tool-result-message.md
189
+ - Adapters:
190
+ - api/adapters/index.md
191
+ - Anthropic: api/adapters/anthropic.md
192
+ - OpenAI: api/adapters/openai.md
193
+ - Gemini: api/adapters/gemini.md
194
+ - MCP:
195
+ - api/mcp/index.md
196
+ - Client: api/mcp/client.md
197
+ - Server: api/mcp/server.md
198
+ - Transports: api/mcp/transports.md
199
+ - Streaming:
200
+ - api/streaming/index.md
201
+ - Context: api/streaming/context.md
202
+ - Events: api/streaming/events.md
203
+ - History:
204
+ - api/history/index.md
205
+ - Config: api/history/config.md
206
+ - ThreadManager: api/history/thread-manager.md
207
+ - ActiveRecordAdapter: api/history/active-record-adapter.md
208
+ - Examples:
209
+ - examples/index.md
210
+ - Basic Chat: examples/basic-chat.md
211
+ - Multi-Robot Network: examples/multi-robot-network.md
212
+ - Tool Usage: examples/tool-usage.md
213
+ - MCP Server: examples/mcp-server.md
214
+ - Rails Application: examples/rails-application.md
data/sig/robot_lab.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module RobotLab
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end