trip-moments-skill 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/.agents/skills/trip-moments/SKILL.md +255 -0
  2. package/.agents/skills/trip-moments/assets/examples/editorial-bridge-gemini.png +0 -0
  3. package/.agents/skills/trip-moments/assets/photo-abstract-editorial/PROVENANCE.md +6 -0
  4. package/.agents/skills/trip-moments/assets/photo-abstract-editorial/prompt-zh.md +246 -0
  5. package/.agents/skills/trip-moments/references/ai-apis.md +153 -0
  6. package/.agents/skills/trip-moments/references/amap-geo.md +51 -0
  7. package/.agents/skills/trip-moments/references/api-config.md +129 -0
  8. package/.agents/skills/trip-moments/references/editorial-poster.md +44 -0
  9. package/.agents/skills/trip-moments/scripts/aiclient.py +547 -0
  10. package/.agents/skills/trip-moments/scripts/check_env.py +119 -0
  11. package/.agents/skills/trip-moments/scripts/crop.py +367 -0
  12. package/.agents/skills/trip-moments/scripts/enhance.py +79 -0
  13. package/.agents/skills/trip-moments/scripts/exif_gps.py +170 -0
  14. package/.agents/skills/trip-moments/scripts/film.py +106 -0
  15. package/.agents/skills/trip-moments/scripts/findphotos.py +173 -0
  16. package/.agents/skills/trip-moments/scripts/grid9.py +134 -0
  17. package/.agents/skills/trip-moments/scripts/imquality.py +203 -0
  18. package/.agents/skills/trip-moments/scripts/polaroid.py +94 -0
  19. package/.agents/skills/trip-moments/scripts/poster.py +281 -0
  20. package/.agents/skills/trip-moments/scripts/requirements.txt +3 -0
  21. package/.agents/skills/trip-moments/scripts/retouch.py +112 -0
  22. package/.agents/skills/trip-moments/scripts/review.py +527 -0
  23. package/.agents/skills/trip-moments/scripts/route_map.py +337 -0
  24. package/.agents/skills/trip-moments/scripts/select9.py +389 -0
  25. package/.agents/skills/trip-moments/scripts/selftest.py +225 -0
  26. package/.agents/skills/trip-moments/scripts/styles.py +147 -0
  27. package/README.md +163 -0
  28. package/bin/install.js +399 -0
  29. package/install.cmd +42 -0
  30. package/install.ps1 +11 -0
  31. package/install.sh +12 -0
  32. package/package.json +47 -0
@@ -0,0 +1,51 @@
1
+ # 高德 Web 服务 API 速查(route_map.py 用)
2
+
3
+ key 要求:lbs.amap.com → 应用 → **Web服务** 类型 key(见 api-config.md)。坐标系为 **GCJ-02**;
4
+ 照片 EXIF 里的 GPS 是 WGS-84,必须先经 exif_gps.py 转换,否则在国内偏移 300-600 米。
5
+
6
+ ## 地理编码(地名 → 坐标)
7
+
8
+ ```
9
+ GET https://restapi.amap.com/v3/geocode/geo?address=乌镇&key=<AMAP_KEY>
10
+ ```
11
+ - 响应:`geocodes[0].location = "120.489983,30.744797"`(经度在前)
12
+ - `geocodes[0].formatted` 是规范化地名,可用于卡片展示
13
+ - `status != "1"` 时看 `info`(常见:`INVALID_USER_KEY`、`DAILY_QUERY_OVER_LIMIT`)
14
+ - 地址尽量带城市:"乌镇" → "浙江省嘉兴市乌镇";歧义地名加前缀
15
+
16
+ ## 静态地图(直接返回一张 PNG)
17
+
18
+ ```
19
+ GET https://restapi.amap.com/v3/staticmap
20
+ ?location=<中心lon,lat>&zoom=<3..17>&size=750*440&scale=2&key=<AMAP_KEY>
21
+ ```
22
+
23
+ | 参数 | 说明 |
24
+ |---|---|
25
+ | `location` | 中心点 `lon,lat` |
26
+ | `zoom` | 级别 3-17;route_map.py 按点位范围自动拟合 |
27
+ | `size` | 最大 1024*1024,格式 `宽*高` |
28
+ | `scale` | 1 或 2(2 = 高清,返回像素翻倍:750*440 → 1500*880) |
29
+ | `markers` | (可选)`编号样式` 见下;route_map.py 不用它,图钉是本地自绘的 |
30
+ | `path` | (可选)`weight,color,alpha,线型;lon,lat;lon,lat;...` 画折线 |
31
+
32
+ 官方文档:<https://lbs.amap.com/api/webservice/guide/api/staticmaps>
33
+
34
+ 失败特征:HTTP 200 但 body 是 JSON(`{"status":"0","info":"INVALID_USER_SCOPED"}`)——
35
+ route_map.py 会识别并报错。常见 info:
36
+ - `INVALID_USER_SCOPED`:key 类型不对(选了"Web端JS"而不是"Web服务")
37
+ - `DAILY_QUERY_OVER_LIMIT`:当日配额用完
38
+ - `USER_DAILY_QUERY_OVER_LIMIT`:同上(个人认证版)
39
+
40
+ ## 拟合算法(route_map.py 内置,供调参)
41
+
42
+ Web-Mercator:世界像素 = 256 * 2^zoom;
43
+ `x = world * (lon+180)/360`,`y = world * (1 - ln(tan(π/4 + lat/2))/π) / 2`。
44
+ zoom 取"能包住所有点(留 20% padding)的最大整数级";图钉坐标用同一投影换算,
45
+ 所以和地图底图对齐(误差 ≤1 个像素级,GCJ-02 坐标直接参与计算)。
46
+
47
+ ## 扩展方向
48
+
49
+ - 真实道路路线(而非点间虚线):路径规划 API v5(`https://restapi.amap.com/v5/direction/...`)
50
+ 返回 steps[].polyline 坐标串,可拼进静态地图 `path` 或本地绘制
51
+ - 照片轨迹密集时:轨迹纠偏 API(`v4/grasproad/driving`)先把原始 GPS 顺到路上
@@ -0,0 +1,129 @@
1
+ # API Key 配置(一次性)
2
+
3
+ trip-moments 的功能按依赖分为三档,没配 key 也能用本地档。key 通过**环境变量**读取,不要写进任何文件。
4
+
5
+ ## 功能与 key 对照
6
+
7
+ | 功能 | 需要 | 环境变量 |
8
+ |---|---|---|
9
+ | 九图优选(本地打分)/ 批量裁剪 / 九宫格拼图 | 无 | — |
10
+ | 九图优选(AI 美感/构图打分,视觉模型) | 任一 AI 服务商 | `SILICONFLOW_API_KEY` / `ZHIPU_API_KEY` / `OPENAI_BASE_URL`+`OPENAI_API_KEY` |
11
+ | AI 修图(去路人/调色/风格化等指令编辑) | 硅基流动 或 百炼 | `SILICONFLOW_API_KEY` 或 `DASHSCOPE_API_KEY` |
12
+ | 修图预设:扩图/画质提升(expand/upscale) | 百炼 | `DASHSCOPE_API_KEY` |
13
+ | 杂志海报 panel 模式(AI 抽象画板,文生图) | 硅基流动 或 智谱 | 同上 |
14
+ | 杂志海报 full 模式(整张生成,实验性) | 硅基流动 或 百炼 | 同上 |
15
+ | 旅行路线图 | 高德 | `AMAP_KEY` |
16
+
17
+ > **推荐只配硅基流动一个 key**:视觉打分 + 图像编辑(Qwen-Image-Edit)+ 文生图全覆盖。
18
+ > 智谱的图像接口只支持文生图(**无图像输入**),所以只配智谱时修图不可用;
19
+ > 只配百炼时评分/画板不可用。三类 key 互相独立,按需组合。
20
+
21
+ ## 方案 A:硅基流动(推荐,一个 key 全覆盖)
22
+
23
+ 1. 打开 <https://siliconflow.cn> 注册(新用户送体验额度,部分小模型长期免费,图像编辑按量计费)
24
+ 2. 控制台 → API 密钥 → 新建,复制 `sk-...`
25
+ 3. `setx SILICONFLOW_API_KEY "sk-..."`(见下)
26
+ 4. 默认模型(可用环境变量覆盖):视觉 `zai-org/GLM-4.5V`(盲测选图品味最佳)、
27
+ 编辑 `Qwen/Qwen-Image-Edit-2509`、文生图 `Kwai-Kolors/Kolors`;
28
+ 硅基流动会定期下架旧模型(报 `403 Model disabled` 就是这种情况),
29
+ 去 <https://siliconflow.cn/models> 找当前在售型号,
30
+ `setx TRIP_VL_MODEL / TRIP_EDIT_MODEL / TRIP_T2I_MODEL` 覆盖即可,无需改代码
31
+ 5. 注意:生成的图片 URL **仅 1 小时有效**,技能脚本会立即下载转存,无需手动处理
32
+
33
+ ## 方案 B:豆包 Seedream / 火山方舟(修图质量第二梯队,接入零代码)
34
+
35
+ 火山方舟官方支持 OpenAI 兼容协议,我们的网关适配直接可用:
36
+
37
+ 1. 打开 <https://console.volcengine.com/ark> 注册并实名认证
38
+ 2. 开通模型(模型广场搜 Seedream / doubao-seedimage,记下**精确模型 ID**,形如 `doubao-seedream-4-0-250828`)
39
+ 3. API Key 管理 → 创建 key
40
+ 4. 设置(**用 TRIP_AI_* 而不是 OPENAI_***,显式网关优先级高于硅基流动):
41
+
42
+ ```cmd
43
+ setx TRIP_AI_BASE_URL "https://ark.cn-beijing.volces.com/api/v3"
44
+ setx TRIP_AI_API_KEY "你的方舟key"
45
+ setx TRIP_EDIT_MODEL "doubao-seedream-4-0-250828"
46
+ ```
47
+
48
+ 5. 之后 retouch.py/styles.py 不加参数即自动走豆包;想切回硅基流动删掉 TRIP_AI_* 两个变量即可
49
+
50
+ ## 方案 C:任意 OpenAI 兼容接口(自建/聚合网关)
51
+
52
+ 支持 one-api、new-api、vLLM、LM Studio 等任何暴露 `/chat/completions` 和
53
+ `/images/generations` 的服务:
54
+
55
+ ```cmd
56
+ setx OPENAI_BASE_URL "https://你的网关/v1"
57
+ setx OPENAI_API_KEY "sk-..."
58
+ :: 模型名按网关实际部署设置:
59
+ setx TRIP_VL_MODEL "Qwen/Qwen2.5-VL-72B-Instruct"
60
+ setx TRIP_EDIT_MODEL "Qwen/Qwen-Image-Edit"
61
+ setx TRIP_T2I_MODEL "Kwai-Kolors/Kolors"
62
+ ```
63
+
64
+ 编辑功能要求网关背后的图像模型支持 image 输入(Qwen-Image-Edit / FLUX.1-Kontext /
65
+ Kolors 图生图);不支持时修图会明确报错,评分/画板不受影响。
66
+ 也可以用 `TRIP_AI_BASE_URL` / `TRIP_AI_API_KEY`(优先于 OPENAI_*)避免与其他工具的配置冲突。
67
+
68
+ 自建网关接 OpenAI `gpt-image` 系列的示例(尺寸参数名会自动切为 `size`,
69
+ 也可用 `TRIP_SIZE_PARAM` 强制指定):
70
+
71
+ ```cmd
72
+ setx TRIP_AI_BASE_URL "https://mg.zichuanlan.top/v1"
73
+ setx TRIP_AI_API_KEY "sk-..."
74
+ setx TRIP_EDIT_MODEL "gpt-image-2"
75
+ setx TRIP_T2I_MODEL "gpt-image-2"
76
+ ```
77
+
78
+ > 透传网关注意:gpt-image 系列会自动切换到 OpenAI 原生协议——
79
+ > 尺寸参数用 `size`(可用 `TRIP_SIZE_PARAM` 强制指定),
80
+ > 图像编辑走 `/v1/images/edits` multipart 文件上传(而不是 JSON data URL),
81
+ > 因此网关无需做任何转换;前提是上游(cpa)本身支持原生 OpenAI 图像接口。
82
+ >
83
+ > 网关也接了 Gemini 图像模型(nano-banana 族)的,注意它们只支持 chat 协议
84
+ > (图进图出,`/images/*` 会被网关拒绝),本技能已自动适配:
85
+ > `setx TRIP_EDIT_MODEL "gemini-3.1-flash-image"` 即可。
86
+ >
87
+ > 视觉评分同样可走网关(实测 gemini-3.8-flash-high / gemini-3.6-flash-high /
88
+ > claude-sonnet-4-6 均可,3.8 对光线和主体细节识别最好):
89
+ > `setx TRIP_VL_MODEL "gemini-3.8-flash-high"`。显式配了网关后评分/画板/修图
90
+ > 全部优先走网关,想回硅基流动删掉 `TRIP_AI_*` 即可。
91
+
92
+ ## 方案 D:智谱 BigModel(评分 + 海报画板)
93
+
94
+ 1. 打开 <https://bigmodel.cn> 注册/登录(如果你在用 ZCode 的 GLM 套餐,账号体系相通,但 **API key 需要在开放平台单独创建并按量计费**)
95
+ 2. 右上角 → API Keys → 新建,复制 `sk-...` 形式的 key
96
+ 3. `setx ZHIPU_API_KEY "sk-..."`
97
+ 4. 费用参考:GLM-Image ≈ 0.1 元/张;`glm-4v-flash` 视觉模型免费,选图打分基本零成本
98
+ 5. 局限:不能修图(无图像输入接口)
99
+
100
+ ## 方案 E:阿里云百炼(修图预设最全)
101
+
102
+ 1. 打开 <https://bailian.console.aliyun.com> 开通(需阿里云实名)
103
+ 2. 控制台 → API-KEY 管理 → 创建,复制 `sk-...`
104
+ 3. 模型:`wanx2.1-imageedit`(指令编辑/擦除/扩图/风格化/上色/画质提升)
105
+ 4. 费用:按张计费(约 0.14 元/张量级,以控制台价格页为准)
106
+
107
+ ## 高德开放平台(路线图)
108
+
109
+ 1. 打开 <https://lbs.amap.com> 注册并完成**个人实名认证**
110
+ 2. 控制台 → 应用管理 → 创建新应用 → 添加 Key,服务平台选 **Web服务**
111
+ 3. 复制 key
112
+ 4. 费用:个人开发者有免费日配额(地理编码/静态地图数千次/日),旅行用途足够
113
+
114
+ ## 设置环境变量(Windows)
115
+
116
+ 命令行(cmd 或 Git Bash 调 cmd)执行,**设置后重开终端/ZCode 才生效**:
117
+
118
+ ```cmd
119
+ setx SILICONFLOW_API_KEY "sk-xxxxxxxx"
120
+ setx AMAP_KEY "你的高德key"
121
+ ```
122
+
123
+ PowerShell 当前会话临时验证用:
124
+
125
+ ```powershell
126
+ $env:SILICONFLOW_API_KEY = "sk-xxx"
127
+ ```
128
+
129
+ 验证:`python -c "import os; print(bool(os.environ.get('SILICONFLOW_API_KEY')))"`
@@ -0,0 +1,44 @@
1
+ # 杂志风海报提示词(photo abstract editorial)
2
+
3
+ 思路借鉴 [photo-abstract-editorial](https://github.com/ZzzLc0405/photo-abstract-editorial)
4
+ (5.4k star 的提示词型 skill):**原照片保持不动,是唯一内容来源**;下方/旁边配一块
5
+ 从照片"长出来"的抽象画板;再加一个诗意的英文标题。
6
+
7
+ > 借鉴的是构图思想,提示词为原创。原仓库许可证仅限个人/教育/非商用,勿照抄其文案、
8
+ > 勿将产出用于商业用途。
9
+
10
+ ## 两条核心原则(生成时必须守住)
11
+
12
+ 1. **照片是唯一内容来源**:抽象画板的颜色、形状只能来自照片里真实存在的
13
+ 空间关系、构图与色彩,不引入照片外的新元素
14
+ 2. **克制**:大面积留白,形状少而大,两三种主色,无渐变阴影,无杂乱细节
15
+
16
+ ## panel 模式(poster.py 默认,AI 只画"画板",版式本地合成)
17
+
18
+ 提取照片主色后,向 GLM-Image 发送的画板提示词(脚本已内置,可在此调):
19
+
20
+ ```
21
+ 极简抽象画板,横向长条构图,杂志编辑风格。仅使用以下颜色:<#RRGGBB ×4>,
22
+ 以及大面积米白色(#F5F1E8)留白。画面元素:2-3 层柔和的水平色带,一个大圆弧形,
23
+ 少量细线与小圆点。扁平几何,安静克制,无文字,无照片元素,无渐变阴影。
24
+ ```
25
+
26
+ 调法:想要更"海"就用长横带+大圆弧;想要"山"把横带换成斜切三角;城市用竖细线+小方点。
27
+
28
+ ## full 模式(整张生成,实验性)
29
+
30
+ ```
31
+ 把这张照片排成杂志内页:照片完整保留在上半部,不要改动照片内容;
32
+ 下半部用照片中出现过的颜色生成极简抽象画板(色带、圆弧、细线、圆点);
33
+ 米白底色,留白充足,顶部小号英文衬线字幕,底部加入英文标题"<TITLE>"。
34
+ 无水印,无多余文字。
35
+ ```
36
+
37
+ ## 标题写作(由 agent 完成,不要用脚本默认值)
38
+
39
+ 英文短语,2-5 个词,全小写或首字母大写,意象必须来自照片本身,避免陈词。
40
+ 参考风格:`Slow Tide` / `Light Between Buildings` / `Salt & Morning Fog` /
41
+ `The Last Blue Hour` / `Windows of Lijiang`。
42
+
43
+ 版式参数:照片区约占上 46%,画板全宽占下部;标题衬线体 84px,眉题全大写 24px,
44
+ 主色短线分隔。比例 3:4(1080x1440),朋友圈竖图直接发。