Claude Code에서 GLM 사용하는 방법

GLM API 발급

z.ai API Management에서 GLM 사용을 위한 API키를 발급받습니다.

Claude Code 로그아웃

Claude Code상에서 /logout 명령어로 로그아웃해주세요

NodeJS의 설치 (이미 설치되어있다면 패스)

https://nodejs.org/ko/download에서 NodeJS를 다운로드 받아 설치해주세요.

GLM API 키를 Claude Code에 설정

다음 코드에서 API Key 부분을 치환해서 Terminal에 붙여넣고 실행하세요.

macOS/Linux:

node << 'GLMINSTALLCODE'
const GLM_API_KEY = "GLM에서받은API키를여기에담아주세요"; // 🔑

const fs = require("fs");
const path = require("path");
const os = require("os");

const home = os.homedir();
const p = (...xs) => path.join(...xs);

const targets = [
  { file: p(home, ".claude.json"), patch: { hasCompletedOnboarding: true } },
  {
    file: p(home, ".claude", "settings.json"),
    patch: {
      env: {
        ANTHROPIC_AUTH_TOKEN: GLM_API_KEY,
        ANTHROPIC_BASE_URL: "https://api.z.ai/api/anthropic",
        API_TIMEOUT_MS: "3000000",
        ANTHROPIC_DEFAULT_HAIKU_MODEL: "glm-4.5-air",
        ANTHROPIC_DEFAULT_SONNET_MODEL: "glm-4.7",
        ANTHROPIC_DEFAULT_OPUS_MODEL: "glm-4.7",
      },
    },
  },
];

const readJson = (file) => {
  if (!fs.existsSync(file)) return {};
  try { return JSON.parse(fs.readFileSync(file, "utf8")); }
  catch { throw new Error(`Invalid JSON: ${file}`); }
};

const deepMerge = (base, patch) => {
  const out = { ...base };
  for (const [k, v] of Object.entries(patch)) {
    out[k] = (v && typeof v === "object" && !Array.isArray(v))
      ? deepMerge((base && base[k]) ?? {}, v)
      : v;
  }
  return out;
};

const writeJson = (file, obj) => {
  fs.mkdirSync(path.dirname(file), { recursive: true });
  fs.writeFileSync(file, JSON.stringify(obj, null, 2) + "\n");
  console.log(`✅ ${file}`);
};

for (const { file, patch } of targets) {
  writeJson(file, deepMerge(readJson(file), patch));
}
GLMINSTALLCODE

Windows:

$js = @'
const GLM_API_KEY = 'GLM에서받은API키를여기에담아주세요'; // 🔑

const fs = require('fs');
const path = require('path');
const os = require('os');

const home = os.homedir();
const p = (...xs) => path.join(...xs);

const targets = [
  { file: p(home, '.claude.json'), patch: { hasCompletedOnboarding: true } },
  {
    file: p(home, '.claude', 'settings.json'),
    patch: {
      env: {
        ANTHROPIC_AUTH_TOKEN: GLM_API_KEY,
        ANTHROPIC_BASE_URL: 'https://api.z.ai/api/anthropic',
        API_TIMEOUT_MS: '3000000',
        ANTHROPIC_DEFAULT_HAIKU_MODEL: 'glm-4.5-air',
        ANTHROPIC_DEFAULT_SONNET_MODEL: 'glm-4.7',
        ANTHROPIC_DEFAULT_OPUS_MODEL: 'glm-4.7',
      },
    },
  },
];

const readJson = (file) => {
  if (!fs.existsSync(file)) return {};
  try { return JSON.parse(fs.readFileSync(file, 'utf8')); }
  catch { throw new Error(`Invalid JSON: ${file}`); }
};

const deepMerge = (base, patch) => {
  const out = { ...base };
  for (const [k, v] of Object.entries(patch)) {
    out[k] = (v && typeof v === 'object' && !Array.isArray(v))
      ? deepMerge((base && base[k]) ?? {}, v)
      : v;
  }
  return out;
};

const writeJson = (file, obj) => {
  fs.mkdirSync(path.dirname(file), { recursive: true });
  fs.writeFileSync(file, JSON.stringify(obj, null, 2) + '\n');
  console.log(`✅ ${file}`);
};

for (const { file, patch } of targets) {
  writeJson(file, deepMerge(readJson(file), patch));
}
'@

$b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($js))
node -e "eval(Buffer.from('$b64','base64').toString('utf8'))"