omlx
把语言化为行动,比把行动化为语言困难得多。——高尔基
https://github.com/jundot/omlx
oMLX:住在你 Mac 里的“本地大模型管家”,从菜单栏开始把推理安排得明明白白
如果你的 Mac 是一座城市,那么本地大模型推理就是城市里最忙的那条主干道:车流(请求)一多就堵,红绿灯(调度)一乱就卡,停车位(显存/内存)不够就直接“爆仓”。
而 oMLX 更像是这座城市里一位穿着制服、手拿对讲机的交通指挥官——不光把路修好了,还把 连续批处理(continuous batching)、冷热分层 KV Cache(tiered KV caching)、多模型共存与自动腾挪,统统打包成一个你能从菜单栏就能管理的优雅系统。
它的自我介绍很直白也很骄傲:
LLM inference, optimized for your Mac
Continuous batching and tiered KV caching, managed directly from your menu bar.
你不用在“方便”和“可控”之间二选一,oMLX 说:都给你。
oMLX 想解决的那种“本地推理烦恼”
oMLX 有点像一个有洁癖的管理员:它不喜欢你一会���开一个服务、一会儿换一个模型、一会儿手动清缓存、一会儿又为了上下文长度纠结到深夜。
它更想要这样的生活方式:
- 日常模型 常驻内存(你想用就秒回)
- 更重的模型 按需自动切换
- 上下文限制 可控(而且最好不用你到处改配置)
- 还有最关键的:缓存要能复用,不要每次都从头算到尾
于是它用自己的方式说话:
“让我来管。我把 KV cache 分成热的和冷的,让它们各司其职;我把并发请求排好队,让它们一起上车;我把所有按钮塞进菜单栏,让你不必再和终端纠缠。”
安装:让 oMLX 走进你的 Mac(它很会搬家)
方式一:macOS App(最像“把它请进家里”)
从 GitHub Releases 下载 .dmg,拖进 Applications 就完成。
而且它还带 in-app auto-update:以后升级一键完成,它会自己收拾行李,不麻烦你。
方式二:Homebrew(让它在你系统里“入编制”)
1 | brew tap jundot/omlx https://github.com/jundot/omlx |
它甚至会主动表态:“我可以做后台服务,还能崩了自动重启。”
这语气像极了那种靠谱同事:不吵不闹,但永远在线。
方式三:From Source(如果你想和它一起写代码、一起成长)
1 | git clone https://github.com/jundot/omlx.git |
硬性要求它也说得很清楚:
- macOS 15.0+ (Sequoia)
- Python 3.10+
- Apple Silicon(M1/M2/M3/M4)
快速启动:它最喜欢的开场白
1)macOS App:三步欢迎仪式
你从 Applications 打开 oMLX,它的 Welcome 屏幕会带你走完三件事:
- 选择模型目录(model directory)
- 启动 server
- 下载第一个模型
然后它会说:好了,坐下吧,我们开始聊天。
2)CLI:一句命令把它叫醒
1 | omlx serve --model-dir ~/models |
它会自动从子目录里发现各种角色(它的“员工”们):
- LLMs
- VLMs
- embedding models
- rerankers
并且任何 OpenAI-compatible client 都能连到:
http://localhost:8000/v1
它不像某些服务那样“你要先配这个再改那个”,oMLX 更像在说:
“你先把模型放好,剩下的我来。”
Homebrew Service:让 oMLX 成为你电脑里的“长期工”
如果你用 Homebrew 安装,它还能当一个受管理的后台服务:
1 | brew services start omlx # Start (auto-restarts on crash) |
它默认会用 零配置启动:
- 模型目录:
~/.omlx/models - 端口:8000
- 命令:
omlx serve
要自定义也简单:
- 用环境变量(
OMLX_MODEL_DIR,OMLX_PORT, …) - 或者直接用
omlx serve --...的参数覆盖
日志它也安排得井井有条,像在给你留“工作日报”:
- Service log:
$(brew --prefix)/var/log/omlx.log(stdout/stderr) - Server log:
~/.omlx/logs/server.log(结构化应用日志)
它的核心能力:oMLX 的“人格魅力”到底在哪
oMLX 不是只会“跑模型”,它更像一个系统级别的运营者:懂调度、懂缓存、懂资源管理,还懂得如何让你不被这些细节拖累。
官方一句话总结它的舞台范围:
Supports text LLMs, vision-language models (VLM), OCR models, embeddings, and rerankers on Apple Silicon.
下面这些能力,基本就是它的“拿手好戏”。
Admin Dashboard:它的控制室在 /admin
oMLX 给自己配了一个 Web 控制台:/admin
你可以在这里做实时监控、模型管理、聊天、benchmark、还有每个模型的独立设置。
它还很国际化:
- English, Korean, Japanese, Chinese, Russian
而且 所有 CDN 依赖都 vendored ——它不喜欢把命运交给网络波动。
它像在说:
“我不仅能跑,我还要让你看到我怎么跑。”
视觉语言模型(VLM):它不仅会说,还会看
oMLX 让 VLM 也享受同一套“豪华待遇”:
- continuous batching
- tiered KV cache
并支持:
- multi-image chat
- base64 / URL / file image inputs
- tool calling with vision context
甚至 OCR 模型也能上场(例如 DeepSeek-OCR、DOTS-OCR、GLM-OCR),它像一个认真阅读图片的小秘书:
“你给我图,我给你字。”
分层 KV Cache(Hot + Cold):它把记忆分成“热的”和“冷的”
oMLX 的 KV cache 管理灵感来自 vLLM:
block-based、支持 prefix sharing、还有 Copy-on-Write。
它把缓存分成两个世界:
- Hot tier (RAM):常用块留在内存,取用飞快
- Cold tier (SSD):热缓存满了就把块写到 SSD(safetensors 格式);下一次遇到相同前缀,直接从磁盘恢复,不用重新算
它的语气就像在给自己配一个“记忆宫殿”:
- 热记忆:随用随取
- 冷记忆:归档保存
- 需要时:立刻唤醒
更关键的是:它强调一种很“人类”的体验——即便对话中途上下文变化,过去的上下文也能继续被缓存、复用。它并不想让你每次都从零开始。
Continuous Batching:它会把请求“拼车”送上 GPU
并发请求多的时候,oMLX 不让它们互相踩踏,而是用 mlx-lm 的 BatchGenerator 做连续批处理。
最大并发请求数还能配置(CLI 或 admin panel)。
它像一位会排队的领班:
“别抢,一个个来;但我会把你们打包一起上车。”
Claude Code Optimization:它也懂“上下文尺度感”
oMLX 对 Claude Code 有专门优化:
- 支持 context scaling:让小上下文模型在 Claude Code 场景里更合理地触发 auto-compact
- SSE keep-alive:减少 read timeout
它像在说:
“我知道你要用它写代码,我帮你把那些细小却致命的卡顿都抚平。”
Multi-Model Serving:它擅长在同一个屋檐下安顿很多模型
oMLX 能在一个 server 里同时管理:
- LLMs
- VLMs
- embedding models
- rerankers
而且它的管理方式很像一个有经验的宿舍管理员:
- LRU eviction:内存紧张就自动把最久没用的模型请出去
- Manual load/unload:在 admin 面板点一下就能加载/卸载
- Model pinning:常用模型钉住,永不搬走
- Per-model TTL:每个模型设空闲超时,到了就自动卸载
- Process memory enforcement:总内存上限(默认 system RAM - 8GB),防止系统 OOM
它不爱浪费,也不让你操心。
Per-Model Settings:每个模型都有自己的“性格面板”
你可以在 admin panel 为每个模型设置:
- sampling parameters
- chat template kwargs
- TTL
- model alias
- model type override
- 等等
而且 立即生效,无需重启服务。
它还支持两件很实用的事:
- Model alias:自定义 API 可见名称
/v1/models返回 alias,请求也接受 alias 和目录名 - Model type override:手动指定它到底是 LLM 还是 VLM(不必依赖自动检测)
它像在说:
“你不用把所有模型当成一类人,我允许它们各自精彩。”
Built-in Chat:它自己也能陪你聊两句
在 admin panel 就能直接和任何已加载模型聊天,支持:
- conversation history
- model switching
- dark mode
- reasoning model output
- VLM/OCR 的 image upload
这时候它不像基础设施,更像一个可直接使用的产品。
Model Downloader:它会自己去 HuggingFace 把模型“请回来”
你可以在 admin dashboard 里搜索、查看模型卡片、核对文件大小,然后一键下载 MLX 模型。
它像一个认真负责的采购:
“型号我帮你找,价格(体积)我帮你看,按一下我就把它送到仓库。”
Integrations:它喜欢“一键就好”
OpenClaw、OpenCode、Codex、Pi……
这些都可以在 admin dashboard 一键配置,不需要你手动改配置文件。
它对“重复劳动”有点不耐烦:
“别再复制粘贴了,你点一下,我来写。”
Performance Benchmark:它还会给自己做体检
一键 benchmark,测:
- prefill (PP) tokens/s
- text generation (TG) tokens/s
还支持 partial prefix cache hit testing,让性能数字更贴近真实对话场景。
它像一位工程师式的运动员:
“我不只说我快,我给你测给你看。”
macOS Menubar App:它把“掌控感”藏进菜单栏
这是它最迷人的地方之一:
原生 PyObjC menubar app(不是 Electron)。
你可以在不打开终端的情况下:
- Start / Stop server
- Monitor server
- 看 serving stats(而且能跨重启保留)
- 崩了自动重启
- 还带 in-app update
它像一位沉默的管家,住在菜单栏里,不打扰你,却随时待命。
API Compatibility:它会说 OpenAI,也会说 Anthropic
oMLX 作为 API 层面,主打“替换成本低”:
- OpenAI API 兼容
- Anthropic API 兼容
- 支持 streaming usage stats:
stream_options.include_usage - 支持 Anthropic adaptive thinking
- 支持 vision inputs(base64、URL)
它把自己的能力写成了清晰的路标:
| Endpoint | Description |
|---|---|
POST /v1/chat/completions |
Chat completions (streaming) |
POST /v1/completions |
Text completions (streaming) |
POST /v1/messages |
Anthropic Messages API |
POST /v1/embeddings |
Text embeddings |
POST /v1/rerank |
Document reranking |
GET /v1/models |
List available models |
它像在对你说:
“你原来怎么调 OpenAI / Anthropic,现在也几乎可以怎么调我。”
Tool Calling & Structured Output:它懂“工具调用”这门手艺
oMLX 支持 mlx-lm 里所有 function calling 形式、JSON schema validation、以及 MCP tool integration。
当然,它也会强调前提:模型的 chat template 需要支持 tools 参数。
它还整理了各家模型可能使用的 tool call 输出格式,像一个见多识广的翻译官:
| Model Family | Format |
|---|---|
| Llama, Qwen, DeepSeek, etc. | JSON <tool_call> |
| Qwen3.5 Series | XML <function=...> |
| Gemma | <start_function_call> |
| GLM (4.7, 5) | <arg_key>/<arg_value> XML |
| MiniMax | Namespaced <minimax:tool_call> |
| Mistral | [TOOL_CALLS] |
| Kimi K2 | <|tool_calls_section_begin|> |
| Longcat | <longcat_tool_call> |
它像在说:
“你们输出格式不同没关系,我能认得出来。只要你愿意调用工具,我就愿意接住你。”
模型目录(Models):给它一个“仓库”,它就能开工
你只需要把 --model-dir 指向一个包含 MLX 格式模型子目录的文件夹。
它还支持两层组织结构,例如:mlx-community/model-name/。
示例结构如下:
1 | ~/models/ |
模型会被自动按类型检测,你也可以直接在 admin dashboard 下载模型。
支持类型与来源也写得很明白:
| Type | Models |
|---|---|
| LLM | Any model supported by mlx-lm |
| VLM | Qwen3.5 Series, GLM-4V, Pixtral, and other mlx-vlm models |
| OCR | DeepSeek-OCR, DOTS-OCR, GLM-OCR |
| Embedding | BERT, BGE-M3, ModernBERT |
| Reranker | ModernBERT, XLM-RoBERTa |
CLI Configuration:它的“性格参数”都在这里
oMLX 的配置既可以在 /admin 配,也可以用 CLI flags。
它还会把设置持久化到:
~/.omlx/settings.json
并且声明:CLI flags 优先级更高。
下面这些命令像是它递给你的“调教手册”,非常直接:
1 | # Memory limit for loaded models |
它像一个成熟的系统工具:
“你想要可控?给你。你想要省心?也给你。”
架构一瞥:它的“内心结构”其实很工整
它把自己的结构折叠在 README 的 Architecture 里,像把心脏剖面图递给好奇的人:
1 | FastAPI Server (OpenAI / Anthropic API) |
你会发现它不是“临时拼凑”的玩具,而是很明确地在做一件事:
把本地推理变成可运营、可管理、可持续的服务。
开发:如果你想和它一起“卷性能、卷体验”
CLI Server 开发
1 | git clone https://github.com/jundot/omlx.git |
macOS App 打包
要求:
- Python 3.11+
- venvstacks:
pip install venvstacks
构建命令:
1 | cd packaging |
它的 App bundle 结构也讲得清清楚楚,像在说:
“我不是黑盒,你想拆开看就拆开看。”
贡献与许可:它欢迎你来一起把它变得更好
它欢迎:
- Bug fixes and improvements
- Performance optimizations
- Documentation improvements
许可证:Apache 2.0
它的态度像个开源项目应有的样子:
“不用客气,来吧,一起把本地推理这件事做得更舒服。”
尾声:oMLX 的气质,是把“本地推理”变成一种日常
oMLX 并不想成为你生活里的“又一个工具”。
它更像一个常驻的伙伴:懂你的 Mac、懂你的资源、懂你的模型,也懂你想要的那种稳定、可控、顺滑的本地推理体验。
它住在菜单栏里,轻声说:
- 需要我?我在。
- 模型多?我管。
- 并发高?我排。
- 缓存重?我分层存。
- 你只要安心用就好。
而这,大概就是 oMLX 最吸引人的地方。
