VS Code + Cline で ”Devin 風”開発を行う方法⑧ - エスカレーション準備編【Cline CLI + LiteLLM】

前回は「LangGraph」を使用して、Kanban 内部で行っていたループ処理を外部ループに移動しました。
今回は「LiteLLM」と呼ばれる、複数のLLM (大規模言語モデル) を統一的に扱うための軽量なプロキシ / ラッパーライブラリを使用して、Kanban 側では使用する「LLM モデル名を変更するだけ」でローカルとクラウド LLM の切り替えが行える仕組みを整えます。
LiteLLM を使用すると OpenAI 互換の API で、いろんな AI モデルをまとめて使えるようになります。

今回の記事では Kanban と Cline CLI から LiteLLM プロキシを使用して Ollama のローカルモデルを使用できるように設定していきます。
この記事で使用している実行環境は以下のようになっています。
- VS Code (Windows 版)・・・バージョン 1.134.0
- Node.js (Windows 版)・・・バージョン 24.15.0
- Cline・・・バージョン 3.0.48
- Kanban・・・バージョン 0.1.70
- Python・・・バージョン 3.12.13
- LangGraph・・・バージョン 1.2.10
- LiteLLM・・・バージョン 1.98.0
※本記事でご紹介している内容は、確立された手法ではなく著者の独自の解釈に基づいています。その点をご理解のうえご参照ください。
動作環境について
LiteLLM パッケージのインストール
今回も「Miniconda」と呼ばれる Python の環境管理ツールを使用しています。Miniconda のインストール方法はこちらの記事をご参照ください。
まず Anaconda PowerShell Prompt と呼ばれるターミナル画面を起動します。普通の PowerShell ターミナル画面でも問題ありませんが、専用のターミナルはプロンプトに現在の環境を表示してくれるのでわかり易いかもしれません。

Anaconda PowerShell Prompt に以下のように入力して、前回作成した langgraphv1.2 環境を有効化します。
conda activate langgraphv1.2次に以下のように入力して、LiteLLM プロキシ版パッケージをインストールします。
pip install 'litellm[proxy]'今回は使用しませんが、ライブラリ版の LiteLLM を使用したい場合は以下のパッケージをインストールします。LangGraph などから直接 LiteLLM 機能を利用できます。今回使用するプロキシ版はローカルネットワーク経由で利用します。
pip install litellmインストールが完了したら、以下のように入力してバージョンを確認しておきます。
litellm --version以上でパッケージのインストールは終了です。次に動作テストを行います。
LiteLLM の動作テスト
VS Code で任意のフォルダを開きます。「config.yaml」というファイルを作成して以下の内容を記述します。
Ollama にインストールされている任意のモデルが使用できますが、本記事の構成では「ollama_chat/」を追加してください。(一般的なサンプルでは「ollama/」が使用されています。「ollama_chat/」を使用している理由については「Cline CLI 設定」セクションをご覧ください。)
Ollama がリモート PC 上で実行されている場合は「api_base」項目にリモート PC の IP アドレスを設定してください。
model_list:
- model_name: ollama-gpt-oss:20b
litellm_params:
model: ollama_chat/gpt-oss:20b
api_base: http://localhost:11434設定が完了したら、VS Code でターミナル画面を開いて以下のように入力します。
litellm --config config.yaml正常に起動すると以下のような画面が表示されます。LiteLLM プロキシはデフォルトでは「localhost:4000」で起動します。

VS Code でもう一つターミナル画面を開いて、以下のコマンドを入力します。「model」名は LiteLLM の config.yaml ファイルで設定した「model_name」項目 (エイリアス) を入力します。
curl.exe http://localhost:4000/v1/chat/completions `
-H "Content-Type: application/json" `
-d '{
"model": "ollama-gpt-oss:20b",
"messages": [{"role": "user", "content": "Hello"}]
}'以下のような応答が返ってきたら、正常に動作しています。

ご使用の PC に curl というアプリが入っていない場合は、以下の PowerShell スクリプトでテストできます。
$body = @{
model = "ollama-gpt-oss:20b"
messages = @(
@{
role = "user"
content = "Hello"
}
)
} | ConvertTo-Json -Depth 10
$response = Invoke-RestMethod `
-Uri "http://localhost:4000/v1/chat/completions" `
-Method Post `
-ContentType "application/json" `
-Body $body
$response.choices[0].message.content以下のような応答が返ってくれば正常に動作しています。

以上で環境設定は終了です。
Kanban 設定
次に Kanban で LiteLLM を使用できるように設定していきます。Kanban を起動して
- 右上にある設定ボタンを押します。
- Settings 画面の左側メニューにある「Cline」を選択します。
- API provider から「Ollama」を選択します。
- Base URL に「http://localhost:4000/v1」(LiteLLM のアドレス) を入力します。
その他 API key は入力しなくても平気なようです。任意の文字列が入力できます。また、「Model ID」はこの段階では選択できません。次の操作を行うと選択できるようになります。

Settings 画面にある「Edit」をクリックします。

表示された画面で
- Model source URL に「http://localhost:4000/v1/models」と入力します。
- 「Update Provider」ボタンを押して閉じます。

以上で LiteLLM に登録されている「エイリアス名」が選択可能になります。Model ID ドロップダウンから使用したモデルを選択して「Save」ボタンを押すと設定されます。

Kanban Agent のプロンプト欄に「こんにちは」などと入力して実行してみると、正常に動作しているようです。

API provider は Ollama ですが、実体は LiteLLM プロキシなので以下のようなクラウド LLM の設定も追加しておくと

Kanban からはモデル名を変更するだけでクラウド LLM が利用できるようになります。

スクリプトからは「--cline-model」オプションを使用してモデル名を変更できます。必要であれば「--cline-provider」オプションでプロバイダも変更できるようです。
# タスク作成コマンド
kanban task create --prompt "test" --cline-model "gemma4:e4b"
# タスク修正コマンド
kanban task update --task-id "12345" --cline-model "gemma4:e4b"以上で Kanban の設定は終了です。
なぜ LiteLLM プロバイダを使用しないのか?
ここで少し不思議に思われるかもしれませんが、LiteLLM を使用しているにもかかわらず、Kanban 側では API provider に「Ollama」を指定しています。
もともと Kanban には「Litellm」という API provider が用意されています。

しかし、このプロバイダを使用すると「/v1/responses」という API が使用されるようです。

今回の環境では「/v1/chat/completions」を使用した場合は正常に動作しましたが、Kanban の LiteLLM プロバイダ から「/v1/responses」を使用すると、筆者の環境では「text part ... not found」というエラーが発生しました。

プロバイダの定義ファイルは「%USERPROFILE%/.cline/data/settings/providers.json」にあるので、OpenAI Chat Completions 形式を使用する独自 provider を追加する方法も試しましたが、Kanban 実行時に「Unknown or disabled provider」というエラーが発生して、あらかじめ登録されていないプロバイダは使用できませんでした。
そこで、OpenAI 互換 API を利用できる既存の Ollama provider の Base URL を LiteLLM に向けてみると現時点では上手く動作しましたので、この方式を採用しました。
Cline CLI 設定
せっかくなので「Cline CLI」からも LiteLLM を使用できるように設定していきます。
Cline CLI は、Cline のコーディングエージェント機能をコマンドラインから利用するためのツールです。プロンプトを渡すと、LLM がコードを調査し、必要に応じてファイル編集やコマンド実行などのツールを使用して作業を進めます。VS Code の画面操作を必要としないため、LangGraph や PowerShell、Python などの外部処理から呼び出して、自動化された開発ワークフローに組み込むことができます。
ファイル編集なども行えるので、試しに VS Code のターミナル画面から以下のコマンドを 実行して「test.md」というファイルが作成できるか試してみます。
cline "create test.md file."何かエラーが発生しています。

結論から先に書きます。以下のオプションを追加すると正常に動作します。
- 「-P」オプションで「litellm」プロバイダを指定する。
- 「-m」オプションで LiteLLM のモデル (エイリアス) を指定する。
cline -P litellm -m "ollama-gpt-oss:20b" "create test.md file."実行結果は以下のようになります。「test.md」というファイルが作成されています。

ここまでたどり着くまでかなり紆余曲折しましたので、備忘録として検証結果を記述します。
オプションが無いとなぜ動作しないのか?
先に結論を書くと、Cline CLI と Kanban はデフォルトで設定情報を共有しており、Kanban 側で Ollama provider の Base URL を LiteLLM に変更した設定が Cline CLI にも影響していました。
Kanban ではこの設定でも動作しますが、Cline CLI でははじかれてしまうようです。以下は検証した結果になります。
ターミナル画面に「cline config」と入力して Cline の設定画面を表示します。「Provider」と「Model」が Kanban に設定した値と同じなので、Kanban と同じ設定ファイルを使用していると思われます。

一旦 Kanban 設定を正規の Ollama 設定に戻しておきます。モデルも本当のモデルに戻します。

最初にエラーになったコマンドを再度実行してみます。
今度は成功しました。「test.md」ファイルが作成されています。筆者の環境では、Ollama provider に LiteLLM の Base URL を設定した構成のままでは Cline CLI が正常に動作しないようです。

他のモデルも試してみます。モデルが大きくて起動に時間がかかるためか、「Ollama request timed out after 30 seconds」というタイムアウトエラーが発生しています。

Cline CLI にはタイムアウトオプションがあるので、長めに設定してみましたが変わらないようです。

そこで LiteLLM に同じモデルのエントリーを追加して、プロバイダを LiteLLM に変更したところ正常に実行できました。タイムアウトも発生しませんでした。

Cline CLI では LiteLLM プロバイダを直接使用した方が良さそうです。
なぜ「ollama_chat/」を使うのか?
こちらも結論から先に書きます。LiteLLM で Ollama を使用する場合通常はモデル名の先頭に「ollama/」を追加しますが、筆者の環境では「ollama/」を使用した場合、「/api/generate」が使用され、Cline のファイル修正などの Tool Calling が正常に動作しませんでした。一方、「ollama_chat/」を使用すると 「/api/chat」が使用され、ツールが正常に実行されました。
以下は検証結果になります。
まず、「config.yaml」設定でモデルの先頭を「ollama/」に変更します。
model_list:
- model_name: ollama-gpt-oss:20b
litellm_params:
model: ollama/gpt-oss:20b
api_base: http://192.168.11.50:11434VS Code のターミナル画面に以下のように入力して、LiteLLM をデバッグモードで起動します。同時に「litellm.log」にも内容を書き出します。
$env:PYTHONUTF8 = "1"
$env:PYTHONIOENCODING = "utf-8"
litellm --config config.yaml --detailed_debug 2>&1 |
Tee-Object -FilePath litellm.logVS Code で別のターミナル画面を起動して Cline CLI コマンドを実行します。
cline -P litellm -m "ollama-gpt-oss:20b" "create test.md file."ログが非常に長いので特徴的な部分だけ抜粋します。モデルの先頭が ollama/ の場合は「/api/generate」という API が使用されるようです。ツール定義もプロンプトの中に埋め込まれています。
POST Request Sent from LiteLLM:
curl -X POST \
http://192.168.11.50:11434/api/generate \
-d '{'model': 'gpt-oss:20b', 'prompt': '### System:\n
...
### User:\n
create test.md file.\n
\n
', 'options': {}, 'stream': True, 'format': 'json', 'images': []}'Cline CLI 側もおそらく期待した形式と異なるメッセージのため、ファイルを作成するツールが呼び出されていないようです。

今度はモデル名の先頭を「ollama_chat/」に変更して、LiteLLM を再起動します。
model_list:
- model_name: ollama-gpt-oss:20b
litellm_params:
model: ollama_chat/gpt-oss:20b
api_base: http://192.168.11.50:11434先ほどと同じようにログを見ると今度は Ollama の「/api/chat」にリクエストが送信されています。さらに、Cline から渡されたツール定義が tools フィールドとして独立して送信されています。
「ollama/」使用時はツール情報がプロンプト側へ変換されていましたが、「ollama_chat/」では Ollama の Chat API に Tool Calling 用の情報として渡されていることが確認できました。
POST Request Sent from LiteLLM:
curl -X POST \
http://192.168.11.50:11434/api/chat \
-d '{
"model": "gpt-oss:20b",
"messages": [
{"role": "user", "content": "create test.md file."}
],
"stream": true,
"tools": [
{
"type": "function",
"function": {
"name": "read_files",
...
}
},
{
"type": "function",
"function": {
"name": "apply_patch",
...
}
}
]
}'Cline CLI 側でもツールが実行されて「test.md」ファイルが作成されているようです。

Kanban と Cline CLI の設定を分ける方法
これまでの検証で、Kanban と Cline CLI はデフォルトで設定ファイルを共有していることが分かりました。Cline CLI で「cline -P litellm -m "ollama-gpt-oss:20b"...」などと実行すると Kanban の設定も変わってしまうようです。
両方の機能を同時に使用したい場合に問題が起きる可能性があると思われますので、それぞれの設定を分離する方法をご紹介します。
ターミナル画面で「cline --help」と入力して、Cline のヘルプを確認すると「--config」と「--data-dir」という項目があり、Kanban とは独立して設定ファイルを持てるようです。
--config <path> Configuration directory (default: ~/.cline)
--data-dir <path> Use isolated local state at this directory path (default: ~/.cline/data)そこで新たに「.cline-litellm」というフォルダを作成して、設定に関連していると思われる「models.json」「providers.json」「globalState.json」あたりのファイルを .cline フォルダからコピーしておきます。
%USERPROFILE%/
└── .cline-litellm/
└── data/
├── settings/
│ ├── models.json
│ └── providers.json
└── globalState.jsonあとは Cline CLI 実行時に「--config」と「--data-dir」オプションを指定すれば、Kanban 設定とは独立した設定で実行できます。
cline `
--config "$env:USERPROFILE/.cline-litellm" `
--data-dir "$env:USERPROFILE/.cline-litellm/data" `
-P litellm `
-m "ollama-qwen3.6:35b-a3b" `
-t 600 `
"create test.md file."まとめ
今回は LiteLLM を導入し、Kanban と Cline CLI からローカル LLM を利用できる環境を構築しました。LiteLLM を共通のプロキシとして使用することで、ローカル LLM とクラウド LLM をモデル名の変更だけで切り替えられる構成に近づけることができました。
また、Cline CLI を LiteLLM 経由で使用できるようになったことで、Cline が持つファイル編集・コード検索・コマンド実行などの機能を、LangGraph や PowerShell、Python などの外部処理から直接利用できるようになりました。
Cline CLI は外部プログラムから同期的に実行でき、終了コードや実行結果を直接取得できます。そのため、これまでのように Kanban のタスク状態を監視して処理完了を判定する方法よりも、ワークフローを単純化できる可能性があります。
また、ユーザーインターフェイスが必要ない処理では、Kanban を経由せず LangGraph から Cline CLI を直接呼び出す構成も考えられます。この場合、Kanban のタスク管理や監視ループを省略できるため、よりシンプルなエージェントループを構築できそうです。
今回の構成によって、使用するモデルを切り替えるだけでローカル LLM からクラウド LLM へ移行できる土台ができました。次回は、この仕組みを利用して、ローカル LLM で処理できなかった場合に、より高性能なモデルへ自動的に切り替えるエスカレーション処理を実装していきます。
今回は以上となります。



