全屏 AI 编程界面看腻之后:Vercel 开源的 fx 只有 6.3 MB,慢过 2 毫秒就挂 CI
看腻了全屏聊天框:直到我看见一条 6.3MB 的命令
这两年我试过的 AI 编程工具几乎长一个样:全屏界面、左侧文件树、右侧聊天框,一打开就接管整块屏幕。用多了我对这类界面已经免疫,再多功能都提不起兴趣。
直到我看到 Vercel Labs 开源的 fx。Zig 写的 coding agent,官方定位只有一句:Unix like coding agent。官方口径是:原生二进制 6.3 MiB,内存占用以个位数 MB 计,冷启动 10 微秒。它不接管屏幕,对话直接打进终端的 scrollback,滚动、搜索、复制照旧,tmux 的复制模式也能用。
项目 2026 年 8 月建库,Apache-2.0 协议,目前 3500 多颗星,最新版 v0.0.14。另一个用它的示例产品 fx0 更直白:一句话描述,生成一个单独的 HTML 文件。但 fx 本身想回答的问题要大得多:coding agent 到底该是一个占屏幕的软件,还是一条能塞进管道的命令?

它不是一个界面,是一条命令
fx 不是 IDE 插件也不是网页,装完就是终端里的一个命令,地位和 grep、jq 平级。为什么输出方式值得单独讲:全屏界面的输出留在它自己的窗口里,出了那个窗口就带不走;打进 scrollback 的输出天然可搜、可复制,还能被下一个命令接走。之前写过 CLI-Anything,思路是把命令行包成 agent 能调用的接口;fx 正好反过来,把 agent 本身做成一条 CLI,两个方向对着看很有意思。
CI 是这种设计真正的主场。fx 的 README 里写了条 CI 规则:Linux 上任何被基准测试覆盖的命令(例如 fx help、fx status --json)只要超过 2 毫秒,PR 直接失败。这条规则的意义在于:工具一旦要进流水线,每一毫秒都会被成千上万次调用放大,慢的 agent 根本没资格进管道。把性能纪律写进 CI 流程,说明它从一开始就是照着「被别人调用」来设计的。

装完第一件事:让脚本能读它
安装一行:
curl -fsSL https://fx.sh/setup.sh | bash
装到 ~/.local/bin,fx upgrade 升级(想追开发版加 --channel dev)。登录四选一:fx login 走 Vercel AI Gateway,fx login codex 或 fx login grok 用订阅,fx setup 存 AI Gateway API Key。装完有疑问就跑 fx doctor 查配置和凭证,fx status --json 看当前 provider 和模型。
真正的重点是非交互的 fx ask:一条请求一个进程,stdout 只出原始 Markdown,进度和诊断走 stderr,失败退出码非 0。脚本第一次可以把 AI 当普通命令用:
fx ask "explain what this repository does" fx ask --json "summarize the current changes" printf "summarize src/core\n" | fx ask fx ask --image ./ui.png "describe this interface"
第三条最值得注意:stdin 也能进,把目录名用管道喂进来它就接着干,Unix 的老手艺直接适用。--json 返回一个对象,字段有 output、final_output、exit_code、model、steps、usage(含 input_tokens 和 output_tokens)、tool_calls(每项含 name 和 status)。tool_calls 里能看到它调了哪些工具、每一步的状态,排查 CI 里的意外行为就靠这个。拿它做件具体的事:CI 里测试挂了,一条命令把失败原因总结出来,写进 PR 评论:
fx ask --json "summarize the failing tests" | jq -r .final_output
模型用 --model 单次指定,--effort high 或 --fast 调节奏;--full-access 会关掉权限检查,只在明确需要时用。一个进程一条命令,脚本要的就是这种确定性接口。判断很简单:如果你只想在终端里用,装 CLI 就够了;如果要嵌进自己的产品,直接看后面的 libfx。
默认那个 auto,其实是把每个动作先交给另一个模型审
权限三档:ask 每次问,auto 是默认,full-access 关掉检查。auto 直接放行读文件、搜代码或网页、创建和编辑普通项目文件、跑被识别的项目命令(git status、装依赖、测试、构建、开发服务器);而没见过的或动态生成的 shell 命令、覆盖工作区外的文件、改敏感配置、调用 MCP 工具,都要先过审。
审查方式很硬核:把这个具体动作发给一个模型,专门查提示词注入和恶意行为,没发现问题就执行,有问题或审不完就扣住动作并把原因告诉 agent。审查模型跟着登录方式走:AI Gateway 默认 openai/gpt-5.6-luna,Codex 用 gpt-5.6-luna,Grok 用 grok-4.5,自定义连接用自己的 reviewer_model。
想换的话,在 ~/.fx/settings.json 里加 review_model,或用环境变量 FX_REVIEW_MODEL 单进程覆盖。这个字段也接受 typesafeai/jev,配了 TYPESAFE_API_KEY 就直连 TypeSafe,否则走 Gateway(Jev 是我之前写过的决策模型,只输出概率做判断,拿来做动作审查思路很搭)。注意每次审查都会烧 token,等于每个任务都在花两份模型钱:一份干活的,一份盯着的。当前规则用 fx permissions --json 查看。

让它记住你的项目,而不是每次重新教
fx 读三层 AGENTS.md:项目根目录、目录级的嵌套 AGENTS.md、以及全局的 ~/.fx/AGENTS.md。Skills 从 .fx/skills 和 ~/.fx/skills 加载,最好玩的是它也读 .claude/skills 和 .agents/skills,你在其他 agent 里攒的技能不用迁移。加载策略和之前写过的 Pi 1.0 一个思路:模型平时只看到技能名和描述,需要时才读全文,把工具藏起来省上下文。技能平时不占上下文,这也是你敢在长会话里养一大堆技能的前提。
安装也简单:/skills install vercel-labs/skills --skill find-skills 从市场装,/skills install ./review-tests 从本地装,/skills create review-tests 生成模板,写到 ~/.fx/skills/<name>/SKILL.md 或项目的 .fx/skills 下。外部服务走 MCP:/mcp add slack,查看用 fx mcp。会话存在 ~/.fx/sessions/,fx -c 续上次的;上下文用到可用窗口 80% 自动压缩,压缩本身是一次不带工具的模型请求,会额外计费,/compact 可以手动立刻压。
同一个引擎,塞进 Next.js 和浏览器
CLI 是给人用的,libfx 是给程序用的:npm install libfx。需要 AI_GATEWAY_API_KEY 和 Node.js 20 以上,也能跑在 ChatGPT、Grok 订阅上,或任何 OpenAI Chat Completions 兼容服务(Ollama、vLLM、OpenRouter)。官方示例:
import { createFxAgent } from "libfx";
const agent = createFxAgent({
model: "anthropic/claude-haiku-5.5",
instructions: "Answer in one paragraph.",
});
const turn = agent.session().prompt("What is an agent loop?");
for await (const event of turn) {
if (event.type === "text_delta") process.stdout.write(event.delta);
}
await agent.close();三层概念:agent 是配置,session 是一次对话,turn 是一次请求;同一个 agent 配置下,任何进程都能跑、续、流任意 session。一个 session 同时只跑一个 turn,session.steer(input) 能在模型吐字时打断接管。
两条硬限制:输入超过 8 MiB JSON 会被拒(FX_INPUT_TOO_LARGE),一个 prompt 最多 8 张图。更值得说的是断点续跑:prompt 在接受前就落盘、执行中逐步存,进程死在半路,下一个接到这个 session 的进程从最后一步接着跑,并告诉模型这轮被打断过。Vercel 上落 Vercel Workflow World,Node 上落文件(FX_SESSIONS_DIR 可配),浏览器在内存里。examples/ 里有 node-chat、browser-agent(WASM 加纯 HTML 表单)、nextjs-agent、nuxt-agent,WASM 构建目前是实验性的。
四个坑,文档里都不写
坑一:Windows 用不了
现象是装不上:fx 只有 macOS 和 Linux 版,64 位 Intel 与 ARM,没有 Windows 原生支持。根因是官方就没做这个平台的构建。解法:想试只能上 WSL,或者找一台 Linux 机器、开个容器。
坑二:名字撞车
现象是装完版本不对:终端里早有一个叫 fx 的 JSON 查看器,用了好多年,Homebrew 里 fx 这个名字也是它的。根因是命名冲突,项目 issue 里已有人提,官方说打包与两个命令共存还在处理中。解法:安装时注意别把老的那个覆盖掉,装完先用 fx --version 确认装的是哪个。
坑三:默认不是完全中立
现象是默认模型不可选:默认路径走 Vercel AI Gateway,Hacker News 上第一批试的人就质疑过 model-agnostic 这个说法。根因是项目起步时和 Gateway 绑得深,后来 v0.0.11 加了具名连接,README 现在列出 Gateway、ChatGPT、Grok 订阅、Ollama、OpenRouter。解法:介意的话在 /provider 里换,或配自定义连接。
坑四:pre-1.0,接口会变
现象是升级后行为变了:版本号还在 0.0.x,314 个 open issue,libfx 的 checkpoint 有版本绑定问题,新版本存的旧版本恢复不了,官方在 changelog 里直接提示升级前先读。根因是项目太早期。解法:生产里嵌 libfx,务必锁版本。
少占一块屏幕:工具回到它该在的位置
回到开头那个问题。我后来想明白为什么对全屏界面免疫:界面是为「人偶尔用一次」设计的,而 agent 的价值恰恰在「机器不停地用」——塞进管道、塞进 CI、塞进别人的程序。fx 把自己缩到 6.3 MiB,把输出还给 scrollback,把接口交给 stdout 和 JSON,等于在说:coding agent 不是下一个 IDE,是管道里的下一环。下次再看到一个占满屏幕的 AI 界面,可以先问一句:它能不能被一根管道接走?不能的话,它就是终点,而不是中间件。
真正的工具,不需要一块屏幕来证明自己。
关注圈圈,持续带你玩转 AI 工具。
暂无评论内容