| name | nearby-search |
| display_name | 周边搜索 - 定位用户并搜索附近 POI |
| description | 当用户询问周边、附近、旁边有什么时,先定位用户位置,再调用 amap-lbs 技能搜索周边 POI |
| version | 1.0.0 |
| trigger | ["周边","附近","旁边","周围","附近有什么","周边有什么","旁边有没有","附近哪里有"] |
周边搜索
当用户询问"周边"、"附近"、"旁边"有没有某类场所(如美食、咖啡、超市等)时,使用此技能定位用户并搜索周边信息。
重要:不要使用 web search 来回答周边搜索类问题,始终走本技能的定位 + amap-lbs 流程。
触发条件
用户消息中包含以下意图:
- "周边/附近/旁边有什么好吃的"
- "附近有没有咖啡店"
- "周围有什么餐厅"
- "旁边哪里有超市"
- 任何包含"周边"、"附近"、"旁边"、"周围"等词,且在询问某类场所/服务的表达
执行流程
第一步:确定用户位置
按以下优先级确定用户当前所在位置:
优先级 1:用户已明确给出地址
如果用户消息中已包含具体地址(如"中关村附近有什么好吃的"、"南山科技园周边咖啡"),直接使用该地址,跳过后续定位步骤。
优先级 2:工作日白天推断上班地址
判断当前是否为工作日(周一至周五)且处于工作时间(9:00-18:00,注意使用用户所在时区):
- 如果是,从 memory(
context://memory/user_profile.md 或 context://memory/projects/ 下的相关文件)中查找用户的上班地址/公司地址
- 如果 memory 中有上班地址,使用该地址
优先级 3:IP 地理定位(兜底)
如果以上都不可用,通过 IP 定位获取用户大致位置:
curl --noproxy "*" "http://ip-api.com/json?lang=zh-CN"
返回示例:
{
"status": "success",
"country": "中国",
"regionName": "广东",
"city": "深圳",
"lat": 22.5431,
"lon": 114.0579,
"query": "x.x.x.x"
}
从返回中提取 city(城市)和 lat/lon(经纬度)。
第二步:获取精确坐标
- 如果第一步得到的是地址文本(如"南山科技园"),需要先通过地理编码获取经纬度:
curl -s "https://restapi.amap.com/v3/geocode/geo?address={地址}&output=JSON&key=$(get_secret amap_webservice_key)"
从返回的 geocodes[0].location 获取 经度,纬度。
- 如果第一步得到的是 IP 定位的
lat/lon,直接使用(注意高德格式为 经度,纬度,即 lon,lat)。
第三步:调用 amap-lbs 技能搜索周边
使用 amap-lbs 技能的**场景四(POI 详细搜索)**进行周边搜索:
node scripts/poi-search.js --keywords={用户要搜的类别} --location={经度},{纬度} --radius=1000
脚本路径位于 amap-lbs 技能目录下:ethan/defaults/skills/amap-lbs/scripts/poi-search.js
参数说明:
--keywords:用户要找的类别(美食、咖啡、超市等)
--location:经度,纬度(高德格式,经度在前)
--radius:搜索半径,默认 1000 米,可根据需要调整
第四步:整理结果返回
将搜索结果整理为用户友好的格式,包含:
同时附上高德地图的可视化链接供用户查看更多:
https://ditu.amap.com/search?query={类别}&query_type=RQBXY&longitude={经度}&latitude={纬度}&range=1000
注意事项
- 不要使用 web search 来回答周边搜索类问题,始终走本技能的定位 + amap-lbs 流程
- API Key 通过
get_secret("amap_webservice_key") 获取
- 高德坐标格式始终为
经度,纬度(lon,lat),IP 定位 API 返回的是 lat,lon,注意转换
- 如果 IP 定位失败或返回非中国地区,提示用户手动提供位置
- 搜索半径默认 1000 米,如果结果太少可扩大到 2000-3000 米