AI Git エージェントを作成して使用する方法

この進行中の Docker Labs GenAI シリーズ AI開発者ツールのエキサイティングな空間を探ります。 Dockerでは、誇大広告なしでオープンに探求できる広大な範囲があると信じています。 私たちは探索を共有し、開発者コミュニティとリアルタイムで協力します。 開発者はGitHub Copilotのようなオートコンプリートツールを採用し、チャットを使用していますが、AIツールがソフトウェアのライフサイクル全体を通じて、より具体的なタスクやインターフェースを支援する可能性は大いにあります。 したがって、私たちの探求は広範囲に及びます。 ソフトウェアをオープンソースとしてリリースするので、私たちと一緒にプレイしたり、探索したり、ハックしたりできます。

これまでの実験では、プロジェクトがすぐに取り組めるという前提で作業を始めました。 つまり、UIテクニカルライターのような人は、私たちが構築したツールを使用するためにGitの操作を理解する必要があります。 当然のことながら、Git については頻繁に触れてきたので、Git エージェントを起動してみたいと思いました。 次に、この Git エージェントを使用して、Git の詳細を誰も知らなくても、さまざまなユーザー ペルソナの PR ブランチを理解したいと考えています。

2400x1260 Docker Labs Genai

エージェントとしての Git

私たちは、ツールがエージェントであるという考えを探求しています。 では、Gitエージェントは何をするのでしょうか? 

では、UI のユースケースプロンプトに取り組みましょう。 

先に:

You are at $PWD of /project, which is a git repo.
Force checkout {{branch}}
Run a three-dot diff of the files changed in {{branch}} compared to main using --name-only.

ここに示されていない欠点は、認証がないことです。 したがって、そのブランチをまだフェッチしていない場合、またはコミットをプルしていない場合、このプロンプトはせいぜい信頼性が低く、失敗する可能性が高くなります (図 1)。

認証の失敗を示すログのスクリーンショット。
図 1: 認証は行われません。

今:

You are a helpful assistant that checks a PR for user-facing changes.
1. Fetch everything and get on latest main.
2. Checkout the PR branch and pull latest.
3. Run a three-dot git diff against main for just files. Write the output to /thread/diff.txt.

今回は、Git操作についてあまり明確でなく、出力を会話スレッドにエクスポートする機能があり、最も重要なのは、新しいプロンプトによる認証があることがわかります。

GitHub 認証の準備

手記: これらのプロンプトは他の Git プロバイダーに簡単に適応できるはずですが、ここでは Docker で GitHub を使用しています。

GitHubで何かをする前に、認証を行う必要があります。 これを行うにはいくつかの方法がありますが、この記事では、CLIを介してHTTPSを使用するのではなく、SSHベースの認証に焦点を当てます。 Git の世界に深く入り込むことなく、アカウントに関連付けられたマシン上のキーを使用して認証します。 これらのキーと構成は、通常、Linux/Mac の ~/.ssh にあります。 さらに、ユーザーは通常、Git 設定を ~/.gitconfig で維持します。 

.gitconfig ファイルは、キャリッジリターンルールを指定できるため、特に便利です。これは、Linux コンテナで実行するときに Git が簡単に失敗する原因となります。また、SSH設定を変更してUseKeychainを削除する必要があります。 これらの変更により、Alpine/Git で SSH を使用して認証するのに十分であることがわかりました。 しかし、もちろん、ホストの設定を変更するつもりはありません。

私たちは、ホストのSSH設定をいじることなく、コンテナでGitを使用する準備をするための非常に単純なフローを考え出しました。

  1. 読み取り専用マウント: Git 構成キーと SSH キーは、ホスト マシン上の特定のフォルダーに格納されます。 それらをマウントする必要があります。
    ある。/root/.ssh-base readonly として ~/.ssh をコンテナにマウントします。
    b. ~/.gitconfig/root/.gitconfig と同じコンテナにマウントします。
  2. /root/.ssh-base/root/.ssh にコピーし、新しいファイルを読み取り書き込み可能にします。
  3. 設定に必要な変更を加えます。
  4. LLM の場合、設定がスレッドにあり、変更が加えられたことを確認するためにも必要です。 正しい変更を行わなかった場合、LLMは自己修正できます。
  5. .sshをコピーします ディレクトリと.gitconfig/threadします。

これらはすべて、 GitHubで見つけて実行できるプロンプトに組み込まれています。 <username> をシステムのユーザー名に置き換えるだけです(図 2)。

マウントのスクリーンショット、git config キーと ssh キーのストレージを示しています。
図 2: 読み取り専用マウント。

VSCode の拡張機能でデフォルトの動作を使用している場合、 /thread/ ボリュームはエフェメラルであるため、Git ツールの前にエージェントがそれを実行していることを確認する必要があります。 ただし、VSCode で Set prompt thread ID コマンドを使用すると、 /thread ボリュームを独自のタグの下に保持できます (図 3)。 

スレッドにタグを付けると、プロンプトが完了した後もすべてが保持されるため、Git ツールの開発に進む前にプロンプトを一度実行するだけで済みます。

プロンプトスレッドIDの設定のスクリーンショット。
図 3: プロンプト・スレッドIDを設定します。

スレッドを永続化することを選択した場合、このプロンプトは 1 回だけ実行する必要があり、Git 資格情報はそのまま残ります (図 4)。

保存された構成情報を示すスクリーンショット。
図 4: 保存された資格情報データ。

資格情報の準備ができたので、それらを取得するためのGitツールが必要です。

container:
   image: alpine/git
   entrypoint:
     - /bin/sh
     - -c
   command:
     - "cp -r /thread/.ssh /root/.ssh && cp -r /thread/.gitconfig /root/.gitconfig && git --no-pager {{args|safe}}" 

コンテナ定義は、SSH 資格情報と SSH .gitconfig をコピーします Git コマンドを実行する前に、ファイルを正しいディレクトリにコピーしてください。

Unpacking objects:  90% (9/10)
Unpacking objects: 100% (10/10)
Unpacking objects: 100% (10/10), 4.14 KiB | 141.00 KiB/s, done.
From github.com:docker/repo
   abcd123..abcd123  main           -> origin/main
 * [new tag]           branch/v2982.0.0 -> branch/v2982.0.0
# ROLE assistant
I have fetched all origin branches. The latest updates have been applied to your local repository, and any new tags have been downloaded.
```
Now, we can see our Git tool is authenticated as if it were us.
Running the agent now, it can:
## ROLE assistant
I have run the git fetch --all command, which retrieves updates from all remotes. If you need further assistance with your Git repository, feel free to ask!
```

# ROLE assistant
```json
{"request":"checkout main"}
```

## ROLE assistant
```json
{"args":"checkout main"}
```

## ROLE assistant
You are already on the 'main' branch, and it is up to date with 'origin/main'.
```

# ROLE assistant
```json
{"request":"checkout the branch branch and pull latest changes."}
```

...
## ROLE assistant
The branch branch has been successfully checked out, and it's already up to date with the latest changes.
...

# ROLE assistant
```json
{"request":"Run a three-dot git diff against main and write the output for just files to /thread/diff.txt."}
```

...

## ROLE assistant
```json
{"args":"diff main... --name-only","outfile":"/thread/diff.txt"}
```

*entering tool*

## ROLE tool (git)
file1.tsx
file2.tsx
...
## ROLE assistant

The three-dot Git diff against the main branch has been executed, and the output has been saved to /thread/diff.txt. This includes the names of files that have differences.
``

新しい Git エージェントにより、アシスタントはアップストリームから新しい情報をフェッチし、ブランチを切り替え、新しいコードをプルしてレビューできるようになりました。 読み取り専用アクセスに制限された資格情報をエージェントに提供すると、このエージェントは、ローカルの Git インストールを持っていないユーザーによって使用される可能性があります。

Docker での取り組みの詳細については、 ニュースレターを購読してください。

さらに詳しく