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'))"