通知与集成¶
SlotServe 可以在 Telegram、飞书 / Lark、钉钉、企业微信和 QQ 上给大家发消息、响应命令,把告警和公告发到群里,把预约发布成日历订阅,把用量导出为 CSV,并提供 Prometheus 指标。这些都是可选功能,在管理 → 系统设置中配置;管理 → 聊天渠道显示每个机器人是否已连接。
聊天平台¶
| 平台 | SlotServe 接收消息的方式 | 是否需要公网地址 | 按钮 |
|---|---|---|---|
| Telegram | 长轮询 | 否 | 内联按钮 |
| 飞书 / Lark | 长连接(WebSocket) | 否 | 消息卡片 |
| 钉钉 | Stream 模式(WebSocket) | 否 | 编号选项(点击即发送) |
| 企业微信 | 回调地址 | 仅接收命令时需要 | 编号选项 |
| WebSocket 网关 | 否 | 编号选项 |
所有平台提供相同的命令和通知,可以同时开启多个。一个人在绑定过的每个平台上都会收到通知;收哪些通知只需设置一次,对所有平台生效。
绑定。 每个人在设置 → 聊天通知中点平台旁的绑定。Telegram 会打开机器人,点 Start 即完成绑定。其他平台会显示一条类似 bind K7P2QX 的消息,30 分钟内在私聊里发给 SlotServe 机器人即可(也可以发 绑定 K7P2QX)。绑定码只能用一次;一个平台账号只能绑定一个 SlotServe 账号。发送测试检查连接,通知开关可以暂停某个平台,解除绑定(或在聊天里发 /unlink)取消绑定。
消息使用每个人界面的语言,时间按时区设置显示。群聊和尚未绑定的人收到的消息使用群聊语言。
| 通知 | 接收人 |
|---|---|
| 预约 10 分钟后开始 | 预约人 |
| 模型已加载完成 / 整卡预约的 GPU 已空出 | 预约人 |
| 预约 10 分钟后结束,附延长 30 分钟、延长 1 小时、立即结束按钮 | 预约人 |
| 管理员替你预约、修改、取消或结束了你的预约 | 预约人 |
| 预约的模型加载失败,暂由默认模型提供服务 | 预约人和管理员 |
| 你的预约申请已通过、被拒绝(附理由)或已过期 | 预约人 |
| 开发环境已就绪(附 ssh 命令)或没能启动 | 预约人 |
| 候补的时段空出来了,或已自动为你预约 | 候补人 |
| 你发起的下载完成或失败 | 下载发起人 |
| 有预约需要审批,附通过和拒绝按钮 | 管理员 |
| 模型加载失败、有新用户注册、模型目录磁盘不足 | 管理员 |
命令(与机器人私聊):
| 命令 | 作用 |
|---|---|
/status |
当前模型和谁在使用 GPU |
/book |
用按钮预约:通道、模型(或整卡)、日期、开始时间、时长,最后确认 |
/free |
各通道今天和明天的空闲时段 |
/cancel |
选择一个未开始的预约并取消 |
/today |
未来 24 小时的预约 |
/mine |
我接下来的预约 |
/extend [分钟] |
延长我正在进行的预约(默认 30) |
/release |
立即结束我正在进行的预约 |
/unlink |
解除与此聊天的绑定 |
用 /book 预约和网页遵守完全相同的规则:冲突检查、单次最长时长、最多提前天数、配额和审批。机器人提供整点开始时间(以及「现在」),其他时间、参数预设和每周重复请在网页上操作。如果确认时这个时间刚被别人约走,机器人会提供「加入候补」。
除 Telegram 外,命令也可以不带 /,或者用中文:状态、预约、空闲、取消、今天、我的、延长、结束、解绑。没有按钮的平台会把选项编号,回复编号即可;钉钉里的编号是链接,点一下就会发送。在群聊里(Telegram 除外),机器人只在被 @ 时回答 /status、/free、/today 和 /help;涉及个人预约的命令请在私聊里使用。
Telegram¶
机器人使用长轮询,服务器只需要能访问 Telegram,不需要公网地址或开放端口。
- 在 Telegram 里找 @BotFather,发送
/newbot,复制得到的 Token。 - 粘贴到管理 → 系统设置 → Telegram 机器人 Token 并保存。如果网络无法直连 Telegram,同时填写 Telegram 代理(
http://…或socks5://…)。 - 大家在设置 → 聊天通知里点 Telegram 旁的绑定。在 Telegram 里输入
/可以看到命令列表。
飞书 / Lark¶
开启机器人能力的企业自建应用。事件和卡片按钮回调都通过 SlotServe 主动建立的长连接接收,不需要公网地址。
- 在开发者后台(open.feishu.cn/app,Lark 为 open.larksuite.com/app)创建企业自建应用,添加机器人能力。
- 在权限管理中开通:获取与发送单聊、群组消息(
im:message)、以应用的身份发消息(im:message:send_as_bot)、读取用户发给机器人的单聊消息(im:message.p2p_msg:readonly)、获取群组中所有 @机器人 的消息(im:message.group_at_msg:readonly)。 - 把凭证与基础信息里的 App ID 和 App Secret 填到管理 → 系统设置 → 飞书 / Lark 机器人,打开开关并保存。Lark 需要把开放平台地址改为
https://open.larksuite.com。等管理 → 聊天渠道显示已连接。 - 在事件与回调中,事件和回调都选择使用长连接接收(只有 SlotServe 已连接时后台才能保存),然后添加事件
im.message.receive_v1(接收消息)和回调card.action.trigger(卡片回传交互)。 - 创建版本,可用范围包含要使用机器人的人,然后发布。
钉钉¶
使用 Stream 模式的企业内部应用机器人:由 SlotServe 主动连接钉钉,不需要公网地址。
- 在开发者后台创建企业内部应用,添加机器人能力,机器人的消息接收模式选择 Stream 模式。
- 在权限管理中确认已开通企业内机器人发送消息权限(
qyapi_robot_sendmsg),发送通知需要它。 - 把凭证与基础信息里的 Client ID(AppKey)和 Client Secret(AppSecret)填到管理 → 系统设置 → 钉钉机器人,打开开关并保存。机器人 RobotCode 可以留空,默认使用 Client ID(企业内部应用通常如此)。
- 发布应用版本并设置可见范围。大家按名字搜索机器人(或从应用中打开)并发送绑定消息。在群里使用时,把机器人加入群并 @ 它。
钉钉机器人消息在没有卡片模板时无法带回调按钮,所以选项会编号;编号是链接,点一下就会把编号发回给机器人。
企业微信¶
企业微信自建应用。发送消息使用企业微信服务端 API,不需要公网地址;接收命令(包括绑定消息)需要企业微信能通过互联网访问 SlotServe 的回调地址。
- 在企业微信管理后台的应用管理中创建自建应用,记下 AgentId 和 Secret,把可见范围设为要使用的人。
- 在我的企业 → 企业信息复制企业 ID。
- 在应用设置的企业可信 IP 中加入 SlotServe 服务器的公网出口 IP(较新的应用调用 API 时必须设置)。
- 要接收消息,打开应用的接收消息 → 设置 API 接收,随机生成 Token 和 EncodingAESKey,先不要关闭页面。
- 把企业 ID、AgentId、Secret、Token 和 EncodingAESKey 填到管理 → 系统设置 → 企业微信应用,打开开关并保存。
- 回到企业微信,填写管理 → 聊天渠道里显示的回调地址(
https://<你的服务器>/api/channels/wecom/callback)并保存,企业微信会立即校验。企业微信可能要求回调地址的域名是本企业已验证的域名。
没有配置回调(第 4–6 步)时,企业微信机器人收不到绑定消息,大家就无法绑定;下面的群机器人不受影响。
QQ¶
QQ 开放平台的官方机器人。SlotServe 连接 QQ 的 WebSocket 网关,接收单聊(C2C)消息和群里 @机器人 的消息。
- 在 QQ 开放平台创建机器人,从开发 → 开发设置复制 AppID 和 AppSecret。
- 把 SlotServe 服务器的公网出口 IP 加入机器人的 IP 白名单。
- 确认机器人可以在单聊和群聊中使用(单聊、群聊消息能力)。机器人上线前,在沙箱配置中添加测试用户和测试群,并在 SlotServe 中打开沙箱环境。
- 把 AppID 和 AppSecret 填到管理 → 系统设置 → QQ 机器人,打开开关并保存。
QQ 只允许机器人在一段时间内回复用户的消息,命令的回答就使用这种被动回复。通知属于主动消息,QQ 会根据机器人的权限限制或拒绝,因此在 QQ 上可能收不到通知。消息里的链接也可能被拦截,除非域名已在机器人处登记。
群机器人 Webhook¶
群机器人把消息发到群聊里。它们只发送、不需要公网地址,在管理 → 系统设置 → 群机器人 Webhook 中配置:
- 飞书 / Lark:在群里打开设置 → 群机器人 → 添加机器人 → 自定义机器人,复制 Webhook 地址(
https://open.feishu.cn/open-apis/bot/v2/hook/…)。如果开启了签名校验,同时填写签名密钥。 - 钉钉:在群里打开群设置 → 机器人 → 添加机器人 → 自定义,安全设置选择加签,把
SEC开头的密钥和 Webhook 地址(https://oapi.dingtalk.com/robot/send?access_token=…)一起填入。(使用「自定义关键词」会拒收大部分 SlotServe 消息。) - 企业微信:在群聊中添加群机器人,复制 Webhook 地址(
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=…),密钥包含在地址里。
发到群里决定群里收到什么:管理员告警(模型加载失败与回退、新用户注册、磁盘不足)、审批申请(纯文本;在网页或与机器人的私聊里审批)和公告。管理 → 聊天渠道中每个 Webhook 都有发送测试按钮,还可以在那里发布公告。
日历订阅¶
设置 → 日历订阅提供两个私有 iCalendar 链接:我的预约、所有人的预约。在 Apple 日历、Google 日历、Outlook 或 Thunderbird 中以「订阅日历 / 网络日历」方式添加,日历应用会定期刷新(通常 15 分钟到几小时)。
拿到链接的人都能看到其中的预约。重新生成链接会让旧链接失效。如果大家访问 SlotServe 的地址与浏览器里显示的不同,请设置访问地址。
CSV 导出¶
用量 → 导出 CSV 按所选时间段和范围(所有人或只看我)下载:
| 导出 | 列 |
|---|---|
| 按人汇总 | 用户、预约次数、预约时长、预约 GPU 时、使用 GPU 时、预约期间平均利用率 %、显存峰值(MB)、能耗(Wh)、请求数、输入与输出 tokens |
| GPU 时间 | 日期、通道、GPU、类型、用户、GPU 时、使用 GPU 时、平均利用率 %、显存峰值(MB)、能耗(Wh),每天/通道/GPU/类型/用户一行 |
| 按天汇总 | 日期、用户、模型、请求数、输入与输出 tokens |
| 逐条请求 | 时间、用户、API 密钥、模型、接口、是否流式、状态码、tokens、耗时 |
类型为 model、gpu(整卡预约)、devenv、idle_model 和 idle_devenv(无人预约时的共享使用)以及 free。没有 GPU 指标的通道 GPU 列为空。也可以通过 GET /api/usage/export?kind=people|compute|summary|requests&days=30&scope=all|mine 获取。文件为带 BOM 的 UTF-8,Excel 可直接打开。
Prometheus¶
设置监控 Token 后开启 GET /metrics,抓取时把它作为 Bearer Token:
scrape_configs:
- job_name: slotserve
metrics_path: /metrics
authorization:
credentials: <监控 Token>
static_configs:
- targets: ["gpu-server:8000"]
| 指标 | 类型 | 标签 |
|---|---|---|
slotserve_runtime_state |
gauge | state |
slotserve_runtime_model_info |
gauge | model、preset |
slotserve_reservation_active |
gauge | user |
slotserve_reservations_upcoming |
gauge | |
slotserve_requests_total |
counter | user、model、outcome(ok / error) |
slotserve_tokens_total |
counter | user、model、type |
slotserve_request_seconds_total |
counter | user、model |
slotserve_model_loads_total |
counter | model、result |
slotserve_model_load_seconds |
gauge | model |
slotserve_downloads_pending |
gauge | |
slotserve_gpu_memory_used_bytes、…_total_bytes、slotserve_gpu_utilization_ratio、slotserve_gpu_temperature_celsius、slotserve_gpu_power_watts |
gauge | gpu、name、lane |
slotserve_lane_occupant |
gauge | lane、kind、user(通道当前在做什么) |
slotserve_booked_gpu_hours_total |
counter | user、lane、kind(已过去的预约时长 × 通道 GPU 数) |
slotserve_gpu_seconds_total |
counter | lane、gpu、kind(已记录的 GPU 时间) |
slotserve_gpu_busy_seconds_total |
counter | lane、gpu、kind(利用率不低于繁忙阈值的时间) |
slotserve_gpu_energy_joules_total |
counter | lane、gpu |
slotserve_user_gpu_busy_seconds_total |
counter | user、kind |
未设置 Token 时该接口返回 404。