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,4290 @@
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/guides/building-robots/">
16
+
17
+
18
+ <link rel="prev" href="../">
19
+
20
+
21
+ <link rel="next" href="../creating-networks/">
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>Building Robots - 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="#building-robots" 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
+ Building Robots
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
+
303
+
304
+ <li class="md-tabs__item md-tabs__item--active">
305
+ <a href="../" class="md-tabs__link">
306
+
307
+
308
+
309
+
310
+
311
+ Guides
312
+
313
+ </a>
314
+ </li>
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+
326
+ <li class="md-tabs__item">
327
+ <a href="../../api/" 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
+
935
+
936
+
937
+
938
+
939
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
940
+
941
+
942
+
943
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
944
+
945
+
946
+ <div class="md-nav__link md-nav__container">
947
+ <a href="../" class="md-nav__link ">
948
+
949
+
950
+
951
+ <span class="md-ellipsis">
952
+
953
+
954
+ Guides
955
+
956
+
957
+
958
+ </span>
959
+
960
+
961
+
962
+ </a>
963
+
964
+
965
+ <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
966
+ <span class="md-nav__icon md-icon"></span>
967
+ </label>
968
+
969
+ </div>
970
+
971
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
972
+ <label class="md-nav__title" for="__nav_4">
973
+ <span class="md-nav__icon md-icon"></span>
974
+
975
+
976
+ Guides
977
+
978
+
979
+ </label>
980
+ <ul class="md-nav__list" data-md-scrollfix>
981
+
982
+
983
+
984
+
985
+
986
+
987
+
988
+
989
+
990
+
991
+
992
+ <li class="md-nav__item md-nav__item--active">
993
+
994
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
995
+
996
+
997
+
998
+
999
+
1000
+ <label class="md-nav__link md-nav__link--active" for="__toc">
1001
+
1002
+
1003
+
1004
+ <span class="md-ellipsis">
1005
+
1006
+
1007
+ Building Robots
1008
+
1009
+
1010
+
1011
+ </span>
1012
+
1013
+
1014
+
1015
+ <span class="md-nav__icon md-icon"></span>
1016
+ </label>
1017
+
1018
+ <a href="./" class="md-nav__link md-nav__link--active">
1019
+
1020
+
1021
+
1022
+ <span class="md-ellipsis">
1023
+
1024
+
1025
+ Building Robots
1026
+
1027
+
1028
+
1029
+ </span>
1030
+
1031
+
1032
+
1033
+ </a>
1034
+
1035
+
1036
+
1037
+
1038
+
1039
+ <nav class="md-nav md-nav--secondary" aria-label="On this page">
1040
+
1041
+
1042
+
1043
+
1044
+
1045
+
1046
+ <label class="md-nav__title" for="__toc">
1047
+ <span class="md-nav__icon md-icon"></span>
1048
+ On this page
1049
+ </label>
1050
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1051
+
1052
+ <li class="md-nav__item">
1053
+ <a href="#basic-robot" class="md-nav__link">
1054
+ <span class="md-ellipsis">
1055
+
1056
+ Basic Robot
1057
+
1058
+ </span>
1059
+ </a>
1060
+
1061
+ </li>
1062
+
1063
+ <li class="md-nav__item">
1064
+ <a href="#robot-properties" class="md-nav__link">
1065
+ <span class="md-ellipsis">
1066
+
1067
+ Robot Properties
1068
+
1069
+ </span>
1070
+ </a>
1071
+
1072
+ <nav class="md-nav" aria-label="Robot Properties">
1073
+ <ul class="md-nav__list">
1074
+
1075
+ <li class="md-nav__item">
1076
+ <a href="#name" class="md-nav__link">
1077
+ <span class="md-ellipsis">
1078
+
1079
+ Name
1080
+
1081
+ </span>
1082
+ </a>
1083
+
1084
+ </li>
1085
+
1086
+ <li class="md-nav__item">
1087
+ <a href="#description" class="md-nav__link">
1088
+ <span class="md-ellipsis">
1089
+
1090
+ Description
1091
+
1092
+ </span>
1093
+ </a>
1094
+
1095
+ </li>
1096
+
1097
+ <li class="md-nav__item">
1098
+ <a href="#model" class="md-nav__link">
1099
+ <span class="md-ellipsis">
1100
+
1101
+ Model
1102
+
1103
+ </span>
1104
+ </a>
1105
+
1106
+ </li>
1107
+
1108
+ <li class="md-nav__item">
1109
+ <a href="#system-prompt" class="md-nav__link">
1110
+ <span class="md-ellipsis">
1111
+
1112
+ System Prompt
1113
+
1114
+ </span>
1115
+ </a>
1116
+
1117
+ </li>
1118
+
1119
+ </ul>
1120
+ </nav>
1121
+
1122
+ </li>
1123
+
1124
+ <li class="md-nav__item">
1125
+ <a href="#template-files" class="md-nav__link">
1126
+ <span class="md-ellipsis">
1127
+
1128
+ Template Files
1129
+
1130
+ </span>
1131
+ </a>
1132
+
1133
+ <nav class="md-nav" aria-label="Template Files">
1134
+ <ul class="md-nav__list">
1135
+
1136
+ <li class="md-nav__item">
1137
+ <a href="#template-format" class="md-nav__link">
1138
+ <span class="md-ellipsis">
1139
+
1140
+ Template Format
1141
+
1142
+ </span>
1143
+ </a>
1144
+
1145
+ </li>
1146
+
1147
+ <li class="md-nav__item">
1148
+ <a href="#front-matter-configuration" class="md-nav__link">
1149
+ <span class="md-ellipsis">
1150
+
1151
+ Front Matter Configuration
1152
+
1153
+ </span>
1154
+ </a>
1155
+
1156
+ </li>
1157
+
1158
+ <li class="md-nav__item">
1159
+ <a href="#self-contained-templates" class="md-nav__link">
1160
+ <span class="md-ellipsis">
1161
+
1162
+ Self-Contained Templates
1163
+
1164
+ </span>
1165
+ </a>
1166
+
1167
+ </li>
1168
+
1169
+ <li class="md-nav__item">
1170
+ <a href="#tools-in-front-matter" class="md-nav__link">
1171
+ <span class="md-ellipsis">
1172
+
1173
+ Tools in Front Matter
1174
+
1175
+ </span>
1176
+ </a>
1177
+
1178
+ </li>
1179
+
1180
+ <li class="md-nav__item">
1181
+ <a href="#mcp-in-front-matter" class="md-nav__link">
1182
+ <span class="md-ellipsis">
1183
+
1184
+ MCP in Front Matter
1185
+
1186
+ </span>
1187
+ </a>
1188
+
1189
+ </li>
1190
+
1191
+ <li class="md-nav__item">
1192
+ <a href="#template-with-system-prompt" class="md-nav__link">
1193
+ <span class="md-ellipsis">
1194
+
1195
+ Template with System Prompt
1196
+
1197
+ </span>
1198
+ </a>
1199
+
1200
+ </li>
1201
+
1202
+ </ul>
1203
+ </nav>
1204
+
1205
+ </li>
1206
+
1207
+ <li class="md-nav__item">
1208
+ <a href="#composable-skills" class="md-nav__link">
1209
+ <span class="md-ellipsis">
1210
+
1211
+ Composable Skills
1212
+
1213
+ </span>
1214
+ </a>
1215
+
1216
+ <nav class="md-nav" aria-label="Composable Skills">
1217
+ <ul class="md-nav__list">
1218
+
1219
+ <li class="md-nav__item">
1220
+ <a href="#why-skills" class="md-nav__link">
1221
+ <span class="md-ellipsis">
1222
+
1223
+ Why Skills?
1224
+
1225
+ </span>
1226
+ </a>
1227
+
1228
+ </li>
1229
+
1230
+ <li class="md-nav__item">
1231
+ <a href="#defining-a-skill" class="md-nav__link">
1232
+ <span class="md-ellipsis">
1233
+
1234
+ Defining a Skill
1235
+
1236
+ </span>
1237
+ </a>
1238
+
1239
+ </li>
1240
+
1241
+ <li class="md-nav__item">
1242
+ <a href="#using-skills-via-constructor" class="md-nav__link">
1243
+ <span class="md-ellipsis">
1244
+
1245
+ Using Skills via Constructor
1246
+
1247
+ </span>
1248
+ </a>
1249
+
1250
+ </li>
1251
+
1252
+ <li class="md-nav__item">
1253
+ <a href="#using-skills-via-front-matter" class="md-nav__link">
1254
+ <span class="md-ellipsis">
1255
+
1256
+ Using Skills via Front Matter
1257
+
1258
+ </span>
1259
+ </a>
1260
+
1261
+ </li>
1262
+
1263
+ <li class="md-nav__item">
1264
+ <a href="#nested-skills" class="md-nav__link">
1265
+ <span class="md-ellipsis">
1266
+
1267
+ Nested Skills
1268
+
1269
+ </span>
1270
+ </a>
1271
+
1272
+ </li>
1273
+
1274
+ <li class="md-nav__item">
1275
+ <a href="#cycle-detection" class="md-nav__link">
1276
+ <span class="md-ellipsis">
1277
+
1278
+ Cycle Detection
1279
+
1280
+ </span>
1281
+ </a>
1282
+
1283
+ </li>
1284
+
1285
+ <li class="md-nav__item">
1286
+ <a href="#config-cascade" class="md-nav__link">
1287
+ <span class="md-ellipsis">
1288
+
1289
+ Config Cascade
1290
+
1291
+ </span>
1292
+ </a>
1293
+
1294
+ </li>
1295
+
1296
+ <li class="md-nav__item">
1297
+ <a href="#skills-without-a-main-template" class="md-nav__link">
1298
+ <span class="md-ellipsis">
1299
+
1300
+ Skills Without a Main Template
1301
+
1302
+ </span>
1303
+ </a>
1304
+
1305
+ </li>
1306
+
1307
+ <li class="md-nav__item">
1308
+ <a href="#shared-context" class="md-nav__link">
1309
+ <span class="md-ellipsis">
1310
+
1311
+ Shared Context
1312
+
1313
+ </span>
1314
+ </a>
1315
+
1316
+ </li>
1317
+
1318
+ </ul>
1319
+ </nav>
1320
+
1321
+ </li>
1322
+
1323
+ <li class="md-nav__item">
1324
+ <a href="#adding-tools" class="md-nav__link">
1325
+ <span class="md-ellipsis">
1326
+
1327
+ Adding Tools
1328
+
1329
+ </span>
1330
+ </a>
1331
+
1332
+ </li>
1333
+
1334
+ <li class="md-nav__item">
1335
+ <a href="#mcp-configuration" class="md-nav__link">
1336
+ <span class="md-ellipsis">
1337
+
1338
+ MCP Configuration
1339
+
1340
+ </span>
1341
+ </a>
1342
+
1343
+ </li>
1344
+
1345
+ <li class="md-nav__item">
1346
+ <a href="#chaining-configuration" class="md-nav__link">
1347
+ <span class="md-ellipsis">
1348
+
1349
+ Chaining Configuration
1350
+
1351
+ </span>
1352
+ </a>
1353
+
1354
+ <nav class="md-nav" aria-label="Chaining Configuration">
1355
+ <ul class="md-nav__list">
1356
+
1357
+ <li class="md-nav__item">
1358
+ <a href="#available-chain-methods" class="md-nav__link">
1359
+ <span class="md-ellipsis">
1360
+
1361
+ Available Chain Methods
1362
+
1363
+ </span>
1364
+ </a>
1365
+
1366
+ </li>
1367
+
1368
+ </ul>
1369
+ </nav>
1370
+
1371
+ </li>
1372
+
1373
+ <li class="md-nav__item">
1374
+ <a href="#running-robots" class="md-nav__link">
1375
+ <span class="md-ellipsis">
1376
+
1377
+ Running Robots
1378
+
1379
+ </span>
1380
+ </a>
1381
+
1382
+ <nav class="md-nav" aria-label="Running Robots">
1383
+ <ul class="md-nav__list">
1384
+
1385
+ <li class="md-nav__item">
1386
+ <a href="#standalone" class="md-nav__link">
1387
+ <span class="md-ellipsis">
1388
+
1389
+ Standalone
1390
+
1391
+ </span>
1392
+ </a>
1393
+
1394
+ </li>
1395
+
1396
+ <li class="md-nav__item">
1397
+ <a href="#with-runtime-memory" class="md-nav__link">
1398
+ <span class="md-ellipsis">
1399
+
1400
+ With Runtime Memory
1401
+
1402
+ </span>
1403
+ </a>
1404
+
1405
+ </li>
1406
+
1407
+ <li class="md-nav__item">
1408
+ <a href="#in-a-network" class="md-nav__link">
1409
+ <span class="md-ellipsis">
1410
+
1411
+ In a Network
1412
+
1413
+ </span>
1414
+ </a>
1415
+
1416
+ </li>
1417
+
1418
+ <li class="md-nav__item">
1419
+ <a href="#with-streaming" class="md-nav__link">
1420
+ <span class="md-ellipsis">
1421
+
1422
+ With Streaming
1423
+
1424
+ </span>
1425
+ </a>
1426
+
1427
+ </li>
1428
+
1429
+ </ul>
1430
+ </nav>
1431
+
1432
+ </li>
1433
+
1434
+ <li class="md-nav__item">
1435
+ <a href="#robot-patterns" class="md-nav__link">
1436
+ <span class="md-ellipsis">
1437
+
1438
+ Robot Patterns
1439
+
1440
+ </span>
1441
+ </a>
1442
+
1443
+ <nav class="md-nav" aria-label="Robot Patterns">
1444
+ <ul class="md-nav__list">
1445
+
1446
+ <li class="md-nav__item">
1447
+ <a href="#classifier-robot" class="md-nav__link">
1448
+ <span class="md-ellipsis">
1449
+
1450
+ Classifier Robot
1451
+
1452
+ </span>
1453
+ </a>
1454
+
1455
+ </li>
1456
+
1457
+ <li class="md-nav__item">
1458
+ <a href="#specialist-robot" class="md-nav__link">
1459
+ <span class="md-ellipsis">
1460
+
1461
+ Specialist Robot
1462
+
1463
+ </span>
1464
+ </a>
1465
+
1466
+ </li>
1467
+
1468
+ <li class="md-nav__item">
1469
+ <a href="#summarizer-robot" class="md-nav__link">
1470
+ <span class="md-ellipsis">
1471
+
1472
+ Summarizer Robot
1473
+
1474
+ </span>
1475
+ </a>
1476
+
1477
+ </li>
1478
+
1479
+ <li class="md-nav__item">
1480
+ <a href="#bus-connected-robot" class="md-nav__link">
1481
+ <span class="md-ellipsis">
1482
+
1483
+ Bus-Connected Robot
1484
+
1485
+ </span>
1486
+ </a>
1487
+
1488
+ </li>
1489
+
1490
+ <li class="md-nav__item">
1491
+ <a href="#spawning-robots-dynamically" class="md-nav__link">
1492
+ <span class="md-ellipsis">
1493
+
1494
+ Spawning Robots Dynamically
1495
+
1496
+ </span>
1497
+ </a>
1498
+
1499
+ </li>
1500
+
1501
+ </ul>
1502
+ </nav>
1503
+
1504
+ </li>
1505
+
1506
+ <li class="md-nav__item">
1507
+ <a href="#configuration" class="md-nav__link">
1508
+ <span class="md-ellipsis">
1509
+
1510
+ Configuration
1511
+
1512
+ </span>
1513
+ </a>
1514
+
1515
+ </li>
1516
+
1517
+ <li class="md-nav__item">
1518
+ <a href="#best-practices" class="md-nav__link">
1519
+ <span class="md-ellipsis">
1520
+
1521
+ Best Practices
1522
+
1523
+ </span>
1524
+ </a>
1525
+
1526
+ <nav class="md-nav" aria-label="Best Practices">
1527
+ <ul class="md-nav__list">
1528
+
1529
+ <li class="md-nav__item">
1530
+ <a href="#1-clear-focused-prompts" class="md-nav__link">
1531
+ <span class="md-ellipsis">
1532
+
1533
+ 1. Clear, Focused Prompts
1534
+
1535
+ </span>
1536
+ </a>
1537
+
1538
+ </li>
1539
+
1540
+ <li class="md-nav__item">
1541
+ <a href="#2-compose-behaviors-with-skills" class="md-nav__link">
1542
+ <span class="md-ellipsis">
1543
+
1544
+ 2. Compose Behaviors with Skills
1545
+
1546
+ </span>
1547
+ </a>
1548
+
1549
+ </li>
1550
+
1551
+ <li class="md-nav__item">
1552
+ <a href="#3-use-templates-for-reusable-prompts" class="md-nav__link">
1553
+ <span class="md-ellipsis">
1554
+
1555
+ 3. Use Templates for Reusable Prompts
1556
+
1557
+ </span>
1558
+ </a>
1559
+
1560
+ </li>
1561
+
1562
+ <li class="md-nav__item">
1563
+ <a href="#4-handle-tool-errors-gracefully" class="md-nav__link">
1564
+ <span class="md-ellipsis">
1565
+
1566
+ 4. Handle Tool Errors Gracefully
1567
+
1568
+ </span>
1569
+ </a>
1570
+
1571
+ </li>
1572
+
1573
+ </ul>
1574
+ </nav>
1575
+
1576
+ </li>
1577
+
1578
+ <li class="md-nav__item">
1579
+ <a href="#next-steps" class="md-nav__link">
1580
+ <span class="md-ellipsis">
1581
+
1582
+ Next Steps
1583
+
1584
+ </span>
1585
+ </a>
1586
+
1587
+ </li>
1588
+
1589
+ </ul>
1590
+
1591
+ </nav>
1592
+
1593
+ </li>
1594
+
1595
+
1596
+
1597
+
1598
+
1599
+
1600
+
1601
+
1602
+
1603
+
1604
+ <li class="md-nav__item">
1605
+ <a href="../creating-networks/" class="md-nav__link">
1606
+
1607
+
1608
+
1609
+ <span class="md-ellipsis">
1610
+
1611
+
1612
+ Creating Networks
1613
+
1614
+
1615
+
1616
+ </span>
1617
+
1618
+
1619
+
1620
+ </a>
1621
+ </li>
1622
+
1623
+
1624
+
1625
+
1626
+
1627
+
1628
+
1629
+
1630
+
1631
+
1632
+ <li class="md-nav__item">
1633
+ <a href="../using-tools/" class="md-nav__link">
1634
+
1635
+
1636
+
1637
+ <span class="md-ellipsis">
1638
+
1639
+
1640
+ Using Tools
1641
+
1642
+
1643
+
1644
+ </span>
1645
+
1646
+
1647
+
1648
+ </a>
1649
+ </li>
1650
+
1651
+
1652
+
1653
+
1654
+
1655
+
1656
+
1657
+
1658
+
1659
+
1660
+ <li class="md-nav__item">
1661
+ <a href="../mcp-integration/" class="md-nav__link">
1662
+
1663
+
1664
+
1665
+ <span class="md-ellipsis">
1666
+
1667
+
1668
+ MCP Integration
1669
+
1670
+
1671
+
1672
+ </span>
1673
+
1674
+
1675
+
1676
+ </a>
1677
+ </li>
1678
+
1679
+
1680
+
1681
+
1682
+
1683
+
1684
+
1685
+
1686
+
1687
+
1688
+ <li class="md-nav__item">
1689
+ <a href="../streaming/" class="md-nav__link">
1690
+
1691
+
1692
+
1693
+ <span class="md-ellipsis">
1694
+
1695
+
1696
+ Streaming Responses
1697
+
1698
+
1699
+
1700
+ </span>
1701
+
1702
+
1703
+
1704
+ </a>
1705
+ </li>
1706
+
1707
+
1708
+
1709
+
1710
+
1711
+
1712
+
1713
+
1714
+
1715
+
1716
+ <li class="md-nav__item">
1717
+ <a href="../memory/" class="md-nav__link">
1718
+
1719
+
1720
+
1721
+ <span class="md-ellipsis">
1722
+
1723
+
1724
+ Memory System
1725
+
1726
+
1727
+
1728
+ </span>
1729
+
1730
+
1731
+
1732
+ </a>
1733
+ </li>
1734
+
1735
+
1736
+
1737
+
1738
+
1739
+
1740
+
1741
+
1742
+
1743
+
1744
+ <li class="md-nav__item">
1745
+ <a href="../rails-integration/" class="md-nav__link">
1746
+
1747
+
1748
+
1749
+ <span class="md-ellipsis">
1750
+
1751
+
1752
+ Rails Integration
1753
+
1754
+
1755
+
1756
+ </span>
1757
+
1758
+
1759
+
1760
+ </a>
1761
+ </li>
1762
+
1763
+
1764
+
1765
+
1766
+ </ul>
1767
+ </nav>
1768
+
1769
+ </li>
1770
+
1771
+
1772
+
1773
+
1774
+
1775
+
1776
+
1777
+
1778
+
1779
+
1780
+
1781
+
1782
+
1783
+
1784
+
1785
+
1786
+
1787
+
1788
+
1789
+
1790
+
1791
+
1792
+
1793
+
1794
+
1795
+
1796
+
1797
+
1798
+
1799
+
1800
+
1801
+ <li class="md-nav__item md-nav__item--nested">
1802
+
1803
+
1804
+
1805
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1806
+
1807
+
1808
+ <div class="md-nav__link md-nav__container">
1809
+ <a href="../../api/" class="md-nav__link ">
1810
+
1811
+
1812
+
1813
+ <span class="md-ellipsis">
1814
+
1815
+
1816
+ API Reference
1817
+
1818
+
1819
+
1820
+ </span>
1821
+
1822
+
1823
+
1824
+ </a>
1825
+
1826
+
1827
+ <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1828
+ <span class="md-nav__icon md-icon"></span>
1829
+ </label>
1830
+
1831
+ </div>
1832
+
1833
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1834
+ <label class="md-nav__title" for="__nav_5">
1835
+ <span class="md-nav__icon md-icon"></span>
1836
+
1837
+
1838
+ API Reference
1839
+
1840
+
1841
+ </label>
1842
+ <ul class="md-nav__list" data-md-scrollfix>
1843
+
1844
+
1845
+
1846
+
1847
+
1848
+
1849
+
1850
+
1851
+
1852
+
1853
+
1854
+
1855
+
1856
+
1857
+
1858
+
1859
+
1860
+
1861
+
1862
+
1863
+
1864
+
1865
+
1866
+
1867
+
1868
+
1869
+
1870
+
1871
+
1872
+
1873
+
1874
+
1875
+
1876
+ <li class="md-nav__item md-nav__item--nested">
1877
+
1878
+
1879
+
1880
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" >
1881
+
1882
+
1883
+ <div class="md-nav__link md-nav__container">
1884
+ <a href="../../api/core/" class="md-nav__link ">
1885
+
1886
+
1887
+
1888
+ <span class="md-ellipsis">
1889
+
1890
+
1891
+ Core Classes
1892
+
1893
+
1894
+
1895
+ </span>
1896
+
1897
+
1898
+
1899
+ </a>
1900
+
1901
+
1902
+ <label class="md-nav__link " for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
1903
+ <span class="md-nav__icon md-icon"></span>
1904
+ </label>
1905
+
1906
+ </div>
1907
+
1908
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
1909
+ <label class="md-nav__title" for="__nav_5_2">
1910
+ <span class="md-nav__icon md-icon"></span>
1911
+
1912
+
1913
+ Core Classes
1914
+
1915
+
1916
+ </label>
1917
+ <ul class="md-nav__list" data-md-scrollfix>
1918
+
1919
+
1920
+
1921
+
1922
+
1923
+
1924
+
1925
+
1926
+
1927
+ <li class="md-nav__item">
1928
+ <a href="../../api/core/robot/" class="md-nav__link">
1929
+
1930
+
1931
+
1932
+ <span class="md-ellipsis">
1933
+
1934
+
1935
+ Robot
1936
+
1937
+
1938
+
1939
+ </span>
1940
+
1941
+
1942
+
1943
+ </a>
1944
+ </li>
1945
+
1946
+
1947
+
1948
+
1949
+
1950
+
1951
+
1952
+
1953
+
1954
+
1955
+ <li class="md-nav__item">
1956
+ <a href="../../api/core/network/" class="md-nav__link">
1957
+
1958
+
1959
+
1960
+ <span class="md-ellipsis">
1961
+
1962
+
1963
+ Network
1964
+
1965
+
1966
+
1967
+ </span>
1968
+
1969
+
1970
+
1971
+ </a>
1972
+ </li>
1973
+
1974
+
1975
+
1976
+
1977
+
1978
+
1979
+
1980
+
1981
+
1982
+
1983
+ <li class="md-nav__item">
1984
+ <a href="../../api/core/state/" class="md-nav__link">
1985
+
1986
+
1987
+
1988
+ <span class="md-ellipsis">
1989
+
1990
+
1991
+ State
1992
+
1993
+
1994
+
1995
+ </span>
1996
+
1997
+
1998
+
1999
+ </a>
2000
+ </li>
2001
+
2002
+
2003
+
2004
+
2005
+
2006
+
2007
+
2008
+
2009
+
2010
+
2011
+ <li class="md-nav__item">
2012
+ <a href="../../api/core/tool/" class="md-nav__link">
2013
+
2014
+
2015
+
2016
+ <span class="md-ellipsis">
2017
+
2018
+
2019
+ Tool
2020
+
2021
+
2022
+
2023
+ </span>
2024
+
2025
+
2026
+
2027
+ </a>
2028
+ </li>
2029
+
2030
+
2031
+
2032
+
2033
+
2034
+
2035
+
2036
+
2037
+
2038
+
2039
+ <li class="md-nav__item">
2040
+ <a href="../../api/core/memory/" class="md-nav__link">
2041
+
2042
+
2043
+
2044
+ <span class="md-ellipsis">
2045
+
2046
+
2047
+ Memory
2048
+
2049
+
2050
+
2051
+ </span>
2052
+
2053
+
2054
+
2055
+ </a>
2056
+ </li>
2057
+
2058
+
2059
+
2060
+
2061
+ </ul>
2062
+ </nav>
2063
+
2064
+ </li>
2065
+
2066
+
2067
+
2068
+
2069
+
2070
+
2071
+
2072
+
2073
+
2074
+
2075
+
2076
+
2077
+
2078
+
2079
+
2080
+
2081
+
2082
+
2083
+
2084
+
2085
+
2086
+
2087
+
2088
+
2089
+
2090
+
2091
+
2092
+
2093
+
2094
+
2095
+
2096
+
2097
+ <li class="md-nav__item md-nav__item--nested">
2098
+
2099
+
2100
+
2101
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_3" >
2102
+
2103
+
2104
+ <div class="md-nav__link md-nav__container">
2105
+ <a href="../../api/messages/" class="md-nav__link ">
2106
+
2107
+
2108
+
2109
+ <span class="md-ellipsis">
2110
+
2111
+
2112
+ Messages
2113
+
2114
+
2115
+
2116
+ </span>
2117
+
2118
+
2119
+
2120
+ </a>
2121
+
2122
+
2123
+ <label class="md-nav__link " for="__nav_5_3" id="__nav_5_3_label" tabindex="0">
2124
+ <span class="md-nav__icon md-icon"></span>
2125
+ </label>
2126
+
2127
+ </div>
2128
+
2129
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_3_label" aria-expanded="false">
2130
+ <label class="md-nav__title" for="__nav_5_3">
2131
+ <span class="md-nav__icon md-icon"></span>
2132
+
2133
+
2134
+ Messages
2135
+
2136
+
2137
+ </label>
2138
+ <ul class="md-nav__list" data-md-scrollfix>
2139
+
2140
+
2141
+
2142
+
2143
+
2144
+
2145
+
2146
+
2147
+
2148
+ <li class="md-nav__item">
2149
+ <a href="../../api/messages/user-message/" class="md-nav__link">
2150
+
2151
+
2152
+
2153
+ <span class="md-ellipsis">
2154
+
2155
+
2156
+ UserMessage
2157
+
2158
+
2159
+
2160
+ </span>
2161
+
2162
+
2163
+
2164
+ </a>
2165
+ </li>
2166
+
2167
+
2168
+
2169
+
2170
+
2171
+
2172
+
2173
+
2174
+
2175
+
2176
+ <li class="md-nav__item">
2177
+ <a href="../../api/messages/text-message/" class="md-nav__link">
2178
+
2179
+
2180
+
2181
+ <span class="md-ellipsis">
2182
+
2183
+
2184
+ TextMessage
2185
+
2186
+
2187
+
2188
+ </span>
2189
+
2190
+
2191
+
2192
+ </a>
2193
+ </li>
2194
+
2195
+
2196
+
2197
+
2198
+
2199
+
2200
+
2201
+
2202
+
2203
+
2204
+ <li class="md-nav__item">
2205
+ <a href="../../api/messages/tool-call-message/" class="md-nav__link">
2206
+
2207
+
2208
+
2209
+ <span class="md-ellipsis">
2210
+
2211
+
2212
+ ToolCallMessage
2213
+
2214
+
2215
+
2216
+ </span>
2217
+
2218
+
2219
+
2220
+ </a>
2221
+ </li>
2222
+
2223
+
2224
+
2225
+
2226
+
2227
+
2228
+
2229
+
2230
+
2231
+
2232
+ <li class="md-nav__item">
2233
+ <a href="../../api/messages/tool-result-message/" class="md-nav__link">
2234
+
2235
+
2236
+
2237
+ <span class="md-ellipsis">
2238
+
2239
+
2240
+ ToolResultMessage
2241
+
2242
+
2243
+
2244
+ </span>
2245
+
2246
+
2247
+
2248
+ </a>
2249
+ </li>
2250
+
2251
+
2252
+
2253
+
2254
+ </ul>
2255
+ </nav>
2256
+
2257
+ </li>
2258
+
2259
+
2260
+
2261
+
2262
+
2263
+
2264
+
2265
+
2266
+
2267
+
2268
+
2269
+
2270
+
2271
+
2272
+
2273
+
2274
+
2275
+
2276
+
2277
+
2278
+
2279
+
2280
+
2281
+
2282
+
2283
+
2284
+
2285
+
2286
+
2287
+
2288
+ <li class="md-nav__item md-nav__item--nested">
2289
+
2290
+
2291
+
2292
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_4" >
2293
+
2294
+
2295
+ <div class="md-nav__link md-nav__container">
2296
+ <a href="../../api/mcp/" class="md-nav__link ">
2297
+
2298
+
2299
+
2300
+ <span class="md-ellipsis">
2301
+
2302
+
2303
+ MCP
2304
+
2305
+
2306
+
2307
+ </span>
2308
+
2309
+
2310
+
2311
+ </a>
2312
+
2313
+
2314
+ <label class="md-nav__link " for="__nav_5_4" id="__nav_5_4_label" tabindex="0">
2315
+ <span class="md-nav__icon md-icon"></span>
2316
+ </label>
2317
+
2318
+ </div>
2319
+
2320
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_4_label" aria-expanded="false">
2321
+ <label class="md-nav__title" for="__nav_5_4">
2322
+ <span class="md-nav__icon md-icon"></span>
2323
+
2324
+
2325
+ MCP
2326
+
2327
+
2328
+ </label>
2329
+ <ul class="md-nav__list" data-md-scrollfix>
2330
+
2331
+
2332
+
2333
+
2334
+
2335
+
2336
+
2337
+
2338
+
2339
+ <li class="md-nav__item">
2340
+ <a href="../../api/mcp/client/" class="md-nav__link">
2341
+
2342
+
2343
+
2344
+ <span class="md-ellipsis">
2345
+
2346
+
2347
+ Client
2348
+
2349
+
2350
+
2351
+ </span>
2352
+
2353
+
2354
+
2355
+ </a>
2356
+ </li>
2357
+
2358
+
2359
+
2360
+
2361
+
2362
+
2363
+
2364
+
2365
+
2366
+
2367
+ <li class="md-nav__item">
2368
+ <a href="../../api/mcp/server/" class="md-nav__link">
2369
+
2370
+
2371
+
2372
+ <span class="md-ellipsis">
2373
+
2374
+
2375
+ Server
2376
+
2377
+
2378
+
2379
+ </span>
2380
+
2381
+
2382
+
2383
+ </a>
2384
+ </li>
2385
+
2386
+
2387
+
2388
+
2389
+
2390
+
2391
+
2392
+
2393
+
2394
+
2395
+ <li class="md-nav__item">
2396
+ <a href="../../api/mcp/transports/" class="md-nav__link">
2397
+
2398
+
2399
+
2400
+ <span class="md-ellipsis">
2401
+
2402
+
2403
+ Transports
2404
+
2405
+
2406
+
2407
+ </span>
2408
+
2409
+
2410
+
2411
+ </a>
2412
+ </li>
2413
+
2414
+
2415
+
2416
+
2417
+ </ul>
2418
+ </nav>
2419
+
2420
+ </li>
2421
+
2422
+
2423
+
2424
+
2425
+
2426
+
2427
+
2428
+
2429
+
2430
+
2431
+
2432
+
2433
+
2434
+
2435
+
2436
+
2437
+
2438
+
2439
+
2440
+
2441
+
2442
+
2443
+
2444
+
2445
+
2446
+
2447
+
2448
+
2449
+ <li class="md-nav__item md-nav__item--nested">
2450
+
2451
+
2452
+
2453
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_5" >
2454
+
2455
+
2456
+ <div class="md-nav__link md-nav__container">
2457
+ <a href="../../api/streaming/" class="md-nav__link ">
2458
+
2459
+
2460
+
2461
+ <span class="md-ellipsis">
2462
+
2463
+
2464
+ Streaming
2465
+
2466
+
2467
+
2468
+ </span>
2469
+
2470
+
2471
+
2472
+ </a>
2473
+
2474
+
2475
+ <label class="md-nav__link " for="__nav_5_5" id="__nav_5_5_label" tabindex="0">
2476
+ <span class="md-nav__icon md-icon"></span>
2477
+ </label>
2478
+
2479
+ </div>
2480
+
2481
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_5_label" aria-expanded="false">
2482
+ <label class="md-nav__title" for="__nav_5_5">
2483
+ <span class="md-nav__icon md-icon"></span>
2484
+
2485
+
2486
+ Streaming
2487
+
2488
+
2489
+ </label>
2490
+ <ul class="md-nav__list" data-md-scrollfix>
2491
+
2492
+
2493
+
2494
+
2495
+
2496
+
2497
+
2498
+
2499
+
2500
+ <li class="md-nav__item">
2501
+ <a href="../../api/streaming/context/" class="md-nav__link">
2502
+
2503
+
2504
+
2505
+ <span class="md-ellipsis">
2506
+
2507
+
2508
+ Context
2509
+
2510
+
2511
+
2512
+ </span>
2513
+
2514
+
2515
+
2516
+ </a>
2517
+ </li>
2518
+
2519
+
2520
+
2521
+
2522
+
2523
+
2524
+
2525
+
2526
+
2527
+
2528
+ <li class="md-nav__item">
2529
+ <a href="../../api/streaming/events/" class="md-nav__link">
2530
+
2531
+
2532
+
2533
+ <span class="md-ellipsis">
2534
+
2535
+
2536
+ Events
2537
+
2538
+
2539
+
2540
+ </span>
2541
+
2542
+
2543
+
2544
+ </a>
2545
+ </li>
2546
+
2547
+
2548
+
2549
+
2550
+ </ul>
2551
+ </nav>
2552
+
2553
+ </li>
2554
+
2555
+
2556
+
2557
+
2558
+ </ul>
2559
+ </nav>
2560
+
2561
+ </li>
2562
+
2563
+
2564
+
2565
+
2566
+
2567
+
2568
+
2569
+
2570
+
2571
+
2572
+
2573
+
2574
+
2575
+
2576
+
2577
+
2578
+
2579
+
2580
+
2581
+
2582
+
2583
+
2584
+
2585
+
2586
+
2587
+
2588
+
2589
+
2590
+
2591
+
2592
+
2593
+
2594
+
2595
+ <li class="md-nav__item md-nav__item--nested">
2596
+
2597
+
2598
+
2599
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
2600
+
2601
+
2602
+ <div class="md-nav__link md-nav__container">
2603
+ <a href="../../examples/" class="md-nav__link ">
2604
+
2605
+
2606
+
2607
+ <span class="md-ellipsis">
2608
+
2609
+
2610
+ Examples
2611
+
2612
+
2613
+
2614
+ </span>
2615
+
2616
+
2617
+
2618
+ </a>
2619
+
2620
+
2621
+ <label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="0">
2622
+ <span class="md-nav__icon md-icon"></span>
2623
+ </label>
2624
+
2625
+ </div>
2626
+
2627
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
2628
+ <label class="md-nav__title" for="__nav_6">
2629
+ <span class="md-nav__icon md-icon"></span>
2630
+
2631
+
2632
+ Examples
2633
+
2634
+
2635
+ </label>
2636
+ <ul class="md-nav__list" data-md-scrollfix>
2637
+
2638
+
2639
+
2640
+
2641
+
2642
+
2643
+
2644
+
2645
+
2646
+ <li class="md-nav__item">
2647
+ <a href="../../examples/basic-chat/" class="md-nav__link">
2648
+
2649
+
2650
+
2651
+ <span class="md-ellipsis">
2652
+
2653
+
2654
+ Basic Chat
2655
+
2656
+
2657
+
2658
+ </span>
2659
+
2660
+
2661
+
2662
+ </a>
2663
+ </li>
2664
+
2665
+
2666
+
2667
+
2668
+
2669
+
2670
+
2671
+
2672
+
2673
+
2674
+ <li class="md-nav__item">
2675
+ <a href="../../examples/multi-robot-network/" class="md-nav__link">
2676
+
2677
+
2678
+
2679
+ <span class="md-ellipsis">
2680
+
2681
+
2682
+ Multi-Robot Network
2683
+
2684
+
2685
+
2686
+ </span>
2687
+
2688
+
2689
+
2690
+ </a>
2691
+ </li>
2692
+
2693
+
2694
+
2695
+
2696
+
2697
+
2698
+
2699
+
2700
+
2701
+
2702
+ <li class="md-nav__item">
2703
+ <a href="../../examples/tool-usage/" class="md-nav__link">
2704
+
2705
+
2706
+
2707
+ <span class="md-ellipsis">
2708
+
2709
+
2710
+ Tool Usage
2711
+
2712
+
2713
+
2714
+ </span>
2715
+
2716
+
2717
+
2718
+ </a>
2719
+ </li>
2720
+
2721
+
2722
+
2723
+
2724
+
2725
+
2726
+
2727
+
2728
+
2729
+
2730
+ <li class="md-nav__item">
2731
+ <a href="../../examples/mcp-server/" class="md-nav__link">
2732
+
2733
+
2734
+
2735
+ <span class="md-ellipsis">
2736
+
2737
+
2738
+ MCP Server
2739
+
2740
+
2741
+
2742
+ </span>
2743
+
2744
+
2745
+
2746
+ </a>
2747
+ </li>
2748
+
2749
+
2750
+
2751
+
2752
+
2753
+
2754
+
2755
+
2756
+
2757
+
2758
+ <li class="md-nav__item">
2759
+ <a href="../../examples/rails-application/" class="md-nav__link">
2760
+
2761
+
2762
+
2763
+ <span class="md-ellipsis">
2764
+
2765
+
2766
+ Rails Application
2767
+
2768
+
2769
+
2770
+ </span>
2771
+
2772
+
2773
+
2774
+ </a>
2775
+ </li>
2776
+
2777
+
2778
+
2779
+
2780
+ </ul>
2781
+ </nav>
2782
+
2783
+ </li>
2784
+
2785
+
2786
+
2787
+ </ul>
2788
+ </nav>
2789
+ </div>
2790
+ </div>
2791
+ </div>
2792
+
2793
+
2794
+
2795
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2796
+ <div class="md-sidebar__scrollwrap">
2797
+ <div class="md-sidebar__inner">
2798
+
2799
+
2800
+
2801
+
2802
+ <nav class="md-nav md-nav--secondary" aria-label="On this page">
2803
+
2804
+
2805
+
2806
+
2807
+
2808
+
2809
+ <label class="md-nav__title" for="__toc">
2810
+ <span class="md-nav__icon md-icon"></span>
2811
+ On this page
2812
+ </label>
2813
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2814
+
2815
+ <li class="md-nav__item">
2816
+ <a href="#basic-robot" class="md-nav__link">
2817
+ <span class="md-ellipsis">
2818
+
2819
+ Basic Robot
2820
+
2821
+ </span>
2822
+ </a>
2823
+
2824
+ </li>
2825
+
2826
+ <li class="md-nav__item">
2827
+ <a href="#robot-properties" class="md-nav__link">
2828
+ <span class="md-ellipsis">
2829
+
2830
+ Robot Properties
2831
+
2832
+ </span>
2833
+ </a>
2834
+
2835
+ <nav class="md-nav" aria-label="Robot Properties">
2836
+ <ul class="md-nav__list">
2837
+
2838
+ <li class="md-nav__item">
2839
+ <a href="#name" class="md-nav__link">
2840
+ <span class="md-ellipsis">
2841
+
2842
+ Name
2843
+
2844
+ </span>
2845
+ </a>
2846
+
2847
+ </li>
2848
+
2849
+ <li class="md-nav__item">
2850
+ <a href="#description" class="md-nav__link">
2851
+ <span class="md-ellipsis">
2852
+
2853
+ Description
2854
+
2855
+ </span>
2856
+ </a>
2857
+
2858
+ </li>
2859
+
2860
+ <li class="md-nav__item">
2861
+ <a href="#model" class="md-nav__link">
2862
+ <span class="md-ellipsis">
2863
+
2864
+ Model
2865
+
2866
+ </span>
2867
+ </a>
2868
+
2869
+ </li>
2870
+
2871
+ <li class="md-nav__item">
2872
+ <a href="#system-prompt" class="md-nav__link">
2873
+ <span class="md-ellipsis">
2874
+
2875
+ System Prompt
2876
+
2877
+ </span>
2878
+ </a>
2879
+
2880
+ </li>
2881
+
2882
+ </ul>
2883
+ </nav>
2884
+
2885
+ </li>
2886
+
2887
+ <li class="md-nav__item">
2888
+ <a href="#template-files" class="md-nav__link">
2889
+ <span class="md-ellipsis">
2890
+
2891
+ Template Files
2892
+
2893
+ </span>
2894
+ </a>
2895
+
2896
+ <nav class="md-nav" aria-label="Template Files">
2897
+ <ul class="md-nav__list">
2898
+
2899
+ <li class="md-nav__item">
2900
+ <a href="#template-format" class="md-nav__link">
2901
+ <span class="md-ellipsis">
2902
+
2903
+ Template Format
2904
+
2905
+ </span>
2906
+ </a>
2907
+
2908
+ </li>
2909
+
2910
+ <li class="md-nav__item">
2911
+ <a href="#front-matter-configuration" class="md-nav__link">
2912
+ <span class="md-ellipsis">
2913
+
2914
+ Front Matter Configuration
2915
+
2916
+ </span>
2917
+ </a>
2918
+
2919
+ </li>
2920
+
2921
+ <li class="md-nav__item">
2922
+ <a href="#self-contained-templates" class="md-nav__link">
2923
+ <span class="md-ellipsis">
2924
+
2925
+ Self-Contained Templates
2926
+
2927
+ </span>
2928
+ </a>
2929
+
2930
+ </li>
2931
+
2932
+ <li class="md-nav__item">
2933
+ <a href="#tools-in-front-matter" class="md-nav__link">
2934
+ <span class="md-ellipsis">
2935
+
2936
+ Tools in Front Matter
2937
+
2938
+ </span>
2939
+ </a>
2940
+
2941
+ </li>
2942
+
2943
+ <li class="md-nav__item">
2944
+ <a href="#mcp-in-front-matter" class="md-nav__link">
2945
+ <span class="md-ellipsis">
2946
+
2947
+ MCP in Front Matter
2948
+
2949
+ </span>
2950
+ </a>
2951
+
2952
+ </li>
2953
+
2954
+ <li class="md-nav__item">
2955
+ <a href="#template-with-system-prompt" class="md-nav__link">
2956
+ <span class="md-ellipsis">
2957
+
2958
+ Template with System Prompt
2959
+
2960
+ </span>
2961
+ </a>
2962
+
2963
+ </li>
2964
+
2965
+ </ul>
2966
+ </nav>
2967
+
2968
+ </li>
2969
+
2970
+ <li class="md-nav__item">
2971
+ <a href="#composable-skills" class="md-nav__link">
2972
+ <span class="md-ellipsis">
2973
+
2974
+ Composable Skills
2975
+
2976
+ </span>
2977
+ </a>
2978
+
2979
+ <nav class="md-nav" aria-label="Composable Skills">
2980
+ <ul class="md-nav__list">
2981
+
2982
+ <li class="md-nav__item">
2983
+ <a href="#why-skills" class="md-nav__link">
2984
+ <span class="md-ellipsis">
2985
+
2986
+ Why Skills?
2987
+
2988
+ </span>
2989
+ </a>
2990
+
2991
+ </li>
2992
+
2993
+ <li class="md-nav__item">
2994
+ <a href="#defining-a-skill" class="md-nav__link">
2995
+ <span class="md-ellipsis">
2996
+
2997
+ Defining a Skill
2998
+
2999
+ </span>
3000
+ </a>
3001
+
3002
+ </li>
3003
+
3004
+ <li class="md-nav__item">
3005
+ <a href="#using-skills-via-constructor" class="md-nav__link">
3006
+ <span class="md-ellipsis">
3007
+
3008
+ Using Skills via Constructor
3009
+
3010
+ </span>
3011
+ </a>
3012
+
3013
+ </li>
3014
+
3015
+ <li class="md-nav__item">
3016
+ <a href="#using-skills-via-front-matter" class="md-nav__link">
3017
+ <span class="md-ellipsis">
3018
+
3019
+ Using Skills via Front Matter
3020
+
3021
+ </span>
3022
+ </a>
3023
+
3024
+ </li>
3025
+
3026
+ <li class="md-nav__item">
3027
+ <a href="#nested-skills" class="md-nav__link">
3028
+ <span class="md-ellipsis">
3029
+
3030
+ Nested Skills
3031
+
3032
+ </span>
3033
+ </a>
3034
+
3035
+ </li>
3036
+
3037
+ <li class="md-nav__item">
3038
+ <a href="#cycle-detection" class="md-nav__link">
3039
+ <span class="md-ellipsis">
3040
+
3041
+ Cycle Detection
3042
+
3043
+ </span>
3044
+ </a>
3045
+
3046
+ </li>
3047
+
3048
+ <li class="md-nav__item">
3049
+ <a href="#config-cascade" class="md-nav__link">
3050
+ <span class="md-ellipsis">
3051
+
3052
+ Config Cascade
3053
+
3054
+ </span>
3055
+ </a>
3056
+
3057
+ </li>
3058
+
3059
+ <li class="md-nav__item">
3060
+ <a href="#skills-without-a-main-template" class="md-nav__link">
3061
+ <span class="md-ellipsis">
3062
+
3063
+ Skills Without a Main Template
3064
+
3065
+ </span>
3066
+ </a>
3067
+
3068
+ </li>
3069
+
3070
+ <li class="md-nav__item">
3071
+ <a href="#shared-context" class="md-nav__link">
3072
+ <span class="md-ellipsis">
3073
+
3074
+ Shared Context
3075
+
3076
+ </span>
3077
+ </a>
3078
+
3079
+ </li>
3080
+
3081
+ </ul>
3082
+ </nav>
3083
+
3084
+ </li>
3085
+
3086
+ <li class="md-nav__item">
3087
+ <a href="#adding-tools" class="md-nav__link">
3088
+ <span class="md-ellipsis">
3089
+
3090
+ Adding Tools
3091
+
3092
+ </span>
3093
+ </a>
3094
+
3095
+ </li>
3096
+
3097
+ <li class="md-nav__item">
3098
+ <a href="#mcp-configuration" class="md-nav__link">
3099
+ <span class="md-ellipsis">
3100
+
3101
+ MCP Configuration
3102
+
3103
+ </span>
3104
+ </a>
3105
+
3106
+ </li>
3107
+
3108
+ <li class="md-nav__item">
3109
+ <a href="#chaining-configuration" class="md-nav__link">
3110
+ <span class="md-ellipsis">
3111
+
3112
+ Chaining Configuration
3113
+
3114
+ </span>
3115
+ </a>
3116
+
3117
+ <nav class="md-nav" aria-label="Chaining Configuration">
3118
+ <ul class="md-nav__list">
3119
+
3120
+ <li class="md-nav__item">
3121
+ <a href="#available-chain-methods" class="md-nav__link">
3122
+ <span class="md-ellipsis">
3123
+
3124
+ Available Chain Methods
3125
+
3126
+ </span>
3127
+ </a>
3128
+
3129
+ </li>
3130
+
3131
+ </ul>
3132
+ </nav>
3133
+
3134
+ </li>
3135
+
3136
+ <li class="md-nav__item">
3137
+ <a href="#running-robots" class="md-nav__link">
3138
+ <span class="md-ellipsis">
3139
+
3140
+ Running Robots
3141
+
3142
+ </span>
3143
+ </a>
3144
+
3145
+ <nav class="md-nav" aria-label="Running Robots">
3146
+ <ul class="md-nav__list">
3147
+
3148
+ <li class="md-nav__item">
3149
+ <a href="#standalone" class="md-nav__link">
3150
+ <span class="md-ellipsis">
3151
+
3152
+ Standalone
3153
+
3154
+ </span>
3155
+ </a>
3156
+
3157
+ </li>
3158
+
3159
+ <li class="md-nav__item">
3160
+ <a href="#with-runtime-memory" class="md-nav__link">
3161
+ <span class="md-ellipsis">
3162
+
3163
+ With Runtime Memory
3164
+
3165
+ </span>
3166
+ </a>
3167
+
3168
+ </li>
3169
+
3170
+ <li class="md-nav__item">
3171
+ <a href="#in-a-network" class="md-nav__link">
3172
+ <span class="md-ellipsis">
3173
+
3174
+ In a Network
3175
+
3176
+ </span>
3177
+ </a>
3178
+
3179
+ </li>
3180
+
3181
+ <li class="md-nav__item">
3182
+ <a href="#with-streaming" class="md-nav__link">
3183
+ <span class="md-ellipsis">
3184
+
3185
+ With Streaming
3186
+
3187
+ </span>
3188
+ </a>
3189
+
3190
+ </li>
3191
+
3192
+ </ul>
3193
+ </nav>
3194
+
3195
+ </li>
3196
+
3197
+ <li class="md-nav__item">
3198
+ <a href="#robot-patterns" class="md-nav__link">
3199
+ <span class="md-ellipsis">
3200
+
3201
+ Robot Patterns
3202
+
3203
+ </span>
3204
+ </a>
3205
+
3206
+ <nav class="md-nav" aria-label="Robot Patterns">
3207
+ <ul class="md-nav__list">
3208
+
3209
+ <li class="md-nav__item">
3210
+ <a href="#classifier-robot" class="md-nav__link">
3211
+ <span class="md-ellipsis">
3212
+
3213
+ Classifier Robot
3214
+
3215
+ </span>
3216
+ </a>
3217
+
3218
+ </li>
3219
+
3220
+ <li class="md-nav__item">
3221
+ <a href="#specialist-robot" class="md-nav__link">
3222
+ <span class="md-ellipsis">
3223
+
3224
+ Specialist Robot
3225
+
3226
+ </span>
3227
+ </a>
3228
+
3229
+ </li>
3230
+
3231
+ <li class="md-nav__item">
3232
+ <a href="#summarizer-robot" class="md-nav__link">
3233
+ <span class="md-ellipsis">
3234
+
3235
+ Summarizer Robot
3236
+
3237
+ </span>
3238
+ </a>
3239
+
3240
+ </li>
3241
+
3242
+ <li class="md-nav__item">
3243
+ <a href="#bus-connected-robot" class="md-nav__link">
3244
+ <span class="md-ellipsis">
3245
+
3246
+ Bus-Connected Robot
3247
+
3248
+ </span>
3249
+ </a>
3250
+
3251
+ </li>
3252
+
3253
+ <li class="md-nav__item">
3254
+ <a href="#spawning-robots-dynamically" class="md-nav__link">
3255
+ <span class="md-ellipsis">
3256
+
3257
+ Spawning Robots Dynamically
3258
+
3259
+ </span>
3260
+ </a>
3261
+
3262
+ </li>
3263
+
3264
+ </ul>
3265
+ </nav>
3266
+
3267
+ </li>
3268
+
3269
+ <li class="md-nav__item">
3270
+ <a href="#configuration" class="md-nav__link">
3271
+ <span class="md-ellipsis">
3272
+
3273
+ Configuration
3274
+
3275
+ </span>
3276
+ </a>
3277
+
3278
+ </li>
3279
+
3280
+ <li class="md-nav__item">
3281
+ <a href="#best-practices" class="md-nav__link">
3282
+ <span class="md-ellipsis">
3283
+
3284
+ Best Practices
3285
+
3286
+ </span>
3287
+ </a>
3288
+
3289
+ <nav class="md-nav" aria-label="Best Practices">
3290
+ <ul class="md-nav__list">
3291
+
3292
+ <li class="md-nav__item">
3293
+ <a href="#1-clear-focused-prompts" class="md-nav__link">
3294
+ <span class="md-ellipsis">
3295
+
3296
+ 1. Clear, Focused Prompts
3297
+
3298
+ </span>
3299
+ </a>
3300
+
3301
+ </li>
3302
+
3303
+ <li class="md-nav__item">
3304
+ <a href="#2-compose-behaviors-with-skills" class="md-nav__link">
3305
+ <span class="md-ellipsis">
3306
+
3307
+ 2. Compose Behaviors with Skills
3308
+
3309
+ </span>
3310
+ </a>
3311
+
3312
+ </li>
3313
+
3314
+ <li class="md-nav__item">
3315
+ <a href="#3-use-templates-for-reusable-prompts" class="md-nav__link">
3316
+ <span class="md-ellipsis">
3317
+
3318
+ 3. Use Templates for Reusable Prompts
3319
+
3320
+ </span>
3321
+ </a>
3322
+
3323
+ </li>
3324
+
3325
+ <li class="md-nav__item">
3326
+ <a href="#4-handle-tool-errors-gracefully" class="md-nav__link">
3327
+ <span class="md-ellipsis">
3328
+
3329
+ 4. Handle Tool Errors Gracefully
3330
+
3331
+ </span>
3332
+ </a>
3333
+
3334
+ </li>
3335
+
3336
+ </ul>
3337
+ </nav>
3338
+
3339
+ </li>
3340
+
3341
+ <li class="md-nav__item">
3342
+ <a href="#next-steps" class="md-nav__link">
3343
+ <span class="md-ellipsis">
3344
+
3345
+ Next Steps
3346
+
3347
+ </span>
3348
+ </a>
3349
+
3350
+ </li>
3351
+
3352
+ </ul>
3353
+
3354
+ </nav>
3355
+ </div>
3356
+ </div>
3357
+ </div>
3358
+
3359
+
3360
+
3361
+ <div class="md-content" data-md-component="content">
3362
+
3363
+
3364
+
3365
+
3366
+
3367
+
3368
+
3369
+ <article class="md-content__inner md-typeset">
3370
+
3371
+
3372
+
3373
+
3374
+
3375
+ <a href="https://github.com/madbomber/robot_lab/edit/main/docs/guides/building-robots.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
3376
+
3377
+ <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>
3378
+ </a>
3379
+
3380
+
3381
+
3382
+
3383
+
3384
+ <a href="https://github.com/madbomber/robot_lab/raw/main/docs/guides/building-robots.md" title="View source of this page" class="md-content__button md-icon">
3385
+
3386
+ <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>
3387
+ </a>
3388
+
3389
+
3390
+
3391
+ <h1 id="building-robots">Building Robots<a class="headerlink" href="#building-robots" title="Permanent link">&para;</a></h1>
3392
+ <p>This guide covers everything you need to know about creating robots in RobotLab.</p>
3393
+ <h2 id="basic-robot">Basic Robot<a class="headerlink" href="#basic-robot" title="Permanent link">&para;</a></h2>
3394
+ <p>Create a robot using the <code>RobotLab.build</code> factory method with keyword arguments:</p>
3395
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-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>
3396
+ </span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-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>
3397
+ </span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-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 helpful assistant.&quot;</span>
3398
+ </span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="p">)</span>
3399
+ </span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>
3400
+ </span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-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;Hello!&quot;</span><span class="p">)</span>
3401
+ </span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></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>
3402
+ </span></code></pre></div>
3403
+ <h2 id="robot-properties">Robot Properties<a class="headerlink" href="#robot-properties" title="Permanent link">&para;</a></h2>
3404
+ <h3 id="name">Name<a class="headerlink" href="#name" title="Permanent link">&para;</a></h3>
3405
+ <p>A unique identifier used for routing and logging. If omitted, an auto-generated name is used:</p>
3406
+ <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="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;support_agent&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;...&quot;</span><span class="p">)</span>
3407
+ </span></code></pre></div>
3408
+ <h3 id="description">Description<a class="headerlink" href="#description" title="Permanent link">&para;</a></h3>
3409
+ <p>Describes what the robot does (useful for routing decisions):</p>
3410
+ <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>
3411
+ </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;support_agent&quot;</span><span class="p">,</span>
3412
+ </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">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Handles customer support inquiries about orders and refunds&quot;</span><span class="p">,</span>
3413
+ </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="s2">&quot;...&quot;</span>
3414
+ </span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="p">)</span>
3415
+ </span></code></pre></div>
3416
+ <h3 id="model">Model<a class="headerlink" href="#model" title="Permanent link">&para;</a></h3>
3417
+ <p>The LLM model to use. Defaults to the value in <code>RobotLab.config.ruby_llm.model</code>:</p>
3418
+ <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">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>
3419
+ </span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></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>
3420
+ </span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="w"> </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>
3421
+ </span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-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 are a creative writer.&quot;</span>
3422
+ </span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="p">)</span>
3423
+ </span></code></pre></div>
3424
+ <h3 id="system-prompt">System Prompt<a class="headerlink" href="#system-prompt" title="Permanent link">&para;</a></h3>
3425
+ <p>An inline string that defines the robot's personality and behavior:</p>
3426
+ <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="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>
3427
+ </span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-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>
3428
+ </span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="o">&lt;&lt;~</span><span class="dl">PROMPT</span>
3429
+ </span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="sh"> You are a customer support specialist for TechCo.</span>
3430
+ </span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a>
3431
+ </span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="sh"> Your responsibilities:</span>
3432
+ </span><span id="__span-4-7"><a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="sh"> - Answer questions about products and services</span>
3433
+ </span><span id="__span-4-8"><a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a><span class="sh"> - Help resolve order issues</span>
3434
+ </span><span id="__span-4-9"><a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="sh"> - Provide friendly, professional assistance</span>
3435
+ </span><span id="__span-4-10"><a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a>
3436
+ </span><span id="__span-4-11"><a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a><span class="sh"> Always be polite and acknowledge the customer&#39;s concerns.</span>
3437
+ </span><span id="__span-4-12"><a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a><span class="dl"> PROMPT</span>
3438
+ </span><span id="__span-4-13"><a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a><span class="p">)</span>
3439
+ </span></code></pre></div>
3440
+ <h2 id="template-files">Template Files<a class="headerlink" href="#template-files" title="Permanent link">&para;</a></h2>
3441
+ <p>Templates are <code>.md</code> files managed by <a href="https://github.com/MadBomber/prompt_manager">prompt_manager</a>. Reference a template by symbol; RobotLab resolves it through the configured template path.</p>
3442
+ <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="c1"># Reference template by symbol (loads prompts/support.md)</span>
3443
+ </span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-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>
3444
+ </span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></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>
3445
+ </span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></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>
3446
+ </span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-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;TechCo&quot;</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>
3447
+ </span><span id="__span-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a><span class="p">)</span>
3448
+ </span></code></pre></div>
3449
+ <h3 id="template-format">Template Format<a class="headerlink" href="#template-format" title="Permanent link">&para;</a></h3>
3450
+ <p>Templates use <code>.md</code> files with YAML front matter:</p>
3451
+ <div class="language-markdown highlight"><span class="filename">prompts/support.md</span><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>---
3452
+ </span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>description: Customer support assistant
3453
+ </span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>parameters:
3454
+ </span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a> company: &quot;Acme&quot;
3455
+ </span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a> tone: &quot;professional&quot;
3456
+ </span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>model: claude-sonnet-4
3457
+ </span><span id="__span-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="gu">temperature: 0.7</span>
3458
+ </span><span id="__span-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a><span class="gu">---</span>
3459
+ </span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a>You are a support agent for &lt;%= company %&gt;.
3460
+ </span><span id="__span-6-10"><a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a>Your tone should be &lt;%= tone %&gt;.
3461
+ </span></code></pre></div>
3462
+ <h3 id="front-matter-configuration">Front Matter Configuration<a class="headerlink" href="#front-matter-configuration" title="Permanent link">&para;</a></h3>
3463
+ <p>The following YAML front matter keys are applied to the robot's chat automatically:</p>
3464
+ <p><strong>LLM Configuration:</strong></p>
3465
+ <table>
3466
+ <thead>
3467
+ <tr>
3468
+ <th>Key</th>
3469
+ <th>Description</th>
3470
+ </tr>
3471
+ </thead>
3472
+ <tbody>
3473
+ <tr>
3474
+ <td><code>model</code></td>
3475
+ <td>Override the LLM model</td>
3476
+ </tr>
3477
+ <tr>
3478
+ <td><code>temperature</code></td>
3479
+ <td>Controls randomness (0.0 - 1.0)</td>
3480
+ </tr>
3481
+ <tr>
3482
+ <td><code>top_p</code></td>
3483
+ <td>Nucleus sampling threshold</td>
3484
+ </tr>
3485
+ <tr>
3486
+ <td><code>top_k</code></td>
3487
+ <td>Top-k sampling</td>
3488
+ </tr>
3489
+ <tr>
3490
+ <td><code>max_tokens</code></td>
3491
+ <td>Maximum tokens in response</td>
3492
+ </tr>
3493
+ <tr>
3494
+ <td><code>presence_penalty</code></td>
3495
+ <td>Penalize based on presence</td>
3496
+ </tr>
3497
+ <tr>
3498
+ <td><code>frequency_penalty</code></td>
3499
+ <td>Penalize based on frequency</td>
3500
+ </tr>
3501
+ <tr>
3502
+ <td><code>stop</code></td>
3503
+ <td>Stop sequences</td>
3504
+ </tr>
3505
+ </tbody>
3506
+ </table>
3507
+ <p><strong>Robot Identity and Capabilities:</strong></p>
3508
+ <table>
3509
+ <thead>
3510
+ <tr>
3511
+ <th>Key</th>
3512
+ <th>Description</th>
3513
+ </tr>
3514
+ </thead>
3515
+ <tbody>
3516
+ <tr>
3517
+ <td><code>robot_name</code></td>
3518
+ <td>Override the robot's name (when constructor uses the default)</td>
3519
+ </tr>
3520
+ <tr>
3521
+ <td><code>description</code></td>
3522
+ <td>Human-readable description of the robot</td>
3523
+ </tr>
3524
+ <tr>
3525
+ <td><code>tools</code></td>
3526
+ <td>Array of tool class names (resolved via <code>Object.const_get</code>)</td>
3527
+ </tr>
3528
+ <tr>
3529
+ <td><code>mcp</code></td>
3530
+ <td>Array of MCP server configurations</td>
3531
+ </tr>
3532
+ <tr>
3533
+ <td><code>skills</code></td>
3534
+ <td>Array of skill template symbols to prepend (see <a href="#composable-skills">Composable Skills</a>)</td>
3535
+ </tr>
3536
+ </tbody>
3537
+ </table>
3538
+ <p>Constructor-provided values always take precedence over frontmatter values.</p>
3539
+ <h3 id="self-contained-templates">Self-Contained Templates<a class="headerlink" href="#self-contained-templates" title="Permanent link">&para;</a></h3>
3540
+ <p>Templates can declare everything a robot needs — identity, tools, MCP servers, and LLM config — making the <code>.md</code> file a complete robot definition:</p>
3541
+ <div class="language-markdown highlight"><span class="filename">prompts/github_assistant.md</span><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>---
3542
+ </span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a>description: GitHub assistant with MCP tool access
3543
+ </span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a>robot_name: github_bot
3544
+ </span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a>mcp:
3545
+ </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="k">-</span><span class="w"> </span>name: github
3546
+ </span><span id="__span-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a> transport: stdio
3547
+ </span><span id="__span-7-7"><a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a> command: npx
3548
+ </span><span id="__span-7-8"><a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a> args: [&quot;-y&quot;, &quot;@modelcontextprotocol/server-github&quot;]
3549
+ </span><span id="__span-7-9"><a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a>model: claude-sonnet-4
3550
+ </span><span id="__span-7-10"><a id="__codelineno-7-10" name="__codelineno-7-10" href="#__codelineno-7-10"></a><span class="gu">temperature: 0.3</span>
3551
+ </span><span id="__span-7-11"><a id="__codelineno-7-11" name="__codelineno-7-11" href="#__codelineno-7-11"></a><span class="gu">---</span>
3552
+ </span><span id="__span-7-12"><a id="__codelineno-7-12" name="__codelineno-7-12" href="#__codelineno-7-12"></a>You are a helpful GitHub assistant with access to GitHub tools via MCP.
3553
+ </span><span id="__span-7-13"><a id="__codelineno-7-13" name="__codelineno-7-13" href="#__codelineno-7-13"></a>Use the available tools to help answer questions about GitHub repositories.
3554
+ </span></code></pre></div>
3555
+ <p>Build the robot with minimal constructor arguments:</p>
3556
+ <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="c1"># Template provides name, description, MCP config, model, and temperature</span>
3557
+ </span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-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="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:github_assistant</span><span class="p">)</span>
3558
+ </span></code></pre></div>
3559
+ <h3 id="tools-in-front-matter">Tools in Front Matter<a class="headerlink" href="#tools-in-front-matter" title="Permanent link">&para;</a></h3>
3560
+ <p>Declare tool classes by name in the <code>tools:</code> key. RobotLab resolves each string to a Ruby constant and instantiates it:</p>
3561
+ <div class="language-markdown highlight"><span class="filename">prompts/order_support.md</span><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a>---
3562
+ </span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a>description: Order support specialist
3563
+ </span><span id="__span-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a>tools:
3564
+ </span><span id="__span-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a><span class="w"> </span><span class="k">-</span><span class="w"> </span>OrderLookup
3565
+ </span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="gu"> - RefundProcessor</span>
3566
+ </span><span id="__span-9-6"><a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a><span class="gu">---</span>
3567
+ </span><span id="__span-9-7"><a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a>You help customers with order inquiries and refunds.
3568
+ </span></code></pre></div>
3569
+ <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="c1"># Tools are loaded from frontmatter — no local_tools: needed</span>
3570
+ </span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-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="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:order_support</span><span class="p">)</span>
3571
+ </span></code></pre></div>
3572
+ <p>Tool classes must be defined and loaded before the robot is built. If a tool name cannot be resolved, it is skipped with a warning.</p>
3573
+ <p>Constructor <code>local_tools:</code> overrides frontmatter <code>tools:</code> when provided:</p>
3574
+ <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="c1"># Constructor tools take precedence over frontmatter tools</span>
3575
+ </span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-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>
3576
+ </span><span id="__span-11-3"><a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:order_support</span><span class="p">,</span>
3577
+ </span><span id="__span-11-4"><a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></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">OrderLookup</span><span class="o">]</span><span class="w"> </span><span class="c1"># Only OrderLookup, not RefundProcessor</span>
3578
+ </span><span id="__span-11-5"><a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a><span class="p">)</span>
3579
+ </span></code></pre></div>
3580
+ <h3 id="mcp-in-front-matter">MCP in Front Matter<a class="headerlink" href="#mcp-in-front-matter" title="Permanent link">&para;</a></h3>
3581
+ <p>Declare MCP server configurations directly in the template:</p>
3582
+ <div class="language-markdown highlight"><span class="filename">prompts/developer.md</span><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a>---
3583
+ </span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a>description: Developer assistant with filesystem access
3584
+ </span><span id="__span-12-3"><a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a>mcp:
3585
+ </span><span id="__span-12-4"><a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a><span class="w"> </span><span class="k">-</span><span class="w"> </span>name: filesystem
3586
+ </span><span id="__span-12-5"><a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a> transport: stdio
3587
+ </span><span id="__span-12-6"><a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a> command: mcp-server-filesystem
3588
+ </span><span id="__span-12-7"><a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></a><span class="gu"> args: [&quot;--root&quot;, &quot;/home/user/projects&quot;]</span>
3589
+ </span><span id="__span-12-8"><a id="__codelineno-12-8" name="__codelineno-12-8" href="#__codelineno-12-8"></a><span class="gu">---</span>
3590
+ </span><span id="__span-12-9"><a id="__codelineno-12-9" name="__codelineno-12-9" href="#__codelineno-12-9"></a>You are a developer assistant with filesystem access.
3591
+ </span></code></pre></div>
3592
+ <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="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="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:developer</span><span class="p">)</span>
3593
+ </span></code></pre></div>
3594
+ <p>Constructor <code>mcp:</code> overrides frontmatter <code>mcp:</code> when provided.</p>
3595
+ <h3 id="template-with-system-prompt">Template with System Prompt<a class="headerlink" href="#template-with-system-prompt" title="Permanent link">&para;</a></h3>
3596
+ <p>You can combine a template and an inline system prompt. Both are applied to the chat -- the template first, then the system prompt is appended as additional instructions:</p>
3597
+ <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="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>
3598
+ </span><span id="__span-14-2"><a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-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>
3599
+ </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="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:support</span><span class="p">,</span>
3600
+ </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="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;TechCo&quot;</span><span class="w"> </span><span class="p">},</span>
3601
+ </span><span id="__span-14-5"><a id="__codelineno-14-5" name="__codelineno-14-5" href="#__codelineno-14-5"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Always respond in Spanish.&quot;</span>
3602
+ </span><span id="__span-14-6"><a id="__codelineno-14-6" name="__codelineno-14-6" href="#__codelineno-14-6"></a><span class="p">)</span>
3603
+ </span></code></pre></div>
3604
+ <h2 id="composable-skills">Composable Skills<a class="headerlink" href="#composable-skills" title="Permanent link">&para;</a></h2>
3605
+ <p>Skills let you compose robot behaviors from reusable templates without creating a dedicated template for every combination. A skill is just a regular template whose prompt body gets prepended before the main template's body.</p>
3606
+ <h3 id="why-skills">Why Skills?<a class="headerlink" href="#why-skills" title="Permanent link">&para;</a></h3>
3607
+ <p>Consider a support agent that needs to:</p>
3608
+ <ul>
3609
+ <li>Ask clarifying questions before acting</li>
3610
+ <li>Detect customer sentiment</li>
3611
+ <li>Respond in structured JSON</li>
3612
+ </ul>
3613
+ <p>Without skills, you'd create a single monolithic template or copy-paste shared instructions across templates. With skills, each behavior is a standalone template that can be mixed into any robot.</p>
3614
+ <h3 id="defining-a-skill">Defining a Skill<a class="headerlink" href="#defining-a-skill" title="Permanent link">&para;</a></h3>
3615
+ <p>A skill is a standard <code>.md</code> template file. There is no special syntax — any template can be used as a skill:</p>
3616
+ <div class="language-markdown highlight"><span class="filename">prompts/clarifier.md</span><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a>---
3617
+ </span><span id="__span-15-2"><a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a><span class="gu">description: Ask clarifying questions before acting</span>
3618
+ </span><span id="__span-15-3"><a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a><span class="gu">---</span>
3619
+ </span><span id="__span-15-4"><a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a>Before answering, consider whether the user&#39;s request is ambiguous.
3620
+ </span><span id="__span-15-5"><a id="__codelineno-15-5" name="__codelineno-15-5" href="#__codelineno-15-5"></a>If so, ask one focused clarifying question before proceeding.
3621
+ </span></code></pre></div>
3622
+ <div class="language-markdown highlight"><span class="filename">prompts/json_responder.md</span><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a>---
3623
+ </span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a>description: Respond in structured JSON
3624
+ </span><span id="__span-16-3"><a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a><span class="gu">temperature: 0.2</span>
3625
+ </span><span id="__span-16-4"><a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a><span class="gu">---</span>
3626
+ </span><span id="__span-16-5"><a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a>Always respond with valid JSON. Use this structure:
3627
+ </span><span id="__span-16-6"><a id="__codelineno-16-6" name="__codelineno-16-6" href="#__codelineno-16-6"></a>{&quot;answer&quot;: &quot;...&quot;, &quot;confidence&quot;: 0.0-1.0, &quot;sources&quot;: [...]}
3628
+ </span></code></pre></div>
3629
+ <h3 id="using-skills-via-constructor">Using Skills via Constructor<a class="headerlink" href="#using-skills-via-constructor" title="Permanent link">&para;</a></h3>
3630
+ <p>Pass <code>skills:</code> as a symbol or array of symbols:</p>
3631
+ <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="c1"># Single skill</span>
3632
+ </span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-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>
3633
+ </span><span id="__span-17-3"><a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></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>
3634
+ </span><span id="__span-17-4"><a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></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>
3635
+ </span><span id="__span-17-5"><a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a><span class="w"> </span><span class="ss">skills</span><span class="p">:</span><span class="w"> </span><span class="ss">:clarifier</span>
3636
+ </span><span id="__span-17-6"><a id="__codelineno-17-6" name="__codelineno-17-6" href="#__codelineno-17-6"></a><span class="p">)</span>
3637
+ </span><span id="__span-17-7"><a id="__codelineno-17-7" name="__codelineno-17-7" href="#__codelineno-17-7"></a>
3638
+ </span><span id="__span-17-8"><a id="__codelineno-17-8" name="__codelineno-17-8" href="#__codelineno-17-8"></a><span class="c1"># Multiple skills</span>
3639
+ </span><span id="__span-17-9"><a id="__codelineno-17-9" name="__codelineno-17-9" href="#__codelineno-17-9"></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>
3640
+ </span><span id="__span-17-10"><a id="__codelineno-17-10" name="__codelineno-17-10" href="#__codelineno-17-10"></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>
3641
+ </span><span id="__span-17-11"><a id="__codelineno-17-11" name="__codelineno-17-11" href="#__codelineno-17-11"></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>
3642
+ </span><span id="__span-17-12"><a id="__codelineno-17-12" name="__codelineno-17-12" href="#__codelineno-17-12"></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><span class="p">,</span>
3643
+ </span><span id="__span-17-13"><a id="__codelineno-17-13" name="__codelineno-17-13" href="#__codelineno-17-13"></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>
3644
+ </span><span id="__span-17-14"><a id="__codelineno-17-14" name="__codelineno-17-14" href="#__codelineno-17-14"></a><span class="p">)</span>
3645
+ </span></code></pre></div>
3646
+ <p>The resulting system prompt is composed in order: clarifier body, then json_responder body, then the main support template body.</p>
3647
+ <h3 id="using-skills-via-front-matter">Using Skills via Front Matter<a class="headerlink" href="#using-skills-via-front-matter" title="Permanent link">&para;</a></h3>
3648
+ <p>Templates can declare skills directly in their front matter:</p>
3649
+ <div class="language-markdown highlight"><span class="filename">prompts/smart_support.md</span><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a>---
3650
+ </span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a>description: Support agent with built-in skills
3651
+ </span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a>skills:
3652
+ </span><span id="__span-18-4"><a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a><span class="w"> </span><span class="k">-</span><span class="w"> </span>clarifier
3653
+ </span><span id="__span-18-5"><a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a><span class="w"> </span><span class="k">-</span><span class="w"> </span>json_responder
3654
+ </span><span id="__span-18-6"><a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-6"></a>parameters:
3655
+ </span><span id="__span-18-7"><a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-7"></a><span class="gu"> company: null</span>
3656
+ </span><span id="__span-18-8"><a id="__codelineno-18-8" name="__codelineno-18-8" href="#__codelineno-18-8"></a><span class="gu">---</span>
3657
+ </span><span id="__span-18-9"><a id="__codelineno-18-9" name="__codelineno-18-9" href="#__codelineno-18-9"></a>You are a support agent for &lt;%= company %&gt;.
3658
+ </span><span id="__span-18-10"><a id="__codelineno-18-10" name="__codelineno-18-10" href="#__codelineno-18-10"></a>Help customers with their inquiries.
3659
+ </span></code></pre></div>
3660
+ <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="c1"># Skills are loaded from front matter automatically</span>
3661
+ </span><span id="__span-19-2"><a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-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>
3662
+ </span><span id="__span-19-3"><a id="__codelineno-19-3" name="__codelineno-19-3" href="#__codelineno-19-3"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:smart_support</span><span class="p">,</span>
3663
+ </span><span id="__span-19-4"><a id="__codelineno-19-4" name="__codelineno-19-4" href="#__codelineno-19-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>
3664
+ </span><span id="__span-19-5"><a id="__codelineno-19-5" name="__codelineno-19-5" href="#__codelineno-19-5"></a><span class="p">)</span>
3665
+ </span></code></pre></div>
3666
+ <p>Constructor <code>skills:</code> and front matter <code>skills:</code> are combined — constructor skills are processed first, then front matter skills.</p>
3667
+ <h3 id="nested-skills">Nested Skills<a class="headerlink" href="#nested-skills" title="Permanent link">&para;</a></h3>
3668
+ <p>Skills can reference other skills, enabling layered composition:</p>
3669
+ <div class="language-markdown highlight"><span class="filename">prompts/safety.md</span><pre><span></span><code><span id="__span-20-1"><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a>---
3670
+ </span><span id="__span-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a>description: Safety guidelines
3671
+ </span><span id="__span-20-3"><a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-3"></a>skills:
3672
+ </span><span id="__span-20-4"><a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a><span class="w"> </span><span class="k">-</span><span class="w"> </span>content_filter
3673
+ </span><span id="__span-20-5"><a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a><span class="gu"> - pii_redactor</span>
3674
+ </span><span id="__span-20-6"><a id="__codelineno-20-6" name="__codelineno-20-6" href="#__codelineno-20-6"></a><span class="gu">---</span>
3675
+ </span><span id="__span-20-7"><a id="__codelineno-20-7" name="__codelineno-20-7" href="#__codelineno-20-7"></a>Follow all safety guidelines when responding.
3676
+ </span></code></pre></div>
3677
+ <p>Nested skills are expanded depth-first. For the example above, the prompt order would be: content_filter, pii_redactor, safety, then the main template.</p>
3678
+ <h3 id="cycle-detection">Cycle Detection<a class="headerlink" href="#cycle-detection" title="Permanent link">&para;</a></h3>
3679
+ <p>If skills form a cycle (A references B, B references A), RobotLab detects it automatically, logs a warning, and skips the duplicate. This prevents infinite loops.</p>
3680
+ <h3 id="config-cascade">Config Cascade<a class="headerlink" href="#config-cascade" title="Permanent link">&para;</a></h3>
3681
+ <p>Skills can include LLM configuration in their front matter. Config cascades in processing order — later values override earlier ones:</p>
3682
+ <div class="language-markdown highlight"><span class="filename">prompts/creative_mode.md</span><pre><span></span><code><span id="__span-21-1"><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a>---
3683
+ </span><span id="__span-21-2"><a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a>description: Enable creative responses
3684
+ </span><span id="__span-21-3"><a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a>temperature: 0.9
3685
+ </span><span id="__span-21-4"><a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-4"></a><span class="gu">top_p: 0.95</span>
3686
+ </span><span id="__span-21-5"><a id="__codelineno-21-5" name="__codelineno-21-5" href="#__codelineno-21-5"></a><span class="gu">---</span>
3687
+ </span><span id="__span-21-6"><a id="__codelineno-21-6" name="__codelineno-21-6" href="#__codelineno-21-6"></a>Be creative and imaginative in your responses.
3688
+ </span></code></pre></div>
3689
+ <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="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>
3690
+ </span><span id="__span-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></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>
3691
+ </span><span id="__span-22-3"><a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-3"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:article_writer</span><span class="p">,</span>
3692
+ </span><span id="__span-22-4"><a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-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">:creative_mode</span><span class="o">]</span>
3693
+ </span><span id="__span-22-5"><a id="__codelineno-22-5" name="__codelineno-22-5" href="#__codelineno-22-5"></a><span class="p">)</span>
3694
+ </span><span id="__span-22-6"><a id="__codelineno-22-6" name="__codelineno-22-6" href="#__codelineno-22-6"></a><span class="c1"># temperature is 0.9 from the skill (unless the main template or constructor overrides it)</span>
3695
+ </span></code></pre></div>
3696
+ <p>The precedence order (highest wins):</p>
3697
+ <ol>
3698
+ <li>Constructor kwargs (<code>temperature: 0.3</code>)</li>
3699
+ <li>Main template front matter</li>
3700
+ <li>Later skills override earlier skills</li>
3701
+ <li>First skill in the list</li>
3702
+ </ol>
3703
+ <h3 id="skills-without-a-main-template">Skills Without a Main Template<a class="headerlink" href="#skills-without-a-main-template" title="Permanent link">&para;</a></h3>
3704
+ <p>Skills work without a main template — useful for quick composition:</p>
3705
+ <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>
3706
+ </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;safe_bot&quot;</span><span class="p">,</span>
3707
+ </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">skills</span><span class="p">:</span><span class="w"> </span><span class="o">[</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>
3708
+ </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">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You answer questions about our product.&quot;</span>
3709
+ </span><span id="__span-23-5"><a id="__codelineno-23-5" name="__codelineno-23-5" href="#__codelineno-23-5"></a><span class="p">)</span>
3710
+ </span></code></pre></div>
3711
+ <h3 id="shared-context">Shared Context<a class="headerlink" href="#shared-context" title="Permanent link">&para;</a></h3>
3712
+ <p>All skills and the main template render with the same <code>context:</code> hash. Define parameters in each skill's front matter and pass values through the shared context:</p>
3713
+ <div class="language-markdown highlight"><span class="filename">prompts/branded.md</span><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a>---
3714
+ </span><span id="__span-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a>description: Brand-aware responses
3715
+ </span><span id="__span-24-3"><a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a>parameters:
3716
+ </span><span id="__span-24-4"><a id="__codelineno-24-4" name="__codelineno-24-4" href="#__codelineno-24-4"></a><span class="gu"> company_name: null</span>
3717
+ </span><span id="__span-24-5"><a id="__codelineno-24-5" name="__codelineno-24-5" href="#__codelineno-24-5"></a><span class="gu">---</span>
3718
+ </span><span id="__span-24-6"><a id="__codelineno-24-6" name="__codelineno-24-6" href="#__codelineno-24-6"></a>You represent &lt;%= company_name %&gt;. Always maintain brand voice.
3719
+ </span></code></pre></div>
3720
+ <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">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>
3721
+ </span><span id="__span-25-2"><a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></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>
3722
+ </span><span id="__span-25-3"><a id="__codelineno-25-3" name="__codelineno-25-3" href="#__codelineno-25-3"></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">:branded</span><span class="o">]</span><span class="p">,</span>
3723
+ </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="ss">context</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="ss">company_name</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><span class="w"> </span><span class="c1"># shared with all skills</span>
3724
+ </span><span id="__span-25-5"><a id="__codelineno-25-5" name="__codelineno-25-5" href="#__codelineno-25-5"></a><span class="p">)</span>
3725
+ </span></code></pre></div>
3726
+ <h2 id="adding-tools">Adding Tools<a class="headerlink" href="#adding-tools" title="Permanent link">&para;</a></h2>
3727
+ <p>Give robots capabilities via the <code>local_tools:</code> parameter. Tools can be <code>RubyLLM::Tool</code> subclasses or <code>RobotLab::Tool</code> instances:</p>
3728
+ <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>
3729
+ </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;order_assistant&quot;</span><span class="p">,</span>
3730
+ </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 help customers with orders.&quot;</span><span class="p">,</span>
3731
+ </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">local_tools</span><span class="p">:</span><span class="w"> </span><span class="o">[</span><span class="no">OrderLookup</span><span class="p">,</span><span class="w"> </span><span class="no">InventoryCheck</span><span class="o">]</span>
3732
+ </span><span id="__span-26-5"><a id="__codelineno-26-5" name="__codelineno-26-5" href="#__codelineno-26-5"></a><span class="p">)</span>
3733
+ </span></code></pre></div>
3734
+ <p>See the <a href="../using-tools/">Using Tools</a> guide for details on defining tools.</p>
3735
+ <h2 id="mcp-configuration">MCP Configuration<a class="headerlink" href="#mcp-configuration" title="Permanent link">&para;</a></h2>
3736
+ <p>Connect to MCP (Model Context Protocol) servers via the <code>mcp:</code> parameter:</p>
3737
+ <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">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>
3738
+ </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="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;coder&quot;</span><span class="p">,</span>
3739
+ </span><span id="__span-27-3"><a id="__codelineno-27-3" name="__codelineno-27-3" href="#__codelineno-27-3"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:developer</span><span class="p">,</span>
3740
+ </span><span id="__span-27-4"><a id="__codelineno-27-4" name="__codelineno-27-4" href="#__codelineno-27-4"></a><span class="w"> </span><span class="ss">mcp</span><span class="p">:</span><span class="w"> </span><span class="o">[</span>
3741
+ </span><span id="__span-27-5"><a id="__codelineno-27-5" name="__codelineno-27-5" href="#__codelineno-27-5"></a><span class="w"> </span><span class="p">{</span>
3742
+ </span><span id="__span-27-6"><a id="__codelineno-27-6" name="__codelineno-27-6" href="#__codelineno-27-6"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;filesystem&quot;</span><span class="p">,</span>
3743
+ </span><span id="__span-27-7"><a id="__codelineno-27-7" name="__codelineno-27-7" href="#__codelineno-27-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;mcp-server-fs&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;--root&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;/data&quot;</span><span class="o">]</span><span class="w"> </span><span class="p">}</span>
3744
+ </span><span id="__span-27-8"><a id="__codelineno-27-8" name="__codelineno-27-8" href="#__codelineno-27-8"></a><span class="w"> </span><span class="p">}</span>
3745
+ </span><span id="__span-27-9"><a id="__codelineno-27-9" name="__codelineno-27-9" href="#__codelineno-27-9"></a><span class="w"> </span><span class="o">]</span>
3746
+ </span><span id="__span-27-10"><a id="__codelineno-27-10" name="__codelineno-27-10" href="#__codelineno-27-10"></a><span class="p">)</span>
3747
+ </span></code></pre></div>
3748
+ <p>MCP configuration supports hierarchical resolution:</p>
3749
+ <table>
3750
+ <thead>
3751
+ <tr>
3752
+ <th>Value</th>
3753
+ <th>Behavior</th>
3754
+ </tr>
3755
+ </thead>
3756
+ <tbody>
3757
+ <tr>
3758
+ <td><code>:none</code></td>
3759
+ <td>No MCP servers (default)</td>
3760
+ </tr>
3761
+ <tr>
3762
+ <td><code>:inherit</code></td>
3763
+ <td>Use parent network/config MCP servers</td>
3764
+ </tr>
3765
+ <tr>
3766
+ <td><code>[...]</code></td>
3767
+ <td>Explicit array of server configurations</td>
3768
+ </tr>
3769
+ </tbody>
3770
+ </table>
3771
+ <p>See the <a href="../mcp-integration/">MCP Integration</a> guide for transport types and advanced patterns.</p>
3772
+ <h2 id="chaining-configuration">Chaining Configuration<a class="headerlink" href="#chaining-configuration" title="Permanent link">&para;</a></h2>
3773
+ <p>Robots support <code>with_*</code> method chaining for runtime reconfiguration. Each method returns <code>self</code> for fluent usage:</p>
3774
+ <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="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>
3775
+ </span><span id="__span-28-2"><a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a>
3776
+ </span><span id="__span-28-3"><a id="__codelineno-28-3" name="__codelineno-28-3" href="#__codelineno-28-3"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span>
3777
+ </span><span id="__span-28-4"><a id="__codelineno-28-4" name="__codelineno-28-4" href="#__codelineno-28-4"></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 and direct.&quot;</span><span class="p">)</span>
3778
+ </span><span id="__span-28-5"><a id="__codelineno-28-5" name="__codelineno-28-5" href="#__codelineno-28-5"></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">9</span><span class="p">)</span>
3779
+ </span><span id="__span-28-6"><a id="__codelineno-28-6" name="__codelineno-28-6" href="#__codelineno-28-6"></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>
3780
+ </span><span id="__span-28-7"><a id="__codelineno-28-7" name="__codelineno-28-7" href="#__codelineno-28-7"></a><span class="w"> </span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;Summarize quantum computing in one sentence.&quot;</span><span class="p">)</span>
3781
+ </span></code></pre></div>
3782
+ <h3 id="available-chain-methods">Available Chain Methods<a class="headerlink" href="#available-chain-methods" title="Permanent link">&para;</a></h3>
3783
+ <table>
3784
+ <thead>
3785
+ <tr>
3786
+ <th>Method</th>
3787
+ <th>Description</th>
3788
+ </tr>
3789
+ </thead>
3790
+ <tbody>
3791
+ <tr>
3792
+ <td><code>with_model(id)</code></td>
3793
+ <td>Change the LLM model</td>
3794
+ </tr>
3795
+ <tr>
3796
+ <td><code>with_instructions(text)</code></td>
3797
+ <td>Set system instructions</td>
3798
+ </tr>
3799
+ <tr>
3800
+ <td><code>with_temperature(val)</code></td>
3801
+ <td>Set temperature</td>
3802
+ </tr>
3803
+ <tr>
3804
+ <td><code>with_top_p(val)</code></td>
3805
+ <td>Set nucleus sampling</td>
3806
+ </tr>
3807
+ <tr>
3808
+ <td><code>with_top_k(val)</code></td>
3809
+ <td>Set top-k sampling</td>
3810
+ </tr>
3811
+ <tr>
3812
+ <td><code>with_max_tokens(val)</code></td>
3813
+ <td>Set max output tokens</td>
3814
+ </tr>
3815
+ <tr>
3816
+ <td><code>with_presence_penalty(val)</code></td>
3817
+ <td>Set presence penalty</td>
3818
+ </tr>
3819
+ <tr>
3820
+ <td><code>with_frequency_penalty(val)</code></td>
3821
+ <td>Set frequency penalty</td>
3822
+ </tr>
3823
+ <tr>
3824
+ <td><code>with_stop(sequences)</code></td>
3825
+ <td>Set stop sequences</td>
3826
+ </tr>
3827
+ <tr>
3828
+ <td><code>with_tool(tool)</code></td>
3829
+ <td>Add a single tool</td>
3830
+ </tr>
3831
+ <tr>
3832
+ <td><code>with_tools(*tools)</code></td>
3833
+ <td>Add multiple tools</td>
3834
+ </tr>
3835
+ <tr>
3836
+ <td><code>with_template(id, **ctx)</code></td>
3837
+ <td>Apply a prompt template</td>
3838
+ </tr>
3839
+ <tr>
3840
+ <td><code>with_schema(schema)</code></td>
3841
+ <td>Set structured output schema</td>
3842
+ </tr>
3843
+ <tr>
3844
+ <td><code>with_thinking(config)</code></td>
3845
+ <td>Enable extended thinking</td>
3846
+ </tr>
3847
+ <tr>
3848
+ <td><code>with_bus(bus)</code></td>
3849
+ <td>Connect to a message bus (creates one if nil)</td>
3850
+ </tr>
3851
+ </tbody>
3852
+ </table>
3853
+ <h2 id="running-robots">Running Robots<a class="headerlink" href="#running-robots" title="Permanent link">&para;</a></h2>
3854
+ <h3 id="standalone">Standalone<a class="headerlink" href="#standalone" title="Permanent link">&para;</a></h3>
3855
+ <p>Run a robot directly with a string message:</p>
3856
+ <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">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>
3857
+ </span><span id="__span-29-2"><a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></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>
3858
+ </span></code></pre></div>
3859
+ <p>The <code>run</code> method returns a <code>RobotResult</code> with:</p>
3860
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-30-1"><a id="__codelineno-30-1" name="__codelineno-30-1" href="#__codelineno-30-1"></a><span class="n">result</span><span class="o">.</span><span class="n">last_text_content</span><span class="w"> </span><span class="c1"># =&gt; &quot;Hi there! How can I help?&quot;</span>
3861
+ </span><span id="__span-30-2"><a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a><span class="n">result</span><span class="o">.</span><span class="n">output</span><span class="w"> </span><span class="c1"># =&gt; Array of output messages</span>
3862
+ </span><span id="__span-30-3"><a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a><span class="n">result</span><span class="o">.</span><span class="n">tool_calls</span><span class="w"> </span><span class="c1"># =&gt; Array of tool call results</span>
3863
+ </span><span id="__span-30-4"><a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-4"></a><span class="n">result</span><span class="o">.</span><span class="n">robot_name</span><span class="w"> </span><span class="c1"># =&gt; &quot;assistant&quot;</span>
3864
+ </span><span id="__span-30-5"><a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-5"></a><span class="n">result</span><span class="o">.</span><span class="n">stop_reason</span><span class="w"> </span><span class="c1"># =&gt; stop reason from the LLM</span>
3865
+ </span></code></pre></div>
3866
+ <h3 id="with-runtime-memory">With Runtime Memory<a class="headerlink" href="#with-runtime-memory" title="Permanent link">&para;</a></h3>
3867
+ <p>Inject memory values for a single run:</p>
3868
+ <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">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&#39;s my account status?&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">user_id</span><span class="p">:</span><span class="w"> </span><span class="mi">123</span><span class="w"> </span><span class="p">})</span>
3869
+ </span></code></pre></div>
3870
+ <h3 id="in-a-network">In a Network<a class="headerlink" href="#in-a-network" title="Permanent link">&para;</a></h3>
3871
+ <p>Run through a network for orchestration:</p>
3872
+ <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">network</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">create_network</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;pipeline&quot;</span><span class="p">)</span><span class="w"> </span><span class="k">do</span>
3873
+ </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="n">task</span><span class="w"> </span><span class="ss">:assistant</span><span class="p">,</span><span class="w"> </span><span class="n">robot</span><span class="p">,</span><span class="w"> </span><span class="ss">depends_on</span><span class="p">:</span><span class="w"> </span><span class="ss">:none</span>
3874
+ </span><span id="__span-32-3"><a id="__codelineno-32-3" name="__codelineno-32-3" href="#__codelineno-32-3"></a><span class="k">end</span>
3875
+ </span><span id="__span-32-4"><a id="__codelineno-32-4" name="__codelineno-32-4" href="#__codelineno-32-4"></a>
3876
+ </span><span id="__span-32-5"><a id="__codelineno-32-5" name="__codelineno-32-5" href="#__codelineno-32-5"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">network</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="ss">message</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Hello!&quot;</span><span class="p">)</span>
3877
+ </span><span id="__span-32-6"><a id="__codelineno-32-6" name="__codelineno-32-6" href="#__codelineno-32-6"></a><span class="nb">puts</span><span class="w"> </span><span class="n">result</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">last_text_content</span>
3878
+ </span></code></pre></div>
3879
+ <h3 id="with-streaming">With Streaming<a class="headerlink" href="#with-streaming" title="Permanent link">&para;</a></h3>
3880
+ <p>Stream LLM content in real-time using a stored callback, a per-call block, or both. Each receives a <a href="https://rubyllm.com/streaming/#basic-streaming"><code>RubyLLM::Chunk</code></a> object — use <code>chunk.content</code> for the text delta. Chunks also carry <code>model_id</code>, <code>tool_calls</code>, <code>thinking</code>, and token usage on the final chunk. See the <a href="../../api/core/robot/#streaming">Streaming API reference</a> for the full chunk interface.</p>
3881
+ <p><strong>Stored callback</strong> — wired at build time, fires on every <code>run()</code>:</p>
3882
+ <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="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>
3883
+ </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="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;assistant&quot;</span><span class="p">,</span>
3884
+ </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="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>
3885
+ </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="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="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>
3886
+ </span><span id="__span-33-5"><a id="__codelineno-33-5" name="__codelineno-33-5" href="#__codelineno-33-5"></a><span class="p">)</span>
3887
+ </span><span id="__span-33-6"><a id="__codelineno-33-6" name="__codelineno-33-6" href="#__codelineno-33-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 automatically</span>
3888
+ </span></code></pre></div>
3889
+ <p><strong>Per-call block</strong> — passed to <code>run()</code>:</p>
3890
+ <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="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>
3891
+ </span></code></pre></div>
3892
+ <p><strong>Both together</strong> — stored fires first, then the block:</p>
3893
+ <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>
3894
+ </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;assistant&quot;</span><span class="p">,</span>
3895
+ </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">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;You are helpful.&quot;</span><span class="p">,</span>
3896
+ </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">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_chunk</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>
3897
+ </span><span id="__span-35-5"><a id="__codelineno-35-5" name="__codelineno-35-5" href="#__codelineno-35-5"></a><span class="p">)</span>
3898
+ </span><span id="__span-35-6"><a id="__codelineno-35-6" name="__codelineno-35-6" href="#__codelineno-35-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>
3899
+ </span></code></pre></div>
3900
+ <p>The <code>on_content</code> callback participates in the RunConfig cascade, so it can be set at the config level and inherited by robots:</p>
3901
+ <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">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>
3902
+ </span><span id="__span-36-2"><a id="__codelineno-36-2" name="__codelineno-36-2" href="#__codelineno-36-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">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>
3903
+ </span><span id="__span-36-3"><a id="__codelineno-36-3" name="__codelineno-36-3" href="#__codelineno-36-3"></a><span class="p">)</span>
3904
+ </span><span id="__span-36-4"><a id="__codelineno-36-4" name="__codelineno-36-4" href="#__codelineno-36-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">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;...&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>
3905
+ </span></code></pre></div>
3906
+ <p>You can also monitor tool activity via callbacks:</p>
3907
+ <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">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>
3908
+ </span><span id="__span-37-2"><a id="__codelineno-37-2" name="__codelineno-37-2" href="#__codelineno-37-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>
3909
+ </span><span id="__span-37-3"><a id="__codelineno-37-3" name="__codelineno-37-3" href="#__codelineno-37-3"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;...&quot;</span><span class="p">,</span>
3910
+ </span><span id="__span-37-4"><a id="__codelineno-37-4" name="__codelineno-37-4" href="#__codelineno-37-4"></a><span class="w"> </span><span class="ss">on_tool_call</span><span class="p">:</span><span class="w"> </span><span class="o">-&gt;</span><span class="p">(</span><span class="n">tool_call</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">&quot;Calling: </span><span class="si">#{</span><span class="n">tool_call</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="w"> </span><span class="p">},</span>
3911
+ </span><span id="__span-37-5"><a id="__codelineno-37-5" name="__codelineno-37-5" href="#__codelineno-37-5"></a><span class="w"> </span><span class="ss">on_tool_result</span><span class="p">:</span><span class="w"> </span><span class="o">-&gt;</span><span class="p">(</span><span class="n">result</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">&quot;Result: </span><span class="si">#{</span><span class="n">result</span><span class="si">}</span><span class="s2">&quot;</span><span class="w"> </span><span class="p">}</span>
3912
+ </span><span id="__span-37-6"><a id="__codelineno-37-6" name="__codelineno-37-6" href="#__codelineno-37-6"></a><span class="p">)</span>
3913
+ </span></code></pre></div>
3914
+ <h2 id="robot-patterns">Robot Patterns<a class="headerlink" href="#robot-patterns" title="Permanent link">&para;</a></h2>
3915
+ <h3 id="classifier-robot">Classifier Robot<a class="headerlink" href="#classifier-robot" title="Permanent link">&para;</a></h3>
3916
+ <p>Route requests to specialized handlers. Subclass <code>RobotLab::Robot</code> and override <code>call</code> for custom pipeline behavior:</p>
3917
+ <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="k">class</span><span class="w"> </span><span class="nc">ClassifierRobot</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">::</span><span class="no">Robot</span>
3918
+ </span><span id="__span-38-2"><a id="__codelineno-38-2" name="__codelineno-38-2" href="#__codelineno-38-2"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">call</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
3919
+ </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="n">context</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">extract_run_context</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
3920
+ </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="n">message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">context</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="ss">:message</span><span class="p">)</span>
3921
+ </span><span id="__span-38-5"><a id="__codelineno-38-5" name="__codelineno-38-5" href="#__codelineno-38-5"></a><span class="w"> </span><span class="n">robot_result</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="p">,</span><span class="w"> </span><span class="o">**</span><span class="n">context</span><span class="p">)</span>
3922
+ </span><span id="__span-38-6"><a id="__codelineno-38-6" name="__codelineno-38-6" href="#__codelineno-38-6"></a>
3923
+ </span><span id="__span-38-7"><a id="__codelineno-38-7" name="__codelineno-38-7" href="#__codelineno-38-7"></a><span class="w"> </span><span class="n">new_result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">result</span>
3924
+ </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="o">.</span><span class="n">with_context</span><span class="p">(</span><span class="vi">@name</span><span class="o">.</span><span class="n">to_sym</span><span class="p">,</span><span class="w"> </span><span class="n">robot_result</span><span class="p">)</span>
3925
+ </span><span id="__span-38-9"><a id="__codelineno-38-9" name="__codelineno-38-9" href="#__codelineno-38-9"></a><span class="w"> </span><span class="o">.</span><span class="n">continue</span><span class="p">(</span><span class="n">robot_result</span><span class="p">)</span>
3926
+ </span><span id="__span-38-10"><a id="__codelineno-38-10" name="__codelineno-38-10" href="#__codelineno-38-10"></a>
3927
+ </span><span id="__span-38-11"><a id="__codelineno-38-11" name="__codelineno-38-11" href="#__codelineno-38-11"></a><span class="w"> </span><span class="n">category</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot_result</span><span class="o">.</span><span class="n">last_text_content</span><span class="o">.</span><span class="n">to_s</span><span class="o">.</span><span class="n">strip</span><span class="o">.</span><span class="n">downcase</span>
3928
+ </span><span id="__span-38-12"><a id="__codelineno-38-12" name="__codelineno-38-12" href="#__codelineno-38-12"></a>
3929
+ </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="k">case</span><span class="w"> </span><span class="n">category</span>
3930
+ </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="k">when</span><span class="w"> </span><span class="sr">/billing/</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">new_result</span><span class="o">.</span><span class="n">activate</span><span class="p">(</span><span class="ss">:billing</span><span class="p">)</span>
3931
+ </span><span id="__span-38-15"><a id="__codelineno-38-15" name="__codelineno-38-15" href="#__codelineno-38-15"></a><span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="sr">/technical/</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">new_result</span><span class="o">.</span><span class="n">activate</span><span class="p">(</span><span class="ss">:technical</span><span class="p">)</span>
3932
+ </span><span id="__span-38-16"><a id="__codelineno-38-16" name="__codelineno-38-16" href="#__codelineno-38-16"></a><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="n">new_result</span><span class="o">.</span><span class="n">activate</span><span class="p">(</span><span class="ss">:general</span><span class="p">)</span>
3933
+ </span><span id="__span-38-17"><a id="__codelineno-38-17" name="__codelineno-38-17" href="#__codelineno-38-17"></a><span class="w"> </span><span class="k">end</span>
3934
+ </span><span id="__span-38-18"><a id="__codelineno-38-18" name="__codelineno-38-18" href="#__codelineno-38-18"></a><span class="w"> </span><span class="k">end</span>
3935
+ </span><span id="__span-38-19"><a id="__codelineno-38-19" name="__codelineno-38-19" href="#__codelineno-38-19"></a><span class="k">end</span>
3936
+ </span><span id="__span-38-20"><a id="__codelineno-38-20" name="__codelineno-38-20" href="#__codelineno-38-20"></a>
3937
+ </span><span id="__span-38-21"><a id="__codelineno-38-21" name="__codelineno-38-21" href="#__codelineno-38-21"></a><span class="n">classifier</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">ClassifierRobot</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
3938
+ </span><span id="__span-38-22"><a id="__codelineno-38-22" name="__codelineno-38-22" href="#__codelineno-38-22"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;classifier&quot;</span><span class="p">,</span>
3939
+ </span><span id="__span-38-23"><a id="__codelineno-38-23" name="__codelineno-38-23" href="#__codelineno-38-23"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="o">&lt;&lt;~</span><span class="dl">PROMPT</span>
3940
+ </span><span id="__span-38-24"><a id="__codelineno-38-24" name="__codelineno-38-24" href="#__codelineno-38-24"></a><span class="sh"> Classify the user&#39;s message into exactly one category:</span>
3941
+ </span><span id="__span-38-25"><a id="__codelineno-38-25" name="__codelineno-38-25" href="#__codelineno-38-25"></a><span class="sh"> - billing</span>
3942
+ </span><span id="__span-38-26"><a id="__codelineno-38-26" name="__codelineno-38-26" href="#__codelineno-38-26"></a><span class="sh"> - technical</span>
3943
+ </span><span id="__span-38-27"><a id="__codelineno-38-27" name="__codelineno-38-27" href="#__codelineno-38-27"></a><span class="sh"> - general</span>
3944
+ </span><span id="__span-38-28"><a id="__codelineno-38-28" name="__codelineno-38-28" href="#__codelineno-38-28"></a><span class="sh"> Respond with only the category name, nothing else.</span>
3945
+ </span><span id="__span-38-29"><a id="__codelineno-38-29" name="__codelineno-38-29" href="#__codelineno-38-29"></a><span class="dl"> PROMPT</span>
3946
+ </span><span id="__span-38-30"><a id="__codelineno-38-30" name="__codelineno-38-30" href="#__codelineno-38-30"></a><span class="p">)</span>
3947
+ </span></code></pre></div>
3948
+ <h3 id="specialist-robot">Specialist Robot<a class="headerlink" href="#specialist-robot" title="Permanent link">&para;</a></h3>
3949
+ <p>Handle specific domains with template and tools:</p>
3950
+ <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">billing_specialist</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>
3951
+ </span><span id="__span-39-2"><a id="__codelineno-39-2" name="__codelineno-39-2" href="#__codelineno-39-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;billing_specialist&quot;</span><span class="p">,</span>
3952
+ </span><span id="__span-39-3"><a id="__codelineno-39-3" name="__codelineno-39-3" href="#__codelineno-39-3"></a><span class="w"> </span><span class="ss">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Handles billing and payment inquiries&quot;</span><span class="p">,</span>
3953
+ </span><span id="__span-39-4"><a id="__codelineno-39-4" name="__codelineno-39-4" href="#__codelineno-39-4"></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>
3954
+ </span><span id="__span-39-5"><a id="__codelineno-39-5" name="__codelineno-39-5" href="#__codelineno-39-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">department</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;billing&quot;</span><span class="w"> </span><span class="p">},</span>
3955
+ </span><span id="__span-39-6"><a id="__codelineno-39-6" name="__codelineno-39-6" href="#__codelineno-39-6"></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="p">,</span><span class="w"> </span><span class="no">RefundProcessor</span><span class="o">]</span>
3956
+ </span><span id="__span-39-7"><a id="__codelineno-39-7" name="__codelineno-39-7" href="#__codelineno-39-7"></a><span class="p">)</span>
3957
+ </span></code></pre></div>
3958
+ <h3 id="summarizer-robot">Summarizer Robot<a class="headerlink" href="#summarizer-robot" title="Permanent link">&para;</a></h3>
3959
+ <p>Condense information:</p>
3960
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-40-1"><a id="__codelineno-40-1" name="__codelineno-40-1" href="#__codelineno-40-1"></a><span class="n">summarizer</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>
3961
+ </span><span id="__span-40-2"><a id="__codelineno-40-2" name="__codelineno-40-2" href="#__codelineno-40-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;summarizer&quot;</span><span class="p">,</span>
3962
+ </span><span id="__span-40-3"><a id="__codelineno-40-3" name="__codelineno-40-3" href="#__codelineno-40-3"></a><span class="w"> </span><span class="ss">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Summarizes conversations and documents&quot;</span><span class="p">,</span>
3963
+ </span><span id="__span-40-4"><a id="__codelineno-40-4" name="__codelineno-40-4" href="#__codelineno-40-4"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="o">&lt;&lt;~</span><span class="dl">PROMPT</span>
3964
+ </span><span id="__span-40-5"><a id="__codelineno-40-5" name="__codelineno-40-5" href="#__codelineno-40-5"></a><span class="sh"> Create concise summaries of the provided content.</span>
3965
+ </span><span id="__span-40-6"><a id="__codelineno-40-6" name="__codelineno-40-6" href="#__codelineno-40-6"></a><span class="sh"> Focus on key points and actionable items.</span>
3966
+ </span><span id="__span-40-7"><a id="__codelineno-40-7" name="__codelineno-40-7" href="#__codelineno-40-7"></a><span class="sh"> Use bullet points for clarity.</span>
3967
+ </span><span id="__span-40-8"><a id="__codelineno-40-8" name="__codelineno-40-8" href="#__codelineno-40-8"></a><span class="dl"> PROMPT</span>
3968
+ </span><span id="__span-40-9"><a id="__codelineno-40-9" name="__codelineno-40-9" href="#__codelineno-40-9"></a><span class="p">)</span>
3969
+ </span></code></pre></div>
3970
+ <h3 id="bus-connected-robot">Bus-Connected Robot<a class="headerlink" href="#bus-connected-robot" title="Permanent link">&para;</a></h3>
3971
+ <p>Enable bidirectional communication between robots using a message bus. This pattern supports negotiation loops and convergence:</p>
3972
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-41-1"><a id="__codelineno-41-1" name="__codelineno-41-1" href="#__codelineno-41-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>
3973
+ </span><span id="__span-41-2"><a id="__codelineno-41-2" name="__codelineno-41-2" href="#__codelineno-41-2"></a>
3974
+ </span><span id="__span-41-3"><a id="__codelineno-41-3" name="__codelineno-41-3" href="#__codelineno-41-3"></a><span class="k">class</span><span class="w"> </span><span class="nc">Comedian</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">::</span><span class="no">Robot</span>
3975
+ </span><span id="__span-41-4"><a id="__codelineno-41-4" name="__codelineno-41-4" href="#__codelineno-41-4"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span><span class="p">(</span><span class="ss">bus</span><span class="p">:)</span>
3976
+ </span><span id="__span-41-5"><a id="__codelineno-41-5" name="__codelineno-41-5" href="#__codelineno-41-5"></a><span class="w"> </span><span class="k">super</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">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:comedian</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>
3977
+ </span><span id="__span-41-6"><a id="__codelineno-41-6" name="__codelineno-41-6" href="#__codelineno-41-6"></a><span class="w"> </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>
3978
+ </span><span id="__span-41-7"><a id="__codelineno-41-7" name="__codelineno-41-7" href="#__codelineno-41-7"></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><span class="o">.</span><span class="n">strip</span>
3979
+ </span><span id="__span-41-8"><a id="__codelineno-41-8" name="__codelineno-41-8" href="#__codelineno-41-8"></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>
3980
+ </span><span id="__span-41-9"><a id="__codelineno-41-9" name="__codelineno-41-9" href="#__codelineno-41-9"></a><span class="w"> </span><span class="k">end</span>
3981
+ </span><span id="__span-41-10"><a id="__codelineno-41-10" name="__codelineno-41-10" href="#__codelineno-41-10"></a><span class="w"> </span><span class="k">end</span>
3982
+ </span><span id="__span-41-11"><a id="__codelineno-41-11" name="__codelineno-41-11" href="#__codelineno-41-11"></a><span class="k">end</span>
3983
+ </span><span id="__span-41-12"><a id="__codelineno-41-12" name="__codelineno-41-12" href="#__codelineno-41-12"></a>
3984
+ </span><span id="__span-41-13"><a id="__codelineno-41-13" name="__codelineno-41-13" href="#__codelineno-41-13"></a><span class="k">class</span><span class="w"> </span><span class="nc">ComedyCritic</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">::</span><span class="no">Robot</span>
3985
+ </span><span id="__span-41-14"><a id="__codelineno-41-14" name="__codelineno-41-14" href="#__codelineno-41-14"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span><span class="p">(</span><span class="ss">bus</span><span class="p">:)</span>
3986
+ </span><span id="__span-41-15"><a id="__codelineno-41-15" name="__codelineno-41-15" href="#__codelineno-41-15"></a><span class="w"> </span><span class="k">super</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">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:comedy_critic</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>
3987
+ </span><span id="__span-41-16"><a id="__codelineno-41-16" name="__codelineno-41-16" href="#__codelineno-41-16"></a><span class="w"> </span><span class="vi">@accepted</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span>
3988
+ </span><span id="__span-41-17"><a id="__codelineno-41-17" name="__codelineno-41-17" href="#__codelineno-41-17"></a><span class="w"> </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>
3989
+ </span><span id="__span-41-18"><a id="__codelineno-41-18" name="__codelineno-41-18" href="#__codelineno-41-18"></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">run</span><span class="p">(</span><span class="s2">&quot;Evaluate: </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><span class="o">.</span><span class="n">strip</span>
3990
+ </span><span id="__span-41-19"><a id="__codelineno-41-19" name="__codelineno-41-19" href="#__codelineno-41-19"></a><span class="w"> </span><span class="vi">@accepted</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">verdict</span><span class="o">.</span><span class="n">start_with?</span><span class="p">(</span><span class="s2">&quot;FUNNY&quot;</span><span class="p">)</span>
3991
+ </span><span id="__span-41-20"><a id="__codelineno-41-20" name="__codelineno-41-20" href="#__codelineno-41-20"></a><span class="w"> </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;Try again.&quot;</span><span class="p">)</span><span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="vi">@accepted</span>
3992
+ </span><span id="__span-41-21"><a id="__codelineno-41-21" name="__codelineno-41-21" href="#__codelineno-41-21"></a><span class="w"> </span><span class="k">end</span>
3993
+ </span><span id="__span-41-22"><a id="__codelineno-41-22" name="__codelineno-41-22" href="#__codelineno-41-22"></a><span class="w"> </span><span class="k">end</span>
3994
+ </span><span id="__span-41-23"><a id="__codelineno-41-23" name="__codelineno-41-23" href="#__codelineno-41-23"></a><span class="w"> </span><span class="kp">attr_reader</span><span class="w"> </span><span class="ss">:accepted</span>
3995
+ </span><span id="__span-41-24"><a id="__codelineno-41-24" name="__codelineno-41-24" href="#__codelineno-41-24"></a><span class="k">end</span>
3996
+ </span><span id="__span-41-25"><a id="__codelineno-41-25" name="__codelineno-41-25" href="#__codelineno-41-25"></a>
3997
+ </span><span id="__span-41-26"><a id="__codelineno-41-26" name="__codelineno-41-26" href="#__codelineno-41-26"></a><span class="n">bob</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Comedian</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">bus</span><span class="p">:</span><span class="w"> </span><span class="n">bus</span><span class="p">)</span>
3998
+ </span><span id="__span-41-27"><a id="__codelineno-41-27" name="__codelineno-41-27" href="#__codelineno-41-27"></a><span class="n">alice</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">ComedyCritic</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">bus</span><span class="p">:</span><span class="w"> </span><span class="n">bus</span><span class="p">)</span>
3999
+ </span><span id="__span-41-28"><a id="__codelineno-41-28" name="__codelineno-41-28" href="#__codelineno-41-28"></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 funny robot joke.&quot;</span><span class="p">)</span>
4000
+ </span></code></pre></div>
4001
+ <p>The <code>on_message</code> block arity controls delivery handling:
4002
+ - <strong>1 argument</strong> <code>|message|</code> — auto-acknowledges before calling
4003
+ - <strong>2 arguments</strong> <code>|delivery, message|</code> — manual <code>delivery.ack!</code> / <code>delivery.nack!</code></p>
4004
+ <p>See <a href="../../architecture/core-concepts/#message-bus">Message Bus</a> for details.</p>
4005
+ <h3 id="spawning-robots-dynamically">Spawning Robots Dynamically<a class="headerlink" href="#spawning-robots-dynamically" title="Permanent link">&para;</a></h3>
4006
+ <p>Create new robots at runtime using <code>spawn</code>. The bus is created lazily — no upfront wiring required:</p>
4007
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-42-1"><a id="__codelineno-42-1" name="__codelineno-42-1" href="#__codelineno-42-1"></a><span class="k">class</span><span class="w"> </span><span class="nc">Dispatcher</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">RobotLab</span><span class="o">::</span><span class="no">Robot</span>
4008
+ </span><span id="__span-42-2"><a id="__codelineno-42-2" name="__codelineno-42-2" href="#__codelineno-42-2"></a><span class="w"> </span><span class="kp">attr_reader</span><span class="w"> </span><span class="ss">:spawned</span>
4009
+ </span><span id="__span-42-3"><a id="__codelineno-42-3" name="__codelineno-42-3" href="#__codelineno-42-3"></a>
4010
+ </span><span id="__span-42-4"><a id="__codelineno-42-4" name="__codelineno-42-4" href="#__codelineno-42-4"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span><span class="p">(</span><span class="ss">bus</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">)</span>
4011
+ </span><span id="__span-42-5"><a id="__codelineno-42-5" name="__codelineno-42-5" href="#__codelineno-42-5"></a><span class="w"> </span><span class="k">super</span><span class="p">(</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><span class="w"> </span><span class="ss">template</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">bus</span><span class="p">:</span><span class="w"> </span><span class="n">bus</span><span class="p">)</span>
4012
+ </span><span id="__span-42-6"><a id="__codelineno-42-6" name="__codelineno-42-6" href="#__codelineno-42-6"></a><span class="w"> </span><span class="vi">@spawned</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{}</span>
4013
+ </span><span id="__span-42-7"><a id="__codelineno-42-7" name="__codelineno-42-7" href="#__codelineno-42-7"></a>
4014
+ </span><span id="__span-42-8"><a id="__codelineno-42-8" name="__codelineno-42-8" href="#__codelineno-42-8"></a><span class="w"> </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>
4015
+ </span><span id="__span-42-9"><a id="__codelineno-42-9" name="__codelineno-42-9" href="#__codelineno-42-9"></a><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">&quot;</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"> replied: </span><span class="si">#{</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">lines</span><span class="o">.</span><span class="n">first</span><span class="o">&amp;.</span><span class="n">strip</span><span class="si">}</span><span class="s2">&quot;</span>
4016
+ </span><span id="__span-42-10"><a id="__codelineno-42-10" name="__codelineno-42-10" href="#__codelineno-42-10"></a><span class="w"> </span><span class="k">end</span>
4017
+ </span><span id="__span-42-11"><a id="__codelineno-42-11" name="__codelineno-42-11" href="#__codelineno-42-11"></a><span class="w"> </span><span class="k">end</span>
4018
+ </span><span id="__span-42-12"><a id="__codelineno-42-12" name="__codelineno-42-12" href="#__codelineno-42-12"></a>
4019
+ </span><span id="__span-42-13"><a id="__codelineno-42-13" name="__codelineno-42-13" href="#__codelineno-42-13"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">dispatch</span><span class="p">(</span><span class="n">question</span><span class="p">)</span>
4020
+ </span><span id="__span-42-14"><a id="__codelineno-42-14" name="__codelineno-42-14" href="#__codelineno-42-14"></a><span class="w"> </span><span class="c1"># Ask LLM what specialist to create</span>
4021
+ </span><span id="__span-42-15"><a id="__codelineno-42-15" name="__codelineno-42-15" href="#__codelineno-42-15"></a><span class="w"> </span><span class="n">plan</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">question</span><span class="p">)</span><span class="o">.</span><span class="n">last_text_content</span><span class="o">.</span><span class="n">strip</span>
4022
+ </span><span id="__span-42-16"><a id="__codelineno-42-16" name="__codelineno-42-16" href="#__codelineno-42-16"></a><span class="w"> </span><span class="n">role</span><span class="p">,</span><span class="w"> </span><span class="n">instruction</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">plan</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span>
4023
+ </span><span id="__span-42-17"><a id="__codelineno-42-17" name="__codelineno-42-17" href="#__codelineno-42-17"></a><span class="w"> </span><span class="n">role</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">role</span><span class="o">.</span><span class="n">strip</span><span class="o">.</span><span class="n">downcase</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/\s+/</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;_&quot;</span><span class="p">)</span>
4024
+ </span><span id="__span-42-18"><a id="__codelineno-42-18" name="__codelineno-42-18" href="#__codelineno-42-18"></a>
4025
+ </span><span id="__span-42-19"><a id="__codelineno-42-19" name="__codelineno-42-19" href="#__codelineno-42-19"></a><span class="w"> </span><span class="c1"># Spawn (or reuse) a specialist</span>
4026
+ </span><span id="__span-42-20"><a id="__codelineno-42-20" name="__codelineno-42-20" href="#__codelineno-42-20"></a><span class="w"> </span><span class="n">specialist</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@spawned</span><span class="o">[</span><span class="n">role</span><span class="o">]</span><span class="w"> </span><span class="o">||=</span><span class="w"> </span><span class="n">spawn</span><span class="p">(</span>
4027
+ </span><span id="__span-42-21"><a id="__codelineno-42-21" name="__codelineno-42-21" href="#__codelineno-42-21"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="n">role</span><span class="p">,</span>
4028
+ </span><span id="__span-42-22"><a id="__codelineno-42-22" name="__codelineno-42-22" href="#__codelineno-42-22"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="n">instruction</span><span class="o">&amp;.</span><span class="n">strip</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="s2">&quot;You are a helpful </span><span class="si">#{</span><span class="n">role</span><span class="si">}</span><span class="s2">.&quot;</span>
4029
+ </span><span id="__span-42-23"><a id="__codelineno-42-23" name="__codelineno-42-23" href="#__codelineno-42-23"></a><span class="w"> </span><span class="p">)</span>
4030
+ </span><span id="__span-42-24"><a id="__codelineno-42-24" name="__codelineno-42-24" href="#__codelineno-42-24"></a>
4031
+ </span><span id="__span-42-25"><a id="__codelineno-42-25" name="__codelineno-42-25" href="#__codelineno-42-25"></a><span class="w"> </span><span class="c1"># Have the specialist answer and reply</span>
4032
+ </span><span id="__span-42-26"><a id="__codelineno-42-26" name="__codelineno-42-26" href="#__codelineno-42-26"></a><span class="w"> </span><span class="n">answer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">specialist</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">question</span><span class="p">)</span><span class="o">.</span><span class="n">last_text_content</span><span class="o">.</span><span class="n">strip</span>
4033
+ </span><span id="__span-42-27"><a id="__codelineno-42-27" name="__codelineno-42-27" href="#__codelineno-42-27"></a><span class="w"> </span><span class="n">specialist</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>
4034
+ </span><span id="__span-42-28"><a id="__codelineno-42-28" name="__codelineno-42-28" href="#__codelineno-42-28"></a><span class="w"> </span><span class="k">end</span>
4035
+ </span><span id="__span-42-29"><a id="__codelineno-42-29" name="__codelineno-42-29" href="#__codelineno-42-29"></a><span class="k">end</span>
4036
+ </span></code></pre></div>
4037
+ <p>Key features of <code>spawn</code>:</p>
4038
+ <ul>
4039
+ <li>Creates a child robot on the same bus as the parent</li>
4040
+ <li>Creates a bus lazily if the parent doesn't have one</li>
4041
+ <li>Spawned robots can immediately send and receive messages</li>
4042
+ <li>Multiple robots with the same name enable fan-out messaging</li>
4043
+ </ul>
4044
+ <p>Robots can also join a bus after creation:</p>
4045
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-43-1"><a id="__codelineno-43-1" name="__codelineno-43-1" href="#__codelineno-43-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;Hello.&quot;</span><span class="p">)</span>
4046
+ </span><span id="__span-43-2"><a id="__codelineno-43-2" name="__codelineno-43-2" href="#__codelineno-43-2"></a><span class="n">bot</span><span class="o">.</span><span class="n">with_bus</span><span class="p">(</span><span class="n">existing_bus</span><span class="p">)</span><span class="w"> </span><span class="c1"># now connected and can send/receive messages</span>
4047
+ </span></code></pre></div>
4048
+ <h2 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">&para;</a></h2>
4049
+ <p>RobotLab uses <code>MywayConfig</code> for configuration. Access the config object directly -- there is no <code>RobotLab.configure</code> block:</p>
4050
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-44-1"><a id="__codelineno-44-1" name="__codelineno-44-1" href="#__codelineno-44-1"></a><span class="no">RobotLab</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">ruby_llm</span><span class="o">.</span><span class="n">model</span><span class="w"> </span><span class="c1"># =&gt; &quot;claude-sonnet-4&quot;</span>
4051
+ </span><span id="__span-44-2"><a id="__codelineno-44-2" name="__codelineno-44-2" href="#__codelineno-44-2"></a><span class="no">RobotLab</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">ruby_llm</span><span class="o">.</span><span class="n">request_timeout</span><span class="w"> </span><span class="c1"># =&gt; 120</span>
4052
+ </span></code></pre></div>
4053
+ <p>Configuration is loaded from:</p>
4054
+ <ul>
4055
+ <li>Bundled defaults (<code>lib/robot_lab/config/defaults.yml</code>)</li>
4056
+ <li>Environment-specific overrides (development, test, production)</li>
4057
+ <li>XDG config files (<code>~/.config/robot_lab/config.yml</code>)</li>
4058
+ <li>Project config (<code>./config/robot_lab.yml</code>)</li>
4059
+ <li>Environment variables (<code>ROBOT_LAB_*</code> prefix)</li>
4060
+ </ul>
4061
+ <h2 id="best-practices">Best Practices<a class="headerlink" href="#best-practices" title="Permanent link">&para;</a></h2>
4062
+ <h3 id="1-clear-focused-prompts">1. Clear, Focused Prompts<a class="headerlink" href="#1-clear-focused-prompts" title="Permanent link">&para;</a></h3>
4063
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-45-1"><a id="__codelineno-45-1" name="__codelineno-45-1" href="#__codelineno-45-1"></a><span class="c1"># Good: Specific and focused</span>
4064
+ </span><span id="__span-45-2"><a id="__codelineno-45-2" name="__codelineno-45-2" href="#__codelineno-45-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>
4065
+ </span><span id="__span-45-3"><a id="__codelineno-45-3" name="__codelineno-45-3" href="#__codelineno-45-3"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;reviewer&quot;</span><span class="p">,</span>
4066
+ </span><span id="__span-45-4"><a id="__codelineno-45-4" name="__codelineno-45-4" href="#__codelineno-45-4"></a><span class="w"> </span><span class="ss">system_prompt</span><span class="p">:</span><span class="w"> </span><span class="o">&lt;&lt;~</span><span class="dl">PROMPT</span>
4067
+ </span><span id="__span-45-5"><a id="__codelineno-45-5" name="__codelineno-45-5" href="#__codelineno-45-5"></a><span class="sh"> You are a code reviewer. Review code for:</span>
4068
+ </span><span id="__span-45-6"><a id="__codelineno-45-6" name="__codelineno-45-6" href="#__codelineno-45-6"></a><span class="sh"> - Security vulnerabilities</span>
4069
+ </span><span id="__span-45-7"><a id="__codelineno-45-7" name="__codelineno-45-7" href="#__codelineno-45-7"></a><span class="sh"> - Performance issues</span>
4070
+ </span><span id="__span-45-8"><a id="__codelineno-45-8" name="__codelineno-45-8" href="#__codelineno-45-8"></a><span class="sh"> - Best practice violations</span>
4071
+ </span><span id="__span-45-9"><a id="__codelineno-45-9" name="__codelineno-45-9" href="#__codelineno-45-9"></a>
4072
+ </span><span id="__span-45-10"><a id="__codelineno-45-10" name="__codelineno-45-10" href="#__codelineno-45-10"></a><span class="sh"> Provide specific line numbers and suggestions.</span>
4073
+ </span><span id="__span-45-11"><a id="__codelineno-45-11" name="__codelineno-45-11" href="#__codelineno-45-11"></a><span class="dl"> PROMPT</span>
4074
+ </span><span id="__span-45-12"><a id="__codelineno-45-12" name="__codelineno-45-12" href="#__codelineno-45-12"></a><span class="p">)</span>
4075
+ </span><span id="__span-45-13"><a id="__codelineno-45-13" name="__codelineno-45-13" href="#__codelineno-45-13"></a>
4076
+ </span><span id="__span-45-14"><a id="__codelineno-45-14" name="__codelineno-45-14" href="#__codelineno-45-14"></a><span class="c1"># Bad: Vague and unfocused</span>
4077
+ </span><span id="__span-45-15"><a id="__codelineno-45-15" name="__codelineno-45-15" href="#__codelineno-45-15"></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>
4078
+ </span><span id="__span-45-16"><a id="__codelineno-45-16" name="__codelineno-45-16" href="#__codelineno-45-16"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;reviewer&quot;</span><span class="p">,</span>
4079
+ </span><span id="__span-45-17"><a id="__codelineno-45-17" name="__codelineno-45-17" href="#__codelineno-45-17"></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 code stuff.&quot;</span>
4080
+ </span><span id="__span-45-18"><a id="__codelineno-45-18" name="__codelineno-45-18" href="#__codelineno-45-18"></a><span class="p">)</span>
4081
+ </span></code></pre></div>
4082
+ <h3 id="2-compose-behaviors-with-skills">2. Compose Behaviors with Skills<a class="headerlink" href="#2-compose-behaviors-with-skills" title="Permanent link">&para;</a></h3>
4083
+ <p>Instead of creating monolithic templates, break behaviors into composable skills:</p>
4084
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-46-1"><a id="__codelineno-46-1" name="__codelineno-46-1" href="#__codelineno-46-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>
4085
+ </span><span id="__span-46-2"><a id="__codelineno-46-2" name="__codelineno-46-2" href="#__codelineno-46-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>
4086
+ </span><span id="__span-46-3"><a id="__codelineno-46-3" name="__codelineno-46-3" href="#__codelineno-46-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>
4087
+ </span><span id="__span-46-4"><a id="__codelineno-46-4" name="__codelineno-46-4" href="#__codelineno-46-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>
4088
+ </span><span id="__span-46-5"><a id="__codelineno-46-5" name="__codelineno-46-5" href="#__codelineno-46-5"></a><span class="p">)</span>
4089
+ </span></code></pre></div>
4090
+ <h3 id="3-use-templates-for-reusable-prompts">3. Use Templates for Reusable Prompts<a class="headerlink" href="#3-use-templates-for-reusable-prompts" title="Permanent link">&para;</a></h3>
4091
+ <p>Templates keep prompts in version-controlled files and allow parameterization:</p>
4092
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-47-1"><a id="__codelineno-47-1" name="__codelineno-47-1" href="#__codelineno-47-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>
4093
+ </span><span id="__span-47-2"><a id="__codelineno-47-2" name="__codelineno-47-2" href="#__codelineno-47-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>
4094
+ </span><span id="__span-47-3"><a id="__codelineno-47-3" name="__codelineno-47-3" href="#__codelineno-47-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>
4095
+ </span><span id="__span-47-4"><a id="__codelineno-47-4" name="__codelineno-47-4" href="#__codelineno-47-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;TechCo&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">language</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;English&quot;</span><span class="w"> </span><span class="p">}</span>
4096
+ </span><span id="__span-47-5"><a id="__codelineno-47-5" name="__codelineno-47-5" href="#__codelineno-47-5"></a><span class="p">)</span>
4097
+ </span></code></pre></div>
4098
+ <h3 id="4-handle-tool-errors-gracefully">4. Handle Tool Errors Gracefully<a class="headerlink" href="#4-handle-tool-errors-gracefully" title="Permanent link">&para;</a></h3>
4099
+ <p><code>RobotLab::Tool</code> automatically catches exceptions and returns plain-text errors to the LLM. For domain-specific error handling, catch known exceptions in <code>execute</code> and return structured data. See <a href="../using-tools/#error-handling">Using Tools: Error Handling</a> for details.</p>
4100
+ <h2 id="next-steps">Next Steps<a class="headerlink" href="#next-steps" title="Permanent link">&para;</a></h2>
4101
+ <ul>
4102
+ <li><a href="../creating-networks/">Creating Networks</a> - Orchestrate multiple robots</li>
4103
+ <li><a href="../../architecture/core-concepts/#message-bus">Message Bus</a> - Bidirectional robot communication</li>
4104
+ <li><a href="../../architecture/core-concepts/#dynamic-spawning">Dynamic Spawning</a> - Robots creating robots at runtime</li>
4105
+ <li><a href="../using-tools/">Using Tools</a> - Advanced tool patterns</li>
4106
+ <li><a href="../memory/">Memory Guide</a> - Share data between runs and robots</li>
4107
+ <li><a href="../../api/core/robot/">API Reference: Robot</a> - Complete API documentation</li>
4108
+ </ul>
4109
+
4110
+
4111
+
4112
+
4113
+
4114
+
4115
+
4116
+
4117
+
4118
+
4119
+
4120
+
4121
+
4122
+ <form class="md-feedback" name="feedback" hidden>
4123
+ <fieldset>
4124
+ <legend class="md-feedback__title">
4125
+ Was this page helpful?
4126
+ </legend>
4127
+ <div class="md-feedback__inner">
4128
+ <div class="md-feedback__list">
4129
+
4130
+ <button class="md-feedback__icon md-icon" type="submit" title="This page was helpful" data-md-value="1">
4131
+ <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>
4132
+ </button>
4133
+
4134
+ <button class="md-feedback__icon md-icon" type="submit" title="This page could be improved" data-md-value="0">
4135
+ <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>
4136
+ </button>
4137
+
4138
+ </div>
4139
+ <div class="md-feedback__note">
4140
+
4141
+ <div data-md-value="1" hidden>
4142
+
4143
+
4144
+
4145
+
4146
+
4147
+
4148
+
4149
+
4150
+
4151
+ Thanks for your feedback!
4152
+ </div>
4153
+
4154
+ <div data-md-value="0" hidden>
4155
+
4156
+
4157
+
4158
+
4159
+
4160
+
4161
+
4162
+
4163
+
4164
+ Thanks for your feedback! Help us improve by creating an issue.
4165
+ </div>
4166
+
4167
+ </div>
4168
+ </div>
4169
+ </fieldset>
4170
+ </form>
4171
+
4172
+
4173
+
4174
+ </article>
4175
+ </div>
4176
+
4177
+
4178
+ <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>
4179
+
4180
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
4181
+ </div>
4182
+
4183
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
4184
+
4185
+ <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>
4186
+ Back to top
4187
+ </button>
4188
+
4189
+ </main>
4190
+
4191
+ <footer class="md-footer">
4192
+
4193
+
4194
+
4195
+ <nav class="md-footer__inner md-grid" aria-label="Footer" >
4196
+
4197
+
4198
+ <a href="../" class="md-footer__link md-footer__link--prev" aria-label="Previous: Guides">
4199
+ <div class="md-footer__button md-icon">
4200
+
4201
+ <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>
4202
+ </div>
4203
+ <div class="md-footer__title">
4204
+ <span class="md-footer__direction">
4205
+ Previous
4206
+ </span>
4207
+ <div class="md-ellipsis">
4208
+ Guides
4209
+ </div>
4210
+ </div>
4211
+ </a>
4212
+
4213
+
4214
+
4215
+ <a href="../creating-networks/" class="md-footer__link md-footer__link--next" aria-label="Next: Creating Networks">
4216
+ <div class="md-footer__title">
4217
+ <span class="md-footer__direction">
4218
+ Next
4219
+ </span>
4220
+ <div class="md-ellipsis">
4221
+ Creating Networks
4222
+ </div>
4223
+ </div>
4224
+ <div class="md-footer__button md-icon">
4225
+
4226
+ <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>
4227
+ </div>
4228
+ </a>
4229
+
4230
+ </nav>
4231
+
4232
+
4233
+ <div class="md-footer-meta md-typeset">
4234
+ <div class="md-footer-meta__inner md-grid">
4235
+ <div class="md-copyright">
4236
+
4237
+ <div class="md-copyright__highlight">
4238
+ Copyright &copy; 2025 Dewayne VanHoozer
4239
+ </div>
4240
+
4241
+
4242
+ Made with
4243
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
4244
+ Material for MkDocs
4245
+ </a>
4246
+
4247
+ </div>
4248
+
4249
+
4250
+ <div class="md-social">
4251
+
4252
+
4253
+
4254
+
4255
+
4256
+ <a href="https://github.com/madbomber/robot_lab" target="_blank" rel="noopener" title="RobotLab on GitHub" class="md-social__link">
4257
+ <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>
4258
+ </a>
4259
+
4260
+
4261
+
4262
+
4263
+
4264
+ <a href="https://rubygems.org/gems/robot_lab" target="_blank" rel="noopener" title="RobotLab on RubyGems" class="md-social__link">
4265
+ <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>
4266
+ </a>
4267
+
4268
+ </div>
4269
+
4270
+ </div>
4271
+ </div>
4272
+ </footer>
4273
+
4274
+ </div>
4275
+ <div class="md-dialog" data-md-component="dialog">
4276
+ <div class="md-dialog__inner md-typeset"></div>
4277
+ </div>
4278
+
4279
+
4280
+
4281
+
4282
+
4283
+ <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>
4284
+
4285
+
4286
+ <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
4287
+
4288
+
4289
+ </body>
4290
+ </html>