企业微信自然语言数据查询集成方案 —— 当前基于 OpenClaw + SQLBot,并维护 Hermes 迁移设计
用户在企业微信中直接提问,系统自动路由至 SQLBot 执行查询,并将摘要、图表和结构化产物回传至企业微信。本仓库提供当前 OpenClaw workspace 配置、SQLBot skill 实现、监控面板和完整运行机制说明,同时在 hermes/ 中记录将 OpenClaw 替换为 Hermes 的初步设计。
- 自然语言直接提问,无需固定命令前缀
- 会话级 SQLBot chat 复用,同一会话内连续追问保持上下文
- 多用户隔离,每个 OpenClaw session 独立绑定 SQLBot
chat_id - workspace / datasource 按会话切换,切换时自动清空旧 chat
- 结构化查询产物:
raw-result.json、normalized.json、data.csv、chart.png、manifest.json - 结构化错误分类:
summary.error_kind提供机器可读的错误类型字段 - 执行链路 Trace:可选开启 JSONL 格式阶段埋点与
telemetry返回 - Dashboard 截图导出(JPG / PNG / PDF,依赖 Playwright)
- 运维监控面板:基于 FastAPI + Alpine.js 的单页看板,展示链路总览、请求追踪、Session 视图和 SQLBot 健康状态
- Hermes 迁移设计:评估以 Hermes 承接企业微信单聊入口和 agent runtime,SQLBot 继续作为问数引擎
WeCom_SQL_Assistant/
├── README.md
├── corp-assistant-sqlbot-workflow.md # 完整工作流说明
├── hermes/
│ └── README.md # Hermes 迁移初步设计
├── openclaw/
│ ├── AGENTS.md # agent 路由规则与行为约束
│ ├── IDENTITY.md # agent 身份定义
│ ├── SOUL.md # 输出风格约束
│ ├── USER.md # 用户模型假设
│ ├── TOOLS.md # 工具使用边界与可观测性说明
│ ├── HEARTBEAT.md # 运行优先级
│ ├── MEMORY.md # agent 记忆文件
│ ├── DREAMS.md # 长期目标
│ └── skills/
│ └── sqlbot-workspace-dashboard/
│ ├── SKILL.md # skill 调用规范与命令模板
│ ├── README.md # skill 说明与新特性文档
│ ├── reference.md # 命令参考
│ ├── sqlbot_skills.py # skill 实现
│ └── .env.example # 环境变量模板
└── monitor/ # 运维监控面板
├── app.py # FastAPI 主程序(路由、API、认证)
├── auth.py # bcrypt 密码存储 + itsdangerous cookie 会话
├── config.toml # 运行时配置(路径、端口、超时等)
├── requirements.txt # Python 依赖
├── setup.sh # 一键部署脚本
├── corp-assistant-monitor.service # systemd unit 文件
├── nginx.conf.example # nginx 反代配置示例
├── readers/
│ ├── trace.py # 读 sqlbot-events.jsonl,计算总览/瀑布
│ ├── state.py # 读 .sqlbot-skill-state.json,检测 session 异常
│ ├── artifacts.py # 扫描 artifacts/ 目录,读取 manifest.json
│ └── sqlbot_health.py # 主动探活 SQLBot API
├── templates/
│ ├── login.html # 登录页
│ └── change_password.html # 首次登录强制改密页
└── static/
└── index.html # 单页前端(Alpine.js + Chart.js + Bootstrap 5)
当前生产链路仍以 OpenClaw 为企业微信入口和 agent runtime:
flowchart TD
User["企业微信用户"] --> WeCom["企业微信机器人"]
WeCom --> Gateway["OpenClaw Gateway"]
Gateway --> Corp["corp-assistant"]
Corp --> Prompt["AGENTS / IDENTITY / SOUL / USER / TOOLS"]
Prompt --> Route{"消息类型"}
Route -->|"问候 / 能力说明"| Direct["直接返回预置说明"]
Route -->|"业务数据请求 / 追问"| Skill["sqlbot-workspace-dashboard"]
Skill --> SQLBot["SQLBot API"]
SQLBot --> DB["业务数据源"]
Skill --> Artifacts["raw / normalized / csv / chart / manifest"]
Skill --> Trace["monitoring/sqlbot-events.jsonl(可选)"]
Trace --> Monitor["Corp Assistant Monitor(运维面板)"]
Artifacts --> Monitor
| 组件 | 职责 |
|---|---|
| 企业微信机器人 | 用户接入入口 |
| OpenClaw Gateway | channel 与 agent 绑定 |
corp-assistant |
消息分类、路由规则、对外输出约束 |
sqlbot-workspace-dashboard |
SQLBot 查询、会话绑定、数据源切换、产物写入 |
| SQLBot | SQL 生成、查询执行、图表返回 |
| Corp Assistant Monitor | 只读运维看板,展示链路健康状态与请求追踪 |
Hermes 迁移方向如下,详细设计见 hermes/README.md:
flowchart TD
User["企业微信单聊用户"] --> WeCom["企业微信机器人"]
WeCom --> Hermes["Hermes WeCom Gateway"]
Hermes --> Profile["corp-assistant profile"]
Profile --> Adapter["SQLBot adapter / MCP wrapper"]
Adapter --> State["Hermes session -> SQLBot chat_id"]
Adapter --> SQLBot["SQLBot API / MCP"]
SQLBot --> DB["业务数据源"]
Adapter --> Trace["trace / artifacts"]
Trace --> Monitor["Corp Assistant Monitor"]
Hermes 方案的核心原则是:Hermes 负责企业微信单聊入口、会话隔离和 agent profile;SQLBot 继续负责 SQL 生成、查询执行和图表数据;中间 adapter 负责把 Hermes 单聊 session 绑定到 SQLBot chat_id,保留连续追问上下文。
| 依赖 | 说明 |
|---|---|
| SQLBot | 已部署,并生成 API Access Key / Secret Key |
| OpenClaw | 已部署 |
| Hermes(迁移验证) | 可选,仅用于替换 OpenClaw 的 POC 或灰度链路 |
| 企业微信机器人 | 已创建,启用长连接模式,获取 botid 和 secret |
| Python 3.9+ | 运行 sqlbot_skills.py 和 monitor/app.py |
| Pillow(可选) | 本地渲染 chart.png |
| Playwright(可选) | Dashboard 截图导出 |
企业微信机器人接入说明:在本地终端部署 OpenClaw 并关联机器人
以下为当前 OpenClaw 生产链路部署流程。Hermes 迁移仍处于设计和验证阶段,先不要直接替换生产入口;迁移步骤见 hermes/README.md。
mkdir -p /root/.openclaw/workspace-corp-assistant-prod
cp -r openclaw/* /root/.openclaw/workspace-corp-assistant-prod/cd /root/.openclaw/workspace-corp-assistant-prod/skills/sqlbot-workspace-dashboard
cp .env.example .env
# 填写以下字段| 变量 | 说明 |
|---|---|
SQLBOT_BASE_URL |
SQLBot 服务地址 |
SQLBOT_API_KEY_ACCESS_KEY |
SQLBot API Access Key |
SQLBOT_API_KEY_SECRET_KEY |
SQLBot API Secret Key |
SQLBOT_API_KEY_TTL_SECONDS |
API token 过期时间(秒),默认 300 |
SQLBOT_TIMEOUT |
HTTP 超时时间(秒),默认 30 |
SQLBOT_DEFAULT_WORKSPACE |
默认工作空间名称或 ID |
SQLBOT_DEFAULT_DATASOURCE |
默认数据源名称或 ID |
Access Key、Secret Key 和企业微信
secret不得进入版本库。
在 OpenClaw 环境中完成以下配置(本仓库不提供带凭据的 openclaw.json):
- 配置企业微信 channel(写入
botid和secret) - 注册
corp-assistantagent - 将
wecomchannel 绑定至corp-assistant - 指定 workspace 目录为
/root/.openclaw/workspace-corp-assistant-prod
python3 sqlbot_skills.py workspace list返回 workspace 列表即表示连接和鉴权配置有效。
# 本地图表渲染
pip install pillow
# Dashboard 截图导出
pip install playwright
playwright install chromium监控面板运行于 192.168.4.15,通过 192.168.4.11(nginx)对外暴露。
# 在 192.168.4.15 上以 root 运行
bash monitor/setup.sh脚本自动完成:复制文件、创建 Python venv、安装依赖、配置防火墙(仅允许 192.168.4.11 访问 8765 端口)、注册并启动 systemd 服务。
部署完成后访问 http://192.168.4.11(经 nginx 反代),默认账号 admin / admin,首次登录强制修改密码。
根据实际路径编辑 monitor/config.toml:
[data]
trace_file = "/root/.openclaw/workspace-corp-assistant-prod/skills/sqlbot-workspace-dashboard/monitoring/sqlbot-events.jsonl"
state_file = "/root/.openclaw/workspace-corp-assistant-prod/skills/sqlbot-workspace-dashboard/.sqlbot-skill-state.json"
artifacts_dir = "/root/.openclaw/workspace-corp-assistant-prod/skills/sqlbot-workspace-dashboard/artifacts/"
sessions_dir = "/root/.openclaw/agents/corp-assistant/sessions/"
skill_env = "/root/.openclaw/workspace-corp-assistant-prod/skills/sqlbot-workspace-dashboard/.env"
# 可选:将 session_key(企业微信 userid)映射为显示名
[user_aliases]
# "wxxxxxxxxxxxxxxxxx" = "张三"每次 ask 在 artifacts/ 目录写入以下文件:
artifacts/
<scope_id>/
<YYYYMMDD-HHMMSS>-record-<id>/
raw-result.json # SQLBot 原始 API 响应
normalized.json # 归一化字段、行数据和图表方案
data.csv # 表格数据(有数据时生成)
chart.png # 渲染图表(有图表方案时生成)
manifest.json # trace 关联、session 信息、文件索引
ask 返回的 compact JSON 包含以下顶层字段:
| 字段 | 说明 |
|---|---|
summary.status |
ok / empty / error |
summary.error_kind |
机器可读错误分类(见下表) |
summary.error_reason |
人类可读错误原因 |
summary.summary_lines |
面向用户的摘要 |
artifacts |
产物文件路径 |
telemetry |
trace_id、耗时、各阶段耗时 |
error_kind 取值:
| 值 | 含义 |
|---|---|
null |
查询成功 |
empty_result |
查询成功但无匹配数据 |
auth_error |
认证失败或权限不足 |
config_error |
workspace 或 datasource 不存在 |
network_error |
无法连接到 SQLBot 服务 |
sql_execution_error |
SQL 生成或执行失败 |
timeout |
请求超时 |
sqlbot_api_error |
其他 SQLBot API 错误 |
sqlbot_skills.py ask 支持开启执行链路跟踪:
# trace 默认启用,写入 monitoring/sqlbot-events.jsonl(skill 目录下)
python3 sqlbot_skills.py ask "本周各客户出货量"
# 关闭 trace
python3 sqlbot_skills.py --no-emit-trace ask "本周各客户出货量"
# 自定义 trace 文件路径
python3 sqlbot_skills.py --trace-file /path/to/events.jsonl ask "问题"
# 指定 trace ID
python3 sqlbot_skills.py --trace-id "run-001" ask "问题"每条事件记录一个执行阶段(JSONL 格式),包含 trace_id、stage、status、duration_ms、error_kind 等字段。ask 返回值中也包含顶层 telemetry 字段,提供完整的阶段耗时分解。
生产流量必须显式携带 session context,禁止使用隐式
defaultscope。
# 查看当前 session 绑定
python3 sqlbot_skills.py \
--openclaw-session-key "<sessionKey>" \
--openclaw-agent-id "corp-assistant" \
session show
# 发起查询
python3 sqlbot_skills.py \
--openclaw-session-key "<sessionKey>" \
--openclaw-agent-id "corp-assistant" \
ask "本周各客户出货量排行"
# 强制新建 SQLBot chat
python3 sqlbot_skills.py \
--openclaw-session-key "<sessionKey>" \
--openclaw-agent-id "corp-assistant" \
ask --new-chat "重新从客户维度分析本月业务量"
# 切换 datasource
python3 sqlbot_skills.py \
--openclaw-session-key "<sessionKey>" \
--openclaw-agent-id "corp-assistant" \
datasource switch "<datasource>" --workspace "<workspace>"
# 重置当前 session(保留 workspace/datasource 绑定)
python3 sqlbot_skills.py \
--openclaw-session-key "<sessionKey>" \
--openclaw-agent-id "corp-assistant" \
session reset
# 完全重置(清空 workspace/datasource 绑定)
python3 sqlbot_skills.py \
--openclaw-session-key "<sessionKey>" \
--openclaw-agent-id "corp-assistant" \
session reset --full# 首次 clone 本项目后,初始化子模块
git submodule update --init --recursive
# 更新 SQLBot 到上游最新 commit
cd SQLBot && git pull origin main && cd ..
git add SQLBot
git commit -m "chore: update SQLBot submodule"| 页面 | 说明 |
|---|---|
| 总览 | 今日请求数、成功率、平均/P95 耗时、错误数、活跃 Session 数(10 秒自动刷新) |
| 对话历史 | 从 manifest.json 读取,支持按用户/数据源/关键字/状态筛选,展开可查看 SQL 和摘要 |
| 请求追踪 | 按状态/日期/Session 过滤,点击行查看执行阶段瀑布图 |
| Session 视图 | 所有 scope 的 workspace/datasource/chat 绑定状态,异常行高亮 |
| SQLBot 健康 | 主动探活 SQLBot API,显示可达状态和错误原因 |
当前 OpenClaw 生产链路验收:
| 场景 | 预期结果 |
|---|---|
| 企业微信发送问候消息 | 直接返回能力说明,不调用 SQLBot |
| 发送自然语言数据请求 | 调用 SQLBot,返回中文摘要 |
| 同一会话继续追问 | 复用当前 SQLBot chat |
| 切换 workspace / datasource | 清空旧 chat,下次提问新建 |
session reset |
清空分析状态,保留 workspace/datasource |
| SQLBot 认证失败 | 返回认证失败,不说无数据 |
| SQLBot 无结果 | 返回执行成功但无匹配数据 |
| SQLBot 连接失败 | 返回无法连接问数服务 |
Hermes 迁移验收需额外验证:
| 场景 | 预期结果 |
|---|---|
| A 用户单聊提问 | 创建或复用 A 独立 SQLBot chat |
| B 用户单聊提问 | 创建或复用 B 独立 SQLBot chat,不读 A 的上下文 |
| A 用户连续追问 | 复用 A 当前 SQLBot chat |
| A 用户重新开始 | 清空 A 的 SQLBot chat,不影响其他用户 |
| Hermes memory 开启时 | 不写入业务问题、SQL、结果行或客户数据 |
- 问候类消息和功能说明请求直接由 agent 回复,不进入 SQLBot
- 数据查询请求默认路由至 SQLBot,无需
查询前缀 - 对外输出为简洁中文摘要,不暴露内部路径、session key 或调试信息
- SQLBot 返回错误时按执行失败处理,不得误判为"无数据"
summary.error_kind用于程序路由,不要从人类可读文本猜错误类型
.env(含 SQLBot API Key)、openclaw.json(含企业微信 secret)均在.gitignore中排除,切勿提交- 监控面板仅允许来自 nginx 反代服务器(
192.168.4.11)的请求访问,防火墙已在setup.sh中自动配置 - 首次登录强制修改默认密码,密码使用 bcrypt 存储
涉及生产行为调整时,需同步以下文件:
openclaw/AGENTS.mdopenclaw/TOOLS.mdopenclaw/skills/sqlbot-workspace-dashboard/SKILL.mdopenclaw/skills/sqlbot-workspace-dashboard/sqlbot_skills.pycorp-assistant-sqlbot-workflow.mdhermes/README.md(如涉及 Hermes 迁移设计或目标链路)- 本 README
✅ 已实现 ⬜ 未实现 🔲 部分实现
面板设计分四个阶段:
- ✅ P0:只读已有文件,快速上线可观测面板
- ✅ P1:补充 SQLBot skill 结构化 trace,精确记录 SQLBot 执行阶段
- ⬜ P2:补充企微入口/出口埋点,精确记录消息接收和投递结果
- ⬜ P3:增加告警和运维操作,但默认保持只读
- ⬜ 企微通道状态(需 P2 企微埋点,暂无数据来源)
- ⬜ corp-assistant agent 状态(需 P2 企微埋点,暂无数据来源)
- ✅ SQLBot API 探活状态
- ✅ 今日请求数、成功率、失败率、空结果率
- ✅ 平均耗时、P95 耗时
- ⬜ 活跃用户数(仅统计了活跃 Session 数,用户数未去重单独展示)
- ✅ 活跃 session 数
- ✅ 最近错误 Top N
- ✅ 时间、企业微信用户(别名映射)、sessionKey、chat_id、record_id、状态、总耗时
- ✅ 按用户、session、状态过滤
- ⬜ sessionId、问题摘要、skill 是否命中(trace JSONL 中无此字段)
- ⬜ delivery_failed / timeout 状态(需 P2 企微埋点)
- ⬜ 按 record_id、时间范围筛选
- ✅ 执行瀑布图(skill 内各阶段)
- ⬜ agent 侧阶段(message_received / message_sent 等,需 P2)
- ⬜ 请求追踪详情页关联 artifacts 文件(raw-result / chart.png / data.csv)
- ✅ scope_key、workspace、datasource、chat_id、record_id、最近问题、更新时间
- ✅ 异常标记:datasource 缺失、default scope、无 chat_id
- ⬜ 异常标记:session 频繁重建、chat 为空但已有连续追问、artifacts 缺失
- ✅ SQLBot API 是否可达(HTTP 探活)
- ✅ query 成功/失败/空结果统计(在总览实现)
- ⬜ 默认 workspace/datasource 是否可解析(仅探活连通性)
- ⬜ 最近 SQLBot record 列表、chart 渲染成功率、CSV 生成成功率
从 artifacts/manifest.json 读取:
- ✅ 按用户、数据源、关键字、状态过滤
- ✅ 展开详情:执行 SQL、返回摘要、error_reason
- ✅ 用户别名配置(服务端持久化,多用户共享)
| 文件 | 已接入 |
|---|---|
.sqlbot-skill-state.json(SQLBot session 状态) |
✅ |
sqlbot-events.jsonl(skill trace) |
✅ |
artifacts/<scope>/<record>/manifest.json |
✅ |
sessions/sessions.json(agent session registry) |
⬜ 配置在 config.toml 但面板未读取 |
sessions/*.jsonl(agent 对话和工具调用) |
⬜ |
logs/config-health.json(配置健康) |
⬜ |
✅ 已实现 ⬜ 未实现
- ✅ trace 参数:
--trace-id、--trace-file、--no-emit-trace,未传时自动生成 trace_id - ✅ 结构化事件日志(JSONL):写入
monitoring/sqlbot-events.jsonl,字段含 stage / status / error_kind / duration_ms 等 - ✅ 执行阶段埋点:session_context.resolve / state.load / workspace.resolve / datasource.resolve / chat.start / question.stream / record.data.fetch / result.normalize / chart.plan / artifact.write_* / state.save / ask.finish
- ✅ 错误分类标准化:config_error / auth_error / network_error / sqlbot_api_error / sql_execution_error / timeout / empty_result / artifact_error / state_error
- ✅
ask返回体新增telemetry字段:trace_id / started_at / finished_at / duration_ms / stage_durations_ms - ✅ artifact manifest:每次
ask写manifest.json,含 trace_id / session_key / question / workspace / datasource / chat_id / record_id / row_count / chart_kind / SQL 摘要 / 文件索引 - ⬜
python3 sqlbot_skills.py healthCLI 命令(当前仅面板侧做了 HTTP 探活) - ⬜
python3 sqlbot_skills.py session list全量列表子命令(现只有session show,面板直接读文件替代) - ✅ 隐私与脱敏:trace 不记录 API key / secret;SQL 仅在展开详情时显示
- 请求追踪详情 → 关联 artifacts 文件:瀑布图下方增加 raw-result / chart.png / data.csv 链接或预览
- SQLBot 健康 → workspace/datasource 可解析验证:调用 API 确认默认配置实际存在
sqlbot_skills.py healthCLI 命令:本地一键健康自检,也可供面板调用- Session 视图异常检测增强:频繁重建、chat 为空但已有追问
- P2 企微埋点:message_received / message_sent 阶段,需改动 OpenClaw 或企微 webhook 入口
- Hermes POC:验证 WeCom 单聊 session 隔离,并实现
Hermes session -> SQLBot chat_id绑定 - SQLBot adapter 抽取:将
sqlbot_skills.py中的 API client、错误分类、artifacts 和 trace 逻辑抽成 Hermes 可调用服务或 MCP wrapper
| 企业微信交互 | OpenClaw 返回 | SQLBot 查询结果 |
|---|---|---|
![]() |
![]() |
![]() |
- corp-assistant-sqlbot-workflow.md — 完整工作流、状态流转、可观测性机制和验收清单
- hermes/README.md — Hermes 迁移初步设计、单聊 session 隔离和 SQLBot adapter 方案
- openclaw/skills/sqlbot-workspace-dashboard/README.md — skill 新特性说明(trace、error_kind、manifest)
- openclaw/skills/sqlbot-workspace-dashboard/reference.md — 命令快速参考
- Hermes WeCom Bot — Hermes 企业微信 Bot 接入说明
- SQLBot MCP Server — SQLBot MCP 调用说明


