はじめに:なぜ今、「自作AI CLI」なのか?
2025年、私たちはWarpやGhost-CLIなど、数多くの優れたAI搭載CLIツールに囲まれています。しかし、既製品のツールには「あと少し、ここがこうだったら…」というかゆいところに手が届かない瞬間も少なくありません。
- 特定の定型作業を、もっと短いコマンドで実行したい。
- チーム独自のコーディング規約をチェックさせたい。
- 個人的なナレッジベースを検索させたい。
こんな時、最も柔軟かつ強力な解決策が「自分だけのAI CLIを自作する」ことです。
この記事では、モダンなPythonライブラリであるTyperとOpenAI APIを使い、わずか1時間で実用的なAIコマンドラインアシスタントをゼロから開発する全手順を、ハンズオン形式で解説します。AI CLIを「使う側」から「作る側」へ、最初の一歩を踏み出しましょう。
なぜTyperなのか?CLIライブラリ比較
PythonにはいくつかのCLIライブラリがありますが、2025年現在、Typerが最も推奨される選択肢の一つです。
| ライブラリ | 特徴 | 長所 | 短所 |
|---|---|---|---|
argparse |
標準ライブラリ | 追加インストール不要 | 記述が冗長になりがち |
Click |
デコレータベース | 柔軟で強力 | Typerよりは記述量が多い |
Typer |
型ヒントベース | 記述量が最小、強力な補完 | 比較的新しい |
Typerは、Pythonのモダンな機能である「型ヒント」をそのまま利用してコマンドの引数やオプションを定義するため、直感的でコードが非常にクリーンになります。
ステップ1:プロジェクトのセットアップ(10分)
まずは開発環境を整えます。
-
プロジェクトフォルダ作成と仮想環境の構築
bash
mkdir my-ai-cli
cd my-ai-cli
python -m venv venv
source venv/bin/activate -
必要なライブラリのインストール
bash
pip install typer openai python-dotenv richtyper: CLIフレームワークopenai: OpenAI APIクライアントpython-dotenv: APIキーを安全に管理rich: 出力をリッチにする(任意)
-
APIキーの設定
プロジェクトルートに.envファイルを作成し、OpenAIのAPIキーを記述します。
.env
OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ステップ2:TyperでCLIの骨格を作る(15分)
main.pyというファイル名で、CLIのエントリーポイントを作成します。
# main.py
import typer
from rich.console import Console
# TyperアプリケーションとRichコンソールを初期化
app = typer.Typer()
console = Console()
@app.command()
def ask(prompt: str):
"""AIに質問をします。"""
console.print(f"🤖 あなたの質問: {prompt}")
# ここにAIとの連携処理を追加する
ai_response = f"「{prompt}」に対するAIの応答です。"
console.print(f"[bold green]AIの応答:[/bold green] {ai_response}")
if __name__ == "__main__":
app()
動作確認:
ターミナルで実行してみましょう。
python main.py "こんにちは、AI!"
askというコマンドが自動で定義され、引数promptが受け取れていることがわかります。
ステップ3:OpenAI APIと連携する(25分)
いよいよAIの頭脳を組み込みます。
# main.py (全体)
import os
import typer
from openai import OpenAI
from dotenv import load_dotenv
from rich.console import Console
from rich.panel import Panel
# .envファイルから環境変数を読み込む
load_dotenv()
# TyperアプリケーションとRichコンソールを初期化
app = typer.Typer()
console = Console()
# OpenAIクライアントを初期化
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
@app.command()
def ask(
prompt: str = typer.Argument(..., help="AIへの質問内容")
):
"""AIに質問をします。"""
console.print(Panel(f"[bold blue]🤖 あなたの質問[/bold blue]\n{prompt}", title="入力", border_style="blue"))
with console.status("[bold yellow]AIが応答を生成中...[/bold yellow]"):
try:
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "あなたは優秀なアシスタントです。簡潔かつ的確に回答してください。"},
{"role": "user", "content": prompt}
]
)
ai_response = response.choices[0].message.content
console.print(Panel(f"[bold green]✅ AIの応答[/bold green]\n{ai_response}", title="出力", border_style="green"))
except Exception as e:
console.print(f"[bold red]エラーが発生しました:[/bold red] {e}")
if __name__ == "__main__":
app()
主な変更点:
– dotenvでAPIキーを安全に読み込みます。
– OpenAIクライアントを初期化します。
– askコマンド内でclient.chat.completions.createを呼び出し、AIからの応答を取得します。
– richのPanelとstatusを使い、見た目をリッチにしています。
最終的な動作確認:
python main.py "PythonのTyperライブラリの主な利点を3つ教えてください。"
これで、コマンドラインから直接AIと対話できる、あなただけのAIアシスタントが完成しました。
まとめと次のステップ:自作ツールを育てる楽しみ
今回は基本的なAIアシスタントを作成しましたが、自作ツールの可能性は無限大です。
- 機能拡張: 会話履歴を保持する、ファイルの内容を読み込ませる、特定のコマンド(例:
git commit -mのメッセージ生成)に特化させる。 - ローカルLLM連携:
Ollamaと連携させ、オフラインで動作するプライベートAI CLIに改造する。 - パッケージ化:
pyproject.tomlを設定し、PyPIに公開して世界中の開発者に使ってもらう。
この記事が、あなたがAI CLIを「作る側」に回り、開発ワークフローを劇的に改善するきっかけとなれば幸いです。
“`

コメント