Hermes 自我进化生成自驾旅行路书 Skill 分享:用 TaoToken 统一 Key 打通 OSRM 与 Leaflet 配置

发布时间:2026/9/29 4:09:14

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 最需要你本地化的部分不同路线城市不同建议按「起点、途经、终点、返程点」分组维护返程路段在渲染时用虚线区分一眼就能看出哪些是回头路。海拔查询脚本可以设成每次录入新地点就自动跑别攒到最后统一补否则容易漏。
延伸阅读

更多相关文章

2026/9/29 4:09:14

循环链表工程实践:从约瑟夫环到嵌入式安全实现

1. 项目概述:为什么循环链表不是“加个头连尾”就完事了?在数据结构与算法的实际工程落地中,循环链表远不止是教科书里“把尾节点指针指向头节点”那句轻描淡写的定义。我带过三届校招实习生,几乎所有人第一次手写约瑟夫环问题时&…

2026/9/29 4:09:14

风电叶片超声检测全攻略:原理、缺陷判读与实战选型

1. 风电叶片检测为什么绕不开超声先说一个我经历过的现场:某风场一台机组在例行巡检时,运维人员站在塔筒里用肉眼隐约看到叶片表面有一道细纹,延着主梁帽方向延伸了大概几十厘米。因为没有明显异响、没有漏油、叶片也没有整体开裂&#xff0c…

2026/9/29 5:29:17

ZeroLaunch-rs API测试:接口调试工具集成

ZeroLaunch-rs API测试:接口调试工具集成 🎯 痛点直击:为什么需要API调试工具? 还在为Windows应用启动器的搜索算法性能问题头疼吗?还在手动测试拼音模糊匹配的准确性吗?ZeroLaunch-rs内置的专业调试工具集…

2026/9/29 5:29:17

ZeroLaunch-rs RSS订阅:内容聚合阅读体验

ZeroLaunch-rs RSS订阅:内容聚合阅读体验 📖 引言:信息过载时代的阅读新方式 在信息爆炸的今天,我们每天都要面对海量的资讯内容。传统的浏览器书签和手动访问网站的方式已经无法满足高效获取信息的需求。ZeroLaunch-rs作为一款专…

2026/9/29 5:29:17

Python猫眼电影数据分析与可视化:从爬虫到ECharts大屏实战

简介:这是一份基于Python的猫眼电影数据分析可视化系统的完整设计文档,适合影视行业从业者、数据分析学习者以及需要毕业设计参考的高校学生。系统以requests库自动抓取猫眼公开电影数据,并借助Pandas完成去重、缺失值与异常值清洗&#xff0…

2026/9/29 5:29:17

Vite构建优化实战:从40秒到10秒的产物体积与速度调优

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

2026/9/29 5:24:17

反激电源RCD吸收电路:漏感尖峰与Vds钳位调试

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

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集: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/28 6:07:41

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

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

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑