> 加载方式说明:本文档为入口与路由表。详细参数/案例/公式请按 → 跳转 标记加载对应 reference 文件。
> 核心原则:用户问什么 → 路由表匹配 → 按需加载对应模块,避免一次性加载所有内容(节省 token + 提升精度)。
> ⭐ 首次使用本 Skill 时必须运行此检查,确认当前环境能否生成图片。
python scripts/capability_check.py
| 能力 | 作用 | 缺失时影响 | 修复方法 |
|---|---|---|---|
| ------ | ------ | ---------- | --------- |
| matplotlib 图表生成 | 必检,落位图/柱状图/雷达图 | ❌ 无法生成任何可视化 | pip install matplotlib contextily |
| AI 文生图(可选) | 装修效果图/菜品图/概念图 | ⚠ 无法生成 AI 图片 | 配置 OPENAI_API_KEY 等 |
| Agent 图片发送 | 必检,MEDIA:xxx.png 发给用户 | ❌ 用户收不到图 | 需 Hermes Agent 本身支持 |
============================================================
store-network-planner V1.3.2 能力自检
============================================================
✅ matplotlib 图表生成(核心): OK
• matplotlib: 3.10.9 / contextily: 1.7.0 / 中文字体: wqy-zenhei.ttc
✅ AI 文生图(可选,装修图/效果图): OK
• openai_dalle: True / provider: openai_dalle
✅ Agent 图片发送能力: OK
============================================================
整体状态: OK ✓ 所有能力正常,可以开始使用
python scripts/capability_check.pycapability_check.get_capability_summary() 快速判断如需生成装修效果图,请配置以下任一后端:
方法 1:OpenAI DALL-E 3(推荐)
pip install openai
export OPENAI_API_KEY=sk-xxx
方法 2:Replicate(多模型)
pip install replicate
export REPLICATE_API_TOKEN=r8_xxx
方法 3:Stability AI
pip install stability-sdk
export STABILITY_API_KEY=sk-xxx
方法 4:配置文件
# ~/.hermes/config.yaml
image_gen:
provider: openai # 或 replicate / stability
api_key: sk-xxx
未配置时:所有数据图表(落位图/柱状图/雷达图)正常生成,仅 AI 装修图功能不可用。
> ⚠️ 本表为本 Skill 的核心,匹配用户意图后按需加载对应章节/文件,不要默认加载全部内容。
| 用户提问关键词 | 加载章节 | 详细文件 |
|---|---|---|
| --------------- | --------- | --------- |
| 这个位置好不好 / 给我打个分 / 综合评估 | 三、六维评估 | references/assessment-model.md |
| 周边有什么 / 配套如何 / 有什么聚客点 | 四、周边配套 | (已内置在主文档) |
| 能赚多少钱 / 盈亏平衡 / 多久回本 / 投资测算 | 六、盈利测算 | references/profit-calculation.md |
| 竞争对手 / 跨业态竞争 / 自相竞争 | 七、八、竞争分析 | references/competitive-analysis.md |
| 怎么开分店 / 年度计划 / 城市进入 / 加密决策 | 十三、十四、十五 | references/business-analysis.md |
| 关店决策 / 门店分级 / 巡查整改 | 十三、门店分级 | (已内置在主文档) |
| 预测日均来客 / 预测营业额 / 好店模型 | 十六、好店预测 | references/prediction-methods.md(类比+回归合并) |
| 聚客点叠加 / 覆盖效率 / 渗透率 | 十一、商圈人口 | references/pedestrian-analysis.md |
| 业态特征 / 选址特征 | 业务分析 | references/business-analysis.md |
| 需要什么数据 / 预测精度 | 模型选型 | references/prediction-methods.md |
多关键词时按优先级路由:盈利 > 选址 > 规划 > 预测 > 督导。
| 业态 | 子类 | 选址重点 |
|---|---|---|
| ------ | ------ | --------- |
| 餐饮 | 快餐/正餐/火锅/茶饮/烘焙/日料/烧烤 | 商圈客流/时段分布/外卖覆盖 |
| 快消 | 便利店/超市/药店/烟酒/母婴用品 | 社区入口/交通枢纽/写字楼底商 |
| 服装 | 女装/男装/童装/运动/鞋类/内衣 | 商场专柜/步行街/社区商业街 |
| 水果生鲜 | 水果/蔬菜/肉禽/水产/卤味 | 社区门口/菜市场旁/住宅密集区 |
| 娱乐 | 电影院/KTV/剧本杀/棋牌/健身房/儿童乐园 | 购物中心/商圈核心/社区配套 |
→ 详细业态特征/选址特征:加载 references/business-analysis.md
1. 业态类型:餐饮/快消/服装/水果生鲜/娱乐(必选)
2. 子类选择:见各业态子类列表
3. 产品特征:标准型/短效期/高库存/低库存
4. 目标客群:年龄/消费力/职业/消费习惯
5. 开发角色:总部开发/区域督导/加盟商
> 💡 用户画像采集后保存到记忆,后续会话自动应用。
> ⚠️ 评估模型(专家打分,定性)≠ 预测模型(数据驱动,定量)。用户问"好店模型"实际想要的是预测模型(见十六)。
| 维度 | 权重范围 | 核心指标 |
|---|---|---|
| ------ | --------- | --------- |
| 商圈价值 | 20-30% | 客流/客群匹配/消费力/竞争度 |
| 位置价值 | 20-25% | 可见性/可达性/展示面/停车 |
| 周边配套 | 15-25% | 交通/停车/聚客点/公共资源/营商环境 |
| 物业条件 | 10-20% | 面积/层高/排烟/排水/电力 |
| 租金性价比 | 10-15% | 租金/月营业额占比 |
| 未来潜力 | 5-10% | 规划红利/客群增长 |
评级标准:≥80分优先开发 | 60-80分谨慎评估 | <60分放弃
→ 各维度详细参数/打分细则/业态差异化权重:加载 references/assessment-model.md
| 类型 | 标准 |
|---|---|
| ------ | ------ |
| 地铁 | 步行≤5min=10分,≤10min=7分,≤15min=4分 |
| 公交 | ≥3条线=10分,≥2条=7分,1条=4分 |
| 主干道 | 主动线=10分,支路=7分 |
| 停车 | ≥20免费车位=10分,付费≤5元/h=8分 |
有效客流 = 基础客流 × (1 + 聚客点加成系数)
商场/购物中心:+30-50%
地铁站:+20-40%
菜市场:+20-30%(生鲜/餐饮强相关)
写字楼:+15-25%(快餐/咖啡强相关)
学校:+10-20%
医院:+10-20%
公园:+5-15%
叠加规则:多聚客点可叠加,2个以上加分上限150%(边际递减)
→ 完整聚客点评估/商圈人口分析/覆盖效率公式:加载 references/pedestrian-analysis.md
| 资源 | 餐饮 | 快消 | 服装 | 水果 | 娱乐 |
|---|---|---|---|---|---|
| ------ | ------ | ------ | ------ | ------ | ------ |
| 医院 | ★★☆ | ★★★ | ★★☆ | ★★★ | ★★☆ |
| 学校 | ★★★ | ★★★ | ★★☆ | ★★★ | ★★☆ |
| 公园 | ★★☆ | ★★★ | ★☆☆ | ★★★ | ★★★★ |
| 运动场 | ★★☆ | ★★★ | ★★☆ | ★★☆ | ★★★★ |
| 政府 | ★★☆ | ★★★ | ★☆☆ | ★★☆ | ★☆☆ |
| 业态 | 覆盖半径 | 同商圈最多 | 租金占比上限 | 典型面积 |
|---|---|---|---|---|
| ------ | --------- | ---------- | ------------ | --------- |
| 餐饮 | 1.5-3km | 3-8家 | ≤15-20% | 30-200㎡ |
| 快消 | 0.5-1km | 5-15家 | ≤25-35% | 20-100㎡ |
| 服装 | 1-2km | 3-6家 | ≤20-30% | 30-150㎡ |
| 水果生鲜 | 0.5-1km | 3-8家 | ≤20-30% | 20-80㎡ |
| 娱乐 | 2-5km | 1-3家 | ≤25-35% | 100-500㎡ |
单店覆盖人口基准(区域督导自查用):
references/profit-calculation.md)| 业态 | 商品成本 | 人工 | 毛利率 | 回本周期 |
|---|---|---|---|---|
| ------ | --------- | ------ | -------- | --------- |
| 餐饮 | 30-40% | 20-30% | 60-70% | 6-18月 |
| 快消 | 60-75% | 10-15% | 25-40% | 12-24月 |
| 服装 | 40-55% | 10-15% | 45-60% | 12-36月 |
| 水果生鲜 | 65-80% | 10-15% | 20-35% | 12-24月 |
| 娱乐 | 20-35% | 15-25% | 65-80% | 12-36月 |
月固定成本 = 租金 + 人工 + 水电 + 折旧 + 其他
月盈亏平衡营业额 = 月固定成本 ÷ 毛利率
日需来客数 = 月盈亏平衡营业额 ÷ 30 ÷ 客单价
→ 完整测算器/分业态明细模板:加载 references/profit-calculation.md + 运行 scripts/profit_model.py
references/competitive-analysis.md)| 等级 | 系数 | 策略 |
|---|---|---|
| ------ | ------ | ------ |
| 蓝海 | <0.5 | 优先抢占 |
| 良性 | 0.5-1.0 | 差异化定位 |
| 红海 | 1.0-2.0 | 精细化运营/特色突围 |
| 过饱和 | >2.0 | 谨慎进入/寻找细分 |
→ 完整分析框架/对标表/攻防地图:加载 references/competitive-analysis.md
| 业态 | 警戒距离 | 触发动作 |
|---|---|---|
| ------ | --------- | --------- |
| 餐饮 | <1km(同品类) | 提交分流分析报告 |
| 快消 | <0.5km | 评估密度饱和度 |
| 服装 | <1km(同价位) | 评估客群分层 |
| 水果生鲜 | <0.5km | 评估生鲜需求容量 |
| 娱乐 | <2km | 评估目的性消费覆盖 |
这些章节为参考性内容,用户主动问到"商圈怎么评估/客群怎么分析"时再加载:
references/business-analysis.mdreferences/business-analysis.mdreferences/pedestrian-analysis.mdreferences/business-analysis.md季度复盘 → 门店分级调整
A+店:连续3月营收超均值150% → 维持旗舰标准
A店:连续3月营收超均值100% → 观察升级
B店:连续3月营收低于均值70% → 预警整改
C店:连续3月亏损 → 评估关闭/转型/降级
关店标准:
- 连续6月亏损且无好转趋势
- 物业条件恶化(租金上涨/规划变更)
- 商圈客流整体下降>30%
→ 完整分级标准/整改流程:加载 references/business-analysis.md
【新店选址评估报告】
业态:___ 子类:___
门店名称/地址:___
商圈类型:___
评估总分:___/100(___等级)
一、商圈价值
二、位置评估
三、周边配套(核心新增)
- 交通/停车/聚客点/公共资源/商圈成熟度
四、业态匹配分析
五、盈利预测(投资估算/成本结构/盈亏平衡/回本周期)
六、风险提示(自相竞争/跨业态/物业规划/聚客点变化)
七、综合建议:✓ 建议开店 / ⚠ 谨慎评估 / ✗ 不建议
【城市进入评估报告】
城市:___ 等级:___ 目标业态:___
一、城市基本面(GDP/人口/消费力/商业地产)
二、目标业态市场分析(市场容量/竞争格局)
三、进入机会(机会商圈/差异化空间)
四、开发策略(目标门店数/业态组合/开发节奏/资源投入)
五、综合建议
【门店分级整改报告】
门店:___ 当前等级:___ 整改目标:___
一、问题诊断(营收/客单/客流/成本结构)
二、根因分析(商圈衰退?管理问题?竞争挤压?)
三、整改措施(保留/降级/关闭)
四、时间表与责任人
Step 1: 距离筛查 → 新店与已开门店距离是否触发警戒线
Step 2: 客流分流分析 → 历史曲线对比、营业额影响测算
Step 3: 客群重叠度分析 → 同一目标客群比例 > 60%?
Step 4: 商圈容量评估 → 商圈总客流 ÷ 各店分流后单店客流
Step 5: 决策输出
- 影响 < 10%:同意开店
- 影响 10-25%:老店整改+新店谨慎
- 影响 > 25%:新店选址调整/老店降级
references/prediction-methods.md)> 用数据预测新店日均营业额,告别"凭经验"。
| 方法 | 适用场景 | 样本需求 | 预测精度 | 实施成本 |
|---|---|---|---|---|
| ------ | --------- | --------- | --------- | --------- |
| 类比法 | <30家已开门店、快速估算 | 3-30家 | 中等(±20%) | 低 |
| 回归法 | 30+门店数据、追求精度 | ≥30家 | 较高(±10%) | 中高 |
| 场景 | 推荐 |
|---|---|
| ------ | ------ |
| 新城市进入 | 类比法 |
| 30+历史门店 | 回归法 |
| 快速估算 | 类比法 |
| 汇报需依据 | 回归法 |
| 数据质量差 | 类比法 |
| 陷阱 | 应对 |
|---|---|
| ------ | ------ |
| 混淆评估与预测 | 用户要"好店模型"→ 优先预测模型 |
| 距离相似度分母错误 | 用绝对距离区间(≤200m=高相似) |
| 缺少人口密度维度 | 必须包含人口密度 |
| 线性回归假设过强 | 改用多项式/随机森林 |
| 没有置信区间 | 必须输出80%置信区间 |
| 参数硬编码 | 用配置文件 |
→ 完整相似度模型/特征工程/代码实现:加载 references/prediction-methods.md
→ 运行脚本:scripts/analogy_predictor.py 或 scripts/regression_predictor.py
→ Agent实现参考:加载 references/prediction-model-tech.md(陷阱与改进的技术细节)
> 此章节用于沉淀真实案例,每个案例包含:背景 → 决策依据 → 实际结果 → 反思。
| 案例编号 | 类型 | 状态 | 关键决策 |
|---|---|---|---|
| --------- | ------ | ------ | --------- |
| 案例1 | 北京方庄单店选址 | ✅ 已落地 | 评分82,类比法预测准确 |
| 案例2 | 北京海淀区域规划 | ✅ 已落地 | 空白点扫描发现TOP5 |
| 案例3 | 西单关停+酒仙桥补位 | ✅ 已落地 | 攻防地图辅助决策 |
| 案例4 | 上海茶饮+便利店组合 | 📋 计划中 | 跨业态选址分析 |
→ 完整案例(背景/过程/结果/教训):加载 references/cases.md
→ 案例数据文件:assets/cases/case*.csv(已有20家门店+8候选+10竞品的真实数据)
| 文件 | 何时加载 |
|---|---|
| ------ | --------- |
references/assessment-model.md | 用户问"打分/评估/这个位置好不好" |
references/profit-calculation.md | 用户问"盈亏/回本/投资" |
references/competitive-analysis.md | 用户问"竞争/对标/自相竞争" |
references/business-analysis.md | 用户问"业态特征/商圈/客群/周期/分级" |
references/pedestrian-analysis.md | 用户问"聚客点/客流/覆盖效率" |
references/prediction-methods.md | 用户问"预测/好店模型/类比/回归" |
references/prediction-model-tech.md | Agent内部实现参考(相似度缺陷/置信区间/配置化) |
references/geo-analysis.md | 用户问"地图/落位/距离/覆盖人口/等时圈/空白点"(V1.2 新增) |
| 脚本 | 用途 | 何时运行 |
|---|---|---|
| ------ | ------ | --------- |
scripts/site_scoring.py | 交互式六维评分 | 用户需要打分时 |
scripts/profit_model.py | 盈亏平衡/回本周期 | 用户需要测算时 |
scripts/analogy_predictor.py | 类比法预测日均来客 | 新城市/样本少时 |
scripts/regression_predictor.py | 回归法精确预测 | 30+门店数据时 |
scripts/geo_helper.py | 阶段1:单店地图分析(5功能) | 评估新店/单点排查 |
scripts/geo_batch.py | 阶段2:批量地图分析(3功能) | 年度规划/多店落位 |
scripts/geo_advanced.py | 阶段3:高级地图分析(4功能) | 战略规划/区域扫描 |
scripts/map_providers.py | 多数据源适配器(高德/百度/腾讯/OSM) | 自动加载 |
scripts/visualizer.py | 静态图片生成器(替代 folium/plotly) | 所有可视化场景 |
scripts/capability_check.py | 能力自检(matplotlib + AI文生图 + Agent) | 首次使用 |
scripts/startup_check.py | 启动包装(geo脚本入口自动检测) | 自动 |
scripts/ai_image_gen.py | AI 文生图(装修图/效果图/菜品图) | 可选 |
scripts/image_analyzer.py | vision 图片分析(4场景) | 督导巡查 |
scripts/image_compressor.py | 图片智能压缩(4档位) | 微信/报告/缩略图 |
scripts/vi_checker.py | VI 一致性检测(颜色+Logo) | 品牌合规 |
scripts/heatmap_gen.py | 客流热力图(3数据源) | 真实人流 |
scripts/multi_agent.py | 多 Agent 并行调度 | 加速分析 |
| 文件 | 用途 |
|---|---|
| ------ | ------ |
assets/site-checklist.md | 选址检查清单(实地调研用) |
assets/stores-template.csv | 已有门店数据 CSV 模板 |
assets/candidates-template.csv | 候选店数据 CSV 模板 |
assets/cases/*.csv | 4 个实战案例数据 |
| 文件 | 用途 |
|---|---|
| ------ | ------ |
templates/integration_pipeline.py | 端到端:天气+客流+PDF 一键集成(V1.3.6 新增) |
本 Skill 大量使用了两个类级共享 Skill,新场景可直接套用:
software-development/agent-image-output:Agent 场景下的图片输出范式(matplotlib PNG + MEDIA: 协议 + 能力自检 + base64 嵌图)。本 Skill 的 scripts/visualizer.py、scripts/capability_check.py、scripts/startup_check.py、scripts/ai_image_gen.py 全部基于此范式实现。software-development/pptx-and-matplotlib-pitfalls:python-pptx 与 matplotlib 的真实踩坑集(font.size 单位、marker 名称、gridspec 索引、文件大小、Agg backend)。本 Skill 开发过程中踩中的坑已沉淀到该 reference。→ 当你需要为新场景设计 Agent 友好的可视化脚本时,先加载这两个 Skill,再写代码。
> 为不会编程的督导/网络规划同事提供地图能力。三阶段可选其一或全部。
默认推荐:高德地图(国内 POI 最准,6000次/日免费)
| 数据源 | 是否需要 Key | 申请地址 |
|---|---|---|
| -------- | ------------ | --------- |
| 高德(推荐) | ✅ | https://lbs.amap.com/dev/key/app |
| 百度 | ✅ | https://lbsyun.baidu.com/apiconsole/key |
| 腾讯 | ✅ | https://lbs.qq.com/webservice_v1/guide-geocoder |
| OpenStreetMap | ❌(数据较粗) | - |
> 切换数据源:直接修改 scripts/config.json 即可。
| 阶段 | 适用场景 | 脚本 | 功能数 |
|---|---|---|---|
| ------ | --------- | ------ | ------- |
| 阶段1 轻量 | 单店选址/单点排查 | geo_helper.py | 5 |
| 阶段2 批量 | 年度规划/多店落位 | geo_batch.py | 3 |
| 阶段3 高级 | 战略规划/区域扫描 | geo_advanced.py | 4 |
用户选择规则(询问用户):
1. 仅评估一个店 → 阶段1
2. 评估多个候选店/做年度规划 → 阶段2
3. 区域级战略规划/城市进入 → 阶段3
4. 一次性用到所有功能 → 全部加载
# 1. 地址解析
python scripts/geo_helper.py geocode "北京西单北大街1号"
# 2. 两点距离
python scripts/geo_helper.py distance --from "A" --to "B"
# 3. 周边搜索(如 1km 内的商场)
python scripts/geo_helper.py nearby --address "A" --radius 1000 --type 商场
# 4. 简单落位图(HTML)
python scripts/geo_helper.py map --address "A" --with-poi
# 5. 自相竞争检查(与已有门店的距离)
python scripts/geo_helper.py cannibal --new "新店地址" --existing assets/stores-template.csv
# 1. 批量距离矩阵(多候选 × 多已有)
python scripts/geo_batch.py distance-matrix \
--input assets/candidates-template.csv \
--existing assets/stores-template.csv
# 2. 批量落位图(自店+候选+竞品)
python scripts/geo_batch.py map \
--stores assets/stores-template.csv \
--candidates assets/candidates-template.csv \
--competitors 竞品.csv
# 3. 攻防地图(自店 vs 竞品)
python scripts/geo_batch.py battlemap \
--self 自店.csv --competitor 竞品.csv
# 1. 真实覆盖人口分析
python scripts/geo_advanced.py population --stores stores.csv --radius 3000
# 2. 等时圈(步行15分钟真实可达)
python scripts/geo_advanced.py isochrone --address "A" --minutes 15 --mode walking
# 3. 空白点智能识别(区域扫描)
python scripts/geo_advanced.py gap-analysis --region "北京海淀区" --stores stores.csv
# 4. 完整商圈报告(综合输出)
python scripts/geo_advanced.py full-report --new-store "新店" --format html
核心原则:本 Skill 在 Agent/Chatbot 场景下,所有可视化输出 PNG 图片(手机可看/QQ/微信可发)。
每个脚本运行时询问用户:
也可以直接用 --format 参数指定(image / excel / both)。
已删除的格式(V1.3.1):
保留的格式:
核心约束:本 Skill 由 OpenClaw/HermesAgent 调用,用户没有 Python 环境、没有浏览器、看不到 HTML。
Agent 必须做的:
MEDIA:/path/to/image.png 直接发图给用户输出文件清单(Agent 可直接 send_media):
| 脚本 | 输出文件 | 典型大小 |
|---|---|---|
| ------ | --------- | --------- |
geo_helper.py nearby | nearby_商场.png | ~100KB |
geo_helper.py map | location_map.png | ~100KB |
geo_helper.py cannibal | cannibal_map.png + cannibal_chart.png | 50-150KB |
geo_batch.py distance-matrix | distance_matrix_map.png | ~100KB |
geo_batch.py map | batch_map.png | ~100KB |
geo_batch.py battlemap | battle_map.png | ~100KB |
geo_advanced.py population | population_chart.png | ~150KB |
geo_advanced.py gap-analysis | gap_map.png | ~100KB |
geo_advanced.py full-report | full_report_map.png + full_report_summary.png | 100-150KB |
report_generator | store_report.pptx | ~40KB(10页) |
Agent 回复模板:
已为您生成 3 张分析图:
📊 落位图:MEDIA:/path/to/location_map.png
📊 自相竞争:MEDIA:/path/to/cannibal_chart.png
📈 完整报告:MEDIA:/path/to/full_report_summary.png
主要结论:
- 综合评分 82/100(推荐开店)
- 3km 覆盖人口 18.5万
- 月营业额预测 ¥194,400
- 自相竞争 0 家触发
| 增强 | 实现 | 使用方式 |
|---|---|---|
| ------ | ------ | --------- |
| 真实图片分析 | scripts/image_analyzer.py (13KB) | vision_analyze 4场景:督导巡查/VI合规/装修验收/竞品分析 |
| VI 一致性检测 | scripts/vi_checker.py (14KB) | OpenCV颜色直方图+Logo检测+评分卡,纯本地无需AI |
| 客流热力图 | scripts/heatmap_gen.py (15KB) | 3数据源:CSV/高德API/百度API,IDW插值+时段分析 |
| 图片智能压缩 | scripts/image_compressor.py (20KB) | 4档位:wechat(200-500KB)/report(50-150KB)/thumbnail(20-50KB)/email(400-800KB),批量+EXIF旋转+WebP |
| 多 Agent 并行 | scripts/multi_agent.py (9KB) | 3任务模板:单店/批量/预测,delegate_task 批量调用 |
| 能力自检 | scripts/capability_check.py (12KB) | 首次运行自动检测 |
| 启动包装 | scripts/startup_check.py (3KB) | 3个geo脚本入口自动检测 |
| AI 文生图 | scripts/ai_image_gen.py (11KB) | OpenAI DALL-E / Stability / Replicate |
| 静态图片生成器 | scripts/visualizer.py (32KB) | 5 种核心图 |
| 真实人口栅格 | scripts/geo_enhanced/population.py (10KB) | WorldPop/LandScan |
| 预测+落位图闭环 | scripts/geo_enhanced/prediction_integration.py (15KB) | 类比法/回归法 + matplotlib |
| PPT 自动生成 | scripts/geo_enhanced/report_generator.py (24KB) | 10页标准PPT |
| 5 个实战案例 | references/cases.md + assets/cases/*.csv | 用户问"案例"时自动加载 |
多 Agent 并行调用模板(V1.3.3 新):
# Agent 一次发起 3 个并行任务
from multi_agent import dispatch_parallel_tasks
from delegate_task import delegate_task # Hermes 内置
# 1. 构造共享 context
context = {
"new_store_address": "北京丰台区方庄南路",
"existing_stores_csv": "assets/cases/case1-existing-stores.csv",
"candidates_csv": "assets/cases/case1-candidates.csv",
"output_dir": "/tmp/store_analysis"
}
# 2. 调度 3 个任务
dispatch = dispatch_parallel_tasks(context)
# → 返回 3 个任务模板(单店/批量/预测)
# 3. Agent 用 delegate_task 并行执行(节省 60-180s)
results = delegate_task(tasks=[
{"goal": dispatch["tasks"][0]["task"]["instructions"], "context": context, "toolsets": [...]},
{"goal": dispatch["tasks"][1]["task"]["instructions"], "context": context, "toolsets": [...]},
{"goal": dispatch["tasks"][2]["task"]["instructions"], "context": context, "toolsets": [...]},
])
# 4. 汇总
from multi_agent import aggregate_results
summary = aggregate_results(results)
# → {"consensus_score": 78, "total_images": 9, "successful": 3}
vision 图片分析调用模板:
from image_analyzer import analyze_store_photo, parse_vision_response, generate_improvement_report, render_audit_report
# 1. 生成 prompt
action = analyze_store_photo("/path/to/store.jpg", "store_audit")
# 2. Agent 调用 vision_analyze(实际由 Agent 执行)
# vision_analyze(image=action["image_path"], question=action["prompt"])
# 3. 解析响应
parsed = parse_vision_response(vision_response)
# 4. 生成报告
report = generate_improvement_report(parsed, store_name="方庄店")
img = render_audit_report(report, "audit_report.png")
VI 检测(纯本地,无需 AI):
from vi_checker import full_vi_check, render_vi_report, DEFAULT_VI_CONFIG
result = full_vi_check("store.jpg", DEFAULT_VI_CONFIG, "方庄店")
img = render_vi_report(result, "vi_report.png")
# → 评分 65/100,违规:白超上限 / 主色集中
客流热力图:
from heatmap_gen import generate_heatmap
generate_heatmap(
"csv:heatmap_data.csv", # 或 "amap:API_KEY"
store_locations=[{"lng": 116.43, "lat": 39.86, "name": "方庄店"}],
output_path="heatmap.png"
)
能力自检一键运行:
python scripts/capability_check.py
# 输出 3 项检查:matplotlib / AI文生图 / Agent发送
AI 装修图生成(需配置文生图模型):
from ai_image_gen import generate_store_exterior, generate_dish_photo
generate_store_exterior(style="modern_chinese", output_path="store.png")
generate_dish_photo("宫保鸡丁", output_path="dish.png")
Web 界面:❌ 已删除(V1.3.1)
Agent 调用图片生成(一行代码):
from visualizer import plot_single_site
plot_single_site(
center_lng=116.43, center_lat=39.86,
address="北京方庄", radius_m=1500,
facilities={"商场": [(lng, lat, "名称")]},
output_path="output.png"
)
# 然后用 send_message(action="send", message="MEDIA:/abs/path/output.png")
督导在门店用手机拍的照片(2-5MB)传到工作群经常被吐槽"太占内存"。本脚本提供 4 个档位的智能压缩:
4 档位:
| 档位 | 目标大小 | 最长边 | 适用场景 |
|---|---|---|---|
| ------ | --------- | ------- | --------- |
| 200-500KB | 1920px | 微信/飞书/钉钉群消息 | |
| report | 50-150KB | 1280px | Word/PPT 报告插图 |
| thumbnail | 20-50KB | 400px | 列表缩略图/预览 |
| 400-800KB | 2048px | 邮件附件(可接受稍大) |
4 阶梯压缩算法:
单图压缩:
python image_compressor.py photo.jpg --preset wechat
python image_compressor.py photo.jpg --use-for feishu # 智能选档
python image_compressor.py photo.jpg --target-size 300 --format webp
批量压缩:
python image_compressor.py /path/to/photos/ --preset wechat --output /path/out/ --recursive
python image_compressor.py "*.jpg" --preset report
链式调用(被其他脚本集成):
from image_compressor import compress_for_wechat, compress_for_report, compress_for_thumbnail
# 压到微信合适大小
out_path = compress_for_wechat("store_photo.jpg")
# 集成到 report_generator.py
def generate_vi_report(image_path, ...):
# 先压缩再插入报告
thumb = compress_for_thumbnail(image_path)
...
实测效果(模拟 10MB 手机照片):
客流预测需要天气数据,本脚本自动从和风天气 / 心知天气 / mock 三个数据源获取:
3 个 Provider:
| Provider | 是否需要 Key | 限频 | 数据源 |
|---|---|---|---|
| ---------- | ------------ | ------ | ------- |
| 和风天气(qweather) | ✅(QWEATHER_KEY) | 1000 次/天 | 实测数据最准 |
| 心知天气(seniverse) | ✅(SENIVERSE_KEY) | 500 次/天 | 15 天预报 |
| mock | ❌ | - | 沙箱环境/无 Key 时降级 |
Key 配置:
export QWEATHER_KEY=xxx
export SENIVERSE_KEY=xxx
统一入口(带自动降级):
from weather_api import get_weather_forecast
# 沙箱环境/无 Key:自动降级到 mock(不抛异常)
forecast = get_weather_forecast(
location="北京方庄", # 支持 "城市名" 或 "lng,lat"
days=7,
provider="qweather", # 缺 Key 时自动降级 mock
use_mock_on_fail=True, # 默认 True
)
# → [{"date": "...", "temp_max": 28, "temp_min": 20,
# "precipitation": 0, "condition": "晴", "source": "..."}, ...]
# 与客流预测集成(一行集成)
from footfall_forecast import predict_week
results = predict_week(
baseline=280, start_date="2026-06-15",
weather_week=forecast,
)
CLI 模式(注意:INFO 信息走 stderr,JSON 干净输出到 stdout):
python weather_api.py --provider qweather --city 北京方庄 --days 7
python weather_api.py --provider mock --city 116.43,39.86 --days 5 --json
与客流预测联动公式:
最终客流 = 基线 × (工作日因子 × 节假日因子 × 天气因子 × 季节因子)
其中天气因子由 temp_max/precipitation 自动计算(参考 weather_factor() 函数)
为开店建议/客流预测生成可邮件发送的 PDF 报告。3 个场景:
| 函数 | 用途 | 输出页数 |
|---|---|---|
| ------ | ------ | --------- |
generate_site_pdf() | 选址评估(封面+摘要+配套+风险+建议) | 2-3 页 |
generate_footfall_pdf() | 客流周报(封面+概览+明细表+因子+建议) | 3-4 页 |
generate_comprehensive_pdf() | 综合报告(选址+客流+建议) | 4-5 页 |
3 个入口:
# 1. 选址 PDF
from pdf_report import generate_site_pdf
out = generate_site_pdf(
store_name="方庄店", address="北京方庄", score=78,
monthly_revenue=380000, payback_months=14, population=125000,
facility_data={"商场": 5, "地铁": 2},
risks=["自相竞争"], suggestions=["签 5 年租约"],
output_path="/tmp/report.pdf",
)
# 2. 客流 PDF
from pdf_report import generate_footfall_pdf
from footfall_forecast import predict_week
results = predict_week(280, "2026-06-15")
out = generate_footfall_pdf("A001", "北京方庄", results, "/tmp/footfall.pdf")
# 3. CLI
python pdf_report.py --demo --output test.pdf # 客流周报
python pdf_report.py --type site --data data.json --output site.pdf
依赖:
pip install fpdf2 pypdf # fpdf2 生成 + pypdf 验证
# 中文字体:系统需装 wqy-zenhei(/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc)
# 降级:没字体也能跑,中文变方块但不崩
→ 完整功能说明/参数详解/常见场景:references/geo-analysis.md
→ 4 个实战案例(数据+背景+决策+结果+教训):references/cases.md
→ API 速查(真实函数名/参数格式/返回 key):references/api-quickref.md ⚠️ 链式调用前必看
调用本 Skill 任何 from scripts.xxx import ... 之前,先用三件套确认真实 API:
# 1. 列真实函数名(防 score_candidate 这种乌龙)
grep -E "^def [a-z]" /home/ubuntu/.hermes/skills/store-network-planner/scripts/xxx.py
# 2. dump 真实返回结构(防 tasks vs dispatches 这种乌龙)
python3 -c "
import sys; sys.path.insert(0, '/home/ubuntu/.hermes/skills/store-network-planner/scripts')
from xxx import func; import json
print(json.dumps(func(real_args), ensure_ascii=False, indent=2)[:1500])
"
# 3. 看函数签名
grep -A 20 "def target_func" /home/ubuntu/.hermes/skills/store-network-planner/scripts/xxx.py
完整战例 + 通用原则见 systematic-debugging/references/api-surfacing.md。
本节专门记录 V1.3.5 → V1.3.6 期间真实踩中的 5 个坑。任何修改 V1.3.6 新模块的代码前必看。
| 坑 | 触发场景 | 表现 | 修复 |
|---|---|---|---|
| --- | --------- | ------ | ------ |
| 坑 A | from image_compressor import compress_for_wechat | TypeError: compress_image() got an unexpected keyword argument 'description' | PRESETS["wechat"] 包含 description/format 等元字段,不能 PRESETS 解包。必须显式构造** params = {"max_size_kb":..., "format_name":...} 再传。 |
| 坑 B | fpdf2 输出中文 PDF | FPDFException: Not enough horizontal space to render a single character | fpdf2 对 .ttc 字体字符宽度估算崩。multi_cell(0, h, text) 改成 multi_cell(190, h, text)(固定宽度=A4-边距),100% 解决。 |
| 坑 C | CLI 输出 JSON 给其他程序解析 | JSON.parse 失败 "Expecting value: line 1 column 1" | CLI 的 INFO 信息写到 stdout 污染了 JSON。改成 print(..., file=sys.stderr)。-–json 标志开启时尤其要隔离。 |
| 坑 D | analogy_predict_enhanced 永远返回 0 | 静默失败(predicted_revenue=0, confidence=低) | 函数内部硬编码 s["地址"]/s.get("面积") 等中文字段。传英文 key 时全走默认值 0。修复 = 双重 fallback s.get("中文") or s.get("english"),任何模块内部硬编码字段名时要警惕此坑。 |
| 坑 E | 沙箱环境运行天气/地图 API | HTTPSConnectionPool: Network is unreachable | 设计降级链:真实 API → OfflineProvider(本地坐标库)→ mock 数据。所有外部依赖都要有"无 Key/无网络/无权限"三态降级。这是 Agent 友好 Skill 的标配。 |
通用防御原则(来自这 5 个坑):
dict 完整解包**到函数,除非 dict 字段名 100% 对齐 — 静默失败最致命。全栈测试覆盖 11 章 / 25 个用例(每次发布前必跑):
| 章节 | 模块 | 用例数 | 验证内容 |
|---|---|---|---|
| ------ | ------ | ------- | --------- |
| 1. 选址评分 | site_scoring | 2 | 租售比 / 聚客点 |
| 2. 地图 Provider | map_providers | 2 | 4 个 Provider 创建 / URL |
| 3. 类比预测 | analogy + geo_enhanced | 3 | 基础 / 中文 key / 英文 key |
| 4. 客流预测 | footfall_forecast | 4 | 单日 / 节假日 / 一周 / 极端天气 |
| 5. 天气 API | weather_api | 4 | mock / Key 缺失 / 坐标 / CLI |
| 6. 视觉 | vi + compressor | 2 | VI 检测 / 图片压缩 |
| 7. 热力图 | heatmap_gen | 1 | CSV 源热力图 |
| 8. PPT | report_generator | 1 | 单店 10 页 |
| 9. PDF(新) | pdf_report | 4 | 客流 / 选址 / 中文 / CLI |
| 10. 多 Agent | multi_agent | 1 | 3 任务调度 |
| 11. 端到端 | weather+footfall+pdf | 1 | 完整链路 |
测试模板(/tmp/full_e2e_test.py 模式):用 try/except 包每个用例,FAIL 时记录 traceback.format_exc()[:500],最后输出 pass/fail/total 计数 + 健康度评分。
当前状态:25/25 通过(健康度 100/100)。
共 1 个版本