Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
aea6623
fix(oq): chunked load/quantize and streaming VLM sanitizer for huge M…
yohann-bearzi Apr 12, 2026
b837a81
fix(reranker): align Jina v3 scoring and discovery
j-huang-rj Apr 13, 2026
d4f8658
fix: narrow Jina hidden-state extraction contract
j-huang-rj Apr 14, 2026
70048fc
fix(oq): discovery-based streaming sanitizer works for any model
yohann-bearzi Apr 15, 2026
3e7cf19
feat: improve serving stats layout and compact number display
CHW0n9 Apr 15, 2026
467bb1d
fix: remove stale prefill progress tracker entry after external prefill
jundot Apr 16, 2026
232a97f
fix(oq): generic discovery-based streaming sanitizer + FP8 source sup…
yohann-bearzi Apr 16, 2026
db974b8
fix: attach tool_responses to same assistant message as tool_calls
latent-variable Apr 16, 2026
931d37d
fix: normalize text-only list content to string in VLM message format…
jundot Apr 16, 2026
d3c328f
Merge pull request #799 from latent-variable/fix/gemma4-tool-response…
jundot Apr 16, 2026
7f38bf6
fix: remove LSUIElement to prevent ControlCenter blocking menubar icon
jundot Apr 16, 2026
f442fae
Merge pull request #779 from CHW0n9/feature/menubar-stats-format
jundot Apr 16, 2026
0a31654
Merge pull request #737 from yohann-bearzi/main
jundot Apr 16, 2026
6aca4c9
fix(oq): remove dead _StreamingPlan, add chunked load/quantize tests
jundot Apr 16, 2026
d007c4e
Merge pull request #745 from j-huang-rj/fix/jina-reranker-scoring
jundot Apr 16, 2026
4fd6389
feat(oq): Add float16 dtype option for M1/M2 prefill speedup
jundot Apr 16, 2026
ae908e6
chore: bump version to 0.3.6
jundot Apr 16, 2026
e737c53
formula: bump to v0.3.6
jundot Apr 16, 2026
890cc2c
fix: detect menubar hidden state with robust signals and add diagnose…
jundot Apr 17, 2026
32ecff8
fix: add StatusKit Auto-Fix, Bartender-aware alerts, and About panel …
jundot Apr 17, 2026
9798bb1
feat(eval): add BBQ, MathQA, MMLU-Pro, SafetyBench benchmarks (#837)
SheeJiaWei Apr 19, 2026
0749e3f
feat: preserve thinking across turns for Qwen 3.6+ incl. external cli…
latent-variable Apr 19, 2026
1c62b5d
feat(admin): model settings profiles - save and reuse parameter bundl…
sxc562586657 Apr 19, 2026
4597a32
fix: Allow 1% granularity on memory and cold cache sliders
jundot Apr 20, 2026
9a095cd
fix: Bump mlx-lm to a401730 and handle MiniMax parallel tool calls
jundot Apr 20, 2026
6fddeee
Implement MCP OAuth 2.0 authentication support
Copilot Apr 1, 2026
b7f8880
Clarify Notion config: add integration token example alongside OAuth …
Copilot Apr 1, 2026
873d5d3
Implement OAuth 2.1 Dynamic Client Registration (DCR) for servers lik…
Copilot Apr 1, 2026
0739ffe
feat: add server-side MCP agentic loop for built-in chat UI
ChristianPraiss Apr 1, 2026
4e32053
fix: fall back to GlobalSettings for MCP config path in CLI commands
ChristianPraiss Apr 1, 2026
66c1392
feat: display MCP tool calls in built-in chat UI
ChristianPraiss Apr 1, 2026
6befae8
feat: add MCP server management UI to admin dashboard
ChristianPraiss Apr 1, 2026
80b2d62
fix: MCP UI — tools list, working button feedback, fix InvalidCharact…
ChristianPraiss Apr 1, 2026
6cf3547
fix: poll server status after OAuth until reconnect settles
ChristianPraiss Apr 1, 2026
0ad1a15
feat: add MCP config reload at runtime
ChristianPraiss Apr 1, 2026
1454f9c
fix: eliminate anyio cancel-scope cross-task error on MCP disconnect
ChristianPraiss Apr 1, 2026
bae4c56
feat: render MCP tool descriptions as markdown
ChristianPraiss Apr 1, 2026
50cce60
feat: truncate tool descriptions with click-to-expand modal
ChristianPraiss Apr 1, 2026
dfa793b
fix: modal body overflow — add min-h-0 so flex scroll works
ChristianPraiss Apr 1, 2026
9bd4c74
fix: use inline style for modal max-height instead of arbitrary Tailw…
ChristianPraiss Apr 1, 2026
a046b4c
fix: MCP OAuth token refresh, double DCR, and gpt_oss tool result error
ChristianPraiss Apr 2, 2026
7556202
feat: built-in fetch/web_search tools, shared inject_tool_calling, pa…
ChristianPraiss Apr 5, 2026
b1473d6
chore: rollback parser changes, gemma4 tool calling now natively supp…
ChristianPraiss Apr 7, 2026
d485383
chore: temp build fix
ChristianPraiss Apr 15, 2026
a5587d6
chore: fix duplication
ChristianPraiss Apr 17, 2026
7cf8c54
feat: allow disabling tools
ChristianPraiss Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Formula/omlx.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
class Omlx < Formula
desc "LLM inference server optimized for Apple Silicon"
homepage "https://github.com/jundot/omlx"
url "https://github.com/jundot/omlx/archive/refs/tags/v0.3.5.tar.gz"
sha256 "d40f7b13a35e944f0c00fd9005e6667bd2b8be083f6cce3396f97a733fe22876"
url "https://github.com/jundot/omlx/archive/refs/tags/v0.3.6.tar.gz"
sha256 "61135fcc60ca7f9b2a9da3d6c06646963a374f9173918d484916933636ab058b"
license "Apache-2.0"

head "https://github.com/jundot/omlx.git", branch: "main"
Expand Down
55 changes: 55 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# SPDX-License-Identifier: Apache-2.0
"""
Root conftest.py — mock Apple-Silicon-only dependencies so that unit tests
for pure-Python modules (e.g. omlx.mcp.*) can run on Linux CI runners.
"""

import sys
import types
from unittest.mock import MagicMock


def _mock_mlx() -> None:
"""Insert MagicMock stubs for mlx and mlx_lm before any imports occur."""
if "mlx.core" in sys.modules:
# Already importable (macOS with MLX installed) — nothing to do.
try:
import mlx.core # noqa: F401
return
except ImportError:
pass

# Build a minimal package tree that satisfies all sub-module imports
# encountered in omlx/scheduler.py and friends.
for pkg_name in ("mlx", "mlx_lm", "mlx_embeddings", "mlx_vlm"):
pkg = types.ModuleType(pkg_name)
pkg.__path__ = [] # mark as package
sys.modules[pkg_name] = pkg

# Attach commonly referenced sub-modules
_submodules = [
"mlx.core",
"mlx.nn",
"mlx.nn.layers",
"mlx.optimizers",
"mlx.utils",
"mlx_lm.generate",
"mlx_lm.utils",
"mlx_lm.models",
"mlx_lm.models.base",
"mlx_lm.models.cache",
"mlx_lm.sample_utils",
"mlx_lm.tokenizer_utils",
"mlx_embeddings.core",
"mlx_vlm.utils",
]
for name in _submodules:
if name not in sys.modules:
sys.modules[name] = MagicMock()

# Make mlx.core attributes look real enough for isinstance checks
mx = sys.modules["mlx.core"]
mx.array = MagicMock # type: ignore[attr-defined]


_mock_mlx()
24 changes: 24 additions & 0 deletions mcp.example.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,30 @@
"url": "http://localhost:3001/sse",
"enabled": false,
"timeout": 60
},
"notion": {
"_comment": "Notion remote MCP — uses OAuth 2.1 with Dynamic Client Registration (no client_id needed). Run: omlx mcp login notion",
"transport": "streamable-http",
"url": "https://mcp.notion.com/mcp",
"enabled": false,
"timeout": 60,
"auth": {
"type": "oauth2"
}
},
"notion-oauth-app": {
"_comment": "Notion public OAuth app — for developers with a registered OAuth application (client_id required)",
"transport": "streamable-http",
"url": "https://mcp.notion.com/mcp",
"enabled": false,
"timeout": 60,
"auth": {
"type": "oauth2",
"client_id": "YOUR_NOTION_OAUTH_CLIENT_ID",
"auth_url": "https://api.notion.com/v1/oauth/authorize",
"token_url": "https://api.notion.com/v1/oauth/token",
"scopes": ["read_content", "update_content"]
}
}
},
"max_tool_calls": 10,
Expand Down
2 changes: 1 addition & 1 deletion omlx/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.3.5"
__version__ = "0.3.6"
17 changes: 9 additions & 8 deletions omlx/adapter/gemma4.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,14 +205,15 @@ def extract_gemma4_messages(
i += 1

if tool_responses:
processed.append(
{
"role": "assistant",
"content": "",
"tool_responses": tool_responses,
_PRESERVE_BOUNDARY_KEY: True,
}
)
# Attach tool_responses to the SAME assistant message that
# has tool_calls. The Gemma 4 chat template checks for
# tool_responses on the current message (lines 261-267)
# BEFORE falling back to a forward-scan for role='tool'
# messages (lines 268-302). Putting them on a separate
# assistant message causes both paths to miss, producing a
# corrupt bare <|tool_response> tag and making the model
# loop on the same tool call.
out_msg["tool_responses"] = tool_responses
continue

# All other roles (user, system)
Expand Down
6 changes: 4 additions & 2 deletions omlx/admin/accuracy_benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@
_engine_pool_ref: Any = None

VALID_BENCHMARKS = [
"mmlu", "kmmlu", "cmmlu", "jmmlu",
"mmlu", "mmlu_pro", "kmmlu", "cmmlu", "jmmlu",
"hellaswag", "truthfulqa", "arc_challenge", "winogrande",
"gsm8k", "humaneval", "mbpp", "livecodebench",
"gsm8k", "mathqa", "humaneval", "mbpp", "livecodebench",
"bbq", "safetybench",
]


Expand Down Expand Up @@ -440,6 +441,7 @@ async def on_progress(current: int, total: int) -> None:
"predicted": qr.predicted,
"question": qr.question_text,
"raw_response": qr.raw_response,
"category": qr.category,
"time_s": round(qr.time_seconds, 3),
}
for qr in result.question_results
Expand Down
24 changes: 24 additions & 0 deletions omlx/admin/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@
"models.oq.cancel_tooltip": "Cancel quantization",
"models.oq.remove_tooltip": "Remove from list",
"models.oq.advanced_settings": "Advanced Settings",
"models.oq.dtype_label": "Non-quant weight dtype",
"models.oq.dtype_help": "float16 gives ~20% faster prefill on M1/M2 Apple Silicon (native fp16). bfloat16 is safer on M3/M4 and for numerical stability. Output name appends '-fp16' when float16 is selected.",
"models.uploader.section_label": "Hub Upload",
"models.uploader.heading": "Upload oQ Models",
"models.uploader.description": "Upload your locally quantized oQ models to HuggingFace Hub.",
Expand Down Expand Up @@ -428,6 +430,26 @@
"modal.model_settings.cancel": "Cancel",
"modal.model_settings.save": "Save",
"modal.model_settings.saving": "Saving...",
"modal.model_settings.profiles.section_label": "Profiles",
"modal.model_settings.profiles.templates_row": "Templates (global)",
"modal.model_settings.profiles.profiles_row": "Profiles (this model)",
"modal.model_settings.profiles.new_template": "+ New template",
"modal.model_settings.profiles.new_profile": "+ New profile",
"modal.model_settings.profiles.name_label": "Name",
"modal.model_settings.profiles.name_placeholder": "ID e.g. coding-v1",
"modal.model_settings.profiles.display_name_label": "Display name",
"modal.model_settings.profiles.description_label": "Description (optional)",
"modal.model_settings.profiles.also_as_template": "Also save as global template",
"modal.model_settings.profiles.save": "Save",
"modal.model_settings.profiles.cancel": "Cancel",
"modal.model_settings.profiles.update_from_form": "Update to current form values",
"modal.model_settings.profiles.resync_template": "Re-sync from template",
"modal.model_settings.profiles.delete": "Delete",
"modal.model_settings.profiles.delete_confirm": "Delete this profile?",
"modal.model_settings.profiles.drift_hint": "Form has unsaved changes vs. profile",
"modal.model_settings.profiles.custom_label": "custom",
"modal.model_settings.profiles.invalid_name": "Name must be lowercase letters, digits, underscore, or dash (1-32 chars)",
"models.list.profile_chip": "Profile",
"logs.section_label": "Logs",
"logs.heading": "Server Logs",
"logs.description": "View real-time server logs with auto-refresh.",
Expand Down Expand Up @@ -589,6 +611,8 @@
"chat.error.invalid_image_type": "Please select an image file",
"chat.error.image_too_large": "Image size must be less than 10MB",
"chat.error.image_load_failed": "Failed to load image. Please try again.",
"chat.tools_enabled": "Tools enabled",
"chat.tools_disabled": "Tools disabled",
"js.error.required_fields": "Required fields cannot be empty: {fields}",
"js.error.api_key_min_length": "API key must be at least 4 characters",
"js.error.api_key_no_whitespace": "API key must not contain whitespace",
Expand Down
22 changes: 22 additions & 0 deletions omlx/admin/i18n/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@
"models.oq.cancel_tooltip": "量子化をキャンセル",
"models.oq.remove_tooltip": "リストから削除",
"models.oq.advanced_settings": "詳細設定",
"models.oq.dtype_label": "Non-quant weight dtype",
"models.oq.dtype_help": "float16 gives ~20% faster prefill on M1/M2 Apple Silicon (native fp16). bfloat16 is safer on M3/M4 and for numerical stability. Output name appends '-fp16' when float16 is selected.",
"models.uploader.section_label": "Hub Upload",
"models.uploader.heading": "Upload oQ Models",
"models.uploader.description": "Upload your locally quantized oQ models to HuggingFace Hub.",
Expand Down Expand Up @@ -428,6 +430,26 @@
"modal.model_settings.cancel": "キャンセル",
"modal.model_settings.save": "保存",
"modal.model_settings.saving": "保存中...",
"modal.model_settings.profiles.section_label": "プロファイル",
"modal.model_settings.profiles.templates_row": "テンプレート(グローバル)",
"modal.model_settings.profiles.profiles_row": "プロファイル(このモデル)",
"modal.model_settings.profiles.new_template": "+ 新規テンプレート",
"modal.model_settings.profiles.new_profile": "+ 新規プロファイル",
"modal.model_settings.profiles.name_label": "名前",
"modal.model_settings.profiles.name_placeholder": "ID 例: coding-v1",
"modal.model_settings.profiles.display_name_label": "表示名",
"modal.model_settings.profiles.description_label": "説明(任意)",
"modal.model_settings.profiles.also_as_template": "グローバルテンプレートとしても保存",
"modal.model_settings.profiles.save": "保存",
"modal.model_settings.profiles.cancel": "キャンセル",
"modal.model_settings.profiles.update_from_form": "現在のフォーム値で更新",
"modal.model_settings.profiles.resync_template": "テンプレートから再同期",
"modal.model_settings.profiles.delete": "削除",
"modal.model_settings.profiles.delete_confirm": "このプロファイルを削除しますか?",
"modal.model_settings.profiles.drift_hint": "フォームにプロファイルと異なる未保存の変更があります",
"modal.model_settings.profiles.custom_label": "カスタム",
"modal.model_settings.profiles.invalid_name": "名前は小文字・数字・アンダースコア・ハイフンのみ(1-32 文字)",
"models.list.profile_chip": "プロファイル",
"logs.section_label": "ログ",
"logs.heading": "サーバーログ",
"logs.description": "自動更新でリアルタイムのサーバーログを確認します。",
Expand Down
22 changes: 22 additions & 0 deletions omlx/admin/i18n/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@
"models.oq.cancel_tooltip": "양자화 취소",
"models.oq.remove_tooltip": "목록에서 제거",
"models.oq.advanced_settings": "고급 설정",
"models.oq.dtype_label": "Non-quant weight dtype",
"models.oq.dtype_help": "float16 gives ~20% faster prefill on M1/M2 Apple Silicon (native fp16). bfloat16 is safer on M3/M4 and for numerical stability. Output name appends '-fp16' when float16 is selected.",
"models.uploader.section_label": "Hub Upload",
"models.uploader.heading": "Upload oQ Models",
"models.uploader.description": "Upload your locally quantized oQ models to HuggingFace Hub.",
Expand Down Expand Up @@ -428,6 +430,26 @@
"modal.model_settings.cancel": "취소",
"modal.model_settings.save": "저장",
"modal.model_settings.saving": "저장 중...",
"modal.model_settings.profiles.section_label": "프로필",
"modal.model_settings.profiles.templates_row": "템플릿 (전역)",
"modal.model_settings.profiles.profiles_row": "프로필 (이 모델)",
"modal.model_settings.profiles.new_template": "+ 새 템플릿",
"modal.model_settings.profiles.new_profile": "+ 새 프로필",
"modal.model_settings.profiles.name_label": "이름",
"modal.model_settings.profiles.name_placeholder": "ID 예: coding-v1",
"modal.model_settings.profiles.display_name_label": "표시 이름",
"modal.model_settings.profiles.description_label": "설명 (선택)",
"modal.model_settings.profiles.also_as_template": "전역 템플릿으로도 저장",
"modal.model_settings.profiles.save": "저장",
"modal.model_settings.profiles.cancel": "취소",
"modal.model_settings.profiles.update_from_form": "현재 폼 값으로 업데이트",
"modal.model_settings.profiles.resync_template": "템플릿에서 다시 동기화",
"modal.model_settings.profiles.delete": "삭제",
"modal.model_settings.profiles.delete_confirm": "이 프로필을 삭제하시겠습니까?",
"modal.model_settings.profiles.drift_hint": "폼에 프로필과 다른 저장되지 않은 변경사항이 있습니다",
"modal.model_settings.profiles.custom_label": "사용자 지정",
"modal.model_settings.profiles.invalid_name": "이름은 소문자, 숫자, 밑줄, 하이픈만 허용 (1-32자)",
"models.list.profile_chip": "프로필",
"logs.section_label": "로그",
"logs.heading": "서버 로그",
"logs.description": "실시간 서버 로그를 자동 새로고침으로 확인합니다.",
Expand Down
22 changes: 22 additions & 0 deletions omlx/admin/i18n/zh-TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@
"models.oq.cancel_tooltip": "取消量化",
"models.oq.remove_tooltip": "從列表中移除",
"models.oq.advanced_settings": "進階設定",
"models.oq.dtype_label": "Non-quant weight dtype",
"models.oq.dtype_help": "float16 gives ~20% faster prefill on M1/M2 Apple Silicon (native fp16). bfloat16 is safer on M3/M4 and for numerical stability. Output name appends '-fp16' when float16 is selected.",
"models.uploader.section_label": "Hub Upload",
"models.uploader.heading": "Upload oQ Models",
"models.uploader.description": "Upload your locally quantized oQ models to HuggingFace Hub.",
Expand Down Expand Up @@ -428,6 +430,26 @@
"modal.model_settings.cancel": "取消",
"modal.model_settings.save": "儲存",
"modal.model_settings.saving": "儲存中...",
"modal.model_settings.profiles.section_label": "設定檔",
"modal.model_settings.profiles.templates_row": "範本(全域)",
"modal.model_settings.profiles.profiles_row": "設定檔(目前模型)",
"modal.model_settings.profiles.new_template": "+ 新增範本",
"modal.model_settings.profiles.new_profile": "+ 新增設定檔",
"modal.model_settings.profiles.name_label": "名稱",
"modal.model_settings.profiles.name_placeholder": "ID,例如 coding-v1",
"modal.model_settings.profiles.display_name_label": "顯示名稱",
"modal.model_settings.profiles.description_label": "說明(選填)",
"modal.model_settings.profiles.also_as_template": "同時儲存為全域範本",
"modal.model_settings.profiles.save": "儲存",
"modal.model_settings.profiles.cancel": "取消",
"modal.model_settings.profiles.update_from_form": "更新為目前表單值",
"modal.model_settings.profiles.resync_template": "從範本重新同步",
"modal.model_settings.profiles.delete": "刪除",
"modal.model_settings.profiles.delete_confirm": "刪除此設定檔?",
"modal.model_settings.profiles.drift_hint": "表單相對設定檔有未儲存的變動",
"modal.model_settings.profiles.custom_label": "自訂",
"modal.model_settings.profiles.invalid_name": "名稱僅允許小寫字母、數字、底線、連字號(1-32 字元)",
"models.list.profile_chip": "設定檔",
"logs.section_label": "日誌",
"logs.heading": "伺服器 Logs",
"logs.description": "檢視即時伺服器 Logs,支援自動重新整理。",
Expand Down
22 changes: 22 additions & 0 deletions omlx/admin/i18n/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@
"models.oq.cancel_tooltip": "取消量化",
"models.oq.remove_tooltip": "从列表中移除",
"models.oq.advanced_settings": "高级设置",
"models.oq.dtype_label": "Non-quant weight dtype",
"models.oq.dtype_help": "float16 gives ~20% faster prefill on M1/M2 Apple Silicon (native fp16). bfloat16 is safer on M3/M4 and for numerical stability. Output name appends '-fp16' when float16 is selected.",
"models.uploader.section_label": "Hub Upload",
"models.uploader.heading": "Upload oQ Models",
"models.uploader.description": "Upload your locally quantized oQ models to HuggingFace Hub.",
Expand Down Expand Up @@ -428,6 +430,26 @@
"modal.model_settings.cancel": "取消",
"modal.model_settings.save": "保存",
"modal.model_settings.saving": "保存中...",
"modal.model_settings.profiles.section_label": "配置档",
"modal.model_settings.profiles.templates_row": "模板(全局)",
"modal.model_settings.profiles.profiles_row": "配置档(当前模型)",
"modal.model_settings.profiles.new_template": "+ 新建模板",
"modal.model_settings.profiles.new_profile": "+ 新建配置档",
"modal.model_settings.profiles.name_label": "名称",
"modal.model_settings.profiles.name_placeholder": "ID,例如 coding-v1",
"modal.model_settings.profiles.display_name_label": "显示名",
"modal.model_settings.profiles.description_label": "描述(可选)",
"modal.model_settings.profiles.also_as_template": "同时保存为全局模板",
"modal.model_settings.profiles.save": "保存",
"modal.model_settings.profiles.cancel": "取消",
"modal.model_settings.profiles.update_from_form": "更新为当前表单值",
"modal.model_settings.profiles.resync_template": "从模板重新同步",
"modal.model_settings.profiles.delete": "删除",
"modal.model_settings.profiles.delete_confirm": "删除此配置档?",
"modal.model_settings.profiles.drift_hint": "表单相对配置档有未保存的改动",
"modal.model_settings.profiles.custom_label": "自定义",
"modal.model_settings.profiles.invalid_name": "名称仅允许小写字母、数字、下划线、短横线(1-32 字符)",
"models.list.profile_chip": "配置档",
"logs.section_label": "日志",
"logs.heading": "服务器日志",
"logs.description": "查看实时服务器日志,支持自动刷新。",
Expand Down
Loading