caoqianming
|
38f6157b3a
|
fix(sandbox): pids-limit 256→1024 修容器内 mermaid 渲染必崩(bump 0.58.2)
task 9dcae061 排查:近 90 天 mmdc 渲图 0 成功(26 launch fail + 67 timeout)。
根因:--pids-limit 线程也计数,chromium headless 一次 ~150-200 线程,叠加
shell 超时残留的 mmdc+chromium 树(超时只杀 host 侧 docker CLI),256 打满
→ pthread_create EAGAIN(06-23 c4f03d56 实锤)→ chromium SIGTRAP。
dbus 报错是干扰项(成功时也打)。
- agent.yaml sandbox.pids_limit + pool.py DEFAULT_PIDS_LIMIT 两处 256→1024
- RUN.md 故障兜底补条目;PROGRESS 记录
- 附诊断脚本 scripts/diag_task_9dcae061.py / diag_mmdc_history2.py / diag_mmdc_ok_case.py
- 待服务器验证:重启 web + 容器回收后跑 probe_mermaid.sh;若 chromium 150
仍秒崩另查宿主 docker/seccomp;彻底修法是 Step 3b PGID kill 协议(未动)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-11 09:02:45 +08:00 |
caoqianming
|
86f50ff133
|
feat(models): unifyllm 再加 gpt-5.5 / gpt-5.4-mini 进 pro 档(bump 0.58.1)
- config/models/unifyllm.yaml 新增 gpt55 / gpt54_mini variant(照 gpt56_sol
模板,temp 硬约束 1.0;mini 档 quality 记 good、max_iterations 100)
- agent.yaml model_tiers.pro 加 2 条
- diag_unifyllm.py 默认冒烟清单 5→7 个模型(RUN.md 同步),两模型
tool-calling 实测均过
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 21:06:37 +08:00 |
caoqianming
|
5a8f5bd930
|
feat(media): 第二图像后端 gpt_image(unifyllm 网关,pro 档)(bump 0.58.0)
- config/media/unifyllm.yaml + tools/gpt_image.py:仅 prompt 参数(网关忽略
size/quality,尺寸上游自动定,不支持 i2i),b64 直落 figures/,banner 协议
同 seedream,价目未知期 cost 记 0、usage tokens 进 units 留对账
- 媒体装配泛化:ArkConfig 通用键名(api_key_env/base_url,ark_* 兜底);
_choose_image_variant 跨 provider 选 image variant(默认仍 seedream_5,
本 run 只挂一个图像工具);_MEDIA_TOOLS_BLOCK 拆分段按实挂工具拼装
- web:_list_media_variants 扫 config/media/*.yaml(image/video 清单 +
admin 门控 catalog);media.js 三处白名单加 gpt_image;prompt 润色 hint
无 default_size 不再谎报 2048
- gpt_image 进 pro 档,与 seedream 共享 images_per_day 配额
- 手工验证 scripts/test_gpt_image_manual.py 全过(含真调网关落图),
unittest 201 过
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 20:47:06 +08:00 |
caoqianming
|
ba2afa9e98
|
feat(models): unifyllm 网关接入,5 个国际旗舰模型进 pro 档(bump 0.57.0)
- config/models/unifyllm.yaml:Claude Fable 5 / Opus 4.8 / Sonnet 4.6 /
GPT-5.6 Sol / Gemini 3.1 Pro,litellm openai/ 前缀 + api_base 覆盖,零代码
- 实测:gpt-5.x litellm 硬拦 temp!=1、gemini-3.1-pro temp=0.3 返回空,
两者 optimal_temperature=1.0;流式+tool calling+parallel 5 模型全通
- scripts/diag_unifyllm.py 冒烟脚本(--stream/--temp)
- 服务器需代理出口(直连 unifyllm.ai TLS 失败),RUN.md env 段已注明
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 17:16:46 +08:00 |
caoqianming
|
9e59cf9e44
|
chore(quota): per-user 磁盘配额 5GB -> 20GB(bump 0.55.1)
应用层软配额上调(agent.yaml quotas.disk_bytes_per_user,重启 web 生效);
RUN 故障兜底行 + CHANGELOG 用户条目同步。OS 层 prjquota 仍留待外部开放前。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 08:35:52 +08:00 |
caoqianming
|
b4808b0370
|
feat: per-account 模型访问控制(档位制,复用 plan 列)(bump 0.31.0)
- core/model_access.py(新):档位制访问控制。users.plan 存档位名,
「档位→模型集合」配在 config/agent.yaml model_tiers;plan 空/未知→default 档,
role=admin 全开。无需 migration(plan 列 0001 起就有,之前休眠)。
- 两档:default(deepseek+local+seedream+seedance)、pro(+doubao+glm)。
- web/app.py:三个 list 端点按档过滤(用户只看到本档模型);三个 resolve 加
user_id 门控 —— 显式选档外模型 403;老 task 下次发消息模型已不在档位内→
持久落回 deepseek_v4.flash;定时任务执行 grandfather 不门控。
- web/admin.py:GET /v1/admin/tiers + PATCH /v1/admin/users/{uid}/plan;
用户行补 plan 字段。
- web/static/js/admin.js:各用户用量表加「档位」列(内联下拉)+ 档位图例 + apiSend。
- DESIGN.md plan 列语义 / RUN.md model_tiers 配置说明。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 14:11:22 +08:00 |
caoqianming
|
32bf6ae917
|
fix(sandbox): docker run 加 --shm-size 修 mmdc 渲 mermaid 挂超时 + bump 0.12.5
容器 /dev/shm 默 docker 64MB,chromium(mmdc/puppeteer)起不来一直挂到 timeout。
实测一个"生图测试"对话:模型裸调 mmdc,自造 puppeteer config 漏 --disable-dev-shm-usage,
连试 6 次全超时烧约 120k token。从根上给 docker run 加 --shm-size(默 512m,
env ZCBOT_SANDBOX_SHM_SIZE / yaml sandbox.shm_size 可配),任何 chromium 路径都不再挂。
- core/sandbox/pool.py: --shm-size 旋钮(优先级同 memory/cpus)
- config/agent.yaml / RUN.md: 新增 shm_size 配置 + env + 故障兜底一行
- deploy/sandbox/probe_mermaid.sh: 实测脚本(区分 chromium 缺包 vs 纯 shm 超时)
- scripts/diag_dump_task.py: 按 email+任务名 dump 对话的诊断脚本
- 已 running 旧容器需重启 web + idle 回收后新起才生效;镜像无需 rebuild
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-14 10:40:45 +08:00 |
caoqianming
|
4f6e879050
|
feat(web): systemctl restart 优雅 drain in-flight run,不再误标 error
此前 restart 硬杀 BG run 线程,下次启动 reaper 把所有 running/cancelling
标 error: server restarted before run finished —— 用户一多就不能随便重启。
单实例止血,零 DB 改动:
- lifespan 加 draining(Event) + inflight 登记表(顺手修 create_task 不留引用
可能被 GC 的旧坑);finally 先拒新 run → await 收尾 → 超 drain_timeout 转
协作式 cancel(= 用户按停止,标 idle 不报 error、可重发)→ 超 cancel_grace
仍没退的留给 SIGKILL(最坏退化 = 改前)
- POST /messages:draining 期返 503 + Retry-After;起 run 登记 inflight
- main.py uvicorn 加 timeout_graceful_shutdown=5(否则长连 SSE 挡在 drain 前)
- config/agent.yaml 加 shutdown 段(drain 30s / grace 15s,偏短更安全)
- dev SPA chat.js 发送包退避重试(503 背压 + 交接拒连都重试 ~26s)
部署强耦合:unit TimeoutStopSec 10→90(必须 > drain+grace+sandbox 清扫余量),
已写进 RUN.md unit + 故障兜底。B 蓝绿(零 503 窗口)留作触发信号后再做。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-10 10:54:43 +08:00 |
caoqianming
|
3a3f8d86cc
|
sandbox: yaml sandbox.dns 显式 --dns 注入(绕开 daemon 上游探测)
腾讯云轻量等场景 docker daemon 探测 host systemd-resolved 上游 DNS 不稳,
即使 init.sh ACCEPT 127.0.0.11:53 例外,embedded DNS 自己 forward 不出去
仍跪。显式 docker run --dns 8.8.8.8 --dns 114.114.114.114 直接写容器
/etc/resolv.conf 绕开上游探测。
- agent.yaml 加 sandbox.dns 列表,默 [8.8.8.8, 114.114.114.114]
- SandboxPool 加 dns 字段(env: ZCBOT_SANDBOX_DNS 逗号分隔 override),
_docker_run 每个 ip 加 --dns flag
- RUN.md 故障兜底 DNS 失败那行补充第二层根因 + 解法
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-27 11:28:53 +08:00 |
caoqianming
|
eaf7f3ea1e
|
Stage C 收尾包:资源 yaml + 磁盘配额 + 网络放开 + 容器内源持久化
dogfood + 信任同事白名单阶段 Step 4 完整 egress proxy 暂不做(沉淀为升级触发
信号:任一陌生用户注册 / 模型异常 outbound / 信任白名单出现非密切相识者 → 必上)。
本批 3 件:
(A) 容器资源 yaml 化(可调不重 build):
- agent.yaml 加 sandbox 段(memory/cpus/pids_limit)
- SandboxPool ctor 加三字段,优先级 env > yaml > 默(2g/1.0/256)
- setup_pool/init_pool 透传 sandbox_cfg
- sandbox check 输出加 [info] 4 行给运维一眼对账
(B) 应用层磁盘配额(§7.5 #4 软配额):
- migration 0008 user_disk_usage 单行 per user
- core/storage/disk_quota.py:parse_bytes("5gb"/int)+ scan_user_dir
(os.scandir 跳顶层 .zcbot_tmp / .memory)+ upsert ON CONFLICT
+ check_disk_quota + scan_all_users 串行
- lifespan _disk_scanner 后台 task(启动跑一次 + 默 15min 周期)
- DockerExecutor write/edit 起手 gate 超额 [Error] 不调容器
- /v1/files/upload 同款 gate 超额 HTTP 413
- yaml `quotas.disk_bytes_per_user: 5gb` + `disk_scan_interval_seconds: 900`
- race 接受:扫描间隙写入轻微突破(image/video 配额同款 race-tolerant);
外部用户开放前 OS 层 xfs prjquota 兜底
- 11 测试 covered parse_bytes / scan / 跳 dotfile
(C) 网络放开 + 容器内源持久化:
- network.py 去 --internal flag,容器走 docker bridge default 有 NAT outbound
- 已存在 internal network 不自动 rm 仅 warn,RUN.md 给迁移命令(避免破现有容器)
- iptables 红线段不动(169.254/127/10/172.16/192.168/100.64/PG_IP DROP),
挡 cloud metadata + 内网扫描 + loopback,基线不依赖 proxy
- Dockerfile 加 /etc/pip.conf(global index-url + timeout 60) + /etc/npmrc
(global registry),让运行时模型 `pip install foo` / `npm install bar`
也走 mirror(此前 --build-arg 只 build 时生效)
unittest discover 46/46 PASS(原 35 + 新 11)。
DESIGN 不动(延后决策仍在 §7.7 Stage C 阶段语义内,触发信号沉淀进
PROGRESS / RUN);RUN.md 加 env 列表 + 网络迁移 + 配额 + 故障兜底 3 行。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-27 08:35:53 +08:00 |
caoqianming
|
758486e2cd
|
feat(quotas): 媒体生成每账号每日上限 (默 20 图 / 5 视频, yaml 可配)
config/agent.yaml 加 quotas 段;core/storage/usage.py 加 check_daily_quota
(COUNT usage_events WHERE user_id+kind+created_at>=本地今日 00:00);
SeedreamTool / SeedanceTool ctor 收 daily_limit, execute() 起手 if 超额
返 [Error] 不调远端不烧钱。错误串只暴露已用/上限 + 重置时间,不写
yaml 路径 (避免 LLM 转述泄漏内部 schema 给外部用户)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-22 15:21:39 +08:00 |
caoqianming
|
3a66849953
|
Initial import: zcbot personal task agent
DESIGN.md / PROGRESS.md 落地 Phase 1-3:
- core/: LiteLLM 封装 + ReAct loop + 会话持久化 + Anthropic skill registry
- tools/: read/write/edit/glob/grep/shell/run_python/load_skill (Hybrid 范式)
- skills/coding | proposal: WHY+WHAT 风格 SKILL.md
- skills/ppt: 完整渐进披露 (SKILL + 4 references + 3 scripts)
· 借鉴 hugohe3/ppt-master 的两阶段 + spec lock 思路
· MSO_SHAPE 图标体系 + 安全区 + 越界检测
· 默认商务红主题 (#C00000 / #E15554 / #FFC107)
- config/models/: DeepSeek V4 flash/pro 档案
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-06 11:02:59 +08:00 |