Vポイントマーケティング|TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

Codex CLIの利用ログをDatabricksのMLflow Experimentsに記録する。

こんにちは、VポイントマーケティングAIエンジニアの三浦諒一です。

最近CodexやClaude、Github Copilotなどのコーディングエージェントを使っていると、本当にたくさんのツールを呼び出してタスクを解こうとしている様子が伺えます。そのおかげで複雑なタスクをコーディングエージェントに任せることができるのですが、一方でこのターンでいったい何をしたのかが振り返りにくくなってきているな、と感じるようにもなりました。もしかしたら自分が把握していないところで外部と通信をしていたり、意図していないファイルを変更してるかもしれません。

さらに、もしコーディングエージェントを大勢で利用していくことを考えるとコーディングエージェントが「何を実行したのか」を振り返ることができないと色々と困る点も出てきてしまいます。

そんな課題を解決するアイデアとして、DatabricksのMLflowを利用する方法を今回試してみました。コーディングエージェントとしてCodex CLIを使ったのですが、この方法によってCodex CLIでコーディングエージェントとやりとりした内容やツールの実行履歴などを自動的に記録することが出来るようになります。

この検証では学習用途で無料で使用できるDatabricks Free Editionを利用しました。本番運用の環境ではありませんが、ちょっと試してみたい、という用途であれば最適な環境だと思います。

www.databricks.com

セットアップ

セットアップは以下を見ながら進めました。

mlflow.org

また、今回はDatabricksでホストされているMLflow Serverを使用します。Databricks CLIを使うとトークンを書かずに認証することが出来るので、事前に入れておきました。

docs.databricks.com

まず、MLflow用のCodex CLI統合パッケージをインストールします。

npm install -g @mlflow/codex

Codex CLIで開発を行うプロジェクトフォルダ内で以下を実行すると、MLflowトレーシングの設定が開始されます。

mlflow-codex setup

いくつか対話形式で設定を進めます。MLflowトレーシングの設定の対象範囲はデフォルトの"Project"で進めました。

? Where should MLflow tracing be installed?
  ● Project  ./.codex/  (default)
  ○ User  ~/.codex/

プロジェクト配下に.codex/config.tomlが生成されます。次にMLflowサーバーのURLと記録するExperimentのIDを聞かれます。一旦DatabricksのURL、Experiment ID(DatabricksのUIでExperiment作成後、ExperimentのページのURLのexperiments/に続く数列です)を入力しました。

MLflow tracking URI [http://localhost:5000] https://dbc-xxxxxxx.cloud.databricks.com
MLflow experiment ID [0] xxxxxxxxxxxxxxx

さて、実はこのままの設定だとCodex CLIを起動した時に以下のエラーメッセージが表示されてしまいます。

Ignored unsupported project-local config keys in /Users/xxx/Dev/codex-test/.codex/config.toml: notify. If you want these settings to apply, manually set them in your user-level config.toml.

これは先ほどのセットアップ中に生成された.codex/config.tomlの以下の箇所が原因です。プロジェクト内のCodex CLIの設定にはnotifyが設定できない仕様のようです。

notify = ["mlflow-codex", "notify-hook"]

ですので一旦.codex/config.tomlからこの設定を削除し、ユーザー側の設定~/.codex/config.tomlにnotifyの設定を追記する必要がありました。

ところが私のmacOSの環境ではすでに以下のようにnotifyの設定がされていたため、この設定を活かしつつMLflow用の設定を追加する必要がありました。

notify = ["/Users/xxxx/.codex/computer-use/Codex Computer Use.app/Contents/SharedSupport/SkyComputerUseClient.app/Contents/MacOS/SkyComputerUseClient", "turn-ended"]

そこでまず~/.codex/bin/notify-all.shというシェルファイルを以下のような内容で作成しました。

#!/bin/bash

# Codexは通知イベントのJSONを最後の引数として渡す。
# "$@" により、その引数を変更せず両方の通知先へ転送する。

COMPUTER_USE_CLIENT="/Users/xxxx/.codex/computer-use/Codex Computer Use.app/Contents/SharedSupport/SkyComputerUseClient.app/Contents/MacOS/SkyComputerUseClient"
MLFLOW_CODEX="/opt/homebrew/bin/mlflow-codex"

# Codex Computer Useへの通知
"$COMPUTER_USE_CLIENT" "turn-ended" "$@"
computer_use_status=$?

# MLflowへの通知
"$MLFLOW_CODEX" notify-hook "$@"
mlflow_status=$?

# 一方が失敗しても、もう一方は必ず実行する。
if [ "$computer_use_status" -ne 0 ]; then
  echo "Codex Computer Use notification failed: $computer_use_status" >&2
fi

if [ "$mlflow_status" -ne 0 ]; then
  echo "MLflow notification failed: $mlflow_status" >&2
fi

# notifyの失敗でCodex本体へ影響を与えない
exit 0
EOF

その後~/.codex/config.tomlのnotify設定を以下に変更しました。

notify = ["/Users/xxxx/.codex/bin/notify-all.sh"]

その後は、Databricks CLIでログインを行います。

databricks auth login --profile my-dbs-profile

ブラウザで認証した後、必要な環境変数をセットしてCodex CLIを起動します。以降は会話を行うたびに指定のMLflowのExperimentに自動的にログが記録されるようになりました。

export MLFLOW_TRACKING_URI=databricks                  
export MLFLOW_EXPERIMENT_ID=xxxxxxxxxxxxxxx
codex

ログを見てみる

DatabricksのWebUIにアクセスをし、Experimentsから作成したExperimentに入るとCodexへの入力ごとにTraceが生成されていることがわかります。

Codex CLIとのやりとりがTraceとして記録されています。

Traceを開くと実行された処理の詳細を見ることが出来るようになっています。

グラフによってわかりやすく可視化もされています。

例えばCodexのnotify設定について調べる際にはrgコマンドをツールとして実行し、Codexの設定ファイルから"notify"を検索しようとしている履歴を確認することができました。

どんなツールが使われたのかも詳細に確認できます。

このようにしてMLflowにCodex CLIとのやりとりをTraceとして記録することで、何か問題が発生した際、具体的に何が実行されたのかの詳細をわかりやすく確認することができるようになります。

まとめ

DatabricksのMLflowを使ってCodex CLIとのやりとりを自動的に記録する方法についてまとめてみました。コーディングエージェントを使う上で欲しかった機能だったので、今後はチームでも活用していきたいと思いました。