gemini-pro に GitHub Discussions の本文を要約してもらう
GitHub Actions を使用して、gemini-pro (ジェミナイ-プロ) に Discussions の本文を要約してもらうワークフローを作成しました。
gemini-pro が作成したこの記事の要約
This GitHub workflow uses the gemini-pro model from Google Vertex AI to summarize the body of a discussion on GitHub. When a discussion is locked, the workflow is triggered and uses the Google Cloud OIDC authentication to generate a summary of the discussion body using the gemini-pro model. The summary is then printed to the console. The workflow requires the Google Cloud OIDC authentication to be set up and uses the @google-cloud/vertexai npm package to call the Vertex AI API.
成果物
workflowファイル
.github/workflows/discussion.yml
name: "disscussion summarizer"
on:
discussion:
types: [locked]
jobs:
summarize:
runs-on: ubuntu-latest
permissions:
contents: read
issues: write
id-token: write
steps:
- name: setup-node
uses: actions/setup-node@v4
with:
node-version: "20"
- name: checkout
uses: actions/checkout@v4
- id: get-token
uses: google-github-actions/auth@v2
with:
token_format: "access_token"
workload_identity_provider: "projects/{アカウント番号}/locations/global/workloadIdentityPools/github-actions-workflow-pool/providers/github-actions-workflow-provider"
service_account: "github-actions-workflow@{プロジェクトID}.iam.gserviceaccount.com"
- run: npm i @google-cloud/vertexai
- name: summarize
id: summarize
uses: actions/github-script@v7
with:
script: |
const { VertexAI } = require("@google-cloud/vertexai");
const body = context.payload.discussion.body;
// Initialize Vertex with your Cloud project and location
const vertex_ai = new VertexAI({
project: "{プロジェクトID}",
location: "asia-northeast1",
});
const model = "gemini-pro";
// Instantiate the models
const generativeModel = vertex_ai.preview.getGenerativeModel({
model: model,
generation_config: {
max_output_tokens: 8192,
temperature: 0.9,
top_p: 1,
},
});
const generateContent = async () => {
const req = {
contents: [
{
role: "user",
parts: [
{
text: `Provide a brief summary for the following discussions:
${body}
`,
},
],
},
],
};
const streamingResp = await generativeModel.generateContentStream(req);
const response = await streamingResp.response;
return response.candidates[0].content.parts[0].text;
};
return await generateContent();
- run: echo ${{ steps.summarize.outputs.result }}
Google Cloud の OIDC 認証の設定
OIDC 認証の設定 はこちらの記事を参考とさせていただきました。
使用するロールとして、roles/aiplatform.user
を設定しました
詳細
IAM Service Account Credentials API の有効化
% gcloud services enable iamcredentials.googleapis.com --project={プロジェクトID}
サービスアカウントを作成
gcloud iam service-accounts create "github-actions-workflow" --project={プロジェクトID}
GitHub Actions から使用するリソースロールを付与
gcloud projects add-iam-policy-binding {プロジェクトID} \
--member="serviceAccount:github-actions-workflow@{プロジェクトID}.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
- 今回は Vertex AI の gemini-pro を使用するので、
roles/aiplatform.user
を付与しました
プールを作成
gcloud iam workload-identity-pools create github-actions-workflow-pool \
--location="global"
--project={プロジェクトID} \
プロバイダを作成
gcloud iam workload-identity-pools providers create-oidc github-actions-workflow-provider \
--location="global" \
--workload-identity-pool=github-actions-workflow-pool \
--attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository,attribute.actor=assertion.actor" \
--issuer-uri="https://token.actions.githubusercontent.com"
--project={プロジェクトID} \
Workload Identity プールからサービスアカウントのアクセス権を借用できるようにする
gcloud iam service-accounts add-iam-policy-binding \
"github-actions-workflow@{プロジェクトID}.iam.gserviceaccount.com" \
--role="roles/iam.workloadIdentityUser" \
--member="principalSet://iam.googleapis.com/projects/{アカウント番号}/locations/global/workloadIdentityPools/github-actions-workflow-pool/attribute.repository/{GitHubアカウント名}/{GitHubリポジトリ名}"
--project={プロジェクトID} \
GitHub Actions
Goole Cloud の OIDC 認証を使用する
google-github-actions/auth@v2 を使用して、作成したサービスアカウントのアクセストークンを取得します。
- id: get-token
uses: google-github-actions/auth@v2
with:
token_format: "access_token"
workload_identity_provider: "projects/{アカウント番号}/locations/global/workloadIdentityPools/github-actions-workflow-pool/providers/github-actions-workflow-provider"
service_account: "github-actions-workflow@{プロジェクトID}.iam.gserviceaccount.com"
Discussions のイベントをトリガーに設定する
Discussions を使用して議論メモを書いた後、 lock conversation
で Discussions をロックすると、Discussions のイベントがトリガーされます。
on:
discussion:
types: [locked]
-
github.event.discussion.body
で Discussions の本文を取得できます。
Vertex AI の gemini-pro を呼び出す
Google Cloud のコンソールにサンプルコードが表示されるので、こちらを参考とします。
@google-cloud/vertexai
を使用して、APIを叩けば良さそうです。
SDK の公式ドキュメントを参考に、actions/github-script 内の script にベタ書きしました。
参考: https://github.com/googleapis/nodejs-vertexai?tab=readme-ov-file#streaming-content-generation
- run: npm i @google-cloud/vertexai
- name: summarize
id: summarize
uses: actions/github-script@v7
with:
script: |
const { VertexAI } = require("@google-cloud/vertexai");
const body = context.payload.discussion.body;
// Initialize Vertex with your Cloud project and location
const vertex_ai = new VertexAI({
project: "{プロジェクトID}",
location: "asia-northeast1",
});
const model = "gemini-pro";
// Instantiate the models
const generativeModel = vertex_ai.preview.getGenerativeModel({
model: model,
generation_config: {
max_output_tokens: 8192,
temperature: 0.9,
top_p: 1,
},
});
const generateContent = async () => {
const req = {
contents: [
{
role: "user",
parts: [
{
text: `Provide a brief summary in English for the following discussions:
${body}
`,
},
],
},
],
};
const streamingResp = await generativeModel.generateContentStream(req);
const response = await streamingResp.response;
return response.candidates[0].content.parts[0].text;
};
return await generateContent();
現状、generateContentStream
のレスポンスに含まれる日本語が文字化けするため、英語で要約してもらっています。
(関連Issue: https://github.com/googleapis/nodejs-vertexai/issues/78)
やってみた
Discussions として適切ではありませんが、機能検証のため、本記事のここまでの部分を作成したワークフローで要約してみました。
GtiHub の Discussions に貼り付け、lock conversation
で Discussions をロック時にGitHub Actions が実行され、記事冒頭の通りの要約が生成されました。
まとめ
- GitHub Actions から Vertex AI の gemini-pro を呼び出すワークフローを作成しました。
- Google Cloud のコンソールにコードサンプルが表示されるのは嬉しいですね。
Discussion