Your Name and Claude Opus 5
b42743c882
AI 托管账号支持筛选未托管
...
筛选只有「仅已托管」一个选项,想找还没开启的账号只能翻页。补上
managed=0:未托管既包括从未绑定的账号,也包括绑定后被关闭的账号,
运营要开启的正是这两类,所以放在一起。
测试覆盖三种状态,并断言两个筛选相加等于全部、没有重复计数。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-04 11:34:39 +08:00
Your Name and Claude Opus 5
151834caac
模型支持协议扩展参数,用于关闭思考模式
...
DeepSeek 现役的 v4 系列全部默认开启思考模式,没有单独的非思考型模型
可换;官方给的关闭方式是在请求里带 thinking={"type":"disabled"}。
ai_models 表早有 extra_json 字段但从未接线,这里接通:模型配置里的
JSON 对象会合并进每次调用的请求体,因此任何协议级参数都能在管理端
配置,不必改代码。合并不会覆盖 model/messages/max_tokens/temperature/
stream —— 预算和结构由代码掌握,重试逻辑才不会被配置绕过。
写入前校验 JSON,避免非法值存进 JSON 列后每次调用才报错。
线上模型已配置为关闭思考:同一会话下由 10133 ms / 1024 输出 tokens、
回复被截断,变为 669 ms / 10 tokens、回复完整。max_tokens 相应回调至 512。
管理端模型表单新增「协议参数」输入框(该目录尚未纳入版本库,仅已发布)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-04 11:19:17 +08:00
Your Name and Claude Opus 5
812d8032e1
修复 AI 回复为空与开头数字被吞
...
日志里一批「成功但回复为空」的调用,completion tokens 恰好等于配置的
上限 256:推理模型把预算全花在思维链上,正文没写出来就被截断。
- 解析 OpenAI 兼容响应时读取 reasoning_content,并据此与 finish_reason
判断「被截断」。
- 被截断时自动加大预算重试一次(4 倍,下限 1024、上限 4096),两次调用
都记入日志以便核算成本;重试后仍为空才报错,并说明是推理占满预算,
提示调高 tokens 或改用非推理模型。
- sanitizeAIReply 原本用 TrimLeft 去掉列表符号,连同任何开头的数字一起
吃掉了——「30岁啦」发出去变成「岁啦」。改为只匹配真正的列表前缀
(- * • 或 "1. " "2、"),号码、年龄、时长都不再受损。
线上两台已将模型 max_tokens 由 256 调整为 2048。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-04 10:50:25 +08:00
Your Name and Claude Opus 5
acd8933dbb
后端:资料距离、语音图片会员限制、免短信注册、AI 托管回复修复
...
- 单用户资料接口补上距离:此前只有推荐/附近列表会算距离,资料页和
聊天头部因此无内容可显示。沿用同一套 haversine 与隐私开关。
- 语音/图片消息可限定会员发送,两个开关在管理端「运营配置」中修改
(迁移 032)。校验放在 persistMessageContext,HTTP 与 WebSocket
两条发送路径都覆盖;文本消息永不受限。
- 短信服务关闭时注册不再要求验证码:关掉之后没人能拿到验证码,继续
要求就等于关闭注册通道。重置密码不做同样放宽,那里缺验证码等于
凭手机号夺号。app/config 增加 smsVerification 供客户端决定表单形态。
- 修复 AI 托管账号之间不回复:原规则按「发送方是否托管账号」拦截,
把真人操作测试号的正常对话也挡了。改为标记 worker 自己写入的回复,
只对 AI 生成的消息跳过入队。
- ai.default_model_id 同时接受模型 ID 与名称,填名称时不再被 MySQL
静默转成 0 而使配置失效。
- 聊天媒体留存管理与清理任务(迁移 033,两台线上均已应用)。
新增集成测试均针对真实 MySQL:会员限制、免短信注册、AI 入队规则、
默认模型解析、资料距离。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-04 10:00:08 +08:00
Your Name
842990b0e7
更新
2026-09-03 08:38:17 +08:00
Your Name and Claude 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 Name and Claude 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