robot_lab 0.1.0 → 0.2.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 (242) hide show
  1. checksums.yaml +4 -4
  2. data/.architecture/AGENTS.md +32 -0
  3. data/.architecture/config.yml +8 -0
  4. data/.architecture/members.yml +60 -0
  5. data/.architecture/reviews/feature-free-will.md +490 -0
  6. data/.architecture/reviews/overall-codebase.md +427 -0
  7. data/.claude/settings.local.json +57 -0
  8. data/.codex/config.toml +2 -0
  9. data/.irbrc +2 -2
  10. data/.rubocop.yml +172 -0
  11. data/CHANGELOG.md +72 -0
  12. data/CLAUDE.md +139 -0
  13. data/README.md +91 -95
  14. data/Rakefile +109 -3
  15. data/agent2agent_review.md +192 -0
  16. data/agentf_improvements.md +253 -0
  17. data/agents.md +14 -0
  18. data/docs/examples/index.md +37 -2
  19. data/docs/getting-started/configuration.md +20 -7
  20. data/docs/guides/index.md +16 -16
  21. data/docs/guides/knowledge.md +7 -1
  22. data/docs/guides/observability.md +132 -0
  23. data/docs/index.md +30 -3
  24. data/docs/superpowers/plans/2026-05-06-agentskills.md +1303 -0
  25. data/docs/superpowers/specs/2026-05-06-agentskills-design.md +247 -0
  26. data/examples/.envrc +1 -0
  27. data/examples/01_simple_robot.rb +5 -9
  28. data/examples/02_tools.rb +5 -9
  29. data/examples/03_network.rb +8 -9
  30. data/examples/04_mcp.rb +21 -29
  31. data/examples/05_streaming.rb +12 -18
  32. data/examples/06_prompt_templates.rb +11 -19
  33. data/examples/07_network_memory.rb +16 -31
  34. data/examples/08_llm_config.rb +10 -22
  35. data/examples/09_chaining.rb +16 -27
  36. data/examples/10_memory.rb +12 -28
  37. data/examples/11_network_introspection.rb +15 -29
  38. data/examples/12_message_bus.rb +5 -12
  39. data/examples/13_spawn.rb +5 -10
  40. data/examples/14_rusty_circuit/.envrc +1 -0
  41. data/examples/14_rusty_circuit/comic.rb +2 -0
  42. data/examples/14_rusty_circuit/heckler.rb +1 -1
  43. data/examples/14_rusty_circuit/open_mic.rb +1 -3
  44. data/examples/14_rusty_circuit/scout.rb +2 -0
  45. data/examples/15_memory_network_and_bus/.envrc +1 -0
  46. data/examples/15_memory_network_and_bus/editorial_pipeline.rb +6 -3
  47. data/examples/15_memory_network_and_bus/linux_writer.rb +1 -1
  48. data/examples/15_memory_network_and_bus/output/combined_article.md +6 -6
  49. data/examples/15_memory_network_and_bus/output/final_article.md +6 -8
  50. data/examples/15_memory_network_and_bus/output/linux_draft.md +4 -2
  51. data/examples/15_memory_network_and_bus/output/mac_draft.md +3 -3
  52. data/examples/15_memory_network_and_bus/output/memory.json +6 -6
  53. data/examples/15_memory_network_and_bus/output/revision_1.md +10 -11
  54. data/examples/15_memory_network_and_bus/output/revision_2.md +6 -8
  55. data/examples/15_memory_network_and_bus/output/windows_draft.md +3 -3
  56. data/examples/16_writers_room/.envrc +1 -0
  57. data/examples/16_writers_room/writers_room.rb +2 -4
  58. data/examples/17_skills.rb +8 -17
  59. data/examples/18_rails/Gemfile +1 -0
  60. data/examples/19_token_tracking.rb +9 -15
  61. data/examples/20_circuit_breaker.rb +10 -19
  62. data/examples/21_learning_loop.rb +11 -20
  63. data/examples/22_context_compression.rb +6 -13
  64. data/examples/23_convergence.rb +6 -17
  65. data/examples/24_structured_delegation.rb +11 -15
  66. data/examples/25_history_search.rb +5 -12
  67. data/examples/26_document_store.rb +6 -13
  68. data/examples/27_incident_response/incident_response.rb +4 -5
  69. data/examples/28_mcp_discovery.rb +8 -11
  70. data/examples/29_ractor_tools.rb +4 -9
  71. data/examples/30_ractor_network.rb +10 -19
  72. data/examples/31_launch_assessment.rb +10 -23
  73. data/examples/32_newsletter_reader.rb +188 -0
  74. data/examples/33_stock_generator.rb +80 -0
  75. data/examples/33_stock_predictor.rb +306 -0
  76. data/examples/34_agentskills.rb +72 -0
  77. data/examples/README.md +1 -1
  78. data/examples/common.rb +76 -0
  79. data/examples/ruboruby.md +423 -0
  80. data/examples/temp.md +51 -0
  81. data/lib/robot_lab/agent_skill.rb +63 -0
  82. data/lib/robot_lab/agent_skill_catalog.rb +74 -0
  83. data/lib/robot_lab/ask_user.rb +2 -2
  84. data/lib/robot_lab/bus_poller.rb +12 -5
  85. data/lib/robot_lab/config.rb +1 -12
  86. data/lib/robot_lab/delegation_future.rb +1 -1
  87. data/lib/robot_lab/doom_loop_detector.rb +98 -0
  88. data/lib/robot_lab/history_compressor.rb +4 -10
  89. data/lib/robot_lab/mcp/client.rb +1 -2
  90. data/lib/robot_lab/mcp/connection_poller.rb +3 -3
  91. data/lib/robot_lab/mcp/server.rb +1 -1
  92. data/lib/robot_lab/mcp/server_discovery.rb +0 -2
  93. data/lib/robot_lab/memory.rb +32 -27
  94. data/lib/robot_lab/memory_change.rb +2 -2
  95. data/lib/robot_lab/message.rb +4 -4
  96. data/lib/robot_lab/network.rb +11 -6
  97. data/lib/robot_lab/robot/agent_skill_matching.rb +99 -0
  98. data/lib/robot_lab/robot/bus_messaging.rb +9 -27
  99. data/lib/robot_lab/robot/history_search.rb +4 -1
  100. data/lib/robot_lab/robot/mcp_management.rb +5 -11
  101. data/lib/robot_lab/robot/template_rendering.rb +60 -40
  102. data/lib/robot_lab/robot.rb +323 -206
  103. data/lib/robot_lab/robot_result.rb +6 -5
  104. data/lib/robot_lab/run_config.rb +5 -11
  105. data/lib/robot_lab/script_tool.rb +76 -0
  106. data/lib/robot_lab/state_proxy.rb +7 -5
  107. data/lib/robot_lab/tool.rb +3 -3
  108. data/lib/robot_lab/tool_config.rb +1 -1
  109. data/lib/robot_lab/tool_manifest.rb +5 -7
  110. data/lib/robot_lab/user_message.rb +2 -2
  111. data/lib/robot_lab/version.rb +1 -1
  112. data/lib/robot_lab/waiter.rb +1 -1
  113. data/lib/robot_lab.rb +41 -52
  114. data/logfile +8 -0
  115. data/mkdocs.yml +2 -3
  116. data/robot_concurrency.md +38 -0
  117. data/simple_acp_review.md +298 -0
  118. data/site/404.html +2300 -0
  119. data/site/api/core/index.html +2706 -0
  120. data/site/api/core/memory/index.html +3793 -0
  121. data/site/api/core/network/index.html +3500 -0
  122. data/site/api/core/robot/index.html +4566 -0
  123. data/site/api/core/state/index.html +3390 -0
  124. data/site/api/core/tool/index.html +3843 -0
  125. data/site/api/index.html +2635 -0
  126. data/site/api/mcp/client/index.html +3435 -0
  127. data/site/api/mcp/index.html +2783 -0
  128. data/site/api/mcp/server/index.html +3252 -0
  129. data/site/api/mcp/transports/index.html +3352 -0
  130. data/site/api/messages/index.html +2641 -0
  131. data/site/api/messages/text-message/index.html +3087 -0
  132. data/site/api/messages/tool-call-message/index.html +3159 -0
  133. data/site/api/messages/tool-result-message/index.html +3252 -0
  134. data/site/api/messages/user-message/index.html +3212 -0
  135. data/site/api/streaming/context/index.html +3282 -0
  136. data/site/api/streaming/events/index.html +3347 -0
  137. data/site/api/streaming/index.html +2738 -0
  138. data/site/architecture/core-concepts/index.html +3757 -0
  139. data/site/architecture/index.html +2797 -0
  140. data/site/architecture/message-flow/index.html +3238 -0
  141. data/site/architecture/network-orchestration/index.html +3433 -0
  142. data/site/architecture/robot-execution/index.html +3140 -0
  143. data/site/architecture/state-management/index.html +3498 -0
  144. data/site/assets/css/custom.css +56 -0
  145. data/site/assets/images/favicon.png +0 -0
  146. data/site/assets/images/robot_lab.jpg +0 -0
  147. data/site/assets/javascripts/bundle.79ae519e.min.js +16 -0
  148. data/site/assets/javascripts/bundle.79ae519e.min.js.map +7 -0
  149. data/site/assets/javascripts/lunr/min/lunr.ar.min.js +1 -0
  150. data/site/assets/javascripts/lunr/min/lunr.da.min.js +18 -0
  151. data/site/assets/javascripts/lunr/min/lunr.de.min.js +18 -0
  152. data/site/assets/javascripts/lunr/min/lunr.du.min.js +18 -0
  153. data/site/assets/javascripts/lunr/min/lunr.el.min.js +1 -0
  154. data/site/assets/javascripts/lunr/min/lunr.es.min.js +18 -0
  155. data/site/assets/javascripts/lunr/min/lunr.fi.min.js +18 -0
  156. data/site/assets/javascripts/lunr/min/lunr.fr.min.js +18 -0
  157. data/site/assets/javascripts/lunr/min/lunr.he.min.js +1 -0
  158. data/site/assets/javascripts/lunr/min/lunr.hi.min.js +1 -0
  159. data/site/assets/javascripts/lunr/min/lunr.hu.min.js +18 -0
  160. data/site/assets/javascripts/lunr/min/lunr.hy.min.js +1 -0
  161. data/site/assets/javascripts/lunr/min/lunr.it.min.js +18 -0
  162. data/site/assets/javascripts/lunr/min/lunr.ja.min.js +1 -0
  163. data/site/assets/javascripts/lunr/min/lunr.jp.min.js +1 -0
  164. data/site/assets/javascripts/lunr/min/lunr.kn.min.js +1 -0
  165. data/site/assets/javascripts/lunr/min/lunr.ko.min.js +1 -0
  166. data/site/assets/javascripts/lunr/min/lunr.multi.min.js +1 -0
  167. data/site/assets/javascripts/lunr/min/lunr.nl.min.js +18 -0
  168. data/site/assets/javascripts/lunr/min/lunr.no.min.js +18 -0
  169. data/site/assets/javascripts/lunr/min/lunr.pt.min.js +18 -0
  170. data/site/assets/javascripts/lunr/min/lunr.ro.min.js +18 -0
  171. data/site/assets/javascripts/lunr/min/lunr.ru.min.js +18 -0
  172. data/site/assets/javascripts/lunr/min/lunr.sa.min.js +1 -0
  173. data/site/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +1 -0
  174. data/site/assets/javascripts/lunr/min/lunr.sv.min.js +18 -0
  175. data/site/assets/javascripts/lunr/min/lunr.ta.min.js +1 -0
  176. data/site/assets/javascripts/lunr/min/lunr.te.min.js +1 -0
  177. data/site/assets/javascripts/lunr/min/lunr.th.min.js +1 -0
  178. data/site/assets/javascripts/lunr/min/lunr.tr.min.js +18 -0
  179. data/site/assets/javascripts/lunr/min/lunr.vi.min.js +1 -0
  180. data/site/assets/javascripts/lunr/min/lunr.zh.min.js +1 -0
  181. data/site/assets/javascripts/lunr/tinyseg.js +206 -0
  182. data/site/assets/javascripts/lunr/wordcut.js +6708 -0
  183. data/site/assets/javascripts/workers/search.2c215733.min.js +42 -0
  184. data/site/assets/javascripts/workers/search.2c215733.min.js.map +7 -0
  185. data/site/assets/stylesheets/main.484c7ddc.min.css +1 -0
  186. data/site/assets/stylesheets/main.484c7ddc.min.css.map +1 -0
  187. data/site/assets/stylesheets/palette.ab4e12ef.min.css +1 -0
  188. data/site/assets/stylesheets/palette.ab4e12ef.min.css.map +1 -0
  189. data/site/concepts/index.html +3455 -0
  190. data/site/examples/basic-chat/index.html +2880 -0
  191. data/site/examples/index.html +2907 -0
  192. data/site/examples/mcp-server/index.html +3018 -0
  193. data/site/examples/multi-robot-network/index.html +3131 -0
  194. data/site/examples/rails-application/index.html +3329 -0
  195. data/site/examples/tool-usage/index.html +3085 -0
  196. data/site/getting-started/configuration/index.html +3745 -0
  197. data/site/getting-started/index.html +2572 -0
  198. data/site/getting-started/installation/index.html +2981 -0
  199. data/site/getting-started/quick-start/index.html +2942 -0
  200. data/site/guides/building-robots/index.html +4290 -0
  201. data/site/guides/creating-networks/index.html +3858 -0
  202. data/site/guides/index.html +2586 -0
  203. data/site/guides/mcp-integration/index.html +3581 -0
  204. data/site/guides/memory/index.html +3586 -0
  205. data/site/guides/rails-integration/index.html +4019 -0
  206. data/site/guides/streaming/index.html +3157 -0
  207. data/site/guides/using-tools/index.html +3802 -0
  208. data/site/index.html +2671 -0
  209. data/site/search/search_index.json +1 -0
  210. data/site/sitemap.xml +183 -0
  211. data/site/sitemap.xml.gz +0 -0
  212. data/site/tags.json +1 -0
  213. data/temp.md +6 -0
  214. data/tool_manifest_plan.md +155 -0
  215. metadata +154 -92
  216. data/docs/examples/rails-application.md +0 -419
  217. data/docs/guides/ractor-parallelism.md +0 -364
  218. data/docs/guides/rails-integration.md +0 -681
  219. data/docs/superpowers/plans/2026-04-14-ractor-integration.md +0 -1538
  220. data/docs/superpowers/specs/2026-04-14-ractor-integration-design.md +0 -258
  221. data/lib/generators/robot_lab/install_generator.rb +0 -90
  222. data/lib/generators/robot_lab/job_generator.rb +0 -40
  223. data/lib/generators/robot_lab/robot_generator.rb +0 -55
  224. data/lib/generators/robot_lab/templates/initializer.rb.tt +0 -42
  225. data/lib/generators/robot_lab/templates/job.rb.tt +0 -21
  226. data/lib/generators/robot_lab/templates/migration.rb.tt +0 -32
  227. data/lib/generators/robot_lab/templates/result_model.rb.tt +0 -52
  228. data/lib/generators/robot_lab/templates/robot.rb.tt +0 -31
  229. data/lib/generators/robot_lab/templates/robot_job.rb.tt +0 -18
  230. data/lib/generators/robot_lab/templates/robot_test.rb.tt +0 -34
  231. data/lib/generators/robot_lab/templates/routing_robot.rb.tt +0 -59
  232. data/lib/generators/robot_lab/templates/thread_model.rb.tt +0 -40
  233. data/lib/robot_lab/document_store.rb +0 -155
  234. data/lib/robot_lab/ractor_boundary.rb +0 -42
  235. data/lib/robot_lab/ractor_job.rb +0 -37
  236. data/lib/robot_lab/ractor_memory_proxy.rb +0 -85
  237. data/lib/robot_lab/ractor_network_scheduler.rb +0 -154
  238. data/lib/robot_lab/ractor_worker_pool.rb +0 -117
  239. data/lib/robot_lab/rails_integration/engine.rb +0 -29
  240. data/lib/robot_lab/rails_integration/job.rb +0 -158
  241. data/lib/robot_lab/rails_integration/railtie.rb +0 -51
  242. data/lib/robot_lab/rails_integration/turbo_stream_callbacks.rb +0 -72
@@ -0,0 +1,4566 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Multi-robot LLM workflow orchestration for Ruby">
10
+
11
+
12
+ <meta name="author" content="Dewayne VanHoozer">
13
+
14
+
15
+ <link rel="canonical" href="https://madbomber.github.io/robot_lab/api/core/robot/">
16
+
17
+
18
+ <link rel="prev" href="../">
19
+
20
+
21
+ <link rel="next" href="../network/">
22
+
23
+
24
+
25
+
26
+
27
+ <link rel="icon" href="../../../assets/images/favicon.png">
28
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.1">
29
+
30
+
31
+
32
+ <title>Robot - RobotLab</title>
33
+
34
+
35
+
36
+ <link rel="stylesheet" href="../../../assets/stylesheets/main.484c7ddc.min.css">
37
+
38
+
39
+ <link rel="stylesheet" href="../../../assets/stylesheets/palette.ab4e12ef.min.css">
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
53
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
54
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
+
56
+
57
+
58
+ <link rel="stylesheet" href="../../../assets/css/custom.css">
59
+
60
+ <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ </head>
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="deep-purple" data-md-color-accent="amber">
79
+
80
+
81
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
82
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
83
+ <label class="md-overlay" for="__drawer"></label>
84
+ <div data-md-component="skip">
85
+
86
+
87
+ <a href="#robot" class="md-skip">
88
+ Skip to content
89
+ </a>
90
+
91
+ </div>
92
+ <div data-md-component="announce">
93
+
94
+ </div>
95
+
96
+
97
+
98
+
99
+
100
+
101
+ <header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
102
+ <nav class="md-header__inner md-grid" aria-label="Header">
103
+ <a href="../../.." title="RobotLab" class="md-header__button md-logo" aria-label="RobotLab" data-md-component="logo">
104
+
105
+
106
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A2.5 2.5 0 0 0 5 15.5 2.5 2.5 0 0 0 7.5 18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 7.5 13m9 0a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-2.5-2.5"/></svg>
107
+
108
+ </a>
109
+ <label class="md-header__button md-icon" for="__drawer">
110
+
111
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
112
+ </label>
113
+ <div class="md-header__title" data-md-component="header-title">
114
+ <div class="md-header__ellipsis">
115
+ <div class="md-header__topic">
116
+ <span class="md-ellipsis">
117
+ RobotLab
118
+ </span>
119
+ </div>
120
+ <div class="md-header__topic" data-md-component="header-topic">
121
+ <span class="md-ellipsis">
122
+
123
+ Robot
124
+
125
+ </span>
126
+ </div>
127
+ </div>
128
+ </div>
129
+
130
+
131
+ <form class="md-header__option" data-md-component="palette">
132
+
133
+
134
+
135
+
136
+ <input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
137
+
138
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
139
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
140
+ </label>
141
+
142
+
143
+
144
+
145
+
146
+ <input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
147
+
148
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
149
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
150
+ </label>
151
+
152
+
153
+ </form>
154
+
155
+
156
+
157
+ <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
158
+
159
+
160
+
161
+
162
+
163
+ <label class="md-header__button md-icon" for="__search">
164
+
165
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
166
+ </label>
167
+ <div class="md-search" data-md-component="search" role="dialog">
168
+ <label class="md-search__overlay" for="__search"></label>
169
+ <div class="md-search__inner" role="search">
170
+ <form class="md-search__form" name="search">
171
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
172
+ <label class="md-search__icon md-icon" for="__search">
173
+
174
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
175
+
176
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
177
+ </label>
178
+ <nav class="md-search__options" aria-label="Search">
179
+
180
+ <a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
181
+
182
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
183
+ </a>
184
+
185
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
186
+
187
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
188
+ </button>
189
+ </nav>
190
+
191
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
192
+
193
+ </form>
194
+ <div class="md-search__output">
195
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
196
+ <div class="md-search-result" data-md-component="search-result">
197
+ <div class="md-search-result__meta">
198
+ Initializing search
199
+ </div>
200
+ <ol class="md-search-result__list" role="presentation"></ol>
201
+ </div>
202
+ </div>
203
+ </div>
204
+ </div>
205
+ </div>
206
+
207
+
208
+
209
+ <div class="md-header__source">
210
+ <a href="https://github.com/madbomber/robot_lab" title="Go to repository" class="md-source" data-md-component="source">
211
+ <div class="md-source__icon md-icon">
212
+
213
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
214
+ </div>
215
+ <div class="md-source__repository">
216
+ madbomber/robot_lab
217
+ </div>
218
+ </a>
219
+ </div>
220
+
221
+ </nav>
222
+
223
+
224
+
225
+ <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
226
+ <div class="md-grid">
227
+ <ul class="md-tabs__list">
228
+
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
+ <li class="md-tabs__item">
237
+ <a href="../../.." class="md-tabs__link">
238
+
239
+
240
+
241
+
242
+
243
+ Home
244
+
245
+ </a>
246
+ </li>
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+ <li class="md-tabs__item">
259
+ <a href="../../../getting-started/" class="md-tabs__link">
260
+
261
+
262
+
263
+
264
+
265
+ Getting Started
266
+
267
+ </a>
268
+ </li>
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+
280
+ <li class="md-tabs__item">
281
+ <a href="../../../architecture/" class="md-tabs__link">
282
+
283
+
284
+
285
+
286
+
287
+ Architecture
288
+
289
+ </a>
290
+ </li>
291
+
292
+
293
+
294
+
295
+
296
+
297
+
298
+
299
+
300
+
301
+
302
+ <li class="md-tabs__item">
303
+ <a href="../../../guides/" class="md-tabs__link">
304
+
305
+
306
+
307
+
308
+
309
+ Guides
310
+
311
+ </a>
312
+ </li>
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+
326
+ <li class="md-tabs__item md-tabs__item--active">
327
+ <a href="../../" class="md-tabs__link">
328
+
329
+
330
+
331
+
332
+
333
+ API Reference
334
+
335
+ </a>
336
+ </li>
337
+
338
+
339
+
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+
348
+ <li class="md-tabs__item">
349
+ <a href="../../../examples/" class="md-tabs__link">
350
+
351
+
352
+
353
+
354
+
355
+ Examples
356
+
357
+ </a>
358
+ </li>
359
+
360
+
361
+
362
+
363
+ </ul>
364
+ </div>
365
+ </nav>
366
+
367
+
368
+ </header>
369
+
370
+ <div class="md-container" data-md-component="container">
371
+
372
+
373
+
374
+
375
+ <main class="md-main" data-md-component="main">
376
+ <div class="md-main__inner md-grid">
377
+
378
+
379
+
380
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
381
+ <div class="md-sidebar__scrollwrap">
382
+ <div class="md-sidebar__inner">
383
+
384
+
385
+
386
+
387
+
388
+
389
+ <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
390
+ <label class="md-nav__title" for="__drawer">
391
+ <a href="../../.." title="RobotLab" class="md-nav__button md-logo" aria-label="RobotLab" data-md-component="logo">
392
+
393
+
394
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A2.5 2.5 0 0 0 5 15.5 2.5 2.5 0 0 0 7.5 18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 7.5 13m9 0a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-2.5-2.5"/></svg>
395
+
396
+ </a>
397
+ RobotLab
398
+ </label>
399
+
400
+ <div class="md-nav__source">
401
+ <a href="https://github.com/madbomber/robot_lab" title="Go to repository" class="md-source" data-md-component="source">
402
+ <div class="md-source__icon md-icon">
403
+
404
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
405
+ </div>
406
+ <div class="md-source__repository">
407
+ madbomber/robot_lab
408
+ </div>
409
+ </a>
410
+ </div>
411
+
412
+ <ul class="md-nav__list" data-md-scrollfix>
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+
433
+
434
+
435
+
436
+ <li class="md-nav__item md-nav__item--nested">
437
+
438
+
439
+
440
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_1" >
441
+
442
+
443
+ <div class="md-nav__link md-nav__container">
444
+ <a href="../../.." class="md-nav__link ">
445
+
446
+
447
+
448
+ <span class="md-ellipsis">
449
+
450
+
451
+ Home
452
+
453
+
454
+
455
+ </span>
456
+
457
+
458
+
459
+ </a>
460
+
461
+
462
+ <label class="md-nav__link " for="__nav_1" id="__nav_1_label" tabindex="0">
463
+ <span class="md-nav__icon md-icon"></span>
464
+ </label>
465
+
466
+ </div>
467
+
468
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="false">
469
+ <label class="md-nav__title" for="__nav_1">
470
+ <span class="md-nav__icon md-icon"></span>
471
+
472
+
473
+ Home
474
+
475
+
476
+ </label>
477
+ <ul class="md-nav__list" data-md-scrollfix>
478
+
479
+
480
+
481
+
482
+
483
+
484
+
485
+
486
+
487
+ <li class="md-nav__item">
488
+ <a href="../../../concepts/" class="md-nav__link">
489
+
490
+
491
+
492
+ <span class="md-ellipsis">
493
+
494
+
495
+ Concepts
496
+
497
+
498
+
499
+ </span>
500
+
501
+
502
+
503
+ </a>
504
+ </li>
505
+
506
+
507
+
508
+
509
+ </ul>
510
+ </nav>
511
+
512
+ </li>
513
+
514
+
515
+
516
+
517
+
518
+
519
+
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+
536
+
537
+
538
+
539
+
540
+
541
+
542
+ <li class="md-nav__item md-nav__item--nested">
543
+
544
+
545
+
546
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
547
+
548
+
549
+ <div class="md-nav__link md-nav__container">
550
+ <a href="../../../getting-started/" class="md-nav__link ">
551
+
552
+
553
+
554
+ <span class="md-ellipsis">
555
+
556
+
557
+ Getting Started
558
+
559
+
560
+
561
+ </span>
562
+
563
+
564
+
565
+ </a>
566
+
567
+
568
+ <label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="0">
569
+ <span class="md-nav__icon md-icon"></span>
570
+ </label>
571
+
572
+ </div>
573
+
574
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
575
+ <label class="md-nav__title" for="__nav_2">
576
+ <span class="md-nav__icon md-icon"></span>
577
+
578
+
579
+ Getting Started
580
+
581
+
582
+ </label>
583
+ <ul class="md-nav__list" data-md-scrollfix>
584
+
585
+
586
+
587
+
588
+
589
+
590
+
591
+
592
+
593
+ <li class="md-nav__item">
594
+ <a href="../../../getting-started/installation/" class="md-nav__link">
595
+
596
+
597
+
598
+ <span class="md-ellipsis">
599
+
600
+
601
+ Installation
602
+
603
+
604
+
605
+ </span>
606
+
607
+
608
+
609
+ </a>
610
+ </li>
611
+
612
+
613
+
614
+
615
+
616
+
617
+
618
+
619
+
620
+
621
+ <li class="md-nav__item">
622
+ <a href="../../../getting-started/quick-start/" class="md-nav__link">
623
+
624
+
625
+
626
+ <span class="md-ellipsis">
627
+
628
+
629
+ Quick Start
630
+
631
+
632
+
633
+ </span>
634
+
635
+
636
+
637
+ </a>
638
+ </li>
639
+
640
+
641
+
642
+
643
+
644
+
645
+
646
+
647
+
648
+
649
+ <li class="md-nav__item">
650
+ <a href="../../../getting-started/configuration/" class="md-nav__link">
651
+
652
+
653
+
654
+ <span class="md-ellipsis">
655
+
656
+
657
+ Configuration
658
+
659
+
660
+
661
+ </span>
662
+
663
+
664
+
665
+ </a>
666
+ </li>
667
+
668
+
669
+
670
+
671
+ </ul>
672
+ </nav>
673
+
674
+ </li>
675
+
676
+
677
+
678
+
679
+
680
+
681
+
682
+
683
+
684
+
685
+
686
+
687
+
688
+
689
+
690
+
691
+
692
+
693
+
694
+
695
+
696
+
697
+
698
+
699
+
700
+
701
+
702
+
703
+
704
+
705
+
706
+
707
+
708
+ <li class="md-nav__item md-nav__item--nested">
709
+
710
+
711
+
712
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
713
+
714
+
715
+ <div class="md-nav__link md-nav__container">
716
+ <a href="../../../architecture/" class="md-nav__link ">
717
+
718
+
719
+
720
+ <span class="md-ellipsis">
721
+
722
+
723
+ Architecture
724
+
725
+
726
+
727
+ </span>
728
+
729
+
730
+
731
+ </a>
732
+
733
+
734
+ <label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="0">
735
+ <span class="md-nav__icon md-icon"></span>
736
+ </label>
737
+
738
+ </div>
739
+
740
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
741
+ <label class="md-nav__title" for="__nav_3">
742
+ <span class="md-nav__icon md-icon"></span>
743
+
744
+
745
+ Architecture
746
+
747
+
748
+ </label>
749
+ <ul class="md-nav__list" data-md-scrollfix>
750
+
751
+
752
+
753
+
754
+
755
+
756
+
757
+
758
+
759
+ <li class="md-nav__item">
760
+ <a href="../../../architecture/core-concepts/" class="md-nav__link">
761
+
762
+
763
+
764
+ <span class="md-ellipsis">
765
+
766
+
767
+ Core Concepts
768
+
769
+
770
+
771
+ </span>
772
+
773
+
774
+
775
+ </a>
776
+ </li>
777
+
778
+
779
+
780
+
781
+
782
+
783
+
784
+
785
+
786
+
787
+ <li class="md-nav__item">
788
+ <a href="../../../architecture/robot-execution/" class="md-nav__link">
789
+
790
+
791
+
792
+ <span class="md-ellipsis">
793
+
794
+
795
+ Robot Execution
796
+
797
+
798
+
799
+ </span>
800
+
801
+
802
+
803
+ </a>
804
+ </li>
805
+
806
+
807
+
808
+
809
+
810
+
811
+
812
+
813
+
814
+
815
+ <li class="md-nav__item">
816
+ <a href="../../../architecture/network-orchestration/" class="md-nav__link">
817
+
818
+
819
+
820
+ <span class="md-ellipsis">
821
+
822
+
823
+ Network Orchestration
824
+
825
+
826
+
827
+ </span>
828
+
829
+
830
+
831
+ </a>
832
+ </li>
833
+
834
+
835
+
836
+
837
+
838
+
839
+
840
+
841
+
842
+
843
+ <li class="md-nav__item">
844
+ <a href="../../../architecture/state-management/" class="md-nav__link">
845
+
846
+
847
+
848
+ <span class="md-ellipsis">
849
+
850
+
851
+ State Management
852
+
853
+
854
+
855
+ </span>
856
+
857
+
858
+
859
+ </a>
860
+ </li>
861
+
862
+
863
+
864
+
865
+
866
+
867
+
868
+
869
+
870
+
871
+ <li class="md-nav__item">
872
+ <a href="../../../architecture/message-flow/" class="md-nav__link">
873
+
874
+
875
+
876
+ <span class="md-ellipsis">
877
+
878
+
879
+ Message Flow
880
+
881
+
882
+
883
+ </span>
884
+
885
+
886
+
887
+ </a>
888
+ </li>
889
+
890
+
891
+
892
+
893
+ </ul>
894
+ </nav>
895
+
896
+ </li>
897
+
898
+
899
+
900
+
901
+
902
+
903
+
904
+
905
+
906
+
907
+
908
+
909
+
910
+
911
+
912
+
913
+
914
+
915
+
916
+
917
+
918
+
919
+
920
+
921
+
922
+
923
+
924
+
925
+
926
+
927
+
928
+
929
+
930
+
931
+
932
+
933
+
934
+ <li class="md-nav__item md-nav__item--nested">
935
+
936
+
937
+
938
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
939
+
940
+
941
+ <div class="md-nav__link md-nav__container">
942
+ <a href="../../../guides/" class="md-nav__link ">
943
+
944
+
945
+
946
+ <span class="md-ellipsis">
947
+
948
+
949
+ Guides
950
+
951
+
952
+
953
+ </span>
954
+
955
+
956
+
957
+ </a>
958
+
959
+
960
+ <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
961
+ <span class="md-nav__icon md-icon"></span>
962
+ </label>
963
+
964
+ </div>
965
+
966
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
967
+ <label class="md-nav__title" for="__nav_4">
968
+ <span class="md-nav__icon md-icon"></span>
969
+
970
+
971
+ Guides
972
+
973
+
974
+ </label>
975
+ <ul class="md-nav__list" data-md-scrollfix>
976
+
977
+
978
+
979
+
980
+
981
+
982
+
983
+
984
+
985
+ <li class="md-nav__item">
986
+ <a href="../../../guides/building-robots/" class="md-nav__link">
987
+
988
+
989
+
990
+ <span class="md-ellipsis">
991
+
992
+
993
+ Building Robots
994
+
995
+
996
+
997
+ </span>
998
+
999
+
1000
+
1001
+ </a>
1002
+ </li>
1003
+
1004
+
1005
+
1006
+
1007
+
1008
+
1009
+
1010
+
1011
+
1012
+
1013
+ <li class="md-nav__item">
1014
+ <a href="../../../guides/creating-networks/" class="md-nav__link">
1015
+
1016
+
1017
+
1018
+ <span class="md-ellipsis">
1019
+
1020
+
1021
+ Creating Networks
1022
+
1023
+
1024
+
1025
+ </span>
1026
+
1027
+
1028
+
1029
+ </a>
1030
+ </li>
1031
+
1032
+
1033
+
1034
+
1035
+
1036
+
1037
+
1038
+
1039
+
1040
+
1041
+ <li class="md-nav__item">
1042
+ <a href="../../../guides/using-tools/" class="md-nav__link">
1043
+
1044
+
1045
+
1046
+ <span class="md-ellipsis">
1047
+
1048
+
1049
+ Using Tools
1050
+
1051
+
1052
+
1053
+ </span>
1054
+
1055
+
1056
+
1057
+ </a>
1058
+ </li>
1059
+
1060
+
1061
+
1062
+
1063
+
1064
+
1065
+
1066
+
1067
+
1068
+
1069
+ <li class="md-nav__item">
1070
+ <a href="../../../guides/mcp-integration/" class="md-nav__link">
1071
+
1072
+
1073
+
1074
+ <span class="md-ellipsis">
1075
+
1076
+
1077
+ MCP Integration
1078
+
1079
+
1080
+
1081
+ </span>
1082
+
1083
+
1084
+
1085
+ </a>
1086
+ </li>
1087
+
1088
+
1089
+
1090
+
1091
+
1092
+
1093
+
1094
+
1095
+
1096
+
1097
+ <li class="md-nav__item">
1098
+ <a href="../../../guides/streaming/" class="md-nav__link">
1099
+
1100
+
1101
+
1102
+ <span class="md-ellipsis">
1103
+
1104
+
1105
+ Streaming Responses
1106
+
1107
+
1108
+
1109
+ </span>
1110
+
1111
+
1112
+
1113
+ </a>
1114
+ </li>
1115
+
1116
+
1117
+
1118
+
1119
+
1120
+
1121
+
1122
+
1123
+
1124
+
1125
+ <li class="md-nav__item">
1126
+ <a href="../../../guides/memory/" class="md-nav__link">
1127
+
1128
+
1129
+
1130
+ <span class="md-ellipsis">
1131
+
1132
+
1133
+ Memory System
1134
+
1135
+
1136
+
1137
+ </span>
1138
+
1139
+
1140
+
1141
+ </a>
1142
+ </li>
1143
+
1144
+
1145
+
1146
+
1147
+
1148
+
1149
+
1150
+
1151
+
1152
+
1153
+ <li class="md-nav__item">
1154
+ <a href="../../../guides/rails-integration/" class="md-nav__link">
1155
+
1156
+
1157
+
1158
+ <span class="md-ellipsis">
1159
+
1160
+
1161
+ Rails Integration
1162
+
1163
+
1164
+
1165
+ </span>
1166
+
1167
+
1168
+
1169
+ </a>
1170
+ </li>
1171
+
1172
+
1173
+
1174
+
1175
+ </ul>
1176
+ </nav>
1177
+
1178
+ </li>
1179
+
1180
+
1181
+
1182
+
1183
+
1184
+
1185
+
1186
+
1187
+
1188
+
1189
+
1190
+
1191
+
1192
+
1193
+
1194
+
1195
+
1196
+
1197
+
1198
+
1199
+
1200
+
1201
+
1202
+
1203
+
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+
1211
+
1212
+
1213
+
1214
+
1215
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
1216
+
1217
+
1218
+
1219
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
1220
+
1221
+
1222
+ <div class="md-nav__link md-nav__container">
1223
+ <a href="../../" class="md-nav__link ">
1224
+
1225
+
1226
+
1227
+ <span class="md-ellipsis">
1228
+
1229
+
1230
+ API Reference
1231
+
1232
+
1233
+
1234
+ </span>
1235
+
1236
+
1237
+
1238
+ </a>
1239
+
1240
+
1241
+ <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
1242
+ <span class="md-nav__icon md-icon"></span>
1243
+ </label>
1244
+
1245
+ </div>
1246
+
1247
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
1248
+ <label class="md-nav__title" for="__nav_5">
1249
+ <span class="md-nav__icon md-icon"></span>
1250
+
1251
+
1252
+ API Reference
1253
+
1254
+
1255
+ </label>
1256
+ <ul class="md-nav__list" data-md-scrollfix>
1257
+
1258
+
1259
+
1260
+
1261
+
1262
+
1263
+
1264
+
1265
+
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+
1273
+
1274
+
1275
+
1276
+
1277
+
1278
+
1279
+
1280
+
1281
+
1282
+
1283
+
1284
+
1285
+
1286
+
1287
+
1288
+
1289
+
1290
+
1291
+
1292
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
1293
+
1294
+
1295
+
1296
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" checked>
1297
+
1298
+
1299
+ <div class="md-nav__link md-nav__container">
1300
+ <a href="../" class="md-nav__link ">
1301
+
1302
+
1303
+
1304
+ <span class="md-ellipsis">
1305
+
1306
+
1307
+ Core Classes
1308
+
1309
+
1310
+
1311
+ </span>
1312
+
1313
+
1314
+
1315
+ </a>
1316
+
1317
+
1318
+ <label class="md-nav__link " for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
1319
+ <span class="md-nav__icon md-icon"></span>
1320
+ </label>
1321
+
1322
+ </div>
1323
+
1324
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="true">
1325
+ <label class="md-nav__title" for="__nav_5_2">
1326
+ <span class="md-nav__icon md-icon"></span>
1327
+
1328
+
1329
+ Core Classes
1330
+
1331
+
1332
+ </label>
1333
+ <ul class="md-nav__list" data-md-scrollfix>
1334
+
1335
+
1336
+
1337
+
1338
+
1339
+
1340
+
1341
+
1342
+
1343
+
1344
+
1345
+ <li class="md-nav__item md-nav__item--active">
1346
+
1347
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
1348
+
1349
+
1350
+
1351
+
1352
+
1353
+ <label class="md-nav__link md-nav__link--active" for="__toc">
1354
+
1355
+
1356
+
1357
+ <span class="md-ellipsis">
1358
+
1359
+
1360
+ Robot
1361
+
1362
+
1363
+
1364
+ </span>
1365
+
1366
+
1367
+
1368
+ <span class="md-nav__icon md-icon"></span>
1369
+ </label>
1370
+
1371
+ <a href="./" class="md-nav__link md-nav__link--active">
1372
+
1373
+
1374
+
1375
+ <span class="md-ellipsis">
1376
+
1377
+
1378
+ Robot
1379
+
1380
+
1381
+
1382
+ </span>
1383
+
1384
+
1385
+
1386
+ </a>
1387
+
1388
+
1389
+
1390
+
1391
+
1392
+ <nav class="md-nav md-nav--secondary" aria-label="On this page">
1393
+
1394
+
1395
+
1396
+
1397
+
1398
+
1399
+ <label class="md-nav__title" for="__toc">
1400
+ <span class="md-nav__icon md-icon"></span>
1401
+ On this page
1402
+ </label>
1403
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1404
+
1405
+ <li class="md-nav__item">
1406
+ <a href="#class-hierarchy" class="md-nav__link">
1407
+ <span class="md-ellipsis">
1408
+
1409
+ Class Hierarchy
1410
+
1411
+ </span>
1412
+ </a>
1413
+
1414
+ </li>
1415
+
1416
+ <li class="md-nav__item">
1417
+ <a href="#constructor" class="md-nav__link">
1418
+ <span class="md-ellipsis">
1419
+
1420
+ Constructor
1421
+
1422
+ </span>
1423
+ </a>
1424
+
1425
+ <nav class="md-nav" aria-label="Constructor">
1426
+ <ul class="md-nav__list">
1427
+
1428
+ <li class="md-nav__item">
1429
+ <a href="#parameters" class="md-nav__link">
1430
+ <span class="md-ellipsis">
1431
+
1432
+ Parameters
1433
+
1434
+ </span>
1435
+ </a>
1436
+
1437
+ </li>
1438
+
1439
+ </ul>
1440
+ </nav>
1441
+
1442
+ </li>
1443
+
1444
+ <li class="md-nav__item">
1445
+ <a href="#factory-method" class="md-nav__link">
1446
+ <span class="md-ellipsis">
1447
+
1448
+ Factory Method
1449
+
1450
+ </span>
1451
+ </a>
1452
+
1453
+ </li>
1454
+
1455
+ <li class="md-nav__item">
1456
+ <a href="#attributes-read-only" class="md-nav__link">
1457
+ <span class="md-ellipsis">
1458
+
1459
+ Attributes (Read-Only)
1460
+
1461
+ </span>
1462
+ </a>
1463
+
1464
+ </li>
1465
+
1466
+ <li class="md-nav__item">
1467
+ <a href="#attributes-read-write" class="md-nav__link">
1468
+ <span class="md-ellipsis">
1469
+
1470
+ Attributes (Read-Write)
1471
+
1472
+ </span>
1473
+ </a>
1474
+
1475
+ </li>
1476
+
1477
+ <li class="md-nav__item">
1478
+ <a href="#methods" class="md-nav__link">
1479
+ <span class="md-ellipsis">
1480
+
1481
+ Methods
1482
+
1483
+ </span>
1484
+ </a>
1485
+
1486
+ <nav class="md-nav" aria-label="Methods">
1487
+ <ul class="md-nav__list">
1488
+
1489
+ <li class="md-nav__item">
1490
+ <a href="#run" class="md-nav__link">
1491
+ <span class="md-ellipsis">
1492
+
1493
+ run
1494
+
1495
+ </span>
1496
+ </a>
1497
+
1498
+ </li>
1499
+
1500
+ <li class="md-nav__item">
1501
+ <a href="#model" class="md-nav__link">
1502
+ <span class="md-ellipsis">
1503
+
1504
+ model
1505
+
1506
+ </span>
1507
+ </a>
1508
+
1509
+ </li>
1510
+
1511
+ <li class="md-nav__item">
1512
+ <a href="#update" class="md-nav__link">
1513
+ <span class="md-ellipsis">
1514
+
1515
+ update
1516
+
1517
+ </span>
1518
+ </a>
1519
+
1520
+ </li>
1521
+
1522
+ <li class="md-nav__item">
1523
+ <a href="#with_-methods-chaining" class="md-nav__link">
1524
+ <span class="md-ellipsis">
1525
+
1526
+ with_* Methods (Chaining)
1527
+
1528
+ </span>
1529
+ </a>
1530
+
1531
+ </li>
1532
+
1533
+ <li class="md-nav__item">
1534
+ <a href="#with_template" class="md-nav__link">
1535
+ <span class="md-ellipsis">
1536
+
1537
+ with_template
1538
+
1539
+ </span>
1540
+ </a>
1541
+
1542
+ </li>
1543
+
1544
+ <li class="md-nav__item">
1545
+ <a href="#call" class="md-nav__link">
1546
+ <span class="md-ellipsis">
1547
+
1548
+ call
1549
+
1550
+ </span>
1551
+ </a>
1552
+
1553
+ </li>
1554
+
1555
+ <li class="md-nav__item">
1556
+ <a href="#reset_memory" class="md-nav__link">
1557
+ <span class="md-ellipsis">
1558
+
1559
+ reset_memory
1560
+
1561
+ </span>
1562
+ </a>
1563
+
1564
+ </li>
1565
+
1566
+ <li class="md-nav__item">
1567
+ <a href="#send_message" class="md-nav__link">
1568
+ <span class="md-ellipsis">
1569
+
1570
+ send_message
1571
+
1572
+ </span>
1573
+ </a>
1574
+
1575
+ </li>
1576
+
1577
+ <li class="md-nav__item">
1578
+ <a href="#send_reply" class="md-nav__link">
1579
+ <span class="md-ellipsis">
1580
+
1581
+ send_reply
1582
+
1583
+ </span>
1584
+ </a>
1585
+
1586
+ </li>
1587
+
1588
+ <li class="md-nav__item">
1589
+ <a href="#on_message" class="md-nav__link">
1590
+ <span class="md-ellipsis">
1591
+
1592
+ on_message
1593
+
1594
+ </span>
1595
+ </a>
1596
+
1597
+ </li>
1598
+
1599
+ <li class="md-nav__item">
1600
+ <a href="#spawn" class="md-nav__link">
1601
+ <span class="md-ellipsis">
1602
+
1603
+ spawn
1604
+
1605
+ </span>
1606
+ </a>
1607
+
1608
+ </li>
1609
+
1610
+ <li class="md-nav__item">
1611
+ <a href="#with_bus" class="md-nav__link">
1612
+ <span class="md-ellipsis">
1613
+
1614
+ with_bus
1615
+
1616
+ </span>
1617
+ </a>
1618
+
1619
+ </li>
1620
+
1621
+ <li class="md-nav__item">
1622
+ <a href="#disconnect" class="md-nav__link">
1623
+ <span class="md-ellipsis">
1624
+
1625
+ disconnect
1626
+
1627
+ </span>
1628
+ </a>
1629
+
1630
+ </li>
1631
+
1632
+ <li class="md-nav__item">
1633
+ <a href="#to_h" class="md-nav__link">
1634
+ <span class="md-ellipsis">
1635
+
1636
+ to_h
1637
+
1638
+ </span>
1639
+ </a>
1640
+
1641
+ </li>
1642
+
1643
+ </ul>
1644
+ </nav>
1645
+
1646
+ </li>
1647
+
1648
+ <li class="md-nav__item">
1649
+ <a href="#memory-behavior" class="md-nav__link">
1650
+ <span class="md-ellipsis">
1651
+
1652
+ Memory Behavior
1653
+
1654
+ </span>
1655
+ </a>
1656
+
1657
+ </li>
1658
+
1659
+ <li class="md-nav__item">
1660
+ <a href="#templates" class="md-nav__link">
1661
+ <span class="md-ellipsis">
1662
+
1663
+ Templates
1664
+
1665
+ </span>
1666
+ </a>
1667
+
1668
+ </li>
1669
+
1670
+ <li class="md-nav__item">
1671
+ <a href="#skills" class="md-nav__link">
1672
+ <span class="md-ellipsis">
1673
+
1674
+ Skills
1675
+
1676
+ </span>
1677
+ </a>
1678
+
1679
+ </li>
1680
+
1681
+ <li class="md-nav__item">
1682
+ <a href="#runconfig" class="md-nav__link">
1683
+ <span class="md-ellipsis">
1684
+
1685
+ RunConfig
1686
+
1687
+ </span>
1688
+ </a>
1689
+
1690
+ </li>
1691
+
1692
+ <li class="md-nav__item">
1693
+ <a href="#streaming" class="md-nav__link">
1694
+ <span class="md-ellipsis">
1695
+
1696
+ Streaming
1697
+
1698
+ </span>
1699
+ </a>
1700
+
1701
+ <nav class="md-nav" aria-label="Streaming">
1702
+ <ul class="md-nav__list">
1703
+
1704
+ <li class="md-nav__item">
1705
+ <a href="#the-chunk-object" class="md-nav__link">
1706
+ <span class="md-ellipsis">
1707
+
1708
+ The Chunk Object
1709
+
1710
+ </span>
1711
+ </a>
1712
+
1713
+ </li>
1714
+
1715
+ <li class="md-nav__item">
1716
+ <a href="#stored-callback-on_content" class="md-nav__link">
1717
+ <span class="md-ellipsis">
1718
+
1719
+ Stored Callback (on_content:)
1720
+
1721
+ </span>
1722
+ </a>
1723
+
1724
+ </li>
1725
+
1726
+ <li class="md-nav__item">
1727
+ <a href="#per-call-block" class="md-nav__link">
1728
+ <span class="md-ellipsis">
1729
+
1730
+ Per-Call Block
1731
+
1732
+ </span>
1733
+ </a>
1734
+
1735
+ </li>
1736
+
1737
+ <li class="md-nav__item">
1738
+ <a href="#both-together" class="md-nav__link">
1739
+ <span class="md-ellipsis">
1740
+
1741
+ Both Together
1742
+
1743
+ </span>
1744
+ </a>
1745
+
1746
+ </li>
1747
+
1748
+ </ul>
1749
+ </nav>
1750
+
1751
+ </li>
1752
+
1753
+ <li class="md-nav__item">
1754
+ <a href="#configuration-hierarchy" class="md-nav__link">
1755
+ <span class="md-ellipsis">
1756
+
1757
+ Configuration Hierarchy
1758
+
1759
+ </span>
1760
+ </a>
1761
+
1762
+ </li>
1763
+
1764
+ <li class="md-nav__item">
1765
+ <a href="#examples" class="md-nav__link">
1766
+ <span class="md-ellipsis">
1767
+
1768
+ Examples
1769
+
1770
+ </span>
1771
+ </a>
1772
+
1773
+ <nav class="md-nav" aria-label="Examples">
1774
+ <ul class="md-nav__list">
1775
+
1776
+ <li class="md-nav__item">
1777
+ <a href="#basic-robot" class="md-nav__link">
1778
+ <span class="md-ellipsis">
1779
+
1780
+ Basic Robot
1781
+
1782
+ </span>
1783
+ </a>
1784
+
1785
+ </li>
1786
+
1787
+ <li class="md-nav__item">
1788
+ <a href="#robot-with-template" class="md-nav__link">
1789
+ <span class="md-ellipsis">
1790
+
1791
+ Robot with Template
1792
+
1793
+ </span>
1794
+ </a>
1795
+
1796
+ </li>
1797
+
1798
+ <li class="md-nav__item">
1799
+ <a href="#robot-with-tools" class="md-nav__link">
1800
+ <span class="md-ellipsis">
1801
+
1802
+ Robot with Tools
1803
+
1804
+ </span>
1805
+ </a>
1806
+
1807
+ </li>
1808
+
1809
+ <li class="md-nav__item">
1810
+ <a href="#robot-with-mcp" class="md-nav__link">
1811
+ <span class="md-ellipsis">
1812
+
1813
+ Robot with MCP
1814
+
1815
+ </span>
1816
+ </a>
1817
+
1818
+ </li>
1819
+
1820
+ <li class="md-nav__item">
1821
+ <a href="#robot-with-skills" class="md-nav__link">
1822
+ <span class="md-ellipsis">
1823
+
1824
+ Robot with Skills
1825
+
1826
+ </span>
1827
+ </a>
1828
+
1829
+ </li>
1830
+
1831
+ <li class="md-nav__item">
1832
+ <a href="#bare-robot-with-chaining" class="md-nav__link">
1833
+ <span class="md-ellipsis">
1834
+
1835
+ Bare Robot with Chaining
1836
+
1837
+ </span>
1838
+ </a>
1839
+
1840
+ </li>
1841
+
1842
+ <li class="md-nav__item">
1843
+ <a href="#robot-with-message-bus" class="md-nav__link">
1844
+ <span class="md-ellipsis">
1845
+
1846
+ Robot with Message Bus
1847
+
1848
+ </span>
1849
+ </a>
1850
+
1851
+ </li>
1852
+
1853
+ <li class="md-nav__item">
1854
+ <a href="#spawning-robots-dynamically" class="md-nav__link">
1855
+ <span class="md-ellipsis">
1856
+
1857
+ Spawning Robots Dynamically
1858
+
1859
+ </span>
1860
+ </a>
1861
+
1862
+ </li>
1863
+
1864
+ <li class="md-nav__item">
1865
+ <a href="#connecting-to-a-bus-after-creation" class="md-nav__link">
1866
+ <span class="md-ellipsis">
1867
+
1868
+ Connecting to a Bus After Creation
1869
+
1870
+ </span>
1871
+ </a>
1872
+
1873
+ </li>
1874
+
1875
+ </ul>
1876
+ </nav>
1877
+
1878
+ </li>
1879
+
1880
+ <li class="md-nav__item">
1881
+ <a href="#see-also" class="md-nav__link">
1882
+ <span class="md-ellipsis">
1883
+
1884
+ See Also
1885
+
1886
+ </span>
1887
+ </a>
1888
+
1889
+ </li>
1890
+
1891
+ </ul>
1892
+
1893
+ </nav>
1894
+
1895
+ </li>
1896
+
1897
+
1898
+
1899
+
1900
+
1901
+
1902
+
1903
+
1904
+
1905
+
1906
+ <li class="md-nav__item">
1907
+ <a href="../network/" class="md-nav__link">
1908
+
1909
+
1910
+
1911
+ <span class="md-ellipsis">
1912
+
1913
+
1914
+ Network
1915
+
1916
+
1917
+
1918
+ </span>
1919
+
1920
+
1921
+
1922
+ </a>
1923
+ </li>
1924
+
1925
+
1926
+
1927
+
1928
+
1929
+
1930
+
1931
+
1932
+
1933
+
1934
+ <li class="md-nav__item">
1935
+ <a href="../state/" class="md-nav__link">
1936
+
1937
+
1938
+
1939
+ <span class="md-ellipsis">
1940
+
1941
+
1942
+ State
1943
+
1944
+
1945
+
1946
+ </span>
1947
+
1948
+
1949
+
1950
+ </a>
1951
+ </li>
1952
+
1953
+
1954
+
1955
+
1956
+
1957
+
1958
+
1959
+
1960
+
1961
+
1962
+ <li class="md-nav__item">
1963
+ <a href="../tool/" class="md-nav__link">
1964
+
1965
+
1966
+
1967
+ <span class="md-ellipsis">
1968
+
1969
+
1970
+ Tool
1971
+
1972
+
1973
+
1974
+ </span>
1975
+
1976
+
1977
+
1978
+ </a>
1979
+ </li>
1980
+
1981
+
1982
+
1983
+
1984
+
1985
+
1986
+
1987
+
1988
+
1989
+
1990
+ <li class="md-nav__item">
1991
+ <a href="../memory/" class="md-nav__link">
1992
+
1993
+
1994
+
1995
+ <span class="md-ellipsis">
1996
+
1997
+
1998
+ Memory
1999
+
2000
+
2001
+
2002
+ </span>
2003
+
2004
+
2005
+
2006
+ </a>
2007
+ </li>
2008
+
2009
+
2010
+
2011
+
2012
+ </ul>
2013
+ </nav>
2014
+
2015
+ </li>
2016
+
2017
+
2018
+
2019
+
2020
+
2021
+
2022
+
2023
+
2024
+
2025
+
2026
+
2027
+
2028
+
2029
+
2030
+
2031
+
2032
+
2033
+
2034
+
2035
+
2036
+
2037
+
2038
+
2039
+
2040
+
2041
+
2042
+
2043
+
2044
+
2045
+
2046
+
2047
+
2048
+ <li class="md-nav__item md-nav__item--nested">
2049
+
2050
+
2051
+
2052
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_3" >
2053
+
2054
+
2055
+ <div class="md-nav__link md-nav__container">
2056
+ <a href="../../messages/" class="md-nav__link ">
2057
+
2058
+
2059
+
2060
+ <span class="md-ellipsis">
2061
+
2062
+
2063
+ Messages
2064
+
2065
+
2066
+
2067
+ </span>
2068
+
2069
+
2070
+
2071
+ </a>
2072
+
2073
+
2074
+ <label class="md-nav__link " for="__nav_5_3" id="__nav_5_3_label" tabindex="0">
2075
+ <span class="md-nav__icon md-icon"></span>
2076
+ </label>
2077
+
2078
+ </div>
2079
+
2080
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_3_label" aria-expanded="false">
2081
+ <label class="md-nav__title" for="__nav_5_3">
2082
+ <span class="md-nav__icon md-icon"></span>
2083
+
2084
+
2085
+ Messages
2086
+
2087
+
2088
+ </label>
2089
+ <ul class="md-nav__list" data-md-scrollfix>
2090
+
2091
+
2092
+
2093
+
2094
+
2095
+
2096
+
2097
+
2098
+
2099
+ <li class="md-nav__item">
2100
+ <a href="../../messages/user-message/" class="md-nav__link">
2101
+
2102
+
2103
+
2104
+ <span class="md-ellipsis">
2105
+
2106
+
2107
+ UserMessage
2108
+
2109
+
2110
+
2111
+ </span>
2112
+
2113
+
2114
+
2115
+ </a>
2116
+ </li>
2117
+
2118
+
2119
+
2120
+
2121
+
2122
+
2123
+
2124
+
2125
+
2126
+
2127
+ <li class="md-nav__item">
2128
+ <a href="../../messages/text-message/" class="md-nav__link">
2129
+
2130
+
2131
+
2132
+ <span class="md-ellipsis">
2133
+
2134
+
2135
+ TextMessage
2136
+
2137
+
2138
+
2139
+ </span>
2140
+
2141
+
2142
+
2143
+ </a>
2144
+ </li>
2145
+
2146
+
2147
+
2148
+
2149
+
2150
+
2151
+
2152
+
2153
+
2154
+
2155
+ <li class="md-nav__item">
2156
+ <a href="../../messages/tool-call-message/" class="md-nav__link">
2157
+
2158
+
2159
+
2160
+ <span class="md-ellipsis">
2161
+
2162
+
2163
+ ToolCallMessage
2164
+
2165
+
2166
+
2167
+ </span>
2168
+
2169
+
2170
+
2171
+ </a>
2172
+ </li>
2173
+
2174
+
2175
+
2176
+
2177
+
2178
+
2179
+
2180
+
2181
+
2182
+
2183
+ <li class="md-nav__item">
2184
+ <a href="../../messages/tool-result-message/" class="md-nav__link">
2185
+
2186
+
2187
+
2188
+ <span class="md-ellipsis">
2189
+
2190
+
2191
+ ToolResultMessage
2192
+
2193
+
2194
+
2195
+ </span>
2196
+
2197
+
2198
+
2199
+ </a>
2200
+ </li>
2201
+
2202
+
2203
+
2204
+
2205
+ </ul>
2206
+ </nav>
2207
+
2208
+ </li>
2209
+
2210
+
2211
+
2212
+
2213
+
2214
+
2215
+
2216
+
2217
+
2218
+
2219
+
2220
+
2221
+
2222
+
2223
+
2224
+
2225
+
2226
+
2227
+
2228
+
2229
+
2230
+
2231
+
2232
+
2233
+
2234
+
2235
+
2236
+
2237
+
2238
+
2239
+ <li class="md-nav__item md-nav__item--nested">
2240
+
2241
+
2242
+
2243
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_4" >
2244
+
2245
+
2246
+ <div class="md-nav__link md-nav__container">
2247
+ <a href="../../mcp/" class="md-nav__link ">
2248
+
2249
+
2250
+
2251
+ <span class="md-ellipsis">
2252
+
2253
+
2254
+ MCP
2255
+
2256
+
2257
+
2258
+ </span>
2259
+
2260
+
2261
+
2262
+ </a>
2263
+
2264
+
2265
+ <label class="md-nav__link " for="__nav_5_4" id="__nav_5_4_label" tabindex="0">
2266
+ <span class="md-nav__icon md-icon"></span>
2267
+ </label>
2268
+
2269
+ </div>
2270
+
2271
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_4_label" aria-expanded="false">
2272
+ <label class="md-nav__title" for="__nav_5_4">
2273
+ <span class="md-nav__icon md-icon"></span>
2274
+
2275
+
2276
+ MCP
2277
+
2278
+
2279
+ </label>
2280
+ <ul class="md-nav__list" data-md-scrollfix>
2281
+
2282
+
2283
+
2284
+
2285
+
2286
+
2287
+
2288
+
2289
+
2290
+ <li class="md-nav__item">
2291
+ <a href="../../mcp/client/" class="md-nav__link">
2292
+
2293
+
2294
+
2295
+ <span class="md-ellipsis">
2296
+
2297
+
2298
+ Client
2299
+
2300
+
2301
+
2302
+ </span>
2303
+
2304
+
2305
+
2306
+ </a>
2307
+ </li>
2308
+
2309
+
2310
+
2311
+
2312
+
2313
+
2314
+
2315
+
2316
+
2317
+
2318
+ <li class="md-nav__item">
2319
+ <a href="../../mcp/server/" class="md-nav__link">
2320
+
2321
+
2322
+
2323
+ <span class="md-ellipsis">
2324
+
2325
+
2326
+ Server
2327
+
2328
+
2329
+
2330
+ </span>
2331
+
2332
+
2333
+
2334
+ </a>
2335
+ </li>
2336
+
2337
+
2338
+
2339
+
2340
+
2341
+
2342
+
2343
+
2344
+
2345
+
2346
+ <li class="md-nav__item">
2347
+ <a href="../../mcp/transports/" class="md-nav__link">
2348
+
2349
+
2350
+
2351
+ <span class="md-ellipsis">
2352
+
2353
+
2354
+ Transports
2355
+
2356
+
2357
+
2358
+ </span>
2359
+
2360
+
2361
+
2362
+ </a>
2363
+ </li>
2364
+
2365
+
2366
+
2367
+
2368
+ </ul>
2369
+ </nav>
2370
+
2371
+ </li>
2372
+
2373
+
2374
+
2375
+
2376
+
2377
+
2378
+
2379
+
2380
+
2381
+
2382
+
2383
+
2384
+
2385
+
2386
+
2387
+
2388
+
2389
+
2390
+
2391
+
2392
+
2393
+
2394
+
2395
+
2396
+
2397
+
2398
+
2399
+
2400
+ <li class="md-nav__item md-nav__item--nested">
2401
+
2402
+
2403
+
2404
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_5" >
2405
+
2406
+
2407
+ <div class="md-nav__link md-nav__container">
2408
+ <a href="../../streaming/" class="md-nav__link ">
2409
+
2410
+
2411
+
2412
+ <span class="md-ellipsis">
2413
+
2414
+
2415
+ Streaming
2416
+
2417
+
2418
+
2419
+ </span>
2420
+
2421
+
2422
+
2423
+ </a>
2424
+
2425
+
2426
+ <label class="md-nav__link " for="__nav_5_5" id="__nav_5_5_label" tabindex="0">
2427
+ <span class="md-nav__icon md-icon"></span>
2428
+ </label>
2429
+
2430
+ </div>
2431
+
2432
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_5_label" aria-expanded="false">
2433
+ <label class="md-nav__title" for="__nav_5_5">
2434
+ <span class="md-nav__icon md-icon"></span>
2435
+
2436
+
2437
+ Streaming
2438
+
2439
+
2440
+ </label>
2441
+ <ul class="md-nav__list" data-md-scrollfix>
2442
+
2443
+
2444
+
2445
+
2446
+
2447
+
2448
+
2449
+
2450
+
2451
+ <li class="md-nav__item">
2452
+ <a href="../../streaming/context/" class="md-nav__link">
2453
+
2454
+
2455
+
2456
+ <span class="md-ellipsis">
2457
+
2458
+
2459
+ Context
2460
+
2461
+
2462
+
2463
+ </span>
2464
+
2465
+
2466
+
2467
+ </a>
2468
+ </li>
2469
+
2470
+
2471
+
2472
+
2473
+
2474
+
2475
+
2476
+
2477
+
2478
+
2479
+ <li class="md-nav__item">
2480
+ <a href="../../streaming/events/" class="md-nav__link">
2481
+
2482
+
2483
+
2484
+ <span class="md-ellipsis">
2485
+
2486
+
2487
+ Events
2488
+
2489
+
2490
+
2491
+ </span>
2492
+
2493
+
2494
+
2495
+ </a>
2496
+ </li>
2497
+
2498
+
2499
+
2500
+
2501
+ </ul>
2502
+ </nav>
2503
+
2504
+ </li>
2505
+
2506
+
2507
+
2508
+
2509
+ </ul>
2510
+ </nav>
2511
+
2512
+ </li>
2513
+
2514
+
2515
+
2516
+
2517
+
2518
+
2519
+
2520
+
2521
+
2522
+
2523
+
2524
+
2525
+
2526
+
2527
+
2528
+
2529
+
2530
+
2531
+
2532
+
2533
+
2534
+
2535
+
2536
+
2537
+
2538
+
2539
+
2540
+
2541
+
2542
+
2543
+
2544
+
2545
+
2546
+ <li class="md-nav__item md-nav__item--nested">
2547
+
2548
+
2549
+
2550
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
2551
+
2552
+
2553
+ <div class="md-nav__link md-nav__container">
2554
+ <a href="../../../examples/" class="md-nav__link ">
2555
+
2556
+
2557
+
2558
+ <span class="md-ellipsis">
2559
+
2560
+
2561
+ Examples
2562
+
2563
+
2564
+
2565
+ </span>
2566
+
2567
+
2568
+
2569
+ </a>
2570
+
2571
+
2572
+ <label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="0">
2573
+ <span class="md-nav__icon md-icon"></span>
2574
+ </label>
2575
+
2576
+ </div>
2577
+
2578
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
2579
+ <label class="md-nav__title" for="__nav_6">
2580
+ <span class="md-nav__icon md-icon"></span>
2581
+
2582
+
2583
+ Examples
2584
+
2585
+
2586
+ </label>
2587
+ <ul class="md-nav__list" data-md-scrollfix>
2588
+
2589
+
2590
+
2591
+
2592
+
2593
+
2594
+
2595
+
2596
+
2597
+ <li class="md-nav__item">
2598
+ <a href="../../../examples/basic-chat/" class="md-nav__link">
2599
+
2600
+
2601
+
2602
+ <span class="md-ellipsis">
2603
+
2604
+
2605
+ Basic Chat
2606
+
2607
+
2608
+
2609
+ </span>
2610
+
2611
+
2612
+
2613
+ </a>
2614
+ </li>
2615
+
2616
+
2617
+
2618
+
2619
+
2620
+
2621
+
2622
+
2623
+
2624
+
2625
+ <li class="md-nav__item">
2626
+ <a href="../../../examples/multi-robot-network/" class="md-nav__link">
2627
+
2628
+
2629
+
2630
+ <span class="md-ellipsis">
2631
+
2632
+
2633
+ Multi-Robot Network
2634
+
2635
+
2636
+
2637
+ </span>
2638
+
2639
+
2640
+
2641
+ </a>
2642
+ </li>
2643
+
2644
+
2645
+
2646
+
2647
+
2648
+
2649
+
2650
+
2651
+
2652
+
2653
+ <li class="md-nav__item">
2654
+ <a href="../../../examples/tool-usage/" class="md-nav__link">
2655
+
2656
+
2657
+
2658
+ <span class="md-ellipsis">
2659
+
2660
+
2661
+ Tool Usage
2662
+
2663
+
2664
+
2665
+ </span>
2666
+
2667
+
2668
+
2669
+ </a>
2670
+ </li>
2671
+
2672
+
2673
+
2674
+
2675
+
2676
+
2677
+
2678
+
2679
+
2680
+
2681
+ <li class="md-nav__item">
2682
+ <a href="../../../examples/mcp-server/" class="md-nav__link">
2683
+
2684
+
2685
+
2686
+ <span class="md-ellipsis">
2687
+
2688
+
2689
+ MCP Server
2690
+
2691
+
2692
+
2693
+ </span>
2694
+
2695
+
2696
+
2697
+ </a>
2698
+ </li>
2699
+
2700
+
2701
+
2702
+
2703
+
2704
+
2705
+
2706
+
2707
+
2708
+
2709
+ <li class="md-nav__item">
2710
+ <a href="../../../examples/rails-application/" class="md-nav__link">
2711
+
2712
+
2713
+
2714
+ <span class="md-ellipsis">
2715
+
2716
+
2717
+ Rails Application
2718
+
2719
+
2720
+
2721
+ </span>
2722
+
2723
+
2724
+
2725
+ </a>
2726
+ </li>
2727
+
2728
+
2729
+
2730
+
2731
+ </ul>
2732
+ </nav>
2733
+
2734
+ </li>
2735
+
2736
+
2737
+
2738
+ </ul>
2739
+ </nav>
2740
+ </div>
2741
+ </div>
2742
+ </div>
2743
+
2744
+
2745
+
2746
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2747
+ <div class="md-sidebar__scrollwrap">
2748
+ <div class="md-sidebar__inner">
2749
+
2750
+
2751
+
2752
+
2753
+ <nav class="md-nav md-nav--secondary" aria-label="On this page">
2754
+
2755
+
2756
+
2757
+
2758
+
2759
+
2760
+ <label class="md-nav__title" for="__toc">
2761
+ <span class="md-nav__icon md-icon"></span>
2762
+ On this page
2763
+ </label>
2764
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2765
+
2766
+ <li class="md-nav__item">
2767
+ <a href="#class-hierarchy" class="md-nav__link">
2768
+ <span class="md-ellipsis">
2769
+
2770
+ Class Hierarchy
2771
+
2772
+ </span>
2773
+ </a>
2774
+
2775
+ </li>
2776
+
2777
+ <li class="md-nav__item">
2778
+ <a href="#constructor" class="md-nav__link">
2779
+ <span class="md-ellipsis">
2780
+
2781
+ Constructor
2782
+
2783
+ </span>
2784
+ </a>
2785
+
2786
+ <nav class="md-nav" aria-label="Constructor">
2787
+ <ul class="md-nav__list">
2788
+
2789
+ <li class="md-nav__item">
2790
+ <a href="#parameters" class="md-nav__link">
2791
+ <span class="md-ellipsis">
2792
+
2793
+ Parameters
2794
+
2795
+ </span>
2796
+ </a>
2797
+
2798
+ </li>
2799
+
2800
+ </ul>
2801
+ </nav>
2802
+
2803
+ </li>
2804
+
2805
+ <li class="md-nav__item">
2806
+ <a href="#factory-method" class="md-nav__link">
2807
+ <span class="md-ellipsis">
2808
+
2809
+ Factory Method
2810
+
2811
+ </span>
2812
+ </a>
2813
+
2814
+ </li>
2815
+
2816
+ <li class="md-nav__item">
2817
+ <a href="#attributes-read-only" class="md-nav__link">
2818
+ <span class="md-ellipsis">
2819
+
2820
+ Attributes (Read-Only)
2821
+
2822
+ </span>
2823
+ </a>
2824
+
2825
+ </li>
2826
+
2827
+ <li class="md-nav__item">
2828
+ <a href="#attributes-read-write" class="md-nav__link">
2829
+ <span class="md-ellipsis">
2830
+
2831
+ Attributes (Read-Write)
2832
+
2833
+ </span>
2834
+ </a>
2835
+
2836
+ </li>
2837
+
2838
+ <li class="md-nav__item">
2839
+ <a href="#methods" class="md-nav__link">
2840
+ <span class="md-ellipsis">
2841
+
2842
+ Methods
2843
+
2844
+ </span>
2845
+ </a>
2846
+
2847
+ <nav class="md-nav" aria-label="Methods">
2848
+ <ul class="md-nav__list">
2849
+
2850
+ <li class="md-nav__item">
2851
+ <a href="#run" class="md-nav__link">
2852
+ <span class="md-ellipsis">
2853
+
2854
+ run
2855
+
2856
+ </span>
2857
+ </a>
2858
+
2859
+ </li>
2860
+
2861
+ <li class="md-nav__item">
2862
+ <a href="#model" class="md-nav__link">
2863
+ <span class="md-ellipsis">
2864
+
2865
+ model
2866
+
2867
+ </span>
2868
+ </a>
2869
+
2870
+ </li>
2871
+
2872
+ <li class="md-nav__item">
2873
+ <a href="#update" class="md-nav__link">
2874
+ <span class="md-ellipsis">
2875
+
2876
+ update
2877
+
2878
+ </span>
2879
+ </a>
2880
+
2881
+ </li>
2882
+
2883
+ <li class="md-nav__item">
2884
+ <a href="#with_-methods-chaining" class="md-nav__link">
2885
+ <span class="md-ellipsis">
2886
+
2887
+ with_* Methods (Chaining)
2888
+
2889
+ </span>
2890
+ </a>
2891
+
2892
+ </li>
2893
+
2894
+ <li class="md-nav__item">
2895
+ <a href="#with_template" class="md-nav__link">
2896
+ <span class="md-ellipsis">
2897
+
2898
+ with_template
2899
+
2900
+ </span>
2901
+ </a>
2902
+
2903
+ </li>
2904
+
2905
+ <li class="md-nav__item">
2906
+ <a href="#call" class="md-nav__link">
2907
+ <span class="md-ellipsis">
2908
+
2909
+ call
2910
+
2911
+ </span>
2912
+ </a>
2913
+
2914
+ </li>
2915
+
2916
+ <li class="md-nav__item">
2917
+ <a href="#reset_memory" class="md-nav__link">
2918
+ <span class="md-ellipsis">
2919
+
2920
+ reset_memory
2921
+
2922
+ </span>
2923
+ </a>
2924
+
2925
+ </li>
2926
+
2927
+ <li class="md-nav__item">
2928
+ <a href="#send_message" class="md-nav__link">
2929
+ <span class="md-ellipsis">
2930
+
2931
+ send_message
2932
+
2933
+ </span>
2934
+ </a>
2935
+
2936
+ </li>
2937
+
2938
+ <li class="md-nav__item">
2939
+ <a href="#send_reply" class="md-nav__link">
2940
+ <span class="md-ellipsis">
2941
+
2942
+ send_reply
2943
+
2944
+ </span>
2945
+ </a>
2946
+
2947
+ </li>
2948
+
2949
+ <li class="md-nav__item">
2950
+ <a href="#on_message" class="md-nav__link">
2951
+ <span class="md-ellipsis">
2952
+
2953
+ on_message
2954
+
2955
+ </span>
2956
+ </a>
2957
+
2958
+ </li>
2959
+
2960
+ <li class="md-nav__item">
2961
+ <a href="#spawn" class="md-nav__link">
2962
+ <span class="md-ellipsis">
2963
+
2964
+ spawn
2965
+
2966
+ </span>
2967
+ </a>
2968
+
2969
+ </li>
2970
+
2971
+ <li class="md-nav__item">
2972
+ <a href="#with_bus" class="md-nav__link">
2973
+ <span class="md-ellipsis">
2974
+
2975
+ with_bus
2976
+
2977
+ </span>
2978
+ </a>
2979
+
2980
+ </li>
2981
+
2982
+ <li class="md-nav__item">
2983
+ <a href="#disconnect" class="md-nav__link">
2984
+ <span class="md-ellipsis">
2985
+
2986
+ disconnect
2987
+
2988
+ </span>
2989
+ </a>
2990
+
2991
+ </li>
2992
+
2993
+ <li class="md-nav__item">
2994
+ <a href="#to_h" class="md-nav__link">
2995
+ <span class="md-ellipsis">
2996
+
2997
+ to_h
2998
+
2999
+ </span>
3000
+ </a>
3001
+
3002
+ </li>
3003
+
3004
+ </ul>
3005
+ </nav>
3006
+
3007
+ </li>
3008
+
3009
+ <li class="md-nav__item">
3010
+ <a href="#memory-behavior" class="md-nav__link">
3011
+ <span class="md-ellipsis">
3012
+
3013
+ Memory Behavior
3014
+
3015
+ </span>
3016
+ </a>
3017
+
3018
+ </li>
3019
+
3020
+ <li class="md-nav__item">
3021
+ <a href="#templates" class="md-nav__link">
3022
+ <span class="md-ellipsis">
3023
+
3024
+ Templates
3025
+
3026
+ </span>
3027
+ </a>
3028
+
3029
+ </li>
3030
+
3031
+ <li class="md-nav__item">
3032
+ <a href="#skills" class="md-nav__link">
3033
+ <span class="md-ellipsis">
3034
+
3035
+ Skills
3036
+
3037
+ </span>
3038
+ </a>
3039
+
3040
+ </li>
3041
+
3042
+ <li class="md-nav__item">
3043
+ <a href="#runconfig" class="md-nav__link">
3044
+ <span class="md-ellipsis">
3045
+
3046
+ RunConfig
3047
+
3048
+ </span>
3049
+ </a>
3050
+
3051
+ </li>
3052
+
3053
+ <li class="md-nav__item">
3054
+ <a href="#streaming" class="md-nav__link">
3055
+ <span class="md-ellipsis">
3056
+
3057
+ Streaming
3058
+
3059
+ </span>
3060
+ </a>
3061
+
3062
+ <nav class="md-nav" aria-label="Streaming">
3063
+ <ul class="md-nav__list">
3064
+
3065
+ <li class="md-nav__item">
3066
+ <a href="#the-chunk-object" class="md-nav__link">
3067
+ <span class="md-ellipsis">
3068
+
3069
+ The Chunk Object
3070
+
3071
+ </span>
3072
+ </a>
3073
+
3074
+ </li>
3075
+
3076
+ <li class="md-nav__item">
3077
+ <a href="#stored-callback-on_content" class="md-nav__link">
3078
+ <span class="md-ellipsis">
3079
+
3080
+ Stored Callback (on_content:)
3081
+
3082
+ </span>
3083
+ </a>
3084
+
3085
+ </li>
3086
+
3087
+ <li class="md-nav__item">
3088
+ <a href="#per-call-block" class="md-nav__link">
3089
+ <span class="md-ellipsis">
3090
+
3091
+ Per-Call Block
3092
+
3093
+ </span>
3094
+ </a>
3095
+
3096
+ </li>
3097
+
3098
+ <li class="md-nav__item">
3099
+ <a href="#both-together" class="md-nav__link">
3100
+ <span class="md-ellipsis">
3101
+
3102
+ Both Together
3103
+
3104
+ </span>
3105
+ </a>
3106
+
3107
+ </li>
3108
+
3109
+ </ul>
3110
+ </nav>
3111
+
3112
+ </li>
3113
+
3114
+ <li class="md-nav__item">
3115
+ <a href="#configuration-hierarchy" class="md-nav__link">
3116
+ <span class="md-ellipsis">
3117
+
3118
+ Configuration Hierarchy
3119
+
3120
+ </span>
3121
+ </a>
3122
+
3123
+ </li>
3124
+
3125
+ <li class="md-nav__item">
3126
+ <a href="#examples" class="md-nav__link">
3127
+ <span class="md-ellipsis">
3128
+
3129
+ Examples
3130
+
3131
+ </span>
3132
+ </a>
3133
+
3134
+ <nav class="md-nav" aria-label="Examples">
3135
+ <ul class="md-nav__list">
3136
+
3137
+ <li class="md-nav__item">
3138
+ <a href="#basic-robot" class="md-nav__link">
3139
+ <span class="md-ellipsis">
3140
+
3141
+ Basic Robot
3142
+
3143
+ </span>
3144
+ </a>
3145
+
3146
+ </li>
3147
+
3148
+ <li class="md-nav__item">
3149
+ <a href="#robot-with-template" class="md-nav__link">
3150
+ <span class="md-ellipsis">
3151
+
3152
+ Robot with Template
3153
+
3154
+ </span>
3155
+ </a>
3156
+
3157
+ </li>
3158
+
3159
+ <li class="md-nav__item">
3160
+ <a href="#robot-with-tools" class="md-nav__link">
3161
+ <span class="md-ellipsis">
3162
+
3163
+ Robot with Tools
3164
+
3165
+ </span>
3166
+ </a>
3167
+
3168
+ </li>
3169
+
3170
+ <li class="md-nav__item">
3171
+ <a href="#robot-with-mcp" class="md-nav__link">
3172
+ <span class="md-ellipsis">
3173
+
3174
+ Robot with MCP
3175
+
3176
+ </span>
3177
+ </a>
3178
+
3179
+ </li>
3180
+
3181
+ <li class="md-nav__item">
3182
+ <a href="#robot-with-skills" class="md-nav__link">
3183
+ <span class="md-ellipsis">
3184
+
3185
+ Robot with Skills
3186
+
3187
+ </span>
3188
+ </a>
3189
+
3190
+ </li>
3191
+
3192
+ <li class="md-nav__item">
3193
+ <a href="#bare-robot-with-chaining" class="md-nav__link">
3194
+ <span class="md-ellipsis">
3195
+
3196
+ Bare Robot with Chaining
3197
+
3198
+ </span>
3199
+ </a>
3200
+
3201
+ </li>
3202
+
3203
+ <li class="md-nav__item">
3204
+ <a href="#robot-with-message-bus" class="md-nav__link">
3205
+ <span class="md-ellipsis">
3206
+
3207
+ Robot with Message Bus
3208
+
3209
+ </span>
3210
+ </a>
3211
+
3212
+ </li>
3213
+
3214
+ <li class="md-nav__item">
3215
+ <a href="#spawning-robots-dynamically" class="md-nav__link">
3216
+ <span class="md-ellipsis">
3217
+
3218
+ Spawning Robots Dynamically
3219
+
3220
+ </span>
3221
+ </a>
3222
+
3223
+ </li>
3224
+
3225
+ <li class="md-nav__item">
3226
+ <a href="#connecting-to-a-bus-after-creation" class="md-nav__link">
3227
+ <span class="md-ellipsis">
3228
+
3229
+ Connecting to a Bus After Creation
3230
+
3231
+ </span>
3232
+ </a>
3233
+
3234
+ </li>
3235
+
3236
+ </ul>
3237
+ </nav>
3238
+
3239
+ </li>
3240
+
3241
+ <li class="md-nav__item">
3242
+ <a href="#see-also" class="md-nav__link">
3243
+ <span class="md-ellipsis">
3244
+
3245
+ See Also
3246
+
3247
+ </span>
3248
+ </a>
3249
+
3250
+ </li>
3251
+
3252
+ </ul>
3253
+
3254
+ </nav>
3255
+ </div>
3256
+ </div>
3257
+ </div>
3258
+
3259
+
3260
+
3261
+ <div class="md-content" data-md-component="content">
3262
+
3263
+
3264
+
3265
+
3266
+
3267
+
3268
+ <nav class="md-path" aria-label="Navigation" >
3269
+ <ol class="md-path__list">
3270
+
3271
+
3272
+
3273
+
3274
+
3275
+
3276
+
3277
+ <li class="md-path__item">
3278
+ <a href="../../" class="md-path__link">
3279
+
3280
+ <span class="md-ellipsis">
3281
+ API Reference
3282
+ </span>
3283
+
3284
+ </a>
3285
+ </li>
3286
+
3287
+
3288
+
3289
+
3290
+
3291
+
3292
+
3293
+
3294
+
3295
+ <li class="md-path__item">
3296
+ <a href="../" class="md-path__link">
3297
+
3298
+ <span class="md-ellipsis">
3299
+ Core Classes
3300
+ </span>
3301
+
3302
+ </a>
3303
+ </li>
3304
+
3305
+
3306
+
3307
+
3308
+ </ol>
3309
+ </nav>
3310
+
3311
+
3312
+ <article class="md-content__inner md-typeset">
3313
+
3314
+
3315
+
3316
+
3317
+
3318
+ <a href="https://github.com/madbomber/robot_lab/edit/main/docs/api/core/robot.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
3319
+
3320
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
3321
+ </a>
3322
+
3323
+
3324
+
3325
+
3326
+
3327
+ <a href="https://github.com/madbomber/robot_lab/raw/main/docs/api/core/robot.md" title="View source of this page" class="md-content__button md-icon">
3328
+
3329
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
3330
+ </a>
3331
+
3332
+
3333
+
3334
+ <h1 id="robot">Robot<a class="headerlink" href="#robot" title="Permanent link">&para;</a></h1>
3335
+ <p>LLM-powered agent with template-based prompts, tools, memory, and MCP integration.</p>
3336
+ <h2 id="class-hierarchy">Class Hierarchy<a class="headerlink" href="#class-hierarchy" title="Permanent link">&para;</a></h2>
3337
+ <div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>RubyLLM::Agent
3338
+ </span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> └── RobotLab::Robot
3339
+ </span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> └── Your custom subclasses (e.g., ClassifierRobot)
3340
+ </span></code></pre></div>
3341
+ <p><code>Robot</code> inherits from <code>RubyLLM::Agent</code>, which creates a persistent <code>@chat</code> on initialization. The robot adds template-based prompts, shared memory, hierarchical MCP configuration, and SimpleFlow pipeline integration on top of the base agent.</p>
3342
+ <h2 id="constructor">Constructor<a class="headerlink" href="#constructor" title="Permanent link">&para;</a></h2>
3343
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="no">Robot</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
3344
+ </span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:,</span>
3345
+ </span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3346
+ </span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3347
+ </span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span><span class="ss">context</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span>
3348
+ </span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="ss">description</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3349
+ </span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="ss">local_tools</span><span class="p">:</span><span class="w"> </span><span class="o">[]</span><span class="p">,</span>
3350
+ </span><span id="__span-1-8"><a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="w"> </span><span class="ss">model</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3351
+ </span><span id="__span-1-9"><a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="w"> </span><span class="ss">mcp_servers</span><span class="p">:</span><span class="w"> </span><span class="o">[]</span><span class="p">,</span>
3352
+ </span><span id="__span-1-10"><a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a><span class="w"> </span><span class="ss">mcp</span><span class="p">:</span><span class="w"> </span><span class="ss">:none</span><span class="p">,</span>
3353
+ </span><span id="__span-1-11"><a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a><span class="w"> </span><span class="ss">tools</span><span class="p">:</span><span class="w"> </span><span class="ss">:none</span><span class="p">,</span>
3354
+ </span><span id="__span-1-12"><a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="w"> </span><span class="ss">on_tool_call</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3355
+ </span><span id="__span-1-13"><a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="w"> </span><span class="ss">on_tool_result</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3356
+ </span><span id="__span-1-14"><a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="w"> </span><span class="ss">on_content</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3357
+ </span><span id="__span-1-15"><a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a><span class="w"> </span><span class="ss">enable_cache</span><span class="p">:</span><span class="w"> </span><span class="kp">true</span><span class="p">,</span>
3358
+ </span><span id="__span-1-16"><a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a><span class="w"> </span><span class="ss">bus</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3359
+ </span><span id="__span-1-17"><a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a><span class="w"> </span><span class="ss">skills</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3360
+ </span><span id="__span-1-18"><a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a><span class="w"> </span><span class="ss">temperature</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3361
+ </span><span id="__span-1-19"><a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a><span class="w"> </span><span class="ss">top_p</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3362
+ </span><span id="__span-1-20"><a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a><span class="w"> </span><span class="ss">top_k</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3363
+ </span><span id="__span-1-21"><a id="__codelineno-1-21" name="__codelineno-1-21" href="#__codelineno-1-21"></a><span class="w"> </span><span class="ss">max_tokens</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3364
+ </span><span id="__span-1-22"><a id="__codelineno-1-22" name="__codelineno-1-22" href="#__codelineno-1-22"></a><span class="w"> </span><span class="ss">presence_penalty</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3365
+ </span><span id="__span-1-23"><a id="__codelineno-1-23" name="__codelineno-1-23" href="#__codelineno-1-23"></a><span class="w"> </span><span class="ss">frequency_penalty</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3366
+ </span><span id="__span-1-24"><a id="__codelineno-1-24" name="__codelineno-1-24" href="#__codelineno-1-24"></a><span class="w"> </span><span class="ss">stop</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3367
+ </span><span id="__span-1-25"><a id="__codelineno-1-25" name="__codelineno-1-25" href="#__codelineno-1-25"></a><span class="w"> </span><span class="ss">config</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span>
3368
+ </span><span id="__span-1-26"><a id="__codelineno-1-26" name="__codelineno-1-26" href="#__codelineno-1-26"></a><span class="p">)</span>
3369
+ </span></code></pre></div>
3370
+ <h3 id="parameters">Parameters<a class="headerlink" href="#parameters" title="Permanent link">&para;</a></h3>
3371
+ <table>
3372
+ <thead>
3373
+ <tr>
3374
+ <th>Name</th>
3375
+ <th>Type</th>
3376
+ <th>Default</th>
3377
+ <th>Description</th>
3378
+ </tr>
3379
+ </thead>
3380
+ <tbody>
3381
+ <tr>
3382
+ <td><code>name</code></td>
3383
+ <td><code>String</code></td>
3384
+ <td><strong>required</strong></td>
3385
+ <td>Unique identifier for the robot</td>
3386
+ </tr>
3387
+ <tr>
3388
+ <td><code>template</code></td>
3389
+ <td><code>Symbol</code>, <code>nil</code></td>
3390
+ <td><code>nil</code></td>
3391
+ <td>Prompt template (e.g., <code>:assistant</code> loads <code>prompts/assistant.md</code>)</td>
3392
+ </tr>
3393
+ <tr>
3394
+ <td><code>system_prompt</code></td>
3395
+ <td><code>String</code>, <code>nil</code></td>
3396
+ <td><code>nil</code></td>
3397
+ <td>Inline system prompt (appended after template if both given)</td>
3398
+ </tr>
3399
+ <tr>
3400
+ <td><code>context</code></td>
3401
+ <td><code>Hash</code>, <code>Proc</code></td>
3402
+ <td><code>{}</code></td>
3403
+ <td>Variables passed to the template</td>
3404
+ </tr>
3405
+ <tr>
3406
+ <td><code>description</code></td>
3407
+ <td><code>String</code>, <code>nil</code></td>
3408
+ <td><code>nil</code></td>
3409
+ <td>Human-readable description of what the robot does</td>
3410
+ </tr>
3411
+ <tr>
3412
+ <td><code>local_tools</code></td>
3413
+ <td><code>Array</code></td>
3414
+ <td><code>[]</code></td>
3415
+ <td>Tools defined locally (<code>RubyLLM::Tool</code> subclasses or <code>RobotLab::Tool</code> instances)</td>
3416
+ </tr>
3417
+ <tr>
3418
+ <td><code>model</code></td>
3419
+ <td><code>String</code>, <code>nil</code></td>
3420
+ <td><code>nil</code></td>
3421
+ <td>LLM model ID (falls back to <code>RobotLab.config.ruby_llm.model</code>)</td>
3422
+ </tr>
3423
+ <tr>
3424
+ <td><code>mcp_servers</code></td>
3425
+ <td><code>Array</code></td>
3426
+ <td><code>[]</code></td>
3427
+ <td>Legacy MCP server configurations</td>
3428
+ </tr>
3429
+ <tr>
3430
+ <td><code>mcp</code></td>
3431
+ <td><code>Symbol</code>, <code>Array</code></td>
3432
+ <td><code>:none</code></td>
3433
+ <td>Hierarchical MCP config (<code>:none</code>, <code>:inherit</code>, or server array)</td>
3434
+ </tr>
3435
+ <tr>
3436
+ <td><code>tools</code></td>
3437
+ <td><code>Symbol</code>, <code>Array</code></td>
3438
+ <td><code>:none</code></td>
3439
+ <td>Hierarchical tools config (<code>:none</code>, <code>:inherit</code>, or tool name array)</td>
3440
+ </tr>
3441
+ <tr>
3442
+ <td><code>on_tool_call</code></td>
3443
+ <td><code>Proc</code>, <code>nil</code></td>
3444
+ <td><code>nil</code></td>
3445
+ <td>Callback invoked when a tool is called</td>
3446
+ </tr>
3447
+ <tr>
3448
+ <td><code>on_tool_result</code></td>
3449
+ <td><code>Proc</code>, <code>nil</code></td>
3450
+ <td><code>nil</code></td>
3451
+ <td>Callback invoked when a tool returns a result</td>
3452
+ </tr>
3453
+ <tr>
3454
+ <td><code>on_content</code></td>
3455
+ <td><code>Proc</code>, <code>nil</code></td>
3456
+ <td><code>nil</code></td>
3457
+ <td>Stored streaming callback invoked with each content chunk (see <a href="#streaming">Streaming</a>)</td>
3458
+ </tr>
3459
+ <tr>
3460
+ <td><code>enable_cache</code></td>
3461
+ <td><code>Boolean</code></td>
3462
+ <td><code>true</code></td>
3463
+ <td>Whether to enable semantic caching</td>
3464
+ </tr>
3465
+ <tr>
3466
+ <td><code>bus</code></td>
3467
+ <td><code>TypedBus::MessageBus</code>, <code>nil</code></td>
3468
+ <td><code>nil</code></td>
3469
+ <td>Optional message bus for inter-robot communication</td>
3470
+ </tr>
3471
+ <tr>
3472
+ <td><code>skills</code></td>
3473
+ <td><code>Symbol</code>, <code>Array&lt;Symbol&gt;</code>, <code>nil</code></td>
3474
+ <td><code>nil</code></td>
3475
+ <td>Skill templates to prepend (see <a href="#skills">Skills</a>)</td>
3476
+ </tr>
3477
+ <tr>
3478
+ <td><code>config</code></td>
3479
+ <td><code>RunConfig</code>, <code>nil</code></td>
3480
+ <td><code>nil</code></td>
3481
+ <td>Shared config merged with explicit kwargs (see <a href="#runconfig">RunConfig</a>)</td>
3482
+ </tr>
3483
+ <tr>
3484
+ <td><code>temperature</code></td>
3485
+ <td><code>Float</code>, <code>nil</code></td>
3486
+ <td><code>nil</code></td>
3487
+ <td>Controls randomness (0.0-1.0)</td>
3488
+ </tr>
3489
+ <tr>
3490
+ <td><code>top_p</code></td>
3491
+ <td><code>Float</code>, <code>nil</code></td>
3492
+ <td><code>nil</code></td>
3493
+ <td>Nucleus sampling threshold</td>
3494
+ </tr>
3495
+ <tr>
3496
+ <td><code>top_k</code></td>
3497
+ <td><code>Integer</code>, <code>nil</code></td>
3498
+ <td><code>nil</code></td>
3499
+ <td>Top-k sampling</td>
3500
+ </tr>
3501
+ <tr>
3502
+ <td><code>max_tokens</code></td>
3503
+ <td><code>Integer</code>, <code>nil</code></td>
3504
+ <td><code>nil</code></td>
3505
+ <td>Maximum tokens in response</td>
3506
+ </tr>
3507
+ <tr>
3508
+ <td><code>presence_penalty</code></td>
3509
+ <td><code>Float</code>, <code>nil</code></td>
3510
+ <td><code>nil</code></td>
3511
+ <td>Penalize based on presence</td>
3512
+ </tr>
3513
+ <tr>
3514
+ <td><code>frequency_penalty</code></td>
3515
+ <td><code>Float</code>, <code>nil</code></td>
3516
+ <td><code>nil</code></td>
3517
+ <td>Penalize based on frequency</td>
3518
+ </tr>
3519
+ <tr>
3520
+ <td><code>stop</code></td>
3521
+ <td><code>String</code>, <code>Array</code>, <code>nil</code></td>
3522
+ <td><code>nil</code></td>
3523
+ <td>Stop sequences</td>
3524
+ </tr>
3525
+ </tbody>
3526
+ </table>
3527
+ <p>When both <code>config:</code> and explicit kwargs (e.g., <code>temperature:</code>) are provided, explicit kwargs always win.</p>
3528
+ <h2 id="factory-method">Factory Method<a class="headerlink" href="#factory-method" title="Permanent link">&para;</a></h2>
3529
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
3530
+ </span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;robot&quot;</span><span class="p">,</span><span class="w"> </span><span class="c1"># Defaults to &quot;robot&quot;</span>
3531
+ </span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3532
+ </span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3533
+ </span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="w"> </span><span class="ss">context</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span>
3534
+ </span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="w"> </span><span class="ss">enable_cache</span><span class="p">:</span><span class="w"> </span><span class="kp">true</span><span class="p">,</span>
3535
+ </span><span id="__span-2-7"><a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="w"> </span><span class="ss">bus</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span><span class="w"> </span><span class="c1"># Optional TypedBus::MessageBus</span>
3536
+ </span><span id="__span-2-8"><a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="w"> </span><span class="ss">skills</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span><span class="w"> </span><span class="c1"># Optional skill templates</span>
3537
+ </span><span id="__span-2-9"><a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="w"> </span><span class="o">**</span><span class="n">options</span><span class="w"> </span><span class="c1"># All other Robot.new parameters</span>
3538
+ </span><span id="__span-2-10"><a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a><span class="p">)</span>
3539
+ </span><span id="__span-2-11"><a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="c1"># =&gt; RobotLab::Robot</span>
3540
+ </span></code></pre></div>
3541
+ <p>If <code>name</code> is omitted, it defaults to <code>"robot"</code>.</p>
3542
+ <h2 id="attributes-read-only">Attributes (Read-Only)<a class="headerlink" href="#attributes-read-only" title="Permanent link">&para;</a></h2>
3543
+ <table>
3544
+ <thead>
3545
+ <tr>
3546
+ <th>Attribute</th>
3547
+ <th>Type</th>
3548
+ <th>Description</th>
3549
+ </tr>
3550
+ </thead>
3551
+ <tbody>
3552
+ <tr>
3553
+ <td><code>name</code></td>
3554
+ <td><code>String</code></td>
3555
+ <td>Unique identifier</td>
3556
+ </tr>
3557
+ <tr>
3558
+ <td><code>description</code></td>
3559
+ <td><code>String</code>, <code>nil</code></td>
3560
+ <td>Human-readable description</td>
3561
+ </tr>
3562
+ <tr>
3563
+ <td><code>template</code></td>
3564
+ <td><code>Symbol</code>, <code>nil</code></td>
3565
+ <td>Prompt template identifier</td>
3566
+ </tr>
3567
+ <tr>
3568
+ <td><code>system_prompt</code></td>
3569
+ <td><code>String</code>, <code>nil</code></td>
3570
+ <td>Inline system prompt</td>
3571
+ </tr>
3572
+ <tr>
3573
+ <td><code>skills</code></td>
3574
+ <td><code>Array&lt;Symbol&gt;</code>, <code>nil</code></td>
3575
+ <td>Constructor-provided skill template IDs (nil if none)</td>
3576
+ </tr>
3577
+ <tr>
3578
+ <td><code>local_tools</code></td>
3579
+ <td><code>Array</code></td>
3580
+ <td>Locally defined tools</td>
3581
+ </tr>
3582
+ <tr>
3583
+ <td><code>mcp_clients</code></td>
3584
+ <td><code>Hash&lt;String, MCP::Client&gt;</code></td>
3585
+ <td>Connected MCP clients, keyed by server name</td>
3586
+ </tr>
3587
+ <tr>
3588
+ <td><code>mcp_tools</code></td>
3589
+ <td><code>Array&lt;Tool&gt;</code></td>
3590
+ <td>Tools discovered from MCP servers</td>
3591
+ </tr>
3592
+ <tr>
3593
+ <td><code>memory</code></td>
3594
+ <td><code>Memory</code></td>
3595
+ <td>Inherent memory (used when standalone, not in network)</td>
3596
+ </tr>
3597
+ <tr>
3598
+ <td><code>bus</code></td>
3599
+ <td><code>TypedBus::MessageBus</code>, <code>nil</code></td>
3600
+ <td>Message bus instance (nil if not configured)</td>
3601
+ </tr>
3602
+ <tr>
3603
+ <td><code>outbox</code></td>
3604
+ <td><code>Hash</code></td>
3605
+ <td>Sent messages tracked by composite key with status and replies</td>
3606
+ </tr>
3607
+ <tr>
3608
+ <td><code>config</code></td>
3609
+ <td><code>RunConfig</code></td>
3610
+ <td>Effective RunConfig (merged from constructor kwargs and passed-in config)</td>
3611
+ </tr>
3612
+ <tr>
3613
+ <td><code>mcp_config</code></td>
3614
+ <td><code>Symbol</code>, <code>Array</code></td>
3615
+ <td>Build-time MCP configuration (raw, unresolved)</td>
3616
+ </tr>
3617
+ <tr>
3618
+ <td><code>tools_config</code></td>
3619
+ <td><code>Symbol</code>, <code>Array</code></td>
3620
+ <td>Build-time tools configuration (raw, unresolved)</td>
3621
+ </tr>
3622
+ </tbody>
3623
+ </table>
3624
+ <h2 id="attributes-read-write">Attributes (Read-Write)<a class="headerlink" href="#attributes-read-write" title="Permanent link">&para;</a></h2>
3625
+ <table>
3626
+ <thead>
3627
+ <tr>
3628
+ <th>Attribute</th>
3629
+ <th>Type</th>
3630
+ <th>Default</th>
3631
+ <th>Description</th>
3632
+ </tr>
3633
+ </thead>
3634
+ <tbody>
3635
+ <tr>
3636
+ <td><code>input</code></td>
3637
+ <td><code>IO</code>, <code>nil</code></td>
3638
+ <td><code>nil</code></td>
3639
+ <td>Input stream for user interaction (falls back to <code>$stdin</code>)</td>
3640
+ </tr>
3641
+ <tr>
3642
+ <td><code>output</code></td>
3643
+ <td><code>IO</code>, <code>nil</code></td>
3644
+ <td><code>nil</code></td>
3645
+ <td>Output stream for user interaction (falls back to <code>$stdout</code>)</td>
3646
+ </tr>
3647
+ </tbody>
3648
+ </table>
3649
+ <p>Used by tools like <a href="../tool/#built-in-askuser"><code>AskUser</code></a> that need terminal IO. Set to <code>StringIO</code> for testing.</p>
3650
+ <h2 id="methods">Methods<a class="headerlink" href="#methods" title="Permanent link">&para;</a></h2>
3651
+ <h3 id="run">run<a class="headerlink" href="#run" title="Permanent link">&para;</a></h3>
3652
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">message</span><span class="p">,</span><span class="w"> </span><span class="o">**</span><span class="n">kwargs</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
3653
+ </span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="c1"># =&gt; RobotResult</span>
3654
+ </span></code></pre></div>
3655
+ <p>Primary execution method. Sends a message to the LLM with memory/MCP/tools resolution and returns a <code>RobotResult</code>.</p>
3656
+ <p><strong>Parameters:</strong></p>
3657
+ <table>
3658
+ <thead>
3659
+ <tr>
3660
+ <th>Name</th>
3661
+ <th>Type</th>
3662
+ <th>Default</th>
3663
+ <th>Description</th>
3664
+ </tr>
3665
+ </thead>
3666
+ <tbody>
3667
+ <tr>
3668
+ <td><code>message</code></td>
3669
+ <td><code>String</code></td>
3670
+ <td><strong>required</strong></td>
3671
+ <td>The user message to send</td>
3672
+ </tr>
3673
+ <tr>
3674
+ <td><code>network</code></td>
3675
+ <td><code>NetworkRun</code>, <code>nil</code></td>
3676
+ <td><code>nil</code></td>
3677
+ <td>Network context (passed internally)</td>
3678
+ </tr>
3679
+ <tr>
3680
+ <td><code>network_memory</code></td>
3681
+ <td><code>Memory</code>, <code>nil</code></td>
3682
+ <td><code>nil</code></td>
3683
+ <td>Shared network memory</td>
3684
+ </tr>
3685
+ <tr>
3686
+ <td><code>memory</code></td>
3687
+ <td><code>Memory</code>, <code>Hash</code>, <code>nil</code></td>
3688
+ <td><code>nil</code></td>
3689
+ <td>Runtime memory to merge</td>
3690
+ </tr>
3691
+ <tr>
3692
+ <td><code>mcp</code></td>
3693
+ <td><code>Symbol</code>, <code>Array</code></td>
3694
+ <td><code>:none</code></td>
3695
+ <td>Runtime MCP override</td>
3696
+ </tr>
3697
+ <tr>
3698
+ <td><code>tools</code></td>
3699
+ <td><code>Symbol</code>, <code>Array</code></td>
3700
+ <td><code>:none</code></td>
3701
+ <td>Runtime tools override</td>
3702
+ </tr>
3703
+ <tr>
3704
+ <td><code>**kwargs</code></td>
3705
+ <td><code>Hash</code></td>
3706
+ <td><code>{}</code></td>
3707
+ <td>Additional keyword arguments passed to <code>Agent#ask</code></td>
3708
+ </tr>
3709
+ <tr>
3710
+ <td><code>&amp;block</code></td>
3711
+ <td><code>Proc</code></td>
3712
+ <td><code>nil</code></td>
3713
+ <td>Per-call streaming block, receives each content chunk</td>
3714
+ </tr>
3715
+ </tbody>
3716
+ </table>
3717
+ <p>When both a stored <code>on_content</code> callback and a runtime block are provided, both fire (stored first, then runtime block).</p>
3718
+ <p><strong>Returns:</strong> <code>RobotResult</code></p>
3719
+ <p><strong>Examples:</strong></p>
3720
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="c1"># Simple message</span>
3721
+ </span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;What is 2+2?&quot;</span><span class="p">)</span>
3722
+ </span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>
3723
+ </span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="c1"># With runtime memory</span>
3724
+ </span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Summarize the data&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">memory</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="ss">data</span><span class="p">:</span><span class="w"> </span><span class="n">report</span><span class="w"> </span><span class="p">})</span>
3725
+ </span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a>
3726
+ </span><span id="__span-4-7"><a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="c1"># With per-call streaming block</span>
3727
+ </span><span id="__span-4-8"><a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Tell me a story&quot;</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="o">|</span><span class="n">chunk</span><span class="o">|</span><span class="w"> </span><span class="nb">print</span><span class="w"> </span><span class="n">chunk</span><span class="o">.</span><span class="n">content</span><span class="w"> </span><span class="p">}</span>
3728
+ </span><span id="__span-4-9"><a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a>
3729
+ </span><span id="__span-4-10"><a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="c1"># With runtime overrides</span>
3730
+ </span><span id="__span-4-11"><a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Help me&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">mcp</span><span class="p">:</span><span class="w"> </span><span class="ss">:none</span><span class="p">,</span><span class="w"> </span><span class="ss">tools</span><span class="p">:</span><span class="w"> </span><span class="ss">:none</span><span class="p">)</span>
3731
+ </span></code></pre></div>
3732
+ <h3 id="model">model<a class="headerlink" href="#model" title="Permanent link">&para;</a></h3>
3733
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="n">robot</span><span class="o">.</span><span class="n">model</span><span class="w"> </span><span class="c1"># =&gt; &quot;claude-sonnet-4&quot; or nil</span>
3734
+ </span></code></pre></div>
3735
+ <p>Returns the model ID string. Resolves through the underlying chat object.</p>
3736
+ <h3 id="update">update<a class="headerlink" href="#update" title="Permanent link">&para;</a></h3>
3737
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="n">robot</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
3738
+ </span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3739
+ </span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="w"> </span><span class="ss">context</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3740
+ </span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3741
+ </span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="w"> </span><span class="ss">model</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3742
+ </span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a><span class="w"> </span><span class="ss">temperature</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
3743
+ </span><span id="__span-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="w"> </span><span class="o">**</span><span class="n">kwargs</span>
3744
+ </span><span id="__span-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a><span class="p">)</span>
3745
+ </span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="c1"># =&gt; self</span>
3746
+ </span></code></pre></div>
3747
+ <p>Reconfigure the robot after construction. Returns <code>self</code> for chaining.</p>
3748
+ <h3 id="with_-methods-chaining">with_* Methods (Chaining)<a class="headerlink" href="#with_-methods-chaining" title="Permanent link">&para;</a></h3>
3749
+ <p>All <code>with_*</code> methods delegate to the persistent <code>@chat</code> and return <code>self</code> for chaining:</p>
3750
+ <table>
3751
+ <thead>
3752
+ <tr>
3753
+ <th>Method</th>
3754
+ <th>Description</th>
3755
+ </tr>
3756
+ </thead>
3757
+ <tbody>
3758
+ <tr>
3759
+ <td><code>with_model(model_id)</code></td>
3760
+ <td>Change the LLM model</td>
3761
+ </tr>
3762
+ <tr>
3763
+ <td><code>with_temperature(temp)</code></td>
3764
+ <td>Set temperature</td>
3765
+ </tr>
3766
+ <tr>
3767
+ <td><code>with_top_p(value)</code></td>
3768
+ <td>Set nucleus sampling</td>
3769
+ </tr>
3770
+ <tr>
3771
+ <td><code>with_top_k(value)</code></td>
3772
+ <td>Set top-k sampling</td>
3773
+ </tr>
3774
+ <tr>
3775
+ <td><code>with_max_tokens(value)</code></td>
3776
+ <td>Set max response tokens</td>
3777
+ </tr>
3778
+ <tr>
3779
+ <td><code>with_presence_penalty(value)</code></td>
3780
+ <td>Set presence penalty</td>
3781
+ </tr>
3782
+ <tr>
3783
+ <td><code>with_frequency_penalty(value)</code></td>
3784
+ <td>Set frequency penalty</td>
3785
+ </tr>
3786
+ <tr>
3787
+ <td><code>with_stop(sequences)</code></td>
3788
+ <td>Set stop sequences</td>
3789
+ </tr>
3790
+ <tr>
3791
+ <td><code>with_instructions(prompt)</code></td>
3792
+ <td>Set system instructions</td>
3793
+ </tr>
3794
+ <tr>
3795
+ <td><code>with_tool(tool)</code></td>
3796
+ <td>Add a single tool</td>
3797
+ </tr>
3798
+ <tr>
3799
+ <td><code>with_tools(*tools)</code></td>
3800
+ <td>Add multiple tools</td>
3801
+ </tr>
3802
+ <tr>
3803
+ <td><code>with_params(**params)</code></td>
3804
+ <td>Set additional parameters</td>
3805
+ </tr>
3806
+ <tr>
3807
+ <td><code>with_headers(**headers)</code></td>
3808
+ <td>Set custom headers</td>
3809
+ </tr>
3810
+ <tr>
3811
+ <td><code>with_schema(schema)</code></td>
3812
+ <td>Set output schema</td>
3813
+ </tr>
3814
+ <tr>
3815
+ <td><code>with_context(**ctx)</code></td>
3816
+ <td>Set context</td>
3817
+ </tr>
3818
+ <tr>
3819
+ <td><code>with_thinking(opts)</code></td>
3820
+ <td>Enable extended thinking</td>
3821
+ </tr>
3822
+ <tr>
3823
+ <td><code>with_bus(bus)</code></td>
3824
+ <td>Connect to a message bus (creates one if nil)</td>
3825
+ </tr>
3826
+ </tbody>
3827
+ </table>
3828
+ <p><strong>Example:</strong></p>
3829
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bot&quot;</span><span class="p">)</span>
3830
+ </span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a><span class="n">robot</span>
3831
+ </span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a><span class="w"> </span><span class="o">.</span><span class="n">with_model</span><span class="p">(</span><span class="s2">&quot;claude-sonnet-4&quot;</span><span class="p">)</span>
3832
+ </span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a><span class="w"> </span><span class="o">.</span><span class="n">with_temperature</span><span class="p">(</span><span class="mi">0</span><span class="o">.</span><span class="mi">7</span><span class="p">)</span>
3833
+ </span><span id="__span-7-5"><a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a><span class="w"> </span><span class="o">.</span><span class="n">with_instructions</span><span class="p">(</span><span class="s2">&quot;Be concise.&quot;</span><span class="p">)</span>
3834
+ </span><span id="__span-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a><span class="w"> </span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Hello&quot;</span><span class="p">)</span>
3835
+ </span></code></pre></div>
3836
+ <h3 id="with_template">with_template<a class="headerlink" href="#with_template" title="Permanent link">&para;</a></h3>
3837
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="n">robot</span><span class="o">.</span><span class="n">with_template</span><span class="p">(</span><span class="ss">:assistant</span><span class="p">,</span><span class="w"> </span><span class="ss">tone</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;friendly&quot;</span><span class="p">)</span>
3838
+ </span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="c1"># =&gt; self</span>
3839
+ </span></code></pre></div>
3840
+ <p>Apply a prompt_manager template. Separate from the delegated <code>with_*</code> methods because it handles template parsing and front matter config.</p>
3841
+ <h3 id="call">call<a class="headerlink" href="#call" title="Permanent link">&para;</a></h3>
3842
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="n">robot</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
3843
+ </span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="c1"># =&gt; SimpleFlow::Result</span>
3844
+ </span></code></pre></div>
3845
+ <p>SimpleFlow step interface. Extracts the message from <code>result.context[:run_params]</code>, calls <code>run</code>, and wraps the output in a continued <code>SimpleFlow::Result</code>.</p>
3846
+ <p>Override this method in subclasses for custom routing logic (e.g., classifiers).</p>
3847
+ <h3 id="reset_memory">reset_memory<a class="headerlink" href="#reset_memory" title="Permanent link">&para;</a></h3>
3848
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="n">robot</span><span class="o">.</span><span class="n">reset_memory</span>
3849
+ </span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="c1"># =&gt; self</span>
3850
+ </span></code></pre></div>
3851
+ <p>Reset the robot's inherent memory to its initial state.</p>
3852
+ <h3 id="send_message">send_message<a class="headerlink" href="#send_message" title="Permanent link">&para;</a></h3>
3853
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="n">message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">send_message</span><span class="p">(</span><span class="ss">to</span><span class="p">:</span><span class="w"> </span><span class="ss">:bob</span><span class="p">,</span><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Tell me a joke.&quot;</span><span class="p">)</span>
3854
+ </span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a><span class="c1"># =&gt; RobotMessage</span>
3855
+ </span></code></pre></div>
3856
+ <p>Publish a message to another robot's bus channel. Increments the internal message counter, creates a <code>RobotMessage</code>, tracks it in the outbox, and publishes to the target channel.</p>
3857
+ <p><strong>Parameters:</strong></p>
3858
+ <table>
3859
+ <thead>
3860
+ <tr>
3861
+ <th>Name</th>
3862
+ <th>Type</th>
3863
+ <th>Description</th>
3864
+ </tr>
3865
+ </thead>
3866
+ <tbody>
3867
+ <tr>
3868
+ <td><code>to</code></td>
3869
+ <td><code>String</code>, <code>Symbol</code></td>
3870
+ <td>Target robot's channel name</td>
3871
+ </tr>
3872
+ <tr>
3873
+ <td><code>content</code></td>
3874
+ <td><code>String</code>, <code>Hash</code></td>
3875
+ <td>Message payload</td>
3876
+ </tr>
3877
+ </tbody>
3878
+ </table>
3879
+ <p><strong>Returns:</strong> <code>RobotMessage</code></p>
3880
+ <p><strong>Raises:</strong> <code>BusError</code> if no bus is configured.</p>
3881
+ <h3 id="send_reply">send_reply<a class="headerlink" href="#send_reply" title="Permanent link">&para;</a></h3>
3882
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="n">reply</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">send_reply</span><span class="p">(</span><span class="ss">to</span><span class="p">:</span><span class="w"> </span><span class="ss">:alice</span><span class="p">,</span><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Here&#39;s a joke...&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">in_reply_to</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;alice:1&quot;</span><span class="p">)</span>
3883
+ </span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a><span class="c1"># =&gt; RobotMessage</span>
3884
+ </span></code></pre></div>
3885
+ <p>Publish a correlated reply to a specific message. The <code>in_reply_to</code> composite key links this reply to the original message.</p>
3886
+ <p><strong>Parameters:</strong></p>
3887
+ <table>
3888
+ <thead>
3889
+ <tr>
3890
+ <th>Name</th>
3891
+ <th>Type</th>
3892
+ <th>Description</th>
3893
+ </tr>
3894
+ </thead>
3895
+ <tbody>
3896
+ <tr>
3897
+ <td><code>to</code></td>
3898
+ <td><code>String</code>, <code>Symbol</code></td>
3899
+ <td>Target robot's channel name</td>
3900
+ </tr>
3901
+ <tr>
3902
+ <td><code>content</code></td>
3903
+ <td><code>String</code>, <code>Hash</code></td>
3904
+ <td>Reply payload</td>
3905
+ </tr>
3906
+ <tr>
3907
+ <td><code>in_reply_to</code></td>
3908
+ <td><code>String</code></td>
3909
+ <td>Composite key of the original message (e.g., <code>"alice:1"</code>)</td>
3910
+ </tr>
3911
+ </tbody>
3912
+ </table>
3913
+ <p><strong>Returns:</strong> <code>RobotMessage</code></p>
3914
+ <p><strong>Raises:</strong> <code>BusError</code> if no bus is configured.</p>
3915
+ <h3 id="on_message">on_message<a class="headerlink" href="#on_message" title="Permanent link">&para;</a></h3>
3916
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="n">robot</span><span class="o">.</span><span class="n">on_message</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="o">|</span><span class="n">message</span><span class="o">|</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="n">message</span><span class="o">.</span><span class="n">content</span><span class="w"> </span><span class="p">}</span>
3917
+ </span><span id="__span-13-2"><a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a><span class="c1"># =&gt; self</span>
3918
+ </span></code></pre></div>
3919
+ <p>Register a custom handler for incoming bus messages. Block arity controls delivery handling:</p>
3920
+ <ul>
3921
+ <li><strong>1 argument</strong> <code>|message|</code> — auto-acknowledges the delivery before calling the block</li>
3922
+ <li><strong>2 arguments</strong> <code>|delivery, message|</code> — manual mode; you call <code>delivery.ack!</code> or <code>delivery.nack!</code></li>
3923
+ </ul>
3924
+ <p><strong>Examples:</strong></p>
3925
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="c1"># Auto-ack mode (1 arg)</span>
3926
+ </span><span id="__span-14-2"><a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a><span class="n">robot</span><span class="o">.</span><span class="n">on_message</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">message</span><span class="o">|</span>
3927
+ </span><span id="__span-14-3"><a id="__codelineno-14-3" name="__codelineno-14-3" href="#__codelineno-14-3"></a><span class="w"> </span><span class="n">joke</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">run</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span><span class="o">.</span><span class="n">last_text_content</span>
3928
+ </span><span id="__span-14-4"><a id="__codelineno-14-4" name="__codelineno-14-4" href="#__codelineno-14-4"></a><span class="w"> </span><span class="n">send_reply</span><span class="p">(</span><span class="ss">to</span><span class="p">:</span><span class="w"> </span><span class="n">message</span><span class="o">.</span><span class="n">from</span><span class="o">.</span><span class="n">to_sym</span><span class="p">,</span><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="n">joke</span><span class="p">,</span><span class="w"> </span><span class="ss">in_reply_to</span><span class="p">:</span><span class="w"> </span><span class="n">message</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
3929
+ </span><span id="__span-14-5"><a id="__codelineno-14-5" name="__codelineno-14-5" href="#__codelineno-14-5"></a><span class="k">end</span>
3930
+ </span><span id="__span-14-6"><a id="__codelineno-14-6" name="__codelineno-14-6" href="#__codelineno-14-6"></a>
3931
+ </span><span id="__span-14-7"><a id="__codelineno-14-7" name="__codelineno-14-7" href="#__codelineno-14-7"></a><span class="c1"># Manual mode (2 args)</span>
3932
+ </span><span id="__span-14-8"><a id="__codelineno-14-8" name="__codelineno-14-8" href="#__codelineno-14-8"></a><span class="n">robot</span><span class="o">.</span><span class="n">on_message</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">delivery</span><span class="p">,</span><span class="w"> </span><span class="n">message</span><span class="o">|</span>
3933
+ </span><span id="__span-14-9"><a id="__codelineno-14-9" name="__codelineno-14-9" href="#__codelineno-14-9"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">message</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">to_s</span><span class="o">.</span><span class="n">length</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">10</span>
3934
+ </span><span id="__span-14-10"><a id="__codelineno-14-10" name="__codelineno-14-10" href="#__codelineno-14-10"></a><span class="w"> </span><span class="n">delivery</span><span class="o">.</span><span class="n">ack!</span>
3935
+ </span><span id="__span-14-11"><a id="__codelineno-14-11" name="__codelineno-14-11" href="#__codelineno-14-11"></a><span class="w"> </span><span class="n">send_reply</span><span class="p">(</span><span class="ss">to</span><span class="p">:</span><span class="w"> </span><span class="n">message</span><span class="o">.</span><span class="n">from</span><span class="o">.</span><span class="n">to_sym</span><span class="p">,</span><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Got it!&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">in_reply_to</span><span class="p">:</span><span class="w"> </span><span class="n">message</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
3936
+ </span><span id="__span-14-12"><a id="__codelineno-14-12" name="__codelineno-14-12" href="#__codelineno-14-12"></a><span class="w"> </span><span class="k">else</span>
3937
+ </span><span id="__span-14-13"><a id="__codelineno-14-13" name="__codelineno-14-13" href="#__codelineno-14-13"></a><span class="w"> </span><span class="n">delivery</span><span class="o">.</span><span class="n">nack!</span>
3938
+ </span><span id="__span-14-14"><a id="__codelineno-14-14" name="__codelineno-14-14" href="#__codelineno-14-14"></a><span class="w"> </span><span class="k">end</span>
3939
+ </span><span id="__span-14-15"><a id="__codelineno-14-15" name="__codelineno-14-15" href="#__codelineno-14-15"></a><span class="k">end</span>
3940
+ </span></code></pre></div>
3941
+ <h3 id="spawn">spawn<a class="headerlink" href="#spawn" title="Permanent link">&para;</a></h3>
3942
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="n">child</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span>
3943
+ </span><span id="__span-15-2"><a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;specialist&quot;</span><span class="p">,</span>
3944
+ </span><span id="__span-15-3"><a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You are a specialist.&quot;</span>
3945
+ </span><span id="__span-15-4"><a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a><span class="p">)</span>
3946
+ </span><span id="__span-15-5"><a id="__codelineno-15-5" name="__codelineno-15-5" href="#__codelineno-15-5"></a><span class="c1"># =&gt; RobotLab::Robot (connected to same bus)</span>
3947
+ </span></code></pre></div>
3948
+ <p>Create a new robot on the same message bus. If the parent has no bus, one is created automatically and the parent is connected to it.</p>
3949
+ <p><strong>Parameters:</strong></p>
3950
+ <table>
3951
+ <thead>
3952
+ <tr>
3953
+ <th>Name</th>
3954
+ <th>Type</th>
3955
+ <th>Default</th>
3956
+ <th>Description</th>
3957
+ </tr>
3958
+ </thead>
3959
+ <tbody>
3960
+ <tr>
3961
+ <td><code>name</code></td>
3962
+ <td><code>String</code></td>
3963
+ <td><code>"robot"</code></td>
3964
+ <td>Name for the new robot</td>
3965
+ </tr>
3966
+ <tr>
3967
+ <td><code>system_prompt</code></td>
3968
+ <td><code>String</code>, <code>nil</code></td>
3969
+ <td><code>nil</code></td>
3970
+ <td>Inline system prompt</td>
3971
+ </tr>
3972
+ <tr>
3973
+ <td><code>template</code></td>
3974
+ <td><code>Symbol</code>, <code>nil</code></td>
3975
+ <td><code>nil</code></td>
3976
+ <td>Prompt template</td>
3977
+ </tr>
3978
+ <tr>
3979
+ <td><code>local_tools</code></td>
3980
+ <td><code>Array</code></td>
3981
+ <td><code>[]</code></td>
3982
+ <td>Tools for the new robot</td>
3983
+ </tr>
3984
+ <tr>
3985
+ <td><code>**options</code></td>
3986
+ <td><code>Hash</code></td>
3987
+ <td><code>{}</code></td>
3988
+ <td>Additional options passed to <code>RobotLab.build</code></td>
3989
+ </tr>
3990
+ </tbody>
3991
+ </table>
3992
+ <p><strong>Returns:</strong> <code>Robot</code></p>
3993
+ <p><strong>Examples:</strong></p>
3994
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a><span class="c1"># Minimal spawn (bus created automatically)</span>
3995
+ </span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a><span class="n">bot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span>
3996
+ </span><span id="__span-16-3"><a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a><span class="n">bot2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bot</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You are helpful.&quot;</span><span class="p">)</span>
3997
+ </span><span id="__span-16-4"><a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a>
3998
+ </span><span id="__span-16-5"><a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a><span class="c1"># Spawn with template</span>
3999
+ </span><span id="__span-16-6"><a id="__codelineno-16-6" name="__codelineno-16-6" href="#__codelineno-16-6"></a><span class="n">specialist</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dispatcher</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span>
4000
+ </span><span id="__span-16-7"><a id="__codelineno-16-7" name="__codelineno-16-7" href="#__codelineno-16-7"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;billing&quot;</span><span class="p">,</span>
4001
+ </span><span id="__span-16-8"><a id="__codelineno-16-8" name="__codelineno-16-8" href="#__codelineno-16-8"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:billing</span><span class="p">,</span>
4002
+ </span><span id="__span-16-9"><a id="__codelineno-16-9" name="__codelineno-16-9" href="#__codelineno-16-9"></a><span class="w"> </span><span class="ss">local_tools</span><span class="p">:</span><span class="w"> </span><span class="o">[</span><span class="no">InvoiceLookup</span><span class="o">]</span>
4003
+ </span><span id="__span-16-10"><a id="__codelineno-16-10" name="__codelineno-16-10" href="#__codelineno-16-10"></a><span class="p">)</span>
4004
+ </span><span id="__span-16-11"><a id="__codelineno-16-11" name="__codelineno-16-11" href="#__codelineno-16-11"></a>
4005
+ </span><span id="__span-16-12"><a id="__codelineno-16-12" name="__codelineno-16-12" href="#__codelineno-16-12"></a><span class="c1"># Fan-out: multiple robots with the same name</span>
4006
+ </span><span id="__span-16-13"><a id="__codelineno-16-13" name="__codelineno-16-13" href="#__codelineno-16-13"></a><span class="n">worker1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bot</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;worker&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Worker 1&quot;</span><span class="p">)</span>
4007
+ </span><span id="__span-16-14"><a id="__codelineno-16-14" name="__codelineno-16-14" href="#__codelineno-16-14"></a><span class="n">worker2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bot</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;worker&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Worker 2&quot;</span><span class="p">)</span>
4008
+ </span><span id="__span-16-15"><a id="__codelineno-16-15" name="__codelineno-16-15" href="#__codelineno-16-15"></a><span class="c1"># Messages sent to :worker are delivered to both</span>
4009
+ </span></code></pre></div>
4010
+ <h3 id="with_bus">with_bus<a class="headerlink" href="#with_bus" title="Permanent link">&para;</a></h3>
4011
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="n">robot</span><span class="o">.</span><span class="n">with_bus</span><span class="p">(</span><span class="n">bus</span><span class="p">)</span>
4012
+ </span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a><span class="c1"># =&gt; self</span>
4013
+ </span></code></pre></div>
4014
+ <p>Connect the robot to a message bus after creation. If called without an argument and the robot has no bus, a new one is created. Returns <code>self</code> for chaining.</p>
4015
+ <p><strong>Parameters:</strong></p>
4016
+ <table>
4017
+ <thead>
4018
+ <tr>
4019
+ <th>Name</th>
4020
+ <th>Type</th>
4021
+ <th>Default</th>
4022
+ <th>Description</th>
4023
+ </tr>
4024
+ </thead>
4025
+ <tbody>
4026
+ <tr>
4027
+ <td><code>bus</code></td>
4028
+ <td><code>TypedBus::MessageBus</code>, <code>nil</code></td>
4029
+ <td><code>nil</code></td>
4030
+ <td>Bus to join (creates one if nil and robot has no bus)</td>
4031
+ </tr>
4032
+ </tbody>
4033
+ </table>
4034
+ <p><strong>Returns:</strong> <code>self</code></p>
4035
+ <p><strong>Examples:</strong></p>
4036
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a><span class="c1"># Join an existing bus</span>
4037
+ </span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a><span class="n">bot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bot&quot;</span><span class="p">)</span>
4038
+ </span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a><span class="n">bot</span><span class="o">.</span><span class="n">with_bus</span><span class="p">(</span><span class="n">some_bus</span><span class="p">)</span>
4039
+ </span><span id="__span-18-4"><a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a>
4040
+ </span><span id="__span-18-5"><a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a><span class="c1"># Create a bus on demand</span>
4041
+ </span><span id="__span-18-6"><a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-6"></a><span class="n">bot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bot&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">with_bus</span>
4042
+ </span><span id="__span-18-7"><a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-7"></a>
4043
+ </span><span id="__span-18-8"><a id="__codelineno-18-8" name="__codelineno-18-8" href="#__codelineno-18-8"></a><span class="c1"># Switch buses</span>
4044
+ </span><span id="__span-18-9"><a id="__codelineno-18-9" name="__codelineno-18-9" href="#__codelineno-18-9"></a><span class="n">bot</span><span class="o">.</span><span class="n">with_bus</span><span class="p">(</span><span class="n">bus1</span><span class="p">)</span><span class="w"> </span><span class="c1"># joins bus1</span>
4045
+ </span><span id="__span-18-10"><a id="__codelineno-18-10" name="__codelineno-18-10" href="#__codelineno-18-10"></a><span class="n">bot</span><span class="o">.</span><span class="n">with_bus</span><span class="p">(</span><span class="n">bus2</span><span class="p">)</span><span class="w"> </span><span class="c1"># leaves bus1, joins bus2</span>
4046
+ </span></code></pre></div>
4047
+ <h3 id="disconnect">disconnect<a class="headerlink" href="#disconnect" title="Permanent link">&para;</a></h3>
4048
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-19-1"><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="n">robot</span><span class="o">.</span><span class="n">disconnect</span>
4049
+ </span><span id="__span-19-2"><a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a><span class="c1"># =&gt; self</span>
4050
+ </span></code></pre></div>
4051
+ <p>Disconnect from all MCP servers and bus channels.</p>
4052
+ <h3 id="to_h">to_h<a class="headerlink" href="#to_h" title="Permanent link">&para;</a></h3>
4053
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-20-1"><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a><span class="n">robot</span><span class="o">.</span><span class="n">to_h</span>
4054
+ </span><span id="__span-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a><span class="c1"># =&gt; Hash</span>
4055
+ </span></code></pre></div>
4056
+ <p>Returns a hash representation of the robot including name, description, template, skills, system_prompt, local_tools, mcp_tools, mcp_config, tools_config, mcp_servers, model, and bus (true if configured, omitted otherwise). Nil values are compacted out.</p>
4057
+ <h2 id="memory-behavior">Memory Behavior<a class="headerlink" href="#memory-behavior" title="Permanent link">&para;</a></h2>
4058
+ <ul>
4059
+ <li><strong>Standalone</strong>: Robot uses its own inherent <code>Memory</code> instance (<code>robot.memory</code>).</li>
4060
+ <li><strong>In a Network</strong>: Robot uses the network's shared memory (passed via <code>network_memory:</code>).</li>
4061
+ </ul>
4062
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-21-1"><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a><span class="c1"># Standalone memory access</span>
4063
+ </span><span id="__span-21-2"><a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a><span class="n">robot</span><span class="o">.</span><span class="n">memory</span><span class="o">[</span><span class="ss">:user_id</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">123</span>
4064
+ </span><span id="__span-21-3"><a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a><span class="n">robot</span><span class="o">.</span><span class="n">memory</span><span class="o">[</span><span class="ss">:user_id</span><span class="o">]</span><span class="w"> </span><span class="c1"># =&gt; 123</span>
4065
+ </span><span id="__span-21-4"><a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-4"></a>
4066
+ </span><span id="__span-21-5"><a id="__codelineno-21-5" name="__codelineno-21-5" href="#__codelineno-21-5"></a><span class="c1"># Reset standalone memory</span>
4067
+ </span><span id="__span-21-6"><a id="__codelineno-21-6" name="__codelineno-21-6" href="#__codelineno-21-6"></a><span class="n">robot</span><span class="o">.</span><span class="n">reset_memory</span>
4068
+ </span></code></pre></div>
4069
+ <h2 id="templates">Templates<a class="headerlink" href="#templates" title="Permanent link">&para;</a></h2>
4070
+ <p>Templates are <code>.md</code> files with optional YAML front matter, loaded via <code>prompt_manager</code>. The <code>template:</code> parameter maps to a file path relative to the configured template directory:</p>
4071
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-22-1"><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a><span class="c1"># template: :assistant =&gt; prompts/assistant.md</span>
4072
+ </span><span id="__span-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bot&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:assistant</span><span class="p">,</span><span class="w"> </span><span class="ss">context</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="ss">tone</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;friendly&quot;</span><span class="w"> </span><span class="p">})</span>
4073
+ </span></code></pre></div>
4074
+ <p>Front matter supports two categories of keys:</p>
4075
+ <p><strong>LLM Config:</strong> <code>model</code>, <code>temperature</code>, <code>top_p</code>, <code>top_k</code>, <code>max_tokens</code>, <code>presence_penalty</code>, <code>frequency_penalty</code>, <code>stop</code> — applied to the underlying chat.</p>
4076
+ <p><strong>Robot Extras:</strong> <code>robot_name</code>, <code>description</code>, <code>tools</code>, <code>mcp</code>, <code>skills</code> — applied to the robot's identity and capabilities. Constructor-provided values always take precedence.</p>
4077
+ <table>
4078
+ <thead>
4079
+ <tr>
4080
+ <th>Key</th>
4081
+ <th>Type</th>
4082
+ <th>Description</th>
4083
+ </tr>
4084
+ </thead>
4085
+ <tbody>
4086
+ <tr>
4087
+ <td><code>robot_name</code></td>
4088
+ <td><code>String</code></td>
4089
+ <td>Override robot name (when constructor uses the default <code>"robot"</code>)</td>
4090
+ </tr>
4091
+ <tr>
4092
+ <td><code>description</code></td>
4093
+ <td><code>String</code></td>
4094
+ <td>Human-readable description</td>
4095
+ </tr>
4096
+ <tr>
4097
+ <td><code>tools</code></td>
4098
+ <td><code>Array&lt;String&gt;</code></td>
4099
+ <td>Tool class names resolved via <code>Object.const_get</code></td>
4100
+ </tr>
4101
+ <tr>
4102
+ <td><code>mcp</code></td>
4103
+ <td><code>Array&lt;Hash&gt;</code></td>
4104
+ <td>MCP server configurations</td>
4105
+ </tr>
4106
+ <tr>
4107
+ <td><code>skills</code></td>
4108
+ <td><code>Array&lt;Symbol&gt;</code></td>
4109
+ <td>Skill templates to prepend (recursive, with cycle detection)</td>
4110
+ </tr>
4111
+ </tbody>
4112
+ </table>
4113
+ <h2 id="skills">Skills<a class="headerlink" href="#skills" title="Permanent link">&para;</a></h2>
4114
+ <p>Skills compose robot behaviors from reusable templates. Each skill is a standard <code>.md</code> template whose prompt body is prepended before the main template. Skills are expanded depth-first with automatic cycle detection.</p>
4115
+ <p><strong>Constructor:</strong> <code>skills:</code> accepts <code>Symbol</code> or <code>Array&lt;Symbol&gt;</code>:</p>
4116
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-23-1"><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
4117
+ </span><span id="__span-23-2"><a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;support&quot;</span><span class="p">,</span>
4118
+ </span><span id="__span-23-3"><a id="__codelineno-23-3" name="__codelineno-23-3" href="#__codelineno-23-3"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:support</span><span class="p">,</span>
4119
+ </span><span id="__span-23-4"><a id="__codelineno-23-4" name="__codelineno-23-4" href="#__codelineno-23-4"></a><span class="w"> </span><span class="ss">skills</span><span class="p">:</span><span class="w"> </span><span class="o">[</span><span class="ss">:clarifier</span><span class="p">,</span><span class="w"> </span><span class="ss">:json_responder</span><span class="o">]</span>
4120
+ </span><span id="__span-23-5"><a id="__codelineno-23-5" name="__codelineno-23-5" href="#__codelineno-23-5"></a><span class="p">)</span>
4121
+ </span></code></pre></div>
4122
+ <p><strong>Front matter:</strong> templates can declare skills via <code>skills:</code> key:</p>
4123
+ <div class="language-markdown highlight"><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a>---
4124
+ </span><span id="__span-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a>skills:
4125
+ </span><span id="__span-24-3"><a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a><span class="w"> </span><span class="k">-</span><span class="w"> </span>clarifier
4126
+ </span><span id="__span-24-4"><a id="__codelineno-24-4" name="__codelineno-24-4" href="#__codelineno-24-4"></a><span class="gu"> - json_responder</span>
4127
+ </span><span id="__span-24-5"><a id="__codelineno-24-5" name="__codelineno-24-5" href="#__codelineno-24-5"></a><span class="gu">---</span>
4128
+ </span><span id="__span-24-6"><a id="__codelineno-24-6" name="__codelineno-24-6" href="#__codelineno-24-6"></a>Main template body here.
4129
+ </span></code></pre></div>
4130
+ <p>Constructor <code>skills:</code> and front matter <code>skills:</code> are combined (constructor first, then front matter). Skills can nest (a skill can declare its own <code>skills:</code> in front matter).</p>
4131
+ <p><strong>Config cascade:</strong> skill config merges in processing order (deepest first). Later values override earlier. Constructor kwargs always win.</p>
4132
+ <p><strong>Prompt order:</strong> skill bodies are concatenated in expansion order, followed by the main template body. All are joined with <code>"\n\n"</code> and set as system instructions via a single <code>with_instructions</code> call.</p>
4133
+ <p><strong>Cycle detection:</strong> if skills form a cycle, the duplicate is skipped with a logger warning.</p>
4134
+ <h2 id="runconfig">RunConfig<a class="headerlink" href="#runconfig" title="Permanent link">&para;</a></h2>
4135
+ <p><code>RunConfig</code> provides shared operational defaults that flow through the configuration hierarchy. Pass it via the <code>config:</code> parameter on <code>Robot.new</code> or <code>RobotLab.build</code>.</p>
4136
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-25-1"><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a><span class="n">shared</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">::</span><span class="no">RunConfig</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">model</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;claude-sonnet-4&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">temperature</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="o">.</span><span class="mi">7</span><span class="p">)</span>
4137
+ </span><span id="__span-25-2"><a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></a>
4138
+ </span><span id="__span-25-3"><a id="__codelineno-25-3" name="__codelineno-25-3" href="#__codelineno-25-3"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
4139
+ </span><span id="__span-25-4"><a id="__codelineno-25-4" name="__codelineno-25-4" href="#__codelineno-25-4"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;writer&quot;</span><span class="p">,</span>
4140
+ </span><span id="__span-25-5"><a id="__codelineno-25-5" name="__codelineno-25-5" href="#__codelineno-25-5"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You write creatively.&quot;</span><span class="p">,</span>
4141
+ </span><span id="__span-25-6"><a id="__codelineno-25-6" name="__codelineno-25-6" href="#__codelineno-25-6"></a><span class="w"> </span><span class="ss">config</span><span class="p">:</span><span class="w"> </span><span class="n">shared</span><span class="p">,</span>
4142
+ </span><span id="__span-25-7"><a id="__codelineno-25-7" name="__codelineno-25-7" href="#__codelineno-25-7"></a><span class="w"> </span><span class="ss">temperature</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="o">.</span><span class="mi">9</span><span class="w"> </span><span class="c1"># explicit kwargs override config</span>
4143
+ </span><span id="__span-25-8"><a id="__codelineno-25-8" name="__codelineno-25-8" href="#__codelineno-25-8"></a><span class="p">)</span>
4144
+ </span><span id="__span-25-9"><a id="__codelineno-25-9" name="__codelineno-25-9" href="#__codelineno-25-9"></a>
4145
+ </span><span id="__span-25-10"><a id="__codelineno-25-10" name="__codelineno-25-10" href="#__codelineno-25-10"></a><span class="n">robot</span><span class="o">.</span><span class="n">config</span><span class="w"> </span><span class="c1">#=&gt; RunConfig with model: &quot;claude-sonnet-4&quot;, temperature: 0.9, ...</span>
4146
+ </span></code></pre></div>
4147
+ <p>RunConfig fields: <code>model</code>, <code>temperature</code>, <code>top_p</code>, <code>top_k</code>, <code>max_tokens</code>, <code>presence_penalty</code>, <code>frequency_penalty</code>, <code>stop</code>, <code>mcp</code>, <code>tools</code>, <code>on_tool_call</code>, <code>on_tool_result</code>, <code>on_content</code>, <code>bus</code>, <code>enable_cache</code>.</p>
4148
+ <p>See <a href="../../../getting-started/configuration/#runconfig-shared-operational-defaults">Configuration: RunConfig</a> for full details.</p>
4149
+ <h2 id="streaming">Streaming<a class="headerlink" href="#streaming" title="Permanent link">&para;</a></h2>
4150
+ <p>Robots support two complementary approaches for streaming LLM content in real-time.</p>
4151
+ <h3 id="the-chunk-object">The Chunk Object<a class="headerlink" href="#the-chunk-object" title="Permanent link">&para;</a></h3>
4152
+ <p>Both callbacks and blocks receive a <a href="https://rubyllm.com/streaming/#basic-streaming"><code>RubyLLM::Chunk</code></a> (subclass of <code>RubyLLM::Message</code>). Key accessors:</p>
4153
+ <table>
4154
+ <thead>
4155
+ <tr>
4156
+ <th>Accessor</th>
4157
+ <th>Type</th>
4158
+ <th>Description</th>
4159
+ </tr>
4160
+ </thead>
4161
+ <tbody>
4162
+ <tr>
4163
+ <td><code>content</code></td>
4164
+ <td><code>String</code>, <code>nil</code></td>
4165
+ <td>The text delta for this chunk (<code>nil</code> on tool-call or usage-only chunks)</td>
4166
+ </tr>
4167
+ <tr>
4168
+ <td><code>role</code></td>
4169
+ <td><code>Symbol</code></td>
4170
+ <td>Always <code>:assistant</code></td>
4171
+ </tr>
4172
+ <tr>
4173
+ <td><code>model_id</code></td>
4174
+ <td><code>String</code></td>
4175
+ <td>The LLM model ID</td>
4176
+ </tr>
4177
+ <tr>
4178
+ <td><code>tool_calls</code></td>
4179
+ <td><code>Array</code>, <code>nil</code></td>
4180
+ <td>Tool call deltas (partial JSON arguments)</td>
4181
+ </tr>
4182
+ <tr>
4183
+ <td><code>tool_call?</code></td>
4184
+ <td><code>Boolean</code></td>
4185
+ <td>Whether this chunk contains tool call data</td>
4186
+ </tr>
4187
+ <tr>
4188
+ <td><code>thinking</code></td>
4189
+ <td><code>Thinking</code>, <code>nil</code></td>
4190
+ <td>Extended thinking delta (Anthropic only)</td>
4191
+ </tr>
4192
+ <tr>
4193
+ <td><code>input_tokens</code></td>
4194
+ <td><code>Integer</code>, <code>nil</code></td>
4195
+ <td>Input token count (populated on final chunk)</td>
4196
+ </tr>
4197
+ <tr>
4198
+ <td><code>output_tokens</code></td>
4199
+ <td><code>Integer</code>, <code>nil</code></td>
4200
+ <td>Output token count (populated on final chunk)</td>
4201
+ </tr>
4202
+ <tr>
4203
+ <td><code>cached_tokens</code></td>
4204
+ <td><code>Integer</code>, <code>nil</code></td>
4205
+ <td>Cached prompt tokens (final chunk)</td>
4206
+ </tr>
4207
+ </tbody>
4208
+ </table>
4209
+ <p>Most chunks carry only <code>content</code> (the text delta). The final chunk(s) carry token usage counts. Tool call chunks have <code>tool_calls</code> instead of <code>content</code>.</p>
4210
+ <h3 id="stored-callback-on_content">Stored Callback (<code>on_content:</code>)<a class="headerlink" href="#stored-callback-on_content" title="Permanent link">&para;</a></h3>
4211
+ <p>Wired at build time via constructor or RunConfig. Fires on every <code>run()</code> call automatically:</p>
4212
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-26-1"><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
4213
+ </span><span id="__span-26-2"><a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;assistant&quot;</span><span class="p">,</span>
4214
+ </span><span id="__span-26-3"><a id="__codelineno-26-3" name="__codelineno-26-3" href="#__codelineno-26-3"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You are helpful.&quot;</span><span class="p">,</span>
4215
+ </span><span id="__span-26-4"><a id="__codelineno-26-4" name="__codelineno-26-4" href="#__codelineno-26-4"></a><span class="w"> </span><span class="ss">on_content</span><span class="p">:</span><span class="w"> </span><span class="o">-&gt;</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">broadcast</span><span class="p">(</span><span class="n">chunk</span><span class="o">.</span><span class="n">content</span><span class="p">)</span><span class="w"> </span><span class="p">}</span>
4216
+ </span><span id="__span-26-5"><a id="__codelineno-26-5" name="__codelineno-26-5" href="#__codelineno-26-5"></a><span class="p">)</span>
4217
+ </span><span id="__span-26-6"><a id="__codelineno-26-6" name="__codelineno-26-6" href="#__codelineno-26-6"></a><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Tell me a story&quot;</span><span class="p">)</span><span class="w"> </span><span class="c1"># streams via stored callback</span>
4218
+ </span></code></pre></div>
4219
+ <p>The <code>on_content</code> callback participates in the RunConfig cascade:</p>
4220
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-27-1"><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-1"></a><span class="n">config</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">::</span><span class="no">RunConfig</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
4221
+ </span><span id="__span-27-2"><a id="__codelineno-27-2" name="__codelineno-27-2" href="#__codelineno-27-2"></a><span class="w"> </span><span class="ss">on_content</span><span class="p">:</span><span class="w"> </span><span class="o">-&gt;</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">log</span><span class="p">(</span><span class="n">chunk</span><span class="o">.</span><span class="n">content</span><span class="p">)</span><span class="w"> </span><span class="p">}</span>
4222
+ </span><span id="__span-27-3"><a id="__codelineno-27-3" name="__codelineno-27-3" href="#__codelineno-27-3"></a><span class="p">)</span>
4223
+ </span><span id="__span-27-4"><a id="__codelineno-27-4" name="__codelineno-27-4" href="#__codelineno-27-4"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bot&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">config</span><span class="p">:</span><span class="w"> </span><span class="n">config</span><span class="p">)</span>
4224
+ </span></code></pre></div>
4225
+ <p>Constructor <code>on_content:</code> overrides RunConfig <code>on_content</code>.</p>
4226
+ <h3 id="per-call-block">Per-Call Block<a class="headerlink" href="#per-call-block" title="Permanent link">&para;</a></h3>
4227
+ <p>Pass a block to <code>run()</code> for one-off streaming:</p>
4228
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-28-1"><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Tell me a story&quot;</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="o">|</span><span class="n">chunk</span><span class="o">|</span><span class="w"> </span><span class="nb">print</span><span class="w"> </span><span class="n">chunk</span><span class="o">.</span><span class="n">content</span><span class="w"> </span><span class="p">}</span>
4229
+ </span></code></pre></div>
4230
+ <h3 id="both-together">Both Together<a class="headerlink" href="#both-together" title="Permanent link">&para;</a></h3>
4231
+ <p>When both exist, both fire — stored callback first, then runtime block:</p>
4232
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-29-1"><a id="__codelineno-29-1" name="__codelineno-29-1" href="#__codelineno-29-1"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
4233
+ </span><span id="__span-29-2"><a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bot&quot;</span><span class="p">,</span>
4234
+ </span><span id="__span-29-3"><a id="__codelineno-29-3" name="__codelineno-29-3" href="#__codelineno-29-3"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You are helpful.&quot;</span><span class="p">,</span>
4235
+ </span><span id="__span-29-4"><a id="__codelineno-29-4" name="__codelineno-29-4" href="#__codelineno-29-4"></a><span class="w"> </span><span class="ss">on_content</span><span class="p">:</span><span class="w"> </span><span class="o">-&gt;</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">log</span><span class="p">(</span><span class="n">chunk</span><span class="o">.</span><span class="n">content</span><span class="p">)</span><span class="w"> </span><span class="p">}</span>
4236
+ </span><span id="__span-29-5"><a id="__codelineno-29-5" name="__codelineno-29-5" href="#__codelineno-29-5"></a><span class="p">)</span>
4237
+ </span><span id="__span-29-6"><a id="__codelineno-29-6" name="__codelineno-29-6" href="#__codelineno-29-6"></a><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Tell me a story&quot;</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="o">|</span><span class="n">chunk</span><span class="o">|</span><span class="w"> </span><span class="n">stream_to_client</span><span class="p">(</span><span class="n">chunk</span><span class="o">.</span><span class="n">content</span><span class="p">)</span><span class="w"> </span><span class="p">}</span>
4238
+ </span><span id="__span-29-7"><a id="__codelineno-29-7" name="__codelineno-29-7" href="#__codelineno-29-7"></a><span class="c1"># log() fires first, then stream_to_client()</span>
4239
+ </span></code></pre></div>
4240
+ <h2 id="configuration-hierarchy">Configuration Hierarchy<a class="headerlink" href="#configuration-hierarchy" title="Permanent link">&para;</a></h2>
4241
+ <p>Tools and MCP servers use hierarchical resolution: <strong>runtime &gt; robot &gt; network &gt; global config</strong>.</p>
4242
+ <div class="language-text highlight"><pre><span></span><code><span id="__span-30-1"><a id="__codelineno-30-1" name="__codelineno-30-1" href="#__codelineno-30-1"></a>RobotLab.config (global)
4243
+ </span><span id="__span-30-2"><a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a> |
4244
+ </span><span id="__span-30-3"><a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a> +-- Network (config:)
4245
+ </span><span id="__span-30-4"><a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-4"></a> | |
4246
+ </span><span id="__span-30-5"><a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-5"></a> | +-- Task (config:)
4247
+ </span><span id="__span-30-6"><a id="__codelineno-30-6" name="__codelineno-30-6" href="#__codelineno-30-6"></a> | | |
4248
+ </span><span id="__span-30-7"><a id="__codelineno-30-7" name="__codelineno-30-7" href="#__codelineno-30-7"></a> | | +-- Robot (config: + build-time mcp:, tools:)
4249
+ </span><span id="__span-30-8"><a id="__codelineno-30-8" name="__codelineno-30-8" href="#__codelineno-30-8"></a> | | |
4250
+ </span><span id="__span-30-9"><a id="__codelineno-30-9" name="__codelineno-30-9" href="#__codelineno-30-9"></a> | | +-- Template front matter
4251
+ </span><span id="__span-30-10"><a id="__codelineno-30-10" name="__codelineno-30-10" href="#__codelineno-30-10"></a> | | |
4252
+ </span><span id="__span-30-11"><a id="__codelineno-30-11" name="__codelineno-30-11" href="#__codelineno-30-11"></a> | | +-- run() call (runtime mcp:, tools:)
4253
+ </span></code></pre></div>
4254
+ <p>Values at each level:</p>
4255
+ <ul>
4256
+ <li><code>:none</code> -- no tools/MCP at this level</li>
4257
+ <li><code>:inherit</code> -- inherit from parent level</li>
4258
+ <li><code>Array</code> -- explicit list of tool names or MCP server configs</li>
4259
+ </ul>
4260
+ <h2 id="examples">Examples<a class="headerlink" href="#examples" title="Permanent link">&para;</a></h2>
4261
+ <h3 id="basic-robot">Basic Robot<a class="headerlink" href="#basic-robot" title="Permanent link">&para;</a></h3>
4262
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-31-1"><a id="__codelineno-31-1" name="__codelineno-31-1" href="#__codelineno-31-1"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
4263
+ </span><span id="__span-31-2"><a id="__codelineno-31-2" name="__codelineno-31-2" href="#__codelineno-31-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;greeter&quot;</span><span class="p">,</span>
4264
+ </span><span id="__span-31-3"><a id="__codelineno-31-3" name="__codelineno-31-3" href="#__codelineno-31-3"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You greet users warmly.&quot;</span>
4265
+ </span><span id="__span-31-4"><a id="__codelineno-31-4" name="__codelineno-31-4" href="#__codelineno-31-4"></a><span class="p">)</span>
4266
+ </span><span id="__span-31-5"><a id="__codelineno-31-5" name="__codelineno-31-5" href="#__codelineno-31-5"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Hello!&quot;</span><span class="p">)</span>
4267
+ </span><span id="__span-31-6"><a id="__codelineno-31-6" name="__codelineno-31-6" href="#__codelineno-31-6"></a><span class="nb">puts</span><span class="w"> </span><span class="n">result</span><span class="o">.</span><span class="n">last_text_content</span>
4268
+ </span></code></pre></div>
4269
+ <h3 id="robot-with-template">Robot with Template<a class="headerlink" href="#robot-with-template" title="Permanent link">&para;</a></h3>
4270
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-32-1"><a id="__codelineno-32-1" name="__codelineno-32-1" href="#__codelineno-32-1"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
4271
+ </span><span id="__span-32-2"><a id="__codelineno-32-2" name="__codelineno-32-2" href="#__codelineno-32-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;support&quot;</span><span class="p">,</span>
4272
+ </span><span id="__span-32-3"><a id="__codelineno-32-3" name="__codelineno-32-3" href="#__codelineno-32-3"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:support</span><span class="p">,</span>
4273
+ </span><span id="__span-32-4"><a id="__codelineno-32-4" name="__codelineno-32-4" href="#__codelineno-32-4"></a><span class="w"> </span><span class="ss">context</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="ss">company</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Acme Corp&quot;</span><span class="w"> </span><span class="p">}</span>
4274
+ </span><span id="__span-32-5"><a id="__codelineno-32-5" name="__codelineno-32-5" href="#__codelineno-32-5"></a><span class="p">)</span>
4275
+ </span><span id="__span-32-6"><a id="__codelineno-32-6" name="__codelineno-32-6" href="#__codelineno-32-6"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;I need help with my order&quot;</span><span class="p">)</span>
4276
+ </span></code></pre></div>
4277
+ <h3 id="robot-with-tools">Robot with Tools<a class="headerlink" href="#robot-with-tools" title="Permanent link">&para;</a></h3>
4278
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-33-1"><a id="__codelineno-33-1" name="__codelineno-33-1" href="#__codelineno-33-1"></a><span class="k">class</span><span class="w"> </span><span class="nc">Calculator</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">RubyLLM</span><span class="o">::</span><span class="no">Tool</span>
4279
+ </span><span id="__span-33-2"><a id="__codelineno-33-2" name="__codelineno-33-2" href="#__codelineno-33-2"></a><span class="w"> </span><span class="n">description</span><span class="w"> </span><span class="s2">&quot;Performs basic arithmetic&quot;</span>
4280
+ </span><span id="__span-33-3"><a id="__codelineno-33-3" name="__codelineno-33-3" href="#__codelineno-33-3"></a><span class="w"> </span><span class="n">param</span><span class="w"> </span><span class="ss">:operation</span><span class="p">,</span><span class="w"> </span><span class="ss">type</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">desc</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;add, subtract, multiply, divide&quot;</span>
4281
+ </span><span id="__span-33-4"><a id="__codelineno-33-4" name="__codelineno-33-4" href="#__codelineno-33-4"></a><span class="w"> </span><span class="n">param</span><span class="w"> </span><span class="ss">:a</span><span class="p">,</span><span class="w"> </span><span class="ss">type</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;number&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">desc</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;First operand&quot;</span>
4282
+ </span><span id="__span-33-5"><a id="__codelineno-33-5" name="__codelineno-33-5" href="#__codelineno-33-5"></a><span class="w"> </span><span class="n">param</span><span class="w"> </span><span class="ss">:b</span><span class="p">,</span><span class="w"> </span><span class="ss">type</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;number&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">desc</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Second operand&quot;</span>
4283
+ </span><span id="__span-33-6"><a id="__codelineno-33-6" name="__codelineno-33-6" href="#__codelineno-33-6"></a>
4284
+ </span><span id="__span-33-7"><a id="__codelineno-33-7" name="__codelineno-33-7" href="#__codelineno-33-7"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">execute</span><span class="p">(</span><span class="ss">operation</span><span class="p">:,</span><span class="w"> </span><span class="ss">a</span><span class="p">:,</span><span class="w"> </span><span class="ss">b</span><span class="p">:)</span>
4285
+ </span><span id="__span-33-8"><a id="__codelineno-33-8" name="__codelineno-33-8" href="#__codelineno-33-8"></a><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">operation</span>
4286
+ </span><span id="__span-33-9"><a id="__codelineno-33-9" name="__codelineno-33-9" href="#__codelineno-33-9"></a><span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="s2">&quot;add&quot;</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span>
4287
+ </span><span id="__span-33-10"><a id="__codelineno-33-10" name="__codelineno-33-10" href="#__codelineno-33-10"></a><span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="s2">&quot;subtract&quot;</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">b</span>
4288
+ </span><span id="__span-33-11"><a id="__codelineno-33-11" name="__codelineno-33-11" href="#__codelineno-33-11"></a><span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="s2">&quot;multiply&quot;</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">b</span>
4289
+ </span><span id="__span-33-12"><a id="__codelineno-33-12" name="__codelineno-33-12" href="#__codelineno-33-12"></a><span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="s2">&quot;divide&quot;</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">a</span><span class="o">.</span><span class="n">to_f</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">b</span>
4290
+ </span><span id="__span-33-13"><a id="__codelineno-33-13" name="__codelineno-33-13" href="#__codelineno-33-13"></a><span class="w"> </span><span class="k">end</span>
4291
+ </span><span id="__span-33-14"><a id="__codelineno-33-14" name="__codelineno-33-14" href="#__codelineno-33-14"></a><span class="w"> </span><span class="k">end</span>
4292
+ </span><span id="__span-33-15"><a id="__codelineno-33-15" name="__codelineno-33-15" href="#__codelineno-33-15"></a><span class="k">end</span>
4293
+ </span><span id="__span-33-16"><a id="__codelineno-33-16" name="__codelineno-33-16" href="#__codelineno-33-16"></a>
4294
+ </span><span id="__span-33-17"><a id="__codelineno-33-17" name="__codelineno-33-17" href="#__codelineno-33-17"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
4295
+ </span><span id="__span-33-18"><a id="__codelineno-33-18" name="__codelineno-33-18" href="#__codelineno-33-18"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;math_bot&quot;</span><span class="p">,</span>
4296
+ </span><span id="__span-33-19"><a id="__codelineno-33-19" name="__codelineno-33-19" href="#__codelineno-33-19"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You help with math.&quot;</span><span class="p">,</span>
4297
+ </span><span id="__span-33-20"><a id="__codelineno-33-20" name="__codelineno-33-20" href="#__codelineno-33-20"></a><span class="w"> </span><span class="ss">local_tools</span><span class="p">:</span><span class="w"> </span><span class="o">[</span><span class="no">Calculator</span><span class="o">]</span>
4298
+ </span><span id="__span-33-21"><a id="__codelineno-33-21" name="__codelineno-33-21" href="#__codelineno-33-21"></a><span class="p">)</span>
4299
+ </span><span id="__span-33-22"><a id="__codelineno-33-22" name="__codelineno-33-22" href="#__codelineno-33-22"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;What is 15 * 7?&quot;</span><span class="p">)</span>
4300
+ </span></code></pre></div>
4301
+ <h3 id="robot-with-mcp">Robot with MCP<a class="headerlink" href="#robot-with-mcp" title="Permanent link">&para;</a></h3>
4302
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-34-1"><a id="__codelineno-34-1" name="__codelineno-34-1" href="#__codelineno-34-1"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
4303
+ </span><span id="__span-34-2"><a id="__codelineno-34-2" name="__codelineno-34-2" href="#__codelineno-34-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;developer&quot;</span><span class="p">,</span>
4304
+ </span><span id="__span-34-3"><a id="__codelineno-34-3" name="__codelineno-34-3" href="#__codelineno-34-3"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You help with coding tasks.&quot;</span><span class="p">,</span>
4305
+ </span><span id="__span-34-4"><a id="__codelineno-34-4" name="__codelineno-34-4" href="#__codelineno-34-4"></a><span class="w"> </span><span class="ss">mcp</span><span class="p">:</span><span class="w"> </span><span class="o">[</span>
4306
+ </span><span id="__span-34-5"><a id="__codelineno-34-5" name="__codelineno-34-5" href="#__codelineno-34-5"></a><span class="w"> </span><span class="p">{</span>
4307
+ </span><span id="__span-34-6"><a id="__codelineno-34-6" name="__codelineno-34-6" href="#__codelineno-34-6"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;github&quot;</span><span class="p">,</span>
4308
+ </span><span id="__span-34-7"><a id="__codelineno-34-7" name="__codelineno-34-7" href="#__codelineno-34-7"></a><span class="w"> </span><span class="ss">transport</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="ss">type</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;stdio&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">command</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;github-mcp-server&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">args</span><span class="p">:</span><span class="w"> </span><span class="o">[</span><span class="s2">&quot;stdio&quot;</span><span class="o">]</span><span class="w"> </span><span class="p">}</span>
4309
+ </span><span id="__span-34-8"><a id="__codelineno-34-8" name="__codelineno-34-8" href="#__codelineno-34-8"></a><span class="w"> </span><span class="p">}</span>
4310
+ </span><span id="__span-34-9"><a id="__codelineno-34-9" name="__codelineno-34-9" href="#__codelineno-34-9"></a><span class="w"> </span><span class="o">]</span>
4311
+ </span><span id="__span-34-10"><a id="__codelineno-34-10" name="__codelineno-34-10" href="#__codelineno-34-10"></a><span class="p">)</span>
4312
+ </span><span id="__span-34-11"><a id="__codelineno-34-11" name="__codelineno-34-11" href="#__codelineno-34-11"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Search for popular Ruby repos&quot;</span><span class="p">)</span>
4313
+ </span><span id="__span-34-12"><a id="__codelineno-34-12" name="__codelineno-34-12" href="#__codelineno-34-12"></a><span class="n">robot</span><span class="o">.</span><span class="n">disconnect</span>
4314
+ </span></code></pre></div>
4315
+ <h3 id="robot-with-skills">Robot with Skills<a class="headerlink" href="#robot-with-skills" title="Permanent link">&para;</a></h3>
4316
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-35-1"><a id="__codelineno-35-1" name="__codelineno-35-1" href="#__codelineno-35-1"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
4317
+ </span><span id="__span-35-2"><a id="__codelineno-35-2" name="__codelineno-35-2" href="#__codelineno-35-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;support&quot;</span><span class="p">,</span>
4318
+ </span><span id="__span-35-3"><a id="__codelineno-35-3" name="__codelineno-35-3" href="#__codelineno-35-3"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:support</span><span class="p">,</span>
4319
+ </span><span id="__span-35-4"><a id="__codelineno-35-4" name="__codelineno-35-4" href="#__codelineno-35-4"></a><span class="w"> </span><span class="ss">skills</span><span class="p">:</span><span class="w"> </span><span class="o">[</span><span class="ss">:clarifier</span><span class="p">,</span><span class="w"> </span><span class="ss">:safety</span><span class="p">,</span><span class="w"> </span><span class="ss">:json_responder</span><span class="o">]</span><span class="p">,</span>
4320
+ </span><span id="__span-35-5"><a id="__codelineno-35-5" name="__codelineno-35-5" href="#__codelineno-35-5"></a><span class="w"> </span><span class="ss">context</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="ss">company</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Acme Corp&quot;</span><span class="w"> </span><span class="p">}</span>
4321
+ </span><span id="__span-35-6"><a id="__codelineno-35-6" name="__codelineno-35-6" href="#__codelineno-35-6"></a><span class="p">)</span>
4322
+ </span><span id="__span-35-7"><a id="__codelineno-35-7" name="__codelineno-35-7" href="#__codelineno-35-7"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;I need help with my order&quot;</span><span class="p">)</span>
4323
+ </span></code></pre></div>
4324
+ <h3 id="bare-robot-with-chaining">Bare Robot with Chaining<a class="headerlink" href="#bare-robot-with-chaining" title="Permanent link">&para;</a></h3>
4325
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-36-1"><a id="__codelineno-36-1" name="__codelineno-36-1" href="#__codelineno-36-1"></a><span class="n">robot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bot&quot;</span><span class="p">)</span>
4326
+ </span><span id="__span-36-2"><a id="__codelineno-36-2" name="__codelineno-36-2" href="#__codelineno-36-2"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span>
4327
+ </span><span id="__span-36-3"><a id="__codelineno-36-3" name="__codelineno-36-3" href="#__codelineno-36-3"></a><span class="w"> </span><span class="o">.</span><span class="n">with_instructions</span><span class="p">(</span><span class="s2">&quot;Be concise.&quot;</span><span class="p">)</span>
4328
+ </span><span id="__span-36-4"><a id="__codelineno-36-4" name="__codelineno-36-4" href="#__codelineno-36-4"></a><span class="w"> </span><span class="o">.</span><span class="n">with_temperature</span><span class="p">(</span><span class="mi">0</span><span class="o">.</span><span class="mi">3</span><span class="p">)</span>
4329
+ </span><span id="__span-36-5"><a id="__codelineno-36-5" name="__codelineno-36-5" href="#__codelineno-36-5"></a><span class="w"> </span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Explain quantum computing&quot;</span><span class="p">)</span>
4330
+ </span></code></pre></div>
4331
+ <h3 id="robot-with-message-bus">Robot with Message Bus<a class="headerlink" href="#robot-with-message-bus" title="Permanent link">&para;</a></h3>
4332
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-37-1"><a id="__codelineno-37-1" name="__codelineno-37-1" href="#__codelineno-37-1"></a><span class="n">bus</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">TypedBus</span><span class="o">::</span><span class="no">MessageBus</span><span class="o">.</span><span class="n">new</span>
4333
+ </span><span id="__span-37-2"><a id="__codelineno-37-2" name="__codelineno-37-2" href="#__codelineno-37-2"></a>
4334
+ </span><span id="__span-37-3"><a id="__codelineno-37-3" name="__codelineno-37-3" href="#__codelineno-37-3"></a><span class="n">bob</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bob&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You tell jokes.&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">bus</span><span class="p">:</span><span class="w"> </span><span class="n">bus</span><span class="p">)</span>
4335
+ </span><span id="__span-37-4"><a id="__codelineno-37-4" name="__codelineno-37-4" href="#__codelineno-37-4"></a>
4336
+ </span><span id="__span-37-5"><a id="__codelineno-37-5" name="__codelineno-37-5" href="#__codelineno-37-5"></a><span class="n">alice</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;alice&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You evaluate jokes.&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">bus</span><span class="p">:</span><span class="w"> </span><span class="n">bus</span><span class="p">)</span>
4337
+ </span><span id="__span-37-6"><a id="__codelineno-37-6" name="__codelineno-37-6" href="#__codelineno-37-6"></a><span class="n">alice</span><span class="o">.</span><span class="n">on_message</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">message</span><span class="o">|</span>
4338
+ </span><span id="__span-37-7"><a id="__codelineno-37-7" name="__codelineno-37-7" href="#__codelineno-37-7"></a><span class="w"> </span><span class="n">verdict</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alice</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Is this funny? </span><span class="si">#{</span><span class="n">message</span><span class="o">.</span><span class="n">content</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">last_text_content</span>
4339
+ </span><span id="__span-37-8"><a id="__codelineno-37-8" name="__codelineno-37-8" href="#__codelineno-37-8"></a><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="n">verdict</span>
4340
+ </span><span id="__span-37-9"><a id="__codelineno-37-9" name="__codelineno-37-9" href="#__codelineno-37-9"></a><span class="k">end</span>
4341
+ </span><span id="__span-37-10"><a id="__codelineno-37-10" name="__codelineno-37-10" href="#__codelineno-37-10"></a>
4342
+ </span><span id="__span-37-11"><a id="__codelineno-37-11" name="__codelineno-37-11" href="#__codelineno-37-11"></a><span class="n">bob</span><span class="o">.</span><span class="n">on_message</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">message</span><span class="o">|</span>
4343
+ </span><span id="__span-37-12"><a id="__codelineno-37-12" name="__codelineno-37-12" href="#__codelineno-37-12"></a><span class="w"> </span><span class="n">joke</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bob</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span><span class="o">.</span><span class="n">last_text_content</span>
4344
+ </span><span id="__span-37-13"><a id="__codelineno-37-13" name="__codelineno-37-13" href="#__codelineno-37-13"></a><span class="w"> </span><span class="n">bob</span><span class="o">.</span><span class="n">send_reply</span><span class="p">(</span><span class="ss">to</span><span class="p">:</span><span class="w"> </span><span class="n">message</span><span class="o">.</span><span class="n">from</span><span class="o">.</span><span class="n">to_sym</span><span class="p">,</span><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="n">joke</span><span class="p">,</span><span class="w"> </span><span class="ss">in_reply_to</span><span class="p">:</span><span class="w"> </span><span class="n">message</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
4345
+ </span><span id="__span-37-14"><a id="__codelineno-37-14" name="__codelineno-37-14" href="#__codelineno-37-14"></a><span class="k">end</span>
4346
+ </span><span id="__span-37-15"><a id="__codelineno-37-15" name="__codelineno-37-15" href="#__codelineno-37-15"></a>
4347
+ </span><span id="__span-37-16"><a id="__codelineno-37-16" name="__codelineno-37-16" href="#__codelineno-37-16"></a><span class="n">alice</span><span class="o">.</span><span class="n">send_message</span><span class="p">(</span><span class="ss">to</span><span class="p">:</span><span class="w"> </span><span class="ss">:bob</span><span class="p">,</span><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Tell me a robot joke.&quot;</span><span class="p">)</span>
4348
+ </span></code></pre></div>
4349
+ <h3 id="spawning-robots-dynamically">Spawning Robots Dynamically<a class="headerlink" href="#spawning-robots-dynamically" title="Permanent link">&para;</a></h3>
4350
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-38-1"><a id="__codelineno-38-1" name="__codelineno-38-1" href="#__codelineno-38-1"></a><span class="c1"># Parent robot spawns specialists on demand</span>
4351
+ </span><span id="__span-38-2"><a id="__codelineno-38-2" name="__codelineno-38-2" href="#__codelineno-38-2"></a><span class="n">dispatcher</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span>
4352
+ </span><span id="__span-38-3"><a id="__codelineno-38-3" name="__codelineno-38-3" href="#__codelineno-38-3"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;dispatcher&quot;</span><span class="p">,</span>
4353
+ </span><span id="__span-38-4"><a id="__codelineno-38-4" name="__codelineno-38-4" href="#__codelineno-38-4"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You delegate work.&quot;</span>
4354
+ </span><span id="__span-38-5"><a id="__codelineno-38-5" name="__codelineno-38-5" href="#__codelineno-38-5"></a><span class="p">)</span>
4355
+ </span><span id="__span-38-6"><a id="__codelineno-38-6" name="__codelineno-38-6" href="#__codelineno-38-6"></a>
4356
+ </span><span id="__span-38-7"><a id="__codelineno-38-7" name="__codelineno-38-7" href="#__codelineno-38-7"></a><span class="n">dispatcher</span><span class="o">.</span><span class="n">on_message</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">message</span><span class="o">|</span>
4357
+ </span><span id="__span-38-8"><a id="__codelineno-38-8" name="__codelineno-38-8" href="#__codelineno-38-8"></a><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">&quot;Reply from </span><span class="si">#{</span><span class="n">message</span><span class="o">.</span><span class="n">from</span><span class="si">}</span><span class="s2">: </span><span class="si">#{</span><span class="n">message</span><span class="o">.</span><span class="n">content</span><span class="si">}</span><span class="s2">&quot;</span>
4358
+ </span><span id="__span-38-9"><a id="__codelineno-38-9" name="__codelineno-38-9" href="#__codelineno-38-9"></a><span class="k">end</span>
4359
+ </span><span id="__span-38-10"><a id="__codelineno-38-10" name="__codelineno-38-10" href="#__codelineno-38-10"></a>
4360
+ </span><span id="__span-38-11"><a id="__codelineno-38-11" name="__codelineno-38-11" href="#__codelineno-38-11"></a><span class="c1"># spawn creates child on same bus (bus created lazily)</span>
4361
+ </span><span id="__span-38-12"><a id="__codelineno-38-12" name="__codelineno-38-12" href="#__codelineno-38-12"></a><span class="n">helper</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dispatcher</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span>
4362
+ </span><span id="__span-38-13"><a id="__codelineno-38-13" name="__codelineno-38-13" href="#__codelineno-38-13"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;helper&quot;</span><span class="p">,</span>
4363
+ </span><span id="__span-38-14"><a id="__codelineno-38-14" name="__codelineno-38-14" href="#__codelineno-38-14"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You answer questions concisely.&quot;</span>
4364
+ </span><span id="__span-38-15"><a id="__codelineno-38-15" name="__codelineno-38-15" href="#__codelineno-38-15"></a><span class="p">)</span>
4365
+ </span><span id="__span-38-16"><a id="__codelineno-38-16" name="__codelineno-38-16" href="#__codelineno-38-16"></a>
4366
+ </span><span id="__span-38-17"><a id="__codelineno-38-17" name="__codelineno-38-17" href="#__codelineno-38-17"></a><span class="n">answer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">helper</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;What is 2+2?&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">last_text_content</span>
4367
+ </span><span id="__span-38-18"><a id="__codelineno-38-18" name="__codelineno-38-18" href="#__codelineno-38-18"></a><span class="n">helper</span><span class="o">.</span><span class="n">send_message</span><span class="p">(</span><span class="ss">to</span><span class="p">:</span><span class="w"> </span><span class="ss">:dispatcher</span><span class="p">,</span><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="n">answer</span><span class="p">)</span>
4368
+ </span></code></pre></div>
4369
+ <h3 id="connecting-to-a-bus-after-creation">Connecting to a Bus After Creation<a class="headerlink" href="#connecting-to-a-bus-after-creation" title="Permanent link">&para;</a></h3>
4370
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-39-1"><a id="__codelineno-39-1" name="__codelineno-39-1" href="#__codelineno-39-1"></a><span class="n">bot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;latecomer&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Hi there.&quot;</span><span class="p">)</span>
4371
+ </span><span id="__span-39-2"><a id="__codelineno-39-2" name="__codelineno-39-2" href="#__codelineno-39-2"></a>
4372
+ </span><span id="__span-39-3"><a id="__codelineno-39-3" name="__codelineno-39-3" href="#__codelineno-39-3"></a><span class="c1"># Join a bus later</span>
4373
+ </span><span id="__span-39-4"><a id="__codelineno-39-4" name="__codelineno-39-4" href="#__codelineno-39-4"></a><span class="n">bus</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">TypedBus</span><span class="o">::</span><span class="no">MessageBus</span><span class="o">.</span><span class="n">new</span>
4374
+ </span><span id="__span-39-5"><a id="__codelineno-39-5" name="__codelineno-39-5" href="#__codelineno-39-5"></a><span class="n">bot</span><span class="o">.</span><span class="n">with_bus</span><span class="p">(</span><span class="n">bus</span><span class="p">)</span>
4375
+ </span><span id="__span-39-6"><a id="__codelineno-39-6" name="__codelineno-39-6" href="#__codelineno-39-6"></a>
4376
+ </span><span id="__span-39-7"><a id="__codelineno-39-7" name="__codelineno-39-7" href="#__codelineno-39-7"></a><span class="c1"># Now bot can send/receive messages</span>
4377
+ </span><span id="__span-39-8"><a id="__codelineno-39-8" name="__codelineno-39-8" href="#__codelineno-39-8"></a><span class="n">bot</span><span class="o">.</span><span class="n">send_message</span><span class="p">(</span><span class="ss">to</span><span class="p">:</span><span class="w"> </span><span class="ss">:someone</span><span class="p">,</span><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Hello!&quot;</span><span class="p">)</span>
4378
+ </span></code></pre></div>
4379
+ <h2 id="see-also">See Also<a class="headerlink" href="#see-also" title="Permanent link">&para;</a></h2>
4380
+ <ul>
4381
+ <li><a href="../../../guides/building-robots/">Building Robots Guide</a> (includes <a href="../../../guides/building-robots/#composable-skills">Composable Skills</a>)</li>
4382
+ <li><a href="../tool/">Tool</a></li>
4383
+ <li><a href="../network/">Network</a></li>
4384
+ </ul>
4385
+
4386
+
4387
+
4388
+
4389
+
4390
+
4391
+
4392
+
4393
+
4394
+
4395
+
4396
+
4397
+
4398
+ <form class="md-feedback" name="feedback" hidden>
4399
+ <fieldset>
4400
+ <legend class="md-feedback__title">
4401
+ Was this page helpful?
4402
+ </legend>
4403
+ <div class="md-feedback__inner">
4404
+ <div class="md-feedback__list">
4405
+
4406
+ <button class="md-feedback__icon md-icon" type="submit" title="This page was helpful" data-md-value="1">
4407
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 12a8 8 0 0 0-8-8 8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8m2 0a10 10 0 0 1-10 10A10 10 0 0 1 2 12 10 10 0 0 1 12 2a10 10 0 0 1 10 10M10 9.5c0 .8-.7 1.5-1.5 1.5S7 10.3 7 9.5 7.7 8 8.5 8s1.5.7 1.5 1.5m7 0c0 .8-.7 1.5-1.5 1.5S14 10.3 14 9.5 14.7 8 15.5 8s1.5.7 1.5 1.5m-5 7.73c-1.75 0-3.29-.73-4.19-1.81L9.23 14c.45.72 1.52 1.23 2.77 1.23s2.32-.51 2.77-1.23l1.42 1.42c-.9 1.08-2.44 1.81-4.19 1.81"/></svg>
4408
+ </button>
4409
+
4410
+ <button class="md-feedback__icon md-icon" type="submit" title="This page could be improved" data-md-value="0">
4411
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 12a8 8 0 0 0-8-8 8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8m2 0a10 10 0 0 1-10 10A10 10 0 0 1 2 12 10 10 0 0 1 12 2a10 10 0 0 1 10 10m-6.5-4c.8 0 1.5.7 1.5 1.5s-.7 1.5-1.5 1.5-1.5-.7-1.5-1.5.7-1.5 1.5-1.5M10 9.5c0 .8-.7 1.5-1.5 1.5S7 10.3 7 9.5 7.7 8 8.5 8s1.5.7 1.5 1.5m2 4.5c1.75 0 3.29.72 4.19 1.81l-1.42 1.42C14.32 16.5 13.25 16 12 16s-2.32.5-2.77 1.23l-1.42-1.42C8.71 14.72 10.25 14 12 14"/></svg>
4412
+ </button>
4413
+
4414
+ </div>
4415
+ <div class="md-feedback__note">
4416
+
4417
+ <div data-md-value="1" hidden>
4418
+
4419
+
4420
+
4421
+
4422
+
4423
+
4424
+
4425
+
4426
+
4427
+ Thanks for your feedback!
4428
+ </div>
4429
+
4430
+ <div data-md-value="0" hidden>
4431
+
4432
+
4433
+
4434
+
4435
+
4436
+
4437
+
4438
+
4439
+
4440
+ Thanks for your feedback! Help us improve by creating an issue.
4441
+ </div>
4442
+
4443
+ </div>
4444
+ </div>
4445
+ </fieldset>
4446
+ </form>
4447
+
4448
+
4449
+
4450
+ </article>
4451
+ </div>
4452
+
4453
+
4454
+ <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
4455
+
4456
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
4457
+ </div>
4458
+
4459
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
4460
+
4461
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
4462
+ Back to top
4463
+ </button>
4464
+
4465
+ </main>
4466
+
4467
+ <footer class="md-footer">
4468
+
4469
+
4470
+
4471
+ <nav class="md-footer__inner md-grid" aria-label="Footer" >
4472
+
4473
+
4474
+ <a href="../" class="md-footer__link md-footer__link--prev" aria-label="Previous: Core Classes">
4475
+ <div class="md-footer__button md-icon">
4476
+
4477
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
4478
+ </div>
4479
+ <div class="md-footer__title">
4480
+ <span class="md-footer__direction">
4481
+ Previous
4482
+ </span>
4483
+ <div class="md-ellipsis">
4484
+ Core Classes
4485
+ </div>
4486
+ </div>
4487
+ </a>
4488
+
4489
+
4490
+
4491
+ <a href="../network/" class="md-footer__link md-footer__link--next" aria-label="Next: Network">
4492
+ <div class="md-footer__title">
4493
+ <span class="md-footer__direction">
4494
+ Next
4495
+ </span>
4496
+ <div class="md-ellipsis">
4497
+ Network
4498
+ </div>
4499
+ </div>
4500
+ <div class="md-footer__button md-icon">
4501
+
4502
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
4503
+ </div>
4504
+ </a>
4505
+
4506
+ </nav>
4507
+
4508
+
4509
+ <div class="md-footer-meta md-typeset">
4510
+ <div class="md-footer-meta__inner md-grid">
4511
+ <div class="md-copyright">
4512
+
4513
+ <div class="md-copyright__highlight">
4514
+ Copyright &copy; 2025 Dewayne VanHoozer
4515
+ </div>
4516
+
4517
+
4518
+ Made with
4519
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
4520
+ Material for MkDocs
4521
+ </a>
4522
+
4523
+ </div>
4524
+
4525
+
4526
+ <div class="md-social">
4527
+
4528
+
4529
+
4530
+
4531
+
4532
+ <a href="https://github.com/madbomber/robot_lab" target="_blank" rel="noopener" title="RobotLab on GitHub" class="md-social__link">
4533
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
4534
+ </a>
4535
+
4536
+
4537
+
4538
+
4539
+
4540
+ <a href="https://rubygems.org/gems/robot_lab" target="_blank" rel="noopener" title="RobotLab on RubyGems" class="md-social__link">
4541
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M116.7 33.8c4.5-6.1 11.7-9.8 19.3-9.8h240c7.6 0 14.8 3.6 19.3 9.8l112 152c6.8 9.2 6.1 21.9-1.5 30.4l-232 256c-4.5 5-11 7.9-17.8 7.9s-13.2-2.9-17.8-7.9l-232-256c-7.7-8.5-8.3-21.2-1.5-30.4zm38.5 39.8c-3.3 2.5-4.2 7-2.1 10.5l57.4 95.7L63.3 192c-4.1.3-7.3 3.8-7.3 8s3.2 7.6 7.3 8l192 16h1.3l192-16c4.1-.3 7.3-3.8 7.3-8s-3.2-7.6-7.3-8l-147.2-12.3 57.4-95.6c2.1-3.5 1.2-8.1-2.1-10.5s-7.9-2-10.7 1l-90 97.6-90.1-97.6c-2.8-3-7.4-3.4-10.7-1"/></svg>
4542
+ </a>
4543
+
4544
+ </div>
4545
+
4546
+ </div>
4547
+ </div>
4548
+ </footer>
4549
+
4550
+ </div>
4551
+ <div class="md-dialog" data-md-component="dialog">
4552
+ <div class="md-dialog__inner md-typeset"></div>
4553
+ </div>
4554
+
4555
+
4556
+
4557
+
4558
+
4559
+ <script id="__config" type="application/json">{"annotate": null, "base": "../../..", "features": ["navigation.instant", "navigation.tracking", "navigation.tabs", "navigation.tabs.sticky", "navigation.path", "navigation.indexes", "navigation.top", "navigation.footer", "toc.follow", "search.suggest", "search.highlight", "search.share", "header.autohide", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.tooltips", "content.action.edit", "content.action.view"], "search": "../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
4560
+
4561
+
4562
+ <script src="../../../assets/javascripts/bundle.79ae519e.min.js"></script>
4563
+
4564
+
4565
+ </body>
4566
+ </html>