移植自 mac-agent-os 的 mediacrawler_adapter:不起子进程、不开页面,用浏览器里那份
登录态直接调抖音 Web 接口。产物键名照抄 store/douyin,所以 ingest 那条链路一个字不用改。
**目前能用的(真环境实测,非推断)**:
profile/other : 200, 7075 字节 —— 博主主页指标(粉丝/获赞/作品数/昵称)
aweme/detail : 200, 45425 字节 —— 单条作品详情(含点赞/评论/收藏/分享)
**目前不能用的:作品列表 `aweme/post`。** 两个互相独立的原因:
1. 这个接口被抖音单独升级成了真校验:不带 x-tt-argus 回 403「Uifid Not Found」,
带上 dummy 值回 200 + **空 body**。也就是说「头在不在」骗得过,「真校验」过不了。
同一套头打 profile/other 和 aweme/detail 都是通的 —— 抖音是挑着接口加保护的,
挑中的恰好是「批量拉作品列表」这个最敏感的动作。
2. 改走页面截获也不行:CDP 浏览器打开博主主页会落到「验证码中间页」(当天大量探测的
代价,过几小时要重测)。
所以现在的边界是:**已知作品的指标刷新能做,自动发现新作品做不了**。
**排查中控住变量后得到的两条事实**(都写进注释了):
· `Accept` / `Accept-Language` / `Referer` 才是主页接口能返回真数据的原因 —— 只有
UA+client hints+Cookie 时是 200 但仅 121 字节的空壳,补上这三个头变 7074 字节。
(我先前猜的 sec-ch-ua 不是关键。)
· 因此 UA 与 client hints 必须**成套地取自同一个浏览器**,所以 BrowserIdentity 一次
从 CDP 取齐 cookie + UA + hints,而不是各自写死。
「200 + 空 body 必须当场报错」也是刻意写死的:放过去它会在下游变成「这个博主没作品」,
把一次失败伪装成一条正常结果 —— 爬虫那条路正是这么栽的,还被翻译成「账号被封」。
测试 +11:cookie 解析、请求头成套性(含 uifid 缺失/回退)、产物键名与 store 对齐、
以及 _get 的三条失败路径(空 body / 403 带网关原话 / 正常返回)。
333 lines
10 KiB
Markdown
333 lines
10 KiB
Markdown
# AgentOS 修复方案与落地清单
|
||
|
||
> 版本: 1.0 | 基于 2026-06-21 审计报告
|
||
> 按优先级排列,每项含:耗时 / 风险 / 前置依赖
|
||
|
||
---
|
||
|
||
## 第一步:Git 仓库减肥(P0,立刻做)
|
||
|
||
### 1.1 诊断:先看什么东西在吃空间
|
||
|
||
```bash
|
||
# 进入仓库
|
||
cd ~/workbuddy-agent-os/agent-sync
|
||
|
||
# 1. 看总大小
|
||
du -sh .git # .git 目录大小(预估 400MB)
|
||
du -sh . # 工作树大小(预估 600MB)
|
||
|
||
# 2. 找最大的文件(被 git 追踪的)
|
||
git rev-list --objects --all | \
|
||
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
|
||
awk '/^blob/ {print $3, $4}' | \
|
||
sort -rn | head -20
|
||
|
||
# 3. 看哪些大文件类型在 git 索引里
|
||
git ls-files | grep -E '\.(png|jpg|jpeg|gif|svg|ico|pdf)$'
|
||
git ls-files | grep -E '\.(so|dylib|a|o)$'
|
||
git ls-files | grep -E '(profiles|cache|chroma|node_modules)'
|
||
```
|
||
|
||
**预期发现:** 大文件来源通常是:
|
||
1. 浏览器 Profile 文件夹(曾未加 .gitignore 时被提交过)
|
||
2. 截图 .png 文件(dashboard、matrix screenshots)
|
||
3. ChromaDB SQLite 文件
|
||
4. Python .so 编译文件
|
||
5. longcat 浏览器缓存
|
||
|
||
---
|
||
|
||
### 1.2 更新 .gitignore(排除所有不该进 Git 的东西)
|
||
|
||
在现有 `.gitignore` 末尾追加:
|
||
|
||
```
|
||
# ────── v4.2.0 新增排除项 ──────
|
||
|
||
# 图片文件(截图、素材,不入库)
|
||
*.png
|
||
*.jpg
|
||
*.jpeg
|
||
*.gif
|
||
*.svg
|
||
*.ico
|
||
*.webp
|
||
|
||
# ChromaDB 数据(各机独立)
|
||
chroma.sqlite3
|
||
**/chroma/
|
||
|
||
# 前端构建产物
|
||
node_modules/
|
||
dist/
|
||
build/
|
||
|
||
# ML 模型文件
|
||
*.pth
|
||
*.bin
|
||
*.onnx
|
||
*.npy
|
||
*.npz
|
||
|
||
# 运行时数据目录
|
||
cross_machine/data/
|
||
|
||
# Matrix 截图
|
||
05_tools/07_matrix/screenshots/
|
||
|
||
# AVE 输出
|
||
09_ave/output/
|
||
09_ave/cache/
|
||
|
||
# 系统报告归档
|
||
reports/
|
||
|
||
# Dashboard 前端产物
|
||
05_tools/10_dashboard/frontend/node_modules/
|
||
05_tools/10_dashboard/frontend/dist/
|
||
```
|
||
|
||
---
|
||
|
||
### 1.3 从 Git 追踪中移除已在大文件(不删文件,只删追踪)
|
||
|
||
```bash
|
||
# 对每一类已追踪的大文件执行 git rm --cached
|
||
|
||
# 1. 移除所有图片文件(如果被追踪过)
|
||
git rm --cached -r --ignore-unmatch 05_tools/07_matrix/screenshots/
|
||
git rm --cached -r --ignore-unmatch 05_tools/10_dashboard/*.png
|
||
git ls-files | grep -E '\.(png|jpg|jpeg|gif)$' | xargs -r git rm --cached
|
||
|
||
# 2. 移除浏览器 Profile(如果被追踪过)
|
||
git rm --cached -r --ignore-unmatch 05_tools/07_matrix/profiles/
|
||
git rm --cached -r --ignore-unmatch 05_tools/05_crawl/longcat/profiles/
|
||
|
||
# 3. 移除 ChromaDB 数据
|
||
git rm --cached -r --ignore-unmatch 04_memory/vector_db/
|
||
git ls-files | grep chroma | xargs -r git rm --cached
|
||
|
||
# 4. 移除运行时数据
|
||
git rm --cached -r --ignore-unmatch cross_machine/data/
|
||
git rm --cached -r --ignore-unmatch 04_memory/cross_machine/data/
|
||
|
||
# 5. 移除旧的迁移目录
|
||
git rm --cached -r --ignore-unmatch 07_migration/
|
||
|
||
# 6. 提交本次清理
|
||
git commit -m "chore(git): 清理已追踪的大文件,更新 .gitignore v4.2.0"
|
||
```
|
||
|
||
---
|
||
|
||
### 1.4 重写 Git 历史以永久删除大文件(可选但推荐)
|
||
|
||
> ⚠️ 这一步会改变 commit hash,所有机器需要重新 clone。
|
||
> **但如果 1.3 步提交后,远程仓库大小仍然不变,就必须做这一步。**
|
||
> 因为历史 commit 中仍然保留着大文件——.gitignore 和 git rm 只影响未来。
|
||
|
||
**方案 A:使用 git filter-repo(推荐)**
|
||
|
||
```bash
|
||
# 安装 git-filter-repo
|
||
pip install git-filter-repo
|
||
|
||
# 在全新 clone 上操作(不要在原仓库,防止意外)
|
||
cd /tmp
|
||
git clone ~/workbuddy-agent-os/agent-sync agentos-clean
|
||
cd agentos-clean
|
||
|
||
# 删除历史中所有 .png/.jpg/.so/.mp4 等大文件
|
||
git filter-repo \
|
||
--path-glob '*.png' --path-glob '*.jpg' --path-glob '*.so' \
|
||
--path-glob '*.mp4' --path-glob 'chroma.sqlite3' \
|
||
--path '05_tools/07_matrix/profiles/' \
|
||
--path '05_tools/05_crawl/longcat/profiles/' \
|
||
--path '04_memory/vector_db/' \
|
||
--invert-paths
|
||
|
||
# 验证大小
|
||
du -sh .git
|
||
|
||
# 如果还是大,再按大小找 Top offenders
|
||
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectsize) %(rest)' | sort -rn | head -20
|
||
```
|
||
|
||
**方案 B:使用 BFG Repo-Cleaner(更简单)**
|
||
|
||
```bash
|
||
# 下载 BFG
|
||
wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar
|
||
|
||
# 清理 >10MB 的文件
|
||
java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 10M agentos-clean
|
||
|
||
# 清理指定模式
|
||
java -jar bfg-1.14.0.jar --delete-files '*.png' agentos-clean
|
||
java -jar bfg-1.14.0.jar --delete-files '*.so' agentos-clean
|
||
```
|
||
|
||
**方案 C:如果 filter-repo 太复杂,最小化方案**
|
||
|
||
```bash
|
||
# 只清理最大的文件类型,保留历史完整性
|
||
git filter-branch --force --index-filter \
|
||
"git rm --cached --ignore-unmatch -r \
|
||
05_tools/07_matrix/profiles/ \
|
||
05_tools/05_crawl/longcat/profiles/ \
|
||
04_memory/vector_db/ \
|
||
07_migration/" \
|
||
--prune-empty --tag-name-filter cat -- --all
|
||
|
||
# 回收空间
|
||
git reflog expire --expire=now --all
|
||
git gc --aggressive --prune=now
|
||
```
|
||
|
||
---
|
||
|
||
### 1.5 推送到远程(所有操作完成后)
|
||
|
||
```bash
|
||
# 强制推送(因为历史被重写了)
|
||
git push origin --force --all
|
||
git push origin --force --tags
|
||
|
||
# 验证远程仓库大小
|
||
curl -s https://api.github.com/repos/babycalf/mac-agent-os | grep "size"
|
||
# size 单位是 KB,目标 < 50000(即 < 50MB)
|
||
```
|
||
|
||
---
|
||
|
||
### 1.6 其他机器重新 clone
|
||
|
||
```bash
|
||
# 5kechengdeAir 和 7kecheng 上执行
|
||
cd ~
|
||
mv workbuddy-agent-os workbuddy-agent-os.bak # 备份旧目录
|
||
git clone [email protected]:babycalf/mac-agent-os.git workbuddy-agent-os/agent-sync
|
||
cd workbuddy-agent-os/agent-sync && bash 00_bootstrap/init.sh
|
||
```
|
||
|
||
---
|
||
|
||
### 1.7 验证结果
|
||
|
||
```bash
|
||
# 1. 本地仓库大小
|
||
du -sh .git # 期望 < 50MB
|
||
du -sh . # 期望 < 100MB(不含 agent-local/)
|
||
|
||
# 2. 不再有大文件被追踪
|
||
git ls-files | grep -E '\.(png|jpg|so|mp4)$' # 期望 0 结果
|
||
|
||
# 3. agentos check 仍然通过
|
||
cd ~/workbuddy-agent-os/agent-sync
|
||
python3 -m agentos check --quick
|
||
|
||
# 4. clone 速度测试(从另一台机器)
|
||
time git clone [email protected]:babycalf/mac-agent-os.git test-clone
|
||
# 期望 < 30 秒(之前可能 > 5 分钟)
|
||
```
|
||
|
||
---
|
||
|
||
## 第二步:修复高优问题(P1)
|
||
|
||
完成 Git 减肥后,按以下顺序修复:
|
||
|
||
| 优先级 | 问题 | 方案 | 预估工时 |
|
||
|:------:|:-----|:-----|:--------|
|
||
| P1-1 | **oMLX Chat API 500** | 诊断 Qwen3-8B 错误 → 尝试降级/换模型/用 VLM 替代 | 1-2h |
|
||
| P1-2 | **collect_to_inbox v2.0** | 补全 01_submissions/ 扫描逻辑(约 40 行代码) | 2h |
|
||
| P1-3 | **AVE service_layer 空目录** | 确认 09_ave TOOL.md 说的 API 是否需要 → 补全或降级文档 | 1h |
|
||
| P1-4 | **agentos check 增加宪法对账** | 在 check.py 中比较 CONSTITUTION.md 版本 vs 实际代码一致性 | 2h |
|
||
| P1-5 | **删除 accounts_registry.yaml** | 确认无代码引用后删除(已标记废弃) | 10min |
|
||
|
||
---
|
||
|
||
## 第三步:中期改进(P2)
|
||
|
||
| 优先级 | 问题 | 方案 | 预估 |
|
||
|:------:|:-----|:-----|:-----|
|
||
| P2-1 | **app.py 1521 行拆分** | 按已有 routes/ 目录拆分为 3-4 个路由模块 | 1d |
|
||
| P2-2 | **添加测试基础** | guardd 核心模块 + semantic_search RRF 写单元测试 | 1d |
|
||
| P2-3 | **统一日志格式** | 所有 Python 模块使用 logging + 统一格式字符串 | 4h |
|
||
| P2-4 | **双 agentos 插件加载加固** | 把 07_matrix/agentos/plugins/ 复制到 00_setup/agentos/federation_plugins/ | 2h |
|
||
| P2-5 | **FEDERATION_GUIDE.md 完整对账** | 遍历全文确认所有数字与实际一致 | 2h |
|
||
|
||
---
|
||
|
||
## 第四步:长期优化(P3)
|
||
|
||
| 项目 | 说明 | 预估 |
|
||
|:-----|:------|:-----|
|
||
| CommandCenter | 实时跨机通信,替代 15min Git 同步延迟 | 2-4 周 |
|
||
| 独立运行模式 | 脱离 WorkBuddy 也可运行 | 2-3 周 |
|
||
| 技能市场 | SKILL_CARD.yaml 标准化 + 社区技能安装 | 1-2 周 |
|
||
| 内容工厂 | 采集→AI 分析→AVE 生成→自动发布全流水线 | 3-4 周 |
|
||
|
||
---
|
||
|
||
## 落地路线图(甘特图)
|
||
|
||
```
|
||
时间线 今天 本周 下周 下月 季度
|
||
│ │ │ │ │
|
||
Git 减肥 ████████▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
||
诊断+清理 ██████▓
|
||
filter-repo ██████▓
|
||
各机re-clone ██▓
|
||
────────────────────────────────────────────────
|
||
oMLX 修复 ██████▓
|
||
collect_to_inbox ██████▓
|
||
AVE 确认 ██▓
|
||
宪法对账 ██▓
|
||
────────────────────────────────────────────────
|
||
app.py 拆分 ██████████▓
|
||
测试基础 ██████▓
|
||
统一日志 ██████▓
|
||
────────────────────────────────────────────────
|
||
CommandCenter ████████████▓
|
||
独立运行 ████████████▓
|
||
```
|
||
|
||
---
|
||
|
||
## 执行建议
|
||
|
||
### 执行的顺序很关键
|
||
|
||
```
|
||
第一步做 Git 减肥 → 然后再做其他事情
|
||
↑
|
||
如果不先做这个:
|
||
- 其他机器 git pull 要等 5 分钟
|
||
- push 频繁超时
|
||
- 新机器部署痛苦
|
||
```
|
||
|
||
### 每个步骤的风险控制
|
||
|
||
```
|
||
Git filter-repo 前:
|
||
✅ 备份原仓库(tar czf backup.tar.gz .git)
|
||
✅ 在临时目录操作(不在原目录)
|
||
✅ 先在一台机器验证,再通知其他机器
|
||
✅ 准备好 rollback 方案
|
||
```
|
||
|
||
### 日常维护习惯
|
||
|
||
```bash
|
||
# 每次 push 前快速检查
|
||
du -sh .git # 超过 100MB 要警惕
|
||
git ls-files | grep -E '\.(png|jpg|so)$' # 应为空
|
||
git status --porcelain | wc -l # 干净工作区
|
||
|
||
# 每月一次深度检查
|
||
git count-objects -v # 看 pack 文件数量和大小
|
||
```
|