给 Codex Desktop 加一层会看场合的本地表情包反应。
Codex Meme 是一个完全本地运行的社区项目。它通过 SessionStart、UserPromptSubmit 和 Stop 三段 Hook,在不改变正常回答的前提下,偶尔允许 Codex 从用户自己的素材中挑一张表情包。模型可以使用候选,也可以认为场合不合适并拒绝。
当前版本:
v0.1-alpha· Windows · Codex Desktop · Python 3.10+
自然触发 · Codex 正常完成回答后,可以在合适的轻松场景使用一张本地候选。 |
反问式点播 · “不来个表情包吗?”这类表达也能被识别。 |
- 普通对话经过预热、冷却和概率判断后,随机提供 3 张候选。
- “来张表情包”“send me a meme”等明确点播会绕过概率和冷却。
- “有别的吗”“再来一张表情包”“another one”等明确追图表达会直接点播,不受普通概率、预热和冷却限制。
- “来个动图”“send me a GIF”等请求只从 GIF 素材中选择。
- 严肃话题、禁图要求、严格 JSON、代码或补丁输出会在本地直接拦截。
- Stop Hook 会检查使用、拒绝以及候选外图片等情况,并记录连续追图状态;可选日志可以保留这些诊断事件。
- 运行时不生成或下载图片;本仓库不捆绑任何可供 Hook 使用的表情包素材。
- 不上传提示词、图片、日志或统计数据。
- Hook 运行时不使用网络、MCP、服务器或第三方 API。
- 不创建、读取或修改任何
AGENTS.md。 - 不在运行时扫描素材目录;只有
manifest.json中明确列出的图片能够成为候选。
SessionStart 注入一段很短的低优先级行为协议
UserPromptSubmit 本地判断是否提供 3 张候选
Stop 检查本轮是否使用了合法候选并更新连续追图状态
未命中时,UserPromptSubmit Hook 不向模型增加任何表情包候选上下文。所有状态和日志都保存在本机 Codex 用户目录中。
本项目不要求用户手工编辑 hooks.json。把仓库交给你信任的编码 Agent,并发送:
请从 https://github.com/xxH7r/codex-meme 获取 Codex Meme v0.1-alpha,
读取仓库中的 INSTALL_FOR_AGENT.md,并按照其中的规范为我安装。
保留我已有的所有 Hook,不要创建或修改任何 AGENTS.md。
修改前先备份,完成后运行验证并告诉我备份和回滚位置。
安装 Agent 会询问你使用已有的本地表情包目录,还是在你明确同意后从 ChineseBQB 获取素材。随后,它只会检查你确认的目录,为图片建立显式 manifest,并把三段 Hook 合并到用户级 ~/.codex/hooks.json。安装或修改 Hook 后,Codex 会要求你审查并信任新的 Hook 定义;不要让 Agent 手工伪造信任记录。
官方 Hook 说明:OpenAI Codex Hooks
没有现成素材库时,可以把 ChineseBQB 作为可选来源交给安装 Agent。该仓库包含大量图片,完整下载可能占用较多时间和磁盘空间,通常不需要把全部素材加入 manifest,建议只选择实际需要的子目录或图片。下载只发生在安装阶段,必须由你确认保存位置;下载后的目录仍是 Codex Meme 之外的外部素材目录。
- 至少 3 张有效素材。
- 支持
.png、.jpg、.jpeg、.gif、.webp。 - GIF 定向点播需要至少 3 张启用的 GIF。
- 每张图片需要唯一
id、绝对路径和简短label。 id只能使用 ASCII 字母、数字、短横线和下划线,长度为 1–64 个字符。label建议保持单行且不超过 80 个字符;运行时会折叠空白、移除控制字符并截断超长内容,清理后为空的条目不会加载。- 素材版权由用户自行负责;ChineseBQB 是独立的第三方项目,其仓库及图片不受 Codex Meme 的 MIT License 覆盖。
建议让安装 Agent 生成并验证 manifest。如果手动编辑,请遵守上述 id 和 label 格式。
manifest 示例见 templates/manifest.example.json。
| 配置 | 默认值 | 说明 |
|---|---|---|
probability |
0.20 |
普通、非冷却回合提供候选的概率 |
cooldown_turns |
5 |
命中后的普通回合冷却 |
warmup_turns |
2 |
新会话前两轮不随机触发 |
log |
true |
可选的本地诊断日志,默认开启 |
max_sessions |
40 |
本地状态最多保留的会话数 |
Codex Meme 默认把可选诊断日志写入 ~/.codex/hooks/codex-meme/reaction.log,用于排查预热、冷却、概率跳过、候选提供、使用、拒绝和运行错误。日志不参与选图、冷却或连续追图。
日志只记录时间、事件类型、会话与回合标识、候选 ID 和概括性的触发或跳过原因,不保存完整提示词、助手回复正文或图片内容,也不会上传。把 ~/.codex/hooks/codex-meme/reaction.json 中的 "log" 改为 false 即可关闭;关闭或删除日志不会影响核心功能,后续需要时可以重新开启。
当前日志达到约 2 MiB 后会轮转为 reaction.log.1,只保留一份旧日志。
probability 不是固定值,可以在 0.0 到 1.0 之间调整:0.20 表示符合条件的普通回合有 20% 概率提供候选,0.50 表示 50%,1.0 表示每个符合条件且不在冷却期的普通回合都提供候选。设为 0.0 会关闭随机触发,但明确点播和明确追图仍然可用。
实际出现频率还会受到 warmup_turns、cooldown_turns 和严肃话题等本地拦截规则影响,因此通常低于单独看到的概率值。明确点播和明确追图会绕过概率、预热和冷却;严肃话题和禁图要求仍然优先拦截。
安装时可以直接在安装提示词后追加一句:
把普通回合的随机触发概率设为 0.35,其他默认配置保持不变。
安装后也不需要重装。把下面这段交给编码 Agent,其中 0.35 可以换成你想要的值:
请先备份我已安装的 Codex Meme 配置,再把
~/.codex/hooks/codex-meme/reaction.json 中的 probability 改为 0.35。
请使用 JSON 解析修改,保留其他所有字段,验证完成后告诉我备份位置和实际生效值。
让 Agent 读取 UNINSTALL_FOR_AGENT.md。卸载规范只移除 Codex Meme 自己的 Handler 和安装目录,不删除外部素材,也不碰其他 Hook。
遇到问题、有功能建议或想贡献代码,可以提交 GitHub Issue 或 Pull Request。报告问题时请说明 Windows、Python 和 Codex 版本,但不要上传私人提示词、图片、日志或本地路径。
py -3 -m py_compile hooks\reaction.py hooks\session_start.py hooks\stop.py
py -3 -m unittest discover -s tests -v项目只使用 Python 标准库。
感谢 LinuxDo 社区,为我学习 AI 提供了很多帮助。
代码使用 MIT License。用户素材不受本项目许可证覆盖。README 演示截图仅用于功能展示;截图界面及其中的第三方图片不在本项目 MIT License 的授权范围内。
Codex Meme 是非官方社区项目,与 OpenAI 没有隶属或背书关系。


