Các phần cơ sở kiến thức ▾

Điều hướng

▸ Bắt đầu tại đây Theo vai trò

Danh mục

Công cụ 52
Bảng thuật ngữ 12

Công cụ

Crush + JoinGonka Gateway: tác nhân Charm trên các mô hình mạng lưới Gonka

Crush — tác nhân coding trên terminal từ Charm, đội ngũ đứng sau các thư viện giao diện console được hàng chục nghìn chương trình sử dụng. Nó đọc và sửa tệp dự án, chạy lệnh, lấy ngữ cảnh từ các máy chủ ngôn ngữ (LSP), kết nối các công cụ bên ngoài qua MCP và có thể thay đổi mô hình giữa phiên mà không làm mất ngữ cảnh. Hoạt động trên terminal macOS, Linux và Windows, cũng như Android và BSD; giấy phép — FSL-1.1-MIT. Nguồn gốc của dự án rất đáng chú ý: kho lưu trữ opencode-ai/opencode tham chiếu trực tiếp đến Crush — dự án được tiếp tục bởi tác giả đầu tiên của nó và đội ngũ Charm.

Crush chấp nhận hai loại nhà cung cấp bên thứ ba — có API tương thích OpenAI và Anthropic. JoinGonka Gateway kết nối như openai-compat: bằng một lệnh cài đặt hoặc mười dòng cấu hình. Sau đó, tác nhân hoạt động trên các mô hình mạng phi tập trung Gonka — DeepSeek V4 Flash, GLM-5.3 Flash và MiniMax M2.7 — với giá thống nhất: $0.0069 cho một triệu token đầu vào.

Hai tính năng của Crush cần biết trước phiên đầu tiên: nó phân bổ các mô hình vào hai khe, large và small, và mô hình được chọn trong giao diện được lưu trong một tệp trạng thái riêng biệt, tệp này quan trọng hơn tệp cấu hình. Chúng có một mục riêng. Các lệnh và thông báo dưới đây đã được xác minh bằng việc chạy thực tế Crush 0.96.1 qua gateway vào ngày 23 tháng 9 năm 2026. Sau khi xác nhận địa chỉ, tài khoản sẽ nhận được 3M token miễn phí — đủ để bạn tự thực hiện lại tất cả những điều này.

Bắt đầu nhanh: cài đặt và một lệnh duy nhất

Bước 1: cài đặt Crush. Các cách chính thức từ README của dự án:

# 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

Tại đó cũng mô tả các kho gói cho Debian, Ubuntu, Fedora và RHEL, Nix và Scoop, còn trên trang phát hành có sẵn các tệp nhị phân. Kiểm tra bằng crush --version, sẽ nhận được dòng có dạng crush version v0.96.1.

Bước 2: lấy khóa. Đăng ký tại gate.joingonka.ai/register, xác nhận địa chỉ và tạo khóa có tiền tố jg- trong mục «Khóa API». Một khóa và một số dư dùng chung cho tất cả các mô hình trong mạng.

Bước 3: chạy trình cài đặt.

npx @joingonka/setup --tool crush

Trình cài đặt sẽ hỏi khóa — khóa không được truyền trong đối số dòng lệnh để tránh lưu lại trong lịch sử shell — và thực hiện bốn việc:

  • ghi nhà cung cấp joingonka vào ~/.config/crush/crush.json: loại openai-compat, địa chỉ gateway, khóa dạng literal và ba mô hình của mạng với cửa sổ ngữ cảnh, giới hạn phản hồi và giá trên mỗi triệu token, mà tại thời điểm cài đặt nó lấy trực tiếp từ gateway, — dựa vào đó Crush tính chi phí phiên. Tệp sẽ có quyền 600;
  • gán mô hình: vào slot large — DeepSeek V4 Flash, vào small — MiniMax M2.7, còn GLM-5.3 Flash sẽ nằm trong danh sách để chọn thủ công. Nó chỉ làm điều này nếu slot large trống hoặc trỏ tới mô hình của chúng ta đã rời mạng; lựa chọn của người khác được giữ nguyên, và trong đầu ra sẽ có gợi ý cách chuyển đổi;
  • kiểm tra rằng lựa chọn sẽ có hiệu lực: mô hình từ giao diện Crush được lưu trong tệp trạng thái, và tệp đó ghi đè cấu hình, — về điều này có mục nói về large và small;
  • tạo bản sao lưu, giữ nguyên các nhà cung cấp và cài đặt khác, và kết thúc bằng một yêu cầu trực tiếp tới gateway để kiểm tra ngay khóa, địa chỉ và mô hình.

Mô hình khác được chỉ định bằng cờ --model với viết tắt deepseek, glm hoặc minimax; mô hình được chỉ định rõ ràng luôn được ghi. Các thư mục không tiêu chuẩn được trình cài đặt xử lý giống như chính Crush: CRUSH_GLOBAL_CONFIG cho cấu hình, CRUSH_GLOBAL_DATA cho tệp trạng thái, cũng như XDG_CONFIG_HOME và XDG_DATA_HOME. Dành cho máy chủ và script có chế độ không hỏi, trong đó khóa được lấy từ biến môi trường:

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

Định dạng chính của Crush giờ đây là crushrc, nhưng trình cài đặt ghi crush.json: mọi phiên bản đều hiểu nó. Nếu bạn đã có crushrc, Crush sẽ hợp nhất cả hai tệp, khi trùng khóa thì crushrc thắng, còn trình cài đặt không đụng tới nó.

Cấu hình thủ công: crush.json hoặc crushrc

Mọi thứ mà trình cài đặt làm đều có thể viết tay. Đây là file ~/.config/crush/crush.json đang hoạt động — file này chúng tôi đã chạy qua gateway:

{
  "$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" }
  }
}
TrườngGiá trịĐiều cần lưu ý
typeopenai-compatLoại dành cho các dịch vụ bên thứ ba có API tương thích OpenAI. Loại openai theo tài liệu Crush được để riêng cho các yêu cầu qua chính OpenAI
base_urlhttps://gate.joingonka.ai/v1Phải có /v1 ở cuối: Crush tự thêm đường dẫn /chat/completions
api_keykhóa jg-… của bạnCrush chạy giá trị này qua cơ chế thay thế của shell, nên thay vì khóa bạn có thể viết $JOINGONKA_API_KEY — khi đó biến phải được export ở nơi khởi chạy Crush
context_windowcửa sổ ngữ cảnh của modelCrush dựa vào đó để hiển thị mức độ đầy của ngữ cảnh và quyết định khi nào nén lịch sử
default_max_tokensgiới hạn trên của phản hồiĐược gửi trong mỗi yêu cầu dưới dạng max_tokens. Với các model có suy luận, phần suy luận cũng nằm trong ngân sách này

Crush chỉ chấp nhận JSON nghiêm ngặt: một comment hay dấu phẩy thừa là nó không khởi động. Các trường giá (cost_per_1m_in, cost_per_1m_out và hai trường cho cache) chỉ cần cho bộ đếm chi phí: trình cài đặt ghi giá thực tế của gateway vào đó, còn nếu thiếu thì Crush vẫn chạy và hiển thị số không — chỉ có trình soạn thảo với schema từ $schema mới đánh dấu chúng là bắt buộc.

Cùng một provider ở định dạng crushrc — đây là Bash thông thường với các lệnh tích hợp của Crush. File ~/.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

Ở đây model được gọi theo dạng provider/model-id: trước dấu gạch chéo đầu tiên là tên provider, sau đó là định danh mạng giữ nguyên như gốc. Dạng ${JOINGONKA_API_KEY:?…} giữ khóa nằm ngoài file, nhưng nếu biến chưa được export thì Crush sẽ không khởi động — thà lỗi ngay lúc khởi động còn hơn gửi yêu cầu với khóa rỗng.

Mô hình large, small và tệp trạng thái

Mô hình trong Crush không được chọn cho mọi thứ, mà cho hai khe cắm:

Khe cắmNhiệm vụCài đặt mặc địnhCách thay đổi
largeTác nhân chính: tất cả các bước đọc, sửa tệp và lệnhDeepSeek V4 Flash: cửa sổ 380K và giới hạn phản hồi lớn nhất trong mạng, 32768ctrl+l trong giao diện, -m cho crush run, models.large trong cấu hình
smallTác vụ phụ: đặt tên phiên và tác nhân phụ tìm kiếm trên web. Nếu mô hình nhỏ không đặt tên được, Crush sẽ yêu cầu mô hình lớnMiniMax M2.7: có dung lượng lớn nhất trong mạng--small-model cho crush run, models.small trong cấu hình, model small trong crushrc

Mô hình thứ ba của mạng, GLM-5.3 Flash (suy luận), được chọn cho logic phức tạp, cần lưu ý giới hạn phản hồi là 8192 và một phần dành cho suy luận — chi tiết xem tại đánh giá mô hình. Đối với mỗi lần chạy, mô hình được xác định bằng tên đầy đủ: crush run -m joingonka/zai-org/GLM-5.3-Flash "…". Tất cả tên có sẵn được liệt kê bởi crush models joingonka.

Tệp trạng thái. Mô hình được chọn trong giao diện qua ctrl+l không được Crush ghi vào crush.json, mà vào tệp trạng thái máy: ~/.local/share/crush/crush.json, trên Windows là %LOCALAPPDATA%\crush\crush.json. Tệp này có quyền ưu tiên cao hơn tệp cấu hình người dùng và crushrc: Crush đọc theo thứ tự /etc/crush/crush.json → ~/.config/crush/crush.json → ~/.config/crush/crushrc → tệp trạng thái, và mỗi tệp sau sẽ ghi đè tệp trước. Chỉ các cài đặt dự án — crush.json hoặc crushrc trong thư mục dự án — là có quyền ưu tiên cao hơn. crush dirs sẽ cho biết các tệp này nằm ở đâu trên máy của bạn.

Trong ví dụ chạy của chúng tôi, chúng tôi đã mở phần chọn mô hình — nhà cung cấp “JoinGonka (Gonka)” xuất hiện với dấu “✓ Configured” — và chọn MiniMax M2.7. Crush đã phản hồi “Large model changed to MiniMax M2.7 (Gonka)” và ghi vào tệp trạng thái:

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

Giờ đây, mô hình này quan trọng hơn những gì được viết trong crush.json. Trình cài đặt nhận ra tình huống này và xử lý theo các cách khác nhau:

  • không có --model nó không chạm vào tệp trạng thái — vì đây là lựa chọn làm việc của bạn — nhưng sẽ cảnh báo rõ ràng về mô hình mà Crush thực sự sẽ khởi chạy: Heads-up: Crush will still start with joingonka/MiniMaxAI/MiniMax-M2.7, not joingonka/deepseek-ai/DeepSeek-V4-Flash-0731. Nó cũng sẽ làm như vậy nếu GLM-5.3 Flash hoặc mô hình của nhà cung cấp khác được chọn trong giao diện;
  • với --model rõ ràng nó sửa chính xác một mục trong tệp trạng thái — models.large — sau khi đã lưu một bản sao, và báo cáo những gì đã thay đổi. Nếu không, cờ sẽ không có tác dụng. Sau khi chạy như vậy, Crush trong ví dụ của chúng tôi đã khởi chạy với mô hình được chỉ định trong cờ.

Kiểm tra: những gì sẽ xảy ra

Trước tiên, hãy đảm bảo Crush nhìn thấy nhà cung cấp:

crush models joingonka

Kết quả trả về ba dòng:

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

Tiếp theo, chạy thử một lần không giao diện. Đặt vào thư mục dự án một tệp có lỗi rõ ràng và yêu cầu tìm ra nó:

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

Agent phải tự gọi công cụ đọc tệp và trả lời đúng trọng tâm, kèm số dòng. Trong lần chạy của chúng tôi, cả ba mô hình của mạng đều tìm ra lỗi, thời gian xử lý mất 20-40 giây. Cờ -q ẩn chỉ báo chờ. Trong chế độ crush run, mọi lệnh gọi công cụ đều được tự động phê duyệt, vì vậy hãy chạy nó trong dự án của bạn. Trong giao diện thông thường (lệnh crush), mô hình đang hoạt động hiển thị trên dòng trạng thái: ◇ DeepSeek V4 Flash (Gonka) via JoinGonka (Gonka). Crush lưu phiên làm việc và nhật ký trong thư mục .crush của dự án, được bảo vệ khỏi git bằng .gitignore riêng; nhật ký in bằng lệnh crush logs. Từ phía gateway, yêu cầu hiển thị trong bảng điều khiển: mục «Sử dụng», phân tách «Theo mô hình» và «Theo khóa».

Nếu có sự cố, chẩn đoán thường đọc được ngay từ thông báo:

Nội dung hiển thịÝ nghĩaCần làm gì
unauthorized: Invalid API key.Gateway không chấp nhận khóaKiểm tra api_key: toàn bộ khóa, không có khoảng trắng. Nếu đó là tham chiếu đến biến, biến phải được export trong shell này
invalid JSON in config file …/crush.jsonTệp có comment, dấu phẩy thừa hoặc lỗi đánh máyCrush chỉ chấp nhận JSON nghiêm ngặt: hãy sửa tệp. Trình cài đặt không tự xóa comment nhưng có cảnh báo về chúng, còn tệp hoàn toàn không phân tích được thì không đụng đến và nêu rõ nguyên nhân
failed to load shell config …/crushrc: … exit status 1Lỗi trong crushrc, thường là biến chứa khóa ở dạng ${…:?} chưa được đặtExport biến trước khi chạy hoặc sửa dòng mà script bị lỗi
Failed to override models: large model "…" not foundLỗi đánh máy tên mô hình ở cờ -mSao chép tên từ kết quả của crush models joingonka
too many requests: Model "…" is currently overloaded in the Gonka network (rate limit)Mô hình đã hết dung lượng trống trong mạng vào giờ cao điểmCrush tự thử lại yêu cầu với khoảng chờ tăng dần — trong lần chạy của chúng tôi khoảng một phút — và chỉ sau đó mới bỏ cuộc. Hãy chuyển sang mô hình khác bằng ctrl+l hoặc -m, hoặc chờ đợi; trạng thái hiển thị trên trang trạng thái
Crush mở không đúng mô hình mà trình cài đặt thông báoLựa chọn từ giao diện nằm trong tệp trạng thái và ghi đè cấu hìnhChọn mô hình bằng ctrl+l hoặc cài đặt lại với --model
402Số dư tài khoản đã hếtNạp tiền vào tài khoản trong mục «Thanh toán»; khóa vẫn hoạt động bình thường

Chi phí thế nào

Tác nhân tiêu tốn token khác với trò chuyện: với mỗi câu của bạn, Crush thêm một prompt hệ thống và mô tả các công cụ của nó, và nhiệm vụ thường mất vài lượt. Trong lần thử nghiệm, mỗi yêu cầu đến mô hình chứa khoảng 11,5 nghìn token đầu vào, và nhiệm vụ «đọc tệp và tìm lỗi» tốn hai-ba yêu cầu và 23-35 nghìn token, hầu hết là đầu vào. Do đó, giá mỗi token ở đây rất quan trọng.

Thông qua JoinGonka Gateway, token có giá $0.0069 mỗi triệu token đầu vào và $0.021 mỗi triệu token đầu ra — giá này giống nhau cho tất cả các mô hình trong mạng và được lấy từ nguồn trực tiếp trên trang này.

Kịch bảnMức tiêu thụQua Gateway
Tác vụ một lần: đọc tệp, tìm lỗi23-35K tokenvài phần trăm cent
Một ngày làm việc tích cực3-7M tokenvài cent
Một tháng phát triển tích cực~150M tokenkhoảng một đô la

Các ước tính ở cột bên phải dựa trên giá tháng 9 năm 2026. Để so sánh — làm thế nào để thanh toán cho các mô hình trong Crush:

Cách thứcMô hình thanh toánHạn chế
Hyper — nhà cung cấp chính thức của Charmđăng ký, có gói miễn phícác điều khoản gói cước phía Charm
Khóa nhà cung cấp trực tiếptrả theo token theo bảng giá nhà cung cấphóa đơn tăng theo độ dài phiên; giá phụ thuộc vào mô hình
JoinGonka Gatewaytrả theo token, số dư trả trướcchi tiêu hiển thị trong bảng điều khiển; không có phí đăng ký hay hạn ngạch tháng

Bộ đếm chi phí trong giao diện Crush tính toán dựa trên các trường giá từ tệp cấu hình. Nó sử dụng giá của gateway tại thời điểm cài đặt, nhưng giá USD trong mạng biến động theo tỷ giá GNK, vì vậy bộ đếm chỉ mang tính tham khảo. Chi tiêu chính xác và số dư còn lại nằm trong bảng điều khiển, trong các phần «Sử dụng» và «Thanh toán». Tại sao DeepSeek V4 Flash được chọn mặc định cho vị trí large, đã được phân tích chi tiết trong bài đánh giá mô hình.

Những lưu ý khi làm việc

Quyền. Mặc định, giao diện Crush sẽ hỏi quyền trước khi gọi công cụ. Cờ --yolo tắt toàn bộ câu hỏi cùng lúc, còn những công cụ được tin cậy có chọn lọc sẽ được liệt kê trong tệp cấu hình:

# crushrc
permissions allow view ls grep

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

Xin nhắc lại, crush run tự phê duyệt mọi thứ. Đây là đặc tính của Crush, không phụ thuộc vào nhà cung cấp mô hình.

Thời gian chờ yêu cầu. Crush sẽ ngắt yêu cầu nếu mô hình không gửi về bất kỳ đoạn phản hồi nào trong thời gian dài: ở phiên bản 0.96.1 là hai phút im lặng (tài liệu ghi 60 giây, nhưng trong mã nguồn và qua kiểm tra của chúng tôi là hai phút). Các gói ping dịch vụ mà cổng dùng để duy trì kết nối không làm mới bộ đếm này — chúng tôi đã kiểm chứng trên môi trường thử nghiệm cục bộ. Còn cổng vào giờ cao điểm chờ token đầu tiên từ mạng tới 150 giây, vì vậy nên nâng khoảng dự phòng:

# crushrc
option request-timeout 300

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

Chữ ký trong commit. Các commit và pull request do Crush tạo mặc định sẽ có dòng Assisted-by: Crush:<model> và chú thích "Generated with Crush". Nếu không cần điều này:

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

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

Số liệu đo lường. Crush gửi cho nhà phát triển thống kê sử dụng dưới dạng bút danh — chỉ siêu dữ liệu, không có prompt và phản hồi. Có thể tắt bằng biến CRUSH_DISABLE_METRICS=1 hoặc DO_NOT_TRACK=1. Về phía mình, cổng không lưu nội dung prompt và phản hồi — trong thống kê chỉ còn lại các số liệu tổng hợp về mức tiêu thụ.

Cấu hình chính là mã. Crush thực thi cả crushrc lẫn crush.json với quyền của shell bạn đang dùng: $(…) trong trường khóa sẽ chạy ngay khi tải, và crushrc của dự án sẽ kích hoạt ngay khi bạn mở Crush trong thư mục đó. Đừng chạy agent trong kho lưu trữ của người khác mà chưa đọc cấu hình của nó.

Crush kết nối với JoinGonka Gateway bằng một lệnh duy nhất — npx @joingonka/setup --tool crush — hoặc bằng khối providers.joingonka trong ~/.config/crush/crush.json: loại openai-compat, địa chỉ https://gate.joingonka.ai/v1, khóa jg-…, các mô hình với context_window và default_max_tokens chính xác. Điều tương tự cũng được viết bằng vài dòng provider add và model add trong crushrc. Slot large được cung cấp bởi DeepSeek V4 Flash, small bởi MiniMax M2.7, và GLM-5.3 Flash dành cho logic phức tạp. Cái bẫy chính là tệp trạng thái: mô hình được chọn qua ctrl+l có ưu tiên cao hơn tệp cấu hình, vì vậy trình cài đặt với cờ --model rõ ràng cũng chỉnh sửa tệp đó. Kiểm tra bằng crush models joingonka và crush run; thời gian chờ yêu cầu nên được tăng lên 300 giây.

Muốn tìm hiểu thêm?

Khám phá các phần khác hoặc bắt đầu kiếm GNK ngay bây giờ.

Nhận khóa và token miễn phí →