Fetching metadata from the HF Docker repository... 13 days ago
-
zidong shibie fumian tishici quduan, wu xu shoudong jia fangxing duanyu
xiaolongmr
-
zuhe guize gai wei tong ju pipei; fangxing duanyu he changjing kaiguan ke zai shezhi ye peizhi
xiaolongmr
14 days ago
-
shan chu tupian yuchong xiazai, chidu gengxin an zhen he bing
xiaolongmr
-
降低线上轮询压力:后台标签页暂停轮询、关闭 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…
15 days ago
-
聊天室未读角标:改成红色圆形气泡,并把私聊未读一并计入
xiaolongmr
1) 样式:顶部「聊天室」导航项的未读提示原来是纯文字红色数字,
改成微信/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 项全过。 -
聊天室:修复置顶 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 全绿。已清… -
聊天室:管理员置顶公告 + 修复私聊收不到/回不了
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 项失败)。 -
聊天室:头像回退微信头像、复用画图页输入框、撤回删除、布局收口
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 会与之相… -
新增聊天室页面:登录用户群聊
xiaolongmr
- 后端:services/chat_room_service.py(SQLite 只追加存储,经镜像 runtime_file 持久化)+ api/chat_room.py(消息增删查 / 汇总接口,均需登录)
- 前端:/chat-room 页面,3s 轮询增量拉取、乐观发送、回车发送、500 字上限、自动滚底、日期分隔与角色徽章
- 导航:三套角色导航均插入「聊天室」(对话之后),含一次性迁移
16 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 逐行一致。 -
在线人数改为全站心跳:覆盖所有页面 + 关闭页面立即下线
xiaolongmr
-
积分消耗统计:用量流水表 + 看板筛选/趋势/模型明细/Top 用户
xiaolongmr
-
实时在线人数:画图页纯文字展示 + 管理员数据看板
xiaolongmr
-
官网来源取证 + 生图终局判定 + 对话卡片渲染
xiaolongmr
- 官网来源取证:每张结果图可生成 chatgpt.com 官方匿名分享链接自证「确实是官网出的图」;
出图即固化(独立线程,不占积分/额度/并发槽),到期按保留时长自动回收并隐藏上游会话
- 生图失败判定:识别内容策略拒绝(is_error 终局文本)不再白等到超时;同一张图按 id 去重,
修 n=1 出两张重复图;失败卡片补「ChatGPT 官网原话」与「查看官网」
- 提示词比例追加:默认开启,仅用户主动选比例时追加(智能比例不受影响)
- 对话渲染:app_block 裸 JSON 转 html 围栏、官网 DIL 卡片/问卷降级渲染、多题勾选统一作答、
思考摘要不展示
- 内容审核:良性复合词白名单(灵感爆炸/色彩爆炸/爆炸头等),修设计海报误拦
测试:全量 888 passed / 20 failed(与基线一致,零新增);tsc、eslint、next build 均干净
17 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,一次删多个…
18 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.py
20 days ago
-
对话 复制编辑和暂停
xiaolongmr
21 days ago
-
10.9
xiaolongmr
22 days ago
-
fix: harden HF persistence and runtime workflows
xiaolongmr
-
Make image poll retry attempts configurable
xiaolongmr
23 days ago
-
1.07
xiaolongmr
-
1
xiaolongmr
28 days ago
-
优化
xiaolongmr
30 days ago
-
测试
xiaolongmr
-
临时修复
xiaolongmr
-
临时修复
xiaolongmr
-
添加chat
xiaolongmr
-
添加编辑
xiaolongmr
-
优化
xiaolongmr
-
优化
xiaolongmr
-
优惠
xiaolongmr
-
修复比例bug
xiaolongmr
-
内部测试
xiaolongmr
-
迁移上游账号认证与管理能力
xiaolongmr
-
迁移上游 v1.8.0 核心能力
xiaolongmr
-
Merge upstream v1.6.0 feature baseline
xiaolongmr
-
优化
xiaolongmr
-
修复号池导出并保留 Session 自动续期
xiaolongmr
-
整合功能更新并排除本地恢复产物
xiaolongmr
-
修复模型切换额度不限时的问题
xiaolongmr
-
页面优化
xiaolongmr
-
添加4kapi支持
xiaolongmr
-
添加api的功能
xiaolongmr
-
更新卡密
xiaolongmr
-
添加 Free 号池死号清理和图片拖拽导入
xiaolongmr
-
fix: handle pro image quota as limited
HouYunFei +1: Codex
Co-Authored-By: Codex <noreply@openai.com>
-
feat: add option to remove local conversation after image generation
HouYunFei
-
Add configurable branding and login sessions
xiaolongmr
-
Update image UI and deployment settings
xiaolongmr
-
fix: make register mail api proxy configurable