内容
align="center">
<="https://geo.qa/vortxgola.gif" width="128" alt="emem" />
<hemem</h1>
<p>地球,通过卫星为现实世界的代理提供服务。</p>
p>
<a href="LICENSE"><img src://img.shields.io/badgeApache--2.0-blue.svg" alt="License"></a>
<ahttps://www.rust-lang.org/"><img src="https://img.shields.io/badge/r1.91-orange.svg="Rust"></a <a href="httpscontextprotocol.io/"><img src="https://img.shields/MCP-Streamable%20HTTP-7af.svg="MCP"></a <a href="https://www.openapis.org="https://.io/badge/OpenAPI-3.1-green.svg" alt="OpenAPI"></a>
<a href="https.com/Vortx-AI/emem/pkgs/container/emem"><img src="https://img.shields.io/badge/ghcr.io-vortx--ai%2Femem-?logo=github"Container"></a>
</p>
<p>
a href="eudr.dev"><="https://img.shields.iobuilt%20with%20emem-eudr.dev%20%C2%B20EUDR%20compliance%20agent-2ea043.svg" alt="eudr.dev: EU Deforestation Regulation compliance agent built on emem"></a>
</p>
<p>
<a href="https://emem.dev"><strong>托管</strong></ ·
<ahttps://emem.dev/agents.md">文档</ ·
<a href="https://emem.dev">规范</a> ·
<a href="https://emem.dev/openapi.json">OpenAPI</a> ·
<a href="https://emem.dev/humans">试用</a> ·
<a href://emem.dev/verify">/verify</a> ·
<a href="https://emem.dev/docs/gallery">画廊</a> ·
<a href="https://huggingface.co/spaces/vortx-ai">HF Space</a>
</p>
</---
**询问一个AI代理地球上某个位置的情况,它猜测。** 它没有固定的句柄来引用地球上的某个位置,也无法证明它返回的数字的准确性。 emem 就是这个句柄。它是一个共享的,代理可以读取、写入和引用,其中每个经过签名,以便任何人都可以稍后检查,而无需答案的服务器。
固定大小的类似于页面被分成单词。 一个单元格中的一个测量值是一个 **事实**:海拔、降雨总量、本年的、卫星嵌入。事实都经过签名询问一个尚未测量的位置时,响应者实际的卫星源中提取值,签名后返回预先设定的数据。 地球上的每个从第一个请求开始响应em 是一个协议。 事实通过其字节的3 哈希进行命名,因此数据的指纹,并在每台机器上代表。 响应者使用 ed25519 密钥签名用于保护 SSH 和 HTTPS。 任何响应者都可以提供事实,任何客户端都可以离线验证,而无需帐户管理。 将事实 ID 到聊天中可以从任何节点提取相同的字节,并在浏览器中检查签名,网址为 [/verify](https://emem.dev/verify)。 托管节点是 `https://emem.dev`。 相同的二进制文件通过一个 `docker run` 自主托管,相同的处理程序同时响应 MCP 和普通 REST。 运行足够的节点,您就可以得到一个联合:独立的解决相同的 ID,字节对字节,并记录它们不同意的地方。 随着更多代理的使用,记忆变得更加赖。
### 事实如何创建和证明
一个64** 以类似于令牌在LLM中的方式定位一个位置。 大约 9.55的每个地面补丁 64 位相似的 ID 物理上彼此接近。 一个 **事实该单元格上的一个测量值,由 `(cell, band, time)` 键控,并以固定的字节顺序(规范的 CBOR)打包,以便相同的读取在每台机器上哈希相同。 该 blake3 哈希是事实的 **内容 ID**。 更改一个字节,ID,因此ID证明了字节。 响应者对其 返回的签名信封收据**,可以使用响应者的公钥离线检查,而无需。
当代理请求一个单元格的波段,而该有签名的事实时,响应者会通过其 46 个上游源之一获取底层图块,对其签名,并将其返回在同一响应中。 冷读取大约需要 180 毫秒。 热读取则少于十毫秒。 五种方案但尚未连接(`openet.30m.daily`、`dynamic_world.v1`、`tropomi.s5p.ch4`、`tropomi.s5p.no2`、`viirs.dnb.monthly`);它们以类型化的缺失进行响应。 当波段在单元格上确实没有值时,因为位置在覆盖范围之外或上游无法访问,答案仍然是一个签名的缺失,附带有可读的原因。 空答案是一个可引用的收据。 目录永远不会承诺多于它能签名的。
## 试用(无需安装,无需密钥)
```bash
# 将位置地理编码为 cell64。
curl -s - https://emem/locate \
H 'content-type: application/json' \
-d '{"q":"Bengaluru"}' | jq .cell64
# "defi.zb493.xuqA.zcb5f" # (地理编码结果,可能会漂移)
# 在该单元格上回忆段(如果自动获取)。
curl -X POST https.dev/v1/recall \
-H 'content-type: application/json' \
-d '{"cell":"defi.zb493A.zcb5":["weather.temperaturem"]}' \
| jq '.facts['
# 提出一个自由文本问题;基础嵌入扇出会自动根据“查找相似” / “发生了什么”意图触发。
curl -s -X POST https://emem.dev/v1/ask \
-H 'content-type: application/json' \
-d '{"q":"find places like Yellowstone","place":"Yellowstone National Park"}' \
| jq '.answer'
# 猎人模式:在命名区域上发现事件热点。相同的分类器1/ask在<区域>查找<事件>”,并路由到此处;结构化点击/v1。
curl -s POST https://em/v1/hunt \
H 'content-type: application/json' \
'{"event":"algal","region":""}' \
| jq '.hotspots[0]'
```
收据的 `fact_cid` 是一个持久的句柄。 从任何响应者重新获取它,在任何年份,返回相同的字节。
## 验证答案(四个curl命令)
该宣传活动成败在此流程上。 每个召回响应都带有收据,包含 `fact_cids[]`、`merkle_proof` 和 Ed25519 `signature`,它覆盖了一个域分隔的、长度前缀的预映像:`blake3("emem.preimage.v1" ‖ "receipt" ‖ tagged(request_id, served_at, [scope], [as_of], [edges], [manifest], primitive, cells[], fact_cids[]))`。 每个字段,并且其长度被前缀,这意味着响应永远不会共享签名的字节;收据` 选择规则,v1 之前的收据仍然在原始规则下验证。 签名者的公钥是稳定的;收据针对响应者公钥的任何副本进行离线验证。 梅克尔树 6962 叶子/节点域拒绝重复叶子。
这是一个真实的例子。 在://emem.dev` 上询问海拔,并在丹佛下方返回城市昵称作为签名的数字人都可以在 1609 米的高度重新检查,而无需信任服务器:jsonc
//v1/recall":"defi.zb5c4.guxe.nuxe","bands":["copdem.elevation_mean"]}
{
"facts":cell": "defi.zb5cuxe.nuxe",": "copdem.elevation_mean",
"value": 1600, "unitm", "sourcecopernicus.dem.glo30" "receipt": {
"primitive": "emcall",
"fact_cids": ["72wdchiyurfr7zat6kor7gjnvsn564fbrzjkmlhagoy4rrh4a"],
responder_pubkey_b32": "777er3yihgifqmv5hmc2wwmy…",
"preimage_version": 1,
"signature": "…19 over the canonical…"
}
}
```
将该 `fact_cid` 粘贴到 [/verify](https://emem.dev/verify) 中,页面重新派生哈希并在浏览器中检查签名。 以下四个curl命令在shell中执行相同的操作:
```bash
# 1. 将位置解析为 cell64。
CELL=$(curl -s -X POST https://emem.dev/v1/locate \
-H 'content-type: application/json' \
-d '{"q":"Golden Gate Park, San Francisco"}' | jq -r .cell64)
# 2. 回忆一个波段并捕获收据信封。
curl -s -X POST https://emem.dev/v1 -H 'content-type: application/json' \
-d "{\"cell\":\"$CELL\",\"bands\":[\"indices.ndvi\"]}" > /tmp/recall.json
jq '.receipt | {primitive, served_at, responder_pubkey_b fact_cids, merkle_proof: .merkle_proof.root /tmp/rec
# 请求响应者验证其自己的签名(服务器jq '{receiptreceipt}' /tmp.json > /tmpipt.json
curl -X POSTemem.dev/vverify_receipt \
H 'content application/json' --/tmp/rece
# {"validpreimage_blake3_hex":"…","fact_cids_count":signer_pubkey":"…",… 4.:在任何响应者、任何一天上拉取相同的fact_cid。
单元格、波段、 和派生.fn内容寻,因此您接收的哈希到相同的 fact_cid。
jq '.facts].derivation' /tmp/recall.json
```
对于仅限浏览,请打开 [`/verify/<fact_cid>`](https://emem.dev);页面Crypto + `@/ed25519` 中执行相同的 Ed25519 检查,因此您永远不需要从中获得收据的响应者。 有,请参阅 [`/demos/signedhttps://emem.dev/demos/signed-answer 架构
<p align="center">
src="docs/diagrams/architecture.png" alt="emem architecture: one binary at the centre, clients reaching it over MCP and REST through the same handlers ringing the core, upstream sources feeding in from the left, the GPU from the right write dropping into an append-only signed log below four content-addressed manifests pinning what produced" width="900 <br/>
<em>一个二进制文件。 相同的处理程序回答 MCP 和普通 REST,读取不需要身份验证,每个写入都落在一个仅追加的签名日志中。 四个内容寻址的清单(<code>bands_cid</code>、<code>algorithms_cid</code>、<code>sources_cid</code>、<code>schema_cid</)固定了每个答案的生产者。 完整的件位于 <a href="https://emem.dev/docs/diagrams">/docs/diagrams</a>。</em>
</p>
## 内存层
缓存返回一个图块。 内存会记住它所看到的内容,将其与之前看到的内容联系起来来源发生冲突时说明。 emem 在事实存储的基础上为代理提供了第二种功能,代理拥有它。
<p align="center">
<img src="docs/diagrams/memory-engram.png" alt="An engram of Earth, drawn as a neural-memory diagram in ink-on-paper Mithila style: each cell is a node, edges are synapses that relate, supersede, or disagree, and recall pathways converge on a central consolidation lotus" width="900"/>
<br/>
<em>代理对地球的记忆,以神经元记忆图的形式绘制。 每个单元格都是一个节点,每个边都是一个突触,相关、取代或不同意,召回路径汇聚到中央巩固莲花,每个节点都带有自己的签名。</em>
</p>
写入落在 `/memories/` 下,作为内容寻址的签名文件。 `memory_create` 创建一个,`memory_str_replace` 和 `memory_insert` 编辑它,`memory_search` 通过 LanceDB IVF_PQ 索引在内容上运行 BGE-768 嵌入查询,以便代理通过含义而不是文件名查找它上周写的笔记。 每个文件都带有 CoALA 分类法中的 `kind`:`episodic` 表示发生的事情,`semantic` 表示成立的事情,`procedural` 表示如何做某事,`resource` 表示指针。 在 `/memories/by_attester/<pubkey>/` 下的写入是能力绑定的,因此一个密钥拥有的路径会拒绝其他签名者。 证明 Sentinel-2 读取的签名与证明代理自己的笔记未被触动的签名相同。
内存连接事实并在它们冲突时通知。 `memory_bundle` 将 N 个事实折叠成一个签名的信封 `memb:<bundle_cid>`,它解析为任何对等体上的相同字节,因此代理为整个发现提供一个引用,而不是一个松散的 ID 列表。 `memory_contradictions` 在同一个 `(cell, band, tslot)` 处签名不同值的案例,并按带种类评分:标量化传播,向量平均余弦,类别模式共享。 第二个节点读取同一个 Sentinel 场景,在多云天气下,留下一个跟踪,代理可以称重,而不是一个沉默的覆盖。
每次读取都采用双时间边界。 `as_of_tslot` 询问过去某个时刻世界的外观。 `_signed_at` 询问系统在过去某个时刻所知道的。 同时设置两者,两者都成立。 收据记录边界,因此 2027 年的审计员获取 2026 年的收据,到任何对等体并重放完全相同的查询。
### 流
内存是实时的,您可以观察它。 `GET /v1/stream` 是一个服务器发送事件的心跳。 每隔几秒,响应者都会签署一次存储区状态的快照并推送,因此仪表板或代理在不轮询的情况下跟踪共享内存的增长。 心跳直接从 `https://emem.dev` 捕获:
```
event: state
data: {
"type": "corpus.state",
"served_at": "2026-06-12T16:17:30Z",
"corpus": { "distinct_cells": 8147, "distinct_bands": 75, "facts_scanned": 32768 },
"responder": { "pubkey_b32": "777er3yihgifqmv5hmc2wwmy…", "key_epoch": 0 },
"signature": {
"alg": "ed25519",
"preimage": "emem.stream.tick|v0.1.0|epoch0|2026-06-12T16:17:30Z|registry:3pbqnyni…|cells:8147",
"signature_b32": "xk2hiluwmfywwnfj…"
}
}
```
`GET /v1/memory/spath_prefix=&kind=&attester=` 是窄流。 它在服务器端过滤后推送一个事件,因此合规订阅者在内存写入提交时看到写入到监视路径的写入,而不是在下一次轮询。
## 连接您的AI助手
MCP 端点是 `https://emem.dev/mcp`。 在您的客户端中插入一个配置文件。
| 客户端 | 配置 |
|-----------------------|---------------------------------------------------------------------|
| Claude Desktop | [examples-desktop.json](examples/claude-desktop.json) |
| Claude Code | [examples/claude-code.mcp.json](aude-code.mcp |
| Cursor | [examples/cursor.mcp.json](examples/cursor.mcp |
| Cline (VS Code) | [examples/cline.mcp.json](examples/cline.mcp.json |
| Gemini CLI | `gemini extensions install https://emem.dev/gemini-extension.json` |
| ChatGPT (Custom GPT) | [examples/openai-gpt-action.json](examples/openai-gpt-action.json)| LangChain (Python) | [examples/langchain.py](examples/langchain.py) |
| LangChain MCP agent | [examples/langchain/](examples/langchain/) |
| LlamaIndex (Python) | [examples/llamaindex.py](examples/lldex.py) |
| LlamaIndex MCP agent | [examples/llamaindex/](examples/llamaindex/) |
| Agno MCP | [examples/agno/](examples/) |
| Pydantic agent | [examples/pydantic-ai/](examples/pydantic-ai/) |
| AutoGen MCP agent | [examples/autogen/](examples/autogen/)| CrewAI MCP agent | [examples/crewai/](examples/crewai/) |
| Mastra MCP agent | [examples/mastra/](examples/mastra/) |
Python (`ememdev`) 和 TypeScript (`@emem/client`) SDK 位于 `sdks/` 下(PyPI / npm 发布待定;今天从仓库安装)。
## 原语
81 个 MCP 工具(10 个核心工具,71 个扩展工具),93 个已文档化的 REST 路径位于 `/v1/*` 下,通过 `/openapi.json` 公开。每个工具都带有为 LLM 工具选择编写的 `when_to_use` 字符串,以及四个 MCP 行为注释(`readOnlyHint`、`destructiveHint`、`idempotentHint`、`openWorldHint`)。无参数的 `tools/list` 返回所有 81 个工具(因此每个 MCP 客户端都可以发现整个表面);传递 `{"tier":"core"}` 则仅返回 10 个基本工具。无论工具等级如何,都可以通过 `tools/call` 调用工具。
- **定位:** 名称或纬度/经度 → `cell64`。五层级联:宽边界框表 → 嵌入式地名索引 → GeoNames 城市-5000(68,581 个地点,正在处理)→ sled 缓存 → Photon → Nominatim。当 Nominatim 返回 POI 法院时,区级查询通过 Overture 重定向。
- **内存基质** (状态 + tokens + 包 + 内存文件 + 搜索 + 矛盾 + SSE):`POST /v1/state` 返回一个签名的密集位置嵌入(`view=encoder` 默认 128-D,`view=cube` 完整 1792-D)。`POST /v1/state_multi` 跨 `geotessera` + `clay_v1` + `prithvi_eo2` + `galileo` 进行扩展。`POST /v1/state_diff` 返回两个版本之间的残差 + L2 + 余弦。`POST /v1/memory_token` 组成 `memt:<cell64>:<fact_cid>`。`POST /v1/memory_bundle` 在 N(单元,波段,时间槽)三元组上组成一个签名的信封 `memb:<bundle_cid>`。六个 MCP 文件操作动词(`memory_view`、`memory_create`、`memory_str_replace`、`memory_insert`、`memory_delete`、`memory_rename`)符合 Anthropic 的 memory-tool 规范;每个写入操作都是 ed25519 签名和内容寻址的。在 `/memories/by_attester/<pubkey>/...` 下的路径强制实施能力绑定(`blake3("emem.memory_write|" + verb + "|" + path + "|" + body_hash)` 的 ed25519 签名)。每个文件都带有 CoALA 分类法中的 `kind`(`episodic` / `semantic` / `procedural` / `resource`)。`POST /v1/memory/search` 通过 LanceDB IVF_PQ 分区对文件内容进行 BGE-768 语义搜索。`POST /v1/memory_contradictions` 遍历一个并行多验证者索引,并根据波段种类对不一致性进行评分。`GET /v1/memory/sse?path_prefix=&kind=&attester=` 流式传输带有服务器端过滤的写入事件。每个读取原语都接受 `as_of_tslot` + `as_of_signed_at` 进行双时间查询(有效时间 + 交易时间);当设置收据时,会携带一个 `as_of` 块。有关完整参考,请参见 [`docs/memory.md`](docs/memory.md)。
- **回忆 / recall_many / recall_polygon:** 124 个物化器连接的波段名称,跨越 43 个立方体槽。回忆任何连接的波段,在冷缺失时自动获取并签名结果。在覆盖范围外进行签名缺失。
- **查找相似:** 任意矢量波段上的 k-NN。Hamming 快速路径(符号位计数)从余弦波段自动派生,当二进制兄弟节点缺失时。模式 `hamming_then_rerank` 通过 Hamming 进行分类,然后按余弦重新排序;过采样因子是 EWMA 自适应的。
- **比较 / compare_bands / diff / trajectory:** 成对和时间序列。
- **连接与演化:** 类型化时间边(`emem_edges_recall` 读取事实的签名连接,类型为 `disagrees_with`、`supersedes` 或 `relates_to`,以有效时间为界),多验证者矛盾评分(`memory_contradictions`,按波段种类),以及一个确定性细化循环,当新的验证或 `disagrees_with` 边出现时,会重新派生一个事实。所有三个功能都已在 0.1.0 中发布。
- **验证:** 结构化声明与已验证事实;返回签名判决 + 证据 CID。
- **物理:** `/v1/heat_solve`(2-D 显式 FTCS 热量,MODIS LST 模板),`/v1/wave_solve`(1-D 浅水沿海水深梯度),`/v1/jepa_predict`(闭合形式 NDVI AR(2) 季节性),`/v1/jepa_predict_v2`(Tessera 嵌入动态;短路到上一次更新的身份基准,当训练头待定时,收据携带 `untrained_baseline`)。
- **提问:** 带有主题路由的自由文本问题。分类器涵盖三个意图家族:基于位置的主题问题(主题路由器分支),`find places like` / `what changed` / `deforestation` / `anomaly` 上的基础嵌入意图(Clay + Prithvi + Tessera 的交叉编码器共识),`where do you have data` / `how fresh is your corpus` 上的语料库元意图(重定向到覆盖范围表面),以及 `find <event> in <region>` 上的猎人模式发现(路由到 `/v1/hunt`)。
- **猎人:** `POST /v1/hunt` 和 MCP `emem_hunt` 用于开放世界事件发现。十二个事件关键词(`algal_bloom`、`deforestation`、`flood_extent`、`wildfire`、`urban_heat_island`、`methane_plume`、`landslide`、`drought`、`soil_salinity`、`crop_stress`、`water_turbidity`、`oil_slick`)每个都映射到一个注册的检测算法。响应程序从命名区域中采样最多 32 个单元(对于慢速主波段,例如 MODIS LST 为 8 个),召回算法的主要标量和任何配置的门控波段(例如 NDWI > 0 用于水掩模事件),并返回顶部 8 个热点,带有 cell64、纬度/经度、召回值、门控值、事实 CID 和 Sentinel-2 场景 URL。当至少三个候选单元具有 geotessera 矢量可用时,Tessera 嵌入重新排序会触发,按与聚类质心的余弦相似度重新排序。`oil_slick` 返回 `status: not_yet_implemented`,并指向 `flood_extent_sar_threshold@1` 和 `water_turbidity_red_band@1` 而不是伪造检测。
- **EUDR 合规声明:** `POST /v1/eudr_dds` 和 MCP `emem_eudr_dds` 生成一个签名的附件 II 形状的 DDS,符合法规 (EU) 2023/1115。每个单元的算法 `eudr_compliance@1` 实现第 2(4) 条:>0.5 公顷,>5 米高度,>10% 树冠覆盖率,排除主要用于农业或城市用途的土地。判决是两个静态基线与一个窗口化 COG 样本每个波段的共识:JRC GFC2020 V3(委员会的预期非约束基线)用于森林切割截止,Hansen GFC v1.12 损失年用于严格在 2020 年 12 月 31 日后砍伐。一个单元如果在截止日期或之前被清理,则为 `not_in_scope`,永远不会通过。一个地块还带有 `loss_year_histogram`,每个年份的 Hansen 损失年的分布,签名为其自身的 `forest_change.lossyear_histogram` 导数,其 ID 折叠到收据中,因此损失年份的分解是一个可验证的数字,而不是无符号的摘要。JRC TMF、Sims 等人 2025 年驱动因素归因和 RADD Sentinel-1 警报位于判决热路径之外(其上游不尊重 HTTP Range);每个都作为明确的波段请求可用,响应程序不会为它无法读取的连接器伪造一个值。两个免责声明使范围保持诚实:`legality_disclaimer` 用于第 9(1)(b) 条(土地所有权、FPIC、原产国法律,结构上超出 EO 范围),以及 `degradation_disclaimer` 用于第 2(7) 条森林退化(判决衡量森林砍伐,而不是退化)。JSON 架构 `/v1/schemas/eudr_dds.json` 引用了每个字段映射到的确切 EUR-Lex 段落;`regulation_status_note` 跟踪应用延期(法规 2024/3234 和 2025/2650 → 2026 年 12 月 30 日适用于大型运营商,2027 年 6 月 30 日适用于微型和小型)。
- **领域快捷方式:** `emem_at`、`emem_ndvi`、`emem_air`、`emem_lst`、`emem_soil`、`emem_water`、`emem_forest`、`emem_weather`。通过地名将定位 → 回忆 → 多边形聚合折叠为一个调用。
- **字段边界:** 世界字段(~3.17B 字段多边形,241 个国家,10 米,CC-BY-4.0)通过 `source.coop` 上的 PMTiles 范围读取。
- **视觉表面:** `/v1/coverage_map.svg`(1440×720 板条形细胞,日志比例密度)和 `/v1/places/scene_overlay.svg?place=…&band=…`(每个位置的数值绘制 bbox 网格;带感知的 ColorBrewer 坡道,水平图例,公里标尺,签名源线)。MCP 等价物以 `EmbeddedResource` 块返回相同的 SVG。完整的集合,加上 32 个图协议/行业套件,位于 [/docs/gallery](https://emem.dev/docs/gallery) 和 [/docs/diagrams](https://emem.dev/docs/diagrams)。
<p align="center">
<img src="docs/diagrams/eudr.png" alt="EUDR 供应链:地理定位的地块与森林基线和 Hansen 损失年相比,在 2020 年截止日期后签署为一个尽职调查声明,其 26 个字符的句柄在 TRACES NT 清关" width="900"/>
<br/>
<em>一个用例,端到端。一个地理定位的地块与森林基线和 2020 年截止日期后的 Hansen 损失年进行检查,判决及其每年的损失直方图被签署成一个尽职调查声明,而这 26 个字符的句柄就是清关所需的。</em>
</p>
## 算法
160 个命名组成配方(`flood_risk@2`、`walkability_score@1`、`heat_index@2`、`carbon_sink_score@1`、`eudr_compliance@1`、`forest_carbon_loss_co2_flux@1`、`enteric_ch4_dairy_tier1_ipcc2019@1`、`n2o_synthetic_fertilizer_ef1_ipcc2019@1`,...)生活在一个内容寻址注册表中。每个都带有:
- `formula`: 普通数学代理可以读取和应用。
- `inputs`: 带有角色 + 解释的波段键。
- `when_to_use`: 代理目标触发指导。
- `citation`: 同行评议来源。
- `accuracy_band`: 诚实的精度估计,不是营销。
- `parameters`: 类型化可调阈值(门控,k,超时,...)。
- `learned_from`: 每个调谐数字的引用出处。一个审计员可以追踪任何门控阈值回到一个裁判。
具有 `evaluation: Expr` AST 的算法也可以在进程中重新执行:响应程序遍历 AST 以获取快照回忆,并返回一个签名的复合标量,任何具有匹配 `algorithms_cid` 和输入事实 CID 的第三方都确定性地重现。
在 [`GET /v1/algorithms`](https://emem.dev/v1/algorithms) 或按键在 [`GET /v1/algorithms/<key>`](https://emem.dev/v1/algorithms/clay_prithvi_tessera_triple_consensus@1) 处浏览。
## 发现
设计用于代理读取,而不是人类记忆:
```
GET /openapi.json OpenAPI 3.1 的每个 REST 路由
GET /v1/agent_card 实时能力快照 + 清单 CID
GET /v1/tools 81 个 MCP 工具(10 个核心工具,71 个扩展工具)带有 when_to_use + 注释
GET /v1/algorithms?summary=true 160 个算法键 + 类别
GET /v1/topics 27 个主题分组的波段 + 算法(路由器大脑)
GET /v1/manifests bands_cid, algorithms_cid, sources_cid, schema_cid
GET /v1/schemas/eudr_dds.json 附件 II JSON 架构与 EUR-Lex 段落引用
GET /.well-known/{emem,agent,mcp,ai-plugin}.json
POST /v1/state 任意单元格的签名密集状态向量(view=encoder | view=cube)
POST /v1/state_multi 跨 geotessera + clay_v1 + prithvi_eo2 + galileo 扩展
POST /v1/state_diff 单元格的版本差异:残差向量 + L2 + 余弦
POST /v1/memory_token 组成 memt:<cell64>:<fact_cid> 引用句柄
POST /v1/memory_token/resolve 单次往返解析回签名事实正文
GET /v1/stream 服务器发送事件语料库心跳,每 5-300 秒签名
GET /v1/corpus_state_stats 签名语料库活跃度快照(/v1/stream 的一次性等价物)
GET /v1/benchmark 人工验证的评估项目;配对 POST /v1/benchmark/grade
POST /v1/hunt 结构化事件发现扫描(12 个事件 × 区域)
POST /v1/eudr_dds EUDR 合规声明(法规 EU 2023/1115)
POST /mcp JSON-RPC 2.0(Streamable HTTP)
GET /llms.txt /llms-full.txt 纯文本目录用于 LLM 吸入
GET /humans /humans.json 交互式试用表面 + 机器双胞胎
GET /verify /verify/<fact_cid> 浏览器内 ed25519 收据验证器
GET /docs/gallery 实时覆盖地图 + 猎人案例研究 + 32 个图表
GET /docs/diagrams/ 32 个 SVG 协议 + 行业部署
```
`.well-known/emem.json` 中的 `operator_attestation` 块将运行二进制文件的 BLAKE3 哈希与其 `git_commit` + `build_timestamp` 绑定,并在响应者的 ed25519 密钥下签名三元组,因此验证者可以确认实时二进制文件与发布的源代码树匹配而无需信任操作员。
每个收据都固定四个内容寻址注册表 CID(`bands_cid`、`algorithms_cid`、`sources_cid`、`schema_cid`)。一个对等方在匹配 CID 下重新计算一个事实,会产生相同的字节。对等方漂移的注册表会在 `/health` 上返回不同的 `bands_cid`,并且在数据流动之前差异是可见的。
## 运行本地
```bash
cargo run --release --bin emem-server
# 或通过容器。
docker run -p 5051:5051 ghcr.io/vortx-ai/emem:latest
```
无需任何环境变量。`EMEM_BIND` 覆盖侦听器(默认 `0.0.0.0:5051`)。`EMEM_DATA` 覆盖数据目录(默认 `./var/emem`; 传递 `:memory:` 以获取临时数据)。有关 TLS、systemd、ACME on `:443` 和 HuggingFace Space 包装器,请参阅 [docs/operators/operating.md](docs/operators/operating.md)。
## 地址代数
| 字段 | 位数 | 线上形式 | 示例 |
|---------|--------------|----------------------------------|----------------------------|
| `cell` | 64 | 四个基数为 1024 的双字母,点分隔 | `defi.zb493.xuqA.zcb5f` |
| `tslot` | 64 | base32-nopad-leb128,`t.` 前缀 | `t.aaaaagy` |
| `cid` | 32 B BLAKE3 | base32-nopad-lowercase,26 个字符 | `qi3jo4sqcg…l2hgjtwm` |
| `vec` | 1792-D fp16 | 收据中 12 字节的前缀 | 完整向量通过 `recall` |
## 仓库布局
16 个数据连接器支持 **46 个声明的源方案** 和 **124 个实时物化器注册**。46 个方案中有 5 个已声明但未连接(`openet.30m.daily`、`dynamic_world.v1`、`tropomi.s5p.ch4`、`tropomi.s5p.no2`、`viirs.dnb.monthly`);它们返回类型化的缺失,而不是数据。大多数连接的方案通过 `cog.rs` 路由,这是通用 STAC + COG 采样器,加上 `chirps`(降雨)、`dmsp_ols`(夜间灯光)、`esa_cci_biomass`(地上生物量,CEDA)、`firms`(活动火灾)、`ftw`(The World 字段)、`geonames`(地名索引)、`gmrt`(地形测深,PointServer + GridServer)、`hansen_gfc`(森林变化)、`jrc_gfc2020`(EUDR 森林基线,JEODPP 单个 COG)、`jrc_tmf`(热带湿润森林,拉取和缓存)、`koppen`(气候分类)、`overture`(位置/建筑/分区)、`radd_alerts`(Sentinel-1 干扰)、`terraclimate`(气候)、`wdpa`(保护区)、`worldpop`(人口)、`wri_gdm_drivers`(Sims 等人 2025 年驱动因素归因)。
The 16 个数据连接器支持 **46 个已声明的源方案** 和 **124 个实时物化器注册**。五个已声明但未连接的方案是(`openet.30m.daily`、`dynamic_world.v1`、`tropomi.s5p.ch4`、`tropomi.s5p.no2`、`viirs.dnb.monthly`);它们返回类型化的缺失,而不是数据。大多数已连接的方案通过 `cog.rs` 路由,这是通用 STAC + COG 采样器,加上 `chirps`(降雨)、`dmsp_ols`(夜间灯光)、`esa_cci_biomass`(地上生物量,CEDA)、`firms`(活动火灾)、`ftw`(The World 字段)、`geonames`(地名索引)、`gmrt`(地形测深,PointServer + GridServer)、`hansen_gfc`(森林变化)、`jrc_gfc2020`(EUDR 森林基线,JEODPP 单个 COG)、`jrc_tmf`(热带湿润森林,拉取和缓存)、`koppen`(气候分类)、`overture`(位置/建筑/分区)、`radd_alerts`(Sentinel-1 干扰)、`terraclimate`(气候)、`wdpa`(保护区)、`worldpop`(人口)、`wri_gdm_drivers`(Sims 等人 2025 年驱动因素归因)。
## 推理
GPU 侧车(Python FastAPI 通过 Unix 域套接字)协居四个编码器,在 20 GB VRAM 预算内:
- **Clay v1.5:** 1024-D CLS,S2 L2A 10 波段,约 12 毫秒预热。教师(DINOv2 `vit_large_patch14_reg4_dinov2.lvd142m`)在启动时预先加载,因此 `HF_HUB_OFFLINE=1` 成立。
- **Prithvi-EO-2.0-300M-TL:** 1024-D CLS,HLS V2 6 波段,约 13 毫秒预热。
- **Galileo**(生产中的变体 `base`;`tiny` / `nano` 可通过 `EMEM_GALILEO_VARIANT` 选择):仅 S2 模态连接(S1 / ERA5 / SRTM / VIIRS / Dynamic-World / WorldCover / LandScan / location zero-masked;支架是多模态的,但今天只有 S2 连接)。广告能力为 `/v1/capabilities.extensions[]` 中的 `galileo-<variant>`。
- **JEPA v2 动态:** 未训练的基线。仅元数据 `is_trained()` 检查短路到上一个版本的身份;收据携带 `untrained_baseline` 和 `via: "short_circuit_untrained"`。训练在多版本 Tessera 可用性上受到上游瓶颈限制。
侧车崩溃不会级联。REST 路由器降级为标量波段,并将 GPU 锚定算法标记为 Absence,附带 `gpu_unavailable`。参见 [docs/developers/inference.md](docs/developers/inference.md)。
## 发展方向
emem 被构建为一种协议,而不是单一服务。因为每个事实都是内容寻址和签名的,所以任何响应者都可以提供它,任何客户端都可以离线验证,而无需信任源。今天,它作为一个托管的响应者加上自托管节点运行。设计目标是一个独立响应者的联合,它们解决相同的 content ids 字节对字节,相互引用对方的证明,并记录它们之间的分歧,以便共享内存随着更多代理读取和写入而变得更加可信。0.1.0 中不包含多主机联合路由。今天发布的是使之成为可能的基质:内容寻址、签名收据、类型化时间边、多个证明者矛盾评分和确定性精炼循环。
<p align="center">
<img src="docs/diagrams/federation.png" alt="联合:独立响应者围绕一个共享的内容 ID 环绕,每个响应者都在其自己的密钥下签名,所有响应者都解决相同的 ID 字节对字节,相互引用对方,有一对响应者存在分歧,而客户端离线验证" width="900"/>
<br/>
<em>最终状态:许多响应者,一个地址空间。一个内容 ID 在任何地方都意味着相同的字节,每个响应者都在其自己的密钥下签名,客户端信任签名而不是服务器。当两个响应者存在分歧时,网络会记录它。</em>
</p>
## 诚实的限制
- **没有商业亚米级影像。** Sentinel-2(10 米),Landsat(30 米),HLS。对于 Planet Pelican(50 厘米)或 Maxar,请自带连接器。
- **没有边缘/机载推理。** 侧车运行在单个主机上。
- **单主机部署。** 没有联合,没有全局路由,没有 SOC 2。
- **JEPA v2 今天未训练。** 端点存在并诚实签名;预测等于上一个证明的版本,直到动态头部训练完成。
- **16 个数据连接器,124 个实时物化器注册。** 目录按计数不是推销点;每个连接的波段都是自动可获取的、签名的和内容寻址的。没有连接的物化器的波段列在 `declared_but_no_materializer_at_this_responder` 下。
- **基础编码器物化器不均匀。** `geotessera`(Tessera 128-D)具有连接的物化器,并在缺失时自动获取。`clay_v1` 和 `prithvi_eo2` 在此响应者上仅为种子:GPU 侧车运行两个模型,但扇出到上游图块存档的自动物化路径今天未连接。回忆任一模型将返回已经签名的内容;猎人模式信封在 `materializer_status[]` 下公开此信息。
- **Tessera 受上游速率限制。** `dl2.geotessera.org` 今天可靠地提供 2024 版本;跨所有八个版本(2017–2024)的历史回填是部分的。猎人模式下的 Tessera 一致性重排序在上游无法访问时,降级为主要标量顺序,并在 `embedding_rerank.reason` 下显示原因。
- **MODIS LST 受速率限制。** `modis.lst_day_8day` 通过 NASA/ORNL REST API 物化,速率约为每单元格 30 秒。猎人模式限制 LST 家族的每个区域扇出为 8 个单元格(环境变量 `EMEM_HUNTER_SLOW_BAND_CAP`),因此城市热查询在网关超时内返回。
- **没有交互式笔记本 UI。** 对于探索,有 `/humans`(尝试绘制、清单网格、本体 SVG);对于分析,从笔记本驱动 REST 或 MCP 端点。
## 资源
| | |
|--|--|
| 代理循环 | [https://emem.dev/agents.md](https://emem.dev/agents.md) |
| 连线规格 | [https://emem.dev/spec.md](https://emem.dev/spec.md) |
| llms.txt | [https://emem.dev/llms.txt](https://emem.dev/llms.txt) |
| OpenAPI 3.1 | [https://emem.dev/openapi.json](https://emem.dev/openapi.json) |
| MCP | `https://emem.dev/mcp` |
| 验证 | [https://emem.dev/verify](https://emem.dev/verify) |
| 容器 | `ghcr.io/vortx-ai/emem:latest` (多架构,可匿名拉取) |
| HF Space | [huggingface.co/spaces/vortx-ai/emem](https://huggingface.co/spaces/vortx-ai/emem) |
| MCP 目录 | [docs/mcp-directory.md](docs/mcp-directory.md) |
| 问题/拉取请求| [github.com/Vortx-AI/emem/issues](https://github.com/Vortx-AI/emem/issues) |
| 安全 | [SECURITY.md](SECURITY.md),`avijeet@vortx.ai` |
## 许可证
Apache-2.0。参见 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。
默认构建数据源是开放的:Copernicus DEM,JRC GSW(CC-BY 4.0),Hansen GFC,ESA WorldCover(CC-BY 4.0),Overture Maps(地点、建筑物、交通,`divisions/division_area`; ODbL / CDLA-Permissive),Fields of The World(CC-BY 4.0),GeoNames 城市-5000(CC-BY 4.0),OSM(ODbL),met.no,Open-Meteo,Tessera。无 API 密钥,无操作员凭证,无 SaaS 锁定。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器