“Context compression timed out before it could commit” có nghĩa là mô hình tóm tắt của Hermes — mô hình nằm dưới auxiliary.compression, không phải mô hình chính của bạn — không tiến triển trước khi ngân sách nén của Hermes cạn, và lượt đã bị dừng mà không gửi lệnh gọi chính. Điều này phụ thuộc phiên bản: chúng tôi đã tái hiện cả hai thông báo trên Hermes Agent v0.21.3 và khôi phục bằng cách để summariser trả lời rồi thử lại trong cùng session, trong khi trên v0.21.5, cùng sự cố treo tạo ra thời gian chờ dài thay vì lỗi. Đã kiểm thử ngày 1 tháng 10, 2026 với một stand-in ghi nhận thay cho cả hai mô hình, không phải provider thật.
Nếu bạn đang thiết lập Hermes để dùng endpoint riêng thay vì gỡ lỗi, hãy bắt đầu với Hermes Agent với API tùy chỉnh.
Hai thông báo và ý nghĩa của từng thông báo
| Bạn thấy gì | Khi xuất hiện | Đã gửi lệnh gọi chính chưa? |
|---|---|---|
| “Quá trình nén ngữ cảnh đã hết thời gian chờ trước khi có thể lưu kết quả, trong khi yêu cầu vẫn xấp xỉ 83.485 token. Lệnh gọi đến provider chưa được gửi. Chạy /compress và chờ hoàn tất, sau đó thử lại.” | v0.21.3, summariser im lặng, yêu cầu (~83.485 token) lớn hơn cửa sổ 64.000 token của mô hình | Không |
| “Quá trình nén ngữ cảnh đã hết thời gian chờ mà không rút gọn cuộc trò chuyện này. Không có message nào bị loại bỏ. Bắt đầu session mới bằng /new hoặc kiểm tra auxiliary.compression trước khi thử lại /compress.” | v0.21.3, summariser im lặng, yêu cầu (~57.489 token) vượt ngưỡng kích hoạt nén 54.400 token nhưng vẫn nằm trong cửa sổ | Không |
Con số token trong thông báo đầu tiên là ước tính riêng của Hermes về yêu cầu mà nó định gửi. Cả hai lượt đều kết thúc trong log dưới dạng reason=context_compression_timeout với api_calls=0, sau cảnh báo dạng “Context compression made no progress for 5.0s” — năm giây vì bộ kiểm thử đặt compression.context_timeout_seconds: 5 để rút ngắn các lần chạy; mặc định là 120.
Phiên bản bạn đang dùng quyết định điều gì xảy ra
| Trạng thái summariser | v0.21.3 (ngày 14 tháng 9) | v0.21.5 (ngày 24 tháng 9) |
|---|---|---|
| Im lặng, yêu cầu nằm trong cửa sổ | Lượt bị dừng — thông báo thứ hai ở trên | Đã chờ (giữ 30 giây và 90 giây), nén 9 message thành 5, gửi yêu cầu |
| Im lặng, yêu cầu vượt quá cửa sổ | Lượt bị dừng — thông báo đầu tiên ở trên | Chưa chạy với summariser im lặng; tài liệu giới hạn trường hợp này bằng một ngân sách không hoạt động và bản tóm tắt dự phòng xác định |
| Lỗi phản hồi (404) | Hai lần thử, bỏ qua nén, gửi yêu cầu (đã kiểm thử trong cửa sổ) | Tương tự; một yêu cầu vượt cửa sổ cũng được gửi, điều mà provider thật sẽ từ chối |
| Phản hồi nhanh | Đã nén và gửi | Đã nén và gửi |
Ranh giới nằm trong mã nguồn. Trong v0.21.4 (tag v2026.9.21), hàm dừng lượt sau khi nén bị timeout đã được thu hẹp chỉ còn các yêu cầu vượt quá cửa sổ của mô hình, dẫn chiếu các issue #113646 và #114594; v0.21.3 dừng mọi yêu cầu. Tài liệu cấu hình của v0.21.5 sau đó bổ sung rằng thời gian chờ nén “is floored at the auxiliary compression request's own timeout (auxiliary.compression.timeout, minimum 300s)” — đó là lý do thiết lập năm giây của chúng tôi không có tác dụng ở đó. Vì vậy trên bản build hiện tại, summariser chậm khiến bạn phải chờ vài phút thay vì gặp lỗi, còn summariser đã chết thì bị bỏ qua.
Chẩn đoán ngắn nhất
- Kiểm tra phiên bản bằng
hermes --version. Trên v0.21.3 trở về trước, cả hai thông báo ở trên đều là hành vi dự kiến khi summariser bị treo. - Tìm summariser trong
~/.hermes/logs/agent.log: một dòng “Auxiliary compression: using <provider> (<model>) at <url>” cho biết mô hình và endpoint đã bị timeout. Nếu không có blockauxiliary.compression, nó kế thừa mô hình chính của bạn. - Đọc dòng kích hoạt, “Pre-API compression: ~N request tokens >= T threshold (context=W)”. Nếu N lớn hơn W, không phiên bản nào có thể gửi lượt đó ở trạng thái chưa nén.
- Kiểm tra cửa sổ của summariser. Tài liệu Hermes yêu cầu cửa sổ này ít nhất phải lớn bằng cửa sổ của mô hình chính, vì summariser được gửi toàn bộ phần giữa của cuộc hội thoại.
Cách khôi phục đã được xác minh
Trong mọi trường hợp v0.21.3 ở trên, khởi động lại stand-in với một summariser có phản hồi và gửi thêm một lượt trong cùng session (--resume) đều tạo ra câu trả lời bình thường, với cuộc hội thoại còn nguyên. Trên thực tế, điều đó có nghĩa là một trong các cách sau: trỏ auxiliary.compression đến một mô hình nhanh mà bạn có thể truy cập, sửa endpoint mà nó trỏ đến, hoặc tăng compression.context_timeout_seconds nếu summariser của bạn chậm nhưng vẫn hoạt động bình thường — chẳng hạn một mô hình cục bộ. Sau đó thử lại trong cùng session.
# ~/.hermes/config.yaml — the summariser is its own model, with its own budget
auxiliary:
compression:
base_url: https://api.kunavo.com/v1 # overrides provider; any OpenAI-compatible endpoint
api_key: sk-kn-...
model: claude-haiku-4-5 # fast, and a context window >= your main model's
timeout: 300
compression:
context_timeout_seconds: 120 # inactivity budget for the summary (default)
context_total_ceiling_seconds: 600Hai điều chưa được kiểm thử: các bề mặt Hermes Desktop và messaging-gateway, vốn có tính năng nén hygiene riêng với các ngân sách khác, và provider thật từ chối một yêu cầu vượt cửa sổ. Các lần chạy là các lượt hermes chat -Q one-shot.
Chi phí
Một lượt bị dừng không gửi yêu cầu đến mô hình chính, nên mô hình chính không tính phí gì cho lượt đó. Yêu cầu tóm tắt đã được gửi — khoảng 19.000 ký tự prompt trong các lần chạy này — và provider sẽ tính phí nếu cuối cùng hoàn tất. Lần thử lại sau đó trả phí cho một lần tóm tắt và một lần gọi chính. Summariser nhỏ, nhanh giúp giảm cả thời gian chờ lẫn chi phí phụ; trên Kunavo, Claude Haiku 4.5 có giá $0,70 cho mỗi triệu token đầu vào và $3,50 cho mỗi triệu token đầu ra, tính theo từng token từ số dư trả trước. Không ai tại Kunavo đã chạy Hermes với endpoint của họ; các lần chạy ở đây dùng stand-in cục bộ.
Câu hỏi thường gặp
“Context compression timed out before it could commit” trong Hermes có nghĩa là gì?
Hermes đã cố thu gọn cuộc hội thoại trước khi gửi lượt của bạn, nhưng mô hình tóm tắt mà nó dùng không tiến triển trong khoảng thời gian cho phép, còn yêu cầu thì quá lớn để gửi nguyên trạng — vì vậy Hermes dừng lượt mà không hề gọi mô hình chính của bạn. Đã tái hiện trên Hermes Agent v0.21.3 với một summariser bị treo và yêu cầu 83.485 token gửi đến cửa sổ 64.000 token; dòng log của lượt đó là api_calls=0. Mô hình chính và thời gian chờ API của nó không phải vấn đề. Vấn đề là summariser: mô hình nằm dưới auxiliary.compression trong config.yaml.
Làm thế nào để khắc phục lỗi timeout khi nén context của Hermes?
Hãy để summariser trả lời, sau đó thử lại trong cùng session. Trong lần tái hiện, trỏ auxiliary.compression đến một mô hình phản hồi nhanh và gửi lượt tiếp theo trong cùng session luôn hoạt động trên v0.21.3, với lịch sử được giữ nguyên — chính thông báo cho biết không có message nào bị loại bỏ. Nâng cấp cũng thay đổi tình hình: từ v0.21.4, việc nén bị timeout không còn dừng yêu cầu vẫn vừa với cửa sổ của mô hình, và trong v0.21.5, thời gian chờ tóm tắt được đặt sàn bằng timeout riêng của yêu cầu summariser, ít nhất 300 giây. Bắt đầu session mới bằng /new cũng hoạt động, nhưng phải đánh đổi context của cuộc hội thoại.
Lỗi timeout khi nén của Hermes đã được khắc phục chưa?
Một phần, và dạng biểu hiện đã thay đổi. Cho đến v0.21.3 (ngày 14 tháng 9, 2026), mọi lần nén trước khi gọi API bị timeout đều dừng lượt. v0.21.4 (ngày 21 tháng 9) chỉ dừng yêu cầu vượt quá cửa sổ context của mô hình. Trong v0.21.5 (ngày 24 tháng 9), một summariser bị treo trong 30 rồi 90 giây không hề dừng lượt: Hermes chờ, nén và gửi yêu cầu — vì vậy trên phiên bản hiện tại, triệu chứng của summariser chậm là một khoảng tạm dừng dài, không phải lỗi này. Summariser bị chết thay vì chậm lại là trường hợp khác: nó được thử lại, rồi bỏ qua, và lượt được tiếp tục mà không nén.
Tăng HERMES_API_TIMEOUT có giúp không?
Không. Biến đó điều khiển lần gọi mô hình chính, mặc định là 1.800 giây. Tính năng nén có các giới hạn riêng trong config.yaml: compression.context_timeout_seconds (giới hạn không hoạt động, mặc định 120 giây), compression.context_total_ceiling_seconds (mặc định 600) và auxiliary.compression.timeout cho chính yêu cầu tóm tắt. Tài liệu Hermes còn thêm một yêu cầu quan trọng không kém tốc độ: cửa sổ context của mô hình tóm tắt phải lớn ít nhất bằng cửa sổ của mô hình chính, vì nó nhận toàn bộ phần giữa của cuộc hội thoại.
Lượt bị timeout có tốn chi phí không?
Không tốn ở mô hình chính: lượt đã kết thúc trước khi lệnh gọi chính được gửi. Tuy nhiên, yêu cầu tóm tắt vẫn được gửi, và nếu summariser rốt cuộc vẫn chạy xong thì nhà cung cấp của nó sẽ tính phí như mọi lệnh gọi khác — trong các lần chạy ở đây, prompt tóm tắt dài khoảng 19.000 ký tự. Khi thử lại, bạn trả tiền cho một lần tóm tắt và một lệnh gọi chính. Vì vậy, việc trỏ tính năng nén đến một mô hình nhỏ và nhanh không chỉ nhanh hơn mà còn rẻ hơn: trên Kunavo, Claude Haiku 4.5 được niêm yết ở mức $0,70 trên mỗi triệu token đầu vào.
Đã tái hiện ngày 1 tháng 10, 2026 với Hermes Agent v0.21.3 (tag v2026.9.14) và v0.21.5 (tag v2026.9.24), cài đặt từ các nguồn release của chúng, đối chiếu với một stand-in ghi nhận cục bộ phục vụ cả mô hình chính và mô hình tóm tắt (giữ phản hồi cho summariser bị treo, trả 404 cho summariser lỗi), với cửa sổ 64.000 token và bốn lượt tiếp tục chứa filler trước lượt kiểm thử. Ranh giới phiên bản được đọc từ agent/turn_context.py tại các tag v2026.9.14, v2026.9.21 và v2026.9.24, còn các ngân sách được lấy từ tài liệu cấu hình của từng tag. Stand-in không phải mô hình hay provider: nó chấp nhận mọi kích thước yêu cầu, vì vậy không tái hiện lỗi context từ phía provider.