@@ -20,8 +20,8 @@ usage() {
2020Usage: ./setup-glm.sh [--key <GLM_API_KEY>] [--skip-install] [--non-interactive]
2121
2222Installs/updates CCR (if missing), writes GLM-only config,
23- creates ~/.claude-code-router/keys.env, and installs a single
24- command: glm (plus aliases ccc and claude-glm) .
23+ creates ~/.claude-code-router/keys.env, and installs commands:
24+ glm (direct z.ai) + glm-ccr (router) + aliases ccc and claude-glm.
2525
2626Options:
2727 --key <GLM_API_KEY> Provide GLM key non-interactively
221221
222222"$CLAUDE_BIN" "$@"
223223EOS
224- chmod +x " $BIN_DIR /ccr-glm"
225- ln -sf " $BIN_DIR /ccr-glm" " $BIN_DIR /glm"
226- ln -sf " $BIN_DIR /ccr-glm" " $BIN_DIR /ccc"
227- ln -sf " $BIN_DIR /ccr-glm" " $BIN_DIR /claude-glm"
224+ cat > " $BIN_DIR /glm-zai" << 'EOS '
225+ #!/usr/bin/env bash
226+ set -euo pipefail
227+
228+ ROUTER_DIR="$HOME/.claude-code-router"
229+ KEYS_FILE="$ROUTER_DIR/keys.env"
230+
231+ load_keys() {
232+ if [[ -f "$KEYS_FILE" ]]; then
233+ while IFS= read -r line || [[ -n "$line" ]]; do
234+ line="${line%$'\r'}"
235+ line="${line%%#*}"
236+ line="$(echo "$line" | sed -E 's/^[[:space:]]*//; s/[[:space:]]*$//')"
237+ [[ -z "$line" ]] && continue
238+ if [[ "$line" =~ ^(export[[:space:]]+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
239+ key="${BASH_REMATCH[2]}"
240+ val="${BASH_REMATCH[3]}"
241+ val="$(echo "$val" | sed -E 's/^[[:space:]]*//; s/[[:space:]]*$//')"
242+ if [[ ${#val} -ge 2 ]]; then
243+ if [[ "${val:0:1}" == "\"" && "${val: -1}" == "\"" ]]; then
244+ val="${val:1:-1}"
245+ elif [[ "${val:0:1}" == "'" && "${val: -1}" == "'" ]]; then
246+ val="${val:1:-1}"
247+ fi
248+ fi
249+ val="${val%$'\r'}"
250+ if [[ -n "$val" ]]; then
251+ export "$key=$val"
252+ fi
253+ fi
254+ done < "$KEYS_FILE"
255+ fi
256+ }
257+
258+ load_keys
259+
260+ if [[ -z "${GLM_API_KEY:-}" ]]; then
261+ echo "GLM_API_KEY not set. Add it to ~/.claude-code-router/keys.env" >&2
262+ exit 1
263+ fi
264+
265+ # Direct z.ai (Anthropic-compatible) - no router required.
266+ export ANTHROPIC_AUTH_TOKEN="${GLM_API_KEY}"
267+ export ANTHROPIC_API_KEY="${GLM_API_KEY}"
268+ export ANTHROPIC_BASE_URL="https://api.z.ai/api/anthropic"
269+ export API_TIMEOUT_MS="${API_TIMEOUT_MS:-3000000}"
270+
271+ export ANTHROPIC_MODEL="${ANTHROPIC_MODEL:-glm-4.7}"
272+ export ANTHROPIC_DEFAULT_OPUS_MODEL="${ANTHROPIC_DEFAULT_OPUS_MODEL:-glm-4.7}"
273+ export ANTHROPIC_DEFAULT_SONNET_MODEL="${ANTHROPIC_DEFAULT_SONNET_MODEL:-glm-4.7}"
274+ export ANTHROPIC_DEFAULT_HAIKU_MODEL="${ANTHROPIC_DEFAULT_HAIKU_MODEL:-glm-4.5-air}"
275+ export ANTHROPIC_SMALL_FAST_MODEL="${ANTHROPIC_SMALL_FAST_MODEL:-glm-4.5-air}"
276+ export CLAUDE_CODE_SUBAGENT_MODEL="${CLAUDE_CODE_SUBAGENT_MODEL:-glm-4.7}"
277+
278+ CLAUDE_BIN="$HOME/.claude/local/claude"
279+ if [[ ! -x "$CLAUDE_BIN" ]]; then
280+ CLAUDE_BIN="$(command -v claude || true)"
281+ fi
282+ if [[ -z "${CLAUDE_BIN:-}" ]]; then
283+ echo "claude binary not found. Install Claude Code first." >&2
284+ exit 1
285+ fi
286+
287+ "$CLAUDE_BIN" "$@"
288+ EOS
289+ chmod +x " $BIN_DIR /ccr-glm" " $BIN_DIR /glm-zai"
290+ ln -sf " $BIN_DIR /glm-zai" " $BIN_DIR /glm"
291+ ln -sf " $BIN_DIR /glm-zai" " $BIN_DIR /ccc"
292+ ln -sf " $BIN_DIR /glm-zai" " $BIN_DIR /claude-glm"
293+ ln -sf " $BIN_DIR /ccr-glm" " $BIN_DIR /glm-ccr"
228294}
229295
230296ensure_path () {
@@ -266,4 +332,5 @@ ensure_path
266332echo " "
267333echo " GLM setup complete."
268334echo " Run: source ~/.zshrc"
269- echo " Then: glm"
335+ echo " Then: glm # direct z.ai (recommended)"
336+ echo " Or: glm-ccr # via local router"
0 commit comments