新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/29 4:09:10来源:尧图网络
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 最需要你本地化的部分不同路线城市不同建议按「起点、途经、终点、返程点」分组维护返程路段在渲染时用虚线区分一眼就能看出哪些是回头路。海拔查询脚本可以设成每次录入新地点就自动跑别攒到最后统一补否则容易漏。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Vue项目中实现PDF、Word、Excel在线预览的完整方案 2026/9/29 4:56:07

Vue项目中实现PDF、Word、Excel在线预览的完整方案

/* 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 4:56:07

卡尔曼滤波遮挡场景单目标跟踪器实战:状态设计、门控与找回机制

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

阅读更多 →
机器学习是深度学习的地基:从数据到CNN的完整入门 2026/9/29 4:56:07

机器学习是深度学习的地基:从数据到CNN的完整入门

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

阅读更多 →
两只PNP三极管串联断路式过压保护电路设计与仿真 2026/9/29 4:56:07

两只PNP三极管串联断路式过压保护电路设计与仿真

/* 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 4:56:07

东阿阿胶商业模式拆解:提价神话与渠道危机

1. 从驴皮到口服液:东阿阿胶的价值链全景拆解提到东阿阿胶,大多数人脑海里浮现的是四个字:补血、送礼。再往深一点想,可能是那口国家级保密工艺的熬胶锅,或者是逐年攀升、被戏称为“药中茅台”的价格标签。但如果你把它…

阅读更多 →
平安金融云计算平台落地部署与合规排查实战指南 2026/9/29 4:56:00

平安金融云计算平台落地部署与合规排查实战指南

简介:这份PPT系统梳理了平安金融云计算平台的整体架构与业务布局,面向金融科技从业者、云计算架构师及对金融行业云平台感兴趣的技术人员,帮助读者理解金融级云平台在合规、安全、可靠与增值服务方面的设计思路。资源包内仅含1个pptx文件&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉