移植自 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 带网关原话 / 正常返回)。
391 lines
17 KiB
Markdown
391 lines
17 KiB
Markdown
agent-os多机协同
|
||
本系统通过 WorkBuddy 作为 AI 交互中枢,整合本地大模型、计划做一个多机可协同,知识库可自增长,自学习、自优化。记忆可以不断提炼更新,向量化,持久化、长期化的、自我进化的 Mac 全栈智能体。
|
||
多机采用共同底座及分机学习的模式,可进行快速迁移,快速生成复制快速恢复。
|
||
## agent-os(全局/多机共用内容)这是共同底座的部分。
|
||
1. **初始化脚本**
|
||
- 从零安装、环境配置、workbuddy等自动化脚本
|
||
- 建议统一放在 00_bootstrap,可细分 install、setup、update 等子目录
|
||
安装的时候主要包括一次性把权限给到位,相应的基础设施,核心的环境内容,包括软件依赖,虚拟环境全部设置到位,假设是从空白组机开始还原先铺环境,然后再按依赖,最后按主程序。并设置自动任务、自动备份及自动优化等相应的所有的任务系统。所有的任务复制过来以后,根据祖籍身份,有些任务可以暂时暂停,如果身份切换以后再启用。
|
||
2. **核心配置(01_core)**
|
||
- 系统身份、主机标识、主维护机配置
|
||
- 建议增加主机/维护机标识文件(如 `HOST_ID.md`、`MAINTAINER.md`)
|
||
包括智能体所有的基础设定规则,还有一些通用全局的设置文件,全部装在这里,方便拷贝生成,或者可以进行嗯几个版本的生成,到时候可以选择性的加载,因为可能还涉及到多智能体等其他的各种设置,总之这些文件都可以配置在这里头
|
||
3. **技能(02_skills)**
|
||
- 系统必需技能
|
||
- 自定义/个人维护技能
|
||
- 每个技能需有身份证明(如 `SKILL.md`),并标注维护主机
|
||
- 建议增加技能分类(如系统/自定义/第三方)
|
||
基于前面讨论的技能身份证和版本控制分层,你只需要增加以下文件:
|
||
|
||
A. 每个技能目录下:SKILL_CARD.yaml(技能身份证)
|
||
|
||
只加在你自己写的技能里,比如 memory_manager/、kb_manager/、inbox_refine/、collect_to_inbox/、auto_collector/。
|
||
|
||
以 memory_manager/ 为例,在 02_skills/memory_manager/ 下新增一个文件:
|
||
|
||
```yaml
|
||
# SKILL_CARD.yaml —— 技能身份证
|
||
skill:
|
||
name: "记忆管理器"
|
||
id: "memory_manager"
|
||
version: "1.1.0"
|
||
category: "core-system"
|
||
status: "active"
|
||
created: "2026-04-25"
|
||
updated: "2026-04-27"
|
||
|
||
description:
|
||
short: "每日对话提炼、去重、冲突检测、版本管理"
|
||
use_cases:
|
||
- "每日凌晨 2:00 自动提炼前一天记忆"
|
||
- "首次冷启动灌入已有 MEMORY.md"
|
||
- "手动触发记忆更新"
|
||
tags: ["记忆", "L1索引", "L2事实", "自动化"]
|
||
|
||
ownership:
|
||
master_editor: "macbook-air-m1"
|
||
readonly_on_other_devices: true
|
||
|
||
environment:
|
||
os: "macos"
|
||
python_path: "~/.workbuddy/binaries/python/envs/agent-os/bin/python3"
|
||
local_dependencies:
|
||
- "sqlite3(系统自带)"
|
||
pip_dependencies:
|
||
- "sqlite-utils>=3.35"
|
||
- "chromadb>=1.0.0"
|
||
|
||
setup:
|
||
install_script: "" # 由顶层 init.sh 统一安装
|
||
post_check: "python3 -c 'import sqlite3; print(\"OK\")'"
|
||
|
||
usage:
|
||
entry_point: "daily_digest.py"
|
||
scheduled: "每日 02:00(WorkBuddy 自动化 agentos)"
|
||
manual_trigger: "记忆更新"
|
||
|
||
changelog:
|
||
- version: "1.1.0"
|
||
date: "2026-04-27"
|
||
changes: "接入 oMLX Embedding,支持向量化"
|
||
- version: "1.0.0"
|
||
date: "2026-04-25"
|
||
changes: "初始版本"
|
||
```
|
||
|
||
对其他技能(kb_manager、inbox_refine、collect_to_inbox、auto_collector)同样操作,字段按实际填写。
|
||
|
||
外部技能(如 web-clipper、voice-summary、social-collector)暂不加 SKILL_CARD,因为它们不是你开发的,升级不归你控制。如果你后续改造了它们,那时再加。
|
||
|
||
---
|
||
|
||
B. 05_tools/ 下:skill_scanner.py(技能身份证扫描器)
|
||
|
||
让你在任何一台机器上运行一次,就知道哪些技能就绪、哪些缺依赖:
|
||
|
||
```python
|
||
#!/usr/bin/env python3
|
||
"""扫描所有 SKILL_CARD.yaml,生成技能状态报告"""
|
||
import os
|
||
import yaml
|
||
from pathlib import Path
|
||
|
||
SKILLS_DIR = Path.home() / "agent-os" / "02_skills"
|
||
|
||
def scan():
|
||
print("=" * 60)
|
||
print("AgentOS 技能状态报告")
|
||
print("=" * 60)
|
||
for skill_dir in sorted(SKILLS_DIR.iterdir()):
|
||
if not skill_dir.is_dir():
|
||
continue
|
||
card_path = skill_dir / "SKILL_CARD.yaml"
|
||
if not card_path.exists():
|
||
print(f" ⚠️ {skill_dir.name} — 无 SKILL_CARD.yaml(外部技能或待补充)")
|
||
continue
|
||
with open(card_path) as f:
|
||
card = yaml.safe_load(f)
|
||
s = card["skill"]
|
||
o = card.get("ownership", {})
|
||
print(f" ✅ {s['name']} (v{s['version']}) 主理: {o.get('master_editor', '未知')}")
|
||
print("=" * 60)
|
||
|
||
if __name__ == "__main__":
|
||
scan()
|
||
```
|
||
|
||
放在 05_tools/skill_scanner.py,用 AGENTOS_PYTHON 运行即可。
|
||
|
||
---
|
||
|
||
C. 根目录:SKILL_CARD_TEMPLATE.yaml(技能身份证模板)
|
||
|
||
当你在别的机器上新写一个技能时,复制这个模板来填,确保格式统一。放在 ~/workbuddy-agent-os/agent-sync/SKILL_CARD_TEMPLATE.yaml。
|
||
|
||
---
|
||
|
||
4. **知识库(03_knowledge)**
|
||
- 分类建议:
|
||
- 知识(外部资料、文档、教程等)
|
||
- 个人笔记,个人我自己去想到的一些事,或者说我的感悟,或者说临时的一个随手的记的笔记,那这个东西呢其实就相当于随手记,我觉得这块就是呃它可以不用当成知识库,但是可能我需要有一个随手记随手查的事情,特别是比方说我开会的一个笔记,或者是我个人记录的一些语音,或者是个人记事,其实这是个个人成长,在我的第1版里头,其实是按照这个分类来的,所以呃知识库你会看到它比较乱,它有好多分类,其实是我的一个思想过程,中间呃有刚开始按照类别分的,后面按照事实分的,也有按领域分的,还有按概念分的,所以这块我们可以再讨论,嗯我只是把我所有的信息先放进来,你去了解一下
|
||
- 记忆固化(长期记忆、总结、反思等)这个说的是整个我嗯好多机子的记忆体里头很多内容,它可能随着时间的偏移,它有些东西也变成了事实,也要记录下来。如果变成事实的东西,而且是通用的,不是说单机能用的,那其实也可以归集到总的知识库里头的记忆体里头,或者说是整个转到事实的记录,这块也要进行一个合理的判断
|
||
- 项目立项/成形(项目文档、方案、进展等)我自己写的一些项目立项文件记录,包括我们自己编的程序的进展什么的,可能要单独画出来,因为它可能记录的我的一个过程,它可能是个过程记录,并不是结果,等到整个项目都成型了,稳固下来,可能他会写到正式记忆体。所以他要单独处理一下,我想的,
|
||
- 向量化内容(如向量索引、embedding 数据)
|
||
- 收件箱(待整理内容)
|
||
- 建议每类下可细分为原始、已整理、归档等
|
||
|
||
── 8_收件箱/ # 临时收集,每月归档
|
||
├── 1_日记/ # 每日记录,自动生成
|
||
├── 20_项目/ # 活跃项目,Frontmatter包含type/status/areas
|
||
├── 30_研究/ # 永久参考,深度调研内容
|
||
├── 40_知识库/ # 原子概念,拆分独立知识点
|
||
├── 50_资源/ # 精选内容,新闻稿、行业简报
|
||
├── 90_计划/ # 执行计划,完成后归档
|
||
└── 99_系统/ # 模板、提示词、归档目
|
||
知识库结构详解
|
||
6.1 目录结构与命名规则
|
||
知识库路径:~/workbuddy-agent-os/agent-sync/03_knowledge/,同时作为 Obsidian Vault。
|
||
编号
|
||
目录
|
||
中文名
|
||
知识属性
|
||
说明
|
||
00
|
||
00_inbox/
|
||
📥 收件箱
|
||
—
|
||
待提纯内容暂存
|
||
01
|
||
01_daily/
|
||
📅 日记
|
||
—
|
||
每日日记、闪念笔记
|
||
10
|
||
10_concepts/
|
||
💡 概念层
|
||
concept/axiom
|
||
16 个子领域目录
|
||
20
|
||
20_methods/
|
||
🔧 方法层
|
||
method
|
||
可操作的步骤/教程
|
||
30
|
||
30_facts/
|
||
📋 事实层
|
||
fact/regulation/data
|
||
已验证的客观事实
|
||
40
|
||
40_references/
|
||
📎 参考层
|
||
reference
|
||
论文/文档/外部资料
|
||
50
|
||
50_resources/
|
||
🛠 资源层
|
||
resource
|
||
视频笔记/阅读笔记/灵感素材等
|
||
60
|
||
60_opinions/
|
||
💭 观点层
|
||
opinion/quote
|
||
主观看法/他人原话
|
||
90
|
||
90_archive/
|
||
🗄 归档层
|
||
—
|
||
已弃用的知识
|
||
99
|
||
99_system/
|
||
⚙️ 系统层
|
||
—
|
||
模板/分类/配置
|
||
|
||
6.2 领域分类体系
|
||
10_concepts/ 下按 16 个一级领域分子目录:
|
||
编号
|
||
英文目录
|
||
中文
|
||
典型子领域
|
||
01
|
||
cs
|
||
计算机科学
|
||
数据库、前端、后端、运维、安全
|
||
02
|
||
ai
|
||
人工智能
|
||
NLP、CV、强化学习、RAG、Agent
|
||
03
|
||
finance
|
||
金融
|
||
量化交易、价值投资、宏观经济
|
||
04
|
||
law
|
||
法律
|
||
民法、商法、知识产权
|
||
05
|
||
medicine
|
||
医学
|
||
中医、西医、营养学
|
||
06
|
||
physics
|
||
物理
|
||
量子力学、相对论、热力学
|
||
07
|
||
math
|
||
数学
|
||
线性代数、概率统计、微积分
|
||
08
|
||
psychology
|
||
心理学
|
||
认知心理学、社会心理学
|
||
09
|
||
philosophy
|
||
哲学
|
||
认识论、伦理学、美学
|
||
10
|
||
history
|
||
历史
|
||
中国史、世界史、科技史
|
||
11
|
||
engineering
|
||
工程
|
||
机械、电子、土木
|
||
12
|
||
design
|
||
设计
|
||
UI/UX、平面设计、建筑设计
|
||
13
|
||
business
|
||
商业
|
||
创业、管理、营销、战略
|
||
14
|
||
personal-management
|
||
个人管理
|
||
GTD、番茄工作法、精力管理
|
||
15
|
||
personal-insight
|
||
个人洞见
|
||
决策模型、价值观、反思
|
||
16
|
||
other
|
||
其他
|
||
待新增领域
|
||
|
||
当"其他"类别超过总知识 5% 时,memory_manager 会提示新增领域。
|
||
6.3 知识卡片模板
|
||
99_system/templates/ 下有 4 种标准化模板:
|
||
模板文件
|
||
适用类型
|
||
核心字段
|
||
concept-card.md
|
||
概念/公理
|
||
一句话定义、核心原理、与相关概念区别、主流选择
|
||
method-card.md
|
||
方法/教程
|
||
适用场景、步骤、注意事项、示例
|
||
fact-card.md
|
||
事实/数据
|
||
事实陈述、数据来源、可信度
|
||
personal-insight-card.md
|
||
个人洞见
|
||
背景、思考过程、结论、行动项
|
||
|
||
所有知识卡片使用标准 Frontmatter:
|
||
yaml
|
||
复制
|
||
---
|
||
id: KB-YYYYMMDD-NNN
|
||
title: "知识标题"
|
||
type: concept|method|fact|reference|resource|opinion
|
||
status: draft|review|published|archived
|
||
nature: fact|opinion|method|regulation|reference|data|quote|axiom
|
||
domain: [领域1, 领域2]
|
||
tags: [标签列表]
|
||
confidence: 0.0-1.0
|
||
source: "原始来源 URL"
|
||
source_type: official_doc|literature|experiment|personal_exp|social_media|unknown
|
||
date_created: YYYY-MM-DD
|
||
date_modified: YYYY-MM-DD
|
||
version: 1
|
||
previous_version: ""
|
||
superseded_by: ""
|
||
---
|
||
|
||
|
||
6.4 分类体系配置文件
|
||
文件
|
||
路径
|
||
说明
|
||
domains.md
|
||
99_system/taxonomies/domains.md
|
||
16 个一级领域定义
|
||
nature-types.md
|
||
99_system/taxonomies/nature-types.md
|
||
9 种 nature 类型 + 决策树
|
||
folder-aliases.json
|
||
99_system/taxonomies/folder-aliases.json
|
||
英文目录 ↔ 中文映射
|
||
classify-knowledge.md
|
||
99_system/prompts/classify-knowledge.md
|
||
知识分类 Prompt
|
||
|
||
|
||
|
||
5. **工具层(05_tools)**
|
||
- 非技能化的工具脚本
|
||
- 包括知识库管理、记忆管理、技能管理等
|
||
- 建议按功能模块细分
|
||
因为技能很更多的是自然语言或一些东西,它可能对于一些大量的个性化的工具,呃可能不一定使用得很好,所以我的工具做很多做cl i的终端化的处理,或者说直接写成一些接口的东西,这样子会被技能更好的去去调用,技能这面有一些东西,呃如果确实是可以写,那中间也可以转换,但这个转换过程可能要等着这个技能呃通用了,才可能放到技能里头,或者说它跟系统有关才放进去。我是这么想的,你可以给我点建议啊,我们在这个事上再讨论讨论
|
||
6. **系统管理(07_migration/90_archive)**
|
||
- 打包、解包、迁移、备份等脚本
|
||
- 系统归档、历史记录
|
||
|
||
---
|
||
|
||
## agent-os-local(本机专属内容)
|
||
|
||
1. **采集原始内容**
|
||
- 各类原始数据(音频、视频、网页、截图等),每个单机的原始讨论,可能还包括我说的一些话,一些笔记,这个其实和知识库那块来讲是联动的,它其实是先进行我从网上或者。说手机或者是新闻客户端收集到的内容全都看到了以后,先暂存到每台机子上,因为每台机子我在做项目的时候,同时会看到一些信息,这个信息就是临时性的,或者是一个闪念,但是过完以后可能再去收集整理,所以它就相当于是个前前端缓存,存。存完以后,有一些东西可能分门别类,这块跟知识库呢要对应起来,到时候连知识库的分门别类和这块一块讨论。这个才是这个项目可能比较核心的东西,最初我就是拿这个东西想写一个项目来着,但是后来发现其实是依托智能体,不过不光是做这个项目,还要做智能体的一些配置,运行状态等等,才会越写越大,最后涉及到多机联动
|
||
- 建议按类型细分 materials/audio、video、web、screenshots 等
|
||
|
||
2. **本机记忆**
|
||
- 个人/本机的记忆数据
|
||
- 建议分为原始、整理、归档等
|
||
本机的记忆,自己也涉及到和知识体的共享的,就是什么记忆提取出来变成长久的记忆,他记忆里头可能有一些东西是要加一些属性字段,也就是向量化处理的时候,可能在一些东西,比方说事实层,或者说具体的这种呃硬约束层,它可能。能能提取出来,分享给所有人用,呃有一些东西只有跟本机有关,比方说本机的CPU处理能力,或者本机的向量化处理能能力,这些东西只能在本机用,放在别的机器上不通用的,那其实是不要放,那这个中间如何去判断,如何去执行。所以我们这中间的这个知识管理和提炼,记忆提炼这两个程序,就要把这些东西都整理进去,所以这两个程序写起来就会很重要
|
||
|
||
|
||
|
||
|
||
|
||
|
||
3. **运行记录、对话记录、缓存**
|
||
- 任务缓存、运行日志、对话历史
|
||
- 建议分为 runtime/cache、memory/raw、memory/vector_db 等
|
||
这块主要是和这个智能体的一个对接的地方,因为将来有可能智能体我换了的话,用其他智能体如何对接,其实都要在这块处理,因为换一个智能整体可能我用openclaw和现在workbuddy可能将来用的对接的方式或者是运行状态,可能对话记录或者说是呃每次的呃这种上下文也不一样。如何能从用这个适合智能体的一些工具把它调用出来,这个是很重要的事情,都在这块解决
|
||
4. **本机情况数据说明记录**
|
||
- 本机环境、硬件、软件、配置说明
|
||
- 建议单独设 info/ 或 system/ 目录
|
||
|
||
---
|
||
|
||
## 需要你补充/确认的问题
|
||
|
||
1. **向量库(vector_db)**
|
||
你希望它只作为索引,还是也存储知识内容?是否需要和知识库内容分离,还是做成知识库的一个子模块?向亮库,我就在想,其实我本地本机是应该有个向量库,然后在共享的呃服务器知识体上,其实也是有一个向量库,那个向亮库可以全全域和多多台主机同步,但我本机就是我本机,其实不需要同步,呃本机根据依据本机的这个能力,其实。在进行,所以我中间这个有一个向量库,可能要全局通用,这样子才能同步起来,呃我理解是这个样子,你可能想想是不是再帮我补充一下
|
||
|
||
2. **主机/维护机标识**
|
||
是否需要每台主机有唯一标识?主维护机如何指定?是否需要自动同步主维护机的内容?
|
||
主机肯定是要维护的,因为我相当于是多台主机跨系统的一个跨主机的一个操作,所以每台主机它是什么一个唯一标识,然后它充当。什么角色,对刚才我讲的知识库、记忆、技能,所有的这种管理,包括整个这个主程序的管理,他们都有什么权限角色,其实我觉得这个还是需要的,因为谁写的智能体可能最好是在他原来的这台主机上继续在维护。体的知识库的管理,最好是有一台主机,就固定充当这台管理主机,然后他晚上就可以进行呃提炼管理,记忆体各自是各自的管理,然后管理与有了一些记忆可以共享升级的情况下,然后再去提取到中组主机里头去呃管理
|
||
3. **知识库分类**
|
||
你希望知识库的分类粒度到什么程度?是否需要支持多级分类、标签等?
|
||
知识库的分类,我前面讲了好多了,包括记忆体那块也讲了好多了,有很多对接的,所以我需要这块来讲,呃展开了,到时候我们再细聊,你可以发散性的给我提问题,帮助我去把这块这一部分去完善掉
|
||
4. **工具与技能的边界**
|
||
工具和技能的区别是否只在于是否被系统自动加载?有无交集或转换机制?
|
||
工具在加载这一块,我需要既要注重效率,又要呃合理的去呃扩展,呃这块你给出很好的建议
|
||
5. **本机数据说明**
|
||
本机情况数据说明,具体希望包含哪些内容?如硬件、软件、网络、环境变量等?
|
||
本机情况就是根据我系统将来要完成的所有的电脑相关的事项,给出来的所有的数据,其实这个数据最好固定的写在这儿,但是它有一些变化的时候,又能够动态更新,这个要有个很好的呃模式,我不想浪费太多的token,因为核心逻辑就是整个这个系统使用token的时候还是要尽量节省一点效率为先,我不不能太过于浪费
|
||
6. **同步/备份机制**
|
||
agent-os 与 agent-os-local 之间是否需要自动同步、定期备份?同步粒度和策略如何? 我觉得你问这个问题就是你没搞清楚我现在在写什么,所以我现在才写了这么大一段东西给你
|