jev-trader 的 AI 大脑:TypeSafe Jev 模型如何在 100ms 内给出买卖决策
【免费下载链接】jev-traderOne AI trade decision every Monad block. Jev on Kuru MON-USDC.项目地址: https://gitcode.com/gh_mirrors/je/jev-trader
jev-trader是一个运行在 Monad 链上的 AI 交易机器人:TypeSafe 的Jev 模型(一种约 100ms 内返回类型化决策的 System One 推理模型)实时盯住 Kuru 交易所的 MON-USDC 订单簿,每 300ms 一个区块给出一次buy 或 sell决策,并立刻把真实订单挂上链上订单簿。本文将拆解这套「AI 大脑」的输入、输出,以及它是如何把一次决策压进 100ms 预算、恰好塞进一个区块的。
⏱️ 300ms 的生死节奏:为什么 AI 必须这么快
Monad 的出块间隔约300 毫秒,而 jev-trader 的规则简单粗暴:每个区块必须做一个决策、必须下一笔真实订单,不做观望。
这意味着「读盘 → AI 推理 → 广播交易」整条链路必须在一个区块内跑完。项目为此设计了一个极简热路径,实测数据(mock 模型,dry run 环境):
| 环节 | 耗时(p50) | 说明 |
|---|---|---|
| 读取订单簿 | ~18 ms | 一次eth_call,手写解码 |
| AI 推理 | ~80 ms | Jev 一次 evaluate 调用 |
| 广播订单 | 几 ms | eth_sendRawTransaction返回即止 |
| 整循环合计 | ~100 ms | 占一个 300ms 区块的 1/3 |
如果 AI 慢了怎么办?逻辑很诚实:上一轮决策还没跑完时新到的区块直接被标记为late(迟到),本块挂起(hold)不交易,而不是硬挤进去。
🧠 Jev 模型:不问「写段分析」,只问「买还是卖」
与传统大模型交易机器人「生成一段分析文字再解析」的做法不同,jev-trader 里的 Jev 是System One 模型——无文本输出,直接返回带概率的类型化决策。源码在 src/model.ts:
- 调用入口是 AI SDK 的
experimental_evaluate:给它状态(state)+ 问题(questions),拿回一个buy或sell的选择,外加{ buy: 0.77, sell: 0.23, hold: 0 }这样的概率分布; - 输出结构是
Decision类型(action、probabilities、upIn10上涨概率、latencyMs耗时),全程强类型,没有 JSON 解析失败的可能; - 切换模型只需改环境变量
MODEL=jev(默认mock是一个动量启发式占位实现,用同样的 80ms 推理时延模拟生产节奏,方便本地零成本体验完整流水线)。
它只被问一个问题(见 QUESTIONS):
再过
horizonBlocks(默认 100 块,约 30 秒)之后,MON 的中价会更高还是更低?而且涨幅必须盖过点差(spread)才值得交易。
问题里的goal、inputs指令还告诉模型哪些字段是最强信号——taker 主动买卖流量(cvdMon)、最近成交方向、某一侧深度偏薄时价格更容易朝那个方向走等等。模型不是在做「预测股价」,而是在做一笔盖过交易成本的方向性判断。
📊 模型的「眼睛」:一份 40 行左右的紧凑市场快照
每次决策前,Trader.buildState 会把链上信息压缩成一份紧凑、相对化、人类可读的TradeState快照,大致包括:
- 📍 当前 mid 价、点差(bps)、区块号与观察窗口长度;
- 📚 订单簿 Top 5 档(每侧,「价格 x 数量」格式)+ 10/25/50 bps 三个距离档的累计深度,以及买卖盘不平衡度(-1 到 1);
- 📈 最近 1/5/20/100 个区块的收益率(bps)+ 每 5 块采样一次的中价序列;
- 💹 观察窗口内的 taker 成交流水:买量、卖量、净主动流量
cvdMon、VWAP、最近 10 笔成交明细; - 🚦
allowed标志:当前仓位上限/保证金允许买还是允许卖。
这份快照刻意去掉了冗余:没有原始字节、没有全量订单簿,只保留对「30 秒后涨还是跌」真正有信息量的字段。输入越短,推理越快、越便宜——这正是它能塞进 100ms 的另一半原因。
🚀 100ms 预算是怎么抠出来的
想理解这个项目的工程美学,可以看 The 300 ms budget 一节的原始描述。热路径上只发生两次 RPC 往返,一次读盘、一次发交易,其余全部砍掉或挪到后台:
- 读盘只发一个
eth_call:官方 Kuru SDK 读订单簿要串行两次调用,而手写解码器 src/book.ts 一次搞定。MON-USDC 上 AMM 金库档位为空,第二次调用纯属浪费延迟;万一金库上线,还能把两个调用合并进同一个 HTTP 批量请求。scripts/bench-read.ts 专门用于对比自研读盘与 SDK 的精确性和延迟。 - 不做
eth_estimateGas:Monad 按 gas limit 计费,limit 在启动时估算一次后直接硬编码; - 不做 gas 价格查询:固定 type-2 费用(2 gwei priority + 高上限 cap),省掉一次 RPC;
- 发交易是 fire-and-forget:
eth_sendRawTransaction被接受就返回,回执、费用刷新、保证金检查全部放到后续区块的后台轮询里。
决策落地时的执行细节(src/trader.ts):每个区块把模型选的那一侧挂上一笔post-only 限价单,价格贴在最优盘口内 1 个 tick,同一次batchUpdate顺带撤销上一笔残留订单。机器人赚的是价差而不是付出价差——成交发生在别人的 taker 订单打到它头上时。
🛠️ 三步跑起来:本地体验 AI 每 300ms 交易一次
仓库是只读的,直接拉取代码运行:
git clone https://gitcode.com/gh_mirrors/je/jev-trader cd jev-trader cp .env.example .env bun install bun run start- 不加
PRIVATE_KEY:自动 dry-run——真实订单簿、真实 AI 决策、模拟成交,零成本、零风险; - 启用真 Jev:在
.env里设置MODEL=jev和TYPESAFE_AI_API_KEY,模型 ID 默认jev-latest(见 src/config.ts); - 启动后
http://localhost:3000是一个实时仪表盘:每 300ms 刷新的价格图、决策概率条、逐块决策延迟(ms)、AI 花费 vs Gas 花费的对比计数器、逐笔成交流水——所有区块、交易哈希都可到浏览器验证。
一个有趣的成本细节:Jev 每小时推理花费约$0.20,同时段 gas 约$2–5——「AI 比 gas 还便宜」正是这个项目最核心的演示信息。
📁 项目结构速览
| 模块 | 职责 |
|---|---|
| src/model.ts | Model 接口、JevModel(AI 大脑)、MockModel 占位实现 |
| src/trader.ts | 区块主循环:一次在途、迟到挂起、仓位与盈亏核算 |
| src/book.ts | 单次eth_call订单簿读取与解码 |
| src/chain.ts | 区块事件源:WebSocket newHeads + HTTP 轮询兜底 |
| src/market.ts | 下单:手写编码的batchUpdate(撤单 + post-only 挂单) |
| src/server.ts | 快照 / 历史 / SSE 实时流 |
| web/ | 单页实时仪表盘(Next.js 组件) |
| SPEC.md | 完整产品规格:设计原则、布局、状态机 |
💡 给新手的三个关键启发
- 给 AI 做交易决策,先收窄问题:不问「分析一下」,只问二选一的类型化问题(
experimental_evaluate),输出直接可用、天然带概率,还省掉了文本解析这一整层不确定性。 - 实时 AI 系统的瓶颈往往不在模型,而在链路:把 estimateGas、回执确认、费用刷新全部挪出热路径,一个 300ms 的窗口就能塞下 100ms 的推理。
- 一切可验证是演示的底线:真实钱包、真实区块、逐笔哈希,亏损也照常显示——这也是 jev-trader 明确声明的「诚实」原则:这是实验性演示,模型并不以盈利为目标。
想深入模型调用细节,读 src/model.ts;想理解「迟到就挂起」和成交记账,读 src/trader.ts。整套「AI 每个区块下真单」的体验,从一次bun run start开始。
【免费下载链接】jev-traderOne AI trade decision every Monad block. Jev on Kuru MON-USDC.项目地址: https://gitcode.com/gh_mirrors/je/jev-trader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考