内容
自
**您的代理已经读取了文件。 `自` 告诉它文件更改。**
[](https://github.comIVAS/since/actionsci.yml)
[]()
[](https://pypi.org/project/pysince/)
编码代理根据几分钟前读取的文件进行操作。这些文件:格式化工具运行了,同事推送了代码,另一个代理文件,git 拉取操作落地了。但是代理没有看到这些变化自信地根据过时的。`自` 在调用时告诉代理,到底发生了什么变化。
```bash
pysince
```
零依赖 Claude Code、Cursor、Copilotigravity。任何 MCP。
。在中,前沿模型的成功约 70% 下降 23%,其中约% 的失败归因于上下文漂移,而不是推理质量。典型的:代理在步骤 文件,通过步骤 30 进行在步骤 31 写入文件,但另一个进程在步骤 文件。代理在未的情况下覆盖了更新版本,任务看起来像是成功了。
这个问题出现在所有主要的代理工具中:
- **OpenAI Codex**覆盖它未创建的任何https://community.openai/codex-will-overwrite-anyanges-it-did-not-create/1362873):在编辑文件时,它会恢复文件,“每次 **GitHub Copilot代理 [覆盖自己的编辑](github.com/orgs/community/163388),因为“状态与 AI 在其基于会话中看到的内容不同”。
- **Claude Code** [读取过时的文件版本://github.com/anthropics/issues/3032 [其文件缓存与磁盘https://github.com/an/claude-code/issues/512rep 返回过时的 报告者得出结论外磁盘检查才能捕获它 **Continue** 具有类别的错误](https:///continuedev/continue9379)。
- 使用 **并行代理**,这会加剧为 [无声文件覆盖和代码库的过时视图](https://www.augmentcode.com/guides/git-worktrees-parallel-ai-agent-execution),其中代理“在数据损坏而不是显示异常的情况下继续运行”。
这是一个已知的生产阻塞器 - 32% 的代理团队将输出一致性列为他们的首要问题,并且有 [完整的指南](https://stormap.ai/post/how-to-stopents-from-overwriting-your-work-2026) 只用于阻止代理覆盖您`自` 是一个轻、单次安装的带:它为代理读取文件都进行了指纹识别每次工具调用时,哪些文件在代理操作之前上发生了变化。
##做什么
每个 MCP 都会显示自代理上次读取文件以来更改的所有文件。记得检查。`自` 会:
```text
次读取以来发生更改的文件:
config.json(内容修改时间已更改 4分钟前读取
alerts.py(内容已更改时间已更改)-分钟前读取
```
代理在操作之前会重新读取这些过时的副本写入。
时需要此功能
当文件在代理的视线之外发生变化时,最为有用:另一个进程、同一个存储库中的格式化工具、预提交、并行代理或中漂移的上下文。
对于快速的单文件编辑,可以自行重新读取,不太需要此功能。对于临时脚本过此功能。当代理共享会话长时间运行或多个触及文件树时功能。
## 安装
作为本地 MCP 服务器运行。将其添加到客户端的 MCP。
**VS Code:json
{
"servers "pysince "type": " "command": "p-mcp",
" [],
"cwd":Folder}"
}
```
**Antigravity:json
{
"Servers": {
"": {
"command": "python",
"args": ["-m", "since.mcp"]
}
}
}
```
然后,在代理的系统指令中添加以下行,以便知道何时调用工具:
> 读取任何文件时,调用 `stamp_file_read`。在编辑文件之前,调用 `check_staleness`。当响应列出更改的文件时,在操作其内容之前重新读取这些文件。
## 工具
| 工具 | 何时调用 | 功能 |
|---|---|---|
| `stamp_file_read` | 读取任何文件后 | 记录修改时间和内容哈希 |
| `check_staleness` | 编辑文件前 | 报告文件是否更改,并列出其他已更改的跟踪文件 |
| `session_duration` | 随时 | 会话跟踪时间 |
| `invalidate_source` | 手动 | 按需将源标记为过时 |
`check_staleness` 是核心。它从不只回答关于所询问文件的问题。它会报告已跟踪的所有文件的完整集合,这些文件已经发生了漂移,这样代理就不会对未检查的更改保持盲目 工作原理
`自` 为每个读取的文件加上其修改时间和 SHA-256 哈希。在后续调用中,它将存储的指纹与当前文件进行首先比较修改时间,因为这很快,只有当修改时间发生变化时才会进行完整哈希比较。无需守护进程,无需轮询,无需后台进程。只需在下一次调用时与磁盘进行比较,这就是为什么它可以捕获代理自己的缓存视图无法捕获的更改。
---
## 另外:聊天应用的时间上下文
相同的基元,针对会话而不是文件。包装聊天函数,模型会看到时间线:每个消息何时发生,间隔时间长短以及哪些上下文已过时。
from since import Store, since_time
from import OpenAI
Store("~/.since/chat.db")
client = OpenAI()
@since_time(store=store, timezone="Asia/Kolkata")
def chat(messages):
return client.chat.completions.create(model="gpt-4o-mini", messages=messages)
resp = chat(messages=[{"role": "user", "content": "hello"}])
print(resp.choices[0].message.content)
```
模型在每次对话前接收一个紧凑的时间块:
```yaml
现在:星期日 凌晨 2:36(晚上)
会话:总共 9 小时 2 分钟,3 次会话中 4 分钟活跃,共 8 条消息
间隔:自上一条消息以来 6 小时
```
因此,模型可以说“欢迎回来,自从我们上次通话以来已经大约 6 小时了”,而不是“我没有关于之前对话的信息”。
装饰器默认读取 OpenAI 响应格式。对于其他提供商,请传递一个 `extract_reply` 函数,该函数从提供商的响应对象中返回回复文本。
## 需求
- Python 3.10+
- 零依赖
## 安装
```bash
pip install pysince
```
PyPI 名称为 `pysince`,因为 `since` 已被占用。你可以导入它,存储库名称为 `since`。