# 2.5 使用量クエリ

CC Switch のクォータ・残高表示は 2 つのカテゴリに分かれます：**自動クエリ**（公式サブスクリプション系、すぐに使える）と **手動有効化**（内蔵テンプレート + カスタムスクリプト、ユーザー設定後に表示）。

| カテゴリ                           | 範囲                                                                              | ユーザー操作必要 |
| ---------------------------------- | --------------------------------------------------------------------------------- | ---------------- |
| **自動クエリ**                     | Claude / Codex / Gemini 公式サブスクリプション、GitHub Copilot、Codex OAuth リバースプロキシ | 不要（デフォルト有効） |
| **手動有効化（内蔵テンプレート）** | Token Plan、第三者残高クエリ                                                      | 必要（下記参照） |
| **手動有効化（カスタムスクリプト）** | 内蔵テンプレート未対応の中継サービス、プライベートデプロイ、特殊 API            | 必要（下記参照） |

## 自動クエリ（公式サブスクリプション系）

v3.13.0 より、以下の 3 カテゴリはプロバイダー有効化後に **自動的** にカード下部にクォータが表示され、追加設定は不要です：

| カテゴリ               | 対象プロバイダー                              | 表示内容                             |
| ---------------------- | --------------------------------------------- | ------------------------------------ |
| 公式サブスクリプション | Claude / Codex / Gemini 公式ログイン          | 公式サブスクリプションクォータ       |
| GitHub Copilot         | Copilot プロバイダーカード                    | Premium interactions 残量            |
| Codex OAuth            | Codex OAuth リバースプロキシカード（Claude プロバイダー） | ChatGPT アカウント Codex クォータ |

これら 3 カテゴリの共通点は、**データソースが唯一かつ意味が明確** であることです（公式サブスクリプションの使用率）。そのため CC Switch は対応する公式または OAuth クエリエンドポイントを直接呼び出します。

### 自動クエリの操作

- **カード下部表示**：使用率 + リセットまでのカウントダウン、使用率に応じて色が変化（< 70% 緑 / 70–89% オレンジ / ≥ 90% 赤）
- **手動更新**：カード上の更新アイコンをクリックして再取得
- **カードの簡略化**：これら 3 カテゴリでは、**ヘルスチェック** と **使用量クエリ設定** ボタンが自動的に非表示となり、内蔵表示への干渉を防ぎます
- **セッション期限切れ通知**：Token の更新に失敗した場合、カードに黄色の「セッション期限切れ」警告が表示されます（Copilot / Codex OAuth）

---

## 手動有効化（内蔵テンプレート + カスタムスクリプト）

上記 3 カテゴリの自動クエリ対応プロバイダー以外、**その他すべてのプロバイダー**（Token Plan、第三者残高クエリ、各種中継サービスを含む）では、プロバイダーカード上で **手動で「使用量クエリ」スイッチをオン** にして初めてクォータが表示されます。

### なぜ手動有効化が必要なのか？

重要な理由の一つは：**同じリクエスト URL（同じベンダー）が複数のクエリモードを提供している場合がある** ことです —— プランごとのクォータクエリと、アカウント残高クエリの両方が存在する可能性があります。CC Switch はどちらをクエリすべきか自動判定できないため、このようなプロバイダーの内蔵クエリは **デフォルトで無効** になっており、適切なテンプレートを選択してから有効化する必要があります。

### 内蔵テンプレートの対象範囲

v3.13.0 では以下のカテゴリに **すぐに使える内蔵テンプレート** を提供しており、有効化後にスクリプトを書く必要はありません：

| カテゴリ        | 対象プロバイダー                                          | テンプレートタイプ        |
| --------------- | --------------------------------------------------------- | ------------------------- |
| Token Plan      | Kimi / Zhipu GLM / MiniMax                                | プランクォータ（使用進捗付き） |
| 第三者残高      | DeepSeek / StepFun / SiliconFlow / OpenRouter / Novita AI | 公式残高クエリ            |

> **ヒント**：上記の内蔵テンプレート以外で対象外のプロバイダーには、**カスタムスクリプト** 方式（下記参照）で独自のクエリロジックを記述できます。

### 有効化手順

1. プロバイダーカードにマウスをホバーして操作ボタンを表示
2. **使用量クエリ** ボタン（📊 アイコン）をクリック
3. 設定パネル上部の **使用量クエリを有効にする** スイッチをオンにする
4. 適切な内蔵テンプレート（Token Plan、第三者残高など）または「カスタム」を選択
5. 必要に応じて API Key / Base URL / Access Token などのパラメータを入力（多くの場合は空欄のままプロバイダー自身の認証情報を使用可能）
6. 「スクリプトをテスト」をクリックして正常に応答するか確認
7. 設定を保存 —— 次回プロバイダーを有効化すると、カード下部にクォータが表示されます

> ⚠️ **注意**：有効化後の自動更新間隔は「自動クエリ間隔」フィールドで制御します（`0` に設定すると自動更新を無効化）。プロバイダーが「現在有効」状態のときのみバックグラウンドクエリがトリガーされます。

---

## カスタムスクリプトクエリ（高度）

### 機能説明

プロバイダーが **内蔵テンプレートの対象範囲外** の場合、JavaScript でカスタムクエリスクリプトを記述できます。中継サービス、プライベートデプロイ、特殊な API 形式などに適しています。

**使用シーン**：
- API アカウントの残額確認
- プランの使用状況の監視
- 複数プランの残額を集約表示

## 設定を開く

1. プロバイダーカードにマウスをホバーして操作ボタンを表示
2. 「使用量クエリ」ボタンをクリック
3. 使用量クエリ設定パネルが開く

## 使用量クエリの有効化

設定パネル上部の「使用量クエリを有効にする」スイッチをオンにします。

## プリセットテンプレート

CC Switch は 3 種類のプリセットテンプレートを提供しています：

### カスタムテンプレート

リクエストと抽出ロジックを完全にカスタマイズします。特殊な API 形式に対応します。

### 汎用テンプレート

ほとんどの標準的な API 形式のプロバイダーに適しています：

```javascript
({
  request: {
    url: "{{baseUrl}}/user/balance",
    method: "GET",
    headers: {
      "Authorization": "Bearer {{apiKey}}",
      "User-Agent": "cc-switch/1.0"
    }
  },
  extractor: function(response) {
    return {
      isValid: response.is_active || true,
      remaining: response.balance,
      unit: "USD"
    };
  }
})
```

**設定パラメータ**：
| パラメータ | 説明 |
|------|------|
| API Key | 認証用のキー（任意、空欄の場合はプロバイダーに設定されたキーを使用） |
| Base URL | API ベースアドレス（任意、空欄の場合はプロバイダーのエンドポイントを使用） |

### New API テンプレート

New API タイプの中継サービス専用に設計されています：

```javascript
({
  request: {
    url: "{{baseUrl}}/api/user/self",
    method: "GET",
    headers: {
      "Content-Type": "application/json",
      "Authorization": "Bearer {{accessToken}}",
      "New-Api-User": "{{userId}}"
    },
  },
  extractor: function (response) {
    if (response.success && response.data) {
      return {
        planName: response.data.group || "デフォルトプラン",
        remaining: response.data.quota / 500000,
        used: response.data.used_quota / 500000,
        total: (response.data.quota + response.data.used_quota) / 500000,
        unit: "USD",
      };
    }
    return {
      isValid: false,
      invalidMessage: response.message || "クエリ失敗"
    };
  },
})
```

**設定パラメータ**：
| パラメータ | 説明 |
|------|------|
| Base URL | New API サービスアドレス |
| Access Token | アクセストークン |
| User ID | ユーザー ID |

## 共通設定

### タイムアウト時間

リクエストのタイムアウト時間（秒）、デフォルトは 10 秒。

### 自動クエリ間隔

使用量データの自動更新間隔（分）：
- `0` に設定すると自動クエリを無効化
- 範囲：0-1440 分（最長 24 時間）
- プロバイダーが「現在有効」のときのみ動作

## エクストラクターの戻り値形式

エクストラクター関数は以下のフィールドを含むオブジェクトを返す必要があります：

| フィールド | 型 | 必須 | 説明 |
|------|------|------|------|
| `isValid` | boolean | いいえ | アカウントが有効かどうか、デフォルト true |
| `invalidMessage` | string | いいえ | 無効時の通知メッセージ |
| `remaining` | number | はい | 残額 |
| `unit` | string | はい | 単位（例：USD、CNY、回） |
| `planName` | string | いいえ | プラン名（複数プラン対応） |
| `total` | number | いいえ | 総額 |
| `used` | number | いいえ | 使用済み額 |
| `extra` | object | いいえ | 追加情報 |

## スクリプトのテスト

設定完了後、「スクリプトをテスト」ボタンをクリックして確認します：

1. 設定された URL にリクエストを送信
2. エクストラクター関数を実行
3. 結果またはエラー情報を表示

## 表示効果

設定が成功すると、プロバイダーカードに以下が表示されます：

- **単一プラン**：残額を直接表示
- **複数プラン**：プラン数を表示、クリックで詳細を展開

## 変数プレースホルダー

スクリプト内で以下のプレースホルダーを使用でき、実行時に自動的に置換されます：

| プレースホルダー | 説明 |
|--------|------|
| `{{apiKey}}` | 設定された API Key |
| `{{baseUrl}}` | 設定された Base URL |
| `{{accessToken}}` | 設定された Access Token（New API） |
| `{{userId}}` | 設定された User ID（New API） |

## 一般的なプロバイダーの設定例

### トラブルシューティング

### 自動クエリにクォータが表示されない（公式サブスクリプション系）

**確認事項**：
1. プロバイダーが公式サブスクリプション系であることを確認 —— Claude / Codex / Gemini 公式ログイン、GitHub Copilot、Codex OAuth リバースプロキシ
2. プロバイダーが「現在有効」状態か（非アクティブ時はクエリがトリガーされません）
3. OAuth タイプ（Copilot / Codex OAuth）の場合、Token がまだ有効期限内か確認。カードに「セッション期限切れ」と表示される場合は **OAuth 認証センター** で再ログインしてください
4. 公式クォータエンドポイントへのネットワークアクセス可否

### 手動有効化後もクォータが表示されない

**確認事項**：
1. プロバイダーカードの「使用量クエリ」パネル上部にある **使用量クエリを有効にする** スイッチがオンか
2. 適切な内蔵テンプレート（Token Plan / 第三者残高 / カスタム）が選択されているか
3. 「スクリプトをテスト」をクリックして具体的なエラー情報を確認
4. API Key / Base URL などの必須フィールドが正しく入力されているか
5. プロバイダーのクォータエンドポイントへのネットワークアクセス可否
6. プロバイダーが「現在有効」状態のときのみ、バックグラウンドの自動更新がトリガーされます

### クエリ失敗

**確認事項**：
1. API Key が正しいか
2. Base URL が正しいか
3. ネットワークがアクセス可能か
4. タイムアウト時間が十分か

### 返却データが空

**確認事項**：
1. エクストラクター関数に `return` 文があるか
2. レスポンスのデータ構造がエクストラクターと一致しているか
3. 「スクリプトをテスト」で生のレスポンスを確認

### フォーマット失敗

スクリプトに構文エラーがある場合、「フォーマット」ボタンをクリックするとエラー箇所が表示されます。

## 注意事項

- 使用量クエリは少量の API リクエスト枠を消費します
- 頻繁なリクエストを避けるため、適切な自動クエリ間隔を設定してください
- 機密情報（API Key、Token）はローカルに安全に保存されます
