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,3238 @@
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/architecture/message-flow/">
16
+
17
+
18
+ <link rel="prev" href="../state-management/">
19
+
20
+
21
+ <link rel="next" href="../../guides/">
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>Message Flow - 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="#message-flow" 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
+ Message Flow
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
+
281
+
282
+ <li class="md-tabs__item md-tabs__item--active">
283
+ <a href="../" class="md-tabs__link">
284
+
285
+
286
+
287
+
288
+
289
+ Architecture
290
+
291
+ </a>
292
+ </li>
293
+
294
+
295
+
296
+
297
+
298
+
299
+
300
+
301
+
302
+
303
+
304
+ <li class="md-tabs__item">
305
+ <a href="../../guides/" 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
+
709
+
710
+
711
+
712
+
713
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
714
+
715
+
716
+
717
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
718
+
719
+
720
+ <div class="md-nav__link md-nav__container">
721
+ <a href="../" class="md-nav__link ">
722
+
723
+
724
+
725
+ <span class="md-ellipsis">
726
+
727
+
728
+ Architecture
729
+
730
+
731
+
732
+ </span>
733
+
734
+
735
+
736
+ </a>
737
+
738
+
739
+ <label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
740
+ <span class="md-nav__icon md-icon"></span>
741
+ </label>
742
+
743
+ </div>
744
+
745
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
746
+ <label class="md-nav__title" for="__nav_3">
747
+ <span class="md-nav__icon md-icon"></span>
748
+
749
+
750
+ Architecture
751
+
752
+
753
+ </label>
754
+ <ul class="md-nav__list" data-md-scrollfix>
755
+
756
+
757
+
758
+
759
+
760
+
761
+
762
+
763
+
764
+ <li class="md-nav__item">
765
+ <a href="../core-concepts/" class="md-nav__link">
766
+
767
+
768
+
769
+ <span class="md-ellipsis">
770
+
771
+
772
+ Core Concepts
773
+
774
+
775
+
776
+ </span>
777
+
778
+
779
+
780
+ </a>
781
+ </li>
782
+
783
+
784
+
785
+
786
+
787
+
788
+
789
+
790
+
791
+
792
+ <li class="md-nav__item">
793
+ <a href="../robot-execution/" class="md-nav__link">
794
+
795
+
796
+
797
+ <span class="md-ellipsis">
798
+
799
+
800
+ Robot Execution
801
+
802
+
803
+
804
+ </span>
805
+
806
+
807
+
808
+ </a>
809
+ </li>
810
+
811
+
812
+
813
+
814
+
815
+
816
+
817
+
818
+
819
+
820
+ <li class="md-nav__item">
821
+ <a href="../network-orchestration/" class="md-nav__link">
822
+
823
+
824
+
825
+ <span class="md-ellipsis">
826
+
827
+
828
+ Network Orchestration
829
+
830
+
831
+
832
+ </span>
833
+
834
+
835
+
836
+ </a>
837
+ </li>
838
+
839
+
840
+
841
+
842
+
843
+
844
+
845
+
846
+
847
+
848
+ <li class="md-nav__item">
849
+ <a href="../state-management/" class="md-nav__link">
850
+
851
+
852
+
853
+ <span class="md-ellipsis">
854
+
855
+
856
+ State Management
857
+
858
+
859
+
860
+ </span>
861
+
862
+
863
+
864
+ </a>
865
+ </li>
866
+
867
+
868
+
869
+
870
+
871
+
872
+
873
+
874
+
875
+
876
+
877
+
878
+ <li class="md-nav__item md-nav__item--active">
879
+
880
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
881
+
882
+
883
+
884
+
885
+
886
+ <label class="md-nav__link md-nav__link--active" for="__toc">
887
+
888
+
889
+
890
+ <span class="md-ellipsis">
891
+
892
+
893
+ Message Flow
894
+
895
+
896
+
897
+ </span>
898
+
899
+
900
+
901
+ <span class="md-nav__icon md-icon"></span>
902
+ </label>
903
+
904
+ <a href="./" class="md-nav__link md-nav__link--active">
905
+
906
+
907
+
908
+ <span class="md-ellipsis">
909
+
910
+
911
+ Message Flow
912
+
913
+
914
+
915
+ </span>
916
+
917
+
918
+
919
+ </a>
920
+
921
+
922
+
923
+
924
+
925
+ <nav class="md-nav md-nav--secondary" aria-label="On this page">
926
+
927
+
928
+
929
+
930
+
931
+
932
+ <label class="md-nav__title" for="__toc">
933
+ <span class="md-nav__icon md-icon"></span>
934
+ On this page
935
+ </label>
936
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
937
+
938
+ <li class="md-nav__item">
939
+ <a href="#message-types" class="md-nav__link">
940
+ <span class="md-ellipsis">
941
+
942
+ Message Types
943
+
944
+ </span>
945
+ </a>
946
+
947
+ <nav class="md-nav" aria-label="Message Types">
948
+ <ul class="md-nav__list">
949
+
950
+ <li class="md-nav__item">
951
+ <a href="#textmessage" class="md-nav__link">
952
+ <span class="md-ellipsis">
953
+
954
+ TextMessage
955
+
956
+ </span>
957
+ </a>
958
+
959
+ </li>
960
+
961
+ <li class="md-nav__item">
962
+ <a href="#toolmessage" class="md-nav__link">
963
+ <span class="md-ellipsis">
964
+
965
+ ToolMessage
966
+
967
+ </span>
968
+ </a>
969
+
970
+ </li>
971
+
972
+ <li class="md-nav__item">
973
+ <a href="#toolcallmessage" class="md-nav__link">
974
+ <span class="md-ellipsis">
975
+
976
+ ToolCallMessage
977
+
978
+ </span>
979
+ </a>
980
+
981
+ </li>
982
+
983
+ <li class="md-nav__item">
984
+ <a href="#toolresultmessage" class="md-nav__link">
985
+ <span class="md-ellipsis">
986
+
987
+ ToolResultMessage
988
+
989
+ </span>
990
+ </a>
991
+
992
+ </li>
993
+
994
+ </ul>
995
+ </nav>
996
+
997
+ </li>
998
+
999
+ <li class="md-nav__item">
1000
+ <a href="#message-flow-standalone-robot" class="md-nav__link">
1001
+ <span class="md-ellipsis">
1002
+
1003
+ Message Flow: Standalone Robot
1004
+
1005
+ </span>
1006
+ </a>
1007
+
1008
+ <nav class="md-nav" aria-label="Message Flow: Standalone Robot">
1009
+ <ul class="md-nav__list">
1010
+
1011
+ <li class="md-nav__item">
1012
+ <a href="#step-by-step" class="md-nav__link">
1013
+ <span class="md-ellipsis">
1014
+
1015
+ Step-by-Step
1016
+
1017
+ </span>
1018
+ </a>
1019
+
1020
+ </li>
1021
+
1022
+ </ul>
1023
+ </nav>
1024
+
1025
+ </li>
1026
+
1027
+ <li class="md-nav__item">
1028
+ <a href="#message-flow-network-execution" class="md-nav__link">
1029
+ <span class="md-ellipsis">
1030
+
1031
+ Message Flow: Network Execution
1032
+
1033
+ </span>
1034
+ </a>
1035
+
1036
+ <nav class="md-nav" aria-label="Message Flow: Network Execution">
1037
+ <ul class="md-nav__list">
1038
+
1039
+ <li class="md-nav__item">
1040
+ <a href="#key-points" class="md-nav__link">
1041
+ <span class="md-ellipsis">
1042
+
1043
+ Key Points
1044
+
1045
+ </span>
1046
+ </a>
1047
+
1048
+ </li>
1049
+
1050
+ </ul>
1051
+ </nav>
1052
+
1053
+ </li>
1054
+
1055
+ <li class="md-nav__item">
1056
+ <a href="#robotresult" class="md-nav__link">
1057
+ <span class="md-ellipsis">
1058
+
1059
+ RobotResult
1060
+
1061
+ </span>
1062
+ </a>
1063
+
1064
+ <nav class="md-nav" aria-label="RobotResult">
1065
+ <ul class="md-nav__list">
1066
+
1067
+ <li class="md-nav__item">
1068
+ <a href="#result-serialization" class="md-nav__link">
1069
+ <span class="md-ellipsis">
1070
+
1071
+ Result Serialization
1072
+
1073
+ </span>
1074
+ </a>
1075
+
1076
+ </li>
1077
+
1078
+ </ul>
1079
+ </nav>
1080
+
1081
+ </li>
1082
+
1083
+ <li class="md-nav__item">
1084
+ <a href="#message-predicates" class="md-nav__link">
1085
+ <span class="md-ellipsis">
1086
+
1087
+ Message Predicates
1088
+
1089
+ </span>
1090
+ </a>
1091
+
1092
+ </li>
1093
+
1094
+ <li class="md-nav__item">
1095
+ <a href="#creating-messages" class="md-nav__link">
1096
+ <span class="md-ellipsis">
1097
+
1098
+ Creating Messages
1099
+
1100
+ </span>
1101
+ </a>
1102
+
1103
+ <nav class="md-nav" aria-label="Creating Messages">
1104
+ <ul class="md-nav__list">
1105
+
1106
+ <li class="md-nav__item">
1107
+ <a href="#from-strings" class="md-nav__link">
1108
+ <span class="md-ellipsis">
1109
+
1110
+ From Strings
1111
+
1112
+ </span>
1113
+ </a>
1114
+
1115
+ </li>
1116
+
1117
+ <li class="md-nav__item">
1118
+ <a href="#from-hashes" class="md-nav__link">
1119
+ <span class="md-ellipsis">
1120
+
1121
+ From Hashes
1122
+
1123
+ </span>
1124
+ </a>
1125
+
1126
+ </li>
1127
+
1128
+ </ul>
1129
+ </nav>
1130
+
1131
+ </li>
1132
+
1133
+ <li class="md-nav__item">
1134
+ <a href="#serialization" class="md-nav__link">
1135
+ <span class="md-ellipsis">
1136
+
1137
+ Serialization
1138
+
1139
+ </span>
1140
+ </a>
1141
+
1142
+ </li>
1143
+
1144
+ <li class="md-nav__item">
1145
+ <a href="#template-resolution" class="md-nav__link">
1146
+ <span class="md-ellipsis">
1147
+
1148
+ Template Resolution
1149
+
1150
+ </span>
1151
+ </a>
1152
+
1153
+ </li>
1154
+
1155
+ <li class="md-nav__item">
1156
+ <a href="#next-steps" class="md-nav__link">
1157
+ <span class="md-ellipsis">
1158
+
1159
+ Next Steps
1160
+
1161
+ </span>
1162
+ </a>
1163
+
1164
+ </li>
1165
+
1166
+ </ul>
1167
+
1168
+ </nav>
1169
+
1170
+ </li>
1171
+
1172
+
1173
+
1174
+
1175
+ </ul>
1176
+ </nav>
1177
+
1178
+ </li>
1179
+
1180
+
1181
+
1182
+
1183
+
1184
+
1185
+
1186
+
1187
+
1188
+
1189
+
1190
+
1191
+
1192
+
1193
+
1194
+
1195
+
1196
+
1197
+
1198
+
1199
+
1200
+
1201
+
1202
+
1203
+
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+
1211
+
1212
+
1213
+
1214
+
1215
+
1216
+ <li class="md-nav__item md-nav__item--nested">
1217
+
1218
+
1219
+
1220
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
1221
+
1222
+
1223
+ <div class="md-nav__link md-nav__container">
1224
+ <a href="../../guides/" class="md-nav__link ">
1225
+
1226
+
1227
+
1228
+ <span class="md-ellipsis">
1229
+
1230
+
1231
+ Guides
1232
+
1233
+
1234
+
1235
+ </span>
1236
+
1237
+
1238
+
1239
+ </a>
1240
+
1241
+
1242
+ <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
1243
+ <span class="md-nav__icon md-icon"></span>
1244
+ </label>
1245
+
1246
+ </div>
1247
+
1248
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
1249
+ <label class="md-nav__title" for="__nav_4">
1250
+ <span class="md-nav__icon md-icon"></span>
1251
+
1252
+
1253
+ Guides
1254
+
1255
+
1256
+ </label>
1257
+ <ul class="md-nav__list" data-md-scrollfix>
1258
+
1259
+
1260
+
1261
+
1262
+
1263
+
1264
+
1265
+
1266
+
1267
+ <li class="md-nav__item">
1268
+ <a href="../../guides/building-robots/" class="md-nav__link">
1269
+
1270
+
1271
+
1272
+ <span class="md-ellipsis">
1273
+
1274
+
1275
+ Building Robots
1276
+
1277
+
1278
+
1279
+ </span>
1280
+
1281
+
1282
+
1283
+ </a>
1284
+ </li>
1285
+
1286
+
1287
+
1288
+
1289
+
1290
+
1291
+
1292
+
1293
+
1294
+
1295
+ <li class="md-nav__item">
1296
+ <a href="../../guides/creating-networks/" class="md-nav__link">
1297
+
1298
+
1299
+
1300
+ <span class="md-ellipsis">
1301
+
1302
+
1303
+ Creating Networks
1304
+
1305
+
1306
+
1307
+ </span>
1308
+
1309
+
1310
+
1311
+ </a>
1312
+ </li>
1313
+
1314
+
1315
+
1316
+
1317
+
1318
+
1319
+
1320
+
1321
+
1322
+
1323
+ <li class="md-nav__item">
1324
+ <a href="../../guides/using-tools/" class="md-nav__link">
1325
+
1326
+
1327
+
1328
+ <span class="md-ellipsis">
1329
+
1330
+
1331
+ Using Tools
1332
+
1333
+
1334
+
1335
+ </span>
1336
+
1337
+
1338
+
1339
+ </a>
1340
+ </li>
1341
+
1342
+
1343
+
1344
+
1345
+
1346
+
1347
+
1348
+
1349
+
1350
+
1351
+ <li class="md-nav__item">
1352
+ <a href="../../guides/mcp-integration/" class="md-nav__link">
1353
+
1354
+
1355
+
1356
+ <span class="md-ellipsis">
1357
+
1358
+
1359
+ MCP Integration
1360
+
1361
+
1362
+
1363
+ </span>
1364
+
1365
+
1366
+
1367
+ </a>
1368
+ </li>
1369
+
1370
+
1371
+
1372
+
1373
+
1374
+
1375
+
1376
+
1377
+
1378
+
1379
+ <li class="md-nav__item">
1380
+ <a href="../../guides/streaming/" class="md-nav__link">
1381
+
1382
+
1383
+
1384
+ <span class="md-ellipsis">
1385
+
1386
+
1387
+ Streaming Responses
1388
+
1389
+
1390
+
1391
+ </span>
1392
+
1393
+
1394
+
1395
+ </a>
1396
+ </li>
1397
+
1398
+
1399
+
1400
+
1401
+
1402
+
1403
+
1404
+
1405
+
1406
+
1407
+ <li class="md-nav__item">
1408
+ <a href="../../guides/memory/" class="md-nav__link">
1409
+
1410
+
1411
+
1412
+ <span class="md-ellipsis">
1413
+
1414
+
1415
+ Memory System
1416
+
1417
+
1418
+
1419
+ </span>
1420
+
1421
+
1422
+
1423
+ </a>
1424
+ </li>
1425
+
1426
+
1427
+
1428
+
1429
+
1430
+
1431
+
1432
+
1433
+
1434
+
1435
+ <li class="md-nav__item">
1436
+ <a href="../../guides/rails-integration/" class="md-nav__link">
1437
+
1438
+
1439
+
1440
+ <span class="md-ellipsis">
1441
+
1442
+
1443
+ Rails Integration
1444
+
1445
+
1446
+
1447
+ </span>
1448
+
1449
+
1450
+
1451
+ </a>
1452
+ </li>
1453
+
1454
+
1455
+
1456
+
1457
+ </ul>
1458
+ </nav>
1459
+
1460
+ </li>
1461
+
1462
+
1463
+
1464
+
1465
+
1466
+
1467
+
1468
+
1469
+
1470
+
1471
+
1472
+
1473
+
1474
+
1475
+
1476
+
1477
+
1478
+
1479
+
1480
+
1481
+
1482
+
1483
+
1484
+
1485
+
1486
+
1487
+
1488
+
1489
+
1490
+
1491
+
1492
+ <li class="md-nav__item md-nav__item--nested">
1493
+
1494
+
1495
+
1496
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1497
+
1498
+
1499
+ <div class="md-nav__link md-nav__container">
1500
+ <a href="../../api/" class="md-nav__link ">
1501
+
1502
+
1503
+
1504
+ <span class="md-ellipsis">
1505
+
1506
+
1507
+ API Reference
1508
+
1509
+
1510
+
1511
+ </span>
1512
+
1513
+
1514
+
1515
+ </a>
1516
+
1517
+
1518
+ <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1519
+ <span class="md-nav__icon md-icon"></span>
1520
+ </label>
1521
+
1522
+ </div>
1523
+
1524
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1525
+ <label class="md-nav__title" for="__nav_5">
1526
+ <span class="md-nav__icon md-icon"></span>
1527
+
1528
+
1529
+ API Reference
1530
+
1531
+
1532
+ </label>
1533
+ <ul class="md-nav__list" data-md-scrollfix>
1534
+
1535
+
1536
+
1537
+
1538
+
1539
+
1540
+
1541
+
1542
+
1543
+
1544
+
1545
+
1546
+
1547
+
1548
+
1549
+
1550
+
1551
+
1552
+
1553
+
1554
+
1555
+
1556
+
1557
+
1558
+
1559
+
1560
+
1561
+
1562
+
1563
+
1564
+
1565
+
1566
+
1567
+ <li class="md-nav__item md-nav__item--nested">
1568
+
1569
+
1570
+
1571
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" >
1572
+
1573
+
1574
+ <div class="md-nav__link md-nav__container">
1575
+ <a href="../../api/core/" class="md-nav__link ">
1576
+
1577
+
1578
+
1579
+ <span class="md-ellipsis">
1580
+
1581
+
1582
+ Core Classes
1583
+
1584
+
1585
+
1586
+ </span>
1587
+
1588
+
1589
+
1590
+ </a>
1591
+
1592
+
1593
+ <label class="md-nav__link " for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
1594
+ <span class="md-nav__icon md-icon"></span>
1595
+ </label>
1596
+
1597
+ </div>
1598
+
1599
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
1600
+ <label class="md-nav__title" for="__nav_5_2">
1601
+ <span class="md-nav__icon md-icon"></span>
1602
+
1603
+
1604
+ Core Classes
1605
+
1606
+
1607
+ </label>
1608
+ <ul class="md-nav__list" data-md-scrollfix>
1609
+
1610
+
1611
+
1612
+
1613
+
1614
+
1615
+
1616
+
1617
+
1618
+ <li class="md-nav__item">
1619
+ <a href="../../api/core/robot/" class="md-nav__link">
1620
+
1621
+
1622
+
1623
+ <span class="md-ellipsis">
1624
+
1625
+
1626
+ Robot
1627
+
1628
+
1629
+
1630
+ </span>
1631
+
1632
+
1633
+
1634
+ </a>
1635
+ </li>
1636
+
1637
+
1638
+
1639
+
1640
+
1641
+
1642
+
1643
+
1644
+
1645
+
1646
+ <li class="md-nav__item">
1647
+ <a href="../../api/core/network/" class="md-nav__link">
1648
+
1649
+
1650
+
1651
+ <span class="md-ellipsis">
1652
+
1653
+
1654
+ Network
1655
+
1656
+
1657
+
1658
+ </span>
1659
+
1660
+
1661
+
1662
+ </a>
1663
+ </li>
1664
+
1665
+
1666
+
1667
+
1668
+
1669
+
1670
+
1671
+
1672
+
1673
+
1674
+ <li class="md-nav__item">
1675
+ <a href="../../api/core/state/" class="md-nav__link">
1676
+
1677
+
1678
+
1679
+ <span class="md-ellipsis">
1680
+
1681
+
1682
+ State
1683
+
1684
+
1685
+
1686
+ </span>
1687
+
1688
+
1689
+
1690
+ </a>
1691
+ </li>
1692
+
1693
+
1694
+
1695
+
1696
+
1697
+
1698
+
1699
+
1700
+
1701
+
1702
+ <li class="md-nav__item">
1703
+ <a href="../../api/core/tool/" class="md-nav__link">
1704
+
1705
+
1706
+
1707
+ <span class="md-ellipsis">
1708
+
1709
+
1710
+ Tool
1711
+
1712
+
1713
+
1714
+ </span>
1715
+
1716
+
1717
+
1718
+ </a>
1719
+ </li>
1720
+
1721
+
1722
+
1723
+
1724
+
1725
+
1726
+
1727
+
1728
+
1729
+
1730
+ <li class="md-nav__item">
1731
+ <a href="../../api/core/memory/" class="md-nav__link">
1732
+
1733
+
1734
+
1735
+ <span class="md-ellipsis">
1736
+
1737
+
1738
+ Memory
1739
+
1740
+
1741
+
1742
+ </span>
1743
+
1744
+
1745
+
1746
+ </a>
1747
+ </li>
1748
+
1749
+
1750
+
1751
+
1752
+ </ul>
1753
+ </nav>
1754
+
1755
+ </li>
1756
+
1757
+
1758
+
1759
+
1760
+
1761
+
1762
+
1763
+
1764
+
1765
+
1766
+
1767
+
1768
+
1769
+
1770
+
1771
+
1772
+
1773
+
1774
+
1775
+
1776
+
1777
+
1778
+
1779
+
1780
+
1781
+
1782
+
1783
+
1784
+
1785
+
1786
+
1787
+
1788
+ <li class="md-nav__item md-nav__item--nested">
1789
+
1790
+
1791
+
1792
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_3" >
1793
+
1794
+
1795
+ <div class="md-nav__link md-nav__container">
1796
+ <a href="../../api/messages/" class="md-nav__link ">
1797
+
1798
+
1799
+
1800
+ <span class="md-ellipsis">
1801
+
1802
+
1803
+ Messages
1804
+
1805
+
1806
+
1807
+ </span>
1808
+
1809
+
1810
+
1811
+ </a>
1812
+
1813
+
1814
+ <label class="md-nav__link " for="__nav_5_3" id="__nav_5_3_label" tabindex="0">
1815
+ <span class="md-nav__icon md-icon"></span>
1816
+ </label>
1817
+
1818
+ </div>
1819
+
1820
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_3_label" aria-expanded="false">
1821
+ <label class="md-nav__title" for="__nav_5_3">
1822
+ <span class="md-nav__icon md-icon"></span>
1823
+
1824
+
1825
+ Messages
1826
+
1827
+
1828
+ </label>
1829
+ <ul class="md-nav__list" data-md-scrollfix>
1830
+
1831
+
1832
+
1833
+
1834
+
1835
+
1836
+
1837
+
1838
+
1839
+ <li class="md-nav__item">
1840
+ <a href="../../api/messages/user-message/" class="md-nav__link">
1841
+
1842
+
1843
+
1844
+ <span class="md-ellipsis">
1845
+
1846
+
1847
+ UserMessage
1848
+
1849
+
1850
+
1851
+ </span>
1852
+
1853
+
1854
+
1855
+ </a>
1856
+ </li>
1857
+
1858
+
1859
+
1860
+
1861
+
1862
+
1863
+
1864
+
1865
+
1866
+
1867
+ <li class="md-nav__item">
1868
+ <a href="../../api/messages/text-message/" class="md-nav__link">
1869
+
1870
+
1871
+
1872
+ <span class="md-ellipsis">
1873
+
1874
+
1875
+ TextMessage
1876
+
1877
+
1878
+
1879
+ </span>
1880
+
1881
+
1882
+
1883
+ </a>
1884
+ </li>
1885
+
1886
+
1887
+
1888
+
1889
+
1890
+
1891
+
1892
+
1893
+
1894
+
1895
+ <li class="md-nav__item">
1896
+ <a href="../../api/messages/tool-call-message/" class="md-nav__link">
1897
+
1898
+
1899
+
1900
+ <span class="md-ellipsis">
1901
+
1902
+
1903
+ ToolCallMessage
1904
+
1905
+
1906
+
1907
+ </span>
1908
+
1909
+
1910
+
1911
+ </a>
1912
+ </li>
1913
+
1914
+
1915
+
1916
+
1917
+
1918
+
1919
+
1920
+
1921
+
1922
+
1923
+ <li class="md-nav__item">
1924
+ <a href="../../api/messages/tool-result-message/" class="md-nav__link">
1925
+
1926
+
1927
+
1928
+ <span class="md-ellipsis">
1929
+
1930
+
1931
+ ToolResultMessage
1932
+
1933
+
1934
+
1935
+ </span>
1936
+
1937
+
1938
+
1939
+ </a>
1940
+ </li>
1941
+
1942
+
1943
+
1944
+
1945
+ </ul>
1946
+ </nav>
1947
+
1948
+ </li>
1949
+
1950
+
1951
+
1952
+
1953
+
1954
+
1955
+
1956
+
1957
+
1958
+
1959
+
1960
+
1961
+
1962
+
1963
+
1964
+
1965
+
1966
+
1967
+
1968
+
1969
+
1970
+
1971
+
1972
+
1973
+
1974
+
1975
+
1976
+
1977
+
1978
+
1979
+ <li class="md-nav__item md-nav__item--nested">
1980
+
1981
+
1982
+
1983
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_4" >
1984
+
1985
+
1986
+ <div class="md-nav__link md-nav__container">
1987
+ <a href="../../api/mcp/" class="md-nav__link ">
1988
+
1989
+
1990
+
1991
+ <span class="md-ellipsis">
1992
+
1993
+
1994
+ MCP
1995
+
1996
+
1997
+
1998
+ </span>
1999
+
2000
+
2001
+
2002
+ </a>
2003
+
2004
+
2005
+ <label class="md-nav__link " for="__nav_5_4" id="__nav_5_4_label" tabindex="0">
2006
+ <span class="md-nav__icon md-icon"></span>
2007
+ </label>
2008
+
2009
+ </div>
2010
+
2011
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_4_label" aria-expanded="false">
2012
+ <label class="md-nav__title" for="__nav_5_4">
2013
+ <span class="md-nav__icon md-icon"></span>
2014
+
2015
+
2016
+ MCP
2017
+
2018
+
2019
+ </label>
2020
+ <ul class="md-nav__list" data-md-scrollfix>
2021
+
2022
+
2023
+
2024
+
2025
+
2026
+
2027
+
2028
+
2029
+
2030
+ <li class="md-nav__item">
2031
+ <a href="../../api/mcp/client/" class="md-nav__link">
2032
+
2033
+
2034
+
2035
+ <span class="md-ellipsis">
2036
+
2037
+
2038
+ Client
2039
+
2040
+
2041
+
2042
+ </span>
2043
+
2044
+
2045
+
2046
+ </a>
2047
+ </li>
2048
+
2049
+
2050
+
2051
+
2052
+
2053
+
2054
+
2055
+
2056
+
2057
+
2058
+ <li class="md-nav__item">
2059
+ <a href="../../api/mcp/server/" class="md-nav__link">
2060
+
2061
+
2062
+
2063
+ <span class="md-ellipsis">
2064
+
2065
+
2066
+ Server
2067
+
2068
+
2069
+
2070
+ </span>
2071
+
2072
+
2073
+
2074
+ </a>
2075
+ </li>
2076
+
2077
+
2078
+
2079
+
2080
+
2081
+
2082
+
2083
+
2084
+
2085
+
2086
+ <li class="md-nav__item">
2087
+ <a href="../../api/mcp/transports/" class="md-nav__link">
2088
+
2089
+
2090
+
2091
+ <span class="md-ellipsis">
2092
+
2093
+
2094
+ Transports
2095
+
2096
+
2097
+
2098
+ </span>
2099
+
2100
+
2101
+
2102
+ </a>
2103
+ </li>
2104
+
2105
+
2106
+
2107
+
2108
+ </ul>
2109
+ </nav>
2110
+
2111
+ </li>
2112
+
2113
+
2114
+
2115
+
2116
+
2117
+
2118
+
2119
+
2120
+
2121
+
2122
+
2123
+
2124
+
2125
+
2126
+
2127
+
2128
+
2129
+
2130
+
2131
+
2132
+
2133
+
2134
+
2135
+
2136
+
2137
+
2138
+
2139
+
2140
+ <li class="md-nav__item md-nav__item--nested">
2141
+
2142
+
2143
+
2144
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_5" >
2145
+
2146
+
2147
+ <div class="md-nav__link md-nav__container">
2148
+ <a href="../../api/streaming/" class="md-nav__link ">
2149
+
2150
+
2151
+
2152
+ <span class="md-ellipsis">
2153
+
2154
+
2155
+ Streaming
2156
+
2157
+
2158
+
2159
+ </span>
2160
+
2161
+
2162
+
2163
+ </a>
2164
+
2165
+
2166
+ <label class="md-nav__link " for="__nav_5_5" id="__nav_5_5_label" tabindex="0">
2167
+ <span class="md-nav__icon md-icon"></span>
2168
+ </label>
2169
+
2170
+ </div>
2171
+
2172
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_5_label" aria-expanded="false">
2173
+ <label class="md-nav__title" for="__nav_5_5">
2174
+ <span class="md-nav__icon md-icon"></span>
2175
+
2176
+
2177
+ Streaming
2178
+
2179
+
2180
+ </label>
2181
+ <ul class="md-nav__list" data-md-scrollfix>
2182
+
2183
+
2184
+
2185
+
2186
+
2187
+
2188
+
2189
+
2190
+
2191
+ <li class="md-nav__item">
2192
+ <a href="../../api/streaming/context/" class="md-nav__link">
2193
+
2194
+
2195
+
2196
+ <span class="md-ellipsis">
2197
+
2198
+
2199
+ Context
2200
+
2201
+
2202
+
2203
+ </span>
2204
+
2205
+
2206
+
2207
+ </a>
2208
+ </li>
2209
+
2210
+
2211
+
2212
+
2213
+
2214
+
2215
+
2216
+
2217
+
2218
+
2219
+ <li class="md-nav__item">
2220
+ <a href="../../api/streaming/events/" class="md-nav__link">
2221
+
2222
+
2223
+
2224
+ <span class="md-ellipsis">
2225
+
2226
+
2227
+ Events
2228
+
2229
+
2230
+
2231
+ </span>
2232
+
2233
+
2234
+
2235
+ </a>
2236
+ </li>
2237
+
2238
+
2239
+
2240
+
2241
+ </ul>
2242
+ </nav>
2243
+
2244
+ </li>
2245
+
2246
+
2247
+
2248
+
2249
+ </ul>
2250
+ </nav>
2251
+
2252
+ </li>
2253
+
2254
+
2255
+
2256
+
2257
+
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
+ <li class="md-nav__item md-nav__item--nested">
2287
+
2288
+
2289
+
2290
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
2291
+
2292
+
2293
+ <div class="md-nav__link md-nav__container">
2294
+ <a href="../../examples/" class="md-nav__link ">
2295
+
2296
+
2297
+
2298
+ <span class="md-ellipsis">
2299
+
2300
+
2301
+ Examples
2302
+
2303
+
2304
+
2305
+ </span>
2306
+
2307
+
2308
+
2309
+ </a>
2310
+
2311
+
2312
+ <label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="0">
2313
+ <span class="md-nav__icon md-icon"></span>
2314
+ </label>
2315
+
2316
+ </div>
2317
+
2318
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
2319
+ <label class="md-nav__title" for="__nav_6">
2320
+ <span class="md-nav__icon md-icon"></span>
2321
+
2322
+
2323
+ Examples
2324
+
2325
+
2326
+ </label>
2327
+ <ul class="md-nav__list" data-md-scrollfix>
2328
+
2329
+
2330
+
2331
+
2332
+
2333
+
2334
+
2335
+
2336
+
2337
+ <li class="md-nav__item">
2338
+ <a href="../../examples/basic-chat/" class="md-nav__link">
2339
+
2340
+
2341
+
2342
+ <span class="md-ellipsis">
2343
+
2344
+
2345
+ Basic Chat
2346
+
2347
+
2348
+
2349
+ </span>
2350
+
2351
+
2352
+
2353
+ </a>
2354
+ </li>
2355
+
2356
+
2357
+
2358
+
2359
+
2360
+
2361
+
2362
+
2363
+
2364
+
2365
+ <li class="md-nav__item">
2366
+ <a href="../../examples/multi-robot-network/" class="md-nav__link">
2367
+
2368
+
2369
+
2370
+ <span class="md-ellipsis">
2371
+
2372
+
2373
+ Multi-Robot Network
2374
+
2375
+
2376
+
2377
+ </span>
2378
+
2379
+
2380
+
2381
+ </a>
2382
+ </li>
2383
+
2384
+
2385
+
2386
+
2387
+
2388
+
2389
+
2390
+
2391
+
2392
+
2393
+ <li class="md-nav__item">
2394
+ <a href="../../examples/tool-usage/" class="md-nav__link">
2395
+
2396
+
2397
+
2398
+ <span class="md-ellipsis">
2399
+
2400
+
2401
+ Tool Usage
2402
+
2403
+
2404
+
2405
+ </span>
2406
+
2407
+
2408
+
2409
+ </a>
2410
+ </li>
2411
+
2412
+
2413
+
2414
+
2415
+
2416
+
2417
+
2418
+
2419
+
2420
+
2421
+ <li class="md-nav__item">
2422
+ <a href="../../examples/mcp-server/" class="md-nav__link">
2423
+
2424
+
2425
+
2426
+ <span class="md-ellipsis">
2427
+
2428
+
2429
+ MCP Server
2430
+
2431
+
2432
+
2433
+ </span>
2434
+
2435
+
2436
+
2437
+ </a>
2438
+ </li>
2439
+
2440
+
2441
+
2442
+
2443
+
2444
+
2445
+
2446
+
2447
+
2448
+
2449
+ <li class="md-nav__item">
2450
+ <a href="../../examples/rails-application/" class="md-nav__link">
2451
+
2452
+
2453
+
2454
+ <span class="md-ellipsis">
2455
+
2456
+
2457
+ Rails Application
2458
+
2459
+
2460
+
2461
+ </span>
2462
+
2463
+
2464
+
2465
+ </a>
2466
+ </li>
2467
+
2468
+
2469
+
2470
+
2471
+ </ul>
2472
+ </nav>
2473
+
2474
+ </li>
2475
+
2476
+
2477
+
2478
+ </ul>
2479
+ </nav>
2480
+ </div>
2481
+ </div>
2482
+ </div>
2483
+
2484
+
2485
+
2486
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2487
+ <div class="md-sidebar__scrollwrap">
2488
+ <div class="md-sidebar__inner">
2489
+
2490
+
2491
+
2492
+
2493
+ <nav class="md-nav md-nav--secondary" aria-label="On this page">
2494
+
2495
+
2496
+
2497
+
2498
+
2499
+
2500
+ <label class="md-nav__title" for="__toc">
2501
+ <span class="md-nav__icon md-icon"></span>
2502
+ On this page
2503
+ </label>
2504
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2505
+
2506
+ <li class="md-nav__item">
2507
+ <a href="#message-types" class="md-nav__link">
2508
+ <span class="md-ellipsis">
2509
+
2510
+ Message Types
2511
+
2512
+ </span>
2513
+ </a>
2514
+
2515
+ <nav class="md-nav" aria-label="Message Types">
2516
+ <ul class="md-nav__list">
2517
+
2518
+ <li class="md-nav__item">
2519
+ <a href="#textmessage" class="md-nav__link">
2520
+ <span class="md-ellipsis">
2521
+
2522
+ TextMessage
2523
+
2524
+ </span>
2525
+ </a>
2526
+
2527
+ </li>
2528
+
2529
+ <li class="md-nav__item">
2530
+ <a href="#toolmessage" class="md-nav__link">
2531
+ <span class="md-ellipsis">
2532
+
2533
+ ToolMessage
2534
+
2535
+ </span>
2536
+ </a>
2537
+
2538
+ </li>
2539
+
2540
+ <li class="md-nav__item">
2541
+ <a href="#toolcallmessage" class="md-nav__link">
2542
+ <span class="md-ellipsis">
2543
+
2544
+ ToolCallMessage
2545
+
2546
+ </span>
2547
+ </a>
2548
+
2549
+ </li>
2550
+
2551
+ <li class="md-nav__item">
2552
+ <a href="#toolresultmessage" class="md-nav__link">
2553
+ <span class="md-ellipsis">
2554
+
2555
+ ToolResultMessage
2556
+
2557
+ </span>
2558
+ </a>
2559
+
2560
+ </li>
2561
+
2562
+ </ul>
2563
+ </nav>
2564
+
2565
+ </li>
2566
+
2567
+ <li class="md-nav__item">
2568
+ <a href="#message-flow-standalone-robot" class="md-nav__link">
2569
+ <span class="md-ellipsis">
2570
+
2571
+ Message Flow: Standalone Robot
2572
+
2573
+ </span>
2574
+ </a>
2575
+
2576
+ <nav class="md-nav" aria-label="Message Flow: Standalone Robot">
2577
+ <ul class="md-nav__list">
2578
+
2579
+ <li class="md-nav__item">
2580
+ <a href="#step-by-step" class="md-nav__link">
2581
+ <span class="md-ellipsis">
2582
+
2583
+ Step-by-Step
2584
+
2585
+ </span>
2586
+ </a>
2587
+
2588
+ </li>
2589
+
2590
+ </ul>
2591
+ </nav>
2592
+
2593
+ </li>
2594
+
2595
+ <li class="md-nav__item">
2596
+ <a href="#message-flow-network-execution" class="md-nav__link">
2597
+ <span class="md-ellipsis">
2598
+
2599
+ Message Flow: Network Execution
2600
+
2601
+ </span>
2602
+ </a>
2603
+
2604
+ <nav class="md-nav" aria-label="Message Flow: Network Execution">
2605
+ <ul class="md-nav__list">
2606
+
2607
+ <li class="md-nav__item">
2608
+ <a href="#key-points" class="md-nav__link">
2609
+ <span class="md-ellipsis">
2610
+
2611
+ Key Points
2612
+
2613
+ </span>
2614
+ </a>
2615
+
2616
+ </li>
2617
+
2618
+ </ul>
2619
+ </nav>
2620
+
2621
+ </li>
2622
+
2623
+ <li class="md-nav__item">
2624
+ <a href="#robotresult" class="md-nav__link">
2625
+ <span class="md-ellipsis">
2626
+
2627
+ RobotResult
2628
+
2629
+ </span>
2630
+ </a>
2631
+
2632
+ <nav class="md-nav" aria-label="RobotResult">
2633
+ <ul class="md-nav__list">
2634
+
2635
+ <li class="md-nav__item">
2636
+ <a href="#result-serialization" class="md-nav__link">
2637
+ <span class="md-ellipsis">
2638
+
2639
+ Result Serialization
2640
+
2641
+ </span>
2642
+ </a>
2643
+
2644
+ </li>
2645
+
2646
+ </ul>
2647
+ </nav>
2648
+
2649
+ </li>
2650
+
2651
+ <li class="md-nav__item">
2652
+ <a href="#message-predicates" class="md-nav__link">
2653
+ <span class="md-ellipsis">
2654
+
2655
+ Message Predicates
2656
+
2657
+ </span>
2658
+ </a>
2659
+
2660
+ </li>
2661
+
2662
+ <li class="md-nav__item">
2663
+ <a href="#creating-messages" class="md-nav__link">
2664
+ <span class="md-ellipsis">
2665
+
2666
+ Creating Messages
2667
+
2668
+ </span>
2669
+ </a>
2670
+
2671
+ <nav class="md-nav" aria-label="Creating Messages">
2672
+ <ul class="md-nav__list">
2673
+
2674
+ <li class="md-nav__item">
2675
+ <a href="#from-strings" class="md-nav__link">
2676
+ <span class="md-ellipsis">
2677
+
2678
+ From Strings
2679
+
2680
+ </span>
2681
+ </a>
2682
+
2683
+ </li>
2684
+
2685
+ <li class="md-nav__item">
2686
+ <a href="#from-hashes" class="md-nav__link">
2687
+ <span class="md-ellipsis">
2688
+
2689
+ From Hashes
2690
+
2691
+ </span>
2692
+ </a>
2693
+
2694
+ </li>
2695
+
2696
+ </ul>
2697
+ </nav>
2698
+
2699
+ </li>
2700
+
2701
+ <li class="md-nav__item">
2702
+ <a href="#serialization" class="md-nav__link">
2703
+ <span class="md-ellipsis">
2704
+
2705
+ Serialization
2706
+
2707
+ </span>
2708
+ </a>
2709
+
2710
+ </li>
2711
+
2712
+ <li class="md-nav__item">
2713
+ <a href="#template-resolution" class="md-nav__link">
2714
+ <span class="md-ellipsis">
2715
+
2716
+ Template Resolution
2717
+
2718
+ </span>
2719
+ </a>
2720
+
2721
+ </li>
2722
+
2723
+ <li class="md-nav__item">
2724
+ <a href="#next-steps" class="md-nav__link">
2725
+ <span class="md-ellipsis">
2726
+
2727
+ Next Steps
2728
+
2729
+ </span>
2730
+ </a>
2731
+
2732
+ </li>
2733
+
2734
+ </ul>
2735
+
2736
+ </nav>
2737
+ </div>
2738
+ </div>
2739
+ </div>
2740
+
2741
+
2742
+
2743
+ <div class="md-content" data-md-component="content">
2744
+
2745
+
2746
+
2747
+
2748
+
2749
+
2750
+
2751
+ <article class="md-content__inner md-typeset">
2752
+
2753
+
2754
+
2755
+
2756
+
2757
+ <a href="https://github.com/madbomber/robot_lab/edit/main/docs/architecture/message-flow.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
2758
+
2759
+ <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>
2760
+ </a>
2761
+
2762
+
2763
+
2764
+
2765
+
2766
+ <a href="https://github.com/madbomber/robot_lab/raw/main/docs/architecture/message-flow.md" title="View source of this page" class="md-content__button md-icon">
2767
+
2768
+ <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>
2769
+ </a>
2770
+
2771
+
2772
+
2773
+ <h1 id="message-flow">Message Flow<a class="headerlink" href="#message-flow" title="Permanent link">&para;</a></h1>
2774
+ <p>This page explains how messages move through RobotLab, from user input to LLM response.</p>
2775
+ <h2 id="message-types">Message Types<a class="headerlink" href="#message-types" title="Permanent link">&para;</a></h2>
2776
+ <p>RobotLab uses four primary message types:</p>
2777
+ <pre class="mermaid"><code>classDiagram
2778
+ class Message {
2779
+ &lt;&lt;abstract&gt;&gt;
2780
+ +type: String
2781
+ +role: String
2782
+ +content: String
2783
+ +stop_reason: String
2784
+ }
2785
+
2786
+ class TextMessage {
2787
+ +text?() bool
2788
+ +user?() bool
2789
+ +assistant?() bool
2790
+ +system?() bool
2791
+ }
2792
+
2793
+ class ToolMessage {
2794
+ +id: String
2795
+ +name: String
2796
+ +input: Hash
2797
+ +tool_call?() bool
2798
+ }
2799
+
2800
+ class ToolCallMessage {
2801
+ +tools: Array~ToolMessage~
2802
+ }
2803
+
2804
+ class ToolResultMessage {
2805
+ +tool: ToolMessage
2806
+ +content: Hash
2807
+ +tool_result?() bool
2808
+ }
2809
+
2810
+ Message &lt;|-- TextMessage
2811
+ Message &lt;|-- ToolCallMessage
2812
+ Message &lt;|-- ToolResultMessage
2813
+ ToolMessage -- ToolCallMessage
2814
+ ToolMessage -- ToolResultMessage</code></pre>
2815
+ <h3 id="textmessage">TextMessage<a class="headerlink" href="#textmessage" title="Permanent link">&para;</a></h3>
2816
+ <p>Regular text content from users or assistants:</p>
2817
+ <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="no">TextMessage</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
2818
+ </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="ss">role</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;user&quot;</span><span class="p">,</span>
2819
+ </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">content</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;What&#39;s the weather in Paris?&quot;</span>
2820
+ </span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="p">)</span>
2821
+ </span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>
2822
+ </span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="no">TextMessage</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
2823
+ </span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="w"> </span><span class="ss">role</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;assistant&quot;</span><span class="p">,</span>
2824
+ </span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;The weather in Paris is sunny and 22 degrees C.&quot;</span><span class="p">,</span>
2825
+ </span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="w"> </span><span class="ss">stop_reason</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;stop&quot;</span>
2826
+ </span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="p">)</span>
2827
+ </span></code></pre></div>
2828
+ <h3 id="toolmessage">ToolMessage<a class="headerlink" href="#toolmessage" title="Permanent link">&para;</a></h3>
2829
+ <p>Represents a tool invocation with its parameters:</p>
2830
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="no">ToolMessage</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
2831
+ </span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="w"> </span><span class="nb">id</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;tool_123&quot;</span><span class="p">,</span>
2832
+ </span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;get_weather&quot;</span><span class="p">,</span>
2833
+ </span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="ss">input</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="ss">location</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Paris&quot;</span><span class="w"> </span><span class="p">}</span>
2834
+ </span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="p">)</span>
2835
+ </span></code></pre></div>
2836
+ <h3 id="toolcallmessage">ToolCallMessage<a class="headerlink" href="#toolcallmessage" title="Permanent link">&para;</a></h3>
2837
+ <p>LLM's request to execute one or more tools:</p>
2838
+ <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="no">ToolCallMessage</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
2839
+ </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="ss">role</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;assistant&quot;</span><span class="p">,</span>
2840
+ </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">content</span><span class="p">:</span><span class="w"> </span><span class="kp">nil</span><span class="p">,</span>
2841
+ </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">stop_reason</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;tool&quot;</span><span class="p">,</span>
2842
+ </span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="w"> </span><span class="ss">tools</span><span class="p">:</span><span class="w"> </span><span class="o">[</span>
2843
+ </span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="w"> </span><span class="no">ToolMessage</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">id</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;call_1&quot;</span><span class="p">,</span><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;get_weather&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">input</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="ss">location</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Paris&quot;</span><span class="w"> </span><span class="p">})</span>
2844
+ </span><span id="__span-2-7"><a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="w"> </span><span class="o">]</span>
2845
+ </span><span id="__span-2-8"><a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="p">)</span>
2846
+ </span></code></pre></div>
2847
+ <h3 id="toolresultmessage">ToolResultMessage<a class="headerlink" href="#toolresultmessage" title="Permanent link">&para;</a></h3>
2848
+ <p>Result from tool execution:</p>
2849
+ <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="no">ToolResultMessage</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
2850
+ </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="ss">tool</span><span class="p">:</span><span class="w"> </span><span class="n">tool_message</span><span class="p">,</span>
2851
+ </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">content</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="ss">data</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="ss">temp</span><span class="p">:</span><span class="w"> </span><span class="mi">22</span><span class="p">,</span><span class="w"> </span><span class="ss">condition</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;sunny&quot;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span>
2852
+ </span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="p">)</span>
2853
+ </span></code></pre></div>
2854
+ <h2 id="message-flow-standalone-robot">Message Flow: Standalone Robot<a class="headerlink" href="#message-flow-standalone-robot" title="Permanent link">&para;</a></h2>
2855
+ <p>The primary execution path is <code>robot.run("message")</code>:</p>
2856
+ <pre class="mermaid"><code>sequenceDiagram
2857
+ participant User
2858
+ participant Robot
2859
+ participant Memory
2860
+ participant MCP
2861
+ participant Tools
2862
+ participant Agent
2863
+ participant Chat
2864
+ participant LLM
2865
+
2866
+ User-&gt;&gt;Robot: robot.run("message")
2867
+ Robot-&gt;&gt;Memory: resolve_active_memory
2868
+ Memory--&gt;&gt;Robot: active memory
2869
+
2870
+ Robot-&gt;&gt;MCP: resolve_mcp_hierarchy
2871
+ MCP--&gt;&gt;Robot: resolved MCP config
2872
+ Robot-&gt;&gt;Robot: ensure_mcp_clients
2873
+
2874
+ Robot-&gt;&gt;Tools: resolve_tools_hierarchy
2875
+ Tools--&gt;&gt;Robot: filtered tools
2876
+ Robot-&gt;&gt;Chat: @chat.with_tools(...)
2877
+
2878
+ Robot-&gt;&gt;Agent: ask("message")
2879
+ Agent-&gt;&gt;Chat: @chat.ask("message")
2880
+ Chat-&gt;&gt;LLM: Provider API call
2881
+
2882
+ loop Tool Loop (handled by RubyLLM)
2883
+ LLM--&gt;&gt;Chat: Tool call response
2884
+ Chat-&gt;&gt;Tools: Execute tool
2885
+ Tools--&gt;&gt;Chat: Tool result
2886
+ Chat-&gt;&gt;LLM: Send tool result
2887
+ end
2888
+
2889
+ LLM--&gt;&gt;Chat: Final response
2890
+ Chat--&gt;&gt;Agent: RubyLLM::Response
2891
+ Agent--&gt;&gt;Robot: response
2892
+
2893
+ Robot-&gt;&gt;Robot: build_result(response, memory)
2894
+ Robot--&gt;&gt;User: RobotResult</code></pre>
2895
+ <h3 id="step-by-step">Step-by-Step<a class="headerlink" href="#step-by-step" title="Permanent link">&para;</a></h3>
2896
+ <ol>
2897
+ <li>
2898
+ <p><strong><code>robot.run("message")</code></strong>: Entry point. Accepts a positional string argument.</p>
2899
+ </li>
2900
+ <li>
2901
+ <p><strong>Resolve Memory</strong>: Determines which memory to use:</p>
2902
+ </li>
2903
+ <li><code>network_memory</code> if provided (network execution)</li>
2904
+ <li><code>network.memory</code> if in a network context</li>
2905
+ <li>
2906
+ <p><code>robot.memory</code> (standalone, the default)</p>
2907
+ </li>
2908
+ <li>
2909
+ <p><strong>Merge Runtime Memory</strong>: If a <code>memory:</code> keyword argument is passed, it is merged into the active memory.</p>
2910
+ </li>
2911
+ <li>
2912
+ <p><strong>Set Current Writer</strong>: Sets <code>memory.current_writer = robot.name</code> so subscription callbacks know which robot wrote a value.</p>
2913
+ </li>
2914
+ <li>
2915
+ <p><strong>Resolve MCP Hierarchy</strong>: Resolves MCP server configuration through the hierarchy: <code>runtime &gt; robot build &gt; network &gt; global config</code>.</p>
2916
+ </li>
2917
+ <li>
2918
+ <p><strong>Ensure MCP Clients</strong>: Initializes or updates MCP client connections. Discovers tools from connected MCP servers.</p>
2919
+ </li>
2920
+ <li>
2921
+ <p><strong>Resolve Tools Hierarchy</strong>: Resolves which tools are available through the same hierarchy.</p>
2922
+ </li>
2923
+ <li>
2924
+ <p><strong>Filter Tools</strong>: Applies the resolved tool list to <code>@chat.with_tools(...)</code>.</p>
2925
+ </li>
2926
+ <li>
2927
+ <p><strong>Agent#ask</strong>: Delegates to the parent class <code>RubyLLM::Agent#ask</code>, which calls <code>@chat.ask(message)</code>.</p>
2928
+ </li>
2929
+ <li>
2930
+ <p><strong>LLM Interaction</strong>: RubyLLM handles the provider-specific API call, including the tool call/result loop.</p>
2931
+ </li>
2932
+ <li>
2933
+ <p><strong>Build Result</strong>: Wraps the LLM response in a <code>RobotResult</code> containing output messages, tool calls, and metadata.</p>
2934
+ </li>
2935
+ <li>
2936
+ <p><strong>Return</strong>: Returns the <code>RobotResult</code> to the caller.</p>
2937
+ </li>
2938
+ </ol>
2939
+ <h2 id="message-flow-network-execution">Message Flow: Network Execution<a class="headerlink" href="#message-flow-network-execution" title="Permanent link">&para;</a></h2>
2940
+ <p>When running through a network, the flow adds pipeline orchestration:</p>
2941
+ <pre class="mermaid"><code>sequenceDiagram
2942
+ participant User
2943
+ participant Network
2944
+ participant Pipeline
2945
+ participant Task
2946
+ participant Robot
2947
+ participant LLM
2948
+
2949
+ User-&gt;&gt;Network: network.run(message: "...")
2950
+ Network-&gt;&gt;Network: Inject network_memory into run_context
2951
+ Network-&gt;&gt;Pipeline: SimpleFlow::Pipeline.call_parallel(initial_result)
2952
+
2953
+ loop For each ready task
2954
+ Pipeline-&gt;&gt;Task: task.call(result)
2955
+ Task-&gt;&gt;Task: Deep merge task context with run_params
2956
+ Task-&gt;&gt;Robot: robot.call(enhanced_result)
2957
+ Robot-&gt;&gt;Robot: extract_run_context(result)
2958
+ Robot-&gt;&gt;Robot: run(message, network_memory: ...)
2959
+ Robot-&gt;&gt;LLM: Agent#ask -&gt; @chat.ask
2960
+ LLM--&gt;&gt;Robot: Response
2961
+ Robot--&gt;&gt;Task: result.with_context(:name, robot_result).continue(robot_result)
2962
+ Task--&gt;&gt;Pipeline: SimpleFlow::Result
2963
+ end
2964
+
2965
+ Pipeline--&gt;&gt;Network: Final SimpleFlow::Result
2966
+ Network--&gt;&gt;User: result</code></pre>
2967
+ <h3 id="key-points">Key Points<a class="headerlink" href="#key-points" title="Permanent link">&para;</a></h3>
2968
+ <ul>
2969
+ <li><strong>Network creates initial result</strong>: <code>SimpleFlow::Result.new(run_context, context: { run_params: run_context })</code></li>
2970
+ <li><strong>Task wraps robot</strong>: Each <code>Task</code> deep-merges its own context with the run params before delegating to the robot</li>
2971
+ <li><strong>Robot extracts context</strong>: <code>extract_run_context(result)</code> pulls the message, MCP, tools, and memory from the SimpleFlow result</li>
2972
+ <li><strong>Shared memory</strong>: All robots use <code>network.memory</code> during network execution</li>
2973
+ <li><strong>Result accumulation</strong>: Each task stores its <code>RobotResult</code> in <code>result.context[:task_name]</code></li>
2974
+ </ul>
2975
+ <h2 id="robotresult">RobotResult<a class="headerlink" href="#robotresult" title="Permanent link">&para;</a></h2>
2976
+ <p>The return value of <code>robot.run("message")</code>:</p>
2977
+ <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">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">robot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;What is Ruby?&quot;</span><span class="p">)</span>
2978
+ </span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>
2979
+ </span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></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;Ruby is a dynamic programming language...&quot;</span>
2980
+ </span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="n">result</span><span class="o">.</span><span class="n">has_tool_calls?</span><span class="w"> </span><span class="c1">#=&gt; false</span>
2981
+ </span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="n">result</span><span class="o">.</span><span class="n">robot_name</span><span class="w"> </span><span class="c1">#=&gt; &quot;assistant&quot;</span>
2982
+ </span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="n">result</span><span class="o">.</span><span class="n">output</span><span class="w"> </span><span class="c1">#=&gt; [TextMessage(role: &quot;assistant&quot;, content: &quot;...&quot;)]</span>
2983
+ </span><span id="__span-4-7"><a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="n">result</span><span class="o">.</span><span class="n">tool_calls</span><span class="w"> </span><span class="c1">#=&gt; []</span>
2984
+ </span><span id="__span-4-8"><a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a><span class="n">result</span><span class="o">.</span><span class="n">stop_reason</span><span class="w"> </span><span class="c1">#=&gt; &quot;stop&quot;</span>
2985
+ </span><span id="__span-4-9"><a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="n">result</span><span class="o">.</span><span class="n">created_at</span><span class="w"> </span><span class="c1">#=&gt; Time</span>
2986
+ </span><span id="__span-4-10"><a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="n">result</span><span class="o">.</span><span class="n">id</span><span class="w"> </span><span class="c1">#=&gt; &quot;uuid&quot;</span>
2987
+ </span><span id="__span-4-11"><a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a><span class="n">result</span><span class="o">.</span><span class="n">checksum</span><span class="w"> </span><span class="c1">#=&gt; &quot;sha256-hex&quot;</span>
2988
+ </span></code></pre></div>
2989
+ <h3 id="result-serialization">Result Serialization<a class="headerlink" href="#result-serialization" title="Permanent link">&para;</a></h3>
2990
+ <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"># Export for persistence (excludes debug fields)</span>
2991
+ </span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="nb">hash</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">result</span><span class="o">.</span><span class="n">export</span>
2992
+ </span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
2993
+ </span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="c1"># Full hash including debug fields</span>
2994
+ </span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="nb">hash</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">result</span><span class="o">.</span><span class="n">to_h</span>
2995
+ </span><span id="__span-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>
2996
+ </span><span id="__span-5-7"><a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="c1"># JSON</span>
2997
+ </span><span id="__span-5-8"><a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="n">json</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">result</span><span class="o">.</span><span class="n">to_json</span>
2998
+ </span><span id="__span-5-9"><a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a>
2999
+ </span><span id="__span-5-10"><a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a><span class="c1"># Reconstruct from hash</span>
3000
+ </span><span id="__span-5-11"><a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">RobotResult</span><span class="o">.</span><span class="n">from_hash</span><span class="p">(</span><span class="nb">hash</span><span class="p">)</span>
3001
+ </span></code></pre></div>
3002
+ <h2 id="message-predicates">Message Predicates<a class="headerlink" href="#message-predicates" title="Permanent link">&para;</a></h2>
3003
+ <p>Check message types:</p>
3004
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="n">message</span><span class="o">.</span><span class="n">text?</span><span class="w"> </span><span class="c1"># Is it a TextMessage?</span>
3005
+ </span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="n">message</span><span class="o">.</span><span class="n">tool_call?</span><span class="w"> </span><span class="c1"># Is it a ToolCallMessage?</span>
3006
+ </span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="n">message</span><span class="o">.</span><span class="n">tool_result?</span><span class="w"> </span><span class="c1"># Is it a ToolResultMessage?</span>
3007
+ </span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a>
3008
+ </span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="n">message</span><span class="o">.</span><span class="n">user?</span><span class="w"> </span><span class="c1"># Is role &quot;user&quot;?</span>
3009
+ </span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a><span class="n">message</span><span class="o">.</span><span class="n">assistant?</span><span class="w"> </span><span class="c1"># Is role &quot;assistant&quot;?</span>
3010
+ </span><span id="__span-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="n">message</span><span class="o">.</span><span class="n">system?</span><span class="w"> </span><span class="c1"># Is role &quot;system&quot;?</span>
3011
+ </span><span id="__span-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a>
3012
+ </span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="n">message</span><span class="o">.</span><span class="n">stopped?</span><span class="w"> </span><span class="c1"># Is stop_reason &quot;stop&quot;?</span>
3013
+ </span><span id="__span-6-10"><a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a><span class="n">message</span><span class="o">.</span><span class="n">tool_stop?</span><span class="w"> </span><span class="c1"># Is stop_reason &quot;tool&quot;?</span>
3014
+ </span></code></pre></div>
3015
+ <h2 id="creating-messages">Creating Messages<a class="headerlink" href="#creating-messages" title="Permanent link">&para;</a></h2>
3016
+ <h3 id="from-strings">From Strings<a class="headerlink" href="#from-strings" title="Permanent link">&para;</a></h3>
3017
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="no">TextMessage</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">role</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;user&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Hello&quot;</span><span class="p">)</span>
3018
+ </span></code></pre></div>
3019
+ <h3 id="from-hashes">From Hashes<a class="headerlink" href="#from-hashes" title="Permanent link">&para;</a></h3>
3020
+ <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="no">Message</span><span class="o">.</span><span class="n">from_hash</span><span class="p">(</span>
3021
+ </span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="w"> </span><span class="ss">type</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;text&quot;</span><span class="p">,</span>
3022
+ </span><span id="__span-8-3"><a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="w"> </span><span class="ss">role</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;user&quot;</span><span class="p">,</span>
3023
+ </span><span id="__span-8-4"><a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a><span class="w"> </span><span class="ss">content</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Hello&quot;</span>
3024
+ </span><span id="__span-8-5"><a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a><span class="p">)</span>
3025
+ </span></code></pre></div>
3026
+ <h2 id="serialization">Serialization<a class="headerlink" href="#serialization" title="Permanent link">&para;</a></h2>
3027
+ <p>Messages can be serialized:</p>
3028
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="c1"># To hash</span>
3029
+ </span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="nb">hash</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">message</span><span class="o">.</span><span class="n">to_h</span>
3030
+ </span><span id="__span-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a><span class="c1">#=&gt; { type: &quot;text&quot;, role: &quot;user&quot;, content: &quot;Hello&quot; }</span>
3031
+ </span><span id="__span-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a>
3032
+ </span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="c1"># To JSON</span>
3033
+ </span><span id="__span-9-6"><a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a><span class="n">json</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">message</span><span class="o">.</span><span class="n">to_json</span>
3034
+ </span><span id="__span-9-7"><a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a>
3035
+ </span><span id="__span-9-8"><a id="__codelineno-9-8" name="__codelineno-9-8" href="#__codelineno-9-8"></a><span class="c1"># From hash</span>
3036
+ </span><span id="__span-9-9"><a id="__codelineno-9-9" name="__codelineno-9-9" href="#__codelineno-9-9"></a><span class="n">message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Message</span><span class="o">.</span><span class="n">from_hash</span><span class="p">(</span><span class="nb">hash</span><span class="p">)</span>
3037
+ </span></code></pre></div>
3038
+ <h2 id="template-resolution">Template Resolution<a class="headerlink" href="#template-resolution" title="Permanent link">&para;</a></h2>
3039
+ <p>When a robot has a template, it is resolved at build time via prompt_manager:</p>
3040
+ <div class="language-ruby highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="n">robot</span><span class="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>
3041
+ </span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="w"> </span><span class="nb">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;helper&quot;</span><span class="p">,</span>
3042
+ </span><span id="__span-10-3"><a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a><span class="w"> </span><span class="ss">template</span><span class="p">:</span><span class="w"> </span><span class="ss">:helper</span><span class="p">,</span>
3043
+ </span><span id="__span-10-4"><a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-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">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>
3044
+ </span><span id="__span-10-5"><a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a><span class="p">)</span>
3045
+ </span></code></pre></div>
3046
+ <p>The template resolution process:
3047
+ 1. <code>PM.parse(:helper)</code> loads the template file from the configured prompts directory
3048
+ 2. YAML front matter is extracted and applied to the chat (model, temperature, etc.)
3049
+ 3. The template body is rendered with the provided context
3050
+ 4. The rendered text is set as system instructions via <code>@chat.with_instructions(rendered)</code></p>
3051
+ <p>If both <code>template:</code> and <code>system_prompt:</code> are provided, the template is applied first, then the system prompt is appended via a second <code>@chat.with_instructions</code> call.</p>
3052
+ <h2 id="next-steps">Next Steps<a class="headerlink" href="#next-steps" title="Permanent link">&para;</a></h2>
3053
+ <ul>
3054
+ <li><a href="../state-management/">Memory Management</a> - How memory stores conversation data</li>
3055
+ <li><a href="../network-orchestration/">Network Orchestration</a> - Multi-robot pipeline execution</li>
3056
+ </ul>
3057
+
3058
+
3059
+
3060
+
3061
+
3062
+
3063
+
3064
+
3065
+
3066
+
3067
+
3068
+
3069
+
3070
+ <form class="md-feedback" name="feedback" hidden>
3071
+ <fieldset>
3072
+ <legend class="md-feedback__title">
3073
+ Was this page helpful?
3074
+ </legend>
3075
+ <div class="md-feedback__inner">
3076
+ <div class="md-feedback__list">
3077
+
3078
+ <button class="md-feedback__icon md-icon" type="submit" title="This page was helpful" data-md-value="1">
3079
+ <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>
3080
+ </button>
3081
+
3082
+ <button class="md-feedback__icon md-icon" type="submit" title="This page could be improved" data-md-value="0">
3083
+ <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>
3084
+ </button>
3085
+
3086
+ </div>
3087
+ <div class="md-feedback__note">
3088
+
3089
+ <div data-md-value="1" hidden>
3090
+
3091
+
3092
+
3093
+
3094
+
3095
+
3096
+
3097
+
3098
+
3099
+ Thanks for your feedback!
3100
+ </div>
3101
+
3102
+ <div data-md-value="0" hidden>
3103
+
3104
+
3105
+
3106
+
3107
+
3108
+
3109
+
3110
+
3111
+
3112
+ Thanks for your feedback! Help us improve by creating an issue.
3113
+ </div>
3114
+
3115
+ </div>
3116
+ </div>
3117
+ </fieldset>
3118
+ </form>
3119
+
3120
+
3121
+
3122
+ </article>
3123
+ </div>
3124
+
3125
+
3126
+ <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>
3127
+
3128
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
3129
+ </div>
3130
+
3131
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
3132
+
3133
+ <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>
3134
+ Back to top
3135
+ </button>
3136
+
3137
+ </main>
3138
+
3139
+ <footer class="md-footer">
3140
+
3141
+
3142
+
3143
+ <nav class="md-footer__inner md-grid" aria-label="Footer" >
3144
+
3145
+
3146
+ <a href="../state-management/" class="md-footer__link md-footer__link--prev" aria-label="Previous: State Management">
3147
+ <div class="md-footer__button md-icon">
3148
+
3149
+ <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>
3150
+ </div>
3151
+ <div class="md-footer__title">
3152
+ <span class="md-footer__direction">
3153
+ Previous
3154
+ </span>
3155
+ <div class="md-ellipsis">
3156
+ State Management
3157
+ </div>
3158
+ </div>
3159
+ </a>
3160
+
3161
+
3162
+
3163
+ <a href="../../guides/" class="md-footer__link md-footer__link--next" aria-label="Next: Guides">
3164
+ <div class="md-footer__title">
3165
+ <span class="md-footer__direction">
3166
+ Next
3167
+ </span>
3168
+ <div class="md-ellipsis">
3169
+ Guides
3170
+ </div>
3171
+ </div>
3172
+ <div class="md-footer__button md-icon">
3173
+
3174
+ <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>
3175
+ </div>
3176
+ </a>
3177
+
3178
+ </nav>
3179
+
3180
+
3181
+ <div class="md-footer-meta md-typeset">
3182
+ <div class="md-footer-meta__inner md-grid">
3183
+ <div class="md-copyright">
3184
+
3185
+ <div class="md-copyright__highlight">
3186
+ Copyright &copy; 2025 Dewayne VanHoozer
3187
+ </div>
3188
+
3189
+
3190
+ Made with
3191
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
3192
+ Material for MkDocs
3193
+ </a>
3194
+
3195
+ </div>
3196
+
3197
+
3198
+ <div class="md-social">
3199
+
3200
+
3201
+
3202
+
3203
+
3204
+ <a href="https://github.com/madbomber/robot_lab" target="_blank" rel="noopener" title="RobotLab on GitHub" class="md-social__link">
3205
+ <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>
3206
+ </a>
3207
+
3208
+
3209
+
3210
+
3211
+
3212
+ <a href="https://rubygems.org/gems/robot_lab" target="_blank" rel="noopener" title="RobotLab on RubyGems" class="md-social__link">
3213
+ <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>
3214
+ </a>
3215
+
3216
+ </div>
3217
+
3218
+ </div>
3219
+ </div>
3220
+ </footer>
3221
+
3222
+ </div>
3223
+ <div class="md-dialog" data-md-component="dialog">
3224
+ <div class="md-dialog__inner md-typeset"></div>
3225
+ </div>
3226
+
3227
+
3228
+
3229
+
3230
+
3231
+ <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>
3232
+
3233
+
3234
+ <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
3235
+
3236
+
3237
+ </body>
3238
+ </html>