5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub Copilotのコスト管理(AIクレジット対応版)

5
Last updated at Posted at 2026-08-06

グロースエクスパートナーズグループのリレーブログ3日目担当のやすばです。
前回の記事は「認識の差をすり合わせながら、未経験メンバーが「自主的に動く」ようになるまで」でした。
若手リーダー視点のメンバー育成についての記事です。
まだご覧になっていない方は、ぜひそちらもチェックしてみてください!

GitHub Copilotは、2026年6月にこれまでのPremium request方式から、AIクレジットを消費する課金方式に変わりました。
それに合わせて各モデルのコストは大きく値上げされており、ライセンスの月額費用の枠内だけでAIの効果を示すことはかなり難しくなり、従量課金のコントロールが必要になりました。

こうなると「GitHub Copilotのライセンス」の管理だけでは済みません。従量課金分をどこまで許容するのか、誰にどれだけ使わせるのかを、組織として予算面から管理する必要が出てきます。

この記事では、弊社で行っているGitHub Copilotの予算管理と管理者の負担を減らすための仕組みについて紹介します。

コスト管理の考え方

内容 上限に達したときの挙動 備考
A Organization全体のコストの上限 組織全体で利用停止 基本的にはすぐに上限緩和を行う
B 各個人共通の上限 個人レベルで利用停止 Cが設定されている場合はCに従う
C Bの更なる上限緩和 個人レベルで利用停止

個人は実態として従量課金相当になるため、(B)で全体の利用量をコントロールして(C)で個別事情にも対応します。
Organization全体としては、
(個人の従量課金金額の合計) - (Copilotライセンス契約数)×(ライセンスの月額費用相当)
が請求されることになり、この費用を(A)で上限設定を行います。(A)の上限は利用量を監視するための目的で設定しており、上限になっても長時間停止させるのは業務上問題があるため、すぐに上限を再度緩和するようにしています。

ライセンスの月額費用相当 は、Businessプランの場合は19ドルです。
2026年8月までは移行期間のため、Businessの無料クレジットは30ドル分となっています。

設定方法(管理画面)

(A) Organization全体のコストの上限

管理者画面の、Setting > Access > Billing and Licensing > Budgets and alerts から設定します。

組織のbudget設定

(B) 各個人共通の上限

(A)と同様に、管理者画面の、Setting > Access > Billing and Licensing > Budgets and alerts から設定します。Budget scopeを Users に切り替え、 Universal 設定として作成します。

個人共通のbudget設定

(C) Bの更なる上限緩和

(B)と同じ画面で、Individual user の設定に切り替えれば設定は可能です。 Universal設定より Individual userが優先される仕様になっています。

ただ、上限緩和申請が行われるたびに管理画面を手作業で操作するのは非常に手間がかかります。また、依頼のログを残したいという理由もあり、この部分を改善する仕組みを作りました。

作った仕組み

以下のような流れで(C)の設定を行います。

設定した内容は当月のみ有効として、毎月リセットします。月次リセットは別のワークフローとして動かします。

あわせて、(4) 現在の請求予定額を毎日Slack通知する仕組みも入れて金額推移を監視しています。

(1) 上限緩和申請用Issue Template

(C)の申請にはGitHub Issue Templateを使います。
Issue Templateで必要な情報を入力してもらうようにしておくと、申請内容の粒度をそろえやすくなります。

Issue Template

.github/ISSUE_TEMPLATE/set-copilot-budget.yml
name: Set Copilot Budget
description: GitHub Copilot / AI Credits の User スコープ予算設定を依頼する
title: "GitHub Copilot 個別予算設定: {users}"
labels:
  - set-copilot-budget
body:
  - type: input
    id: reason
    attributes:
      label: 理由
      description: 共通の閾値を超過して利用したい理由を記入してください。
    validations:
      required: true
  - type: textarea
    id: users
    attributes:
      label: 対象ユーザー
      description: "GitHub ユーザー名を @ 付きで、1  1 ユーザーで指定してください。# 以降はコメントとして無視されます。"
      placeholder: |
        @alice
        @bob
    validations:
      required: true
  - type: input
    id: amount
    attributes:
      label: 月額予算 USD
      description: 月額上限を USD で指定してください。
      placeholder: "100"
    validations:
      required: true

(2) 上限を設定するslash command

Issue Templateのコメントで /set-copilot-budget apply と入力すると動くような GitHub Actionsを作成します。
呼び出し部分は以下のようなコードになります。slash commandは誰でも入力できてしまうため、組織オーナーのみが指示できるようにしています。各自の運用に合わせてif文を修正してください。

.github/workflows/set-copilot-budget.yml(抜粋)
on:
  issue_comment:
    types:
      - created

permissions:
  contents: read
  issues: write

jobs:
  set-copilot-budget:
    if: >-
      ${{
        github.event.issue.pull_request == null &&
        github.event.comment.author_association == 'OWNER' &&
        contains(github.event.issue.labels.*.name, 'set-copilot-budget') &&
        startsWith(github.event.comment.body, '/set-copilot-budget')
      }}
    # 以下略

予算を設定するスクリプトはPythonで作成しています。以下はその抜粋です(AI実装)。
API仕様: https://docs.github.com/en/rest/billing/budgets?apiVersion=2026-03-10#create-a-budget-for-an-organization

def create_user_ai_budget(
    token: str,
    username: str,
    amount: float,
    dry_run: bool,
) -> BudgetResult:
    """指定ユーザーに AI Credits の予算を作成する"""

    endpoint = f"{BASE_URL}/organizations/{org}/settings/billing/budgets"
    payload = {
        "budget_amount": amount,
        "prevent_further_usage": True,
        "budget_scope": "user",
        "budget_entity_name": "",       # user スコープは空文字
        "budget_type": "BundlePricing",
        "budget_product_sku": "ai_credits",
        "user": username,
    }

    if dry_run:
        print(f"  [DRY RUN] POST {endpoint}")
        print(f"  payload: {json.dumps(payload, indent=4, ensure_ascii=False)}")
        return BudgetResult(username=username, success=True, message="dry-run (skipped)")

    try:
        status_code, data, text = post_json(endpoint, token, payload)

        if status_code in (200, 201):
            data = data or {}
            budget_id = data.get("budget", {}).get("id", "N/A")
            return BudgetResult(
                username=username,
                success=True,
                budget_id=budget_id,
                message=data.get("message", "Budget successfully created."),
            )
        else:
            error_msg = data.get("message", text) if isinstance(data, dict) else text
            return BudgetResult(username=username, success=False, message=f"HTTP {status_code}: {error_msg}")

    except error.URLError as e:
        return BudgetResult(username=username, success=False, message=f"Request error: {e}")

budget_alerting はAPIドキュメント上のパラメータに含まれていますが、本記事執筆時点の弊社環境では指定時にエラーとなり、管理画面からもアラート送付先を設定できなくなりました。そのため、上記のコードでは budget_alerting を除外しています。

(3) 月初に設定を初期化するActions

月次リセット用のGitHub Actionsをスケジュール実行し、個別に設定した予算を削除するPythonスクリプトを実行しています。
GitHubのAPIを利用し、個別のbudgetをすべて取得して、ループで削除していくだけです。

API仕様: https://docs.github.com/en/rest/billing/budgets?apiVersion=2026-03-10#delete-a-budget-for-an-organization

(4) AIクレジット利用料の通知

AIクレジットの利用状況は、GitHubのAPIから取得して毎日Slackへ通知しています。

[Copilot usage 2026/7/1 - {当日}]   
AI credits: {当月のAIクレジット利用量} / {当月のライセンスに含まれるAIクレジット量}  ({クレジット消化率}%) 
Additional usage: {追加利用料金(ドル)} / {(A)で設定した追加利用料金の組織上限(ドル)} ({追加利用料消化率}%)

例えば、7月20日に通知した場合は以下のようになります。値はサンプルです。

[Copilot usage 2026/7/1 - 7/20]   
AI credits: 64,000 / 50,000  (128%) 
Additional usage: $140 / $1000 (14%)

AIクレジットの利用実績、追加利用料金

以下のAPIから取得します。

API仕様: https://docs.github.com/en/rest/billing/usage?apiVersion=2026-03-10#get-billing-ai-credit-usage-report-for-an-organization

レスポンスはAIモデル別に返却されますが、 grossQuantity を合計したものをAIクレジット利用量、netAmount を合計したものを追加利用料として扱っています。

ライセンスに含まれるAIクレジット量

ライセンスに含まれるAIクレジット量は、Copilot契約ユーザー数から計算します。弊社では契約ユーザーを管理しているものが別でありますので、それをカウントして、1ユーザーあたりの無料枠を掛けています。2026年8月までは移行期間のため、Businessプランの無料枠を1ユーザーあたり30ドル、1ドルを100 AIクレジットとして計算しています。

ai_credits_used = sum(item.get("grossQuantity", 0) for item in usage_items)
ai_credits_included = copilot_users * 30 * 100
ai_credits_rate = ai_credits_used / ai_credits_included * 100

追加利用料金の組織上限

追加利用料の上限は、(A)で作成したbudgetをAPIから取得して利用します。管理画面の設定値をスクリプト側にも持たせず、実際のbudgetを参照することで、上限を変更した場合にも通知へそのまま反映されます。

API仕様: https://docs.github.com/en/rest/billing/budgets?apiVersion=2026-03-10#get-a-budget-by-id-for-an-organization

def fetch_budget(org: str, budget_id: str, token: str) -> dict[str, Any]:
    endpoint = f"{BASE_URL}/organizations/{org}/settings/billing/budgets/{budget_id}"
    return fetch_json(endpoint, token)

additional_usage_amount = sum(item.get("netAmount", 0) for item in usage_items)
additional_usage_rate = additional_usage_amount / budget_amount * 100

通知

通知はSlackのWebhookを利用しています。詳細なWebhookURLの作り方は過去記事: 「Slack WorkflowのWebhookで作るシンプルなSlack通知」を参照してください。

これをGitHub Actionsのscheduleで毎日実行することで、管理画面を都度確認しなくても、利用量の増え方と上限までの余裕を把握できるようにしています。
管理者だけでなく利用者全体がコストの意識を持てるようになっています。上限を超えると利用が停止するため、停止前に判断できるようにするという点でも重要です。

まとめ

AIクレジットの導入および値上げにより、管理者としては従量課金の増加を抑える必要が出てきました。一方で、コストを抑えることだけを優先して利用を制限してしまうと、AIによる効果も生まれにくくなります。そこで、全体のコストは管理しつつ、必要な人には上限を緩和し、AIを最大限活用してもらえるようにこの仕組みを作りました。

また、上限緩和の依頼があるたびに管理者が設定画面を操作する運用にはせず、申請はIssue、承認はコメント、設定はActionsで自動実行することで、日々の運用の手間を極力減らしています。申請から実行、結果の記録までGitHub上で完結するため、管理者の負担を減らせるだけでなく、利用者にとっても上限緩和までのリードタイムが短くなります。

さらに、全体のコスト状況が共有されることで、利用者自身も現在の利用状況を把握しながらAIを活用できます。管理する側と利用する側の双方にとって、扱いやすい仕組みにできました。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?