Community图像github.com

znas-photos

调用 Zettos 照片 API 进行照片搜索、时间线分桶、用户相册、相似照片任务、照片地图以及 AI 识别相册。

znas-photos 是什么?

znas-photos 是一个专为 NAS 照片管理设计的 AI 助手技能,支持通过 Zettos CLI (`znas photos`) 命令高效执行照片搜索、浏览时间线和地图数据、管理用户相册、下载相册、查找相似照片以及查看 AI 识别的人物/宠物相册等操作。该技能遵循逐步发现规则,优先使用 `--help` 和 `znas schema` 来准确获取路由、参数和负载类型,避免猜测。它特别强调了安全规则,要求在执行写入或删除操作前必须读取当前状态,并在操作后重新读取以确认结果。技能文档详细列出了 `album`、`feature`、`map`、`photo` 和 `setting` 等核心功能的子命令、所需参数、常见陷阱以及二进制输出规则,确保开发者能安全、精准地与后端照片服务交互。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/zettlab/zettos-ainas-cli/tree/main/skills/znas-photos

Installed? Explore more 图像 skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

znas photos

当用户询问 NAS 照片相关操作时使用此技能:搜索照片或视频、浏览时间线/地图数据、管理相册、下载相册、查找相似照片,或查看 AI 识别的人物/宠物相册。

此技能的用途

  • 读取和更新照片配置路径。
  • 搜索已索引的照片/视频并读取时间线分桶。
  • 创建、列出、更新、删除和下载用户相册。
  • 开始/列出/删除相似照片扫描任务并检查组。
  • 读取照片地图集群、位置和地图开关状态。
  • 读取和管理 AI 识别的特色相册,例如人物或宠物。

发现规则

  1. 优先使用逐步 CLI 发现,避免猜测:
    • znas photos --help
    • znas photos <feature> --help
    • znas photos <feature> <command> --help
  2. 当需要路由清单、负载类型、示例以及二进制/写入标志的 JSON 信息时,使用 znas schema photos。
  3. 保持后端字段名称与帮助/模式中显示的一致:例如 fileIds、taskId、groupId、albumId、album_id、fIds 和 eaHash。
  4. 不要盲目将所有 ID 转换为字符串。保留先前 API 读取返回的字段名称和值形状。

安全规则

  1. 每次写入或删除前,先读取当前状态。
  2. 写入/删除成功后,在报告最终成功前重新运行匹配的读取命令。
  3. 当 znas photos ... 提供路由时,不要使用主机本地工具或直接的内部 curl 进行照片控制平面操作。
  4. 照片后端不提供通用的试运行模式。对于破坏性操作,先精确检查目标并使变更范围保持狭窄。
  5. 对于异步的相似照片扫描,任务创建仅将工作加入队列。使用 similar task-list 和组读取来获取状态。
  6. 普通相册路由和 AI 特色相册路由是不同的表面;不要混合使用 album_id 和 albumId。

二进制输出规则

标记为二进制的路由需要 -o <file> 以确保标准输出保持可解析:

  • znas photos album download ... -o album.zip
  • znas photos photo stream ... -o live.mov
  • znas photos feature avatar ... -o avatar.jpg

如果命令失败,CLI 会在写入文件前验证 JSON 错误响应。

常见工作流程

读取照片状态

znas photos setting config
znas photos photo search --json '{"index":0,"size":20}'
znas photos photo timeline --params '{"time_tpl":"YYYY-MM","sort_order":1}'

相册工作流程

znas photos album list --params '{"index":0,"size":20}'
znas photos album create --json '{"name":"Trip"}'
znas photos album add-photos --json '{"album_id":123,"fileIds":["456"]}'
znas photos album get --params '{"album_id":123}'
znas photos album download --json '{"album_id":123,"download_name_prefix":"Trip"}' -o trip.zip

相似照片

znas photos similar task-list --params '{"index":0,"size":20,"imgSize":20,"groupSize":4}'
znas photos similar task-create --json '{"dirPath":["/personal/Photos"]}'
znas photos similar group-list --params '{"taskId":123,"index":0,"size":20,"imgSize":20}'
znas photos similar group-detail --params '{"taskId":123,"groupId":456,"offset":0,"size":50}'

地图和 AI 特色相册

znas photos map last-location
znas photos map bounds --params '{"minLat":30,"maxLat":31,"minLon":120,"maxLon":121,"zoomLevel":10}'
znas photos feature progress --params '{"taskType":1}'
znas photos feature album-list --params '{"taskType":1,"index":0,"size":20,"isHide":false}'
znas photos feature album-photos --params '{"albumId":123,"index":0,"size":50}'

功能

album

  • POST download -> /downloadFiles (auth)
    • 标志:binary
    • 规范名称:photos album download
    • 负载:--json
    • 示例:znas photos album download --json '{"album_id":123,"download_name_prefix":"album"}' -o album.zip
    • 陷阱:下载可以使用 album_id 或 str_paths;它返回二进制 zip 数据,需要 -o <file>。
  • POST create -> /album/createAlbum (auth)
    • 标志:write
    • 负载:--json;必需:name
    • 示例:znas photos album create --json '{"name":"Trip","description":"2026 trip"}'
    • 陷阱:先创建相册,然后用 album add-photos 添加照片。
  • PUT update -> /album/updateAlbum (auth)
    • 标志:write
    • 负载:--json;必需:id
    • 示例:znas photos album update --json '{"id":123,"name":"Trip edited"}'
    • 陷阱:更新普通相册时使用后端字段 id,而不是 album_id。
  • DELETE delete -> /album/deleteAlbum (auth)
    • 标志:destructive
    • 负载:--json;必需:id
    • 示例:znas photos album delete --json '{"id":123}'
    • 陷阱:仅在读取相册后删除它;除非后端行为改变,否则这不意味着删除原始文件。
  • GET list -> /album/listAlbum (auth)
    • 负载:--params;必需:size
    • 示例:znas photos album list --params '{"index":0,"size":20,"sort_type":2,"sort_order":1}'
    • 陷阱:List 是 GET 查询;使用 index 和 size,而不是 JSON 主体。
  • POST add-photos -> /album/addPhotoToAlbum (auth)
    • 标志:write
    • 负载:--json;必需:album_id
    • 示例:znas photos album add-photos --json '{"album_id":123,"fileIds":["456"]}'
    • 陷阱:后端字段是 fileIds(大写 I);当你有精确的 NAS 路径时也支持 paths。
  • DELETE remove-photos -> /album/removeAlubmPhotos (auth)
    • 标志:destructive
    • 规范名称:photos album remove-photos
    • 负载:--json;必需:album_id
    • 示例:znas photos album remove-photos --json '{"album_id":123,"fileIds":["456"]}'
    • 陷阱:CLI 隐藏了上游拼写错误 removeAlubmPhotos;使用语义命令 remove-photos。
  • GET get -> /album/getAlbum (auth)
    • 负载:--params;必需:album_id
    • 示例:znas photos album get --params '{"album_id":123}'
    • 陷阱:相册详情是 GET 查询;通过 --params 传递 album_id。

feature

  • GET progress -> /feature/process (auth)
    • 负载:--params
    • 示例:znas photos feature progress --params '{"taskType":1}'
    • 陷阱:省略 taskType 会读取后端默认进度;当用户明确询问人脸或宠物时传递它。
  • DELETE clear -> /feature/clear (auth)
    • 标志:destructive
    • 负载:--json;必需:taskType
    • 示例:znas photos feature clear --json '{"taskType":1}'
    • 陷阱:这将重置指定任务类型的已发现特色相册数据;先读取进度/列表。
  • GET switch -> /feature/switch (auth)
    • 负载:--params;必需:type
    • 示例:znas photos feature switch --params '{"type":1}'
    • 陷阱:开关读取使用字段 type;任务相册过滤器使用 taskType。
  • PUT set-switch -> /feature/switch (auth)
    • 标志:write
    • 负载:--json;必需:type, switch
    • 示例:znas photos feature set-switch --json '{"type":1,"switch":1}'
    • 陷阱:切换后,在报告最终状态前重新读取 feature switch。
  • PUT set-config -> /feature/switch/config (auth)
    • 标志:write
    • 负载:--json;必需:type, hideNum
    • 示例:znas photos feature set-config --json '{"type":1,"hideNum":5}'
    • 陷阱:请精确使用 hideNum;此后端不接受蛇形命名法。
  • GET album-list -> /feature/album/list (auth)
    • 负载:--params;必需:index, size
    • 示例:znas photos feature album-list --params '{"taskType":1,"index":0,"size":20,"isHide":false}'
    • 陷阱:已识别的特色相册使用驼峰式字段,如 taskType 和 isHide。
  • GET album-count -> /feature/album/count (auth)
    • 负载:--params
    • 示例:znas photos feature album-count --params '{"taskType":1,"isHide":false}'
    • 陷阱:当你需要相册标识而不是仅计数时,使用 album-list。
  • GET relation -> /feature/relation (auth)
    • 负载:--params
    • 示例:znas photos feature relation --params '{"taskType":1}'
    • 陷阱:关系是已识别相册的选项;在更新关系文本前先读取它们。
  • GET album-get -> /feature/album (auth)
    • 负载:--params;必需:albumId
    • 示例:znas photos feature album-get --params '{"albumId":123}'
    • 陷阱:特色相册 ID 使用字段 albumId,而普通相册详情使用 album_id。
  • PUT album-update -> /feature/album (auth)
    • 标志:write
    • 负载:--json;必需:albumId
    • 示例:znas photos feature album-update --json '{"albumId":123,"name":"Alice"}'
    • 陷阱:仅当你从先前读取中获得了值时,才使用 coverId、coverPath 或 relation。
  • POST album-hide -> /feature/album/hide (auth)
    • 标志:write
    • 负载:--json;必需:albumIds, isHide
    • 示例:znas photos feature album-hide --json '{"albumIds":[123],"isHide":true}'
    • 陷阱:更改 isHide 后,验证隐藏与可见列表。
  • POST album-merge -> /feature/album/merge (auth)
    • 标志:destructive
    • 负载:--json;必需:albumIds, targetId
    • 示例:znas photos feature album-merge --json '{"albumIds":[123,124],"targetId":123}'
    • 陷阱:先读取所有源相册;targetId 必须是保留的相册。
  • GET album-photos -> /feature/album/photos (auth)
    • 负载:--params;必需:albumId, index, size
    • 示例:znas photos feature album-photos --params '{"albumId":123,"index":0,"size":50}'
    • 陷阱:对已识别相册使用此方法;对普通用户相册使用 album get。
  • PUT album-photo-update -> /feature/album/photo (auth)
    • 标志:write
    • 负载:--json;必需:albumId, fIds
    • 示例:znas photos feature album-photo-update --json '{"albumId":123,"fIds":[456]}'
    • 陷阱:这会移动已识别的特色照片行;fIds 是来自 album-photos 的特色行 ID。
  • DELETE album-photo-delete -> /feature/album/photo (auth)
    • 标志:destructive
    • 负载:--json;必需:fIds
    • 示例:znas photos feature album-photo-delete --json '{"fIds":[456]}'
    • 陷阱:先读取 album-photos 并重用返回的特色行 ID。
  • GET avatar -> /feature/avatar (auth)
    • 标志:binary
    • 负载:--params;必需:eaHash
    • 示例:znas photos feature avatar --params '{"eaHash":"<hash>"}' -o avatar.jpg
    • 陷阱:此路由返回图像文件;始终传递 -o <file>。

map

  • GET forward -> /map/forward (auth)
    • 负载:--params;必需:coords, model
    • 示例:znas photos map forward --params '{"coords":"116.3,39.9","model":1}'
    • 陷阱:多个坐标在 coords 内以分号分隔。
  • GET switch -> /map/switch (auth)
    • 负载:--params;必需:type
    • 示例:znas photos map switch --params '{"type":2}'
    • 陷阱:地图开关使用特性请求字段 type;当前地图开关类型通常是 2。
  • PUT set-switch -> /map/switch (auth)
    • 标志:write
    • 负载:--json;必需:type, switch
    • 示例:znas photos map set-switch --json '{"type":2,"switch":1}'
    • 陷阱:写入后,在报告最终状态前重新读取 map switch。
  • GET last-location -> /map/lastLocation (auth)
    • 负载:none
    • 示例:znas photos map last-location
    • 陷阱:空结果可能意味着没有索引照片具有可用的 GPS 数据。
  • GET bounds -> /map/bounds (auth)
    • 负载:--params;必需:minLat, maxLat, minLon, maxLon, zoomLevel
    • 示例:znas photos map bounds --params '{"minLat":30,"maxLat":31,"minLon":120,"maxLon":121,"zoomLevel":10}'
    • 陷阱:边界使用驼峰式的纬度/经度字段;最小值必须小于最大值。
  • GET geohash -> /map/geohash (auth)
    • 负载:--params;必需:geohash, index, size
    • 示例:znas photos map geohash --params '{"geohash":"wtw3;wtw6","index":0,"size":20,"sortOrder":1}'
    • 陷阱:多个 geohash 在单个 geohash 字符串中以分号分隔。
  • GET countries -> /map/location/country (auth)
    • 负载:--params;必需:index, size, viewType, citySize
    • 示例:znas photos map countries --params '{"index":0,"size":20,"viewType":1,"citySize":5}'
    • 陷阱:使用此路由获取分组的位置概览;选择国家后使用 cities。
  • GET cities -> /map/location/city (auth)
    • 负载:--params;必需:country, offset, size
    • 示例:znas photos map cities --params '{"country":"China","offset":0,"size":20}'
    • 陷阱:城市查找需要 countries 返回的精确 country 字符串。
  • GET city-photos -> /map/location/city/photo (auth)
    • 负载:--params;必需:addressId, index, size
    • 示例:znas photos map city-photos --params '{"addressId":123,"index":0,"size":50}'
    • 陷阱:使用城市响应中的 addressId,而不是显示的城市名称。

photo

  • POST search -> /photos/search (auth)
    • 负载:--json;必需:index, size
    • 示例:znas photos photo search --json '{"index":0,"size":20,"keyword_search":"beach"}'
    • 陷阱:照片搜索是 POST JSON;保持后端字段名称,如 keyword_search、album_ids 和 city_ids。
  • GET timeline -> /photos/getTimeBuckets (auth)
    • 负载:--params
    • 示例:znas photos photo timeline --params '{"time_tpl":"YYYY-MM","sort_order":1}'
    • 陷阱:时间线是 GET 路由;使用 --params 传递过滤器,而不是 --json。
  • GET stream -> /photos/stream (auth)
    • 标志:binary
    • 负载:--params;必需:id
    • 示例:znas photos photo stream --params '{"id":123456}' -o live.mov
    • 陷阱:此路由返回二进制实况照片数据;始终传递 -o <file>。

setting

  • POST init -> /setting/init (auth)
    • 标志:write
    • 负载:--json;必需:init_path
    • 示例:znas photos setting init --json '{"init_path":"/personal/Photos"}'

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能