Commit Graph
15 Commits
Author SHA1 Message Date
Your NameandClaude Opus 5 6cd4f1b1db migrate.sh 支持 DSN 与可选客户端路径
生产的宝塔机器把数据库配置放在一个 Go 风格的 IM_DB_DSN 里,而不是 compose
的那组 MYSQL_* 变量;同机自带的 mysql 客户端又缺 caching_sha2_password 插件,
连不上 MySQL 8.4。脚本原先把主机写死成 compose 的服务名 mysql,在非 Docker
环境用不了。

现在 MYSQL_HOST/MYSQL_PORT/MIGRATIONS_DIR/MYSQL_CLIENT 都可覆盖,未设置
MYSQL_USER 时从 IM_DB_DSN 解析;显式的 MYSQL_* 仍然优先。默认值保持 compose
原样,Docker 路径行为不变。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 08:31:32 +08:00
Your NameandClaude Opus 5 a024d59827 后端接入 AI 模型并支持测试账号托管回复
按协议而不是按厂商做适配,与现有短信、对象存储的做法一致:openai 兼容格式
一个适配器即可覆盖 DeepSeek、通义、智谱、火山方舟、Ollama 等,新增厂商通常
只需在后台加一条模型记录;anthropic、gemini、webhook、debug 各一个适配器。
密钥沿用 integration.go 的 AES-GCM 加密存储。

测试账号托管的回复走 persistMessage 同一条落库和推送路径,因此未读数、
WebSocket 推送和会话排序全部复用现有逻辑,客户端无需改动。为此把
persistMessage 抽出 persistMessageContext,因为 worker 没有 *http.Request。

任务队列用数据库表而非内存:重启不丢回复,多实例不重复消费。领取用 UPDATE
打 claim_token 再回读,没有用 SELECT ... FOR UPDATE SKIP LOCKED——生产存在
MySQL 5.7 环境,那里该语法无法解析。同一会话同时只允许一个待处理任务
(pending_key 生成列 + 唯一键),所以用户连发多条消息只会得到一条回复。

闸门:仅 is_test=1 且在允许批次内的账号生效,托管账号之间不互相触发,三层
配额,调用失败默认静默。会话内是否标注 AI 身份由 ai.disclose_in_chat 控制
并默认开启,关闭前需确认所在地区的监管要求。

app.go、integration.go、im.go 三个文件同时包含本次改动之前工作区里就已存在
的未提交修改,一并带入。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 08:31:04 +08:00
Your Name 334890171e gengx 2026-08-27 14:04:28 +08:00
Your Name f7720831be 更新 2026-08-21 10:48:32 +08:00
Your Name 18fa6cfb08 更新 2026-08-20 15:15:07 +08:00
Your Name 05050ff6f3 新增功能 2026-08-19 17:35:59 +08:00
Your Name f8c78739e7 更新 2026-08-18 17:25:22 +08:00
Your Name 1048b9ba29 更新 2026-08-03 10:52:51 +08:00
Your Name 5ac803f7a6 更新 2026-07-31 18:34:44 +08:00
Your Name f22cc1a70d 更新bug 2026-07-31 11:48:16 +08:00
Your Name f913a57529 新增 2026-07-29 09:34:02 +08:00
Your Name 0ff8943ee2 更新 2026-07-28 09:50:12 +08:00
Your Name 45b3bc0852 更新 2026-07-23 11:30:11 +08:00
Your Name 32895b1591 更新 2026-07-16 12:11:05 +08:00
Your Name 22ec32eb29 first commit 2026-07-16 12:02:22 +08:00