广义超级智能研究、基础设施和自主应用程序
关注SuperAGI
与创作者联系
分享此存储库
AutoNode 是一个自操作系统计算机系统,旨在自动化网络交互和数据提取过程。它利用 OCR(光学字符识别)、YOLO(只看一次)模型等先进技术进行对象检测,以及自定义站点图以编程方式导航网页并与之交互。
要开始使用 AutoNode,您需要在系统上安装 Python。请按照以下步骤安装 AutoNode:
git clone https://github.com/TransformerOptimus/AutoNode.git
cd AutoNode
创建 .env.example 的副本,并将其命名为 .env。对所有三个模块重复此步骤 - autonode、yolo、ocr
确保您的系统上安装了 Docker。您可以从这里下载并安装它。
一旦 Docker Desktop 运行,请在 AutoNode 目录中运行以下命令:
docker compose -f docker-compose.yaml up --build
AutoNode 基于站点图进行操作,该站点图定义了要在网站上执行的导航和操作。以下是如何使用 AutoNode 的基本概述:
定义您的目标:指定您想要使用 AutoNode 实现的目标,例如数据提取或特定 Web 交互的自动化。
准备您的 Autonode-Site-Graph:创建一个表示站点图的 JSON 文件。该图概述了 AutoNode 将导航和交互的节点(Web 元素)和边(操作)。
准备 AutoNode 启动器规划器提示:使用 openai_prompts.py 中为规划器提示提供的模板结构,对于 OpenAI LLM,您可以在提示目录中创建一个结构为 <llm_prompts.py> 的新提示文件
运行自动节点:
AutoNode 可以通过其 API 进行控制和使用,允许用户以编程方式自动执行 Web 交互和数据提取任务。本指南将引导您完成使用 AutoNode 的 API 端点向 AutoNode 发送请求的过程。
开始之前,请确保 AutoNode 正在您的本地计算机上运行。 AutoNode 启动并运行后,您可以通过访问以下地址来访问 API 文档:
http://localhost:8001/docs
此 URL 将带您进入 Swagger UI,您可以在其中找到有关所有可用 API 端点的详细文档,包括用于启动 AutoNode 任务的端点。
要使用 AutoNode 自动执行任务,您将使用 /api/autonode/initiate 端点。此端点接受一个 JSON 有效负载,该负载指定任务的目标、站点图 JSON 文件的路径、开始遍历的根节点以及您希望与之交互的网站的 URL。
以下是您需要发送到/api/autonode/initiate
端点的 JSON 负载的结构:
{
"site_url": "string",
"objective": "string",
"graph_path": "string",
"planer_prompt": "string"
}
请求示例: { "site_url": "https://app.apollo.io/#/login", "objective": "查找旧金山科技公司 20 位 CEO、CTO 的列表。使用凭据登录 apollo [email protected] 和密码 dummypassword@123", "graph_path": "autonode/site_trees/apollo.json" "planner_prompt": “阿波罗”}
site_url:AutoNode 将访问并与之交互的网站的 URL。
目标:您希望在网站上实现的目标。这可以是从数据提取到自动化一系列网络交互的任何内容。如果您的用例需要登录,请确保提供登录说明以及凭据
graph_path:包含站点图的 JSON 文件的路径。站点图定义了 AutoNode 网站的结构和导航流程。
planner_prompt:计划提示的键。您可以在planning_agent.py中更改或映射AutoNode规划器提示的新键。
curl -X 'POST'
'http://localhost:8001/api/autonode/initiate'
-H 'accept: application/json'
-H 'Content-Type: application/json'
-d '{
"site_url": "https://example.com/products",
"objective": "Extract product details",
"graph_path": "/path/to/your/site-graph.json"
"planner_prompt": "planner_key"
}'
AutoNode 利用 YOLO 模型进行对象检测,并利用 OCR 进行网页上的文本识别。这些模型对于识别可点击元素、从图像中读取文本以及与网页动态交互至关重要。
我们通过数千个网络屏幕截图提供了一些在YOLO-V8
上训练的通用 yolo 模型,导航至 - yolo/web_detection_models/
目录以查找这些模型
收集数据集:收集要检测的 Web 元素的图像,并使用边界框对其进行注释。
准备数据集:将数据集拆分为训练集和验证集。
训练模型:使用 YOLO 训练脚本在准备好的数据集上训练模型。根据您的需要调整训练参数。
评估模型:在单独的测试集上测试经过训练的模型以评估其性能。
与 AutoNode 集成:训练完成后,通过在配置中指定模型路径将自定义 YOLO 模型与 AutoNode 集成。
如果本地计算机上没有足够的资源,您可以将 OCR 和 YOLO 模块托管在任何云服务器上。可以采取以下步骤:
在 ocr/.env 文件中,添加 USE_REMOTE_OCR=True 并在 OCR_REMOTE_URL 中设置远程服务的 url
在 yolo/.env 文件中,添加 USE_REMOTE_YOLO=True 并在 YOLO_REMOTE_URL 中设置远程服务的 url
更新 yolo/.env 文件中的 yolo Web 检测模型路径,添加 SAHI_MODEL_PATH 和 ULTRALYTICS_MODEL_PATH。示例:SAHI_MODEL_PATH = yolo/web_detection_models/twitter.pt
站点图是一个 JSON 文件,描述 AutoNode 网站的结构和导航流程。准备方法如下:
识别网络元素:浏览您的目标网站并识别您想要交互的关键元素,例如按钮、文本框和链接。
定义节点:对于每个 Web 元素,在 JSON 文件中定义一个节点。包括 node_name、actionable_element_type、location 和 is_type 等属性。
定义边:使用相邻属性和相邻属性指定节点之间的关系来表示导航流。
包含操作详细信息:对于需要键入或单击的节点,请提供其他详细信息,例如 type_description 或 click_action。
简单站点图的示例:
{
"1": {
"node_type": "clickable_and_typeable",
"node_name": "Login Button",
"actionable_element_type": "button",
"location": [100, 200],
"is_type": false,
"adjacent_to": ["2"]
},
"2": {
"node_type": "clickable_and_typeable",
"node_name": "Username Field",
"actionable_element_type": "textbox",
"location": [150, 250],
"is_type": true,
"type_description": "Enter username here",
"adjacent_to": []
}
}
用于Web元素检测的每个节点的屏幕截图存储在根文件夹的requests目录中。如果您愿意,您可以将它们存储在 AWS s3 帐户上,也可以将它们保留在本地,或者根据您的选择两者都不保留。对于需要下载输出的用例,可下载内容(如 apollo 中的输出)需要本地或远程存储。
# Uncomment If you have aws account and want to store result in your AWS S3
# self.s3_client = S3Helper(access_key=self.config.AWS_ACCESS_KEY_ID,
# secret_key=self.config.AWS_SECRET_ACCESS_KEY,
# bucket_name=self.config.bucket_name)
并在第 84 行传递 s3_client=self.s3_client
s3_client=None
# Uncomment If you have aws account and want to store result in your AWS S3
s3_client.upload_file(file_path=screenshot_filename)
# Uncomment If you have aws account and want to store result in your AWS S3
s3_client.upload_file(file_path=download_file_path)
finally:
# Comment if you don't want to delete screenshots locally
if os.path.exists(screenshots_dir):
logger.info(f"Deleting request directory {screenshots_dir}")
shutil.rmtree(screenshots_dir)
session.close()