agent-swarm-kit-docs / documents /articles_testbed.html
tripolskypetr's picture
deploy: migrate media images to Git LFS
0ed609b
Raw
History Blame Contribute Delete
28.2 kB
<!DOCTYPE html><html class="default" lang="en" data-base=".."><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>articles/testbed | agent-swarm-kit</title><meta name="description" content="Documentation for agent-swarm-kit"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search"><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">agent-swarm-kit</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">agent-swarm-kit</a></li><li><a href="articles_testbed.html">articles/testbed</a></li></ul></div><div class="tsd-panel tsd-typography"><a id="testing-swarm-of-agents" class="tsd-anchor"></a><h1 class="tsd-anchor-link">Testing swarm of agents<a href="#testing-swarm-of-agents" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h1><p>When developing a swarm of agents, the question of unit testing arises. A swarm of agents allows the use of different LLMs, with the selection of another active model based on user actions. As a result, any agent from the swarm can handle identical correspondence. For example, if a <a href="https://redis.io/docs/latest/commands/flushall/">Redis FLUSHALL</a> is executed and the active agent is lost, the chat continues <a href="https://github.com/openai/openai-agents-python/issues/256">with the root Triage agent</a>.</p>
<p><img src="../media/e08cddb066d2c40ae2cba8e6b16b5e97.png" alt="meme"></p>
<p>Without tests, there is no technical way to catch rare model states where, in 8 out of 10 cases, the model behaves correctly, but in the remaining two, it produces utter nonsense—for example, <strong>spontaneously deciding to greet the user again</strong>. This is a consequence of the mathematical model, where response diversity is <a href="https://community.openai.com/t/question-about-the-use-of-seed-parameter-and-deterministic-outputs/773638">ensured by the seed and temperature variables</a>.</p>
<p>Moreover, without tests, it’s impossible to verify a prompt engineer’s work: how do we know if they actually tested their prompts? Prompts aren’t code, so static analysis is useless. It’s also a good way to <s>catch cringe</s> <a href="https://habr.com/ru/articles/892468/">test open-source models</a> for production readiness. In theory, offloading small talk to a local model could save money, but currently, they hallucinate too much.</p>
<a id="what-needs-to-be-tested" class="tsd-anchor"></a><h2 class="tsd-anchor-link">What Needs to Be Tested<a href="#what-needs-to-be-tested" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><p>For invoked tools, it’s essential to test that the model actually <a href="https://platform.openai.com/docs/guides/function-calling">calls external APIs</a> rather than generating a text placeholder like <code>payment completed successfully</code>.</p>
<pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">Chat</span><span class="hl-1">, </span><span class="hl-2">commitToolOutput</span><span class="hl-1">, </span><span class="hl-2">emit</span><span class="hl-1">, </span><span class="hl-2">getAgentName</span><span class="hl-1">, </span><span class="hl-2">overrideSwarm</span><span class="hl-1">, </span><span class="hl-2">overrideTool</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;agent-swarm-kit&quot;</span><span class="hl-1">;</span><br/><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">randomString</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;functools-kit&quot;</span><span class="hl-1">;</span><br/><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">test</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;worker-testbed&quot;</span><span class="hl-1">;</span><br/><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">AgentName</span><span class="hl-1">, </span><span class="hl-2">SwarmName</span><span class="hl-1">, </span><span class="hl-2">ToolName</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@modules/remote-lib&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-6">CLIENT_ID</span><span class="hl-1"> = </span><span class="hl-3">`test-client-id-</span><span class="hl-4">${</span><span class="hl-0">randomString</span><span class="hl-10">()</span><span class="hl-4">}</span><span class="hl-3">`</span><span class="hl-1">;</span><br/><br/><span class="hl-0">test</span><span class="hl-1">(</span><span class="hl-3">&quot;RU: Topping up a Troika card upon user request&quot;</span><span class="hl-1">, </span><span class="hl-4">async</span><span class="hl-1"> (</span><span class="hl-2">t</span><span class="hl-1">) </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">let</span><span class="hl-1"> </span><span class="hl-2">isCalled</span><span class="hl-1"> = </span><span class="hl-4">false</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-9">/**</span><br/><span class="hl-9"> * Language models store user preferences in the system prompt</span><br/><span class="hl-9"> * This also needs to be covered by tests</span><br/><span class="hl-9"> */</span><br/><span class="hl-1"> </span><span class="hl-0">overrideAgent</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">agentName:</span><span class="hl-1"> </span><span class="hl-2">AgentName</span><span class="hl-1">.</span><span class="hl-2">TroikaPaymentToolRu</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-0">systemDynamic</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> (</span><span class="hl-2">clientId</span><span class="hl-1">: </span><span class="hl-7">string</span><span class="hl-1">) </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">return</span><span class="hl-1"> [</span><span class="hl-3">`The last time the user topped up the Troika card with 300 rubles`</span><span class="hl-1">];</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> });</span><br/><br/><span class="hl-1"> </span><span class="hl-0">overrideTool</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">toolName:</span><span class="hl-1"> </span><span class="hl-2">ToolName</span><span class="hl-1">.</span><span class="hl-2">TroikaPaymentToolRu</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-0">call</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> ({ </span><span class="hl-2">toolId</span><span class="hl-1">, </span><span class="hl-2">clientId</span><span class="hl-1">, </span><span class="hl-2">agentName</span><span class="hl-1">, </span><span class="hl-2">params</span><span class="hl-1"> }) </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">if</span><span class="hl-1"> (</span><span class="hl-2">params</span><span class="hl-1">.</span><span class="hl-2">amount</span><span class="hl-1"> === </span><span class="hl-3">&quot;200&quot;</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-2">isCalled</span><span class="hl-1"> = </span><span class="hl-4">true</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-0">commitToolOutput</span><span class="hl-1">(</span><span class="hl-2">toolId</span><span class="hl-1">, </span><span class="hl-3">&quot;Ok&quot;</span><span class="hl-1">, </span><span class="hl-2">clientId</span><span class="hl-1">, </span><span class="hl-2">agentName</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-0">emit</span><span class="hl-1">(</span><span class="hl-3">&quot;Ok&quot;</span><span class="hl-1">, </span><span class="hl-2">clientId</span><span class="hl-1">, </span><span class="hl-2">agentName</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> });</span><br/><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-2">Chat</span><span class="hl-1">.</span><span class="hl-0">sendMessage</span><span class="hl-1">(</span><span class="hl-6">CLIENT_ID</span><span class="hl-1">, </span><span class="hl-3">&quot;I want to top up my Troika card with 200 rubles&quot;</span><span class="hl-1">, </span><span class="hl-2">SwarmName</span><span class="hl-1">.</span><span class="hl-2">RootSwarmRu</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-5">if</span><span class="hl-1"> (</span><span class="hl-2">isCalled</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-2">t</span><span class="hl-1">.</span><span class="hl-0">pass</span><span class="hl-1">(</span><span class="hl-3">&quot;Troika card top-up tool was successfully called&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> } </span><span class="hl-5">else</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">t</span><span class="hl-1">.</span><span class="hl-0">fail</span><span class="hl-1">(</span><span class="hl-3">&quot;Troika card top-up tool was not called&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">});</span>
</code><button type="button">Copy</button></pre>
<p>For string parameters like <strong>enum</strong>, it’s critical to test that the model takes the value from the conversation rather than the first parameter from the tool’s declaration.</p>
<pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">Chat</span><span class="hl-1">, </span><span class="hl-2">commitToolOutput</span><span class="hl-1">, </span><span class="hl-2">emit</span><span class="hl-1">, </span><span class="hl-2">getAgentName</span><span class="hl-1">, </span><span class="hl-2">overrideSwarm</span><span class="hl-1">, </span><span class="hl-2">overrideTool</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;agent-swarm-kit&quot;</span><span class="hl-1">;</span><br/><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">randomString</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;functools-kit&quot;</span><span class="hl-1">;</span><br/><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">test</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;worker-testbed&quot;</span><span class="hl-1">;</span><br/><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">AgentName</span><span class="hl-1">, </span><span class="hl-2">SwarmName</span><span class="hl-1">, </span><span class="hl-2">ToolName</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@modules/remote-lib&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-6">CLIENT_ID</span><span class="hl-1"> = </span><span class="hl-3">`test-client-id-</span><span class="hl-4">${</span><span class="hl-0">randomString</span><span class="hl-10">()</span><span class="hl-4">}</span><span class="hl-3">`</span><span class="hl-1">;</span><br/><br/><span class="hl-0">test</span><span class="hl-1">(</span><span class="hl-3">&quot;RU: Mosenergo electricity payment will return an error without specifying the district&quot;</span><span class="hl-1">, </span><span class="hl-4">async</span><span class="hl-1"> (</span><span class="hl-2">t</span><span class="hl-1">) </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">let</span><span class="hl-1"> </span><span class="hl-2">isCalled</span><span class="hl-1"> = </span><span class="hl-4">false</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-0">overrideTool</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">toolName:</span><span class="hl-1"> </span><span class="hl-2">ToolName</span><span class="hl-1">.</span><span class="hl-2">MosenergoPaymentToolRu</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-0">call</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> ({ </span><span class="hl-2">toolId</span><span class="hl-1">, </span><span class="hl-2">clientId</span><span class="hl-1">, </span><span class="hl-2">agentName</span><span class="hl-1">, </span><span class="hl-2">params</span><span class="hl-1"> }) </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-9">// If the model provided any district (district is defined), the test should fail</span><br/><span class="hl-1"> </span><span class="hl-5">if</span><span class="hl-1"> (</span><span class="hl-2">params</span><span class="hl-1">.</span><span class="hl-2">district</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-2">isCalled</span><span class="hl-1"> = </span><span class="hl-4">true</span><span class="hl-1">; </span><span class="hl-9">// Tool was called with a district, which shouldn’t happen</span><br/><span class="hl-1"> } </span><span class="hl-5">else</span><span class="hl-1"> </span><span class="hl-5">if</span><span class="hl-1"> (</span><span class="hl-2">params</span><span class="hl-1">.</span><span class="hl-2">amount</span><span class="hl-1"> === </span><span class="hl-3">&quot;200&quot;</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-2">isCalled</span><span class="hl-1"> = </span><span class="hl-4">false</span><span class="hl-1">; </span><span class="hl-9">// TODO: District not specified, tool shouldn’t be called. Nemotron Mini on Ollama</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> });</span><br/><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-2">Chat</span><span class="hl-1">.</span><span class="hl-0">sendMessage</span><span class="hl-1">(</span><span class="hl-6">CLIENT_ID</span><span class="hl-1">, </span><span class="hl-3">&quot;I want to pay 200 rubles for Mosenergo electricity&quot;</span><span class="hl-1">, </span><span class="hl-2">SwarmName</span><span class="hl-1">.</span><span class="hl-2">RootSwarmRu</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-5">if</span><span class="hl-1"> (</span><span class="hl-2">isCalled</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-2">t</span><span class="hl-1">.</span><span class="hl-0">fail</span><span class="hl-1">(</span><span class="hl-3">&quot;Mosenergo electricity payment tool was called with an assumed district&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> } </span><span class="hl-5">else</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">t</span><span class="hl-1">.</span><span class="hl-0">pass</span><span class="hl-1">(</span><span class="hl-3">&quot;Mosenergo electricity payment tool was not called, as expected&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">});</span>
</code><button type="button">Copy</button></pre>
<p>A swarm of agents implies a router—a <code>triage agent</code>. This agent’s task is to arbitrate which target agent, from those available in the state, can handle the user’s request. The child agent performs a detailed analysis of what needs to be done. If it can’t handle the request, it redirects back to the <code>triage agent</code>. If the agents’ prompts are not precise enough, recursive navigations will occur.</p>
<pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">Chat</span><span class="hl-1">, </span><span class="hl-2">getAgentName</span><span class="hl-1">, </span><span class="hl-2">overrideSwarm</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;agent-swarm-kit&quot;</span><span class="hl-1">;</span><br/><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">randomString</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;functools-kit&quot;</span><span class="hl-1">;</span><br/><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">test</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;worker-testbed&quot;</span><span class="hl-1">;</span><br/><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-2">AgentName</span><span class="hl-1">, </span><span class="hl-2">SwarmName</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@modules/remote-lib&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-6">CLIENT_ID</span><span class="hl-1"> = </span><span class="hl-3">`test-client-id-</span><span class="hl-4">${</span><span class="hl-0">randomString</span><span class="hl-10">()</span><span class="hl-4">}</span><span class="hl-3">`</span><span class="hl-1">;</span><br/><br/><span class="hl-0">test</span><span class="hl-1">(</span><span class="hl-3">&quot;RU: Transition from Mosvodokanal water agent to triage agent upon request&quot;</span><span class="hl-1">, </span><span class="hl-4">async</span><span class="hl-1"> (</span><span class="hl-2">t</span><span class="hl-1">) </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-0">overrideSwarm</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">swarmName:</span><span class="hl-1"> </span><span class="hl-2">SwarmName</span><span class="hl-1">.</span><span class="hl-2">RootSwarmRu</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-0">getActiveAgent</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> () </span><span class="hl-4">=&gt;</span><span class="hl-1"> </span><span class="hl-2">AgentName</span><span class="hl-1">.</span><span class="hl-2">WaterAgentRu</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-2">Chat</span><span class="hl-1">.</span><span class="hl-0">sendMessage</span><span class="hl-1">(</span><span class="hl-6">CLIENT_ID</span><span class="hl-1">, </span><span class="hl-3">&quot;Redirect me to the triage agent&quot;</span><span class="hl-1">, </span><span class="hl-2">SwarmName</span><span class="hl-1">.</span><span class="hl-2">RootSwarmRu</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-6">lastAgent</span><span class="hl-1"> = </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-0">getAgentName</span><span class="hl-1">(</span><span class="hl-6">CLIENT_ID</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-5">if</span><span class="hl-1"> (</span><span class="hl-2">lastAgent</span><span class="hl-1"> === </span><span class="hl-2">AgentName</span><span class="hl-1">.</span><span class="hl-2">TriageAgentRu</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-2">t</span><span class="hl-1">.</span><span class="hl-0">pass</span><span class="hl-1">(</span><span class="hl-3">&quot;Mosvodokanal water agent successfully transitioned to triage agent&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> } </span><span class="hl-5">else</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">t</span><span class="hl-1">.</span><span class="hl-0">fail</span><span class="hl-1">(</span><span class="hl-3">&quot;Mosvodokanal water agent failed to transition to triage agent&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">});</span>
</code><button type="button">Copy</button></pre>
<a id="thank-you-for-your-attention" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Thank You for Your Attention!<a href="#thank-you-for-your-attention" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2></div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#testing-swarm-of-agents"><span>Testing swarm of agents</span></a><ul><li><a href="#what-needs-to-be-tested"><span>What <wbr/>Needs to <wbr/>Be <wbr/>Tested</span></a></li><li><a href="#thank-you-for-your-attention"><span>Thank <wbr/>You for <wbr/>Your <wbr/>Attention!</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">agent-swarm-kit</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
ym(100273846, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true,
webvisor:true,
ecommerce:"dataLayer"
});
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/100273846" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-85RYYZDT35"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-85RYYZDT35');
</script>