Copilot SDK で AI 同士を会話させる

AI

はじめに

今回は「2 つの Copilot インスタンスに同じテーマについて会話させる」というハンズオンを通じて、Copilot SDK の基本的な使い方を紹介します。

実装したデモは以下のリポジトリで公開しています。

Copilot SDK とは

Copilot SDK は GitHub が提供する公式 SDK で、Copilot の機能をプログラムで利用できるようにするパッケージです。
現在は以下の言語で利用可能です。

  • Node.js / TypeScript: @github/copilot-sdk
  • Python: github-copilot-sdk
  • Go: github.com/github/copilot-sdk/go
  • .NET: GitHub.Copilot.SDK

デモアプリの概要

ai-talk-room は起動すると会話のテーマとターン数を対話的に入力でき、Copilot A と Copilot B がそのテーマを起点に互いに応答し合う様子を表示します。

会話のテーマ/最初のメッセージを入力してください: 意識とは何か
会話のターン数を入力してください (デフォルト: 6): 4

=== Copilot 同士の会話 (モデル: gpt-4.1, 4ターン) ===

Copilot A: 意識とは...
Copilot B: 興味深い視点ですね...
...
=== 会話終了 ===

セットアップ

必要な環境は以下のとおりです。

  • Node.js
  • GitHub Copilot へのアクセス権を持つ認証済みの GitHub アカウント
git clone https://github.com/shutils/ai-talk-room.git
cd ai-talk-room
npm install
npm start

起動後にプロンプトが表示されるので、会話のテーマと何ターン会話させるかを入力します。途中で止めたい場合は Ctrl+C で中断できます。

コードの解説

クライアントの起動とセッション作成

CopilotClient を生成して start() を呼び出すとクライアントが起動します。その後 createSession() でセッションを作成します。セッションごとにシステムメッセージを設定することで、それぞれの AI に異なる役割を与えられます。

const client = new CopilotClient();
await client.start();

const sessionA = await client.createSession({
  model: "gpt-4.1",
  streaming: true,
  systemMessage: {
    mode: "replace",
    content:
      "You are Copilot A, an AI assistant engaged in a lively " +
      "intellectual conversation with another AI called Copilot B. " +
      "Respond thoughtfully, build on the other's points, and keep each reply to 2–4 sentences.",
  },
  onPermissionRequest: permissionHandler,
});

sessionB も同様に作成し、システムメッセージだけ変えています。2 つの独立したセッションを持つことで、それぞれが独自の会話履歴を保持します。

ターンを交互に回す

一方の返答を次のターンの入力として渡すことで、会話が成立します。

let currentMessage = topic;

for (let i = 0; i < turns; i++) {
  const isATurn = i % 2 === 0;
  if (isATurn) {
    currentMessage = await sendAndCollect(sessionA, currentMessage, "Copilot A");
  } else {
    currentMessage = await sendAndCollect(sessionB, currentMessage, "Copilot B");
  }
  await new Promise((r) => setTimeout(r, 300));
}

終了処理

セッションとクライアントを破棄します。SIGINT ハンドラで Ctrl+C 時にもクリーンアップが走るようにしています。

process.on("SIGINT", async () => {
  await sessionA.destroy();
  await sessionB.destroy();
  await client.stop();
  process.exit(0);
});

まとめ

@github/copilot-sdk を使うとCopilotのセッションの機能が使えるので、基本的な会話の機能を実装せずに済むため簡単にAIアプリケーションを構築できます。
今回は2つのAIを会話させるという遊び的なデモでしたが、同じ仕組みを応用すれば多段階のレビューや自動的なコード生成パイプラインなど、より実用的なユースケースにも活用できそうです。

コメント

タイトルとURLをコピーしました