1"use strict";(self.webpackChunkinnovation_labs=self.webpackChunkinnovation_labs||[]).push([[2220],{54262:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"examples/chat-protocol/image-analysis-agent","title":"Image Analysis Agent","description":"This guide demonstrates how to create an Image Analysis Agent that can process both text and image inputs using the chat protocol. The agent is compatible with the Agentverse Chat Interface and can process natural language queries about image analysis.","source":"@site/versioned_docs/version-1.0.3/examples/chat-protocol/image-analysis-agent.md","sourceDirName":"examples/chat-protocol","slug":"/examples/chat-protocol/image-analysis-agent","permalink":"/resources/docs/1.0.3/examples/chat-protocol/image-analysis-agent","draft":false,"unlisted":false,"tags":[],"version":"1.0.3","frontMatter":{"id":"image-analysis-agent","title":"Image Analysis Agent"},"sidebar":"tutorialSidebar","previous":{"title":"Creating ASI1 Compatible uAgent","permalink":"/resources/docs/1.0.3/examples/chat-protocol/asi1-compatible-uagents"},"next":{"title":"Image Generation Agent","permalink":"/resources/docs/1.0.3/examples/chat-protocol/image-generation-agent"}}');var a=t(74848),i=t(28453);const r={id:"image-analysis-agent",title:"Image Analysis Agent"},o="Image Analysis Agent",l={},c=[{value:"Overview",id:"overview",level:2},{value:"Message Flow",id:"message-flow",level:2},{value:"Implementation",id:"implementation",level:2},{value:"1. Image Analysis Implementation",id:"1-image-analysis-implementation",level:3},{value:"2. Chat Protocol Integration",id:"2-chat-protocol-integration",level:3},{value:"Message Flow",id:"message-flow-1",level:4},{value:"3. Image Analysis Agent Setup",id:"3-image-analysis-agent-setup",level:3},{value:"Adding a README to your Agent",id:"adding-a-readme-to-your-agent",level:2},{value:"Query your Agent",id:"query-your-agent",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",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:"image-analysis-agent",children:"Image Analysis Agent"})}),"\n",(0,a.jsxs)(n.p,{children:["This guide demonstrates how to create an Image Analysis Agent that can process both text and image inputs using the chat protocol. The agent is compatible with the ",(0,a.jsx)(n.a,{href:"http://chat.agentverse.ai/",children:"Agentverse Chat Interface"})," and can process natural language queries about image analysis."]}),"\n",(0,a.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,a.jsx)(n.p,{children:"In this example, you'll learn how to build a uAgent that can:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Accept both text and image inputs through the chat protocol"}),"\n",(0,a.jsx)(n.li,{children:"Process images using Claude's vision capabilities"}),"\n",(0,a.jsx)(n.li,{children:"Store and manage image resources using Agent storage"}),"\n",(0,a.jsx)(n.li,{children:"Respond to queries about image content"}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"message-flow",children:"Message Flow"}),"\n",(0,a.jsx)(n.p,{children:"The communication between the User, Chat Interface, and Image Analyser Agent proceeds as follows:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"User Query"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["The user submits a query along with an image through the ",(0,a.jsx)(n.a,{href:"http://chat.agentverse.ai/",children:"Chat Interface"}),"."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Image Upload & Query Forwarding"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"2.1"}),": The Chat Interface uploads the image to the Agent Storage."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"2.2"}),": The Chat Interface forwards the user's query with a reference to the uploaded image to the Image Analyser Agent as a ",(0,a.jsx)(n.code,{children:"ChatMessage"}),"."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Image Retrieval"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"The Image Analyser Agent retrieves the image from Agent Storage using the provided reference."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Image Analysis"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"4.1"}),": The agent passes the query and image to the Image Analysis Function."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"4.2"}),": The Image Analysis Function processes the image and returns a response."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Response & Acknowledgement"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"5.
11"}),": The agent sends the analysis result back to the Chat Interface as a ",(0,a.jsx)(n.code,{children:"ChatMessage"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"5.2"}),": The agent also sends a ",(0,a.jsx)(n.code,{children:"ChatAcknowledgement"})," to confirm receipt and processing of the message."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"User Receives Response"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"The Chat Interface delivers the analysis result to the user."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"ASI Chat Protocol Flow",src:t(72986).A+"",width:"5802",height:"2954"})}),"\n",(0,a.jsx)(n.h2,{id:"implementation",children:"Implementation"}),"\n",(0,a.jsxs)(n.p,{children:["In this example we will create an agent and its associated files on ",(0,a.jsx)(n.a,{href:"https://agentverse.ai/",children:"Agentverse"})," that communicate using the chat protocol with the ",(0,a.jsx)(n.a,{href:"https://agentverse.ai/",children:"Chat Interface"})," Refer to the ",(0,a.jsx)(n.a,{href:"/docs/agent-creation/uagent-creation#hosted-agents",children:"Hosted Agents"})," section to understand the detailed steps for agent creation on Agentverse."]}),"\n",(0,a.jsx)(n.p,{children:'Create a new agent named "Image Analysis Agent" on Agentverse and create the following files:'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"agent.py # Main agent file \nimage_analysis.py # Image analysis function\nchat_proto.py # Chat protocol implementation for enabling text based communication \n"})}),"\n",(0,a.jsx)(n.p,{children:"To create a new file on Agentverse:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Click on the New File icon\n",(0,a.jsx)(n.img,{alt:"New File",src:t(54030).A+"",width:"2359",height:"456"})]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Assign a name to the File\n",(0,a.jsx)(n.img,{alt:"Rename File",src:t(72858).A+"",width:"2250",height:"754"})]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Directory Structure\n",(0,a.jsx)(n.img,{alt:"Directory Structure",src:t(22706).A+"",width:"2357",height:"640"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"1-image-analysis-implementation",children:"1. Image Analysis Implementation"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"image_analysis.py"})," file implements the logic for passing both text and image inputs to Claude's vision model. It handles encoding images, constructing the appropriate request, and returning the AI-generated analysis of the image and query."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",metastring:"title='image_analysis.py'",children:'import json\nimport os\nfrom typing import Any\n\nimport requests\n\nCLAUDE_URL = "https://api.anthropic.com/v1/messages"\nMAX_TOKENS = int(os.getenv("MAX_TOKENS", "1024"))\nANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY", "YOUR_ANTHROPIC_API_KEY")\nif ANTHROPIC_API_KEY is None or ANTHROPIC_API_KEY == "YOUR_ANTHROPIC_API_KEY":\n raise ValueError(\n "You need to provide an API key: https://platform.openai.com/api-keys"\n )\nMODEL_ENGINE = os.getenv("MODEL_ENGINE", "claude-3-5-haiku-latest")\nHEADERS = {\n "x-api-key": ANTHROPIC_API_KEY,\n "anthropic-version": "2023-06-01",\n "content-type": "application/json",\n}\n\ndef get_image_analysis(\n content: list[dict[str, Any]], tool: dict[str, Any] | None = None\n) -> str | None:\n\n processed_content = []\n\n for item in content:\n if item.get("type") == "text":\n processed_content.append({"type": "text", "text": item["text"]})\n elif item.get("type") == "resource":\n mime_type = item["mime_type"]\n if mime_type.startswith("image/"):\n processed_content.append({\n "type": "image",\n "source": {\n "type": "base64",\n "media_type": mime_type,\n "data": item["contents"],\n }\n })\n else:\n return f"Unsupported mime type: {mime_type}"\n\n data = {\n "model": MODEL_ENGINE,\n "max_tokens": MAX_TOKENS,\n "messages": [\n {\n "role": "user",\n "content": processed_content,\n }\n ],\n }\n\n if tool:\n data["tools"] = [tool]\n data["tool_choice"] = {"type": "tool", "name": tool["name"]}\n\n try:\n response = requests.post(\n CLAUDE_URL, headers=HEADERS, data=json.dumps(data), timeout=120\n )\n response.raise_for_status()\n except requests.exceptions.Timeout:\n return "The request timed out. Please try again."\n except requests.exceptions.RequestException as e:\n return f"An error occurred: {e}"\n\n # Check if the response was successful\n response_data = response.json()\n\n # Handle error responses\n if "error" in response_data:\n return f"API Error: {response_data[\'error\'].get(\'message\', \'Unknown error\')}"\n\n if tool:\n for item in response_data["content"]:\n if item["type"] == "tool_use":\n return item["input"]\n \n messages = response_data["content"]\n\n if messages:\n return messages[0]["text"]\n else:\n return None\n\n'})}),"\n",(0,a.jsx)(n.h3,{id:"2-chat-protocol-integration",children:"2. Chat Protocol Integration"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"chat_proto.py"})," file is essential for enabling natural language communication between your agent and ASI1 LLM."]}),"\n",(0,a.jsx)(n.h4,{id:"message-flow-1",children:"Message Flow"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Session Initiation"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["When a user starts a chat session, the agent receives a ",(0,a.jsx)(n.code,{children:"ChatMessage"})," containing a ",(0,a.jsx)(n.code,{children:"StartSessionContent"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:["The agent responds with a ",(0,a.jsx)(n.code,{children:"MetadataContent"})," message: ",(0,a.jsx)(n.code,{children:'{"attachments": "true"}'}),". This signals to the chat UI that file attachments (such as images) are supported."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"User Query"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["The user sends a query as a ChatMessage, which includes:","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"TextContent"})," (the user's question)"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"ResourceContent"})," (an image or other file attachment)"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Message Processing"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["For each content item:","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["If ",(0,a.jsx)(n.code,{children:"TextContent"}),", the agent adds the text to the prompt for Claude."]}),"\n",(0,a.jsxs)(n.li,{children:["If ",(0,a.jsx)(n.code,{children:"ResourceContent"}),", the agent downloads the image from Agent Storage and adds it to the prompt as an image input for Claude."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Image Analysis and AI Processing"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["The agent then analyses the image with the help of ",(0,a.jsx)(n.code,{children:"image_analysis.py"})," and sends back a response with the analysis to the user."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["To enable natural language communication with your agent add the following chat protocol in the ",(0,a.jsx)(n.code,{children:"chat_proto.py"})," file created on Agentverse:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",metastring:"title='chat_proto.py'",children:'import os\nfrom datetime import datetime\nfrom uuid import uuid4\n\nfrom uagents import Context, Protocol\nfrom uagents_core.contrib.protocols.chat import (\n ChatAcknowledgement,\n ChatMessage,\n MetadataContent,\n ResourceContent,\n StartSessionContent,\n TextContent,\n chat_protocol_spec,\n)\nfrom uagents_core.storage import ExternalStorage\n\nfrom image_analysis import get_image_analysis\n\nSTORAGE_URL = os.getenv("AGENTVERSE_URL", "https://agentverse.ai") + "/v1/storage"\n\n\ndef create_text_chat(text: str) -> ChatMessage:\n return ChatMessage(\n timestamp=datetime.utcnow(),\n msg_id=uuid4(),\n content=[TextContent(type="text", text=text)],\n )\n\n\ndef create_metadata(metadata: dict[str, str]) -> ChatMessage:\n return ChatMessage(\n timestamp=datetime.utcnow(),\n msg_id=uuid4(),\n content=[MetadataContent(\n type="metadata",\n metadata=metadata,\n )],\n )\n\n\nchat_proto = Protocol(spec=chat_protocol_spec)\n\n\n@chat_proto.on_message(ChatMessage)\nasync def handle_message(ctx: Context, sender: str, msg: ChatMessage):\n ctx.logger.info(f"Got a message from {sender}")\n await ctx.send(\n sender,\n ChatAcknowledgement(\n timestamp=datetime.utcnow(), acknowledged_msg_id=m
1sg.msg_id\n ),\n )\n\n prompt_content = []\n for item in msg.content:\n if isinstance(item, StartSessionContent):\n await ctx.send(sender, create_metadata({"attachments": "true"}))\n elif isinstance(item, TextContent):\n prompt_content.append({"text": item.text, "type": "text"})\n elif isinstance(item, ResourceContent):\n try:\n external_storage = ExternalStorage(\n identity=ctx.agent.identity,\n storage_url=STORAGE_URL,\n )\n data = external_storage.download(str(item.resource_id))\n prompt_content.append({\n "type": "resource",\n "mime_type": data["mime_type"],\n "contents": data["contents"],\n })\n\n except Exception as ex:\n ctx.logger.error(f"Failed to download resource: {ex}")\n await ctx.send(sender, create_text_chat("Failed to download resource."))\n else:\n ctx.logger.warning(f"Got unexpected content from {sender}")\n\n if prompt_content:\n response = get_image_analysis(prompt_content)\n await ctx.send(sender, create_text_chat(response))\n\n\n@chat_proto.on_message(ChatAcknowledgement)\nasync def handle_ack(ctx: Context, sender: str, msg: ChatAcknowledgement):\n ctx.logger.info(\n f"Got an acknowledgement from {sender} for {msg.acknowledged_msg_id}"\n )\n'})}),"\n",(0,a.jsx)(n.h3,{id:"3-image-analysis-agent-setup",children:"3. Image Analysis Agent Setup"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"agent.py"})," file is the core of your application. Think of it as the main control center that:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Initialises your agent"}),"\n",(0,a.jsx)(n.li,{children:"Handles incoming requests"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"In this example, we focus on the essential setup for an image analysis agent."}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note:"})," If you want to add advanced features such as rate limiting or agent health checks, you can refer to the",(0,a.jsx)(n.a,{href:"/resources/docs/1.0.3/examples/chat-protocol/asi1-compatible-uagents#3-football-team-agent-setup",children:"Football Team Agent section"})," in the ASI1 Compatible uAgent guide."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",metastring:"title='agent.py'",children:'from uagents import Agent\nfrom chat_proto import chat_proto\n\nagent = Agent()\n\n#Include the chat protocol defined in the previous step to handle text and image contents\nagent.include(chat_proto, publish_manifest=True)\n\nif __name__ == "__main__":\n agent.run()\n'})}),"\n",(0,a.jsx)(n.h2,{id:"adding-a-readme-to-your-agent",children:"Adding a README to your Agent"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Go to the Overview section in the Editor."}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Click on Edit and add a good description for your Agent so that it can be easily searchable by the ASI1 LLM. Please refer the ",(0,a.jsx)(n.a,{href:"/docs/agentverse/searching#importance-of-good-readme",children:"Importance of Good Readme"})," section for more details."]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Make sure the Agent has the right ",(0,a.jsx)(n.code,{children:"AgentChatProtocol"}),".\n",(0,a.jsx)(n.img,{alt:"Chat Protocol version",src:t(69141).A+"",width:"1727",height:"1452"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"query-your-agent",children:"Query your Agent"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Start your Agent"}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Navigate to the Overview tab and click on ",(0,a.jsx)(n.strong,{children:"Chat with Agent"})," to interact with the agent from the ",(0,a.jsx)(n.a,{href:"https://chat.agentverse.ai/",children:"Agentverse Chat Interface"}),"."]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Agentverse Chat Interface",src:t(81416).A+"",width:"2364",height:"1447"})}),"\n",(0,a.jsxs)(n.ol,{start:"3",children:["\n",(0,a.jsxs)(n.li,{children:["Click on the ",(0,a.jsx)(n.strong,{children:"Attach"})," button to upload the image and type in your query for instance 'How many people are present in the image?'"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.img,{alt:"Attach File",src:t(81396).A+"",width:"2926",height:"1424"}),"\n",(0,a.jsx)(n.img,{alt:"Chat",src:t(41575).A+"",width:"2942",height:"1988"})]}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note"}),":\nCurrently, the image upload feature for agents is supported via the Agentverse Chat Interface. Support for image uploads through ASI",":One"," will be available soon."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},54030:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/New-File-7fb3ff39762a49a5dce3acc354205fa0.png"},72858:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/Rename-File-ac16473063e778abc2996724086f3844.png"},81396:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/attach-image-eaeea05715325c1906535bf8c9501362.png"},41575:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/chat-interface-b2eb24f289800a457088280f7994323a.png"},81416:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/chat-with-agent-feb2ea09d2ebfe78877174bf9d7a5865.png"},22706:(e,n,t)=>{t.d(n,{A:()=>s});
1const s=t.p+"assets/images/directory-structure-375be93290defd071a7c348ff8dd5f85.png"},72986:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/image-overview-25935f0bce9bb1f55e8968027d189dcd.png"},69141:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/readme-d5f249636284fd81df1c78b51ad7285f.png"},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>o});var s=t(96540);const a={},i=s.createContext(a);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(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.