AI Codingのplandexを無料で使おうとしたが難しそう

# コマンドラインによるAI Coding

plandexは、いわゆるAI Codingツールで、大規模プロジェクトや大規模ファイルに対応していることを謳っています。

>大規模プロジェクト、大規模ファイル、大規模タスクに対応できるよう設計された、オープンソースのターミナルベースのAIコーディングエージェントです。差分レビューサンドボックス、フルオートモード、最大200万トークンのスマートコンテキスト管理機能を備えています。

https://plandex.ai/

　なぜRooCodeではなく、このようなコマンドラインツールが欲しいか。というと、RooCodeだと、VSCodeが占有されてしまう。という問題があって、自分がPC開いているときにしか動かせないという欠点があります。そのため、作業を並列化したかったり、作業している間、自分もVSCodeで作業したい。という要件だったり、あとは、コーディングしている間、はらはらして見続けるためにほかの作業が進まない。といった問題がありました。そんな中でVSCodeを占有しないタイプのAI Codingツールが欲しい。という気持ちになりました。
　VSCodeを使わないタイプのAI Codingで有名なのは、古くはOpenInterpreter、Claude Code、[Devin](https://devin.ai/)や[Manus](https://manus.im/)なのですが、やはりお値段が・・・となってしまいます。オープンソースの実装であると、OpenDevinことOpenHandsがあります。

https://www.all-hands.dev/

しかし、OpenHandsにも欠点があり、一番厄介なポイントでいうと、

>良いプロンプトは次のとおりです。
>
>具体的: 追加する必要がある機能や修正が必要なエラーを明確に説明します。
>場所固有: コードベース内で変更する必要がある場所がわかっている場合は指定します。
>適切な範囲: 通常は 100 行のコードを超えない、単一の機能に重点を置きます。

https://docs.all-hands.dev/modules/usage/prompting/prompting-best-practices#characteristics-of-good-prompts

公式ドキュメント曰く、100行程度の改修が最適のようです。そのため、少し大きな機能を依頼することはできなさそうです。これは感覚的にもあっていて、何度か触っていますが、結構失敗率は高いため、手放しにはできない。という感触があります。あと、まだまだバグが多く、環境変数を読み込まず、設定が反映されない。そのために、自分で改造する。みたいなめちゃめちゃ厄介なことを自分でしました。
　そんなわけで、自分で考えて、戦略を考え、コーディングしてくれるplandexには期待があり、触ってみたかった。というのが思惑でした。**しかし、うまくいかなかった。というところが現状でした。**

# plandexのインストール

plandexはドキュメントもあり、ローカルで簡単に立ち上げる分には公式ドキュメントを読めばよいです。

https://docs.plandex.ai/hosting/self-hosting/local-mode-quickstart

しかし、ある理由によりこれを使わず、自前で立ち上げています。そもそも、こういった不安定なソフトウェアを自分の環境にグローバルインストールすると、別のものが壊れたり、あとでアップデートするときにゴミが残って非常に厄介な目にあうことがあります。そのため、Docker内に影響を閉じ込めたいという気持ちがありました。
ドキュメントを読むと、

```
git clone https://github.com/plandex-ai/plandex.git
cd plandex/app
./start_local.sh
```

という風に立ち上げると書かれていました。中の処理を見ていると、DockerComposeを立ち上げているだけです。

https://github.com/plandex-ai/plandex/blob/main/app/docker-compose.yml

こいつを改造して動かしました。

<details>
<summary>改造したcompose.yml</summary>

```yml
services:
  plandex-postgres:
    image: postgres:latest
    restart: always
    environment:
      POSTGRES_PASSWORD: plandex
      POSTGRES_USER: plandex
      POSTGRES_DB: plandex
    ports:
      - "5432:5432"
    volumes:
      - plandex-db:/var/lib/postgresql/data
    networks:
      - plandex-network
  plandex-server:
    image: plandexai/plandex-server:latest
    volumes:
      - plandex-files:/plandex-server
    ports:
      - "8099:8099"
    environment:
      DATABASE_URL: "postgres://plandex:plandex@plandex-postgres:5432/plandex?sslmode=disable"
      GOENV: development
      LOCAL_MODE: 1
      PLANDEX_BASE_DIR: /plandex-server
    networks:
      - plandex-network
    depends_on:
      - plandex-postgres
    command: [ "/bin/sh", "-c", "/scripts/wait-for-it.sh plandex-postgres:5432 -- ./plandex-server" ]
  dev:
    container_name: wdev
    image: ubuntu:24.10
    ports:
      - "7860:7860"
    networks:
      - plandex-network
    tty: true
    volumes:
      - .:/work/
    command:
      bash -c '
      apt update &&
      apt install -y curl  &&
      curl -sL https://plandex.ai/install.sh | bash &&
      sleep infinity'

networks:
  plandex-network:
    driver: bridge

volumes:
  plandex-db:
  plandex-files:
```

</details>

　割と変だな。と思うこともありました。それは、使い勝手として、わざわざgitをcheckoutさせて、それでシェルを実行させるのは割と古典的な方法だな。という印象がありました。しかし、コードを見ることで、そもそもplandexは実行にPostgreSQLを必要とするため、ワンライナーのdockerでは書けないからこういう構成なんだな。と思いました。
　個人的な改造としては、とりあえず同一ネットワークに作業用のubuntuのコンテナを用意し、そこにplandexのCLIツールをインストールして、コーディング環境を用意しました。

# plandexの立ち上げ方

自分が無料で使いたい。という気持ちと、対象としていたプロジェクトの都合上、結構やることがありました。

ubuntuコンテナとplandexのサーバーを連携させるためにサインインが必要です。この時に、`http://plandex-server:8099`を設定します。

```
$ pdx sign-in
```

plandexはLLMの接続先に、OpenAIとOpenRouterが選べます。無料のLLM枠があるOpenRouterを私は設定しました。

```
$ export OPENROUTER_API_KEY="**************************************"
```

https://openrouter.ai/

https://docs.plandex.ai/hosting/self-hosting/local-mode-quickstart

環境変数から読み込むので、compose.ymlに書いたり、.envに書くほうがきれいかもしれません。

plandexにはいろいろなLLMモデルがOpenRouter経由で使えるのですが、無料で使えるものが限られているため、その部分は自分で登録する必要があります。今回は、Gemini-2.0-flash-expを登録しました。

```
$ pdx
\models add
openrouter
google/gemini-2.0-flash-exp:free
google/gemini-2.0-flash-exp:free
Max Tokens: … 10000000
Default Max Convo Tokens: … 15000
Max Output Tokens: … 8192
Reserved Output Tokens: … 8192
Preferred Output Format: Tool Call JSON
Is multi-modal image support enabled? (y)es | (n)o> n
```

MaxTokensだけ気にすればよいです。OpenRouterにcontext windowのサイズがあるので、これを入れているだけです。あとは大体類推で入れてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/c9d324c8-cdcd-44bb-a037-f1ae0d08a121.png)

https://openrouter.ai/google/gemini-2.0-flash-exp:free

次に、model-packsというものを作ります。

```
$ pdx model-packs create
```

https://docs.plandex.ai/cli-reference#model-packs-create

plandexは複数のAI Agentと協調して動きます。そのため、複数のAI AgentのLLMモデルを指定する必要があります。そのため、内部のAI Agentを設定してやる必要があります。ここでは、このmodel-packsをfreeと名付けました。また、無料枠で動かしたかったので、`google/gemini-2.0-flash-exp:free`をモデルとして指定し、パラメーターはデフォルト値があるのでそれをそのまま入れていきます。

そして、モデルの設定を反映させます。

```
$ pdx
\set-model
> 🎛️  choose a model pack to change all roles at once
Custom | free
```

自分は完全自動操縦させたかったので、その設定を入れました。

```
$ pdx
\set-auto full
```

https://docs.plandex.ai/core-concepts/autonomy

あとは、実行するだけです。

```
$ pdx
\tell
HelloWorldを実装してください
```

# ContextWindow問題

 自分は、そこまで規模の大きくない個人プロジェクトを対象にしていましたが、動きませんでした。pythonのプロジェクトでフォルダに.venvがあったため、それを全部読みに行こうとしていたみたいです。plandexは自分で勝手にプロジェクトに必要なコンテキストを用意してくれるのですが、あまりにも大きすぎると、LLMに処理を投げた際、遅かったり、エラーで返ってくるので、ContextWindowを絞る必要があります。

https://docs.plandex.ai/core-concepts/context-management

したがって、一度忘却させたのち、必要なファイルだけ読み込むようにしました。

```
$ pdx
\clear
\load src --map
```

# 無料で使えるLLMがない？

ここまでGemini-2.0-flash-expを利用してきましたが、これでは動きません。実際に実行してみると以下のような画面が出ます。

```
 🏗  Build incomplete
📄 src/processor.py ⠴

🚨 Error during plan description model call
  → Error creating chat completion stream
    → Status code
      → 404, body: {"error":{"message":"No endpoints found that support tool use. To learn more about provider routing, visit
        → Https://openrouter.ai/docs/provider-routing","code":404}}
```

　どういうことかというと**Tools useに対応しているモデルでなければ、plandexは動かない**ようです。ここで、無料かつTools useに対応しているopenRouterのモデルは何か。という話になると、

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/858d884d-7df6-4eea-a50b-5f7de05d9eb3.png)

現時点ではこの4種になります。

https://openrouter.ai/models?max_price=0&fmt=cards&supported_parameters=tools

とても少ない。ここでは、無料で使う戦術が2つあります。

1. OpenRouterの無料枠
2. Fallbackによる無料枠

OpenRouterには無料モデルの無料枠があります。ただし、無料モデルの場合でも、完全無課金の場合は1日当たり50リクエスト。10クレジットの課金で1000リクエストに制限されます。

https://openrouter.ai/docs/api-reference/limits

一方でここを回避する方法もあり、それがFallbackです。

https://openrouter.ai/settings/integrations

integrationの画面から、特定のLLMプロバイダーのAPIキーを入力することで、OpenRouterの上限が来ても、API Keyで自動的にFallbackしてくれる機能があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/bab22584-4430-419f-a1b9-07552a42fa81.png)

なので、楽な方法としては、

1. OpenRouterでGeminiを選択
2. OpenRouterの無料枠の上限に引っかかる
3. GeminiのAPIキーを登録しておく
4. GeminiのAPIキーの無料枠を利用する

が割とすんなりいく方法だと考えていました。しかし、

- Google: Gemini 2.5 Pro Experimental　→　最低10クレジットの課金を要求
- Google: Gemini 1.5 Flash 8B Experimental →　この2,3日まともに稼働しておらず、リクエストがそのそも失敗する。OpenRouterのチャットも動かない。

という感じでGoogle周りはダメでした。では、Mistral系はどうか？というと、これはあまり情報がない、chutesというプラットフォームでした。

https://chutes.ai/

無料枠の存在すらよくわからなかったですが、APIキーは発行できたので、それをFallbackとして実行してみました。

- Mistral: Mistral Small 3.1 24B (free) → リクエスト自体は失敗しないが、レスポンスが返ってこない
- Mistral: Mistral Small 3.1 24B (free) → Fallbackが機能せず、Rate Limited Errorが発生し、実行できない

というわけで、全方向をふさがれた感じです。

# まとめ

　というわけで、色々と頑張ってみたのですがダメでした。多分課金を10クレジット分すれば、OpenRouterでも動かすことはできると思います。ただ完全無料はダメそうでした。一応、他にも逃がしようがあるんですが、疲れたんでいったんこの辺にしておきます。そもそもplandex触ってる人が少なすぎて、ここまで動かすまで大変だったんで・・・
　結構、誤算があって、OpenHandsは割とローカルでスムーズに動いたんですよね。そして、リトライだけ調整すれば、Geminiでもきれいに動いたので、そこに問題はありませんでした。したがって、無料でやるならGeminiでやるのがいいだろう。と。しかし、plandexが基本的にはOpenAIかOpenRouter経由でしか触らない設計だった。無料枠はOpenRoterにしかない。plandexでは、OpenHandsでは特に問題にならなかったTool Use必須の問題があった。Tool Use+OpenRouterの無料モデルという組み合わせが極めて少なかった。と、あらゆる地雷を踏みぬいた気がします。疲れた・・・