notebook

都内でWEB系エンジニアやってます。

GitHubのEventAPIとChatGPTを使って「この人最近何しているの?」が分かるコマンドを作った

ChatGPTを使って何か作ってみようということで掲題のコマンドを作ってみた

swfz/what_recent

github.com

こんな感じの結果が返ってくる

$ what_recent swfz
28件のサマリー対象Activityがありました
26件の未対応Activityがありました
46件のbotによるActivityがありました
assistant: 最近の活動を見ると、swfz氏はNode.jsやDenoに興味があることがわかります。また、GitHub APIやその他のツールを使って自動化やデータの取得を行っていることから開発効率化にも関心があると考え
られます。

具体的には、`swfz/sandbox`リポジトリでslackの投稿を取得したりマージする機能を開発したりしています。この取り組みの難易度は中程度と見られます。

また、`swfz/swfz`と`swfz/tools`リポジトリでは、GitHubのcontribution情報を表示するツールの開発に取り組んでいます。特に`swfz/tools`では長期間のcontribution情報取得に関する問題を抱えていて、それ
を解決するためにAPIをForkして改修しました。これは高度な取り組みであり、難易度は高いと言えます。

また、`kawarimidoll/deno-github-contributions-api`リポジトリでは、日付範囲を指定してcontribution情報を取得できる機能を提案し、それが実装されました。

以上の活動から、swfz氏は開発効率向上やデータ取得に関心があり、それらの課題解決のために積極的に新たな技術を習得し取り組んでいることがわかります。

構成要素

やっていることは下記

  • GitHubのEventAPIを使い特定ユーザーの直近の活動(イベント)情報を取得
  • 必要項目だけ抜き出し、まとめ、ChatGPTに投げる

GitHubのEvent API

Events - GitHub Docs

GitHubでの活動によって引き起こされるさまざまな種類のイベントを取得できるAPI

実際に取得できるイベントの種類は下記を参照

GitHub event types - GitHub Docs

  • PullRequest作った
  • Issue作った
  • PullRequestにレビューコメントした
  • Pushした
  • どこかのリポジトリにStarした
  • どこかのリポジトリをForkした
  • どこかのリポジトリをWatchした

などのイベントを取得できる

PRの中身、Issueの中身、Commitコメントなどが載っているのでそれをいい感じにまとめて(RenovateやdependabotによるEventも含まれるのでそういうのを除くなど…)ChatGPTに投げるテキストを生成する

CommitのDiffまで見たかったがこのAPIだけだとDiffまでは取得できず、Commitのデータの中のURLからたどらないと取得できない、なのでCommitごとにリクエストしなければならず

IPごとのRateLimit30分60回?くらいにすぐ引っかかってしまうので断念した

ChatGPT

プロンプト含め次のようなコードになった

def activities_summary(activities):
    model = os.getenv('OPENAI_MODEL', 'gpt-3.5-turbo')
    system_content = """
これからGitHubでのリポジトリとどんなことをしたかのテキストを渡します
これらをまとめて、最近の活動についてまとめてください
また、下記制約を守った出力をしてください
- どういう技術に興味がありそうなのか
- 取り組みの難易度を記載する
- 活動の要約についてはプルリクエストではどんなことをやったのかが読みたいです、ブランチを作った、Forkしたなどは省略してください
- リポジトリ名に関しては`swfz/dotfiles`のようにスラッシュ前の文言も含めてください
"""

    text = "\n".join(list(map(lambda a: f"リポジトリ:{a['repository']}\n{a['changes']}", activities)))

    system_prompt = {"role": "system", "content": system_content}

    res = openai.ChatCompletion.create(
        model=model,
        temperature=0.9,
        messages=[
            system_prompt,
            {"role": "user", "content": text }
        ])

    role = res.choices[0]["message"]["role"]
    content = res.choices[0]["message"]["content"]

    print(f"{role}: {content}")

    return content
  • 実行ごとに結果のフォーマットが変わる
  • 制約守ってくれないときがある

など、まだプロンプトの改善余地はありそう

pipインストールでコマンド実行できるようにした

下記記事を読んで「そんなことができるのか!」と感じたので自分でも真似てやってみた

Pythonで作ったCLIツールをGitHubから直接pipでinstallできるようにする方法 - $shibayu36->blog;

blog.shibayu36.org

rubygemやnpmみたいに上げなくてもコマンドが使える

setup.pyを用意するだけ

今回作ったやつは次のコマンドでインストールできる

pip install git+https://github.com/swfz/what_recent.git

おわり

  • GitHubのEvent APIの内容から必要な箇所を抜き出し最近の活動とした
  • ChatGPTに最近の活動を投げどんな活動をしているか要約し、興味関心についても言及するようにした
  • pip install でコマンド実行できるようにした

PublicなAPIを使っているのでもちろんプライベートでの活動は見えないので、参考程度って話ではあるけどこの人最近どんなことしているのかな?と気になったらぜひ使ってみてください