はじめに:なぜ今、「自作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を「作る側」に回り、開発ワークフローを劇的に改善するきっかけとなれば幸いです。
“`
コメント