昨日、大学に Mac 上で動作する Open WebUI と Ollama を納品した。すると、その直後に Open WebUI と Ollama の両方にアップデートが出てしまった。こういうことは、なぜか納品した直後に起きる。
DGX Spark や EVO-X2(Strix Halo)では、体感として 2〜3割ほど性能が上がり、メモリの使い方も少し賢くなったように見える。さらに、モデルを 64K コンテキストにして、LLM にタスクが発生するような内容を入れると、画面下部にタスクが表示されるようになった。

ここまで来ると、外部連携をしない使い方であれば OpenClaw は必須ではないかもしれない。
個人的な印象では、Open WebUI が居酒屋だとすると、OpenClaw はキャバクラに近い。
居酒屋では、頼んだお酒が何か分かりやすい。会計も比較的明朗だ。
一方でキャバクラは、机の上にあるハウスボトル(ラベルと違うお酒を補充していたりする)が何のお酒なのか分かりにくい。会計も少し不透明に感じる。(ちなみに、とんとそんなお店は行っていないし、もう行く気もない。)
Open WebUI は、内部コンポーネント、使用モデル、コンテキスト、会話の流れなどが比較的見えやすい。つまりセキュリティ設定もしやすい。
OpenClaw は便利ではあるが、内部で何がどれだけ使われているのか、どこにアクセスしているのが分かりにくい。
もちろん、外部ツール連携や本格的な Agent 処理を行うのであれば OpenClaw の価値は十分にある。
しかし、ローカル LLM、RAG、タスク生成、軽い Agent 的な用途であれば、Open WebUI だけでもかなりのことができるようになってきた。
では、Mac では今回の Ollama / Open WebUI 更新でどれくらい変わるのだろうか。それを調べたいところだが、まずは土台を固定しないと比較ができない。
ということで、先に Mac 上の Open WebUI Desktop、Ollama、Apfel の構成を確定することにした。
実は、この設定は納品した環境にはまだ入れていない。明日、こっそりやるしかない。
閑話休題
Apple SiliconのmacOSでは、何もしなくてもApfelというアプリでOS標準のLLMチャットが使える。
簡単に使えるのでぜひ入れたほうがいい。ただし、大きいモデルが動くわけではないのでそんな難しいことはできないが、結構いい感じで出してくれる。

homebrewでコマンドライン版のApfelを入れることもでき、サーバ起動もできる。LLMとしての使い分けとしては、以下のようにするのがいい。
Mac
├─ Ollama :大きいモデル(TailscaleなどでホームラボのLLMに繋げられるならばいらない。)
└─ Apfel :小さいモデル、Open WebUIのTASK Model、外出時などネットワークに接続ができない時に利用するLLM
しかし、同一サーバに入れてしまうとapfelのサーバ起動で使うポートとOllamaのポートがかち合うのでどちらかのポートを変える必要がある。
ApfelとOllamaはデフォルトでは同じポート(11434)を使用するため、どちらかのポートを変更する必要がある。今回はOllamaを標準ポート11434のまま利用し、Apfelを11435へ変更する。
Mac
├─ Ollama :11434
└─ Apfel :11435
MacBook Neoなどのように8GBしかRAMを積んでいないマシンは、Ollamaは入れずにApfelだけいれてもいい。
注意事項
-
Open WebUI Desktop向けに書いているが、Mac miniなどをLLMアプライアンスにしたい場合は、Ollama / apfelの起動を127.0.0.1を0.0.0.0にすることでサーバ起動ができる。
-
本手順では brew services は使用しない。
brew services start ollama
brew services start apfel
を実行するとポート設定や環境変数設定が反映されない、アップグレードをすると設定が元に戻る場合があるので、Ollama と Apfel は独自 LaunchAgent で管理する。
-
11434ポート/11435ポートでollamaやapfelが動いていないことを確認すること。
以下のコマンドで何も表示されないことを確認する
lsof -nP -iTCP:11434 -sTCP:LISTEN
lsof -nP -iTCP:11435 -sTCP:LISTEN
Ollamaのインストールと起動(サービスの個別設定・標準ポートで起動)
インストーラー版(Ollama.app)を利用する場合は、本章のLaunchAgent設定をすべてスキップして構わない。ただし、Ollama.appでは主にコンテキストサイズ程度しか調整できないため、
– OLLAMA_KEEP_ALIVE
– OLLAMA_NUM_PARALLEL
– OLLAMA_MAX_LOADED_MODELS
– OLLAMA_MAX_QUEUE
などを変更したい場合は 以下の手順でHomebrew版を利用する。
brew install ollama
homebrewの設定ファイルを書き換えて、パラメータの調整をしたいがどこを書き換えても、サービスの再起動時やアップデート時に消されてしまうので、brew servicesを使わない方法で自動起動させる。
2026/6/3 時点での問題
この手順をやるだけなら問題ないけど、mlx以外のモデルがロードできない。brewのollamaが壊れている。パッケージ版をいれれば起きないらしい。
Open WebUI Desktopで使うなら
cat << ‘EOF’ > ~/Library/LaunchAgents/local.ollama.plist
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN”
“http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>Label</key>
<string>local.ollama</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/opt/ollama/bin/ollama</string>
<string>serve</string>
</array>
<key>EnvironmentVariables</key>
<dict>
<key>OLLAMA_FLASH_ATTENTION</key>
<string>1</string>
<key>OLLAMA_KV_CACHE_TYPE</key>
<string>q8_0</string>
<key>OLLAMA_HOST</key>
<string>127.0.0.1:11434</string>
<key>OLLAMA_KEEP_ALIVE</key>
<string>15m</string>
<key>OLLAMA_MAX_LOADED_MODELS</key>
<string>1</string>
<key>OLLAMA_NUM_PARALLEL</key>
<string>1</string>
<key>OLLAMA_MAX_QUEUE</key>
<string>8</string>
</dict>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/opt/homebrew/var/log/local.ollama.out.log</string>
<key>StandardErrorPath</key>
<string>/opt/homebrew/var/log/local.ollama.err.log</string>
</dict>
</plist>
EOF
LLMサーバとして使うなら
cat << ‘EOF’ > ~/Library/LaunchAgents/local.ollama.plist
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN”
“http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>Label</key>
<string>local.ollama</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/opt/ollama/bin/ollama</string>
<string>serve</string>
</array>
<key>EnvironmentVariables</key>
<dict>
<key>OLLAMA_FLASH_ATTENTION</key>
<string>1</string>
<key>OLLAMA_KV_CACHE_TYPE</key>
<string>q8_0</string>
<key>OLLAMA_HOST</key>
<string>0.0.0.0:11434</string>
<key>OLLAMA_KEEP_ALIVE</key>
<string>24h</string>
<key>OLLAMA_MAX_LOADED_MODELS</key>
<string>3</string>
<key>OLLAMA_NUM_PARALLEL</key>
<string>2</string>
<key>OLLAMA_MAX_QUEUE</key>
<string>64</string>
</dict>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/opt/homebrew/var/log/local.ollama.out.log</string>
<key>StandardErrorPath</key>
<string>/opt/homebrew/var/log/local.ollama.err.log</string>
</dict>
</plist>
EOF
Open WebUI Desktopで使うなら
Homebrew servicesで動かしていた場合は止めて、自前LaunchAgentを起動。
brew services stop ollama
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/local.ollama.plist 2>/dev/null || true
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/local.ollama.plist
launchctl enable gui/$(id -u)/local.ollama
launchctl kickstart -k gui/$(id -u)/local.ollama
確認:
環境変数が表示されることを確認すること
launchctl print gui/$(id -u)/local.ollama | grep -A30 environment
ps eww $(pgrep -x ollama) | tr ‘ ‘ ‘\n’ | grep OLLAMA
ポートの確認
lsof -nP -iTCP:11434 -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ollama 15680 hoge 3u IPv4 0xa5cbf4653dd36d6b 0t0 TCP 127.0.0.1:11434 (LISTEN)
ollamaコマンドが利用できることを確認すること
ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
これで 127.0.0.1:11434 で待受し、Ollamaサーバとして動作する。
環境変数などを変えた場合のollamaの再起動
launchctl bootout gui/$(id -u)/local.ollama 2>/dev/null || true
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/local.ollama.plist
launchctl enable gui/$(id -u)/local.ollama
launchctl kickstart -k gui/$(id -u)/local.ollama
単純な再起動 (stoppingでモデルアンロードで止まっている場合)
launchctl kickstart -k gui/$(id -u)/local.ollama
Apfelのインストールと起動(サービスの個別設定・個別ポートで起動)
Ollama同様以下でインストールをする。
brew install apfel
brew servicesで起動させたいが、ollamaのポートとかぶってしまう。なので、ポート番号を変えて起動する必要がある。
Ollama同様に以下の設定をする。
cat << ‘EOF’ > ~/Library/LaunchAgents/local.apfel.plist
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>local.apfel</string>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>Background</string>
<string>LoginWindow</string>
<string>StandardIO</string>
<string>System</string>
</array>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/opt/apfel/bin/apfel</string>
<string>–serve</string>
</array>
<key>EnvironmentVariables</key>
<dict>
<key>APFEL_HOST</key>
<string>127.0.0.1</string>
<key>APFEL_PORT</key>
<string>11435</string>
</dict>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/opt/homebrew/var/log/apfel.log</string>
<key>StandardOutPath</key>
<string>/opt/homebrew/var/log/apfel.log</string>
<key>WorkingDirectory</key>
<string>/opt/homebrew/var</string>
</dict>
</plist>
EOF
Homebrew servicesで動かしていた場合は止めて、自前LaunchAgentを起動。
brew services stop apfel
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/local.apfel.plist 2>/dev/null || true
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/local.apfel.plist
launchctl enable gui/$(id -u)/local.apfel
launchctl kickstart -k gui/$(id -u)/local.apfel
確認:
環境変数が表示されることを確認すること
launchctl print gui/$(id -u)/local.apfel | grep -A30 environment
ps eww $(pgrep -x apfel) | tr ‘ ‘ ‘\n’ | grep APFEL
ポートの確認
lsof -nP -iTCP:11435 -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apfel 16036 hoge 14u IPv4 0x2f76f7c157192ae5 0t0 TCP 127.0.0.1:11435 (LISTEN)
これで 127.0.0.1:11435 で待受し、OpenAI API互換サーバとして動作する。
環境変数などを変えた場合ののapfelの再起動
launchctl bootout gui/$(id -u)/local.apfel 2>/dev/null || true
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/local.apfel.plist
launchctl enable gui/$(id -u)/local.apfel
launchctl kickstart -k gui/$(id -u)/local.apfel
Ollamaのモデル設定
qwen3.5 / qwen 3.6 を利用する
visionモデルでもあるので、画像解析ができる、また、Toolsモデルでもあるので、ツールも使える。

QwenのMLXモデルを使うとメモリの消費が少なくなるのでおすすめ。
注意:brew版の0.30.0は、通常のllama-serverを使うGGUFモデルが使えないので、必ずmlxモデルを利用すること。

以下のModel設定は、MacBook Pro M1 MAX 32GBを想定している。スペックが上あるいは下の場合は適宜調整すること。
メインモデル
メモリサイズによって調節したほうがいい。
- メモリが16GB
- qwen3.5:4b-mlxに変更する。
- メモリが24GB
- qwen3.5:9b-mlxに変更する。
このスクリプトでできるモデルを使うと、チャットが終わりきらない問題(クルクルが残る)が起きにくくなる。
cat <<‘SCRIPT’ > create-qwen36-35b-mlx-agent-64k.sh
#!/usr/bin/env bash
# Create an Agent-oriented custom Ollama model.
# Base model: qwen3.6:35b-mlx
# Target model: qwen3.6:35b-mlx-agent-64k
OLLAMA_BIN=”${OLLAMA_BIN:-ollama}”
BASE_MODEL=”qwen3.6:35b-mlx”
TARGET_MODEL=”qwen3.6:35b-mlx-agent-64k”
MODEFILE=”Modelfile.qwen36-35b-mlx-agent-64k”
SYSTEM_PROMPT=’You are an Agent AI assistant.
Follow the user instruction precisely.
Use tools only when they are necessary.
Do not fabricate facts.
If information is missing or uncertain, say so clearly.
Prefer structured, concise, and actionable answers.
When performing technical tasks, explain assumptions, risks, and verification steps.
Reply in the same language as the user.’
cat <<EOF > “${MODEFILE}”
FROM ${BASE_MODEL}
PARAMETER num_ctx 65536
PARAMETER temperature 0.35
PARAMETER top_p 0.90
PARAMETER top_k 20
PARAMETER repeat_penalty 1.10
PARAMETER presence_penalty 0.30
PARAMETER frequency_penalty 0.20
PARAMETER num_predict 4096
SYSTEM “””${SYSTEM_PROMPT}”””
EOF
${OLLAMA_BIN} pull “${BASE_MODEL}”
${OLLAMA_BIN} create “${TARGET_MODEL}” -f “${MODEFILE}”
${OLLAMA_BIN} show “${TARGET_MODEL}” | sed -n ‘1,80p’
SCRIPT
chmod +x create-qwen36-35b-mlx-agent-64k.sh
実行:
./create-qwen36-35b-mlx-agent-64k.sh
EmbedのモデルとQwen3-vlモデルをプルする。Qwen 3.xのMLXモデルは画像を見れないので、VLモデルを追加で必要。これ盲点だった。
ollama pull nomic-embed-text-v2-moe
ollama pull qwen3-vl:8b
確認:
ollama ls
NAME ID SIZE MODIFIED
qwen3-vl:8b 901cae732162 6.1 GB 2 hours ago
qwen3.6:35b-mlx-agent-64k 13bd6e8c78d9 21 GB 3 hours ago
qwen3.6:35b-mlx 1b50c6fdc2d4 21 GB 3 hours ago
nomic-embed-text-v2-moe:latest ff9c2f10ef5e 957 MB 7 hours ago
ollama run qwen3.6:35b-mlx-agent-64k –think=false “日本語で1文だけ返して”
承知いたしました。
ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen3.6:35b-mlx-agent-64k 13bd6e8c78d9 21 GB 100% GPU 262144 14 minutes from now
ちなみに–think=falseをつけないで実行すると
ollama run qwen3.5:9b-mlx-chat-64k “日本語と1文だけで返して”
Thinking… Thinking Process:
-
Analyze the Request:
-
User’s input: “日本語と1文だけで返して” (Reply in Japanese and only one sentence).
<略>
Thinkingモデルでもあるので、Thinkingが始まってしまう。実は、これが、Open WebUIが遅いと感じてしまう理由なのかもしれない。
Open WebUI Desktopのインストールと初期設定
以下からダウンロードをしてインストールする。
Macの場合は、Applicationにコピーをして、クリックするだけ。Dockerなどもいらない。一切事前準備は不要。WIndowsも同様、セットアップを実行するだけ。
注意点として、Open WebUI DesktopにもLlama.cppが付いているが、自分が試した限り、Ollamaで動かすモデルと同じモデルを動かすとなんとなく重い。さらにOllamaをすでにこの手順でいれているのでインストールしない、インストールをしたとしても起動させないでおく。
SettingsのOpen WebUIの設定では、Open WebUIのアップデートができるので、アップデートを行っておく。
Open WebUI Desktopの設定
接続先設定
Settings -> Connections
Connectionsでは、以下の2つを登録する。
Apfelの登録
OpenAI-compatible:
http://localhost:11435/v1
Ollamaの登録
Ollama:
http://localhost:11434 (デフォルトで設定済み)

設定したら必ず画面右下のSaveをクリックして保存する。
TASK Modelの設定
Settings -> Interface
チャットのタイトルなどを生成してくれる。
TASK_MODEL
apple-foundationmodel

設定したら必ず画面右下のSaveをクリックして保存する。
Modelの設定
Settings -> Models
qwen3.6:35b-mlx-agent-64kを使うので、ベースのqwen3.5:9b-mlxは使わないので無効にしても構わない。
qwen3.6:35b-mlx-agent-64kの設定
Agent AIとして動けるので、VisionとImage Generation以外は全てオンにしておく。

Advanced Params
毎度言っているが、Function Callingを必ずNativeに、Think (Ollama)をOffにしておく。

設定したら必ず画面下のSaveをクリックして保存する。
Quen3-vl:8bの設定
画像解析をするモデルなので、Visionを有効にして、不要なものをオフにしておく。

保存Advanced Paramの設定は不要。
設定したら必ず画面下のSaveをクリックして保存する。
Apfel (apple-foundationmodel)の設定
画像入力を受け付けず、単純なチャットしかできないので、以下のCapabilities設定にしておく。Advanced Paramsはデフォルトのままにしておく。

リックして保存
設定したら必ず画面下のSaveをクリックして保存する。
最終的には以下の構成が完成する。
推奨構成
Ollama (127.0.0.1:11434)
└─ apple-foundationmodel (TASK・軽量チャット)
Apfel (127.0.0.1:11435)
└─ qwen3.5:9b-mlx-chat-64k (チャット、Agent AI) / Qwen3-vl;9b (画像解析)
Open WebUI Desktop
└─ フロントエンド