SuperAPI AI 工具集

seed-hypermedia-read

通用与其它

查看项目

更新于 10-16 04:07

技能介绍

用途

本技能提供对 Seed Hypermedia 的只读 gRPC 访问能力,用于查询文档、评论、实体、账户和服务器元数据。当用户希望获取或查看 Seed Hypermedia 数据时适用。若用户需要写入、更新或删除数据,应拒绝并转交给 seed-hypermedia-write 技能。

环境准备

首先检查 grpcurl 是否已安装:

which grpcurl

若未安装,可按平台安装:

macOS:

brew install grpcurl

Linux(Debian/Ubuntu):

sudo apt-get install grpcurl

Linux(Fedora/RHEL):

sudo dnf install grpcurl

Linux(Arch):

sudo pacman -S grpcurl

也可从 https://github.com/fullstorydev/grpcurl/releases 下载二进制文件。

服务器端点

Seed gRPC 服务器运行在:

  • 开发环境:localhost:58002
  • 生产环境:localhost:56002

使用前先确认哪个可用。

Hypermedia IRI 格式

文档 IRI:hm://<account>/<path>?v=<version>#<block>&l

  • 仅 <account> 为必填(例如 z6Mk...)
  • <path>:可选文档路径
  • ?v=<version>:可选指定版本
  • #<block>:可选区块 ID
  • &l:可选最新版本标志

评论 IRI:hm://<author>/<tsid>

  • <author>:账户标识符
  • <tsid>:基于时间戳的评论 ID

工作流程

1. 检查服务器

grpcurl -plaintext localhost:58002 list  # 先试开发环境
grpcurl -plaintext localhost:56002 list  # 再试生产环境

2. 初始 API 发现(每会话一次)

对于不熟悉的命令,使用反射发现 API 结构。注意:一旦发现某个服务/方法结构,可复用该知识而无需再次反射。假设服务器不会变化。若后续请求因结构问题失败(阅读错误信息),可再次进行反射。

# 列出所有服务
grpcurl -plaintext <host:port> list

# 描述服务以查看其方法
grpcurl -plaintext <host:port> describe <service.name>

# 描述方法以查看签名
grpcurl -plaintext <host:port> describe <service.name.MethodName>

# 描述消息结构以查看必填字段
grpcurl -plaintext <host:port> describe <message.type>

3. 解析用户意图

  • 提取所需的 Seed 操作
  • 若请求为写入/更新/删除,拒绝并转交 seed-hypermedia-write(不调用任何 gRPC 方法)
  • 解析 IRI 以获取 account、path、version 等
  • 若所需服务/方法未知,使用反射发现(一次)
  • 判断需要单次还是多次调用

4. 发起 RPC 调用

单次操作:

grpcurl -plaintext -d '{"field": "value"}' <host:port> <service/Method>

复合操作(多个有依赖的调用):

# 从第一次调用获取数据
RESULT=$(grpcurl -plaintext -d '{...}' <host:port> <service1/Method1>)

# 使用 jq 提取所需字段
VALUE=$(echo "$RESULT" | jq -r '.fieldName')

# 在下次调用中使用
grpcurl -plaintext -d "{\"field\": \"$VALUE\"}" <host:port> <service2/Method2>

5. 通过 IPFS 下载引用的媒体

当文档引用媒体文件(音频/视频/图像/文档)时,通常是 IPFS URI,如:

ipfs://<cid>

要下载字节,使用本地 HTTP 网关(非 gRPC):

  • URL 格式:http://localhost:<httpport>/ipfs/<cid>
  • 端口映射:httpport = grpcport - 1
    • 开发环境:gRPC 58002 → HTTP 58001
    • 生产环境:gRPC 56002 → HTTP 56001

示例:

curl -L "http://localhost:58001/ipfs/<cid>" --output /tmp/downloaded-file

根据媒体类型选择扩展名。

IRI 解析

文档 IRI hm://<account>/<path>?v=<version>#<block>&l:

  • account:hm:// 之后到第一个 /、?、# 或 & 之前的文本
  • path:第一个 / 之后到 ?、# 或 & 之前的文本(若无则为空字符串)
  • version:?v= 之后的值(若存在)
  • block:# 之后的值(若存在)
  • latest:检查是否有 &l 标志

评论 IRI hm://<author>/<tsid>:

  • author:hm:// 之后到 / 之前的文本
  • tsid:/ 之后的文本

CLI 导出

若要将文档导出为 Markdown(带 frontmatter 和 block ID),使用 Seed CLI 而非 gRPC。CLI 的 document get 命令默认输出可往返兼容的 Markdown:

if command -v seed-cli &>/dev/null; then
  SEED_CLI="seed-cli"
else
  SEED_CLI="bun run frontend/apps/cli/src/index.ts"
fi

# 默认输出:带 frontmatter 和 block ID 的 markdown
$SEED_CLI document get hm://z6Mk.../my-doc

# 写入文件
$SEED_CLI document get hm://z6Mk.../my-doc -o doc.md

# 结构化输出(JSON/YAML)
$SEED_CLI document get hm://z6Mk.../my-doc --json

要将导出的 Markdown 再用于写入操作,请参见 seed-hypermedia-write 技能。

关键规则

  • 仅限只读:本技能绝不能调用写入/更新/删除端点。拒绝任何会修改 Seed 数据的请求并转交 seed-hypermedia-write。
  • 每会话发现一次:使用反射了解 API 结构,然后复用该知识。服务器在会话期间不太可能变化。
  • 仔细解析 IRI:按上述格式提取所有组成部分。
  • 省略可选字段:若 IRI 组成部分缺失,不要发送它(连空字符串也不要)。
  • 首次使用前检查签名:使用 describe 了解方法参数。
  • 高效链式调用:对于复合操作,在获取所需数据的同时尽量减少调用。
  • 处理分页:检查 page_size/page_token 字段,page_size 默认 50-100。
  • 汇总大响应:对于超过 10KB 的响应,仅展示关键数据。
  • 优先使用账户名称而非账户 ID:在指代独立账户/作者时(例如在 “Author”、“Account”、“Owner” 字段中),不要向用户展示原始账户 ID。而应使用服务器的账户查找/搜索 RPC 解析出人类友好的账户名称(如需可通过反射发现)。例外:在显示文档 IRI 或评论 IRI 时(例如 hm://<account>/...),保持 <account> 部分不变,因为它是 URL 的一部分;如有帮助,可在 IRI 旁单独展示解析出的显示名称。

响应处理

  • 提取关键 Seed 元数据(名称、作者、时间戳)
  • 用用户友好的方式解释错误
  • 若方法不存在,使用反射寻找替代方法

适用场景与限制

本技能适用于查询和查看 Seed Hypermedia 中的文档、评论、实体、账户和服务器元数据。限制:仅支持只读操作,不执行任何写入、更新或删除;依赖本地运行的 Seed gRPC 服务器和 grpcurl 工具;媒体文件下载需通过本地 HTTP 网关而非 gRPC。