Hermes 自我进化生成自驾旅行路书 Skill 分享:用 TaoToken 统一 Key 打通 OSRM 与 Leaflet 配置
1. 从一次真实的自驾路书生成说起Hermes 自我进化生成自驾旅行路书 Skill本质是把「行程记录 → 路线规划 → 地图渲染 → 路书输出」这条链路固化成一个可复用的技能包让模型在对话里就能调用 OSRM 算真实道路轨迹、用 Leaflet 渲染交互地图最后吐出一份能打印的 HTML/PDF 路书。它适合两类人一类是经常跑长途、想把沿途记录自动整理成册的自驾玩家另一类是需要把路径规划与地图渲染接进自己 Agent 工作流的开发者。这篇不讲概念直接给可复制的config.toml、settings.json骨架再演示一次 Skill 调用 OSRM 生成路线、Leaflet 渲染路书的完整验证动作目标是一份能跑通的自驾路书生成配置。我试过把 OSRM 的路径接口和 Leaflet 的瓦片渲染拆成两个脚本结果 Key 管理、超时重试、坐标纠偏全散在各处改一个参数要翻三个文件。后来把模型调用统一收敛到 TaoToken 的 API 通道Skill 里只保留业务逻辑配置项集中到一份config.toml维护成本立刻降下来。下面按「问题场景 → 前置准备 → 可复制配置 → 验证请求 → 错排查 → 分流」的顺序展开你可以直接照着改路径和坐标表。2. TaoToken 前置统一 Key 与 API 通道Skill 要跑起来绕不开两件事一是模型侧要能稳定拿到对话/推理能力二是脚本侧要能访问 OSRM 和瓦片服务。前者用 TaoToken 的统一 Key 解决后者是公开接口不需要鉴权。TaoToken 在这里的角色是「一个 Key 打通模型调用」你不用为每个 Skill 单独配一套凭证。先到控制台建 Key地址是 https://taotoken.net/api-keys 注意这个 deep link 已经带了utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite点进去直接是密钥管理页。建完 Key 后模型对话入口在 https://taotoken.net/api 对应的对话页接入文档在 https://taotoken.net/doc coding-plan 在 https://taotoken.net/coding-plan console 在 https://taotoken.net/console 。官网首页 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 可以看整体能力但配置时优先用上面几个具体页面。注意API 基础地址统一写https://taotoken.net/api不要在后面拼 UTM 参数鉴权头用Authorization: Bearer 你的Key。Key 只放环境变量或本地配置文件别提交到仓库。Skill 目录结构建议照抄这份骨架后面所有脚本都按这个路径引用travel/roadbook/ ├── SKILL.md # 主技能文件使用说明 ├── config.toml # 统一配置模型通道 路径 坐标表 ├── settings.json # 运行时参数超时/重试/输出目录 └── scripts/ ├── generate_map.py # 生成 OSRM 路线图Leaflet 交互式 HTML ├── generate_roadbook_html.py # 生成路书 HTML 打印版 └── lookup_elevation.py # 查询/填充各地点海拔3. 可复制配置config.toml 与 settings.json3.1 config.toml 骨架这份配置把模型通道、OSRM 端点、坐标表、输出路径全部集中。坐标表是路书生成的关键OSRM 只认经纬度城市名要先映射成坐标。# travel/roadbook/config.toml [model] # TaoToken 统一 Key 通道 base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY # 从环境变量读取不写死 model claude-sonnet # 按需替换为可用模型名 timeout_seconds 60 max_retries 3 [osrm] # 公开演示端点生产环境请自建 route_base https://router.project-osrm.org/route/v1/driving profile driving overview full geometries geojson request_interval 0.6 # 每次请求间隔避免被限流 [leaflet] tile_url https://webrd{s}.is.autonavi.com/appmaptile?langzh_cnsize1scale1style8x{x}y{y}z{z} tile_subdomains [1, 2, 3, 4] tile_opacity 0.65 [paths] roadbook_md /mnt/c/Users/zhou/Desktop/成都自驾西藏路书.md output_map_html /mnt/c/Users/zhou/Desktop/成都自驾西藏_OSRM路线图.html output_roadbook_html /mnt/c/Users/zhou/Desktop/成都自驾西藏路书_打印版.html photos_dir /mnt/c/Users/zhou/Desktop/成都自驾西藏_全部照片/ route_cache /tmp/roadbook_routes_cache.json [coords] # 城市/景点经纬度表OSRM 计算依赖它 成都 [104.07, 30.57] 雅江 [101.02, 30.03] 如美镇 [98.42, 30.08] 波密 [95.77, 30.87] 拉萨 [91.10, 29.65] 日喀则 [89.58, 29.28] 珠峰 [86.93, 28.53] 那曲 [91.00, 31.47] 羊卓雍错 [90.35, 29.13]3.2 settings.json 骨架settings.json放运行时可变参数和config.toml分开方便不改主配置就调行为。{ runtime: { log_level: INFO, dry_run: false, cache_enabled: true }, osrm: { connect_timeout: 10, read_timeout: 20, retry_on_fail: 2 }, render: { map_height: calc(100vh - 110px), line_weight: 4, line_opacity: 0.85, return_dash: 8, 8 }, roadbook: { page_size: A4, include_cover: true, include_summary_table: true, photo_columns: 3 } }3.3 读取配置的公共模块在scripts/下加一个load_config.py让三个脚本共用避免路径写死# scripts/load_config.py import os, json try: import tomllib # Python 3.11 except ImportError: import tomli as tomllib BASE os.path.dirname(os.path.dirname(os.path.abspath(__file__))) def load_config(): with open(os.path.join(BASE, config.toml), rb) as f: cfg tomllib.load(f) with open(os.path.join(BASE, settings.json), encodingutf-8) as f: cfg[runtime_settings] json.load(f) cfg[model][api_key] os.environ.get(cfg[model][api_key_env], ) return cfg if __name__ __main__: c load_config() print(base_url:, c[model][base_url]) print(coords count:, len(c[coords]))跑一下确认配置能读出来export TAOTOKEN_API_KEY你的Key python scripts/load_config.py预期输出base_url: https://taotoken.net/api和坐标数量说明配置链路通了。4. 验证请求Skill 调用 OSRM 生成路线 Leaflet 渲染4.1 用 OSRM 算一段真实轨迹先单独验证 OSRM 能返回轨迹点这是路书地图的底座。下面这段直接读config.toml的坐标表算「成都 → 雅江」的驾驶路线# scripts/verify_osrm.py import json, time, urllib.request from load_config import load_config cfg load_config() osrm cfg[osrm] coords cfg[coords] def get_route(start, end): lon1, lat1 coords[start] lon2, lat2 coords[end] url (f{osrm[route_base]}/{lon1},{lat1};{lon2},{lat2} f?overview{osrm[overview]}geometries{osrm[geometries]}) req urllib.request.Request(url, headers{User-Agent: RoadbookBot/1.0}) with urllib.request.urlopen(req, timeout20) as resp: data json.loads(resp.read().decode()) if data.get(code) Ok and data[routes]: r data[routes][0] return r[geometry][coordinates], r[distance] / 1000 return None, 0 pts, km get_route(成都, 雅江) print(f轨迹点数: {len(pts)}, 里程: {km:.1f} km) print(首点:, pts[0], 末点:, pts[-1]) time.sleep(osrm[request_interval])运行后你会看到类似轨迹点数: 4821, 里程: 356.2 km的输出。如果返回code不是Ok多半是坐标写反了OSRM 要求经度,纬度不是纬度,经度这是最常见的坑。4.2 用 Leaflet 渲染成交互地图拿到轨迹点后套进 Leaflet 模板生成 HTML。核心是把 OSRM 返回的[lon, lat]转成 Leaflet 需要的[lat, lon]# scripts/verify_leaflet.py import json from load_config import load_config from verify_osrm import get_route cfg load_config() lc cfg[leaflet] pts, km get_route(成都, 雅江) latlngs [[p[1], p[0]] for p in pts] # 关键经纬度对调 html f!DOCTYPE html html langzh-CNheadmeta charsetUTF-8 link relstylesheet hrefhttps://unpkg.com/leaflet1.9.4/dist/leaflet.css/ script srchttps://unpkg.com/leaflet1.9.4/dist/leaflet.js/script style#map{{height:600px}}/style/head bodydiv idmap/div script var map L.map(map).setView([30.0, 100.0], 7); L.tileLayer({lc[tile_url]}, {{ subdomains: {json.dumps(lc[tile_subdomains])}, opacity: {lc[tile_opacity]} }}).addTo(map); var line {json.dumps(latlngs)}; L.polyline(line, {{color: #ff6b6b, weight: 4, opacity: 0.85}}).addTo(map); map.fitBounds(L.polyline(line).getBounds()); /script/body/html with open(cfg[paths][output_map_html], w, encodingutf-8) as f: f.write(html) print(地图已生成:, cfg[paths][output_map_html])用浏览器打开生成的 HTML你应该看到一条从成都到雅江的红色轨迹底图是中文标注的高德瓦片。如果只看到空白地图没有线检查latlngs是否为空——通常是 OSRM 请求失败但没抛异常。4.3 把 Skill 挂到 Hermes 里调用SKILL.md的 frontmatter 决定 Hermes 怎么识别这个技能--- name: roadbook description: 自驾旅游路书完整工具箱 — 路书创建/更新、照片归档、路线图生成LeafletOSRM、路书PDF生成 category: travel ---然后在对话里触发一次完整调用验证链路读取 /mnt/c/Users/zhou/Desktop/成都自驾西藏路书.md 用 config.toml 里的坐标表生成 OSRM 路线图 输出到 output_map_html 指定路径。Hermes 会依次执行generate_map.py读 MD 里的 Day 标题行、匹配坐标、请求 OSRM、渲染 Leaflet。成功时终端会打印输出: ... (xxx bytes)打开 HTML 能看到多天路线用不同颜色区分返程路段是虚线。5. 本篇常见错排查5.1 OSRM 返回空轨迹或 400最常见原因是坐标顺序。OSRM 的 URL 格式是/{lon1},{lat1};{lon2},{lat2}经度在前。如果你从地图上抄的是「纬度,经度」就会算出离谱的路线甚至报错。排查方法打印coords[start]确认第一个值在 73~135 之间中国经度范围第二个在 3~53 之间。另一个原因是城市名没在坐标表里。generate_map.py里PLACE_COORDS查不到就会跳过该段日志里不会有明显报错。建议在匹配前加一句断言missing [c for c in [start, end] if c not in coords] if missing: print(f 坐标表缺失: {missing}请补充 config.toml) continue5.2 Leaflet 地图空白或瓦片不显示瓦片 URL 里的{s}、{x}、{y}、{z}是 Leaflet 占位符如果你在 Python f-string 里直接写会冲突。正确做法是用json.dumps或双花括号转义。上面verify_leaflet.py用的是{{}}如果你改成.format()要格外小心。如果瓦片加载但轨迹不显示检查latlngs是否被转成了字符串。json.dumps输出的是合法 JS 数组但如果你手动拼字符串漏了引号就会静默失败。打开浏览器控制台看有没有Uncaught SyntaxError。5.3 模型调用 401 或超时401 基本是 Key 没读到。确认TAOTOKEN_API_KEY已 export且load_config.py里os.environ.get拿到的不是空串。超时则调大config.toml的timeout_seconds或检查base_url是否误加了路径后缀——正确值是https://taotoken.net/api不要写成https://taotoken.net/api/v1。5.4 海拔查询被限流lookup_elevation.py用的是公开的 Nominatim 和 Open-Elevation前者限制 1 次/秒。脚本里time.sleep(1.1)就是为此。如果你批量查几十个点被拒把间隔调到 1.5 秒或者把结果缓存到本地 JSON避免重复请求。5.5 路书 MD 解析不到 Day 标题generate_roadbook_html.py用正则匹配## Day N — 日期 | 起点 → 终点。如果你的 MD 里标题格式不同比如用了###或没有|分隔正则就匹配不上汇总表会是空的。排查方法先打印re.findall(r## .*Day.*, content)看实际标题长什么样再调整正则。分隔符---后面跟单换行还是双换行也会影响re.split脚本里做了 fallback但最好统一成双换行。6. 接下来怎么用配置跑通后日常使用就是维护那份路书 MD每到一个点补一行跑一次generate_map.py更新地图跑一次generate_roadbook_html.py出打印版。模型侧的统一 Key 走 TaoToken接入细节看 https://taotoken.net/doc 密钥管理在 https://taotoken.net/api-keys 需要长期跑编码/Agent 任务可以看 https://taotoken.net/coding-plan 。如果你只是想先验证模型能不能正常对话直接去 https://taotoken.net/api 的对话页试一句就行。坐标表是这份 Skill 最需要你本地化的部分不同路线城市不同建议按「起点、途经、终点、返程点」分组维护返程路段在渲染时用虚线区分一眼就能看出哪些是回头路。海拔查询脚本可以设成每次录入新地点就自动跑别攒到最后统一补否则容易漏。

相关新闻

对比 4 款国产 AI 工作台,WorkBuddy、QoderWork、Kimi Work、TRAE 怎么选:TaoToken 统一 Key 接入配置指南

对比 4 款国产 AI 工作台,WorkBuddy、QoderWork、Kimi Work、TRAE 怎么选:TaoToken 统一 Key 接入配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 4:11:41 阅读更多 →
从工具到搭档:Claude Code 五大核心机制拆解与 TaoToken 配置实战

从工具到搭档:Claude Code 五大核心机制拆解与 TaoToken 配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 8:02:46 阅读更多 →
Kafka 客户端 VSCode 插件配 TaoToken:settings.json 骨架与连通性验证

Kafka 客户端 VSCode 插件配 TaoToken:settings.json 骨架与连通性验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 7:26:38 阅读更多 →

最新新闻

微信小程序拍照识别手写汉字与书写评分实战指南

微信小程序拍照识别手写汉字与书写评分实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 9:00:07 阅读更多 →
Obsidian+NAS+Syncthing 搭建私有云笔记,数据完全自主

Obsidian+NAS+Syncthing 搭建私有云笔记,数据完全自主

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 9:00:07 阅读更多 →
Windows下OpenSSL安装与深度配置实战指南

Windows下OpenSSL安装与深度配置实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 9:00:07 阅读更多 →
VHDL运算操作符全面解析:类型、位宽与实战避坑指南

VHDL运算操作符全面解析:类型、位宽与实战避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 9:00:07 阅读更多 →
new Blob() 的 type 参数:MIME 类型填错导致文件打不开的真相

new Blob() 的 type 参数:MIME 类型填错导致文件打不开的真相

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 9:00:07 阅读更多 →
gcForest回归:多粒度级联森林的小样本实战与调参指南

gcForest回归:多粒度级联森林的小样本实战与调参指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 8:59:07 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →