西马赫
遵循一组Fangorn重置为本地可搜索索引,让代理通过MCP搜索.
如何运作:
- 索引员保持 缝 超过每个
publisher/repo跟着你 缝合是一个单块,记录每个重置者的头部. - 每次随行的头部移动,索引器:
- 重建更新日志中的缝合, 只读自上次缝合以来的条目;
- diff 每一个头动了的回波,并用本地模型嵌入新的和已更改的记录;
- 将记录和新缝合到一个交易中的 SQLite 文件 .
- 特工搜索文件 从Fangorn那里获取记录.
所有东西都在你的机器上运行:没有服务器可以运行,也没有API密钥可以提供. 你需要22.13+节点. npm i @fangorn-network/westmarch,或者从这次检查中运行它.
运行它
npm install
cp app.example.json app.json # then put your publishers and repos in it
npm start # follow app.json into index.db, live (Ctrl-C to stop)
node src/run.js app.json --once # or: catch up once, then exit
app.json数字 :
{ "publishers": ["0x…"], "repos": ["shop"], "network": "baseSepolia", "db": "index.db" }
- 每个出版商都与每个回波名称相配.
network实值baseSepolia(默认)或arbitrumSepolia。 。 。 .- 可选字段 :
fromBlock, (中文(简体) ),rpcUrl, (中文(简体) ),gateway, (中文(简体) ),deployment, (中文(简体) ),view(每个记录和缝合的本地JSON文件,在每个新根上重写)和publishView(索引器的回放,以发布该视图:存储,加 aview记录指向它)。 别管了publishers追踪每个出版商的名次. - 环境变量
RPC_URL财务报告和审定财务报表IPFS_GATEWAY覆盖配置 . INDEXER_KEY签名缝合屏蔽索引器上传。 如果不设置一个,每个运行都会生成一个新密钥. 没关系,因为索引员的状态index.db而不是用钥匙.
第一次运行下载了EmbeddingGemma-300m(约300 MB)并索引了一切. 稍后运行恢复自 index.db 而只嵌入改变的东西。 如果你改变了 publishers 或者说 repos,指数重建自己。 如果您切换到不同的模型, 它会拒绝运行; 启动新的 db 文档代替.
沙盒:全部放在你的机器上
npm run sandbox 启动一个 Fangorn , 不写到一个真正的链条或 IPFS :
- 一份新鲜的广告,合同从
../contracts(单位:千美元)FANGORN_CONTRACTS_DIR在其他地方指出这一点); - 上传工人和IPFS网关的本地站点,区块储存在
.sandbox/ipfs· ; - 给艾利斯、bob、carol和索引器的钥匙.
这需要 anvil 财务报告和审定财务报表 forge在另一个终端:
mkdir -p /tmp/shop && cd /tmp/shop
echo '[{"id":"t1","name":"oak table"}]' > items.json
~/fangorn/indexer/.sandbox/fangorn repo init shop # the real fangorn CLI, on the sandbox, as alice
~/fangorn/indexer/.sandbox/fangorn add items.json && ~/fangorn/indexer/.sandbox/fangorn commit && ~/fangorn/indexer/.sandbox/fangorn push
AS=bob ~/fangorn/indexer/.sandbox/fangorn … # as bob
cd ~/fangorn/indexer
node src/run.js .sandbox/app.json # index alice's and bob's "shop"
claude mcp add fangorn-sandbox -- node "$PWD/src/mcp.js" "$PWD/.sandbox/app.json" --watch
.sandbox/fangorn使用它自己运行 CLIHOME,所以它从来没有读~/.fangorn(你的真钥匙和存储)..sandbox/app.json是一个开始配置。 任何应用Json与"network": "sandbox"在沙盒上运行; 设置"sandbox"如果不是沙盒的目录.sandbox。 。 。 .- 每个开始都是有新密钥的新链,所以删除
index.db当你重新开始时.
node examples/memory.js 在运行的沙盒上运行一个实验:互不相识的特工共享内存,并在其中形成应用. 没有ETH的特工通过中继器写入. 两个应用跟随不同的出版商,一个陌生人重放并验证其中之一,一个引用会变得呆滞. 它会打印出tx,气体,字节并嵌入到每一步后.
node examples/game.js 玩没有游戏服务器的游戏。 每个玩家会写到自己的repo,而棋盘是链条日志上的纯还原器(src/个数.js),裁判员公布检查点(一针加一州散列),旁观者核查时不信任裁判员. node examples/scale.js 8,32,128 衡量作为出版商而成长的东西.
云浮上: 劳动者/
与“工人”相同的索引器 CONFIG var:它所遵循的,在哪个网络上,以及它发表它的观点的地方. 一个代码库,许多部署在不同级别:fangorn. 网络跟随各出版商的再投放,使其可以被发现,而一个应用程序跟随自己的再投放,以索引其内部的记录.
- 克龙,每分钟. 一个日志读取,通过链条上repo名过滤,询问是否有后续repo移动. 如果有的话,工人会从缝合缝缝缝缝出(src/stitcher.js (英语)改为D1(src/d1.js (韩语)) (中文(简体) ). 记录无向量土地,以及工人AI(EmbeddingGemma-300m,当地指数使用的模型)嵌入了高达每跑100个.
- 出版取景. 与
CONFIG.publishView,每个新根的视图也会去到 Fangorn: 存储,加一个view记录在雷波。 任何地点的静态页面都会被锁上 任何人都可以检查它的缝合verifyStitch。 。 。 . GET /view.json这是风景.GET /search?q=按含义排列记录,将查询嵌入同一种模式,所以一个页面不需要浏览器模式. 其他一切都会去ASSETS当一个被绑定时(一个应用的静态站点).POST /mcpmCP 超过可流的 HTTP, 无国籍 :claude mcp add --transport http <name> https://<worker>/mcp它的工具是:search, (中文(简体) ),repos财务报告和审定财务报表get。 。 。 .INDEXER_KEY(一个秘密)在工人上传的缝线和视图上签字,并支付他们的毒气费.
按原样部署,没有密码: 复制 工人/wrangler.example.json 互联网档案馆的存檔,存档日期2013-12-02 进入一个依赖于westmarch的项目,然后:
wrangler d1 create my-indexer # put its id in wrangler.json
node node_modules/@fangorn-network/westmarch/worker/seed.js index.db > seed.sql && wrangler d1 execute my-indexer --remote --file seed.sql
wrangler deploy
node -e 'import("viem/accounts").then(m => process.stdout.write(m.generatePrivateKey()))' | wrangler secret put INDEXER_KEY # then fund its address
种子是当地指数的缝合和记录,没有向量. 它保存了“工人”对整个更新日志的首次更新,该日志需要的请求多于允许的运行.
应用程序增加了自己的MCP工具,或用自己的工人来取名替换一个基础工具:
import { indexer } from "@fangorn-network/westmarch/worker";
import { BASE } from "@fangorn-network/westmarch/worker/mcp";
import { publishAs, grantOf, signerFor } from "@fangorn-network/westmarch/worker/publisher";
export default indexer({
name: "my-app",
instructions: (gateway) => `How an agent should use my app. Files load from ${gateway}/ipfs/<src>.`,
tools: [{ name: "publish", description: "…", inputSchema: { … }, async run(args, ctx) { /* ctx: index, fangorn, gateway, auth, origin, env */ } }],
});
worker/publisher.js 在他们签名时,通过他们在fangorn公司给予的赠款,将记录公布在一个人自己的回购中。 腾讯网. 应用中继承诺, 没有他们的钥匙.
把它给经纪人
src/mcp.js 是一个在stdio上说话的MCP服务器. 它有三个工具:
| 工具 | |
|---|---|
search | 按含义查找记录( N)semantic),用词:lexical, BM25),或两者兼有(hybrid,默认,由对等等级合并. 它可以通过过滤 publisher, (中文(简体) ), repo 财务报告和审定财务报表 type。每个击中 publisher, repo, id, cid, type, payload, score。 。 。 . |
repos | 列出索引中的内容:每个出版商,repo名和记录计数. |
get | 从 Fangorn (chain and IPFS) 获取一个记录当前版本的活性. |
要在一个过程中运行索引器和服务器, 这是最简单的设置 :
claude mcp add westmarch -- node "$PWD/src/mcp.js" "$PWD/app.json" --watch
无 --watch,服务器只读取 index.db和单独的 npm start 不断更新 SQLite的WAL模式让两个进程同时使用文件.
版式
| 文件 | |
|---|---|
| src/stitcher.js (英语) | stitcher数字 : update 编号 : trigger 注射剂 store 财务报告和审定财务报表 lens· ; watchHeads: 订阅更新日志 |
| 锡克/锡克利特.js | sqliteIndex商店 镜头 还有 search,所有文件 |
| 市场/商店 | 其他存储 : fangornStore (在Fangorn上缝针)和 memoryStore |
| src/embed.js (英语) | localEmbedder (EmbeddingGemma,在进程中)和 textOf |
| src/run.js (韩语) 编号 : 缩写/mcp.js | 运行器和 MCP 服务器,每个都可以用作模块或CLI |
| src/客户端.js | 从配置创建 SDK 客户端 |
| src/个数.js | fold: 共享应用程序状态, 相对于 repos 的更新日志, 一个纯的减少器 |
| src/d1.js (韩语) 编号 : 劳动者/ | cloudflare D1上的索引(商店、镜头、视图、按意义搜索),以及用工人AI、其MCP工具运行该索引的工人,以及个人出版 |
| src/gemma.js (英语) | 嵌入Gemma:模型、提示、matryoshka分流和向量包装 |
| src/ sandbox.js (中文(简体) ) | 当地沙盒:anvil、合同和 storageServer (上传工人和网关,当地) |
镜片什么的 apply(changes)时 changes 实值 [{ publisher, repo, from, to }]一个嵌入器是 { id, embed(texts), query(text) }。 。 。 .
测试
npm test # in memory: an in-memory chain, a fake embedder, :memory: SQLite
EMBED_LOCAL=1 npm test # also runs the real model
src/e2e.test.js (中文(简体) ) 覆盖整个路径:发布,然后跑者跟着它,然后代理搜索并获取MCP.