1+ #! /bin/bash
2+ # VERBOSE=false
3+
4+ MODELS=" "
5+ REGIONS=" "
6+ VERBOSE=false
7+
8+ while [[ $# -gt 0 ]]; do
9+ case " $1 " in
10+ --models)
11+ MODELS=" $2 "
12+ shift 2
13+ ;;
14+ --regions)
15+ REGIONS=" $2 "
16+ shift 2
17+ ;;
18+ --verbose)
19+ VERBOSE=true
20+ shift
21+ ;;
22+ * )
23+ echo " Unknown option: $1 "
24+ exit 1
25+ ;;
26+ esac
27+ done
28+
29+ # Fallback to defaults if not provided
30+ [[ -z " $MODELS " ]]
31+ [[ -z " $REGIONS " ]]
32+
33+ echo " Models: $MODELS "
34+ echo " Regions: $REGIONS "
35+ echo " Verbose: $VERBOSE "
36+
37+ for arg in " $@ " ; do
38+ if [ " $arg " = " --verbose" ]; then
39+ VERBOSE=true
40+ fi
41+ done
42+
43+ log_verbose () {
44+ if [ " $VERBOSE " = true ]; then
45+ echo " $1 "
46+ fi
47+ }
48+
49+ # Default Models and Capacities (Comma-separated in "model:capacity" format)
50+ DEFAULT_MODEL_CAPACITY=" o3:500"
51+ # Convert the comma-separated string into an array
52+ IFS=' ,' read -r -a MODEL_CAPACITY_PAIRS <<< " $DEFAULT_MODEL_CAPACITY"
53+
54+ echo " 🔄 Fetching available Azure subscriptions..."
55+ SUBSCRIPTIONS=$( az account list --query " [?state=='Enabled'].{Name:name, ID:id}" --output tsv)
56+ SUB_COUNT=$( echo " $SUBSCRIPTIONS " | wc -l)
57+
58+ if [ " $SUB_COUNT " -eq 0 ]; then
59+ echo " ❌ ERROR: No active Azure subscriptions found. Please log in using 'az login' and ensure you have an active subscription."
60+ exit 1
61+ elif [ " $SUB_COUNT " -eq 1 ]; then
62+ # If only one subscription, automatically select it
63+ AZURE_SUBSCRIPTION_ID=$( echo " $SUBSCRIPTIONS " | awk ' {print $2}' )
64+ if [ -z " $AZURE_SUBSCRIPTION_ID " ]; then
65+ echo " ❌ ERROR: No active Azure subscriptions found. Please log in using 'az login' and ensure you have an active subscription."
66+ exit 1
67+ fi
68+ echo " ✅ Using the only available subscription: $AZURE_SUBSCRIPTION_ID "
69+ else
70+ # If multiple subscriptions exist, prompt the user to choose one
71+ echo " Multiple subscriptions found:"
72+ echo " $SUBSCRIPTIONS " | awk ' {print NR")", $1, "-", $2}'
73+
74+ while true ; do
75+ echo " Enter the number of the subscription to use:"
76+ read SUB_INDEX
77+
78+ # Validate user input
79+ if [[ " $SUB_INDEX " =~ ^[0-9]+$ ]] && [ " $SUB_INDEX " -ge 1 ] && [ " $SUB_INDEX " -le " $SUB_COUNT " ]; then
80+ AZURE_SUBSCRIPTION_ID=$( echo " $SUBSCRIPTIONS " | awk -v idx=" $SUB_INDEX " ' NR==idx {print $2}' )
81+ echo " ✅ Selected Subscription: $AZURE_SUBSCRIPTION_ID "
82+ break
83+ else
84+ echo " ❌ Invalid selection. Please enter a valid number from the list."
85+ fi
86+ done
87+ fi
88+
89+
90+ # Set the selected subscription
91+ az account set --subscription " $AZURE_SUBSCRIPTION_ID "
92+ echo " 🎯 Active Subscription: $( az account show --query ' [name, id]' --output tsv) "
93+
94+ # Default Regions to check (Comma-separated, now configurable)
95+ DEFAULT_REGIONS=" australiaeast,japaneast,eastus,uksouth,eastus2,northcentralus,swedencentral,westus,westus2,southcentralus,canadacentral"
96+ IFS=' ,' read -r -a DEFAULT_REGION_ARRAY <<< " $DEFAULT_REGIONS"
97+
98+ # Read parameters (if any)
99+ IFS=' ,' read -r -a USER_PROVIDED_PAIRS <<< " $MODELS"
100+ USER_REGION=" $REGIONS "
101+
102+ IS_USER_PROVIDED_PAIRS=false
103+
104+ if [ ${# USER_PROVIDED_PAIRS[@]} -lt 1 ]; then
105+ echo " No parameters provided, using default model-capacity pairs: ${MODEL_CAPACITY_PAIRS[*]} "
106+ else
107+ echo " Using provided model and capacity pairs: ${USER_PROVIDED_PAIRS[*]} "
108+ IS_USER_PROVIDED_PAIRS=true
109+ MODEL_CAPACITY_PAIRS=(" ${USER_PROVIDED_PAIRS[@]} " )
110+ fi
111+
112+ declare -a FINAL_MODEL_NAMES
113+ declare -a FINAL_CAPACITIES
114+ declare -a TABLE_ROWS
115+
116+ for PAIR in " ${MODEL_CAPACITY_PAIRS[@]} " ; do
117+ MODEL_NAME=$( echo " $PAIR " | cut -d' :' -f1 | tr ' [:upper:]' ' [:lower:]' )
118+ CAPACITY=$( echo " $PAIR " | cut -d' :' -f2)
119+
120+ if [ -z " $MODEL_NAME " ] || [ -z " $CAPACITY " ]; then
121+ echo " ❌ ERROR: Invalid model and capacity pair '$PAIR '. Both model and capacity must be specified."
122+ exit 1
123+ fi
124+
125+ FINAL_MODEL_NAMES+=(" $MODEL_NAME " )
126+ FINAL_CAPACITIES+=(" $CAPACITY " )
127+
128+ done
129+
130+ echo " 🔄 Using Models: ${FINAL_MODEL_NAMES[*]} with respective Capacities: ${FINAL_CAPACITIES[*]} "
131+ echo " ----------------------------------------"
132+
133+ # Check if the user provided a region, if not, use the default regions
134+ if [ -n " $USER_REGION " ]; then
135+ echo " 🔍 User provided region: $USER_REGION "
136+ IFS=' ,' read -r -a REGIONS <<< " $USER_REGION"
137+ else
138+ echo " No region specified, using default regions: ${DEFAULT_REGION_ARRAY[*]} "
139+ REGIONS=(" ${DEFAULT_REGION_ARRAY[@]} " )
140+ APPLY_OR_CONDITION=true
141+ fi
142+
143+ echo " ✅ Retrieved Azure regions. Checking availability..."
144+ INDEX=1
145+
146+ VALID_REGIONS=()
147+ for REGION in " ${REGIONS[@]} " ; do
148+ log_verbose " ----------------------------------------"
149+ log_verbose " 🔍 Checking region: $REGION "
150+
151+ QUOTA_INFO=$( az cognitiveservices usage list --location " $REGION " --output json | tr ' [:upper:]' ' [:lower:]' )
152+ if [ -z " $QUOTA_INFO " ]; then
153+ log_verbose " ⚠️ WARNING: Failed to retrieve quota for region $REGION . Skipping."
154+ continue
155+ fi
156+
157+ TEXT_EMBEDDING_AVAILABLE=false
158+ AT_LEAST_ONE_MODEL_AVAILABLE=false
159+ TEMP_TABLE_ROWS=()
160+
161+ for index in " ${! FINAL_MODEL_NAMES[@]} " ; do
162+ MODEL_NAME=" ${FINAL_MODEL_NAMES[$index]} "
163+ REQUIRED_CAPACITY=" ${FINAL_CAPACITIES[$index]} "
164+ FOUND=false
165+ INSUFFICIENT_QUOTA=false
166+
167+ MODEL_TYPES=(" openai.standard.$MODEL_NAME " " openai.globalstandard.$MODEL_NAME " )
168+
169+ for MODEL_TYPE in " ${MODEL_TYPES[@]} " ; do
170+ FOUND=false
171+ INSUFFICIENT_QUOTA=false
172+ log_verbose " 🔍 Checking model: $MODEL_NAME with required capacity: $REQUIRED_CAPACITY ($MODEL_TYPE )"
173+
174+ MODEL_INFO=$( echo " $QUOTA_INFO " | awk -v model=" \" value\" : \" $MODEL_TYPE \" " '
175+ BEGIN { RS="},"; FS="," }
176+ $0 ~ model { print $0 }
177+ ' )
178+
179+ if [ -z " $MODEL_INFO " ]; then
180+ FOUND=false
181+ log_verbose " ⚠️ WARNING: No quota information found for model: $MODEL_NAME in region: $REGION for model type: $MODEL_TYPE ."
182+ continue
183+ fi
184+
185+ if [ -n " $MODEL_INFO " ]; then
186+ FOUND=true
187+ CURRENT_VALUE=$( echo " $MODEL_INFO " | awk -F' : ' ' /"currentvalue"/ {print $2}' | tr -d ' ,' | tr -d ' ' )
188+ LIMIT=$( echo " $MODEL_INFO " | awk -F' : ' ' /"limit"/ {print $2}' | tr -d ' ,' | tr -d ' ' )
189+
190+ CURRENT_VALUE=${CURRENT_VALUE:- 0}
191+ LIMIT=${LIMIT:- 0}
192+
193+ CURRENT_VALUE=$( echo " $CURRENT_VALUE " | cut -d' .' -f1)
194+ LIMIT=$( echo " $LIMIT " | cut -d' .' -f1)
195+
196+ AVAILABLE=$(( LIMIT - CURRENT_VALUE))
197+ log_verbose " ✅ Model: $MODEL_TYPE | Used: $CURRENT_VALUE | Limit: $LIMIT | Available: $AVAILABLE "
198+
199+ if [ " $AVAILABLE " -ge " $REQUIRED_CAPACITY " ]; then
200+ FOUND=true
201+ if [ " $MODEL_NAME " = " text-embedding-ada-002" ]; then
202+ TEXT_EMBEDDING_AVAILABLE=true
203+ fi
204+ AT_LEAST_ONE_MODEL_AVAILABLE=true
205+ TEMP_TABLE_ROWS+=(" $( printf " | %-4s | %-20s | %-43s | %-10s | %-10s | %-10s |" " $INDEX " " $REGION " " $MODEL_TYPE " " $LIMIT " " $CURRENT_VALUE " " $AVAILABLE " ) " )
206+ else
207+ INSUFFICIENT_QUOTA=true
208+ fi
209+ fi
210+
211+ if [ " $FOUND " = false ]; then
212+ log_verbose " ❌ No models found for model: $MODEL_NAME in region: $REGION (${MODEL_TYPES[*]} )"
213+
214+ elif [ " $INSUFFICIENT_QUOTA " = true ]; then
215+ log_verbose " ⚠️ Model $MODEL_NAME in region: $REGION has insufficient quota (${MODEL_TYPES[*]} )."
216+ fi
217+ done
218+ done
219+
220+ if { [ " $IS_USER_PROVIDED_PAIRS " = true ] && [ " $INSUFFICIENT_QUOTA " = false ] && [ " $FOUND " = true ]; } || { [ " $APPLY_OR_CONDITION " != true ] || [ " $AT_LEAST_ONE_MODEL_AVAILABLE " = true ]; }; then
221+ VALID_REGIONS+=(" $REGION " )
222+ TABLE_ROWS+=(" ${TEMP_TABLE_ROWS[@]} " )
223+ INDEX=$(( INDEX + 1 ))
224+ elif [ ${# USER_PROVIDED_PAIRS[@]} -eq 0 ]; then
225+ echo " 🚫 Skipping $REGION as it does not meet quota requirements."
226+ fi
227+
228+ done
229+
230+ if [ ${# TABLE_ROWS[@]} -eq 0 ]; then
231+ echo " --------------------------------------------------------------------------------------------------------------------"
232+
233+ echo " ❌ No regions have sufficient quota for all required models. Please request a quota increase: https://aka.ms/oai/stuquotarequest"
234+ else
235+ echo " ---------------------------------------------------------------------------------------------------------------------"
236+ printf " | %-4s | %-20s | %-43s | %-10s | %-10s | %-10s |\n" " No." " Region" " Model Name" " Limit" " Used" " Available"
237+ echo " ---------------------------------------------------------------------------------------------------------------------"
238+ for ROW in " ${TABLE_ROWS[@]} " ; do
239+ echo " $ROW "
240+ done
241+ echo " ---------------------------------------------------------------------------------------------------------------------"
242+ echo " ➡️ To request a quota increase, visit: https://aka.ms/oai/stuquotarequest"
243+ fi
244+
245+ echo " ✅ Script completed."
0 commit comments