Commit History
Yesterday
-
shan chu tupian yuchong xiazai, chidu gengxin an zhen he bing
xiaolongmr36b3bb0 -
降低线上轮询压力:后台标签页暂停轮询、关闭 access log
xiaolongmr线上容器(cpu-basic,2 共享 vCPU)实测 1841 req/s,超出承载数倍, 导致连返回静态 JS 都要 55 秒。日志拆解后,热点全是自家前端的全局轮询接口: /auth/session 375/s /api/chat-room/unread 359/s /api/chat-room/direct-conversations 350/s /api/presence/ping 334/s /api/announcements 106/s 四项改动(均不改变任何功能,用户感知不到差别): 1) Dockerfile 去掉 --access-log 实测 access log 占日志体积一半(约 285 KB/s、1800 行/秒),容器只有 2 核,每条请求都多一次格式化 + write 系统调用。注意 main.py 末尾的 uvicorn.run(access_log=False) 在线上不会执行(CLI 启动),所以必须改这里。 2) use-chat-room-unread:只在页面可见时轮询 这个 hook 挂在全局导航,每个标签页都在跑,含切到后台/被遗忘的标签页。 后台没人看角标,请求却照打。切回页面时立刻补拉一次。 3) announcements-popover:同样只在可见时轮询 该组件在顶栏挂了 2 份(移动端/桌面端各一),每个标签页跑两份。 4) use-auth-guard:权限兜底同步 5s → 30s 原本是 force 校验(绕过本地缓存直打服务端),是全站最重接口、占请求 20%。 权限和登录态不会 5 秒一变;focus / visibilitychange 仍会立刻强制校验一次, 真实感知比 30 秒更灵敏。 presence 心跳保持后台上报(约 25s)不变 —— 那是「在线人数」要统计后台标签页的 有意设计,属功能行为,未改动。 真机验证(artifacts/_visibility_gate_test.py)10/10 通过: 可见时 unread / direct-conversations…d188720
2 days ago
-
聊天室未读角标:改成红色圆形气泡,并把私聊未读一并计入
xiaolongmr1) 样式:顶部「聊天室」导航项的未读提示原来是纯文字红色数字, 改成微信/QQ 那种红色圆形气泡(rose-500 底 + 白字 + rounded-full)。 用 min-w-4 + px-1 让个位数是正圆、两位数自然撑成胶囊, 避免固定 size-4 时 "99+" 溢出;补 aria-label 标注未读条数。 2) 计数:原来只算公共大厅未读,私聊未读拿不到。 useChatRoomUnread 改为 大厅未读 + 所有私聊未读之和, 两个请求并发发(Promise.all),传私聊已读位置整表给服务端做差集。 真实机验证 9/9 通过(含「造 2 条私聊 → 角标 +2,读掉后回落 2」), 回归 _chatroom_unread_test / _pin_test / _api_e2e 共 49 项全过。d24ebec -
聊天室:修复置顶 422,未读角标改挂到用户行
xiaolongmr置顶报 422 的根因: - 前端把 body 做了 JSON.stringify 再交给 httpRequest,而 httpRequest 是直接把它 当 axios 的 data 传下去的 —— **传字符串时 axios 不会自动补 Content-Type: application/json**,FastAPI 就把 body 当非 JSON, 报「Field required」→ 422。 - 修法:改成传**原始对象** `body: { pinned }`,与文件里其他 POST 调用一致。 (curl 复现:不带 Content-Type 的字符串 body → 422,带上 → 200。) 未读角标的位置与语义: - ⚠️ 不再把「会话数」红色角标挂在「私聊」分组标题上 —— 那个数字分不清是谁发来的。 改成挂在**每个用户那一行**(对方昵称右侧),显示「这个人有几条我没看」。 - ⚠️ 原来 direct_conversations() 的 total 是「所有非我发的消息总数」, 没有已读概念 → 角标只增不减(读完也不消)。现在按已读位置过滤。 - 已读位置**不落库**:存 localStorage(`chatgpt2api_chat_room_direct_read`, peer_id → 已读到的最大 id),接口用 `mark=peer:last_id,...` 把整张表带过去, 服务端只数 `id > last_read` 的对方消息。这样不必新建「每用户每会话已读表」。 - ⚠️ 私聊的已读位置**与公共大厅分开存**:两边消息 id 不同源,共用一个 key 会互相顶掉。 - 打开会话 / 正在看该会话时收到新消息 → 立刻写已读位置并广播事件, 收件箱监听该事件即时重拉,角标当场归零,不必等下一个轮询周期。 - `_parse_marks` 把前端输入一律当不可信:格式不对整段丢弃,宁多显示未读也不能 500。 另外顺手改:收件箱摘要里自己发的消息加「我:」前缀(否则看起来像对方说的), 已撤回的显示「[消息已撤回]」而不是空白。 验证:四套聊天室测试共 64 项全过(服务层 24 + HTTP 11 + 用户侧端到端 15 + 未读 14)。 tsc / eslint 全绿。已清…ca6cef4 -
聊天室:管理员置顶公告 + 修复私聊收不到/回不了
xiaolongmr置顶(仅管理员,服务端强制): - 消息表新增 pinned_ts / pinned_by 两列,_row_to_message 下发 pinned / pinned_at。 - set_pinned 只放行 admin;已删除的消息不能置顶;撤回时一并清掉置顶。 - 新增 GET /api/chat-room/pinned 与 POST /api/chat-room/messages/{id}/pin。 - 置顶条**独立于翻页列表**:置顶消息可能早就不在当前页,仍要常驻顶部。 - 前端在 header 与消息区之间加置顶横幅,多条默认只露第一条(可展开), 点击跳转到原消息(不在当前页时给提示,不静默无反应)。 修复「管理员私聊用户,用户看不到消息,也无法回复」——两个独立成因: 1) 权限判定用错:_assert_can_direct(只允许 admin)被误用到读历史/回复路径, 导致收件人侧一律 403。拆出 _assert_can_access_conversation(会话双方可访问), 读历史与「回复已有会话」走它;只有「发起全新会话」才要求 admin。 ⚠️ 判定新会话不能只看「me 在参与者里」——新会话的键就是 dm:me|peer,恒成立, 必须用 _has_history() 查是否有实际往来,否则普通用户能私聊任何人。 2) 收件人没有入口:原未读统计只看公共大厅,收件人根本不知道有人私聊自己。 新增 direct_conversations() + GET /api/chat-room/direct-conversations, 前端侧栏加「私聊」区块(头像/昵称/摘要/在线点 + 计数徽章)。 验证:服务层 24 项、HTTP 接口 11 项、用户侧真实鉴权端到端 15 项,共 50 项全过。 后端全量测试 948 passed,失败 26 项均为既有环境漂移(chrome 指纹版本、导航迁移), 与本次改动无交集(chat_room 相关 0 项失败)。80c80f8 -
聊天室:头像回退微信头像、复用画图页输入框、撤回删除、布局收口
xiaolongmr头像 - 根因是聊天室与 presence 只读 identity["avatar_url"],而微信登录用户的头像 存在 wechat_avatar 里,于是恒为空、界面只显示首字占位(签到页能显示是因为 它两个字段都读)。新增 presence_service.resolve_avatar_url 统一口径: 先 avatar_url,再回退 wechat_avatar,与顶栏 / 画图页 / 批量页 / 签到页一致。 - 在线列表、消息落库、summary.me 三处都改走这个函数。 输入框 - 底部输入框改用画图页同一套 @/components/prompt-composer 部件 (Surface / Textarea / Toolbar / SubmitButton),外形与画图页完全一致。 - @ 唤出面板通过 suggestions 传入,键盘拦截走 onKeyDownCapture (返回 true 表示面板已消费该按键),粘贴图片仍走 onPaste。 撤回与删除 - 软删除:新增 deleted_ts / deleted_by 两列,不做物理删。消息 id 是前端翻页 游标,物理删会留下空洞、导致增量轮询的序列错乱。 - 已删消息的正文与图片在服务端就抹空(不能只靠前端不渲染,否则直接读接口 仍能拿到内容)。前端显示「你/某人撤回了一条消息」或「管理员删除了一条消息」。 - 权限在服务端强制:作者本人 2 分钟内可撤回(RECALL_WINDOW_SECS=120), 管理员可删任意消息。前端按钮只按同一规则决定是否渲染,不作为权限依据。 - 新增 DELETE /api/chat-room/messages/{id}。 - mergeMessages 支持就地更新:撤回后 id 不变而内容变了,若只做「去重后追加」, 轮询拉回的已删状态会被旧数据挡住,界面永远不会更新。 布局 - 输入框区去掉「所有登录用户可见,请勿发送隐私信息」。 - 左上角侧栏头部由「在线用户 + 计数 + 搜索框」改为单个「公告聊天室」标题。 - section 高度由 min-h 改为固定 h:AppShell 内层本身是 min-h-screen 加 pt-[5.25rem],section 再叠 min-h 会与之相…5b477d8 -
新增聊天室页面:登录用户群聊
xiaolongmr- 后端:services/chat_room_service.py(SQLite 只追加存储,经镜像 runtime_file 持久化)+ api/chat_room.py(消息增删查 / 汇总接口,均需登录) - 前端:/chat-room 页面,3s 轮询增量拉取、乐观发送、回车发送、500 字上限、自动滚底、日期分隔与角色徽章 - 导航:三套角色导航均插入「聊天室」(对话之后),含一次性迁移e61d03a
3 days ago
-
生图失败:账号配额耗尽当场出池并换号,失败卡片收掉「查看官网对话」
xiaolongmr上游「你已达到 Free 套餐的图像生成请求上限」这类只回文字、本轮没生图的终局答复, 以前被一律当成 content_policy_violation 抛给用户:账号留在池子里、本地配额对免费号是 「未知」算不到 0 → 后续每个请求都再挑中它,每个用户都吃一次同样的报错。 - conversation.py:新增 is_image_quota_exhausted_message()(中/英文原话)→ 命中时 code=image_quota_exhausted(429/rate_limit_error)、can_view_official=False;号池层 换号重试(预算 max(2, image_poll_max_attempts),本机该配置是 1,直接用等于零换号)。 - account_service.py:新增 mark_image_quota_exhausted() —— 当场置「限流 / quota=0 / image_quota_unknown=False」,由既有 account-limited-watcher 远程复核后自动回池。 - 号池被这类账号掏空时仍抛内部英文 no available image quota(站长按这串配了报错文案规则)。 - 前端:StoredImage.canViewOfficial ← task.can_view_official(page.tsx 三处映射 + 变更检测, image-results.tsx 按钮条件加 canViewOfficial !== false;老记录没这字段 = 保持旧行为)。 - 测试:test_image_upstream_note.py +8(配额识别、号池分类、换号拿到图、整池掏空仍报错、 端到端落库断言 can_view_official is False);test_account_image_capabilities.py +2。 全量 pytest 20 failed / 954 passed,FAILED 清单与基线 full-test-6.log 逐行一致。1d719cf -
在线人数改为全站心跳:覆盖所有页面 + 关闭页面立即下线
xiaolongmr2c2d0e1 -
积分消耗统计:用量流水表 + 看板筛选/趋势/模型明细/Top 用户
xiaolongmr5b273a6 -
实时在线人数:画图页纯文字展示 + 管理员数据看板
xiaolongmr7ef525a -
官网来源取证 + 生图终局判定 + 对话卡片渲染
xiaolongmr- 官网来源取证:每张结果图可生成 chatgpt.com 官方匿名分享链接自证「确实是官网出的图」; 出图即固化(独立线程,不占积分/额度/并发槽),到期按保留时长自动回收并隐藏上游会话 - 生图失败判定:识别内容策略拒绝(is_error 终局文本)不再白等到超时;同一张图按 id 去重, 修 n=1 出两张重复图;失败卡片补「ChatGPT 官网原话」与「查看官网」 - 提示词比例追加:默认开启,仅用户主动选比例时追加(智能比例不受影响) - 对话渲染:app_block 裸 JSON 转 html 围栏、官网 DIL 卡片/问卷降级渲染、多题勾选统一作答、 思考摘要不展示 - 内容审核:良性复合词白名单(灵感爆炸/色彩爆炸/爆炸头等),修设计海报误拦 测试:全量 888 passed / 20 failed(与基线一致,零新增);tsc、eslint、next build 均干净2aabbd0
4 days ago
-
报错文案映射与 AI 归纳 + 上传限流换号 + Skills 批量删除
xiaolongmr后台报错文案 - 新增 error_message_service:按关键词子串(任一命中 OR、不区分大小写)把上游原始报错 映射成管理员配置的大白话,只影响前台展示,原始报错仍进后台日志。 - 未命中时记入「未配置报错」待办,并在列表里附候选关键词,便于一键建规则。 - 新增 POST /api/error-messages/summarize:粘贴报错即可让模型归纳出 「关键词 + 大白话」,模型不可用时退化为本地正则抽取。 - 提示词写入本项目上下文:匹配为任一命中语义、上游报文格式 `{接口路径} failed: status={状态码}, body={...}`、路径须带区分步骤片段、 禁止 file_id/uuid 等易变片段,避免归纳出过宽规则(如裸 /backend-api/files 会吞掉 429 限流)。 - 关键词清洗:新增 _sanitize_keyword / _strip_volatile_path / _GENERIC_TOKENS, 剔除 JSON 语法碎片(引号、花括号、冒号)与 error_code 等通用字段名。 - 三类报错出口统一走映射:协议层 error_response、生图任务、可编辑文件任务。 - 前端设置页新增「报错文案」卡片:粘贴框 + AI 归纳按钮 + 内联结果卡片 (关键词/大白话就地可改、可就地保存)、规则列表、未配置报错列表。 - 修复「点添加规则没反应」:store 拆成 coerce(编辑态,保留空行)与 normalize(保存态,丢弃无效项)两档归一化,编辑态不再误丢刚加的空行。 - 修复「归纳结果看不见」:高亮延长到 6 秒并加绿底/绿边/徽标,结果面板就地可操作。 生图上传限流换号 - 新增 is_account_scoped_upload_error:识别 upload_protection_limit_exceeded / 429 上传类失败。这类限制是单账号配额,换号几乎必成,不再当作终态失败。 - 号池因上传限流被逐个排除到池空时,给出准确原因而非笼统的「生成失败」。 - 被限流换掉的账号不触发账号清理(只加入本轮排除集合并归还并发槽)。 Skills - 新增 POST /api/admin/skills/batch-delete,一次删多个…241a123
5 days ago
-
签到积分账本与有效期 + 内容审核反绕过加固 + 签到文案配置化
xiaolongmr签到积分 - 新增 checkin_credit_remaining 真账本:仅 source=checkin 入账,仅在基础池扣减点冲减 - 新增 checkin_credit_valid_days(0=永久,>0 发放成带 expires_at 的限时券,上限 3650) - 保存设置时若该值变化,自动重算已发放的签到积分(保留各批次原节奏) - 弹窗「我的积分」底部提示:签到赠送剩余可用 N 积分,有 M 积分将于 K 天后到期,请及时使用~ 内容审核 - 繁简归一(services/_zh_t2s.py)、17 语词表、HTML实体/百分号/Unicode/Base64 变形解码 - 否定语境豁免、良性复合词、组合规则间距窗口、ASCII 词边界、弱词机制 其他 - 签到页文案(公告/弹窗/页脚/二维码)改为后台配置 checkin_content - 新增回归 test/test_checkin_credit_ledger.py44a4285
7 days ago
-
对话 复制编辑和暂停
xiaolongmr464179c
8 days ago
-
10.9
xiaolongmr8fe6561
9 days ago
-
fix: harden HF persistence and runtime workflows
xiaolongmr34f333f -
Make image poll retry attempts configurable
xiaolongmr4406451
10 days ago
-
1.07
xiaolongmr59af925 -
1
xiaolongmr6daa87a
15 days ago
-
优化
xiaolongmr4f03ac7
17 days ago
-
测试
xiaolongmr263e0b9
18 days ago
-
临时修复
xiaolongmr5f89ffd -
临时修复
xiaolongmrffd9f3f
19 days ago
-
添加chat
xiaolongmr6fed19c -
添加编辑
xiaolongmr638cad0
-
优化
xiaolongmrd77c01e
-
优化
xiaolongmrc78ff81
-
优惠
xiaolongmrd44a83b
-
修复比例bug
xiaolongmrb343cba -
内部测试
xiaolongmra6e9d9d
-
迁移上游账号认证与管理能力
xiaolongmr3fb199a -
迁移上游 v1.8.0 核心能力
xiaolongmr49eeebd
-
Merge upstream v1.6.0 feature baseline
xiaolongmr2438892
-
优化
xiaolongmr06e320b -
修复号池导出并保留 Session 自动续期
xiaolongmre49b58c -
整合功能更新并排除本地恢复产物
xiaolongmr2dc6fe4
-
修复模型切换额度不限时的问题
xiaolongmr04e2018 -
页面优化
xiaolongmr459bba7
-
添加4kapi支持
xiaolongmr0284797
-
添加api的功能
xiaolongmrdb2b64c
-
更新卡密
xiaolongmreaf2aba
-
添加 Free 号池死号清理和图片拖拽导入
xiaolongmr41fee80
-
fix: handle pro image quota as limited
HouYunFei +1: CodexCo-Authored-By: Codex <noreply@openai.com>98b3720
-
feat: add option to remove local conversation after image generation
HouYunFei4f93707
-
Add configurable branding and login sessions
xiaolongmr519f85d
-
Update image UI and deployment settings
xiaolongmrf9a9d62
-
fix: make register mail api proxy configurable
8de591f -
Fix account pool quota and conversation cleanup
xiaolongmr3036b75 -
Add shared account pool controls
xiaolongmr07dd5b7