GX10上のQwen、OpenClaw Gateway、Telegram配送経路を抽象的に表したテックビジュアル

Article

GX10上のQwenをOpenClawのLLMバックエンドにしようとして、最後はTelegram配送にハマった

2026年5月22日
8 min read
ローカルAI
#ASUS Ascent GX10#Qwen#OpenClaw#Telegram#Tailscale#ローカルLLM

前回は、Mac Studio上のGemma 4とGX10上のQwenを直接APIで比べた。結果だけ見ると、GX10 Qwenはかなり速かった。

そうなると次にやりたくなるのは、実際にOpenClawのバックエンドにすることだ。自分がローカルLLMを使いたい場面は、単発のベンチマークではなく、OpenClawやAtlasのような日常の道具の中に入っている。

ただ、ここで分かったのは、モデルに届くことと、Telegram上のOpenClawエージェントとして自然に返事が見えることは別物だ、ということだった。

やりたかった構成

目標はかなりシンプルだった。

Telegram / OpenClaw
  -> OpenClaw Gateway
  -> OpenAI-compatible API
  -> GX10上のQwen

OpenClawは別のMac miniで動いている。GX10はローカルAI専用機として置いている。なので、OpenClaw側からTailnet経由でGX10上のQwenを叩けるようにしたかった。

これが動くと、Mac Studioに載せているGemma 4に頼らず、OpenClawやAtlasのLLM負荷をGX10側に逃がせる。GX10を買った理由のかなり大きな部分がここにある。

まずQwenをOpenAI互換APIとして出す

この時点で試していたのは、Qwen系のGGUFモデルを llama.cpp CUDA serverで出す経路だった。

公開用にパスや実ホスト名を伏せると、起動はだいたい次のような形になる。

llama-server \
  -m <model-path>/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf \
  --alias qwen3.6-35b-a3b,gx10-qwen \
  --host <gx10-tailnet-ip> \
  --port 18081 \
  -ngl 999 \
  -c 262144 \
  --jinja \
  --reasoning off \
  -fa on \
  --parallel 1

最初は64K contextで起動していた。しかし、OpenClawの実セッションではシステムプロンプト、ツール定義、履歴がまとめて乗る。単発チャットのつもりで見積もると、すぐ足りなくなる。

実際に64Kでは次のようなエラーに当たった。

request (65555 tokens) exceeds the available context size (65536 tokens), try increasing it

そこでQwenサーバ側のcontextを増やし、OpenClaw側のモデル設定も広げた。最終的には、モデル側で見えていた余裕に合わせて 262144 まで上げている。

ここでの学びは単純で、OpenClawのようなエージェント環境では「モデルが64K対応」と言っても安心できない。実際に投げるプロンプトは、普通のチャットUIよりずっと重い。

Gateway経由のmodel.runは通った

ネットワーク経路は、Tailnet経由でOpenClawホストからGX10へ向ける形にした。

OpenClaw host
  -> http://<gx10-tailnet-ip>:18081/v1
  -> GX10 llama.cpp Qwen server

この状態で、OpenClaw Gateway経由の安全なモデル実行は通った。

{
  "ok": true,
  "capability": "model.run",
  "transport": "gateway",
  "provider": "gx10",
  "model": "gx10-qwen",
  "outputs": [
    {
      "text": "OK"
    }
  ]
}

つまり、Mac miniからOpenClaw Gatewayを通してGX10上のQwenを呼ぶ、という下の層は動いていた。

この時点で「できた」と言いたくなる。ただ、実際にはここからが面倒だった。

GX10 QwenとOpenClaw/Telegramの接続経路

Telegramグループでは返事が見えなかった

問題は、TelegramグループでOpenClawエージェントとして返答が見えるかどうかだった。

切り分けると、状況はこうだった。

状態
GX10上でQwenを起動 できた
OpenAI互換APIとしてモデル情報を返す できた
Tailnet経由でOpenClawホストから到達 できた
OpenClaw provider/model登録 できた
Gateway経由の model.run できた
Telegramグループで自然に返信表示 ここでハマった

最初は、モデルが返していないのか、OpenClawが受け取っていないのか、Telegramへ配送できていないのかが見えにくかった。

さらに良くなかったのは、実Telegramグループのセッションに短いテストプロンプトを流してしまったことだ。このとき tool_choice: required を付けていたため、モデルが OK を繰り返すような挙動になった。これは完全に検証手順のミスだった。

以後、モデル疎通はTelegram配送を伴わない model.run で確認することにした。実ユーザーの見える場所で、低レイヤーの疎通テストをするべきではない。

原因はモデル到達ではなく表示ルール側だった

その後、セッションをリセットして短いメッセージを送ると、Qwenは実際には日本語の返答文を生成していた。

ただし、OpenClaw側のグループ表示設定が次の状態だった。

{
  "messages": {
    "groupChat": {
      "visibleReplies": "message_tool"
    }
  }
}

この設定では、グループに見える返答は message tool経由のものに限られる。ところが、tool_choice: required を外したQwenは普通のassistant本文を返した。つまり、返答自体はセッション内に残るが、Telegramグループには出てこない。

そこで表示設定を次のように変えた。

{
  "messages": {
    "groupChat": {
      "visibleReplies": "automatic"
    }
  }
}

このあたりで、やっと「モデルに届いていない」のではなく「モデルの返し方とOpenClawの表示ルールが噛み合っていない」問題だと見えてきた。

直APIの成功とアプリとしての成功は違う

今回の一番大きい教訓はこれだ。

curlで返る
model.runで返る
OpenClawのセッションに残る
Telegramグループで見える
日常利用で期待通りに振る舞う

これらは全部違う。

ローカルLLMを単体で動かすだけなら、OpenAI互換APIの /v1/models/v1/chat/completions が返ればかなり満足できる。だが、OpenClawの中ではモデルは単なるテキスト生成器ではない。

実際には、次のような要素が絡む。

  • provider/model設定
  • context windowとtoken上限
  • tool callingの形式
  • assistant本文を返すのか、message toolを使うのか
  • Gatewayのtransport
  • Telegramグループで何を表示するか
  • 実セッションの履歴とリセット状態

直APIで速く返ることは重要だ。ただ、それだけではOpenClawのバックエンドとして完成したとは言えない。

この時点での判断

この段階では、GX10 Qwenにはかなり可能性を感じていた。

特に前回の比較では、Mac Studio Gemma 4よりかなり速く、基本的なtool callの小テストも通っていた。軽い対話や単純なtool選択には向いていそうだった。

一方で、実用バックエンドとしてはまだ慎重に見た方がいい。

観点 この時点の見方
速度 有望
直API疎通 成功
Gateway経由のmodel.run 成功
Telegram表示 設定と返答形式の切り分けが必要
長いOpenClaw文脈 64Kでは足りず、context拡張が必要
デフォルト採用 まだ早い

モデルを起動して返事が出ると、つい「統合できた」と思いたくなる。しかし、今回のようにエージェント、tool、チャット配送が絡むと、成功判定を層ごとに分けないと危ない。

その後に続く話

このあと、GX10上のQwenはさらに別の経路でも試している。GGUF/llama.cppだけではなく、vLLMでHugging Faceモデルを直接出す方向にも進んだ。画像入力やtool callingの扱いも含めると、話はさらに変わる。

なので、この記事で言える結論は限定的だ。

GX10上のQwenはOpenClaw Gateway経由で呼べるところまでは来た。ただし、Telegramグループで自然に使えるかは、モデル到達とは別の表示・tool経路の問題として切り分ける必要があった。

ローカルLLM専用機の評価は、tok/sだけでは終わらない。モデル、runtime、context、tool calling、そして最後に人間が見るチャット画面まで含めて、ようやく「使える」と言える。

今回ハマったのは、まさにその最後の部分だった。

注意点

最後に、今回の話の前提をまとめておく。

  • これは手元環境での実験ログであり、一般的なOpenClaw設定すべてに当てはまる話ではない。
  • 公開記事ではTailnet IP、LAN IP、ホスト名、個人パス、チャットIDなどは伏せている。
  • model.run の成功は、Telegram配送や実アプリ利用の成功とは分けて考える必要がある。
  • 64K contextで足りなかったのは、OpenClawの実セッションが重かったためで、単発チャットの評価とは別。
  • tool_choice: required を実Telegramグループの疎通確認に使ったのは悪い検証手順だった。

次は、QwenとGemma 4をGX10上で載せ替えながら見えた、ローカルLLM専用機としての現実をまとめる。