Crush là phần mềm agent AI ưa thích của mình, nhưng trước giờ mình vẫn có một băn khoăn về việc phải lưu key API của các nhà cung cấp mô hình LLM trong file cấu hình trần trụi. Từ phiên bản 0.85, Crush thay đổi cách lưu và đọc cấu hình, và mình đã thấy cơ hội để lưu key API một cách an toàn hơn.
Trước đây mình có một bài viết "Sử dụng model AI LLM host trong nước" và bạn có thể thấy Crush lưu cấu hình trong một file JSON và ta phải để key API ở dạng nguyên văn trong đó, ví dụ:
{
"providers": {
"fpt-ai-factory": {
"name": "FPT AI Factory",
"base_url": "https://mkp-api.fptcloud.com",
"api_key": "sk-key-cua-ban",
}
}
Cách lưu này khiến key API dễ dàng bị rò rỉ một cách vô tình, ví dụ bạn copy file, thư mục gửi cho người khác mà quên kiểm tra, bạn mở cuộc họp video, chia sẻ màn hình và vô tình mở file này lên ngay trong màn hình đang chia sẻ v.v...
Thông thường, trên Linux có một loại phần mềm tên gọi chung là keyring, keystore, keychain là nơi lưu tập trung key và password. Các phần mềm khác cần dùng đến password, key API như chat, email, lịch sẽ không lưu password trong các file riêng của chúng mà lưu trong keyring, khi cần thì gọi keyring để lấy ra. Giả sử bạn có ổ cứng rời đã được khoá bằng mật khẩu, bạn muốn khi cắm ổ cứng rời vào máy mà máy của bạn tự động dùng mật khẩu (đã ghi nhớ) để mở khoá thì chương trình quản lý file trên Linux cũng làm được luôn và cũng gọi keyring để lưu và lấy mật khẩu.

Ta cũng sẽ lưu các key API của nhà cung cấp LLM vào keyring và hướng dẫn Crush lấy chúng ra. Vì mình thường làm việc từ xa qua đường SSH nên mình sẽ không dùng GNOME Keyring có sẵn (phù hợp hơn môi trường desktop) mà dùng phần mềm pass cho đơn giản.
Cài đặt pass rất đơn giản:
sudo apt install pass
pass sẽ cần dùng khoá GPG của bạn để mã hoá dữ liệu, nên trước khi dùng pass, hãy lấy ID của khoá GPG. Bạn hãy mở chương trình Seahorse (còn hiển thị bằng tên "Passwords and Keys") lên, và tìm đến mục "GnuPG keys":

Chẳng hạn trong hình bên trên, ta có key ID là "A4EE 71F9 AE4A D559". Đây là thông của chìa khoá công khai nên bạn cứ vô tư chia sẻ. Dùng key ID này để khởi tạo kho lưu trữ của pass:
pass init A4EE71F9AE4AD559
Ta sẽ đặt ra quy ước đặt tên lưu trữ, theo công thức "crush/<id-nhà cung cấp>". Ví dụ mình dùng mô hình LLM host tại Neuralwatt thì sẽ đặt tên lưu trữ là crush/neuralwatt. Lưu key API như sau:
pass insert crush/neuralwatt
Xem danh sách các key API đã lưu:
❯ pass
Password Store
└── crush
├── moonshot
├── neuralwatt
└── orca-router
Để lấy ra key API thì dùng lệnh pass tên:
❯ pass crush/neuralwatt
sk-key-cua-neuralwatt
Để hướng dẫn Crush lấy key từ pass thì ta phải chuyển Crush sang dùng format crushrc trước, nếu nó đang dùng format JSON. Sau đó mở file ~/.config/crush/crushrc, tìm đến dòng config của provider:
provider add neuralwatt \
--name "Neuralwatt" \
--type openai-compat \
--base-url "https://api.neuralwatt.com/v1" \
--api-key "sk-key-cua-neuralwatt" \
--discover-models true
Tại tham số --api-key, ta chèn cú pháp shell gọi lệnh pass, thành như sau:
--api-key $(pass crush/neuralwatt)
Vậy đó, rồi lưu lại. Bây giờ mở Crush, chọn nhà cung cấp Neuralwatt và xem nó gọi model thành công không:
