지식 기반 섹션 ▾

내비게이션

▸ 여기서 시작하세요 역할별

카테고리

도구 52
용어집 12

도구

Crush + JoinGonka Gateway: Gonka 네트워크 모델 기반의 Charm 에이전트

Crush는 Charm의 터미널 코딩 에이전트입니다. Charm은 수만 개의 프로그램이 사용하는 콘솔 인터페이스 라이브러리를 만드는 팀입니다. 프로젝트 파일을 읽고 수정하며, 명령을 실행하고, 언어 서버(LSP)에서 컨텍스트를 가져오며, MCP를 통해 외부 도구를 연결하고, 컨텍스트를 유지하면서 세션 도중 모델을 전환할 수 있습니다. macOS, Linux, Windows, Android 및 BSD에서 작동하며, 라이선스는 FSL-1.1-MIT입니다. 이 프로젝트는 opencode-ai/opencode 아카이브 저장소에서 파생되었으며, 초기 작성자와 Charm 팀이 프로젝트를 계승했습니다.

Crush는 OpenAI 호환 및 Anthropic 호환의 두 가지 외부 공급자를 지원합니다. JoinGonka Gateway는 openai-compat로 연결 가능하며, 설치 명령 한 번이나 설정 파일 몇 줄로 설정됩니다. 이를 통해 DeepSeek V4 Flash, GLM-5.3 Flash, MiniMax M2.7 등 Gonka의 분산 네트워크 모델을 100만 입력 토큰당 $0.0069의 단일 가격으로 사용할 수 있습니다.

Crush를 사용하기 전 알아두어야 할 두 가지 특징이 있습니다. 모델은 large와 small의 두 슬롯으로 구분되며, 인터페이스에서 선택한 모델은 설정 파일보다 우선하는 별도의 상태 파일에 저장됩니다. 이에 대해서는 별도의 섹션에서 설명합니다. 아래의 명령과 메시지는 2026년 9월 23일, 게이트웨이를 통해 Crush 0.96.1을 실행하여 검증되었습니다. 주소를 확인하면 계정에 3M 무료 토큰이 지급되며, 이를 사용해 직접 모든 과정을 테스트할 수 있습니다.

빠른 시작: 설치 및 명령 실행

1단계: Crush 설치하기. 프로젝트 README에 있는 공식 방법은 다음과 같습니다:

# Homebrew
brew install charmbracelet/tap/crush

# npm
npm install -g @charmland/crush

# Arch Linux
yay -S crush-bin

# Windows
winget install charmbracelet.crush

# Go
go install github.com/charmbracelet/crush@latest

같은 곳에 Debian, Ubuntu, Fedora, RHEL, Nix, Scoop용 패키지 저장소 설명도 있으며, 릴리스 페이지에는 빌드된 바이너리가 있습니다. 확인은 crush --version으로 하며, crush version v0.96.1 같은 문자열이 응답으로 옵니다.

2단계: 키 발급받기. gate.joingonka.ai/register에서 가입하고 주소를 인증한 뒤 「API 키」 섹션에서 jg- 접두사가 붙은 키를 만드세요. 하나의 키와 하나의 잔액이 네트워크의 모든 모델에 적용됩니다.

3단계: 설치 프로그램 실행하기.

npx @joingonka/setup --tool crush

설치 프로그램이 키를 물어봅니다 — 셸 히스토리에 남지 않도록 명령줄 인자로는 전달되지 않습니다 — 그리고 네 가지를 처리합니다:

  • ~/.config/crush/crush.json에 joingonka 프로바이더를 기록합니다: 타입 openai-compat, 게이트웨이 주소, 리터럴로 된 키, 그리고 컨텍스트 윈도우·응답 상한·백만 토큰당 가격을 가진 네트워크의 세 가지 모델. 이 값들은 설치 시점에 게이트웨이에서 실시간으로 가져오며, Crush는 이를 기준으로 세션 비용을 계산합니다. 파일에는 600 권한이 부여됩니다;
  • 모델을 지정합니다: large 슬롯에는 DeepSeek V4 Flash, small에는 MiniMax M2.7, GLM-5.3 Flash는 수동 선택 목록에 남습니다. 이 작업은 large 슬롯이 비어 있거나 네트워크에서 빠진 저희 모델을 가리킬 때만 수행됩니다; 다른 사람의 선택은 그대로 두고, 출력에 전환 방법 힌트를 표시합니다;
  • 선택이 실제로 적용되는지 확인합니다: Crush 인터페이스에서 고른 모델은 상태 파일에 저장되며 그것이 설정을 덮어쓰기 때문입니다 — 이에 대해서는 large와 small 관련 섹션에서 다룹니다;
  • 백업을 만들고, 나머지 프로바이더와 설정은 그대로 두며, 게이트웨이에 실시간 요청을 보내 키·주소·모델을 바로 검증하는 것으로 마무리합니다.

다른 모델은 --model 플래그로 지정하며, 축약형은 deepseek, glm, minimax입니다; 명시적으로 지정된 모델은 항상 기록됩니다. 비표준 디렉터리는 Crush 자체와 동일한 방식으로 설치 프로그램도 반영합니다: 설정에는 CRUSH_GLOBAL_CONFIG, 상태 파일에는 CRUSH_GLOBAL_DATA, 그리고 XDG_CONFIG_HOME과 XDG_DATA_HOME입니다. 서버와 스크립트용으로 질문 없는 모드가 있으며, 여기서는 키를 환경 변수에서 가져옵니다:

JOINGONKA_API_KEY=jg-your-key npx @joingonka/setup --tool crush --model glm --non-interactive

Crush의 주요 포맷은 이제 crushrc가 되었지만, 설치 프로그램은 crush.json을 기록합니다: 모든 버전이 이를 인식합니다. 이미 crushrc가 있다면 Crush가 두 파일을 병합하고, 키가 겹치면 crushrc가 우선하며, 설치 프로그램 자체는 그것을 건드리지 않습니다.

수동 설정: crush.json 또는 crushrc

설치 프로그램이 하는 모든 일은 직접 손으로 작성할 수 있습니다. 아래는 실제로 작동하는 ~/.config/crush/crush.json입니다 — 이 파일을 게이트웨이로 실행해 봤습니다:

{
  "$schema": "https://charm.land/crush.json",
  "providers": {
    "joingonka": {
      "name": "JoinGonka (Gonka)",
      "type": "openai-compat",
      "base_url": "https://gate.joingonka.ai/v1",
      "api_key": "jg-your-key",
      "models": [
        { "id": "deepseek-ai/DeepSeek-V4-Flash-0731", "name": "DeepSeek V4 Flash (Gonka)",
          "context_window": 380000, "default_max_tokens": 32768,
          "can_reason": true, "supports_attachments": false },
        { "id": "MiniMaxAI/MiniMax-M2.7", "name": "MiniMax M2.7 (Gonka)",
          "context_window": 200000, "default_max_tokens": 8192,
          "can_reason": false, "supports_attachments": false },
        { "id": "zai-org/GLM-5.3-Flash", "name": "GLM-5.3 Flash (Gonka)",
          "context_window": 390000, "default_max_tokens": 8192,
          "can_reason": true, "supports_attachments": false }
      ]
    }
  },
  "models": {
    "large": { "provider": "joingonka", "model": "deepseek-ai/DeepSeek-V4-Flash-0731" },
    "small": { "provider": "joingonka", "model": "MiniMaxAI/MiniMax-M2.7" }
  }
}
필드값핵심 포인트
typeopenai-compatOpenAI 호환 API를 제공하는 외부 서비스용 타입입니다. openai 타입은 Crush 문서에서 OpenAI 자체를 통한 요청용으로 남겨두었습니다
base_urlhttps://gate.joingonka.ai/v1끝에 /v1을 붙입니다. /chat/completions 경로는 Crush가 알아서 덧붙입니다
api_key본인의 키 jg-…Crush는 값을 셸 치환으로 처리하기 때문에, 키 대신 $JOINGONKA_API_KEY를 써도 됩니다. 이 경우 Crush를 실행하는 환경에 변수가 export되어 있어야 합니다
context_window모델의 컨텍스트 윈도우Crush는 이를 기준으로 컨텍스트 사용량을 표시하고, 언제 히스토리를 압축할지 결정합니다
default_max_tokens응답 상한모든 요청에 max_tokens로 전달됩니다. 추론 모델의 경우 이 예산에 추론도 포함됩니다

Crush는 엄격한 JSON만 받아들입니다. 주석이나 마지막 쉼표가 하나라도 있으면 시작되지 않습니다. 가격 필드(cost_per_1m_in, cost_per_1m_out, 그리고 캐시용 두 필드)는 비용 카운터에만 필요합니다. 설치 프로그램은 여기에 게이트웨이의 실시간 가격을 넣지만, 없어도 Crush는 작동하며 0으로 표시됩니다 — $schema 스키마가 있는 편집기만 이 필드들을 필수로 표시할 뿐입니다.

같은 프로바이더를 crushrc 형식으로 쓰면 이렇게 됩니다. Crush 내장 명령이 있는 평범한 Bash입니다. 파일 ~/.config/crush/crushrc:

provider add joingonka \
  --name "JoinGonka (Gonka)" \
  --type openai-compat \
  --base-url "https://gate.joingonka.ai/v1" \
  --api-key "${JOINGONKA_API_KEY:?set JOINGONKA_API_KEY}"

model add joingonka/deepseek-ai/DeepSeek-V4-Flash-0731 \
  --name "DeepSeek V4 Flash (Gonka)" \
  --context-window 380000 --default-max-tokens 32768 --can-reason true

model add joingonka/MiniMaxAI/MiniMax-M2.7 \
  --name "MiniMax M2.7 (Gonka)" \
  --context-window 200000 --default-max-tokens 8192

model add joingonka/zai-org/GLM-5.3-Flash \
  --name "GLM-5.3 Flash (Gonka)" \
  --context-window 390000 --default-max-tokens 8192 --can-reason true

model large joingonka/deepseek-ai/DeepSeek-V4-Flash-0731
model small joingonka/MiniMaxAI/MiniMax-M2.7

여기서 모델은 provider/model-id 형식으로 지정합니다. 첫 번째 슬래시 앞은 프로바이더 이름, 그 뒤는 네트워크상의 ID를 그대로 씁니다. ${JOINGONKA_API_KEY:?…} 형식을 쓰면 키를 파일 밖에 둘 수 있지만, 변수가 export되어 있지 않으면 Crush가 시작되지 않습니다 — 빈 키로 요청을 보내는 것보다 시작 시점의 오류가 낫습니다.

large 및 small 모델과 상태 파일

Crush의 모델은 전체에 하나만 선택하는 것이 아니라, 다음 두 슬롯에 대해 각각 선택합니다:

슬롯실행 작업설치 프로그램의 기본값변경 방법
large메인 에이전트: 파일 읽기/수정, 명령어 실행을 포함한 모든 동작DeepSeek V4 Flash: 380K 컨텍스트 윈도우 및 네트워크상 가장 큰 응답 제한 32768인터페이스에서 ctrl+l, crush run의 -m 옵션, 설정 파일의 models.large
small보조 작업: 세션 이름 생성 및 웹 검색, 웹 페이지 읽기를 수행하는 서브 에이전트. 소형 모델이 세션 이름 생성에 실패할 경우, Crush는 대형 모델에 다시 요청합니다MiniMax M2.7: 네트워크상 가장 큰 용량 보유crush run의 --small-model 옵션, 설정 파일의 models.small, crushrc의 model small

추론 모델인 GLM-5.3 Flash는 복잡한 로직을 위해 선택하지만, 응답 제한이 8192이며 그 일부가 추론 과정에 사용된다는 점을 기억해야 합니다. 자세한 내용은 모델 개요를 참조하세요. 1회 실행 시 모델은 전체 이름으로 지정합니다: crush run -m joingonka/zai-org/GLM-5.3-Flash "…". 사용 가능한 모든 이름은 crush models joingonka로 출력할 수 있습니다.

상태 파일. 인터페이스에서 ctrl+l로 선택한 모델은 crush.json이 아닌 머신 상태 파일(~/.local/share/crush/crush.json, Windows의 경우 %LOCALAPPDATA%\crush\crush.json)에 기록됩니다. 이 파일은 사용자 설정 및 crushrc보다 우선순위가 높습니다. Crush는 /etc/crush/crush.json → ~/.config/crush/crush.json → ~/.config/crush/crushrc → 상태 파일 순으로 읽으며, 이후에 읽히는 설정이 이전 설정을 덮어씁니다. 프로젝트 디렉토리 내의 crush.json 또는 crushrc 설정이 최상위 우선순위를 가집니다. 사용자 머신에서 파일 위치는 crush dirs를 통해 확인할 수 있습니다.

이번 실행에서 모델 선택창을 열어 "JoinGonka (Gonka)" 프로바이더가 "✓ Configured" 상태임을 확인한 후, MiniMax M2.7을 선택했습니다. Crush는 "Large model changed to MiniMax M2.7 (Gonka)"라고 응답하고 상태 파일에 다음과 같이 기록했습니다:

{"models":{"large":{"model":"MiniMaxAI/MiniMax-M2.7","provider":"joingonka","max_tokens":8192}}, …}

이제 이 모델은 crush.json에 적힌 내용보다 우선합니다. 설치 프로그램은 이러한 상황을 인식하고 다음과 같이 동작합니다:

  • --model 옵션이 없을 때: 상태 파일을 수정하지 않습니다(사용자의 작업 환경 선택을 존중). 대신, Crush가 실제로 어떤 모델로 시작될지 경고합니다: Heads-up: Crush will still start with joingonka/MiniMaxAI/MiniMax-M2.7, not joingonka/deepseek-ai/DeepSeek-V4-Flash-0731. 인터페이스에 GLM-5.3 Flash나 다른 프로바이더의 모델이 선택되어 있는 경우도 동일합니다.
  • --model 옵션이 있을 때: 상태 파일에서 models.large 항목만 수정하며, 사전에 복사본을 저장한 뒤 변경 전후의 상태를 출력합니다. 그렇지 않으면 플래그가 적용되지 않기 때문입니다. 이 실행 후, Crush는 플래그에 지정된 모델로 시작되었습니다.

검증: 기대되는 동작

먼저 Crush가 프로바이더를 인식하는지 확인하세요:

crush models joingonka

응답은 세 줄입니다:

joingonka/MiniMaxAI/MiniMax-M2.7
joingonka/deepseek-ai/DeepSeek-V4-Flash-0731
joingonka/zai-org/GLM-5.3-Flash

다음으로 인터페이스 없이 한 번 실행해 봅니다. 프로젝트 디렉터리에 명백한 버그가 있는 파일을 놓고 그것을 찾아달라고 요청하세요:

crush run -q "Read calc.py and tell me in one sentence whether it has a bug."

에이전트는 스스로 파일 읽기 도구를 호출하고 줄 번호와 함께 본질적으로 답해야 합니다. 저희 실행에서는 네트워크의 세 모델 모두 버그를 찾아냈고, 작업에 걸린 시간은 20~40초였습니다. -q 플래그는 대기 표시기를 숨깁니다. crush run 모드에서는 모든 도구 호출이 자동으로 승인되므로 자신의 프로젝트에서 실행하세요. 일반 인터페이스(crush 명령)에서는 활성 모델이 상태 표시줄에 보입니다: ◇ DeepSeek V4 Flash (Gonka) via JoinGonka (Gonka). 세션과 로그는 Crush가 프로젝트의 .crush 디렉터리에 보관하며, 전용 .gitignore로 git에서 보호됩니다. 로그는 crush logs로 출력됩니다. 게이트웨이 측에서는 요청이 관리 화면에서 보입니다: '사용량' 섹션의 '모델별' 및 '키별' 내역입니다.

문제가 생겼을 때, 진단은 보통 메시지에서 바로 읽힙니다:

보이는 것의미할 일
unauthorized: Invalid API key.게이트웨이가 키를 받아들이지 않음api_key를 확인하세요: 키 전체를, 공백 없이. 변수 참조인 경우, 해당 변수가 이 셸에서 내보내져 있어야 합니다
invalid JSON in config file …/crush.json파일에 주석, 끝 쉼표 또는 오타가 있음Crush는 엄격한 JSON만 받습니다: 파일을 수정하세요. 설치 프로그램은 주석을 자동으로 제거하지 않지만 경고하며, 전혀 파싱되지 않는 파일은 건드리지 않고 원인을 알려줍니다
failed to load shell config …/crushrc: … exit status 1crushrc의 오류, 대개 ${…:?} 형식의 키 변수가 설정되지 않음실행 전에 변수를 내보내거나 스크립트가 실패하는 줄을 수정하세요
Failed to override models: large model "…" not found-m 플래그의 모델 이름 오타crush models joingonka 출력에서 이름을 복사하세요
too many requests: Model "…" is currently overloaded in the Gonka network (rate limit)피크 시간에 모델의 네트워크 용량이 부족함Crush는 증가하는 간격으로 요청을 재시도하며(저희 실행에서는 약 1분), 그 후에야 포기합니다. ctrl+l 또는 -m으로 다른 모델로 전환하거나 기다리세요. 상태는 상태 페이지에서 확인할 수 있습니다
Crush가 설치 프로그램이 알린 것과 다른 모델로 열림인터페이스에서의 선택은 상태 파일에 저장되어 설정을 덮어씀ctrl+l로 모델을 선택하거나 --model과 함께 설치를 다시 실행하세요
402잔액이 소진됨'결제' 섹션에서 충전하세요. 키 자체는 유효합니다

비용 안내

에이전트는 일반 채팅과 다르게 토큰을 소비합니다. Crush는 모든 입력에 시스템 프롬프트와 도구 설명을 추가하며, 작업은 보통 여러 번의 주고받기를 거칩니다. 이번 테스트에서 각 모델 요청은 약 11,500개의 입력 토큰을 소비했고, "파일을 읽고 오류를 찾는" 작업은 2~3회의 요청과 23,000~35,000개의 토큰을 소비했습니다(대부분 입력 토큰). 따라서 토큰 단가가 중요합니다.

JoinGonka Gateway를 통한 토큰 요금은 입력 100만 토큰당 $0.0069, 출력 100만 토큰당 $0.021입니다. 이 가격은 네트워크의 모든 모델에 공통으로 적용되며 이 페이지에서 실시간으로 업데이트됩니다.

시나리오소비량Gateway 요금
단일 작업: 파일 읽기, 오류 찾기23-35K 토큰1센트의 일부
하루 활성 작업3-7M 토큰몇 센트
한 달 활성 개발~150M 토큰약 1달러

오른쪽 추정치는 2026년 9월 가격 기준입니다. 비교를 위해 Crush에서 모델 결제 방식은 다음과 같습니다:

방식결제 모델제한 사항
Hyper — Charm 공식 제공업체구독형, 무료 티어 제공Charm 측의 요금 조건 준수
벤더 키 직접 사용벤더 가격표에 따른 토큰 결제세션 길이에 따라 비용 증가; 모델별 가격 다름
JoinGonka Gateway토큰 선불 충전식대시보드에서 사용량 확인 가능; 구독이나 월별 할당량 없음

Crush 인터페이스의 비용 카운터는 설정 파일의 가격 필드를 기준으로 합니다. 여기에는 설치 당시의 게이트웨이 가격이 저장되지만, 네트워크의 달러 가격은 GNK 환율에 따라 변동되므로 카운터는 참고용입니다. 정확한 소비량과 잔액은 대시보드의 '사용량' 및 '빌링' 섹션에서 확인하십시오. 기본적으로 large 슬롯에 DeepSeek V4 Flash가 설정되는 이유는 모델 개요에서 자세히 설명합니다.

작업 시 유의사항

권한.Crush 인터페이스는 기본적으로 도구 호출 전에 권한을 요청합니다.--yolo 플래그는 모든 확인 절차를 한 번에 비활성화하며, 개별적으로 신뢰할 도구는 설정 파일에 지정합니다:

# crushrc
permissions allow view ls grep

# crush.json
"permissions": { "allowed_tools": ["view", "ls", "grep"] }

참고로 crush run은 모든 것을 자동으로 승인합니다. 이는 Crush 자체의 특성이며 모델 제공자와는 무관합니다.

요청 타임아웃.Crush는 모델에서 응답 조각이 오랫동안 도착하지 않으면 요청을 끊습니다. 버전 0.96.1에서는 2분간의 무응답이 기준입니다(문서에는 60초로 기재되어 있지만, 코드와 당사 검증에서는 2분입니다). 게이트웨이가 연결을 유지하기 위해 보내는 keep-alive 핑은 이 카운터를 초기화하지 않습니다 — 로컬 환경에서 확인했습니다. 또한 게이트웨이는 부하가 높은 시간대에 네트워크에서 첫 토큰을 최대 150초까지 기다리므로 여유를 두는 것이 좋습니다:

# crushrc
option request-timeout 300

# crush.json
"options": { "request_timeout": 300 }

커밋 서명.Crush가 생성하는 커밋과 풀 리퀘스트에는 기본적으로 Assisted-by: Crush:<model> 문자열과 "Generated with Crush" 주석이 붙습니다. 필요 없다면:

# crushrc
option attribution-trailer-style none
option attribution-generated-with false

# crush.json
"options": { "attribution": { "trailer_style": "none", "generated_with": false } }

메트릭.Crush는 개발자에게 가명 처리된 사용 통계를 전송합니다 — 메타데이터만 포함되며 프롬프트와 응답은 제외됩니다.CRUSH_DISABLE_METRICS=1 또는 DO_NOT_TRACK=1로 비활성화할 수 있습니다. 게이트웨이 역시 프롬프트와 응답 내용을 저장하지 않으며, 통계에는 사용량 집계만 남습니다.

설정은 곧 코드다.crushrc와 crush.json 모두 Crush는 여러분의 셸 권한으로 실행합니다. 키 필드의 $(…)는 로드 시 실행되며, 프로젝트의 crushrc는 해당 디렉터리에서 Crush를 열면 즉시 작동합니다. 타인의 리포지토리에서 설정을 읽지 않고 에이전트를 실행하지 마세요.

Crush는 npx @joingonka/setup --tool crush 명령 한 줄이나 ~/.config/crush/crush.json 내의 providers.joingonka 블록을 통해 JoinGonka Gateway에 연결할 수 있습니다. 타입은 openai-compat, 주소는 https://gate.joingonka.ai/v1, 키는 jg-…이며, 모델에는 정확한 context_window와 default_max_tokens를 설정합니다. 동일한 내용을 crushrc에 provider add와 model add 구문으로 여러 줄 작성할 수도 있습니다. large 슬롯에는 DeepSeek V4 Flash, small 슬롯에는 MiniMax M2.7, 복잡한 로직에는 GLM-5.3 Flash가 제공됩니다. 가장 큰 함정은 상태 파일입니다. ctrl+l로 선택된 모델이 설정 파일보다 우선순위가 높으므로, 명시적인 --model이 포함된 설치 프로그램은 해당 상태 파일도 수정합니다. 검증은 crush models joingonka와 crush run으로 진행하며, 요청 타임아웃은 300초로 올리는 것을 권장합니다.

더 자세히 알고 싶으세요?

다른 섹션을 탐색하거나 지금 GNK를 얻기 시작하세요.

키와 무료 토큰 받기 →