# 从集成自动获取

大多数“AI 助手”都是被动响应式的：你提问，它们思考，然后回答。OpenHuman 则相反。它会持续从你的技术栈中拉取数据，所以等你问“昨晚有什么进了我的收件箱？”时，答案其实已经在 [记忆树](/openhuman/zh/gong-neng/obsidian-wiki/memory-tree.md).

## 工作原理

一个统一的周期调度器每二十分钟触发一次。每次触发时，它会遍历每一个活跃的 [集成](/openhuman/zh/gong-neng/integrations.md)，查找匹配的原生提供方，如果自该连接上次同步以来已经过去足够时间，就调用 `provider.sync(ctx, SyncReason::Periodic)`.

```
每20分钟
    |
    v
针对每个活跃连接（Gmail、Notion、GitHub，……）
    |
    +--> 检查 sync_state（toolkit，connection_id）
    |       - 上次同步时间戳
    |       - 每日额度
    |       - 去重集合
    |       - 游标
    |
    +--> 如果间隔已过 -> provider.sync()
            |
            +--> 成功后 -> record_sync_success(ts)
```

这里有几件事很重要：

* **一个全局 tick，而不是每个连接一个任务。** 每个用户的连接数量都不多；一次 20 分钟的 tick 就足够了，而且让账务管理变得很简单。
* **状态按 `（toolkit，connection_id）`.** 每个连接都有自己的游标、自己的上次同步时间戳、自己的去重集合、自己的每日额度。重启时会从本地 KV 重新构建这些状态，漏掉一次周期同步也无妨，因为重启后的下一次 tick 会把它补回来。
* **原生同步与事件驱动路径共享。** 当 webhook 或 `on_connection_created` 事件触发一次非周期同步时，它会标记相同的 sync\_state，因此调度器不会重复触发。
* **错误会被记录并吞掉。** 调度器绝不能在循环中崩溃，否则周期同步会在进程剩余生命周期内悄无声息地停止。

## 什么会进入记忆树

每个提供方都负责塑造自己的摄取流程。以 Gmail 提供方为例，它会拉取一页新消息，运行邮件规范化器，然后把结果通过与手动 UI 相同的 `摄取` 路径：分块落入 SQLite，摘要桶被填充，任何被触及的实体都会使主题树变脏。

其他提供方（GitHub、Slack、Notion，……）也遵循同样的形态：从游标之后拉取新条目 → 规范化 → 摄取到 [记忆树](/openhuman/zh/gong-neng/obsidian-wiki/memory-tree.md).

## 为什么是 20 分钟的 tick

最初的设计是每 60 秒运行一次。随着连接的提供方增多，这意味着持续不断的 HTTP 拉取和数据库写入，在笔记本上看起来明显很忙。20 分钟用一点点新鲜度换来明显更少的前台负载。每个提供方的 `sync_interval_secs` 仍然会限制 *最小* 实际同步之间的延迟；全局 tick 只会放宽上限。

## 调优与可见性

* **每个提供方的间隔**. 每个原生提供方都会声明自己的 `sync_interval_secs`，因此高流量工具栈（Gmail）可以比低流量的（Stripe）同步得更频繁。
* **每日额度**. 每个连接都有每日请求额度，以保持 API 成本和速率限制在合理范围内。
* **日志**. 同步活动会以 debug 级别记录在核心日志中。

## 另见

* [第三方集成](/openhuman/zh/gong-neng/integrations.md). 连接器层的自动拉取运行在……之上。
* [记忆树](/openhuman/zh/gong-neng/obsidian-wiki/memory-tree.md). 所有内容最终都会落到这里。
* [智能 Token 压缩](/openhuman/zh/gong-neng/token-compression.md). 这就是让“抓取一切”变得便宜的关键。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://tinyhumans.gitbook.io/openhuman/zh/gong-neng/obsidian-wiki/auto-fetch.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
