ChatGPTを使って何か作ってみようということで掲題のコマンドを作ってみた
こんな感じの結果が返ってくる
$ 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
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;
rubygemやnpmみたいに上げなくてもコマンドが使える
setup.pyを用意するだけ
今回作ったやつは次のコマンドでインストールできる
pip install git+https://github.com/swfz/what_recent.git
おわり
- GitHubのEvent APIの内容から必要な箇所を抜き出し最近の活動とした
- ChatGPTに最近の活動を投げどんな活動をしているか要約し、興味関心についても言及するようにした
pip install
でコマンド実行できるようにした
PublicなAPIを使っているのでもちろんプライベートでの活動は見えないので、参考程度って話ではあるけどこの人最近どんなことしているのかな?と気になったらぜひ使ってみてください