OpenAIは、ターミナルで動作する軽量なコーディングエージェント「OpenAI Codex CLI」(以降、codexとする)をOSSで公開している。今回はこれを使えるように環境を整備していく。
codexの基本的なインストール、設定、使い方についてはcodex自身のREADMEに書いてあるので、そっちを読むと良いだろう。ここでは触りだけをかいつまんで書く事にする。
codexはTypeScriptで実装されている。そのため実行にはJavaScriptの処理系が必要となる。ここではNode.jsの22.x系とnpmを既にインストールしている事を前提とする。
codexをインストールする。
npm install -g @openai/codex
https://platform.openai.com/api-keysにアクセスし、APIキーを生成する。生成したAPIキーは環境変数 OPENAI_API_KEY
に設定する。
export OPENAI_API_KEY=DUMMY
codexは ~/.codex/
配下の設定ファイルを読み込むため、設定ファイルを作成する。
mkdir -p ~/.codex
touch ~/.codex/config.yaml
設定ファイルを編集する。
model: o3-mini
approvalMode: suggest
fullAutoErrorMode: ask-user
notify: true
safeCommands:
- npm test
- yarn lint
APIキーの設定と設定ファイルの設置ができたら、codexを実行する準備は整った。早速 codex
を起動する。
codex
codexが起動するとターミナル上に、入力及び出力用のインターフェースが表示される。あとはプロンプトを入力する場所に、プロンプトを入力しエンターを押すと処理が実行される。
本当に簡単だ。
codexはターミナル上で実行される事を想定しており、UIのベースにinkを使用している。これはReactのコンポーネントをターミナル上で使用可能なUIにするもので、当然だが制御コードがたくさん使われる事になる。通常のターミナルエミュレータであれば問題なく動作するが、Emacsの M-x shell
や M-x async-shell-command
で実行した場合、制御コードが上手く処理できない事もあるだろう。そういった場合には vterm
を使えば、正しく処理ができるため、 vterm
から codex
を起動するためのコマンドを書く事にした。
(defvar openai-codex-openai-api-key nil)
(defun openai-codex ()
(interactive)
(let* ((vterm-shell "/opt/homebrew/opt/node@22/bin/codex")
(exec-path (append
'("/opt/homebrew/opt/node@22/libexec/bin"
"/opt/homebrew/opt/node@22/bin")
exec-path))
(process-environment (append
`(,(format "OPENAI_API_KEY=%s" openai-codex-openai-api-key)
,(format "PATH=%s" (string-join exec-path ":"))
process-environment)))
(vterm-kill-buffer-on-exit nil))
(vterm)))
(provide 'openai-codex)
;;; openai-codex.el ends here
Emacsの素敵な所は、このような拡張が即座に作れる所だろう。