みなさん、こんにちは!Dirbato - Backbeat の田島です。
ついに…ついに来ましたね、 Claude Sonnet 4.6!! ![]()
界隈の盛り上がりは最高潮、TL(タイムライン)はお祭り騒ぎ。
Azure AI Foundry を使っている私も、発売日に新作ゲームを買いに行く小学生のようなウキウキ気分で Model Catalog を開き、「デプロイ」ボタンを連打しようとしました。
しかし、私の目に飛び込んできたのは、無慈悲な現実でした。
選択したオプションのクォータが不足しています
「嘘だと言ってよバーニィ!!!!」
現実(リアル)
4.6-Opus の時もそうでしたが、今回の 4.6-Sonnet もそう簡単にはデプロイさせてくれません。SSR(スーパースペシャルレア)確定ガチャだと思って引いたら、まさかの排出率 0%。
4.5-Sonnet/Opus の頃の「運営」は優しかったですよね…。申請なしで 450k TPM も配ってくれるなんて、まさに神運営の詫び石配布祭りでした。
しかし、嘆いていても始まりません。我々にはまだ「クォータ増加申請」という名の周回クエストが残されています。
クォータ申請、ダルすぎ問題
でも、正直に言いましょう。
あれ、めちゃくちゃ面倒くさくないですか?
-
複数環境(Dev/Stg/Prod...)がある -
複数モデルを申請しなきゃいけない -
申請理由(作文)を書かなきゃいけない
これを手作業でやるなんて、経験値1のスライムを叩き続けてレベル99を目指すようなものです。指が死にます。
というわけで今回は、「毒を以て毒を制す」 ならぬ 「AI を以て AI を申請す」 作戦を決行します。
最近出た Claude Sonnet 4.6 の力を借りて、Claude Cowork で Azure AI Foundry のクォータ増加申請を全自動化(オート周回) していきましょう!
実装:自動申請プロンプトの錬成
使い方は、ポーションを飲むより簡単です。
1. メタプロンプトの準備
まずは、以下のメタプロンプトを用意します。これが今回の「召喚魔法陣」の基礎となります。
クリックしてメタプロンプトを確認
設定内容に基づいて、Azure AI Foundryのクォータ増加申請を自動化するためのプロンプトを生成してください。
# Azure AI Foundry クォータ増加申請 自動化プロンプト(汎用版メタテンプレート)
## 📋 使い方
このテンプレートを使って、あなたのチーム用の申請プロンプトを作成できます!
以下の **【設定セクション】** を埋めるだけで、自動的に完全な申請プロンプトが生成されるよ✨
---
## 🎯 【設定セクション】ここを埋めてね!
### 👤 申請者情報
```yaml
申請者情報:
First Name: "【あなたの名前】"
Last Name: "【あなたの苗字】"
Company Email: "【あなたのメールアドレス】"
Company Name: "【会社名】"
Company Address: "【会社住所】"
Company City: "【市区町村】"
Company Postal Code: "【郵便番号】"
Company Country: "【国名(例: Japan)】"
```end
### 📝 申請理由(Justification)
```yaml
申請理由: |
【ここにあなたのユースケースを記載】
例: We will use this model to provide AI-powered customer support
and automated content generation for our SaaS platform.
```end
### 🌍 デプロイ設定
```yaml
デプロイ設定:
Model Deployment Type: "Model Deployment (PTU/RPM/TPM)" # 通常はこのまま
Quota Request Type: "Global Standard" # 通常はこのまま
Region: "【リージョン名(例: East US 2, Japan East)】"
```end
### 🎯 申請するモデルとクォータ
```yaml
申請リスト:
- 環境: "【環境名(例: dev, prd, staging)】"
Subscription ID: "【サブスクリプションID】"
モデル名: "【モデル名(例: gpt-5-pro, claude-sonnet-4-6)】"
Model Type: "【Azure OpenAI または Anthropic】"
クォータ: 【数値(例: 50, 1000)】
- 環境: "【環境名】"
Subscription ID: "【サブスクリプションID】"
モデル名: "【モデル名】"
Model Type: "【Azure OpenAI または Anthropic】"
クォータ: 【数値】
# 必要なだけ追加してね!
```end
### 📚 モデル名マッピング(重要!)
フォームのドロップダウンに表示される名前と、あなたが使いたいモデル名が違う場合があるよ!
以下を参考に設定してね:
```yaml
モデル名マッピング:
# あなたが呼びたい名前: フォームでの実際の表示名
gpt-5-pro: "gpt-5-pro"
gpt-4o: "gpt-4o"
claude-sonnet-4-6: "claude-sonnet-4-6"
claude-opus-4-6: "claude-opus-4-6"
# 他のモデルを追加する場合はここに記載
```end
---
## 🤖 生成されるプロンプト構造
上記の設定を埋めると、以下の構造で完全なプロンプトが生成されます:
1. 概要とフォームURL
2. 申請一覧テーブル(あなたの設定から自動生成)
3. 共通入力値(あなたの申請者情報)
4. モデル名マッピング
5. 技術的注意事項(変更不要)
6. ヘルパー関数(変更不要)
7. 実行手順
- Anthropicモデル用
- Azure OpenAIモデル用
- ADMリセット手順
8. 完全なコード例
9. 成功確認方法
---
## 💡 設定例(参考用)
### 例1: シンプルな1モデル申請
```yaml
申請者情報:
First Name: "Taro"
Last Name: "Yamada"
Company Email: "taro.yamada@example.com"
Company Name: "Example Corp"
Company Address: "1-1-1 Shibuya, Shibuya-ku"
Company City: "Tokyo"
Company Postal Code: "150-0001"
Company Country: "Japan"
申請理由: |
We need GPT-5-pro for our AI chatbot service to handle customer inquiries
with improved accuracy and response time.
デプロイ設定:
Model Deployment Type: "Model Deployment (PTU/RPM/TPM)"
Quota Request Type: "Global Standard"
Region: "Japan East"
申請リスト:
- 環境: "production"
Subscription ID: "12345678-1234-1234-1234-123456789abc"
モデル名: "gpt-5-pro"
Model Type: "Azure OpenAI"
クォータ: 100
モデル名マッピング:
gpt-5-pro: "gpt-5-pro"
```end
### 例2: 複数環境・複数モデル申請
```yaml
申請者情報:
First Name: "Hanako"
Last Name: "Sato"
Company Email: "hanako.sato@example.com"
Company Name: "Tech Innovations Inc"
Company Address: "2-2-2 Roppongi, Minato-ku"
Company City: "Tokyo"
Company Postal Code: "106-0032"
Company Country: "Japan"
申請理由: |
We are building a multi-modal AI platform that requires both GPT and Claude
models for different use cases: content generation, code review, and
customer support automation.
デプロイ設定:
Model Deployment Type: "Model Deployment (PTU/RPM/TPM)"
Quota Request Type: "Global Standard"
Region: "East US 2"
申請リスト:
- 環境: "dev"
Subscription ID: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
モデル名: "gpt-5-pro"
Model Type: "Azure OpenAI"
クォータ: 50
- 環境: "dev"
Subscription ID: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
モデル名: "claude-sonnet-4-6"
Model Type: "Anthropic"
クォータ: 200
- 環境: "production"
Subscription ID: "ffffffff-gggg-hhhh-iiii-jjjjjjjjjjjj"
モデル名: "gpt-5-pro"
Model Type: "Azure OpenAI"
クォータ: 500
- 環境: "production"
Subscription ID: "ffffffff-gggg-hhhh-iiii-jjjjjjjjjjjj"
モデル名: "claude-opus-4-6"
Model Type: "Anthropic"
クォータ: 300
モデル名マッピング:
gpt-5-pro: "gpt-5-pro"
claude-sonnet-4-6: "claude-sonnet-4-6"
claude-opus-4-6: "claude-opus-4-6"
```end
---
## 🔧 プロンプト生成器
以下のテンプレートに、あなたの **【設定セクション】** の内容を代入してください:
````markdown
# Azure AI Foundry クォータ増加申請 自動化プロンプト
## 概要
以下のMicrosoft FormsでAzure AI Foundryのクォータ増加申請を自動で送信してください。
**フォームURL:**
https://customervoice.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR4xPXO648sJKt4GoXAed-0pUQURHRUtCM1JTOUtOSjI3Qk4wSVNSSUNNNyQlQCN0PWcu
---
## 申請一覧({{申請リストの件数}}件)
| # | 環境 | Subscription ID | モデル | Model Type | クォータ |
|---|---|---|---|---|---|
{{申請リストから自動生成}}
| 1 | {{環境}} | {{Subscription ID}} | {{モデル名}} | {{Model Type}} | {{クォータ}} |
| 2 | {{環境}} | {{Subscription ID}} | {{モデル名}} | {{Model Type}} | {{クォータ}} |
...
---
## 共通入力値
| フィールド | 値 |
|---|---|
| First Name | {{First Name}} |
| Last Name | {{Last Name}} |
| Company Email | {{Company Email}} |
| Company Name | {{Company Name}} |
| Company Address | {{Company Address}} |
| Company City | {{Company City}} |
| Company Postal Code | {{Company Postal Code}} |
| Company Country | {{Company Country}} |
| Justification | {{申請理由}} |
| Model Deployment | {{Model Deployment Type}} |
| Quota Request Type | {{Quota Request Type}} |
| Region | {{Region}} |
---
## ドロップダウンのモデル名マッピング
フォームのドロップダウンに表示されるモデル名は以下の通り:
| 申請一覧のモデル名 | フォームのドロップダウン値 |
|---|---|
{{モデル名マッピングから自動生成}}
| {{あなたのモデル名}} | `{{フォームでの表示名}}` |
...
---
## 重要な技術的注意事項(過去の失敗から得た知見)
### ⚠️ 注意1: ラジオボタンのUUIDはページロードごとに変わる
ページをリロードするたびにラジオボタングループのUUIDが変わります。
**絶対にUUIDをハードコードしないでください。** 必ずセクションタイトルから動的に取得してください。
### ⚠️ 注意2: ReactのStateにより単純な `inp.value = value` は無効
Microsoft FormsはReactで構築されているため、`inp.value = value` で値をセットしてもReactが次の再レンダリング時に上書きします。
必ず後述のネイティブセッター方式(`sri()`関数)を使用してください。
### ⚠️ 注意3: ヘルパー関数はJSの各実行コンテキストで再定義が必要
JavaScriptツールを呼び出すたびに関数定義が失われます。
**全てのJavaScript実行の先頭で必ずヘルパー関数を再定義してください。**
### ⚠️ 注意4: Azure Direct Model (ADM) の隠しセクションが汚染する問題
Azure OpenAIを選択した際、非表示の「(Azure Direct Model) Quota Request Type」セクションに
「Global Standard」が既に選択されていると、ADMのモデル/クォータセクションが表示されてしまいます。
**Azure OpenAI申請では、Azure OpenAI Quota Request Type の選択後、ADMセクションが表示されていないか必ず確認してください。**
表示されている場合はADMリセット手順を実行してください(後述)。
---
## ヘルパー関数(全JS実行の先頭に必ず記載)
```javascript
// React対応の入力セッター(ネイティブセッター方式)
function sri(el, val) {
let s = el.tagName === 'INPUT'
? Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set
: Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set;
s.call(el, val);
el.dispatchEvent(new Event('input', {bubbles:true}));
el.dispatchEvent(new Event('change', {bubbles:true}));
return true;
}
// テキストフィールドをセクションタイトルで検索して入力
function fbt(title, val) {
const s = Array.from(document.querySelectorAll('.__question__'))
.find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const inp = s?.querySelector('input, textarea');
return inp ? sri(inp, val) : false;
}
// 表示中のテキストフィールドのみを対象
function fbtv(title, val) {
const s = Array.from(document.querySelectorAll('.__question__'))
.find(s => s.offsetParent !== null &&
s.querySelector('.text-format-content')?.textContent?.trim() === title);
const inp = s?.querySelector('input, textarea');
return inp ? sri(inp, val) : false;
}
// セクションタイトルからラジオグループ名を動的取得
function grgs(title) {
const s = Array.from(document.querySelectorAll('.__question__'))
.find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const r = s?.querySelectorAll('input[type="radio"]');
return r?.length > 0 ? r[0].name : null;
}
// グループ名と値でラジオボタンをクリック
function crbgn(gn, val) {
if (!gn) return false;
for (const r of document.querySelectorAll(`input[type="radio"][name="${gn}"]`)) {
if (r.value === val) {
['mousedown','mouseup','click'].forEach(e => r.dispatchEvent(new MouseEvent(e, {bubbles:true})));
r.checked = true;
['change','input'].forEach(e => r.dispatchEvent(new Event(e, {bubbles:true})));
return true;
}
}
return false;
}
```end
---
## 各申請の実行手順
### Anthropic申請の場合
Step 1: フォームURLにナビゲート → 4秒待機
Step 2: 以下をまとめて実行(ヘルパー関数再定義も含む)
- fbt() で全テキストフィールドを入力
- crbgn(grgs('Model Type'), 'Anthropic')
- crbgn(grgs('Model Deployment Quota or Fine Tuning Quota'), 'Model Deployment (PTU/RPM/TPM)')
Step 3: 2秒待機(Anthropicセクションが表示されるまで)
Step 4: 以下をまとめて実行(ヘルパー関数再定義も含む)
- crbgn(grgs('(Anthropic) Quota Request Type'), '{{Quota Request Type}}')
- crbgn(grgs('Global Standard Region'), '{{Region}}')
- fbtv('(Anthropic) Global Standard Quota', '{{クォータ}}')
- (Anthropic) Global Standard Model のlistboxをクリックして開く
Step 5: 1秒待機
Step 6: 以下をまとめて実行
- [role="option"] から '{{フォームでのモデル表示名}}' をクリック
- setTimeout 500ms後に送信ボタン('送信')をクリック
Step 7: 3秒待機 → "You've completed the request" を確認
### Azure OpenAI申請の場合
Step 1: フォームURLにナビゲート → 4秒待機
Step 2: 以下をまとめて実行(ヘルパー関数再定義も含む)
- fbt() で全テキストフィールドを入力
- crbgn(grgs('Model Type'), 'Azure OpenAI')
- crbgn(grgs('Model Deployment Quota or Fine Tuning Quota'), 'Model Deployment (PTU/RPM/TPM)')
Step 3: 2秒待機(Azure OpenAIセクションが表示されるまで)
Step 4: 表示中のセクションを確認(ADM汚染チェック)
- 表示セクションに '(Azure Direct Model) Global Standard Model' が含まれていたら
→ ADMリセット手順を実行(下記参照)
- 含まれていなければStep 5へ進む
Step 5: 以下をまとめて実行(ヘルパー関数再定義も含む)
- crbgn(grgs('(Azure OpenAI) Quota Request Type'), '{{Quota Request Type}}')
- crbgn(grgs('Global Standard Region'), '{{Region}}')
- fbtv('(Azure OpenAI) Global Standard Quota', '{{クォータ}}')
- (Azure OpenAI) Global Standard Model のlistboxをクリックして開く
Step 6: 1秒待機
Step 7: 以下をまとめて実行
- [role="option"] から '{{フォームでのモデル表示名}}' をクリック
- setTimeout 500ms後に送信ボタン('送信')をクリック
Step 8: 3秒待機 → "You've completed the request" を確認
#### ADMリセット手順(Azure OpenAI申請でADMセクションが表示された場合のみ)
```javascript
// 1. 一時的にADMに切り替え
crbgn(grgs('Model Type'), 'Azure Direct Model (ADM)');
// 2秒待機
// 2. ADMのクォータタイプをGlobal Standard以外に変更
crbgn(grgs('(Azure Direct Model) Quota Request Type'), 'Data Zone Standard');
// 3. Azure OpenAIに戻す
crbgn(grgs('Model Type'), 'Azure OpenAI');
// 2秒待機してから通常のStep 5へ
```end
---
## 完全なコード例
### Anthropic申請用
```javascript
// ===== Step 2 =====
function sri(el, val) {
let s = el.tagName === 'INPUT' ? Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set : Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set;
s.call(el, val); el.dispatchEvent(new Event('input', {bubbles:true})); el.dispatchEvent(new Event('change', {bubbles:true})); return true;
}
function fbt(title, val) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const inp = s?.querySelector('input, textarea'); return inp ? sri(inp, val) : false;
}
function grgs(title) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const r = s?.querySelectorAll('input[type="radio"]'); return r?.length > 0 ? r[0].name : null;
}
function crbgn(gn, val) {
if (!gn) return false;
for (const r of document.querySelectorAll(`input[type="radio"][name="${gn}"]`)) {
if (r.value === val) { ['mousedown','mouseup','click'].forEach(e => r.dispatchEvent(new MouseEvent(e, {bubbles:true}))); r.checked = true; ['change','input'].forEach(e => r.dispatchEvent(new Event(e, {bubbles:true}))); return true; }
}
return false;
}
const t = {
fn: fbt('First Name','{{First Name}}'), ln: fbt('Last Name','{{Last Name}}'),
em: fbt('Company Email','{{Company Email}}'),
co: fbt('Company Name','{{Company Name}}'),
ad: fbt('Company Address','{{Company Address}}'),
ci: fbt('Company City','{{Company City}}'), po: fbt('Company Postal Code','{{Company Postal Code}}'),
cn: fbt('Company Country','{{Company Country}}'),
su: fbt('Subscription Id','{{Subscription ID}}'),
ju: fbt('Justification','{{申請理由}}')
};
const mt = crbgn(grgs('Model Type'), 'Anthropic');
const md = crbgn(grgs('Model Deployment Quota or Fine Tuning Quota'), 'Model Deployment (PTU/RPM/TPM)');
({t, mt, md})
// ===== 2秒待機 =====
// ===== Step 4 =====
function sri(el, val) { /* 再定義 */ }
function fbtv(title, val) { /* 再定義 */ }
function grgs(title) { /* 再定義 */ }
function crbgn(gn, val) { /* 再定義 */ }
const aq = crbgn(grgs('(Anthropic) Quota Request Type'), '{{Quota Request Type}}');
const rg = crbgn(grgs('Global Standard Region'), '{{Region}}');
const qt = fbtv('(Anthropic) Global Standard Quota', '{{クォータ}}');
const ms = Array.from(document.querySelectorAll('.__question__'))
.find(s => s.offsetParent !== null && s.querySelector('.text-format-content')?.textContent?.trim() === '(Anthropic) Global Standard Model');
const lb = ms?.querySelector('[role="listbox"]'); if (lb) lb.click();
({aq, rg, qt, lbFound: !!lb})
// ===== 1秒待機 =====
// ===== Step 6 =====
let selected = false;
for (const o of document.querySelectorAll('[role="option"]')) {
if (o.textContent.trim() === '{{フォームでのモデル表示名}}') { o.click(); selected = true; break; }
}
if (selected) {
setTimeout(() => {
const b = Array.from(document.querySelectorAll('button')).find(b => b.textContent.trim() === '送信');
if (b) b.click();
}, 500);
}
({selected})
```end
### Azure OpenAI申請用
```javascript
// ===== Step 2 =====
function sri(el, val) {
let s = el.tagName === 'INPUT' ? Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set : Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set;
s.call(el, val); el.dispatchEvent(new Event('input', {bubbles:true})); el.dispatchEvent(new Event('change', {bubbles:true})); return true;
}
function fbt(title, val) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const inp = s?.querySelector('input, textarea'); return inp ? sri(inp, val) : false;
}
function grgs(title) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const r = s?.querySelectorAll('input[type="radio"]'); return r?.length > 0 ? r[0].name : null;
}
function crbgn(gn, val) {
if (!gn) return false;
for (const r of document.querySelectorAll(`input[type="radio"][name="${gn}"]`)) {
if (r.value === val) { ['mousedown','mouseup','click'].forEach(e => r.dispatchEvent(new MouseEvent(e, {bubbles:true}))); r.checked = true; ['change','input'].forEach(e => r.dispatchEvent(new Event(e, {bubbles:true}))); return true; }
}
return false;
}
const t = {
fn: fbt('First Name','{{First Name}}'), ln: fbt('Last Name','{{Last Name}}'),
em: fbt('Company Email','{{Company Email}}'),
co: fbt('Company Name','{{Company Name}}'),
ad: fbt('Company Address','{{Company Address}}'),
ci: fbt('Company City','{{Company City}}'), po: fbt('Company Postal Code','{{Company Postal Code}}'),
cn: fbt('Company Country','{{Company Country}}'),
su: fbt('Subscription Id','{{Subscription ID}}'),
ju: fbt('Justification','{{申請理由}}')
};
const mt = crbgn(grgs('Model Type'), 'Azure OpenAI');
const md = crbgn(grgs('Model Deployment Quota or Fine Tuning Quota'), 'Model Deployment (PTU/RPM/TPM)');
({t, mt, md})
// ===== 2秒待機 =====
// ===== Step 4: ADM汚染チェック =====
const admVisible = Array.from(document.querySelectorAll('.__question__'))
.some(s => s.offsetParent !== null && s.querySelector('.text-format-content')?.textContent?.trim() === '(Azure Direct Model) Global Standard Model');
({admVisible})
// もし admVisible が true なら ADMリセット手順を実行してから Step 5 へ
// ===== Step 5 =====
function sri(el, val) { /* 再定義 */ }
function fbtv(title, val) { /* 再定義 */ }
function grgs(title) { /* 再定義 */ }
function crbgn(gn, val) { /* 再定義 */ }
const aq = crbgn(grgs('(Azure OpenAI) Quota Request Type'), '{{Quota Request Type}}');
const rg = crbgn(grgs('Global Standard Region'), '{{Region}}');
const qt = fbtv('(Azure OpenAI) Global Standard Quota', '{{クォータ}}');
const ms = Array.from(document.querySelectorAll('.__question__'))
.find(s => s.offsetParent !== null && s.querySelector('.text-format-content')?.textContent?.trim() === '(Azure OpenAI) Global Standard Model');
const lb = ms?.querySelector('[role="listbox"]'); if (lb) lb.click();
({aq, rg, qt, lbFound: !!lb})
// ===== 1秒待機 =====
// ===== Step 7 =====
let selected = false;
for (const o of document.querySelectorAll('[role="option"]')) {
if (o.textContent.trim() === '{{フォームでのモデル表示名}}') { o.click(); selected = true; break; }
}
if (selected) {
setTimeout(() => {
const b = Array.from(document.querySelectorAll('button')).find(b => b.textContent.trim() === '送信');
if (b) b.click();
}, 500);
}
({selected})
```end
---
## 成功確認
各申請送信後、以下のJavaScriptで成功を確認してください:
```javascript
document.body.innerText.includes("You've completed the request")
// → true であれば成功
```end
---
## 📌 チェックリスト
申請前に以下を確認してね!
- [ ] 申請者情報がすべて正しく入力されている
- [ ] Subscription IDが正しい(ハイフン含む36文字のUUID形式)
- [ ] 申請理由が具体的で説得力がある(最低2-3文)
- [ ] リージョン名がAzureの正式名称と一致している
- [ ] モデル名マッピングがフォームの実際の表示名と一致している
- [ ] クォータ数値が妥当(小さすぎず大きすぎず)
- [ ] Model Typeが正しい(Azure OpenAI / Anthropic)
---
## 🆘 トラブルシューティング
### Q: モデルがドロップダウンに表示されない
A: モデル名マッピングを確認してください。フォームでの表示名と完全一致する必要があります。
### Q: ADMセクションが消えない
A: ADMリセット手順を実行後、必ず2秒待機してからAzure OpenAIの設定に進んでください。
### Q: 送信ボタンが押せない
A: すべての必須フィールドが入力されているか確認してください。特にモデル選択が完了しているか確認。
### Q: 申請が重複してしまった
A: 各申請後に必ず "You've completed the request" を確認してから次の申請に進んでください。
---
2. 設定の書き換え(あなたのパラメータ)
次に、上記の設定部分をあなたの環境に合わせて書き換えます。
ここはいわゆる「装備変更」画面です。ステータスを間違えるとエラーで弾かれるので注意してください。
## 🎯 【設定セクション】ここを埋めてね!
### 👤 申請者情報
```yaml
申請者情報(英語で入力):
First Name: "Isamu"
Last Name: "Tajima"
Company Email: "isamu.tajima@xxx.com"
Company Name: "XXX K.K."
Company Address: "35F midtown Tower, 9-7-1 Akasaka, Minato-ku"
Company City: "Tokyo"
Company Postal Code: "107-0052"
Company Country: "Japan"
```end
### 📝 申請理由(Justification)
```yaml
申請理由: |
We will use this model to provide AI-powered customer support
and automated content generation for our SaaS platform.
```end
### 🌍 デプロイ設定
```yaml
デプロイ設定:
Model Deployment Type: "Model Deployment (PTU/RPM/TPM)" # 通常はこのまま
Quota Request Type: "Global Standard" # 通常はこのまま
Region: "East US 2" # 使用予定のリージョンを指定
```end
### 🎯 申請するモデルとクォータ
```yaml
申請リスト:
- 環境: "de"
Subscription ID: "xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
モデル名: "gpt-5-pro"
Model Type: "Azure OpenAI"
クォータ: 50
- 環境: "production"
Subscription ID: "yyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
モデル名: "gpt-5-pro"
Model Type: "Azure OpenAI"
クォータ: 100
# 必要なだけ追加してね!
```end
### 📚 モデル名マッピング(重要!)
フォームのドロップダウンに表示される名前と、あなたが使いたいモデル名が違う場合があるよ!
以下を参考に設定してね:
```yaml
モデル名マッピング:
# あなたが呼びたい名前: フォームでの実際の表示名
gpt-5-pro: "gpt-5-pro"
gpt-4o: "gpt-4o"
claude-sonnet-4-6: "claude-sonnet-4-6"
claude-opus-4-6: "claude-opus-4-6"
# 他のモデルを追加する場合はここに記載
```end
3. プロンプト生成(詠唱開始)
これを手持ちの LLM(Claude でも GPT でも何でも OK)に突っ込んでください。
すると、Azure AI Foundry のクォータ増加申請専用のプロンプトが錬成されます。
生成されるプロンプトのサンプル:
クリックして生成結果を確認
# Azure AI Foundry クォータ増加申請 自動化プロンプト
## 概要
以下のMicrosoft FormsでAzure AI Foundryのクォータ増加申請を自動で送信してください。
**フォームURL:**
https://customervoice.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR4xPXO648sJKt4GoXAed-0pUQURHRUtCM1JTOUtOSjI3Qk4wSVNSSUNNNyQlQCN0PWcu
---
## 申請一覧(2件)
| # | 環境 | Subscription ID | モデル | Model Type | クォータ |
|---|---|---|---|---|---|
| 1 | de | xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | gpt-5-pro | Azure OpenAI | 50 |
| 2 | production | yyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy | gpt-5-pro | Azure OpenAI | 100 |
---
## 共通入力値
| フィールド | 値 |
|---|---|
| First Name | Isamu |
| Last Name | Tajima |
| Company Email | isamu.tajima@xxx.com |
| Company Name | XXX K.K. |
| Company Address | 35F midtown Tower, 9-7-1 Akasaka, Minato-ku |
| Company City | Tokyo |
| Company Postal Code | 107-0052 |
| Company Country | Japan |
| Justification | We will use this model to provide AI-powered customer support and automated content generation for our SaaS platform. |
| Model Deployment | Model Deployment (PTU/RPM/TPM) |
| Quota Request Type | Global Standard |
| Region | East US 2 |
---
## ドロップダウンのモデル名マッピング
フォームのドロップダウンに表示されるモデル名は以下の通り:
| 申請一覧のモデル名 | フォームのドロップダウン値 |
|---|---|
| gpt-5-pro | `gpt-5-pro` |
| gpt-4o | `gpt-4o` |
| claude-sonnet-4-6 | `claude-sonnet-4-6` |
| claude-opus-4-6 | `claude-opus-4-6` |
---
## 重要な技術的注意事項(過去の失敗から得た知見)
### ⚠️ 注意1: ラジオボタンのUUIDはページロードごとに変わる
ページをリロードするたびにラジオボタングループのUUIDが変わります。
**絶対にUUIDをハードコードしないでください。** 必ずセクションタイトルから動的に取得してください。
### ⚠️ 注意2: ReactのStateにより単純な `inp.value = value` は無効
Microsoft FormsはReactで構築されているため、`inp.value = value` で値をセットしてもReactが次の再レンダリング時に上書きします。
必ず後述のネイティブセッター方式(`sri()`関数)を使用してください。
### ⚠️ 注意3: ヘルパー関数はJSの各実行コンテキストで再定義が必要
JavaScriptツールを呼び出すたびに関数定義が失われます。
**全てのJavaScript実行の先頭で必ずヘルパー関数を再定義してください。**
### ⚠️ 注意4: Azure Direct Model (ADM) の隠しセクションが汚染する問題
Azure OpenAIを選択した際、非表示の「(Azure Direct Model) Quota Request Type」セクションに
「Global Standard」が既に選択されていると、ADMのモデル/クォータセクションが表示されてしまいます。
**Azure OpenAI申請では、Azure OpenAI Quota Request Type の選択後、ADMセクションが表示されていないか必ず確認してください。**
表示されている場合はADMリセット手順を実行してください(後述)。
---
## ヘルパー関数(全JS実行の先頭に必ず記載)
```javascript
// React対応の入力セッター(ネイティブセッター方式)
function sri(el, val) {
let s = el.tagName === 'INPUT'
? Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set
: Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set;
s.call(el, val);
el.dispatchEvent(new Event('input', {bubbles:true}));
el.dispatchEvent(new Event('change', {bubbles:true}));
return true;
}
// テキストフィールドをセクションタイトルで検索して入力
function fbt(title, val) {
const s = Array.from(document.querySelectorAll('.__question__'))
.find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const inp = s?.querySelector('input, textarea');
return inp ? sri(inp, val) : false;
}
// 表示中のテキストフィールドのみを対象
function fbtv(title, val) {
const s = Array.from(document.querySelectorAll('.__question__'))
.find(s => s.offsetParent !== null &&
s.querySelector('.text-format-content')?.textContent?.trim() === title);
const inp = s?.querySelector('input, textarea');
return inp ? sri(inp, val) : false;
}
// セクションタイトルからラジオグループ名を動的取得
function grgs(title) {
const s = Array.from(document.querySelectorAll('.__question__'))
.find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const r = s?.querySelectorAll('input[type="radio"]');
return r?.length > 0 ? r[0].name : null;
}
// グループ名と値でラジオボタンをクリック
function crbgn(gn, val) {
if (!gn) return false;
for (const r of document.querySelectorAll(`input[type="radio"][name="${gn}"]`)) {
if (r.value === val) {
['mousedown','mouseup','click'].forEach(e => r.dispatchEvent(new MouseEvent(e, {bubbles:true})));
r.checked = true;
['change','input'].forEach(e => r.dispatchEvent(new Event(e, {bubbles:true})));
return true;
}
}
return false;
}
```end
---
## 各申請の実行手順
### 申請 #1: de環境 - gpt-5-pro (Azure OpenAI) - 50 TPM
Step 1: フォームURLにナビゲート → 4秒待機
Step 2: 以下をまとめて実行(ヘルパー関数再定義も含む)
- fbt() で全テキストフィールドを入力
- Subscription Id: xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- crbgn(grgs('Model Type'), 'Azure OpenAI')
- crbgn(grgs('Model Deployment Quota or Fine Tuning Quota'), 'Model Deployment (PTU/RPM/TPM)')
Step 3: 2秒待機(Azure OpenAIセクションが表示されるまで)
Step 4: 表示中のセクションを確認(ADM汚染チェック)
- 表示セクションに '(Azure Direct Model) Global Standard Model' が含まれていたら
→ ADMリセット手順を実行(下記参照)
- 含まれていなければStep 5へ進む
Step 5: 以下をまとめて実行(ヘルパー関数再定義も含む)
- crbgn(grgs('(Azure OpenAI) Quota Request Type'), 'Global Standard')
- crbgn(grgs('Global Standard Region'), 'East US 2')
- fbtv('(Azure OpenAI) Global Standard Quota', '50')
- (Azure OpenAI) Global Standard Model のlistboxをクリックして開く
Step 6: 1秒待機
Step 7: 以下をまとめて実行
- [role="option"] から 'gpt-5-pro' をクリック
- setTimeout 500ms後に送信ボタン('送信')をクリック
Step 8: 3秒待機 → "You've completed the request" を確認
#### ADMリセット手順(Azure OpenAI申請でADMセクションが表示された場合のみ)
```javascript
// 1. 一時的にADMに切り替え
crbgn(grgs('Model Type'), 'Azure Direct Model (ADM)');
// 2秒待機
// 2. ADMのクォータタイプをGlobal Standard以外に変更
crbgn(grgs('(Azure Direct Model) Quota Request Type'), 'Data Zone Standard');
// 3. Azure OpenAIに戻す
crbgn(grgs('Model Type'), 'Azure OpenAI');
// 2秒待機してから通常のStep 5へ
```end
---
### 申請 #2: production環境 - gpt-5-pro (Azure OpenAI) - 100 TPM
Step 1: フォームURLにナビゲート → 4秒待機
Step 2: 以下をまとめて実行(ヘルパー関数再定義も含む)
- fbt() で全テキストフィールドを入力
- Subscription Id: yyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
- crbgn(grgs('Model Type'), 'Azure OpenAI')
- crbgn(grgs('Model Deployment Quota or Fine Tuning Quota'), 'Model Deployment (PTU/RPM/TPM)')
Step 3: 2秒待機(Azure OpenAIセクションが表示されるまで)
Step 4: 表示中のセクションを確認(ADM汚染チェック)
- 表示セクションに '(Azure Direct Model) Global Standard Model' が含まれていたら
→ ADMリセット手順を実行(下記参照)
- 含まれていなければStep 5へ進む
Step 5: 以下をまとめて実行(ヘルパー関数再定義も含む)
- crbgn(grgs('(Azure OpenAI) Quota Request Type'), 'Global Standard')
- crbgn(grgs('Global Standard Region'), 'East US 2')
- fbtv('(Azure OpenAI) Global Standard Quota', '100')
- (Azure OpenAI) Global Standard Model のlistboxをクリックして開く
Step 6: 1秒待機
Step 7: 以下をまとめて実行
- [role="option"] から 'gpt-5-pro' をクリック
- setTimeout 500ms後に送信ボタン('送信')をクリック
Step 8: 3秒待機 → "You've completed the request" を確認
---
## 完全なコード例
### 申請 #1用(de環境 - gpt-5-pro - 50 TPM)
```javascript
// ===== Step 2 =====
function sri(el, val) {
let s = el.tagName === 'INPUT' ? Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set : Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set;
s.call(el, val); el.dispatchEvent(new Event('input', {bubbles:true})); el.dispatchEvent(new Event('change', {bubbles:true})); return true;
}
function fbt(title, val) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const inp = s?.querySelector('input, textarea'); return inp ? sri(inp, val) : false;
}
function grgs(title) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const r = s?.querySelectorAll('input[type="radio"]'); return r?.length > 0 ? r[0].name : null;
}
function crbgn(gn, val) {
if (!gn) return false;
for (const r of document.querySelectorAll(`input[type="radio"][name="${gn}"]`)) {
if (r.value === val) { ['mousedown','mouseup','click'].forEach(e => r.dispatchEvent(new MouseEvent(e, {bubbles:true}))); r.checked = true; ['change','input'].forEach(e => r.dispatchEvent(new Event(e, {bubbles:true}))); return true; }
}
return false;
}
const t = {
fn: fbt('First Name','Isamu'), ln: fbt('Last Name','Tajima'),
em: fbt('Company Email','isamu.tajima@xxx.com'),
co: fbt('Company Name','XXX K.K.'),
ad: fbt('Company Address','35F midtown Tower, 9-7-1 Akasaka, Minato-ku'),
ci: fbt('Company City','Tokyo'), po: fbt('Company Postal Code','107-0052'),
cn: fbt('Company Country','Japan'),
su: fbt('Subscription Id','xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'),
ju: fbt('Justification','We will use this model to provide AI-powered customer support and automated content generation for our SaaS platform.')
};
const mt = crbgn(grgs('Model Type'), 'Azure OpenAI');
const md = crbgn(grgs('Model Deployment Quota or Fine Tuning Quota'), 'Model Deployment (PTU/RPM/TPM)');
({t, mt, md})
// ===== 2秒待機 =====
// ===== Step 4: ADM汚染チェック =====
const admVisible = Array.from(document.querySelectorAll('.__question__'))
.some(s => s.offsetParent !== null && s.querySelector('.text-format-content')?.textContent?.trim() === '(Azure Direct Model) Global Standard Model');
({admVisible})
// もし admVisible が true なら ADMリセット手順を実行してから Step 5 へ
// ===== Step 5 =====
function sri(el, val) {
let s = el.tagName === 'INPUT' ? Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set : Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set;
s.call(el, val); el.dispatchEvent(new Event('input', {bubbles:true})); el.dispatchEvent(new Event('change', {bubbles:true})); return true;
}
function fbtv(title, val) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.offsetParent !== null && s.querySelector('.text-format-content')?.textContent?.trim() === title);
const inp = s?.querySelector('input, textarea'); return inp ? sri(inp, val) : false;
}
function grgs(title) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const r = s?.querySelectorAll('input[type="radio"]'); return r?.length > 0 ? r[0].name : null;
}
function crbgn(gn, val) {
if (!gn) return false;
for (const r of document.querySelectorAll(`input[type="radio"][name="${gn}"]`)) {
if (r.value === val) { ['mousedown','mouseup','click'].forEach(e => r.dispatchEvent(new MouseEvent(e, {bubbles:true}))); r.checked = true; ['change','input'].forEach(e => r.dispatchEvent(new Event(e, {bubbles:true}))); return true; }
}
return false;
}
const aq = crbgn(grgs('(Azure OpenAI) Quota Request Type'), 'Global Standard');
const rg = crbgn(grgs('Global Standard Region'), 'East US 2');
const qt = fbtv('(Azure OpenAI) Global Standard Quota', '50');
const ms = Array.from(document.querySelectorAll('.__question__'))
.find(s => s.offsetParent !== null && s.querySelector('.text-format-content')?.textContent?.trim() === '(Azure OpenAI) Global Standard Model');
const lb = ms?.querySelector('[role="listbox"]'); if (lb) lb.click();
({aq, rg, qt, lbFound: !!lb})
// ===== 1秒待機 =====
// ===== Step 7 =====
let selected = false;
for (const o of document.querySelectorAll('[role="option"]')) {
if (o.textContent.trim() === 'gpt-5-pro') { o.click(); selected = true; break; }
}
if (selected) {
setTimeout(() => {
const b = Array.from(document.querySelectorAll('button')).find(b => b.textContent.trim() === '送信');
if (b) b.click();
}, 500);
}
({selected})
```end
### 申請 #2用(production環境 - gpt-5-pro - 100 TPM)
```javascript
// ===== Step 2 =====
function sri(el, val) {
let s = el.tagName === 'INPUT' ? Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set : Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set;
s.call(el, val); el.dispatchEvent(new Event('input', {bubbles:true})); el.dispatchEvent(new Event('change', {bubbles:true})); return true;
}
function fbt(title, val) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const inp = s?.querySelector('input, textarea'); return inp ? sri(inp, val) : false;
}
function grgs(title) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const r = s?.querySelectorAll('input[type="radio"]'); return r?.length > 0 ? r[0].name : null;
}
function crbgn(gn, val) {
if (!gn) return false;
for (const r of document.querySelectorAll(`input[type="radio"][name="${gn}"]`)) {
if (r.value === val) { ['mousedown','mouseup','click'].forEach(e => r.dispatchEvent(new MouseEvent(e, {bubbles:true}))); r.checked = true; ['change','input'].forEach(e => r.dispatchEvent(new Event(e, {bubbles:true}))); return true; }
}
return false;
}
const t = {
fn: fbt('First Name','Isamu'), ln: fbt('Last Name','Tajima'),
em: fbt('Company Email','isamu.tajima@xxx.com'),
co: fbt('Company Name','XXX K.K.'),
ad: fbt('Company Address','35F midtown Tower, 9-7-1 Akasaka, Minato-ku'),
ci: fbt('Company City','Tokyo'), po: fbt('Company Postal Code','107-0052'),
cn: fbt('Company Country','Japan'),
su: fbt('Subscription Id','yyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'),
ju: fbt('Justification','We will use this model to provide AI-powered customer support and automated content generation for our SaaS platform.')
};
const mt = crbgn(grgs('Model Type'), 'Azure OpenAI');
const md = crbgn(grgs('Model Deployment Quota or Fine Tuning Quota'), 'Model Deployment (PTU/RPM/TPM)');
({t, mt, md})
// ===== 2秒待機 =====
// ===== Step 4: ADM汚染チェック =====
const admVisible = Array.from(document.querySelectorAll('.__question__'))
.some(s => s.offsetParent !== null && s.querySelector('.text-format-content')?.textContent?.trim() === '(Azure Direct Model) Global Standard Model');
({admVisible})
// もし admVisible が true なら ADMリセット手順を実行してから Step 5 へ
// ===== Step 5 =====
function sri(el, val) {
let s = el.tagName === 'INPUT' ? Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set : Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set;
s.call(el, val); el.dispatchEvent(new Event('input', {bubbles:true})); el.dispatchEvent(new Event('change', {bubbles:true})); return true;
}
function fbtv(title, val) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.offsetParent !== null && s.querySelector('.text-format-content')?.textContent?.trim() === title);
const inp = s?.querySelector('input, textarea'); return inp ? sri(inp, val) : false;
}
function grgs(title) {
const s = Array.from(document.querySelectorAll('.__question__')).find(s => s.querySelector('.text-format-content')?.textContent?.trim() === title);
const r = s?.querySelectorAll('input[type="radio"]'); return r?.length > 0 ? r[0].name : null;
}
function crbgn(gn, val) {
if (!gn) return false;
for (const r of document.querySelectorAll(`input[type="radio"][name="${gn}"]`)) {
if (r.value === val) { ['mousedown','mouseup','click'].forEach(e => r.dispatchEvent(new MouseEvent(e, {bubbles:true}))); r.checked = true; ['change','input'].forEach(e => r.dispatchEvent(new Event(e, {bubbles:true}))); return true; }
}
return false;
}
const aq = crbgn(grgs('(Azure OpenAI) Quota Request Type'), 'Global Standard');
const rg = crbgn(grgs('Global Standard Region'), 'East US 2');
const qt = fbtv('(Azure OpenAI) Global Standard Quota', '100');
const ms = Array.from(document.querySelectorAll('.__question__'))
.find(s => s.offsetParent !== null && s.querySelector('.text-format-content')?.textContent?.trim() === '(Azure OpenAI) Global Standard Model');
const lb = ms?.querySelector('[role="listbox"]'); if (lb) lb.click();
({aq, rg, qt, lbFound: !!lb})
// ===== 1秒待機 =====
// ===== Step 7 =====
let selected = false;
for (const o of document.querySelectorAll('[role="option"]')) {
if (o.textContent.trim() === 'gpt-5-pro') { o.click(); selected = true; break; }
}
if (selected) {
setTimeout(() => {
const b = Array.from(document.querySelectorAll('button')).find(b => b.textContent.trim() === '送信');
if (b) b.click();
}, 500);
}
({selected})
```end
---
## 成功確認
各申請送信後、以下のJavaScriptで成功を確認してください:
```javascript
document.body.innerText.includes("You've completed the request")
// → true であれば成功
```end
---
## 📌 チェックリスト
申請前に以下を確認してね!
- [x] 申請者情報がすべて正しく入力されている
- [x] Subscription IDが正しい(ハイフン含む36文字のUUID形式)
- [x] 申請理由が具体的で説得力がある(最低2-3文)
- [x] リージョン名がAzureの正式名称と一致している(East US 2)
- [x] モデル名マッピングがフォームの実際の表示名と一致している
- [x] クォータ数値が妥当(50 TPM, 100 TPM)
- [x] Model Typeが正しい(Azure OpenAI)
---
## 🆘 トラブルシューティング
### Q: モデルがドロップダウンに表示されない
A: モデル名マッピングを確認してください。フォームでの表示名と完全一致する必要があります。今回は `gpt-5-pro` で統一されています。
### Q: ADMセクションが消えない
A: ADMリセット手順を実行後、必ず2秒待機してからAzure OpenAIの設定に進んでください。
### Q: 送信ボタンが押せない
A: すべての必須フィールドが入力されているか確認してください。特にモデル選択が完了しているか確認。
### Q: 申請が重複してしまった
A: 各申請後に必ず "You've completed the request" を確認してから次の申請に進んでください。
### Q: Subscription IDが正しく入力されない
A: 今回の設定では `xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` と `yyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy` がプレースホルダーになっています。実際のSubscription IDに置き換えてください。
---
## 🎉 完了!
このプロンプトを使って、2件のクォータ増加申請を自動化できるよ!
何か問題があったら、トラブルシューティングセクションを確認してね✨
実行:Claude Cowork でオート周回
あとは、錬成されたプロンプトを Claude Cowork に放り込んで実行するだけ!
これであなたは、画面の前でコーヒーを飲みながら、勝手に申請が進んでいく様を眺めるだけでOKです。
お手柔らかに
あまりやりすぎると Azure 側に負荷をかけてしまい、「アカウントBAN」ならぬ「申請ブロック」を食らう可能性があります。
DDoS攻撃にならないよう、優しく申請してあげてくださいね。
実行結果
以下が実行時のキャプチャです。
起動シーケンス(コールドスタート)は少し長いですが、一度動き出せば トランザムシステム が起動したかのように、1申請あたり1〜2分で爆速完了します。
まとめ
これで面倒な申請作業から解放され、本来やるべき「Claude Sonnet 4.6 を使い倒す」というメインクエストに集中できますね。
それではみなさん、よい Azure AI Foundry ライフを!
(申請が通ることを祈っています…!)

