Skip to content

Commit f15cdbc

Browse files
committed
feat: add config subcommand to manage API keys
- Add config add: Add or update API key for a provider - Add config list: List all configured API keys (with masking) - Add config remove: Remove API key for a provider - Support for all LLM providers (dashscope, deepseek, openai, etc.) - User-friendly provider name mapping - Update help documentation with examples
1 parent 5747465 commit f15cdbc

1 file changed

Lines changed: 330 additions & 1 deletion

File tree

all-in-one/get-ai-gateway.sh

Lines changed: 330 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,21 @@ COMMAND_START="start"
3838
COMMAND_STOP="stop"
3939
COMMAND_DELETE="delete"
4040
COMMAND_ROUTE="route"
41-
KNOWN_COMMANDS=($COMMAND_START, $COMMAND_STOP, $COMMAND_DELETE, $COMMAND_ROUTE)
41+
COMMAND_CONFIG="config"
42+
KNOWN_COMMANDS=($COMMAND_START, $COMMAND_STOP, $COMMAND_DELETE, $COMMAND_ROUTE, $COMMAND_CONFIG)
4243

4344
# Route subcommands
4445
ROUTE_ADD="add"
4546
ROUTE_LIST="list"
4647
ROUTE_REMOVE="remove"
4748
KNOWN_ROUTE_SUBCOMMANDS=($ROUTE_ADD, $ROUTE_LIST, $ROUTE_REMOVE)
4849

50+
# Config subcommands
51+
CONFIG_ADD="add"
52+
CONFIG_LIST="list"
53+
CONFIG_REMOVE="remove"
54+
KNOWN_CONFIG_SUBCOMMANDS=($CONFIG_ADD, $CONFIG_LIST, $CONFIG_REMOVE)
55+
4956
cd "$(dirname -- "$0")"
5057
ROOT="$(pwd -P)/higress"
5158
SCRIPT_DIR="$(pwd -P)"
@@ -284,6 +291,15 @@ parseArgs() {
284291
ROUTE_RULE_ID="$2"
285292
shift 2
286293
;;
294+
# Config command options
295+
--provider)
296+
CONFIG_PROVIDER="$2"
297+
shift 2
298+
;;
299+
--key)
300+
CONFIG_KEY="$2"
301+
shift 2
302+
;;
287303
-* | --*)
288304
echo "Unknown option $1"
289305
exit 1
@@ -322,6 +338,24 @@ parseArgs() {
322338
exit 1
323339
fi
324340
fi
341+
342+
# Parse config subcommand
343+
if [ "$COMMAND" == "$COMMAND_CONFIG" ]; then
344+
if [ ${#POSITIONAL_ARGS[@]} -gt 0 ]; then
345+
CONFIG_SUBCOMMAND="${POSITIONAL_ARGS[0]}"
346+
else
347+
CONFIG_SUBCOMMAND=""
348+
fi
349+
if [ -z "$CONFIG_SUBCOMMAND" ]; then
350+
echo "Config subcommand required: add, list, remove"
351+
exit 1
352+
fi
353+
if [[ ! ${KNOWN_CONFIG_SUBCOMMANDS[@]} =~ "$CONFIG_SUBCOMMAND" ]]; then
354+
echo "Unknown config subcommand: $CONFIG_SUBCOMMAND"
355+
echo "Available: add, list, remove"
356+
exit 1
357+
fi
358+
fi
325359
}
326360

327361
configure() {
@@ -847,12 +881,18 @@ Commands:
847881
stop Stop the gateway
848882
delete Delete the gateway container
849883
route Manage auto-routing rules (see below)
884+
config Manage API key configuration (see below)
850885
851886
Route Subcommands:
852887
route add Add a new routing rule
853888
route list List all routing rules
854889
route remove Remove a routing rule by ID
855890
891+
Config Subcommands:
892+
config add Add or update an API key
893+
config list List all configured API keys
894+
config remove Remove an API key
895+
856896
Options:
857897
-h, --help Show this help message
858898
@@ -877,6 +917,10 @@ Route Options (for route add/remove):
877917
--pattern REGEX Custom regex pattern (alternative to --trigger)
878918
--rule-id ID Rule ID to remove (required for remove)
879919
920+
Config Options (for config add/remove):
921+
--provider PROVIDER Provider name (dashscope, deepseek, moonshot, etc.)
922+
--key KEY API key to set (required for add)
923+
880924
LLM Provider API Keys:
881925
--dashscope-key KEY Aliyun Dashscope (Qwen) API key
882926
--deepseek-key KEY DeepSeek API key
@@ -931,6 +975,15 @@ Examples:
931975
932976
# Remove a routing rule
933977
./get-ai-gateway.sh route remove --rule-id 0
978+
979+
# List all configured API keys
980+
./get-ai-gateway.sh config list
981+
982+
# Add or update an API key
983+
./get-ai-gateway.sh config add --provider deepseek --key sk-xxx
984+
985+
# Remove an API key
986+
./get-ai-gateway.sh config remove --provider deepseek
934987
'
935988
}
936989

@@ -1144,6 +1197,279 @@ delete() {
11441197
fi
11451198
}
11461199

1200+
# ============================================================================
1201+
# Config Command Functions
1202+
# ============================================================================
1203+
1204+
# Get provider name from environment variable name
1205+
getProviderName() {
1206+
local env_var="$1"
1207+
case "$env_var" in
1208+
DASHSCOPE_API_KEY) echo "Aliyun Dashscope (Qwen)" ;;
1209+
DEEPSEEK_API_KEY) echo "DeepSeek" ;;
1210+
MOONSHOT_API_KEY) echo "Moonshot (Kimi)" ;;
1211+
ZHIPUAI_API_KEY) echo "Zhipu AI" ;;
1212+
OPENAI_API_KEY) echo "OpenAI" ;;
1213+
OPENROUTER_API_KEY) echo "OpenRouter" ;;
1214+
CLAUDE_API_KEY) echo "Claude" ;;
1215+
GEMINI_API_KEY) echo "Google Gemini" ;;
1216+
GROQ_API_KEY) echo "Groq" ;;
1217+
DOUBAO_API_KEY) echo "Doubao" ;;
1218+
BAICHUAN_API_KEY) echo "Baichuan AI" ;;
1219+
YI_API_KEY) echo "01.AI (Yi)" ;;
1220+
STEPFUN_API_KEY) echo "Stepfun" ;;
1221+
MINIMAX_API_KEY) echo "Minimax" ;;
1222+
COHERE_API_KEY) echo "Cohere" ;;
1223+
MISTRAL_API_KEY) echo "Mistral AI" ;;
1224+
GITHUB_API_KEY) echo "Github Models" ;;
1225+
FIREWORKS_API_KEY) echo "Fireworks AI" ;;
1226+
TOGETHERAI_API_KEY) echo "Together AI" ;;
1227+
GROK_API_KEY) echo "Grok" ;;
1228+
*) echo "Unknown ($env_var)" ;;
1229+
esac
1230+
}
1231+
1232+
# Get environment variable name from provider shorthand
1233+
getEnvVarName() {
1234+
local provider="$1"
1235+
case "$provider" in
1236+
dashscope|qwen) echo "DASHSCOPE_API_KEY" ;;
1237+
deepseek) echo "DEEPSEEK_API_KEY" ;;
1238+
moonshot|kimi) echo "MOONSHOT_API_KEY" ;;
1239+
zhipuai|zhipu) echo "ZHIPUAI_API_KEY" ;;
1240+
openai) echo "OPENAI_API_KEY" ;;
1241+
openrouter) echo "OPENROUTER_API_KEY" ;;
1242+
claude) echo "CLAUDE_API_KEY" ;;
1243+
gemini) echo "GEMINI_API_KEY" ;;
1244+
groq) echo "GROQ_API_KEY" ;;
1245+
doubao) echo "DOUBAO_API_KEY" ;;
1246+
baichuan) echo "BAICHUAN_API_KEY" ;;
1247+
yi) echo "YI_API_KEY" ;;
1248+
stepfun) echo "STEPFUN_API_KEY" ;;
1249+
minimax) echo "MINIMAX_API_KEY" ;;
1250+
cohere) echo "COHERE_API_KEY" ;;
1251+
mistral) echo "MISTRAL_API_KEY" ;;
1252+
github) echo "GITHUB_API_KEY" ;;
1253+
fireworks) echo "FIREWORKS_API_KEY" ;;
1254+
togetherai|together) echo "TOGETHERAI_API_KEY" ;;
1255+
grok) echo "GROK_API_KEY" ;;
1256+
*) echo "" ;;
1257+
esac
1258+
}
1259+
1260+
# Mask API key for display
1261+
maskApiKey() {
1262+
local key="$1"
1263+
if [ -z "$key" ]; then
1264+
echo "<not set>"
1265+
return
1266+
fi
1267+
local len=${#key}
1268+
if [ $len -le 8 ]; then
1269+
echo "${key:0:2}***"
1270+
else
1271+
echo "${key:0:4}***${key: -4}"
1272+
fi
1273+
}
1274+
1275+
# Config list: List all configured API keys
1276+
configList() {
1277+
local config_file="$ROOT/$CONFIG_FILENAME"
1278+
1279+
if [ ! -f "$config_file" ]; then
1280+
echo "Error: Configuration file not found: $config_file"
1281+
echo "Please start the gateway first with: $0 start"
1282+
exit 1
1283+
fi
1284+
1285+
echo "Current LLM Provider API Keys:"
1286+
echo
1287+
1288+
# List of known API key environment variables
1289+
local api_keys=(
1290+
"DASHSCOPE_API_KEY"
1291+
"DEEPSEEK_API_KEY"
1292+
"MOONSHOT_API_KEY"
1293+
"ZHIPUAI_API_KEY"
1294+
"OPENAI_API_KEY"
1295+
"OPENROUTER_API_KEY"
1296+
"CLAUDE_API_KEY"
1297+
"GEMINI_API_KEY"
1298+
"GROQ_API_KEY"
1299+
"DOUBAO_API_KEY"
1300+
"BAICHUAN_API_KEY"
1301+
"YI_API_KEY"
1302+
"STEPFUN_API_KEY"
1303+
"MINIMAX_API_KEY"
1304+
"COHERE_API_KEY"
1305+
"MISTRAL_API_KEY"
1306+
"GITHUB_API_KEY"
1307+
"FIREWORKS_API_KEY"
1308+
"TOGETHERAI_API_KEY"
1309+
"GROK_API_KEY"
1310+
)
1311+
1312+
local found=0
1313+
for env_var in "${api_keys[@]}"; do
1314+
local value=$(grep "^${env_var}=" "$config_file" | cut -d'=' -f2-)
1315+
if [ -n "$value" ]; then
1316+
local provider_name=$(getProviderName "$env_var")
1317+
local masked=$(maskApiKey "$value")
1318+
printf " %-25s %s\n" "$provider_name:" "$masked"
1319+
found=1
1320+
fi
1321+
done
1322+
1323+
if [ $found -eq 0 ]; then
1324+
echo " No API keys configured."
1325+
echo
1326+
echo "Add an API key with:"
1327+
echo " $0 config add --provider <provider> --key <api-key>"
1328+
else
1329+
echo
1330+
echo "Update an API key with:"
1331+
echo " $0 config add --provider <provider> --key <new-api-key>"
1332+
echo
1333+
echo "Remove an API key with:"
1334+
echo " $0 config remove --provider <provider>"
1335+
fi
1336+
}
1337+
1338+
# Config add: Add or update an API key
1339+
configAdd() {
1340+
if [ -z "$CONFIG_PROVIDER" ]; then
1341+
echo "Error: --provider is required"
1342+
echo
1343+
echo "Supported providers:"
1344+
echo " dashscope, deepseek, moonshot, zhipuai, openai, openrouter,"
1345+
echo " claude, gemini, groq, doubao, baichuan, yi, stepfun, minimax,"
1346+
echo " cohere, mistral, github, fireworks, togetherai, grok"
1347+
echo
1348+
echo "Usage: $0 config add --provider <provider> --key <api-key>"
1349+
exit 1
1350+
fi
1351+
1352+
if [ -z "$CONFIG_KEY" ]; then
1353+
echo "Error: --key is required"
1354+
echo "Usage: $0 config add --provider <provider> --key <api-key>"
1355+
exit 1
1356+
fi
1357+
1358+
local config_file="$ROOT/$CONFIG_FILENAME"
1359+
1360+
if [ ! -f "$config_file" ]; then
1361+
echo "Error: Configuration file not found: $config_file"
1362+
echo "Please start the gateway first with: $0 start"
1363+
exit 1
1364+
fi
1365+
1366+
local env_var=$(getEnvVarName "$CONFIG_PROVIDER")
1367+
if [ -z "$env_var" ]; then
1368+
echo "Error: Unknown provider: $CONFIG_PROVIDER"
1369+
echo
1370+
echo "Supported providers:"
1371+
echo " dashscope, deepseek, moonshot, zhipuai, openai, openrouter,"
1372+
echo " claude, gemini, groq, doubao, baichuan, yi, stepfun, minimax,"
1373+
echo " cohere, mistral, github, fireworks, togetherai, grok"
1374+
exit 1
1375+
fi
1376+
1377+
local provider_name=$(getProviderName "$env_var")
1378+
1379+
# Check if the key already exists
1380+
if grep -q "^${env_var}=" "$config_file"; then
1381+
echo "Updating existing API key for $provider_name..."
1382+
sedInPlace "/^${env_var}=/c\\${env_var}=${CONFIG_KEY}" "$config_file"
1383+
else
1384+
echo "Adding new API key for $provider_name..."
1385+
echo "${env_var}=${CONFIG_KEY}" >> "$config_file"
1386+
fi
1387+
1388+
if [ $? -eq 0 ]; then
1389+
echo
1390+
echo "✅ API key updated successfully!"
1391+
echo
1392+
echo "Provider: $provider_name"
1393+
echo "Key: $(maskApiKey "$CONFIG_KEY")"
1394+
echo
1395+
echo "Restart the gateway to apply changes:"
1396+
echo " $0 stop && $0 start"
1397+
else
1398+
echo "Error: Failed to update configuration file"
1399+
exit 1
1400+
fi
1401+
}
1402+
1403+
# Config remove: Remove an API key
1404+
configRemove() {
1405+
if [ -z "$CONFIG_PROVIDER" ]; then
1406+
echo "Error: --provider is required"
1407+
echo "Usage: $0 config remove --provider <provider>"
1408+
exit 1
1409+
fi
1410+
1411+
local config_file="$ROOT/$CONFIG_FILENAME"
1412+
1413+
if [ ! -f "$config_file" ]; then
1414+
echo "Error: Configuration file not found: $config_file"
1415+
echo "Please start the gateway first with: $0 start"
1416+
exit 1
1417+
fi
1418+
1419+
local env_var=$(getEnvVarName "$CONFIG_PROVIDER")
1420+
if [ -z "$env_var" ]; then
1421+
echo "Error: Unknown provider: $CONFIG_PROVIDER"
1422+
echo
1423+
echo "Supported providers:"
1424+
echo " dashscope, deepseek, moonshot, zhipuai, openai, openrouter,"
1425+
echo " claude, gemini, groq, doubao, baichuan, yi, stepfun, minimax,"
1426+
echo " cohere, mistral, github, fireworks, togetherai, grok"
1427+
exit 1
1428+
fi
1429+
1430+
local provider_name=$(getProviderName "$env_var")
1431+
1432+
# Check if the key exists
1433+
if ! grep -q "^${env_var}=" "$config_file"; then
1434+
echo "Error: No API key configured for $provider_name"
1435+
echo
1436+
echo "Current configuration:"
1437+
echo " $0 config list"
1438+
exit 1
1439+
fi
1440+
1441+
# Remove the key
1442+
sedInPlace "/^${env_var}=/d" "$config_file"
1443+
1444+
if [ $? -eq 0 ]; then
1445+
echo
1446+
echo "✅ API key removed successfully!"
1447+
echo
1448+
echo "Provider: $provider_name"
1449+
echo
1450+
echo "Restart the gateway to apply changes:"
1451+
echo " $0 stop && $0 start"
1452+
else
1453+
echo "Error: Failed to update configuration file"
1454+
exit 1
1455+
fi
1456+
}
1457+
1458+
# Config command dispatcher
1459+
config() {
1460+
case "$CONFIG_SUBCOMMAND" in
1461+
"$CONFIG_ADD")
1462+
configAdd
1463+
;;
1464+
"$CONFIG_LIST")
1465+
configList
1466+
;;
1467+
"$CONFIG_REMOVE")
1468+
configRemove
1469+
;;
1470+
esac
1471+
}
1472+
11471473
# ============================================================================
11481474
# Route Command Functions
11491475
# ============================================================================
@@ -1459,4 +1785,7 @@ case $COMMAND in
14591785
"$COMMAND_ROUTE")
14601786
route
14611787
;;
1788+
"$COMMAND_CONFIG")
1789+
config
1790+
;;
14621791
esac

0 commit comments

Comments
 (0)