PythonでもGitHub Copilot Extensions作れるもん!

準備用カンペ

  • GitHubのDeveloper settings を開く

    • GitHub Appの「Copilot」メニューを編集できるようにしておく(認証が必要になる)

  • 共有はデスクトップ

PythonでもGitHub Copilot Extensions作れるもん!

Event:

みんなのPython勉強会#110 LT

Presented:

2024/11/14 nikkie

お前、誰よ

../_images/uzabase-white-logo.png

GitHub Copilot Extensionsって、何よ

聞いたことありますか?🙋‍♂️

GitHub Copilotは様々な機能を搭載(進化中!)

コード補完:

Tab を押すだけ!(少し直す)

チャット:

ChatGPTがVS Codeやgithub.comに住んでいるイメージ。色々聞けちゃう

GitHub Copilot とは何ですか?

🏃‍♂️ご参考

GitHub Copilot Extensions

Extension=拡張

チャット相手 =エージェント

  • GitHub Copilot Extensionsで実現

  • @docker: Docker専門エージェント

  • 🏃‍♂️*VS Code チャット拡張機能* というものもあるが、本LTではスコープ外

Copilot 拡張機能の構築について

GitHub Copilot Extensions🤖

  • GitHubが提供する LLM を使って実装できる(エンドポイント /chat/completions

  • 例えば特定のリポジトリでRAGをするエージェント(プライベートのコードベースで)

服部さんの発表で知りました

実装例

Python でもGitHub Copilot Extensions作れるもん!

得意なPythonを使いたい...!

  • Hello worldにあたる blackbeard-extension

  • 海賊黒ひげとしてChatに応じる(※ONE PIECEではない)

  • Node.jsによる実装

blackbeard-extension (Node.js) 抜粋

// https://github.com/copilot-extensions/blackbeard-extension/blob/11b5a9abaec14f57ee1c92350bf64553411deb02/index.js#L7-L48
app.post("/", express.json(), async (req, res) => {
  const payload = req.body;
  const messages = payload.messages;
  messages.unshift({
    role: "system", content: "You are a helpful assistant that replies to user messages as if you were the Blackbeard Pirate.",
  });
  // Chatのユーザの入力にシステムプロンプトを加え、LLMに返答を生成させる
  const copilotLLMResponse = await fetch(
    "https://api.githubcopilot.com/chat/completions",
    // 省略
  )
  Readable.from(copilotLLMResponse.body).pipe(res);
})

Pythonでもできました✌️(FastAPI❤️)

# https://github.com/ftnext/blackbeard-extension-python/blob/56ae295c54e2241645382a8a027a81316072b43b/app.py#L10-L40
@app.post("/")
async def stream(request: Request, x_github_token: str = Header(None)):
    payload = await request.json()
    messages = payload["messages"]
    messages.insert(
        0, {"role": "system", "content": "You are a helpful assistant that replies to user messages as if you were the Blackbeard Pirate."})

    def pass_generator():
        with httpx.stream(
            "POST", "https://api.githubcopilot.com/chat/completions", headers=headers, json=data,
        ) as response:
            # response.iter_lines() を yield

    return StreamingResponse(pass_generator(), media_type="text/event-stream")

簡単に動かせます!

Demo https://github.com/ftnext/blackbeard-extension-python

まとめ🌯 PythonでもGitHub Copilot Extensions作れるもん!

  • Copilot Chatのエージェントを作れるGitHub Copilot Extensions

  • 海賊黒ひげ拡張をPythonで実装 してみました

  • OpenAIのGPTsのようなものをプログラミングで作っている感覚でとってもワクワク

ご清聴ありがとうございました

blackbeard-extension-python お試しあれ!

☠️ゼハハハハ☠️