简体中文 | English
DSH (DeepSeek Harness) 插件。在真实三维城市地图上点任意位置,立刻得到这个点的选址分析—— 把要求用大白话说给 DSH,它按同一套模型批量找位置、写进名单;看中哪个位置,再把那里在租的铺收进来;踩点后回填,右侧对话全程读得懂你选中的是哪个点。
- 点哪算哪 — 地图上任意位置毫秒级出分析:三个维度分、每项指标的百分位、风险提示、客群构成
- 按业态打分 — 开咖啡店和开药店,同一个点分数不一样:以本市同业态已开门店的位置分布为基线
- 说人话找位置 — 「地铁 200 米内、餐饮多、同类店别超过 3 家,找 10 个」,DSH 翻成查询跑同一份数据
- 两级清单:位置 → 铺源 — 先判断位置行不行,再看那里有什么铺可租。铺源收进来自动挂在最近的位置下,地图、列表、详情都用铺源自己的棕黄色,不和位置混淆
- 铺源图层 — 一键在地图上叠加在租铺源,标签就是租金(元/㎡/天);点开位置详情自动列出 400m 内的铺
- 候选清单 — 所有点位的每项指标并排,按分排序,点行在地图上定位
- 三维城市底图 — 真实路网、用地、建筑轮廓与高度,自绘 canvas,不用瓦片、不用 Key、离线可跑
- 踩点闭环 — 待看 → 看过 → 上会中 → 签约 / 否决,每一步在列表里一键推进;定案有记录、能撤回
- 换城市一条命令 —
fetch-city.mjs建好数据集,重启即可用,不改代码
需要提供 desktopWorkbenches.register、isActive 与 ownsSession 的 DSH Desktop。安装提供方插件后,在「工作台市场」添加并打开「门店选址」,入口固定、仓库身份和会话归属由 Desktop 管理。运行时 ID 为 wb-dataelement-dsh-site-selection;市场条目通过 legacyWorkbenchIds: [site-selection] 授权 Desktop 把旧安装的状态、收藏和会话归属迁移到仓库身份。
业务区域默认在左侧占 65%,可折叠;右侧保留唯一的原生 Agent 会话。插件不覆盖侧边栏、设置、模式切换和公共导航,不创建或跳转会话,也不修改 DSH 工作区。模式、模型、工具和权限遵循当前原生会话。
打开工作台即可在业务面板选择、新建和编辑选址项目,无需先创建原生会话;需要 Agent 帮助时,再在会话区选择工作区并创建会话。选址项目是业务资料,DSH 工作区是原生项目文件夹,两者不要求相同。多个会话可以使用同一个选址项目;每个会话记住自己的选址项目选择,重启后恢复。旧 project.sessionId 仅作为兼容的选择提示,不抢占旧会话或恢复旧工作区。
会话对应的项目选择保存在数据根目录的 .desktop-session-projects.json;尚无会话时,最近选择保存在当前 Desktop 来源的 localStorage。创建第一个会话会继承正在浏览的项目,已有会话的明确选择优先。切换工作台或会话保留已挂载业务 iframe,消息只有在对应工作台和会话处于前台时才会追加到原生草稿,不自动发送,不覆盖原文。离开整个工作台页面或重启前,请保存业务表单修改。
开发及安装包检查:
npm run check
npm pack --dry-run包包含客户端、服务端、城市数据与样例。workbench.json 仅保留给旧版工具读取;现行市场以 package.json、运行时注册和仓库中的真实截图为准。插件加载由宿主插件安装机制完成;注册后才可与市场条目合并。公开市场收录仍需在 awesome-dsh-workbench 单独提交目录 PR。
现行市场元数据草案见 docs/market-entry.yml。该文件用于源仓库审查和后续目录投稿,不会被 Desktop 当成运行时配置。
保留地图、评分、点位/铺源/项目增删改查与踩点记录。地图/评分使用随包城市数据,可离线使用;模拟商业数据在页面内标明,不作为真实测量数据。通过「交给 DSH」把项目路径与点位上下文追加到当前草稿,文件访问仍需原生会话的工具及授权,不自动扩大工作区权限。项目删除只移动到 .trash/,不删除 DSH 会话或工作区;移除工作台入口也不清除业务资料。
所有 API 和 iframe 静态资源使用宿主 connection 的请求校验与认证。写请求要求同源 JSON;文件读取拒绝符号链接跨出选址项目;iframe 消息校验来源窗口、同源、项目、当前会话及工作台归属。
打开工作台 → 业务项目下拉 → 选一个示例:
| 示例 | 场景 | 候选点位 |
|---|---|---|
| 主理人咖啡厅 · 静安 | 在上海静安—南京西路开第一家主理人咖啡厅 | 5 个,82 → 31 分 |
| 去茶山 · 北京朝阳 | 茶饮品牌进京,朝阳区先开 3 家 | 5 个,76 → 27 分 |
示例里的点位都是真实商业地址,由工作台自己的模型从城市数据里选出来、拉开分差;面积租金等只有谈了才知道的字段留空,不编。
然后在地图上随便点一个位置,或者直接跟右侧 DSH 说:
帮我找地铁 200 米以内、周边餐饮多、但同类茶饮店别超过 3 家的位置,找 10 个
它把要求翻成查询表达式,用工作台同一套模型和数据去查,念给你听,你认可后才写进名单;找到位置之后顺手把附近在租的铺也一起报给你。
看中某个位置,点开它,下面就列着 400m 内在租的铺,点「收进」即挂到这个位置下面。 踩完点说「A、C 我去看过了,pass」,它改状态、记原话,后续查询自动排除。
每个点位只有四步:待看 → 看过 → 上会中 → 已签约 / 已否决。新点位一进来就是待看,没有「初筛」这种没人操作的中间态。
- 在列表里推进 — 鼠标放到一行上,右侧浮出「看过了 / 上会 / 去定案」和退一步的「‹」,不用打开详情
- 一眼看出在哪一步 — 行上用彩色标签标出 看过 / 上会中 / 已签约 / 已否决,已否决连理由一起写在行里;筛选栏按 待看 / 看过 / 上会 / 定案 分开
- 去定案有引导 — 点「去定案」会展开右侧详情、滚到底部的定案区并高亮,签约或否决就在那两个按钮
- 定案有记录 — 已定案的点位,名字下方一条红 / 绿横幅写明结论、日期和理由;底部定案区是完整记录卡(时间、理由标签、说明);「记录」页里也有一笔
- 能反悔 — 记录卡下的「撤回定案,退回上会中」(或列表行上的「‹」)把点位退回去,定案记录随之清掉,活动记录里保留撤回这一笔
- 否决必须有理由 — 签约 / 否决只能走定案流程,直接改状态改不到已签约
详情面板底部的四个按钮把当前点位(坐标、面积租金、百分位、风险、踩点记录)连同你的要求一起填进右侧对话框,确认后回车即可:
| 按钮 | 用途 |
|---|---|
| 查商圈信息 | 让 DSH 查工作台看不到的公开信息:在建项目、地铁规划、大型客流源、地方性限制 |
| 生成材料 | 生成一页上会材料初稿,先在对话里给你看,确认后再落盘 |
| 带上这个点位发过去 | 带上点位上下文问任意问题 |
| 解析铺源(顶栏) | 把中介 / 房东发来的一段文字解析成结构化点位追加进名单 |
没选中点位也能发:会带上基线和整份名单,「找 10 个 80 分以上的位置」这种要求不需要先点谁。
基线随业态变。 项目设了业态(咖啡、茶饮、正餐、快餐、烘焙、便利店、药店……共 25 种),就以本市已开的同业态门店位置为尺子,拿候选点和它们比百分位。
同业态样本不足 80 家的城市退回全零售基线,界面会说明。
OSM 对部分业态覆盖太薄时,thicken-formats.mjs 按真实门店的选址特征在真实商业地址里取样补足;真实门店少于 8 家的业态不扩样。
分三个维度,先各自算百分位平均,再把三个维度平均:
| 维度 | 指标 |
|---|---|
| 客流基础 | 500m 建筑面积、500m 餐饮、最近商场 |
| 可达性 | 最近地铁口、300m 公交站、150m 过街设施、300m 停车场 |
| 位置质量 | 120m 内道路数、500m 街道总长 |
同业竞争和客群结构照常显示但不计分——它们没有「越高越好」的方向。 无排烟 / 办不出食品经营许可 / 无独立上下水,命中任一条直接判「不建议」。
分数是排名不是绝对好坏,每项都摊开给你看原始值、在基线里排第几、基线中位数。
| 层 | 说明 | |
|---|---|---|
| POI、路网、建筑、楼面面积 | 真实 | OpenStreetMap |
| 评分、百分位、基线 | 真实 | 完全由上面那层算出 |
| 铺源、租金、客流、商场档次 | 模拟 | *-market.json,程序生成 |
模拟层演示的是接口契约:字段口径对齐国内数据商实际售卖的内容(文件里 vendors 写明现实中向谁买),
买到真数据后按同一 schema 灌进来,上层代码不用动。
模拟数据永远不进分数,有单测守着。整个数据集作为演示夹具,标记只在选择数据集处出现一次。
自带北京、上海、广州。换城市不用改代码:
node scripts/fetch-city.mjs --id shenzhen-futian \
--label "深圳 · 福田区" --bbox 113.90,22.50,114.10,22.60从 Overpass 抓 POI、路网、建筑、楼面面积、公交/停车/过街,写进 src/data/。
重启 DSH,新城市自动出现在建项目的下拉里。
Overpass 是免费服务,一个城区要跑一阵子。中断了重跑同一条命令即可续传。
| 北京 · 五环内 | 上海 · 外环内 | 广州 · 主城区 | |
|---|---|---|---|
| POI | 48896 | 58942 | 26011 |
| 路网 | 35421 条 | 29864 条 | 22213 条 |
| 三维建筑 | 3011 栋(最高 528m) | 4459 栋(最高 632m) | 4195 栋(最高 440m) |
| 模拟铺源 | 2700 | 1900 | 1300 |
项目文件落在 ~/Documents/DSH 选址项目/<项目名>/,可用 DSH_SITE_SELECTION_ROOT 改。
删除项目只是移到同目录的 .trash/,不会真删。
DSH 通过项目文件夹里的 CONTEXT.md 读懂结构,再用这几个脚本干活:
node scripts/query-sites.mjs --where "..." --limit 10 # 按条件找位置
node scripts/query-listings.mjs --near-sites --radius 400 # 每个位置附近的在租铺源
node scripts/query-listings.mjs --adopt lst-0123 # 把一间铺收进清单,字段自动带入- 顶级商场未必在 OSM 里(如上海恒隆、兴业太古汇),那一带租金会偏低
- 「路网交汇度」用 120m 半径,说的是有几条路在附近汇合,不等于这个铺是拐角位
- 三里屯这类靠品牌聚集吸客的商圈会被低估,现有特征抓不到
- OSM 的 POI 覆盖不如商业地图,要门牌号级搜索和路径规划得接持牌服务商
npm run check # 语法 + 57 个单测
npm run sample # 重新生成两个示例项目
npm run fetch-city # 加城市
npm run market # 重新生成模拟商业数据代码 MIT(LICENSE)。
src/data/ 下的地理数据是 OpenStreetMap 衍生数据库,ODbL 1.0,具有传染性——
© OpenStreetMap contributors。对外分发或商业化前请读 DATA-LICENSE.md。
创建或首次关联业务资料后,工作台会自动准备原版开场白并追加到原生会话草稿,由用户确认后发送,不会自动调用模型。尚无会话时先保存待准备内容;创建或打开对应会话后自动追加。同一会话与同一业务资料只准备一次。已有普通文字保留,引用卡片或正在提交的草稿会延后追加,待可用时重试。待准备内容与交付记录保存在当前 Desktop 来源的 localStorage,刷新后继续;清除浏览器存储会清除该记录。


