diff --git a/example/a2a/README.md b/example/a2a/README.md new file mode 100644 index 0000000..3e8c826 --- /dev/null +++ b/example/a2a/README.md @@ -0,0 +1,47 @@ +# a2a · Agent-to-Agent 通信 + +让本 Agent 与其他 Agent **双向互调**:既能对外暴露自己的能力,也能去问别的 Agent。 + +## 两个方向 + +| 方向 | 怎么实现 | +|---|---| +| **入站**(别人问我) | 插件起一个 HTTP 服务端,暴露 `/agent-card`(能力描述)与 `/a2a`(JSON-RPC 入口) | +| **出站**(我问别人) | 提供 `a2a_query` / `a2a_discover` 工具,主动向远端 A2A Agent 发起请求 | + +## HTTP 端点 + +| 路径 | 作用 | +|---|---| +| `GET /agent-card` | 返回 Agent Card:本 Agent 的能力描述,供对方发现 | +| `POST /a2a` | JSON-RPC 2.0 入口,接收对方的任务请求 | + +## 工具 + +| 工具 | 说明 | +|---|---| +| `a2a_a2a_query` | 向另一个 A2A Agent 发查询并取回复 | +| `a2a_a2a_discover` | 取对方的 Agent Card(能力描述) | +| `a2a_a2a_status` | 看本插件运行状态(监听地址、当前配置) | +| `a2a_a2a_configure` | 改配置并自动重启服务(可动态改监听地址) | +| `a2a_a2a_restart` | 重启 HTTP 服务端(连接异常或改配置后用) | + +> 工具名前缀取自插件名(`tp`),按默认 `a2a_` 列出。 + +## 配置项 + +| 键 | 默认 | 说明 | +|---|---|---| +| `listen` | `127.0.0.1:12000` | 服务端监听地址。**设为空可禁用 HTTP 服务**(只出站、不入站) | + +## 典型用法 + +1. **先发现再调用**:`a2a_discover` 拿对方能力 → 决定要不要发、发什么 → `a2a_query`。 + 跳过 discovery 直接问,容易问出对方不支持的东西。 +2. **只出站**:把 `listen` 设为空,本 Agent 不外露端口,但仍能主动联系别人。 + +## 构建 + +```bash +hmapdev build +``` diff --git a/example/acp/README.md b/example/acp/README.md new file mode 100644 index 0000000..d8e44c4 --- /dev/null +++ b/example/acp/README.md @@ -0,0 +1,51 @@ +# acp · Agent Client Protocol 通信 + +[ACP](https://agentclientprotocol.com/) 桥接:本 Agent 既能**当服务端**接别人的任务,也能**当客户端**去调别的 ACP Agent。 + +## 两个方向 + +| 角色 | 行为 | +|---|---| +| **服务端** | 在本机起 HTTP 服务,处理 `session/new` / `session/update`,接受其他 Agent 的任务请求 | +| **客户端** | 通过 `acp_query` 向远程 ACP Agent 发 `session/new` 并读回复 | + +## 协议端点 + +- `POST /api/session` —— JSON-RPC,支持 `session/new` 与 `session/update` +- 客户端侧同时兼容**两种服务端**:SSE 型(流式 `session/reply`)与同步 JSON 型 + +## 工具 + +| 工具 | 说明 | +|---|---| +| `acp_acp_query` | 向远程 ACP Agent 发起会话并等待回复,返回最终回答文本 | +| `acp_acp_status` | 查看运行状态与**当前活跃会话数** | +| `acp_acp_configure` | 改监听配置并重启 HTTP 服务 | + +> 工具名前缀取自插件名(`tp`),按默认 `acp_` 列出。 + +`acp_query` 可指向的远端举例(源码注释给的): + +- opencode:`http://127.0.0.1:13000` +- pi bridge:`http://127.0.0.1:12011` +- 回环到自身:`http://127.0.0.1:12001` + +## 配置项 + +| 键 | 默认 | 说明 | +|---|---|---| +| `listen` | `127.0.0.1:12001` | 服务端监听地址。**设为空可禁用 HTTP 服务**(只出站) | + +## 与 a2a 的区别 + +| | a2a | acp | +|---|---|---| +| 面向 | Agent ↔ Agent 对等通信 | 客户端 → Agent 会话(每次一个 session) | +| 会话 | 一问一答 | 有 session 生命周期,可续 | +| 发现 | `/agent-card` | 无(需已知地址) | + +## 构建 + +```bash +hmapdev build +``` diff --git a/example/ai_image/README.md b/example/ai_image/README.md index 181dd43..d458ff1 100644 --- a/example/ai_image/README.md +++ b/example/ai_image/README.md @@ -1,13 +1,34 @@ -# ai_image +# ai_image · 文生图 -ai_image plugin +按文字提示生成图片,下载到本地并返回**文件路径**。 -## Build +## 工具 + +| 工具 | 说明 | +|---|---| +| `ai_image_generate` | 按 prompt 生成图片 | + +返回值是**本地文件路径**(永久,不过期)。要把图给用户看,再用导出的通道 +以 `type=image`、`payload=<该路径>` 发送。 + +## 配置项 + +| 键 | 默认 | 说明 | +|---|---|---| +| `api_key` | 空 | OpenAI / Stable Diffusion 的 API Key | +| `base_url` | 空 | 自定义 OpenAI 兼容网关(**不带 `/v1` 尾缀**,如 `http://127.0.0.1:8081`)。留空走官方 `https://api.openai.com` | +| `provider` | `openai` | 服务方:`openai` / `stability` | +| `model` | `dall-e-3` | 模型名(如 `dall-e-3`、`sd-xl`) | +| `size` | `1024x1024` | 默认尺寸,也可 `1024x1792` / `1792x1024` | + +## 实现要点 + +- **返回本地路径而不是远端 URL**:远端图床链接会过期,写进记忆就成了悬空指针。 + 下载到本地后路径稳定,可交给媒体存储做内容寻址。 +- 配了 `base_url` 就能指向自建/兼容网关,不必依赖官方接口。 + +## 构建 ```bash hmapdev build ``` - -## Install - -Upload the .hmap file through the Plugin Manager API. diff --git a/example/bili/README.md b/example/bili/README.md new file mode 100644 index 0000000..141b988 --- /dev/null +++ b/example/bili/README.md @@ -0,0 +1,43 @@ +# bili · B站视频下载 + +用 [yt-dlp](https://github.com/yt-dlp/yt-dlp) 把 B 站视频下载到本地。 + +## 前置依赖 + +需要系统里装有 `yt-dlp`: + +```bash +pip install -U yt-dlp # 或 apt install yt-dlp +``` + +## 工具 + +| 工具 | 说明 | +|---|---| +| `bili_video` | 下载 B 站视频;不指定 `format` 时先返回可用清晰度列表,指定后真正下载并返回文件路径 | + +参数: + +| 参数 | 说明 | +|---|---| +| `url` | 视频地址 | +| `format` | 格式 ID。常用:`30112`/`30080`=1080P、`30064`=720P、`30032`=480P、`30016`=360P。不指定则自动选最优 | + +## 配置项 + +| 键 | 默认 | 说明 | +|---|---|---| +| `output_dir` | `/tmp/bili_videos` | 下载目录 | +| `proxy` | 空 | yt-dlp 使用的 HTTP 代理(如 `http://127.0.0.1:7890`)。留空则不设代理 | + +## 实现要点 + +- **`output_dir` 有安全校验**:它是配置项,但会拒绝被配成系统目录,避免 yt-dlp 往任意位置写文件。 +- 两阶段用法:先不传 `format` 拿到清晰度清单(`format_id` + `format_note`),再带上选定的 ID 下载。这样模型不会盲选一个不存在的格式。 +- B 站在部分网络环境下需要代理,见上面的 `proxy`。 + +## 构建 + +```bash +hmapdev build +``` diff --git a/example/browser/README.md b/example/browser/README.md new file mode 100644 index 0000000..28baaa2 --- /dev/null +++ b/example/browser/README.md @@ -0,0 +1,66 @@ +# browser · 统一浏览器 + +一个插件覆盖三种"访问网页"的能力,从最轻到最重。**按需选层**是这个插件的重点 —— +绝大多数抓取用 HTTP 就够,不该为了一句话启动 Chromium。 + +## 三种能力层 + +| 层 | 工具 | 何时用 | +|---|---|---| +| **搜索** | `browser_search` | 要的是"找到哪些页面",不是页面本身 | +| **quick(纯 HTTP)** | `browser_fetch`(`mode=quick`) | 静态页、API、能直接拿到 HTML | +| **normal(无头渲染)** | `browser_render` / `browser_fetch`(`mode=render`) | JS 渲染的页面,HTTP 拿不到内容 | +| **interactive(CDP)** | `browser_start` + `navigate`/`click`/`type`/`scroll`/`html`/`screenshot` | 需要交互:登录、点按、翻页 | + +`browser_fetch` 的 `mode`: + +- `auto`(默认):先试 HTTP,**遇 403/429 才降级**用 Chromium 渲染 +- `render`:强制 Chromium +- `quick`:纯 HTTP,不降级 + +## 工具 + +| 工具 | 说明 | +|---|---| +| `browser_search` | 网页搜索 | +| `browser_fetch` | 抓取 URL 内容,三种 mode 见上 | +| `browser_render` | 无头 Chromium 渲染并提取文本(normal) | +| `browser_start` | 启动交互式浏览器会话(CDP) | +| `browser_navigate` | 导航到指定 URL | +| `browser_click` | 点击元素 | +| `browser_type` | 输入文本 | +| `browser_scroll` | 滚动页面 | +| `browser_html` | 取当前页 HTML | +| `browser_screenshot` | 截图 | +| `browser_install` | 安装 systemd 托管的共享浏览器后端 | +| `browser_close` | 关闭会话 | + +## 共享浏览器后端 + +`browser_install` 安装 `homeagent-browser.service`(systemd 托管)。 +装上之后**所有 agent 共享同一个 Chromium 实例与登录态**,各自占独立标签页互不干扰 +(同 source 复用自己的标签页)。 + +前提:本机已有 chromium 二进制,没有会提示先装(`apt install chromium` 或等价)。 + +## 实现要点 + +- **搜索用 `cn.bing.com` 而不是 `www.bing.com`**:后者对程序化请求常回 302(同意/重定向页), + 根本拿不到结果块。 +- **标题取 `