1"use strict";(self.webpackChunkinnovation_labs=self.webpackChunkinnovation_labs||[]).push([[228],{9138:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"agent-communication/uagent-uagent-communication","title":"uAgent to uAgent Communication","description":"In the uAgents Framework, agents can be triggered in multiple ways using different types of handlers. These handlers act as decorators, enabling agents to execute specific functions based on predefined conditions. This page covers event and message handlers, and also REST endpoints. Below are the available handlers which can be used with uAgents:","source":"@site/docs/agent-communication/uagent-uagent-communication.md","sourceDirName":"agent-communication","slug":"/agent-communication/uagent-uagent-communication","permalink":"/resources/docs/next/agent-communication/uagent-uagent-communication","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"uagent-uagent-communication","title":"uAgent to uAgent Communication"},"sidebar":"tutorialSidebar","previous":{"title":"uAgents Adapters","permalink":"/resources/docs/next/agent-creation/uagents-adapter-guide"},"next":{"title":"Agent Chat Protocol","permalink":"/resources/docs/next/agent-communication/agent-chat-protocol"}}');var a=t(74848),i=t(28453);const o={id:"uagent-uagent-communication",title:"uAgent to uAgent Communication"},r="uAgent \u2194 uAgent Communication",d={},c=[{value:"on_event",id:"on_event",level:2},{value:"on_event("startup")",id:"on_eventstartup",level:3},{value:"on_event("shutdown")",id:"on_eventshutdown",level:3},{value:"on_message()",id:"on_message",level:2},{value:"Agent1 Script",id:"agent1-script",level:3},{value:"Agent2 Script",id:"agent2-script",level:3},{value:"Running agents",id:"running-agents",level:3},{value:"Terminal 1",id:"terminal-1",level:4},{value:"Terminal 2",id:"terminal-2",level:4},{value:"Expected Output",id:"expected-output",level:3},{value:"REST Endpoints",id:"rest-endpoints",level:2},{value:"Adding REST Endpoints",id:"adding-rest-endpoints",level:3},{value:"Example Implementation",id:"example-implementation",level:3},{value:"Using the REST Endpoints",id:"using-the-rest-endpoints",level:3},{value:"Running the Example",id:"running-the-example",level:4},{value:"Agent Communication Methods",id:"agent-communication-methods",level:2},{value:"1. Using ctx.send (Asynchronous Communication)",id:"1-using-ctxsend-asynchronous-communication",level:3},{value:"Example using ctx.send",id:"example-using-ctxsend",level:4},{value:"2. Using ctx.send_and_receive (Synchronous Communication)",id:"2-using-ctxsend_and_receive-synchronous-communication",level:3},{value:"Example using ctx.send_and_receive",id:"example-using-ctxsend_and_receive",level:4},{value:"Expected Output",id:"expected-output-1",level:4},{value:"Key Differences",id:"key-differences",level:3}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"uagent--uagent-communication",children:"uAgent \u2194 uAgent Communication"})}),"\n",(0,a.jsx)(n.p,{children:"In the uAgents Framework, agents can be triggered in multiple ways using different types of handlers. These handlers act as decorators, enabling agents to execute specific functions based on predefined conditions. This page covers event and message handlers, and also REST endpoints. Below are the available handlers which can be used with uAgents:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"on_event()"}),"\n",(0,a.jsx)(n.li,{children:"on_message()"}),"\n",(0,a.jsx)(n.li,{children:"on_rest_get()"}),"\n",(0,a.jsx)(n.li,{children:"on_rest_post()"}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"on_event",children:"on_event"}),"\n",(0,a.jsx)(n.p,{children:"Agents can respond to events such as initialization and termination. The startup and shutdown handlers are used by the uAgents library to manage these events, ensuring that specific actions are executed when an agent starts or stops."}),"\n",(0,a.jsx)(n.h3,{id:"on_eventstartup",children:'on_event("startup")'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'@agent.on_event("startup")\nasync def introduce_agent(ctx: Context):\n ctx.logger.info(f"Hello, I\'m agent {agent.name} and my address is {agent.address}.")\n ...\n'})}),"\n",(0,a.jsx)(n.h3,{id:"on_eventshutdown",children:'on_event("shutdown")'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'@agent.on_event("shutdown")\nasync def introduce_agent(ctx: Context):\n ctx.logger.info(f"Hello, I\'m agent {agent.name} and I am shutting down")\n ...\n'})}),"\n",(0,a.jsx)(n.h2,{id:"on_message",children:"on_message()"}),"\n",(0,a.jsx)(n.p,{children:"In this section, we will explore the on_message() decorator, which allows us to send messages between microservice agents in a structured way. We will create two microservice agents and enable them to communicate with each other."}),"\n",(0,a.jsx)(n.p,{children:"Let's create agent1 who will send a message to agent2 on startup."}),"\n",(0,a.jsx)(n.admonition,{title:"Start order",type:"tip",children:(0,a.jsx)(n.p,{children:"Start Agent2 first, then Agent1. Agent1 sends on startup and Agent2 must already be listening."})}),"\n",(0,a.jsx)(n.h3,{id:"agent1-script",children:"Agent1 Script"}),"\n",(0,a.jsxs)(n.p,{children:["Please remember to have the ",(0,a.jsx)(n.strong,{children:"uagents"})," package installed in the terminal in order to create and run uAgents."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-py",metastring:"title='agent1.py'",children:'from uagents import Agent, Context, Model\n\n# Data model (envelope) which you want to send from one agent to another\nclass Message(Model):\n message: str\n\nmy_first_agent = Agent(\n name="My First Agent",\n port=5050,\n endpoint=["http://localhost:5050/submit"],\n)\n\nsecond_agent = "your_second_agent_address"\
1n\n@my_first_agent.on_event("startup")\nasync def startup_handler(ctx: Context):\n ctx.logger.info(f"My name is {ctx.agent.name} and my address is {ctx.agent.address}")\n await ctx.send(second_agent, Message(message="Hi Second Agent, this is the first agent."))\n\nif __name__ == "__main__":\n my_first_agent.run()\n'})}),"\n",(0,a.jsx)(n.h3,{id:"agent2-script",children:"Agent2 Script"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-py",metastring:"title='agent2.py'",children:'from uagents import Agent, Context, Model\n\nclass Message(Model):\n message: str\n\nmy_second_agent = Agent(\n name="My Second Agent",\n port=5051,\n endpoint=["http://localhost:5051/submit"],\n)\n\n@my_second_agent.on_event("startup")\nasync def startup_handler(ctx: Context):\n ctx.logger.info(f"My name is {ctx.agent.name} and my address is {ctx.agent.address}")\n\n@my_second_agent.on_message(model=Message)\nasync def message_handler(ctx: Context, sender: str, msg: Message):\n ctx.logger.info(f"I have received a message from {sender}.")\n ctx.logger.info(f"I have received a message {msg.message}.")\n\nif __name__ == "__main__":\n my_second_agent.run()\n'})}),"\n",(0,a.jsxs)(n.p,{children:["We need to define the data Model which is ",(0,a.jsx)(n.code,{children:"class Message"})," in both the sender and receiver agents. The receiving agent must include an ",(0,a.jsx)(n.code,{children:"on_message"})," handler that correctly implements this data model. It is crucial to ensure that both agents use the exact same data model for seamless communication."]}),"\n",(0,a.jsx)(n.h3,{id:"running-agents",children:"Running agents"}),"\n",(0,a.jsx)(n.p,{children:"Now that we have created both agents, let's run them in separate terminals. Agent 2 is on the receiver's end so we have to start agent2 first. Whenever agent1 is started it will send message to agent 2 and it will receive and handle the message."}),"\n",(0,a.jsx)(n.h4,{id:"terminal-1",children:"Terminal 1"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"python3 agent2.py\n"})}),"\n",(0,a.jsx)(n.h4,{id:"terminal-2",children:"Terminal 2"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"python3 agent1.py\n"})}),"\n",(0,a.jsx)(n.h3,{id:"expected-output",children:"Expected Output"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"abhi@Fetchs-MacBook-Pro testing % python3 agent2.py \nINFO: [My Second Agent]: Starting agent with address: agent1qtgc4vqn4ehh88hct0umnnqeg36m5722hc4e63lwy573kjtqee7qg5afmap\nINFO: [My Second Agent]: My name is My Second Agent and my address is agent1qtgc4vqn4ehh88hct0umnnqeg36m5722hc4e63lwy573kjtqee7qg5afmap\nINFO: [My Second Agent]: Agent inspector available at https://agentverse.ai/inspect/?uri=http%3A//127.0.0.1%3A5051&address=agent1qtgc4vqn4ehh88hct0umnnqeg36m5722hc4e63lwy573kjtqee7qg5afmap\nINFO: [My Second Agent]: Starting server on http://0.0.0.0:5051 (Press CTRL+C to quit)\nINFO: [My Second Agent]: Registration on Almanac API successful\nINFO: [My Second Agent]: Almanac contract registration is up to date!\nINFO: [My Second Agent]: I have received a message from agent1q0kpqwd5q7akt9utnw540h293zhw063ua90m66rkx5lg98wq4zrjkhmgwd7.\nINFO: [My Second Agent]: I have received a message Hi Second Agent, this is the first agent.\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"abhi@Fetchs-MacBook-Pro testing % python3 agent1.py\nINFO: [My First Agent]: Starting agent with address: agent1q0kpqwd5q7akt9utnw540h293zhw063ua90m66rkx5lg98wq4zrjkhmgwd7\nINFO: [My First Agent]: My name is My First Agent and my address is agent1q0kpqwd5q7akt9utnw540h293zhw063ua90m66rkx5lg98wq4zrjkhmgwd7\nINFO: [My First Agent]: Agent inspector available at https://agentverse.ai/inspect/?uri=http%3A//127.0.0.1%3A5050&address=agent1q0kpqwd5q7akt9utnw540h293zhw063ua90m66rkx5lg98wq4zrjkhmgwd7\nINFO: [My First Agent]: Starting server on http://0.0.0.0:5050 (Press CTRL+C to quit)\nINFO: [My First Agent]: Registration on Almanac API successful\nINFO: [My First Agent]: Almanac contract registration is up to date!\n"})}),"\n",(0,a.jsx)(n.h2,{id:"rest-endpoints",children:"REST Endpoints"}),"\n",(0,a.jsxs)(n.p,{children:["The uAgents Framework allows you to add custom REST endpoints to your agents using two decorators: ",(0,a.jsx)(n.code,{children:"on_rest_get()"})," and ",(0,a.jsx)(n.code,{children:"on_rest_post()"}),". This feature is available at the agent level only and cannot be added to uAgents Protocols."]}),"\n",(0,a.jsx)(n.h3,{id:"adding-rest-endpoints",children:"Adding REST Endpoints"}),"\n",(0,a.jsx)(n.p,{children:"The usage is similar to message handlers, but with some key differences:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsx)(n.li,{children:'You define a custom endpoint in string format (e.g., "/my_rest_endpoint")'}),"\n",(0,a.jsxs)(n.li,{children:["For POST endpoints, you need a Request Model (inheriting from ",(0,a.jsx)(n.code,{children:"Model"})," imported from ",(0,a.jsx)(n.code,{children:"uagents"}),")"]}),"\n",(0,a.jsx)(n.li,{children:"You need a Response Model for both GET and POST endpoints"}),"\n",(0,a.jsx)(n.li,{children:"You must explicitly return a value to the REST client (either as Dict[str, Any] or as the Model itself)"}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"example-implementation",children:"Example Implementation"}),"\n",(0,a.jsx)(n.p,{children:"Here's a complete example showing both GET and POST endpoints:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'import time\nfrom typing import Any, Dict\nfrom uagents import Agent, Context, Model\n\n# Define your models\nclass Request
1(Model):\n text: str\n\nclass Response(Model):\n timestamp: int\n text: str\n agent_address: str\n\n# Create your agent\nagent = Agent(\n name="rest_agent",\n port=8000,\n endpoint=["http://localhost:8000/submit"],\n)\n\n# GET endpoint example\[email protected]_rest_get("/rest/get", Response)\nasync def handle_get(ctx: Context) -> Dict[str, Any]:\n ctx.logger.info("Received GET request")\n return {\n "timestamp": int(time.time()),\n "text": "Hello from the GET handler!",\n "agent_address": ctx.agent.address,\n }\n\n# POST endpoint example\[email protected]_rest_post("/rest/post", Request, Response)\nasync def handle_post(ctx: Context, req: Request) -> Response:\n ctx.logger.info("Received POST request")\n return Response(\n text=f"Received: {req.text}",\n agent_address=ctx.agent.address,\n timestamp=int(time.time()),\n )\n\nif __name__ == "__main__":\n agent.run()\n'})}),"\n",(0,a.jsx)(n.h3,{id:"using-the-rest-endpoints",children:"Using the REST Endpoints"}),"\n",(0,a.jsx)(n.p,{children:"To interact with these endpoints, ensure:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsx)(n.li,{children:'You use the correct REST method ("GET" or "POST")'}),"\n",(0,a.jsxs)(n.li,{children:["You address the agent endpoint together with its route (",(0,a.jsx)(n.a,{href:"http://localhost:8000/custom_route",children:"http://localhost:8000/custom_route"}),")"]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"running-the-example",children:"Running the Example"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsx)(n.li,{children:"Start the agent:"}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"python agent.py\n"})}),"\n",(0,a.jsxs)(n.ol,{start:"2",children:["\n",(0,a.jsx)(n.li,{children:"Query the POST endpoint:"}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'curl -d \'{"text": "test"}\' -H "Content-Type: application/json" -X POST http://localhost:8000/rest/post\n'})}),"\n",(0,a.jsx)(n.p,{children:"Example POST response (placeholder address for illustration only):"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json",children:'{\n "timestamp": 1709312457,\n "text": "Received: test",\n "agent_address": "agent1q..."\n}\n'})}),"\n",(0,a.jsxs)(n.ol,{start:"3",children:["\n",(0,a.jsx)(n.li,{children:"Query the GET endpoint:"}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"curl http://localhost:8000/rest/get\n"})}),"\n",(0,a.jsx)(n.p,{children:"Example GET response (placeholder address for illustration only):"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json",children:'{\n "timestamp": 1709312460,\n "text": "Hello from the GET handler!",\n "agent_address": "agent1q..."\n}\n'})}),"\n",(0,a.jsx)(n.p,{children:"The REST endpoints provide a convenient way to integrate your uAgents with web services and other HTTP-based systems."}),"\n",(0,a.jsx)(n.h2,{id:"agent-communication-methods",children:"Agent Communication Methods"}),"\n",(0,a.jsxs)(n.p,{children:["The uAgents framework provides two primary methods for agents to communicate with each other: ",(0,a.jsx)(n.code,{children:"ctx.send"})," and ",(0,a.jsx)(n.code,{children:"ctx.send_and_receive"}),". Each serves different communication patterns."]}),"\n",(0,a.jsx)(n.h3,{id:"1-using-ctxsend-asynchronous-communication",children:"1. Using ctx.send (Asynchronous Communication)"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ctx.send"})," method allows for simple one-way communication between agents. This is useful when an agent needs to notify another agent without requiring an immediate response."]}),"\n",(0,a.jsx)(n.h4,{id:"example-using-ctxsend",children:"Example using ctx.send"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'from uagents import Agent, Bureau, Context, Model\n\nclass Message(Model):\n text: str\n\nalice = Agent(name="alice")\nbob = Agent(name="bob")\n\[email protected]_interval(period=2.0)\nasync def send_message(ctx: Context):\n msg = f"Hello there {bob.name}
1 my name is {alice.name}."\n await ctx.send(bob.address, Message(text=msg))\n\[email protected]_message(model=Message)\nasync def message_handler(ctx: Context, sender: str, msg: Message):\n ctx.logger.info(f"Received message from {sender}: {msg.text}")\n\nbureau = Bureau()\nbureau.add(alice)\nbureau.add(bob)\n\nif __name__ == "__main__":\n bureau.run()\n'})}),"\n",(0,a.jsx)(n.p,{children:"When running this example, Alice will send a message to Bob every 2 seconds, and Bob will log the received message."}),"\n",(0,a.jsx)(n.h3,{id:"2-using-ctxsend_and_receive-synchronous-communication",children:"2. Using ctx.send_and_receive (Synchronous Communication)"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ctx.send_and_receive"})," method allows for request-response style communication between agents. This is useful when an agent needs to make a request and wait for a response before proceeding."]}),"\n",(0,a.jsx)(n.p,{children:"Available from uAgents version 0.21.1 onwards, this method returns both the response and a status indicator."}),"\n",(0,a.jsx)(n.h4,{id:"example-using-ctxsend_and_receive",children:"Example using ctx.send_and_receive"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'from uagents import Agent, Bureau, Context, Model\n\nclass Message(Model):\n message: str\n\nalice = Agent(name="alice")\nbob = Agent(name="bob")\nclyde = Agent(name="clyde")\n\[email protected]_interval(period=5.0)\nasync def send_message(ctx: Context):\n msg = Message(message="Hey Bob, how\'s Clyde?")\n reply, status = await ctx.send_and_receive(bob.address, msg, response_type=Message)\n if isinstance(reply, Message):\n ctx.logger.info(f"Received awaited response from bob: {reply.message}")\n else:\n ctx.logger.info(f"Failed to receive response from bob: {status}")\n\[email protected]_message(model=Message)\nasync def handle_message_and_reply(ctx: Context, sender: str, msg: Message):\n ctx.logger.info(f"Received message: {msg.message}")\n new_msg = Message(message="How are you, Clyde?")\n reply, status = await ctx.send_and_receive(\n clyde.address, new_msg, response_type=Message\n )\n if isinstance(reply, Message):\n ctx.logger.info(f"Received awaited response from clyde: {reply.message}")\n await ctx.send(sender, Message(message="Clyde is doing alright!"))\n else:\n ctx.logger.info(f"Failed to receive response from clyde: {status}")\n\[email protected]_message(model=Message)\nasync def handle_message(ctx: Context, sender: str, msg: Message):\n ctx.logger.info(f"Received message from {sender}: {msg.message}")\n await ctx.send(sender, Message(message="I\'m doing alright!"))\n\nbureau = Bureau([alice, bob, clyde])\n\nif __name__ == "__main__":\n bureau.run()\n'})}),"\n",(0,a.jsx)(n.h4,{id:"expected-output-1",children:"Expected Output"}),"\n",(0,a.jsx)(n.p,{children:"When running this example, you'll see a chain of communication:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsx)(n.li,{children:"Alice asks Bob about Clyde's status"}),"\n",(0,a.jsx)(n.li,{children:"Bob asks Clyde about his status"}),"\n",(0,a.jsx)(n.li,{children:"Clyde responds to Bob"}),"\n",(0,a.jsx)(n.li,{children:"Bob responds to Alice"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The console output will look similar to:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"INFO: [alice]: Sending message to agent1qbob...\nINFO: [bob]: Received message: Hey Bob, how's Clyde?\nINFO: [bob]: Sending message to agent1qclyde...\nINFO: [clyde]: Received message from agent1qbob...: How are you, Clyde?\nINFO: [clyde]: Sending message to agent1qbob...\nINFO: [bob]: Received awaited response from clyde: I'm doing alright!\nINFO: [bob]: Sending message to agent1qalice...\nINFO: [alice]: Received awaited response from bob: Clyde is doing alright!\n"})}),"\n",(0,a.jsx)(n.h3,{id:"key-differences",children:"Key Differences"}),"\n",(0,a.jsxs)(n.table,{children:[(0,a.jsx)(n.thead,{children:(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.th,{children:"Feature"}),(0,a.jsx)(n.th,{children:"ctx.send"}),(0,a.jsx)(n.th,{children:"ctx.send_and_receive"})]})}),(0,a.jsxs)(n.tbody,{children:[(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Communication Pattern"}),(0,a.jsx)(n.td,{children:"One-way (fire and forget)"}),(0,a.jsx)(n.td,{children:"Request-response"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Waiting for Response"}),(0,a.jsx)(n.td,{children:"No"}),(0,a.jsx)(n.td,{children:"Yes"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Return Value"}),(0,a.jsx)(n.td,{children:"None"}),(0,a.jsx)(n.td,{children:"Tuple of (response, status)"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Use Case"}),(0,a.jsx)(n.td,{children:"Notifications, broadcasts"}),(0,a.jsx)(n.td,{children:"Queries, confirmations, multi-step workflows"})]})]})]}),"\n",(0,a.jsx)(n.p,{children:"Choose the appropriate method based on your agents' communication requirements:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Use ",(0,a.jsx)(n.code,{children:"ctx.send"})," for simple notifications or information updates"]}),"\n",(0,a.jsxs)(n.li,{children:["Use ",(0,a.jsx)(n.code,{children:"ctx.send_and_receive"})," when you need a response to continue processing"]}),"\n"]})]})}function g(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var s=t(96540);const a={},i=s.createContext(a);function o(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.