[{"data":1,"prerenderedAt":1913},["ShallowReactive",2],{"docs:/docs/agents/getting-started":3},{"id":4,"title":5,"body":6,"description":1906,"extension":1907,"meta":1908,"navigation":186,"path":1909,"seo":1910,"stem":1911,"__hash__":1912},"docs/docs/agents/getting-started.md","Getting Started with AI Agents",{"type":7,"value":8,"toc":1894},"minimark",[9,13,17,22,53,57,103,122,126,152,344,354,358,365,386,401,405,408,831,844,848,858,1262,1279,1283,1286,1784,1788,1818,1822,1845,1848,1856,1860,1890],[10,11,5],"h1",{"id":12},"getting-started-with-ai-agents",[14,15,16],"p",{},"Build your first multi-agent workflow in minutes.",[18,19,21],"h2",{"id":20},"prerequisites","Prerequisites",[23,24,25,35,50],"ul",{},[26,27,28,29,34],"li",{},"A NoLag account (",[30,31,33],"a",{"href":32},"/pricing","free tier available",")",[26,36,37,38,44,45,49],{},"A project in the ",[30,39,43],{"href":40,"rel":41},"https://portal.nolag.app",[42],"nofollow","portal"," and a project API key (",[46,47,48],"code",{},"nlg_live_...",") for the one-time setup step",[26,51,52],{},"Node.js 18+ (JavaScript) or Python 3.10+ (Python)",[18,54,56],{"id":55},"step-1-install","Step 1: Install",[58,59,60,88],"code-tabs",{},[61,62,68],"pre",{"className":63,"code":64,"filename":65,"language":66,"meta":67,"style":67},"language-bash shiki shiki-themes github-light github-dark","npm install @nolag/agents @nolag/js-sdk\n","npm","bash","",[46,69,70],{"__ignoreMap":67},[71,72,75,78,82,85],"span",{"class":73,"line":74},"line",1,[71,76,65],{"class":77},"sScJk",[71,79,81],{"class":80},"sZZnC"," install",[71,83,84],{"class":80}," @nolag/agents",[71,86,87],{"class":80}," @nolag/js-sdk\n",[61,89,92],{"className":63,"code":90,"filename":91,"language":66,"meta":67,"style":67},"pip install nolag-agents\n","pip",[46,93,94],{"__ignoreMap":67},[71,95,96,98,100],{"class":73,"line":74},[71,97,91],{"class":77},[71,99,81],{"class":80},[71,101,102],{"class":80}," nolag-agents\n",[14,104,105,106,110,111,114,115,110,118,121],{},"The agents SDK is available for ",[107,108,109],"strong",{},"JavaScript/TypeScript"," (",[46,112,113],{},"@nolag/agents",") and ",[107,116,117],{},"Python",[46,119,120],{},"nolag-agents","). Both provide the same six coordination patterns.",[18,123,125],{"id":124},"step-2-create-an-agents-app","Step 2: Create an Agents App",[127,128,130],"callout",{"type":129},"info",[14,131,132,135,136,139,140,143,144,147,148,151],{},[107,133,134],{},"Before you start."," Create an app from the ",[46,137,138],{},"nolag-agents-sdk"," blueprint. That seeds the room this SDK expects (",[46,141,142],{},"default-workflow",", with the seven coordination topics) and the ",[46,145,146],{},"agent-activity"," lobby, and returns an app slug with a random suffix. That slug is the ",[46,149,150],{},"appName"," you pass to the wrapper. You can also do this in the portal: Apps, New App, pick the blueprint.",[58,153,154],{},[61,155,160],{"className":156,"code":157,"filename":158,"language":159,"meta":67,"style":67},"language-typescript shiki shiki-themes github-light github-dark","import { NoLagApi } from \"@nolag/js-sdk\";\n\nconst api = new NoLagApi(process.env.NOLAG_API_KEY); // nlg_live_...\nconst app = await api.apps.create({ name: \"My Agents\", blueprintId: \"nolag-agents-sdk\" });\nconsole.log(app.slug); // e.g. \"my-agents-a3f9\": this is your appName\n\nconst orchestrator = await api.actors.create({ name: \"orchestrator\", actorType: \"orchestrator\" });\nconst worker = await api.actors.create({ name: \"worker-1\", actorType: \"agent\" });\nconsole.log(orchestrator.accessToken, worker.accessToken); // shown once; keep them\n","Setup (server side, once)","typescript",[46,161,162,181,188,220,254,269,274,303,331],{"__ignoreMap":67},[71,163,164,168,172,175,178],{"class":73,"line":74},[71,165,167],{"class":166},"szBVR","import",[71,169,171],{"class":170},"sVt8B"," { NoLagApi } ",[71,173,174],{"class":166},"from",[71,176,177],{"class":80}," \"@nolag/js-sdk\"",[71,179,180],{"class":170},";\n",[71,182,184],{"class":73,"line":183},2,[71,185,187],{"emptyLinePlaceholder":186},true,"\n",[71,189,191,194,198,201,204,207,210,213,216],{"class":73,"line":190},3,[71,192,193],{"class":166},"const",[71,195,197],{"class":196},"sj4cs"," api",[71,199,200],{"class":166}," =",[71,202,203],{"class":166}," new",[71,205,206],{"class":77}," NoLagApi",[71,208,209],{"class":170},"(process.env.",[71,211,212],{"class":196},"NOLAG_API_KEY",[71,214,215],{"class":170},"); ",[71,217,219],{"class":218},"sJ8bj","// nlg_live_...\n",[71,221,223,225,228,230,233,236,239,242,245,248,251],{"class":73,"line":222},4,[71,224,193],{"class":166},[71,226,227],{"class":196}," app",[71,229,200],{"class":166},[71,231,232],{"class":166}," await",[71,234,235],{"class":170}," api.apps.",[71,237,238],{"class":77},"create",[71,240,241],{"class":170},"({ name: ",[71,243,244],{"class":80},"\"My Agents\"",[71,246,247],{"class":170},", blueprintId: ",[71,249,250],{"class":80},"\"nolag-agents-sdk\"",[71,252,253],{"class":170}," });\n",[71,255,257,260,263,266],{"class":73,"line":256},5,[71,258,259],{"class":170},"console.",[71,261,262],{"class":77},"log",[71,264,265],{"class":170},"(app.slug); ",[71,267,268],{"class":218},"// e.g. \"my-agents-a3f9\": this is your appName\n",[71,270,272],{"class":73,"line":271},6,[71,273,187],{"emptyLinePlaceholder":186},[71,275,277,279,282,284,286,289,291,293,296,299,301],{"class":73,"line":276},7,[71,278,193],{"class":166},[71,280,281],{"class":196}," orchestrator",[71,283,200],{"class":166},[71,285,232],{"class":166},[71,287,288],{"class":170}," api.actors.",[71,290,238],{"class":77},[71,292,241],{"class":170},[71,294,295],{"class":80},"\"orchestrator\"",[71,297,298],{"class":170},", actorType: ",[71,300,295],{"class":80},[71,302,253],{"class":170},[71,304,306,308,311,313,315,317,319,321,324,326,329],{"class":73,"line":305},8,[71,307,193],{"class":166},[71,309,310],{"class":196}," worker",[71,312,200],{"class":166},[71,314,232],{"class":166},[71,316,288],{"class":170},[71,318,238],{"class":77},[71,320,241],{"class":170},[71,322,323],{"class":80},"\"worker-1\"",[71,325,298],{"class":170},[71,327,328],{"class":80},"\"agent\"",[71,330,253],{"class":170},[71,332,334,336,338,341],{"class":73,"line":333},9,[71,335,259],{"class":170},[71,337,262],{"class":77},[71,339,340],{"class":170},"(orchestrator.accessToken, worker.accessToken); ",[71,342,343],{"class":218},"// shown once; keep them\n",[14,345,346,347,349,350,353],{},"Rooms never exist implicitly. ",[46,348,142],{}," is seeded by the blueprint; any other room you want agents to join has to be created first, in the portal or with ",[46,351,352],{},"api.rooms.create(app.appId, { name: \"...\" })",".",[18,355,357],{"id":356},"step-3-create-actor-tokens","Step 3: Create Actor Tokens",[14,359,360,361,364],{},"Each agent in your system connects as an ",[107,362,363],{},"actor",". The setup block above creates two; you can also create them in the portal under Actors:",[366,367,368,377],"ol",{},[26,369,370,110,373,376],{},[107,371,372],{},"Orchestrator",[46,374,375],{},"actorType: \"orchestrator\"",") dispatches tasks and coordinates the workflow",[26,378,379,110,382,385],{},[107,380,381],{},"Worker",[46,383,384],{},"actorType: \"agent\"",") receives and completes tasks",[14,387,388,389,392,393,396,397,400],{},"Only the ",[46,390,391],{},"agent"," and ",[46,394,395],{},"orchestrator"," actor types hold a persistent session on the broker. Copy the access token for each actor (",[46,398,399],{},"at_live_...","); it is shown once.",[18,402,404],{"id":403},"step-4-connect-the-orchestrator","Step 4: Connect the Orchestrator",[14,406,407],{},"The orchestrator dispatches tasks and waits for results. Your app owns the core client; the wrapper attaches to it.",[58,409,410,723],{},[61,411,414],{"className":156,"code":412,"filename":413,"language":159,"meta":67,"style":67},"import { NoLag } from \"@nolag/js-sdk\";\nimport { NoLagAgents, Handoff } from \"@nolag/agents\";\n\nconst client = NoLag(ORCHESTRATOR_TOKEN);\nconst agents = new NoLagAgents({\n  client,\n  appName: APP_SLUG, // the slug returned when you created the app\n  agentId: \"orchestrator\",\n  presence: { name: \"orchestrator\", role: \"orchestrator\" },\n});\nawait client.connect();\nawait agents.ready();\n\nconst room = agents.room(\"default-workflow\");\nconst handoff = new Handoff(room);\n\n// Dispatch a task to any connected worker advertising the \"summarize\" capability.\n// dispatch() throws if no such worker is connected, and rejects on timeout.\nconst result = await handoff.dispatch(\n  \"summarize\",\n  { url: \"https://example.com/article\" },\n  { waitForResult: true, timeout: 30000 },\n);\n\nif (result) {\n  console.log(\"Result:\", result.status, result.payload);\n}\n","TypeScript",[46,415,416,429,443,447,468,485,490,504,514,529,535,550,563,568,590,608,613,619,625,646,654,665,682,687,692,701,717],{"__ignoreMap":67},[71,417,418,420,423,425,427],{"class":73,"line":74},[71,419,167],{"class":166},[71,421,422],{"class":170}," { NoLag } ",[71,424,174],{"class":166},[71,426,177],{"class":80},[71,428,180],{"class":170},[71,430,431,433,436,438,441],{"class":73,"line":183},[71,432,167],{"class":166},[71,434,435],{"class":170}," { NoLagAgents, Handoff } ",[71,437,174],{"class":166},[71,439,440],{"class":80}," \"@nolag/agents\"",[71,442,180],{"class":170},[71,444,445],{"class":73,"line":190},[71,446,187],{"emptyLinePlaceholder":186},[71,448,449,451,454,456,459,462,465],{"class":73,"line":222},[71,450,193],{"class":166},[71,452,453],{"class":196}," client",[71,455,200],{"class":166},[71,457,458],{"class":77}," NoLag",[71,460,461],{"class":170},"(",[71,463,464],{"class":196},"ORCHESTRATOR_TOKEN",[71,466,467],{"class":170},");\n",[71,469,470,472,475,477,479,482],{"class":73,"line":256},[71,471,193],{"class":166},[71,473,474],{"class":196}," agents",[71,476,200],{"class":166},[71,478,203],{"class":166},[71,480,481],{"class":77}," NoLagAgents",[71,483,484],{"class":170},"({\n",[71,486,487],{"class":73,"line":271},[71,488,489],{"class":170},"  client,\n",[71,491,492,495,498,501],{"class":73,"line":276},[71,493,494],{"class":170},"  appName: ",[71,496,497],{"class":196},"APP_SLUG",[71,499,500],{"class":170},", ",[71,502,503],{"class":218},"// the slug returned when you created the app\n",[71,505,506,509,511],{"class":73,"line":305},[71,507,508],{"class":170},"  agentId: ",[71,510,295],{"class":80},[71,512,513],{"class":170},",\n",[71,515,516,519,521,524,526],{"class":73,"line":333},[71,517,518],{"class":170},"  presence: { name: ",[71,520,295],{"class":80},[71,522,523],{"class":170},", role: ",[71,525,295],{"class":80},[71,527,528],{"class":170}," },\n",[71,530,532],{"class":73,"line":531},10,[71,533,534],{"class":170},"});\n",[71,536,538,541,544,547],{"class":73,"line":537},11,[71,539,540],{"class":166},"await",[71,542,543],{"class":170}," client.",[71,545,546],{"class":77},"connect",[71,548,549],{"class":170},"();\n",[71,551,553,555,558,561],{"class":73,"line":552},12,[71,554,540],{"class":166},[71,556,557],{"class":170}," agents.",[71,559,560],{"class":77},"ready",[71,562,549],{"class":170},[71,564,566],{"class":73,"line":565},13,[71,567,187],{"emptyLinePlaceholder":186},[71,569,571,573,576,578,580,583,585,588],{"class":73,"line":570},14,[71,572,193],{"class":166},[71,574,575],{"class":196}," room",[71,577,200],{"class":166},[71,579,557],{"class":170},[71,581,582],{"class":77},"room",[71,584,461],{"class":170},[71,586,587],{"class":80},"\"default-workflow\"",[71,589,467],{"class":170},[71,591,593,595,598,600,602,605],{"class":73,"line":592},15,[71,594,193],{"class":166},[71,596,597],{"class":196}," handoff",[71,599,200],{"class":166},[71,601,203],{"class":166},[71,603,604],{"class":77}," Handoff",[71,606,607],{"class":170},"(room);\n",[71,609,611],{"class":73,"line":610},16,[71,612,187],{"emptyLinePlaceholder":186},[71,614,616],{"class":73,"line":615},17,[71,617,618],{"class":218},"// Dispatch a task to any connected worker advertising the \"summarize\" capability.\n",[71,620,622],{"class":73,"line":621},18,[71,623,624],{"class":218},"// dispatch() throws if no such worker is connected, and rejects on timeout.\n",[71,626,628,630,633,635,637,640,643],{"class":73,"line":627},19,[71,629,193],{"class":166},[71,631,632],{"class":196}," result",[71,634,200],{"class":166},[71,636,232],{"class":166},[71,638,639],{"class":170}," handoff.",[71,641,642],{"class":77},"dispatch",[71,644,645],{"class":170},"(\n",[71,647,649,652],{"class":73,"line":648},20,[71,650,651],{"class":80},"  \"summarize\"",[71,653,513],{"class":170},[71,655,657,660,663],{"class":73,"line":656},21,[71,658,659],{"class":170},"  { url: ",[71,661,662],{"class":80},"\"https://example.com/article\"",[71,664,528],{"class":170},[71,666,668,671,674,677,680],{"class":73,"line":667},22,[71,669,670],{"class":170},"  { waitForResult: ",[71,672,673],{"class":196},"true",[71,675,676],{"class":170},", timeout: ",[71,678,679],{"class":196},"30000",[71,681,528],{"class":170},[71,683,685],{"class":73,"line":684},23,[71,686,467],{"class":170},[71,688,690],{"class":73,"line":689},24,[71,691,187],{"emptyLinePlaceholder":186},[71,693,695,698],{"class":73,"line":694},25,[71,696,697],{"class":166},"if",[71,699,700],{"class":170}," (result) {\n",[71,702,704,707,709,711,714],{"class":73,"line":703},26,[71,705,706],{"class":170},"  console.",[71,708,262],{"class":77},[71,710,461],{"class":170},[71,712,713],{"class":80},"\"Result:\"",[71,715,716],{"class":170},", result.status, result.payload);\n",[71,718,720],{"class":73,"line":719},27,[71,721,722],{"class":170},"}\n",[61,724,728],{"className":725,"code":726,"filename":117,"language":727,"meta":67,"style":67},"language-python shiki shiki-themes github-light github-dark","from nolag_agents import NoLagAgents, NoLagAgentsOptions, AgentPresenceData\nfrom nolag_agents.patterns import Handoff\n\nagents = NoLagAgents(ORCHESTRATOR_TOKEN, NoLagAgentsOptions(\n    app_name=APP_SLUG,  # the slug returned when you created the app\n    agent_id=\"orchestrator\",\n    presence=AgentPresenceData(name=\"orchestrator\", role=\"orchestrator\"),\n))\nawait agents.connect()\n\nroom = await agents.room(\"default-workflow\")\nhandoff = Handoff(room)\n\n# Dispatch a task to any connected worker advertising the \"summarize\" capability.\n# dispatch() raises if no such worker is connected, and on timeout.\nresult = await handoff.dispatch(\"summarize\",\n    {\"url\": \"https://example.com/article\"},\n    wait_for_result=True, timeout=30000,\n)\n\nprint(\"Result:\", result.status, result.payload)\n","python",[46,729,730,735,740,744,749,754,759,764,769,774,778,783,788,792,797,802,807,812,817,822,826],{"__ignoreMap":67},[71,731,732],{"class":73,"line":74},[71,733,734],{},"from nolag_agents import NoLagAgents, NoLagAgentsOptions, AgentPresenceData\n",[71,736,737],{"class":73,"line":183},[71,738,739],{},"from nolag_agents.patterns import Handoff\n",[71,741,742],{"class":73,"line":190},[71,743,187],{"emptyLinePlaceholder":186},[71,745,746],{"class":73,"line":222},[71,747,748],{},"agents = NoLagAgents(ORCHESTRATOR_TOKEN, NoLagAgentsOptions(\n",[71,750,751],{"class":73,"line":256},[71,752,753],{},"    app_name=APP_SLUG,  # the slug returned when you created the app\n",[71,755,756],{"class":73,"line":271},[71,757,758],{},"    agent_id=\"orchestrator\",\n",[71,760,761],{"class":73,"line":276},[71,762,763],{},"    presence=AgentPresenceData(name=\"orchestrator\", role=\"orchestrator\"),\n",[71,765,766],{"class":73,"line":305},[71,767,768],{},"))\n",[71,770,771],{"class":73,"line":333},[71,772,773],{},"await agents.connect()\n",[71,775,776],{"class":73,"line":531},[71,777,187],{"emptyLinePlaceholder":186},[71,779,780],{"class":73,"line":537},[71,781,782],{},"room = await agents.room(\"default-workflow\")\n",[71,784,785],{"class":73,"line":552},[71,786,787],{},"handoff = Handoff(room)\n",[71,789,790],{"class":73,"line":565},[71,791,187],{"emptyLinePlaceholder":186},[71,793,794],{"class":73,"line":570},[71,795,796],{},"# Dispatch a task to any connected worker advertising the \"summarize\" capability.\n",[71,798,799],{"class":73,"line":592},[71,800,801],{},"# dispatch() raises if no such worker is connected, and on timeout.\n",[71,803,804],{"class":73,"line":610},[71,805,806],{},"result = await handoff.dispatch(\"summarize\",\n",[71,808,809],{"class":73,"line":615},[71,810,811],{},"    {\"url\": \"https://example.com/article\"},\n",[71,813,814],{"class":73,"line":621},[71,815,816],{},"    wait_for_result=True, timeout=30000,\n",[71,818,819],{"class":73,"line":627},[71,820,821],{},")\n",[71,823,824],{"class":73,"line":648},[71,825,187],{"emptyLinePlaceholder":186},[71,827,828],{"class":73,"line":656},[71,829,830],{},"print(\"Result:\", result.status, result.payload)\n",[14,832,833,836,837,110,840,843],{},[46,834,835],{},"dispatch()"," looks at room presence first: if no connected agent lists the capability, it throws instead of publishing. Start the worker before the orchestrator, or pass ",[46,838,839],{},"allowNoWorkers: true",[46,841,842],{},"allow_no_workers=True",") to publish anyway.",[18,845,847],{"id":846},"step-5-connect-a-worker","Step 5: Connect a Worker",[14,849,850,851,392,854,857],{},"Workers advertise their capabilities through presence and handle incoming tasks. Turn on load balancing on the client when you run more than one worker with the same capabilities: the ",[46,852,853],{},"tasks",[46,855,856],{},"tools"," topics then deliver each message to one member of the group instead of every member.",[58,859,860,1148],{},[61,861,863],{"className":156,"code":862,"filename":413,"language":159,"meta":67,"style":67},"import { NoLag } from \"@nolag/js-sdk\";\nimport { NoLagAgents, Handoff } from \"@nolag/agents\";\n\n// loadBalance: each task goes to one worker in the \"summarizers\" group\nconst client = NoLag(WORKER_TOKEN, { loadBalance: true, loadBalanceGroup: \"summarizers\" });\nconst agents = new NoLagAgents({\n  client,\n  appName: APP_SLUG,\n  agentId: \"worker-1\",\n  presence: { name: \"worker-1\", role: \"agent\", capabilities: [\"summarize\"] },\n});\nawait client.connect();\nawait agents.ready();\n\nconst room = agents.room(\"default-workflow\");\nconst handoff = new Handoff(room);\n\n// Handle incoming tasks whose capability matches\nhandoff.onTask([\"summarize\"], async (task, respond) => {\n  console.log(\"Received task:\", task.taskId, task.capability);\n\n  const summary = await summarizeUrl(task.payload.url as string);\n  respond(\"success\", { summary });\n});\n",[46,864,865,877,889,893,898,926,940,944,952,960,979,983,993,1003,1007,1025,1039,1043,1048,1087,1101,1105,1131,1144],{"__ignoreMap":67},[71,866,867,869,871,873,875],{"class":73,"line":74},[71,868,167],{"class":166},[71,870,422],{"class":170},[71,872,174],{"class":166},[71,874,177],{"class":80},[71,876,180],{"class":170},[71,878,879,881,883,885,887],{"class":73,"line":183},[71,880,167],{"class":166},[71,882,435],{"class":170},[71,884,174],{"class":166},[71,886,440],{"class":80},[71,888,180],{"class":170},[71,890,891],{"class":73,"line":190},[71,892,187],{"emptyLinePlaceholder":186},[71,894,895],{"class":73,"line":222},[71,896,897],{"class":218},"// loadBalance: each task goes to one worker in the \"summarizers\" group\n",[71,899,900,902,904,906,908,910,913,916,918,921,924],{"class":73,"line":256},[71,901,193],{"class":166},[71,903,453],{"class":196},[71,905,200],{"class":166},[71,907,458],{"class":77},[71,909,461],{"class":170},[71,911,912],{"class":196},"WORKER_TOKEN",[71,914,915],{"class":170},", { loadBalance: ",[71,917,673],{"class":196},[71,919,920],{"class":170},", loadBalanceGroup: ",[71,922,923],{"class":80},"\"summarizers\"",[71,925,253],{"class":170},[71,927,928,930,932,934,936,938],{"class":73,"line":271},[71,929,193],{"class":166},[71,931,474],{"class":196},[71,933,200],{"class":166},[71,935,203],{"class":166},[71,937,481],{"class":77},[71,939,484],{"class":170},[71,941,942],{"class":73,"line":276},[71,943,489],{"class":170},[71,945,946,948,950],{"class":73,"line":305},[71,947,494],{"class":170},[71,949,497],{"class":196},[71,951,513],{"class":170},[71,953,954,956,958],{"class":73,"line":333},[71,955,508],{"class":170},[71,957,323],{"class":80},[71,959,513],{"class":170},[71,961,962,964,966,968,970,973,976],{"class":73,"line":531},[71,963,518],{"class":170},[71,965,323],{"class":80},[71,967,523],{"class":170},[71,969,328],{"class":80},[71,971,972],{"class":170},", capabilities: [",[71,974,975],{"class":80},"\"summarize\"",[71,977,978],{"class":170},"] },\n",[71,980,981],{"class":73,"line":537},[71,982,534],{"class":170},[71,984,985,987,989,991],{"class":73,"line":552},[71,986,540],{"class":166},[71,988,543],{"class":170},[71,990,546],{"class":77},[71,992,549],{"class":170},[71,994,995,997,999,1001],{"class":73,"line":565},[71,996,540],{"class":166},[71,998,557],{"class":170},[71,1000,560],{"class":77},[71,1002,549],{"class":170},[71,1004,1005],{"class":73,"line":570},[71,1006,187],{"emptyLinePlaceholder":186},[71,1008,1009,1011,1013,1015,1017,1019,1021,1023],{"class":73,"line":592},[71,1010,193],{"class":166},[71,1012,575],{"class":196},[71,1014,200],{"class":166},[71,1016,557],{"class":170},[71,1018,582],{"class":77},[71,1020,461],{"class":170},[71,1022,587],{"class":80},[71,1024,467],{"class":170},[71,1026,1027,1029,1031,1033,1035,1037],{"class":73,"line":610},[71,1028,193],{"class":166},[71,1030,597],{"class":196},[71,1032,200],{"class":166},[71,1034,203],{"class":166},[71,1036,604],{"class":77},[71,1038,607],{"class":170},[71,1040,1041],{"class":73,"line":615},[71,1042,187],{"emptyLinePlaceholder":186},[71,1044,1045],{"class":73,"line":621},[71,1046,1047],{"class":218},"// Handle incoming tasks whose capability matches\n",[71,1049,1050,1053,1056,1059,1061,1064,1067,1069,1073,1075,1078,1081,1084],{"class":73,"line":627},[71,1051,1052],{"class":170},"handoff.",[71,1054,1055],{"class":77},"onTask",[71,1057,1058],{"class":170},"([",[71,1060,975],{"class":80},[71,1062,1063],{"class":170},"], ",[71,1065,1066],{"class":166},"async",[71,1068,110],{"class":170},[71,1070,1072],{"class":1071},"s4XuR","task",[71,1074,500],{"class":170},[71,1076,1077],{"class":1071},"respond",[71,1079,1080],{"class":170},") ",[71,1082,1083],{"class":166},"=>",[71,1085,1086],{"class":170}," {\n",[71,1088,1089,1091,1093,1095,1098],{"class":73,"line":648},[71,1090,706],{"class":170},[71,1092,262],{"class":77},[71,1094,461],{"class":170},[71,1096,1097],{"class":80},"\"Received task:\"",[71,1099,1100],{"class":170},", task.taskId, task.capability);\n",[71,1102,1103],{"class":73,"line":656},[71,1104,187],{"emptyLinePlaceholder":186},[71,1106,1107,1110,1113,1115,1117,1120,1123,1126,1129],{"class":73,"line":667},[71,1108,1109],{"class":166},"  const",[71,1111,1112],{"class":196}," summary",[71,1114,200],{"class":166},[71,1116,232],{"class":166},[71,1118,1119],{"class":77}," summarizeUrl",[71,1121,1122],{"class":170},"(task.payload.url ",[71,1124,1125],{"class":166},"as",[71,1127,1128],{"class":196}," string",[71,1130,467],{"class":170},[71,1132,1133,1136,1138,1141],{"class":73,"line":684},[71,1134,1135],{"class":77},"  respond",[71,1137,461],{"class":170},[71,1139,1140],{"class":80},"\"success\"",[71,1142,1143],{"class":170},", { summary });\n",[71,1145,1146],{"class":73,"line":689},[71,1147,534],{"class":170},[61,1149,1151],{"className":725,"code":1150,"filename":117,"language":727,"meta":67,"style":67},"import asyncio\n\nfrom nolag_agents import NoLagAgents, NoLagAgentsOptions, AgentPresenceData\nfrom nolag_agents.patterns import Handoff\n\nagents = NoLagAgents(WORKER_TOKEN, NoLagAgentsOptions(\n    app_name=APP_SLUG,\n    agent_id=\"worker-1\",\n    load_balance=True,  # each task goes to one worker in the group\n    load_balance_group=\"summarizers\",\n    presence=AgentPresenceData(name=\"worker-1\", role=\"agent\", capabilities=[\"summarize\"]),\n))\nawait agents.connect()\n\nroom = await agents.room(\"default-workflow\")\nhandoff = Handoff(room)\n\n# Handle incoming tasks whose capability matches\ndef handle_task(task, respond):\n    print(\"Received task:\", task.task_id, task.capability)\n    summary = summarize_url(task.payload[\"url\"])\n    asyncio.ensure_future(respond(\"success\", {\"summary\": summary}))\n\nhandoff.on_task([\"summarize\"], handle_task)\n",[46,1152,1153,1158,1162,1166,1170,1174,1179,1184,1189,1194,1199,1204,1208,1212,1216,1220,1224,1228,1233,1238,1243,1248,1253,1257],{"__ignoreMap":67},[71,1154,1155],{"class":73,"line":74},[71,1156,1157],{},"import asyncio\n",[71,1159,1160],{"class":73,"line":183},[71,1161,187],{"emptyLinePlaceholder":186},[71,1163,1164],{"class":73,"line":190},[71,1165,734],{},[71,1167,1168],{"class":73,"line":222},[71,1169,739],{},[71,1171,1172],{"class":73,"line":256},[71,1173,187],{"emptyLinePlaceholder":186},[71,1175,1176],{"class":73,"line":271},[71,1177,1178],{},"agents = NoLagAgents(WORKER_TOKEN, NoLagAgentsOptions(\n",[71,1180,1181],{"class":73,"line":276},[71,1182,1183],{},"    app_name=APP_SLUG,\n",[71,1185,1186],{"class":73,"line":305},[71,1187,1188],{},"    agent_id=\"worker-1\",\n",[71,1190,1191],{"class":73,"line":333},[71,1192,1193],{},"    load_balance=True,  # each task goes to one worker in the group\n",[71,1195,1196],{"class":73,"line":531},[71,1197,1198],{},"    load_balance_group=\"summarizers\",\n",[71,1200,1201],{"class":73,"line":537},[71,1202,1203],{},"    presence=AgentPresenceData(name=\"worker-1\", role=\"agent\", capabilities=[\"summarize\"]),\n",[71,1205,1206],{"class":73,"line":552},[71,1207,768],{},[71,1209,1210],{"class":73,"line":565},[71,1211,773],{},[71,1213,1214],{"class":73,"line":570},[71,1215,187],{"emptyLinePlaceholder":186},[71,1217,1218],{"class":73,"line":592},[71,1219,782],{},[71,1221,1222],{"class":73,"line":610},[71,1223,787],{},[71,1225,1226],{"class":73,"line":615},[71,1227,187],{"emptyLinePlaceholder":186},[71,1229,1230],{"class":73,"line":621},[71,1231,1232],{},"# Handle incoming tasks whose capability matches\n",[71,1234,1235],{"class":73,"line":627},[71,1236,1237],{},"def handle_task(task, respond):\n",[71,1239,1240],{"class":73,"line":648},[71,1241,1242],{},"    print(\"Received task:\", task.task_id, task.capability)\n",[71,1244,1245],{"class":73,"line":656},[71,1246,1247],{},"    summary = summarize_url(task.payload[\"url\"])\n",[71,1249,1250],{"class":73,"line":667},[71,1251,1252],{},"    asyncio.ensure_future(respond(\"success\", {\"summary\": summary}))\n",[71,1254,1255],{"class":73,"line":684},[71,1256,187],{"emptyLinePlaceholder":186},[71,1258,1259],{"class":73,"line":689},[71,1260,1261],{},"handoff.on_task([\"summarize\"], handle_task)\n",[14,1263,1264,1265,1267,1268,1270,1271,1274,1275,353],{},"Every worker in the room receives every task on ",[46,1266,853],{},"; ",[46,1269,1055],{}," drops the ones whose ",[46,1272,1273],{},"capability"," it does not handle. To have the broker do that filtering instead, see ",[30,1276,1278],{"href":1277},"/docs/agents/tags#server-side-routing","server-side routing",[18,1280,1282],{"id":1281},"step-6-monitor-with-observe","Step 6: Monitor with Observe",[14,1284,1285],{},"Observe is an event stream that carries only what agents emit. Nothing is emitted automatically, so decide what you want to see and emit it from the worker. A monitor then subscribes to the stream:",[58,1287,1288,1691],{},[61,1289,1291],{"className":156,"code":1290,"filename":413,"language":159,"meta":67,"style":67},"import { NoLag } from \"@nolag/js-sdk\";\nimport { NoLagAgents, Handoff, Observe } from \"@nolag/agents\";\n\n// In the worker: emit events at the points you want to see\nconst workerRoom = agents.room(\"default-workflow\");\nconst workerObserve = new Observe(workerRoom, agents.agentId);\nnew Handoff(workerRoom).onTask([\"summarize\"], async (task, respond) => {\n  workerObserve.emit(\"task:started\", { taskId: task.taskId, capability: task.capability });\n  const summary = await summarizeUrl(task.payload.url as string);\n  respond(\"success\", { summary });\n  workerObserve.emit(\"task:completed\", { taskId: task.taskId });\n});\n\n// In a monitor process: watch the stream\nconst client = NoLag(MONITOR_TOKEN);\nconst monitor = new NoLagAgents({\n  client,\n  appName: APP_SLUG,\n  agentId: \"monitor\",\n  presence: { name: \"monitor\", role: \"observer\" },\n});\nawait client.connect();\nawait monitor.ready();\n\nconst observe = new Observe(monitor.room(\"default-workflow\"), monitor.agentId);\n\n// Watch all events in the workflow\nobserve.on((event) => {\n  console.log(`[${event.category}] ${event.severity} from ${event.emittedBy}: ${JSON.stringify(event.payload)}`);\n});\n",[46,1292,1293,1305,1318,1322,1327,1346,1363,1397,1413,1433,1443,1457,1461,1465,1470,1487,1502,1506,1514,1523,1536,1540,1550,1561,1565,1590,1594,1599,1620,1686],{"__ignoreMap":67},[71,1294,1295,1297,1299,1301,1303],{"class":73,"line":74},[71,1296,167],{"class":166},[71,1298,422],{"class":170},[71,1300,174],{"class":166},[71,1302,177],{"class":80},[71,1304,180],{"class":170},[71,1306,1307,1309,1312,1314,1316],{"class":73,"line":183},[71,1308,167],{"class":166},[71,1310,1311],{"class":170}," { NoLagAgents, Handoff, Observe } ",[71,1313,174],{"class":166},[71,1315,440],{"class":80},[71,1317,180],{"class":170},[71,1319,1320],{"class":73,"line":190},[71,1321,187],{"emptyLinePlaceholder":186},[71,1323,1324],{"class":73,"line":222},[71,1325,1326],{"class":218},"// In the worker: emit events at the points you want to see\n",[71,1328,1329,1331,1334,1336,1338,1340,1342,1344],{"class":73,"line":256},[71,1330,193],{"class":166},[71,1332,1333],{"class":196}," workerRoom",[71,1335,200],{"class":166},[71,1337,557],{"class":170},[71,1339,582],{"class":77},[71,1341,461],{"class":170},[71,1343,587],{"class":80},[71,1345,467],{"class":170},[71,1347,1348,1350,1353,1355,1357,1360],{"class":73,"line":271},[71,1349,193],{"class":166},[71,1351,1352],{"class":196}," workerObserve",[71,1354,200],{"class":166},[71,1356,203],{"class":166},[71,1358,1359],{"class":77}," Observe",[71,1361,1362],{"class":170},"(workerRoom, agents.agentId);\n",[71,1364,1365,1368,1370,1373,1375,1377,1379,1381,1383,1385,1387,1389,1391,1393,1395],{"class":73,"line":276},[71,1366,1367],{"class":166},"new",[71,1369,604],{"class":77},[71,1371,1372],{"class":170},"(workerRoom).",[71,1374,1055],{"class":77},[71,1376,1058],{"class":170},[71,1378,975],{"class":80},[71,1380,1063],{"class":170},[71,1382,1066],{"class":166},[71,1384,110],{"class":170},[71,1386,1072],{"class":1071},[71,1388,500],{"class":170},[71,1390,1077],{"class":1071},[71,1392,1080],{"class":170},[71,1394,1083],{"class":166},[71,1396,1086],{"class":170},[71,1398,1399,1402,1405,1407,1410],{"class":73,"line":305},[71,1400,1401],{"class":170},"  workerObserve.",[71,1403,1404],{"class":77},"emit",[71,1406,461],{"class":170},[71,1408,1409],{"class":80},"\"task:started\"",[71,1411,1412],{"class":170},", { taskId: task.taskId, capability: task.capability });\n",[71,1414,1415,1417,1419,1421,1423,1425,1427,1429,1431],{"class":73,"line":333},[71,1416,1109],{"class":166},[71,1418,1112],{"class":196},[71,1420,200],{"class":166},[71,1422,232],{"class":166},[71,1424,1119],{"class":77},[71,1426,1122],{"class":170},[71,1428,1125],{"class":166},[71,1430,1128],{"class":196},[71,1432,467],{"class":170},[71,1434,1435,1437,1439,1441],{"class":73,"line":531},[71,1436,1135],{"class":77},[71,1438,461],{"class":170},[71,1440,1140],{"class":80},[71,1442,1143],{"class":170},[71,1444,1445,1447,1449,1451,1454],{"class":73,"line":537},[71,1446,1401],{"class":170},[71,1448,1404],{"class":77},[71,1450,461],{"class":170},[71,1452,1453],{"class":80},"\"task:completed\"",[71,1455,1456],{"class":170},", { taskId: task.taskId });\n",[71,1458,1459],{"class":73,"line":552},[71,1460,534],{"class":170},[71,1462,1463],{"class":73,"line":565},[71,1464,187],{"emptyLinePlaceholder":186},[71,1466,1467],{"class":73,"line":570},[71,1468,1469],{"class":218},"// In a monitor process: watch the stream\n",[71,1471,1472,1474,1476,1478,1480,1482,1485],{"class":73,"line":592},[71,1473,193],{"class":166},[71,1475,453],{"class":196},[71,1477,200],{"class":166},[71,1479,458],{"class":77},[71,1481,461],{"class":170},[71,1483,1484],{"class":196},"MONITOR_TOKEN",[71,1486,467],{"class":170},[71,1488,1489,1491,1494,1496,1498,1500],{"class":73,"line":610},[71,1490,193],{"class":166},[71,1492,1493],{"class":196}," monitor",[71,1495,200],{"class":166},[71,1497,203],{"class":166},[71,1499,481],{"class":77},[71,1501,484],{"class":170},[71,1503,1504],{"class":73,"line":615},[71,1505,489],{"class":170},[71,1507,1508,1510,1512],{"class":73,"line":621},[71,1509,494],{"class":170},[71,1511,497],{"class":196},[71,1513,513],{"class":170},[71,1515,1516,1518,1521],{"class":73,"line":627},[71,1517,508],{"class":170},[71,1519,1520],{"class":80},"\"monitor\"",[71,1522,513],{"class":170},[71,1524,1525,1527,1529,1531,1534],{"class":73,"line":648},[71,1526,518],{"class":170},[71,1528,1520],{"class":80},[71,1530,523],{"class":170},[71,1532,1533],{"class":80},"\"observer\"",[71,1535,528],{"class":170},[71,1537,1538],{"class":73,"line":656},[71,1539,534],{"class":170},[71,1541,1542,1544,1546,1548],{"class":73,"line":667},[71,1543,540],{"class":166},[71,1545,543],{"class":170},[71,1547,546],{"class":77},[71,1549,549],{"class":170},[71,1551,1552,1554,1557,1559],{"class":73,"line":684},[71,1553,540],{"class":166},[71,1555,1556],{"class":170}," monitor.",[71,1558,560],{"class":77},[71,1560,549],{"class":170},[71,1562,1563],{"class":73,"line":689},[71,1564,187],{"emptyLinePlaceholder":186},[71,1566,1567,1569,1572,1574,1576,1578,1581,1583,1585,1587],{"class":73,"line":694},[71,1568,193],{"class":166},[71,1570,1571],{"class":196}," observe",[71,1573,200],{"class":166},[71,1575,203],{"class":166},[71,1577,1359],{"class":77},[71,1579,1580],{"class":170},"(monitor.",[71,1582,582],{"class":77},[71,1584,461],{"class":170},[71,1586,587],{"class":80},[71,1588,1589],{"class":170},"), monitor.agentId);\n",[71,1591,1592],{"class":73,"line":703},[71,1593,187],{"emptyLinePlaceholder":186},[71,1595,1596],{"class":73,"line":719},[71,1597,1598],{"class":218},"// Watch all events in the workflow\n",[71,1600,1602,1605,1608,1611,1614,1616,1618],{"class":73,"line":1601},28,[71,1603,1604],{"class":170},"observe.",[71,1606,1607],{"class":77},"on",[71,1609,1610],{"class":170},"((",[71,1612,1613],{"class":1071},"event",[71,1615,1080],{"class":170},[71,1617,1083],{"class":166},[71,1619,1086],{"class":170},[71,1621,1623,1625,1627,1629,1632,1634,1636,1639,1642,1644,1646,1649,1652,1654,1656,1659,1662,1665,1667,1670,1672,1674,1676,1679,1681,1684],{"class":73,"line":1622},29,[71,1624,706],{"class":170},[71,1626,262],{"class":77},[71,1628,461],{"class":170},[71,1630,1631],{"class":80},"`[${",[71,1633,1613],{"class":170},[71,1635,353],{"class":80},[71,1637,1638],{"class":170},"category",[71,1640,1641],{"class":80},"}] ${",[71,1643,1613],{"class":170},[71,1645,353],{"class":80},[71,1647,1648],{"class":170},"severity",[71,1650,1651],{"class":80},"} from ${",[71,1653,1613],{"class":170},[71,1655,353],{"class":80},[71,1657,1658],{"class":170},"emittedBy",[71,1660,1661],{"class":80},"}: ${",[71,1663,1664],{"class":196},"JSON",[71,1666,353],{"class":80},[71,1668,1669],{"class":77},"stringify",[71,1671,461],{"class":80},[71,1673,1613],{"class":170},[71,1675,353],{"class":80},[71,1677,1678],{"class":170},"payload",[71,1680,34],{"class":80},[71,1682,1683],{"class":80},"}`",[71,1685,467],{"class":170},[71,1687,1689],{"class":73,"line":1688},30,[71,1690,534],{"class":170},[61,1692,1694],{"className":725,"code":1693,"filename":117,"language":727,"meta":67,"style":67},"from nolag_agents import NoLagAgents, NoLagAgentsOptions, AgentPresenceData\nfrom nolag_agents.patterns import Observe\n\n# In the worker: emit events at the points you want to see\nworker_observe = Observe(room, agents.agent_id)\nawait worker_observe.emit(\"task:started\", {\"task_id\": task.task_id})\n\n# In a monitor process: watch the stream\nmonitor = NoLagAgents(MONITOR_TOKEN, NoLagAgentsOptions(\n    app_name=APP_SLUG,\n    agent_id=\"monitor\",\n    presence=AgentPresenceData(name=\"monitor\", role=\"observer\"),\n))\nawait monitor.connect()\n\nobserve = Observe(await monitor.room(\"default-workflow\"), monitor.agent_id)\n\n# Watch all events in the workflow\nobserve.on(lambda event: print(f\"[{event.category}] {event.severity} from {event.emitted_by}: {event.payload}\"))\n",[46,1695,1696,1700,1705,1709,1714,1719,1724,1728,1733,1738,1742,1747,1752,1756,1761,1765,1770,1774,1779],{"__ignoreMap":67},[71,1697,1698],{"class":73,"line":74},[71,1699,734],{},[71,1701,1702],{"class":73,"line":183},[71,1703,1704],{},"from nolag_agents.patterns import Observe\n",[71,1706,1707],{"class":73,"line":190},[71,1708,187],{"emptyLinePlaceholder":186},[71,1710,1711],{"class":73,"line":222},[71,1712,1713],{},"# In the worker: emit events at the points you want to see\n",[71,1715,1716],{"class":73,"line":256},[71,1717,1718],{},"worker_observe = Observe(room, agents.agent_id)\n",[71,1720,1721],{"class":73,"line":271},[71,1722,1723],{},"await worker_observe.emit(\"task:started\", {\"task_id\": task.task_id})\n",[71,1725,1726],{"class":73,"line":276},[71,1727,187],{"emptyLinePlaceholder":186},[71,1729,1730],{"class":73,"line":305},[71,1731,1732],{},"# In a monitor process: watch the stream\n",[71,1734,1735],{"class":73,"line":333},[71,1736,1737],{},"monitor = NoLagAgents(MONITOR_TOKEN, NoLagAgentsOptions(\n",[71,1739,1740],{"class":73,"line":531},[71,1741,1183],{},[71,1743,1744],{"class":73,"line":537},[71,1745,1746],{},"    agent_id=\"monitor\",\n",[71,1748,1749],{"class":73,"line":552},[71,1750,1751],{},"    presence=AgentPresenceData(name=\"monitor\", role=\"observer\"),\n",[71,1753,1754],{"class":73,"line":565},[71,1755,768],{},[71,1757,1758],{"class":73,"line":570},[71,1759,1760],{},"await monitor.connect()\n",[71,1762,1763],{"class":73,"line":592},[71,1764,187],{"emptyLinePlaceholder":186},[71,1766,1767],{"class":73,"line":610},[71,1768,1769],{},"observe = Observe(await monitor.room(\"default-workflow\"), monitor.agent_id)\n",[71,1771,1772],{"class":73,"line":615},[71,1773,187],{"emptyLinePlaceholder":186},[71,1775,1776],{"class":73,"line":621},[71,1777,1778],{},"# Watch all events in the workflow\n",[71,1780,1781],{"class":73,"line":627},[71,1782,1783],{},"observe.on(lambda event: print(f\"[{event.category}] {event.severity} from {event.emitted_by}: {event.payload}\"))\n",[18,1785,1787],{"id":1786},"step-7-view-in-the-agent-dashboard","Step 7: View in the Agent Dashboard",[14,1789,1790,1791,1794,1795,1798,1799,1801,1802,1805,1806,1809,1810,1813,1814,1817],{},"Open the ",[107,1792,1793],{},"Agent Dashboard"," in the ",[30,1796,43],{"href":40,"rel":1797},[42]," to see your agents in real time. It shows a topology graph of connected agents (from the ",[46,1800,146],{}," lobby), task counters for what it sees while open (dispatched, in progress, completed, failed), the ",[107,1803,1804],{},"Event Stream"," from Observe, the ",[107,1807,1808],{},"Blackboard State",", the ",[107,1811,1812],{},"Approval Queue"," of pending Approve requests, and a panel per agent with its role, status, and capabilities. A ",[107,1815,1816],{},"Tool Registry"," panel is present but stays empty: tool handlers are local to the agent that registers them and are not published anywhere.",[18,1819,1821],{"id":1820},"multi-tenant-setup","Multi-Tenant Setup",[14,1823,1824,1825,1829,1830,1833,1834,1837,1838,1841,1842,353],{},"If you are building a multi-tenant application where each customer needs isolated agent workflows, use ",[30,1826,1828],{"href":1827},"/docs/scopes/getting-started","Access Scopes",". When an actor is assigned to a scope, the broker rewrites every topic it touches from ",[46,1831,1832],{},"app/room/topic"," to ",[46,1835,1836],{},"app/scope/room/topic",". That includes the coordination topics, so tenant Acme's tasks travel on ",[46,1839,1840],{},"my-agents-a3f9/acme/default-workflow/tasks"," and its state on ",[46,1843,1844],{},"my-agents-a3f9/acme/default-workflow/state",[14,1846,1847],{},"This means you deploy one agents app and create scoped actors for each tenant. An orchestrator in tenant A cannot dispatch tasks to workers in tenant B. The isolation is enforced by the broker with no changes to your agent code; the room name and topics you use in the SDK stay the same.",[14,1849,1850,1851,1855],{},"See the ",[30,1852,1854],{"href":1853},"/docs/scopes/multi-tenancy","Multi-Tenant Patterns"," guide for detailed implementation examples, including per-tenant agent deployments.",[18,1857,1859],{"id":1858},"next-steps","Next Steps",[23,1861,1862,1869,1876,1883],{},[26,1863,1864,1868],{},[30,1865,1867],{"href":1866},"/docs/agents/patterns","Patterns"," - deep dive on all six coordination patterns",[26,1870,1871,1875],{},[30,1872,1874],{"href":1873},"/docs/agents/composition","Composition"," - combine agents with chat, notifications, and more",[26,1877,1878,1882],{},[30,1879,1881],{"href":1880},"/docs/agents/tags","Tag Vocabulary"," - learn how capabilities, priority, and tags work",[26,1884,1885,1889],{},[30,1886,1888],{"href":1887},"/docs/agents/examples","Examples"," - canonical recipes for common agent workflows",[1891,1892,1893],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":67,"searchDepth":183,"depth":183,"links":1895},[1896,1897,1898,1899,1900,1901,1902,1903,1904,1905],{"id":20,"depth":183,"text":21},{"id":55,"depth":183,"text":56},{"id":124,"depth":183,"text":125},{"id":356,"depth":183,"text":357},{"id":403,"depth":183,"text":404},{"id":846,"depth":183,"text":847},{"id":1281,"depth":183,"text":1282},{"id":1786,"depth":183,"text":1787},{"id":1820,"depth":183,"text":1821},{"id":1858,"depth":183,"text":1859},"Step-by-step guide to building your first multi-agent workflow with @nolag/agents.","md",{},"/docs/agents/getting-started",{"title":5,"description":1906},"docs/agents/getting-started","JcGNdPzvACJag0unCiLzC8JDerOzzNkj5rzty95vwy0",1789869418375]