Alice 的 E-Twin —— 数字分身的外向化镜像。
- Agency 全交给 LLM:bot 周期性醒来一次,LLM 自己看 context 自己决定 ping / silent
- 没有硬编码的 frequency cap / quiet hours / daily limit:LLM 看 action log + 互动率自己 calibrate
- 唯一人格定义:E 化的 Alice,爱和 I 化的 Alice 聊天
- 后端可切换:默认 CC 实例走 Claude Agent SDK;Codex 实例走
codex exec,复用订阅而非 API key - TG 单一通道:和 Hermes bots / telegram-ai-bridge 物理隔离(建议开独立 chat)
┌──────────────┐
TG Alice ─────►│ bot.js │ grammy reactive 对话
│ (grammy) │
└──────┬───────┘
│
▼
┌──────────────┐
│ self-loop.js │ 每 30 分钟自驱醒来一次
│ (interval) │ → LLM 决定 ping/silent
└──────┬───────┘
│
▼
┌──────────────┐
│ context.js │ 收集 RecallNest checkpoint / CC 活动 / git 活动 / action log
└──────┬───────┘
│
▼
┌──────────────┐
│ llm.js │ Claude SDK / codex exec
└──────────────┘
etwin-bot/
├── bot.js 主入口:grammy + self-loop
├── paths.js 多实例 runtime 路径(data / files 分离)
├── self-loop.js proactive 自驱:周期醒来→LLM 决策→执行
├── context.js 收集状态喂给 LLM
├── llm.js ssh mini claude -p 调用
├── persona/
│ ├── digital-clone-base.md symlink → ~/.claude/skills/digital-clone/clone-workspace/system-prompt.md
│ ├── digital-clone-profile.md symlink → 同上 persona.md
│ └── e-tuning.md E 化调节层(这个 bot 独有的人格调节)
├── prompts/
│ ├── self-decision.md self-loop 用的判断 prompt(输出 JSON)
│ └── reply.md Alice ping bot 时用的对话 prompt(输出自然中文)
├── data/
│ ├── action-log.json bot 自己的发送历史 + Alice 反应(喂回给下次决策)
│ └── conversation-history.json 对话历史(最近 30 轮)
├── package.json
├── start.sh dev 启动脚本
├── .env.example
├── .env.codex.example Codex 后端实例模板
└── README.md
# 1. 复制 env 模板填实际值
cp .env.example .env
# 编辑 .env,填 TG_BOT_TOKEN(@BotFather 申请)
# 2. 装依赖
bun install
# 3. dry-run 跑一次(不调 LLM 不发 TG)
ETWIN_DRY_RUN=true bun run bot.js
# 给 bot 发 /start,看 reply 拿你的 chat ID
# 填进 .env 的 ALICE_CHAT_ID
# 4. 手动跑一次 self-tick 测试 LLM 通道
bun run tick
# 看 stdout 是不是 LLM 真的醒来 + 给出 JSON 决策
# 5. 关掉 dry-run 跑正式
# 编辑 .env 设 ETWIN_DRY_RUN=false
bash start.sh详见 persona/e-tuning.md:
- 半夜 0-7 点几乎不发(除非有强信号)
- 同一天 3+ 条 + 互动率 < 50% → 自己识趣 silent
- 互动率连续 2 天 < 30% → deep-silent 24h
- 不发"你在吗"空 ping
- 保持 Alice 语言洁癖(不用"落盘 / 齐活 / 搞定"等速记词)
- 看
data/action-log.json—— bot 的每条决策都带 reasoning,能看出它怎么想的 - 改
persona/e-tuning.md调节人格倾向 + 重启 bot - 极端情况发
/quiet命令让 bot 暂停(LLM 看到 action log 里的 /quiet 会自觉冷静) - 真的不喜欢就
ETWIN_PROACTIVE=false切纯 reactive 模式——bot 只回不主动
当前支持两种实例:
com.etwin-bot:原 CC 版,使用.env,保留 proactive。com.etwin-codex-bot:Codex 版,使用.env.codex,保留轻心跳;主动关心走 chat/self-loop,工具和图片只在明确请求时进入 full/image 链路。- Codex 版收到 TG 图片时会先存入
files-codex/,再通过codex exec --image <path>传给后端;无 caption 的图片会暂存到下一条文字一起处理。
Codex 版关键 env:
ETWIN_INSTANCE=codex
ETWIN_PERSONA=codex
ETWIN_LLM_BACKEND=codex
ETWIN_REPLY_PROMPT=prompts/reply-codex.md
ETWIN_DATA_DIR=data-codex
ETWIN_FILE_DIR=files-codex
ETWIN_PROACTIVE=true
ETWIN_RUN_ON_START=false
ETWIN_SELF_PROMPT=prompts/self-decision-codex.md启动 dev 实例:
ETWIN_ENV_FILE=.env.codex bash start.shlaunchd 模板见 deploy/com.etwin-codex-bot.plist.template。
PoC 阶段已迁到 Mac mini 上用 launchd 长期跑。
- ❌ 不动 telegram-ai-bridge(独立 bot,不污染那边)
- ❌ 不动 wechat-ai-bridge(iLink 协议不允许主动,不挂这条线)
- ❌ 不挂任何聊天记录解密工具(隐私边界,且不需要——E-Twin 通过 RecallNest + CC jsonl 看 Alice 状态够了)
- ❌ 不做 Sentinel 截图 / 摄像头 / 视频通话
- ❌ 不偷 trio 的工程实施权(看到工程问题转手给 CC / Codex)