こんにちは、ナナオです。
前回Gemini CLIをセットアップしましたが、今回はOpenCodeとGeminiを組み合わせて最強のコーディング環境を手に入れようと思います。
初期設定
まずはOpenCodeをインストールします。
miseでインストール可能です。
mise use -g opencode
使用するプロバイダを選択します。
Geminiを使いたいので、Googleを選択します。
❯ opencode auth login
┌ Add credential
│
◆ Select provider
│ Search:
│ ○ OpenCode Zen
│ ○ Anthropic
│ ○ GitHub Copilot
│ ○ OpenAI
│ ● Google
│ ○ OpenRouter
│ ○ Vercel AI Gateway
│ ...
│ ↑/↓ to select • Enter: confirm • Type: to search
└
APIキーを入力して完了です。
❯ opencode auth login
┌ Add credential
│
◇ Select provider
│ Google
│
◇ Enter your API key
│ ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
│
└ Done
opencode auth listで追加したプロバイダにGoogleがいることを確認します。
❯ opencode auth list
┌ Credentials ~/.local/share/opencode/auth.json
│
● Google api
│
└ 1 credentials
┌ Environment
│
● Google GEMINI_API_KEY
│
└ 1 environment variable
opencodeコマンドで/modelsコマンドをたたいてみましょう
デフォルトで使用するモデルがGemini 3 Pro Previewであることが分かります。
ここでは無料で使えるGemini 2.5 Flash Liteに変更しておきます。
プロジェクトの初期化
任意のプロジェクトで以下の初期化コマンドを実行します。
今回は遊びで使っている以下のpythonプロジェクトを初期化します。
.
├── .gitignore
├── .python-version
├── .venv
├── README.md
├── pyproject.toml
├── src
│ └── python_playground
│ └── __init__.py
└── uv.lock
/initコマンドを実行して、AGENTS.mdが生成されるのを待ちましょう。
普通に命令すると英語でAGENTS.mdが生成されるので、日本語にするようにお願いします。
生成されたコードは以下の通りです。
このドキュメントは、 このプロジェクトは、プロジェクトメタデータに 注意: 以下のツール ( Ruff を使用してすべての Python ファイルをリントする: このコマンドは、プロジェクト全体で一般的なエラーやスタイル違反を検出するために高速なリンティングを実行します。 Black を使用してすべての Python ファイルを自動的にフォーマットする: このコマンドは、すべての Python ファイルを Black の独自のスタイルに準拠するように再フォーマットします。Black が再フォーマットする可能性のある問題を Ruff が修正することを望む場合は、 自動修正で Ruff を実行する: このコマンドは、Ruff によって検出されたリンティングの問題を自動的に修正しようとします。 Pytest を使用してすべてのテストを実行する: このコマンドは、プロジェクト内のすべてのテストを検出し、実行します。 特定のファイル内のテストを実行する: 例: ファイル内の単一のテスト関数を実行する: 例: 詳細な出力と失敗したテストの詳細を表示してテストを実行する: 失敗したテストのデバッグに役立ちます。 このセクションでは、このPythonプロジェクト内で従うべき一般的なコードスタイルガイドラインを概説します。 pythonの実装は以下のディレクトリで行ってください。 テストは以下のディレクトリで行ってください。生成されたAGENTS.md
python-playground のエージェントガイドライン
python-playground リポジトリ内で動作するエージェントコーディングエージェントの規約、コマンド、およびベストプラクティスを概説します。これらのガイドラインに従うことで、一貫性、保守性、および効率的なコラボレーションが保証されます。
1. ビルド、リント、テストコマンド
pyproject.toml を使用しています。特定のスクリプトは定義されていませんが、一般的なPython開発プラクティスに基づいて、以下のコマンドを推奨します。ruff、black、pytest、build) は、まだ存在しない場合、グローバルまたはプロジェクト固有の仮想環境にインストールする必要があるかもしれません。pip を使用してインストールできます。pip install ruff black pytest build
1.1. ビルドコマンド
python -m build
dist/ ディレクトリにソースおよびホイール配布パッケージを作成します。1.2. リンティングとフォーマット
python -m ruff check .
python -m black .
black の前に ruff --fix を実行することをお勧めします。python -m ruff check . --fix
1.3. テストコマンド
python -m pytest
python -m pytest <path/to/test_file.py>
python -m pytest tests/test_example.pypython -m pytest <path/to/test_file.py>::<test_function_name>
python -m pytest tests/test_example.py::test_additionpython -m pytest -v -s --tb=short
2. コードスタイルガイドライン
2.1. 一般原則
ruff のようなリンターや black のようなフォーマッターを使用して、その多くを自動的に強制します。2.2. インポート
from my_package.module import MyClass) が、兄弟モジュールには相対パスインポートも許容されます (例: from . import another_module)。from module import *) は避けてください。2.3. フォーマット
") を優先し、二重引用符で囲まれた文字列内の文字列リテラルには単一引用符 (') を優先するか、Black のようなフォーマッターによって強制される場合は一貫したスタイルを使用します。2.4. 型
typing モジュール (例: List、Dict、Optional、Union、Any) の型を使用します。2.5. 命名規則
lowercase_with_underscores.pylowercase_with_underscoresCamelCase (例: MyClass)lowercase_with_underscores (例: my_function、calculate_total)lowercase_with_underscores (例: my_variable、user_name)UPPERCASE_WITH_UNDERSCORES (例: MAX_RETRIES)_private_method、_internal_variable)。二重アンダースコア (__) は名前マングリング用であり、特に必要な場合を除き、一般的に避けるべきです。2.6. エラー処理
Exception ではなく、特定の例外をキャッチします。print ステートメントではなく、logging モジュールを使用してエラー報告とデバッグを行います。2.7. 作業ディレクトリ
src/python_playground
tests
とりあえずこれで良さそうです。
特に重要なのが以下のルールです。
2.7. 作業ディレクトリ
pythonの実装は以下のディレクトリで行ってください。
src/python_playground
テストは以下のディレクトリで行ってください。
tests
指示している内容がちゃんと読み込まれたなら、実装はsrc/python_playground内に格納されるはずです。
実験してみます。
以下のようなプロンプトを打ってみます。
lsと同じような動作をするファイルをリストするコマンドを標準ライブラリで実装してください。
ということで、実装がどこに吐かれたか確認してみると。。
プロジェクトのルートディレクトリに吐かれていました。。
これではAGENTS.mdの意味がない!!
その後、プロンプトを変更してやっと出力してくれました。
AGENTS.md自体は読み込んでいるようですが、なんか勝手に読み飛ばしちゃうみたいですね。うーん。。
コードの修正を行う際はもっと役に立つのでしょうか?
ということで実験。
以下のような実装をsrc/python_playground/free_1.pyとして保存しました。
name = "nanao"
print(f"Hello, {nana}")
nameがタイポしているので出力ができません。
このエラーを修正できるのでしょうか?
が、ここで制限に達してしまいました。
仕方ないのでGLM-4.7というモデルに切り替えました。
直してくれました!
もしかして、Geminiよりこいつのほうが有能か…?
以下のプロンプトをこのモデルで試してみます。
lsと同じような動作をするファイルをリストするコマンドを標準ライブラリで実装してください。
おお!?こちらのほうが聞き分けがいい!!
ls.pyとして実装されていました。やったー。
感想
Geminiはすぐ制限に達してしまいますし、使用しているモデルが古いせいかうまく作業ディレクトリなどのAGENTS.mdに書かれている内容を認識してくれませんでした。
比較するとGLM-4.7は結構優秀です。無料だし。
ということで個人で使う分にはOpenCode + GLM-4.7が強いかもしれないです。
参考
OpenCodeとGLM 4.7で無課金コーディングエージェント体験 - きしだのHatena
OpenCode + Gemini 2.5 Pro: BYE Claude Code! I'm SWITCHING To the FASTEST AI Coder! - YouTube