Độ phân giải thời gian chạy của nhà cung cấp
Hermes có trình phân giải thời gian chạy của nhà cung cấp dùng chung được sử dụng trên:
- CLI
- cổng
- công việc định kỳ
- ACP
- cuộc gọi mô hình phụ trợ
Thực hiện chính:
Hermes_CLI/runtime_provider.py — độ phân giải thông tin xác thực,
`_resolve_custom_runtime()
Hermes_CLI/auth.py — cơ quan đăng ký nhà cung cấp,
`resolve_provider()
Hermes_CLI/model_switch.py — đường dẫn chuyển mạch
/model ` được chia sẻ (CLI + cổng)
`agent/auxiliary_CLIent.py
- định tuyến mô hình phụ trợ
providers/ — ABC + điểm đăng ký (
`ProviderProfile
, `register_provider
, `get_provider_profile
, `list_providers
)
plugins/model-providers/<name>/ — plugin cho mỗi nhà cung cấp (theo gói) khai báo
`API_mode
, `base_url
, `env_vars
,
fallback_models và tự đăng ký vào sổ đăng ký trong lần truy cập đầu tiên. Các plugin người dùng tại
$Hermes_HOME/plugins/model-providers/<name/ ` ghi đè các gói có cùng tên.
get_provider_profile()
trong providers/
trả về ProviderProfile
cho id nhà cung cấp nhất định. runtime_provider.py
gọi điều này vào thời điểm giải quyết để nhận danh sách ưu tiên base_url
, `env_vars
,
API_mode và
fallback_models chuẩn mà không cần sao chép dữ liệu đó trong nhiều tệp. Việc thêm một plugin mới trong
plugins/model-providers/<your-provider>/ (hoặc
$Hermes_HOME/plugins/model-providers/<your-provider>/
) gọi
register_provider() là đủ để
runtime_provider.py nhận nó - không cần nhánh trong chính trình phân giải.
Nếu bạn đang cố gắng thêm nhà cung cấp suy luận hạng nhất mới, hãy đọc Adding Providers và Model Provider Plugin guide dọc theo trang này.
Ưu tiên độ phân giải
Ở mức độ cao, độ phân giải của nhà cung cấp sử dụng:
-
yêu cầu CLI/thời gian chạy rõ ràng
-
Cấu hình nhà cung cấp/mô hình `config.yaml
-
biến môi trường
-
mặc định của nhà cung cấp cụ thể hoặc độ phân giải tự động
Việc đặt hàng đó quan trọng vì Hermes coi lựa chọn mẫu/nhà cung cấp đã lưu là nguồn thông tin chính xác cho các hoạt động bình thường. Điều này ngăn quá trình xuất shell cũ âm thầm ghi đè điểm cuối mà người dùng đã chọn lần cuối trong `Hermes model
.
Nhà cung cấp
Các nhóm nhà cung cấp hiện tại bao gồm (xem
plugins/model-providers/ để biết bộ đi kèm hoàn chỉnh):
- Cổng AI (Vercel)
- Bộ định tuyến mở
- Nous Portal
- Codex OpenAI
- Copilot / ACP
- Nhân chủng học (bản địa)
- Google / Song Tử ( `Gemini
, `Google-Gemini-CLI
)
- Alibaba / DashScope ( `alibaba
, `alibaba-coding-plan
)
- Tìm kiếm sâu
- Z.AI
- Kimi / Moonshot ( `Kimi-coding
, `Kimi-coding-cn
)
- MiniMax ( `MiniMax
, `MiniMax-cn
, `MiniMax-OAuth
)
- KiloCode
- Hugging Face
- OpenCode Zen / OpenCode Go
- Nền tảng AWS
- Xưởng đúc Azure
- NVIDIA NIM
- xAI (Grok)
- Arcee
- Đám mây GMI
- StepFun
- Qwen OAuth
- Xiaomi
- Đám mây OLlama
- LM Studio
- Trung tâm mã thông báo Tencent
- Tùy chỉnh ( `provider: custom
) — nhà cung cấp hạng nhất cho mọi điểm cuối tương thích với OpenAI
- Nhà cung cấp tùy chỉnh được đặt tên (danh sách
custom_providerstrong config.yaml)
Đầu ra của độ phân giải thời gian chạy
Trình phân giải thời gian chạy trả về dữ liệu như:
`provider
`API_mode
`base_url
`API_key
`source
- siêu dữ liệu dành riêng cho nhà cung cấp như thông tin hết hạn/làm mới
Tại sao điều này lại quan trọng
Trình phân giải này là lý do chính khiến Hermes có thể chia sẻ logic xác thực/thời gian chạy giữa:
`Hermes chat
- xử lý tin nhắn cổng
- công việc định kỳ chạy trong phiên mới
- Phiên biên tập ACP
- nhiệm vụ mô hình phụ trợ
Cổng AI
Đặt
AI_GATEWAY_API_KEY trong
~/.Hermes/.env ` và chạy với
--provider ai-gateway
. Hermes tìm nạp các mô hình có sẵn từ điểm cuối
/models ` của cổng, lọc theo các mô hình ngôn ngữ có hỗ trợ sử dụng công cụ.
OpenRouter, AI Gateway và các URL cơ sở tương thích với OpenAI tùy chỉnh
Hermes chứa logic để tránh rò rỉ khóa API sai tới điểm cuối tùy chỉnh khi tồn tại nhiều khóa nhà cung cấp (ví dụ: `OpenRouter_API_KEY
,
AI_GATEWAY_API_KEY và
`OpenAI_API_KEY
).
Khóa API của mỗi nhà cung cấp nằm trong phạm vi URL cơ sở của chính nhà cung cấp đó:
OpenRouter_API_KEY chỉ được gửi đến điểm cuối
`OpenRouter.ai
AI_GATEWAY_API_KEY chỉ được gửi đến điểm cuối
`ai-gateway.vercel.sh
OpenAI_API_KEY được sử dụng cho các điểm cuối tùy chỉnh và làm dự phòng
Hermes cũng phân biệt giữa:
- một điểm cuối tùy chỉnh thực sự được người dùng lựa chọn
- đường dẫn dự phòng OpenRouter được sử dụng khi không có điểm cuối tùy chỉnh nào được định cấu hình
Sự khác biệt đó đặc biệt quan trọng đối với:- máy chủ mô hình địa phương
- API tương thích với OpenAI không phải OpenRouter/không phải AI Gateway
- chuyển đổi nhà cung cấp mà không cần chạy lại thiết lập
- các điểm cuối tùy chỉnh được lưu cấu hình sẽ tiếp tục hoạt động ngay cả khi
OpenAI_BASE_URLkhông được xuất trong shell hiện tại
Con đường nhân chủng bản địa
Anthropic không chỉ là "thông qua OpenRouter" nữa.
Khi độ phân giải của nhà cung cấp chọn `Anthropic
, Hermes sử dụng:
`API_mode = Anthropic_messages
- API thông điệp nhân loại gốc
agent/Anthropic_adapter.py để dịch
Độ phân giải thông tin xác thực cho Anthropic gốc hiện ưu tiên thông tin xác thực Mã Claude có thể làm mới hơn so với mã thông báo env được sao chép khi cả hai đều có mặt. Trong thực tế điều đó có nghĩa là:
- Các tệp thông tin xác thực của Mã Claude được coi là nguồn ưu tiên khi chúng bao gồm xác thực có thể làm mới
- các giá trị
Anthropic_TOKEN/Claude_CODE_OAuth_TOKENthủ công vẫn hoạt động dưới dạng ghi đè rõ ràng - Hermes làm mới thông tin xác thực Anthropic trước các lệnh gọi API Tin nhắn gốc
- Hermes vẫn thử lại một lần trên 401 sau khi xây dựng lại ứng dụng khách Anthropic, như một đường dẫn dự phòng
Đường dẫn OpenAI Codex
Codex sử dụng đường dẫn API phản hồi riêng:
`API_mode = Codex_responses
- giải quyết thông tin xác thực chuyên dụng và hỗ trợ cửa hàng xác thực
Định tuyến mô hình phụ trợ
Các công việc phụ trợ như:
- tầm nhìn
- tóm tắt khai thác web
- tóm tắt nén ngữ cảnh
- hoạt động của trung tâm kỹ năng
- Hoạt động trợ giúp MCP
- tuôn ra bộ nhớ`có thể sử dụng định tuyến nhà cung cấp/mô hình của riêng họ thay vì mô hình đàm thoại chính.
Khi một tác vụ phụ trợ được định cấu hình với nhà cung cấp `main
, Hermes sẽ giải quyết vấn đề đó thông qua cùng một đường dẫn thời gian chạy chung như cuộc trò chuyện thông thường. Trong thực tế điều đó có nghĩa là:
- điểm cuối tùy chỉnh theo hướng env vẫn hoạt động
- điểm cuối tùy chỉnh được lưu qua
Hermes model/config.yamlcũng hoạt động - định tuyến phụ trợ có thể cho biết sự khác biệt giữa điểm cuối tùy chỉnh đã lưu thực và dự phòng OpenRouter
Mô hình dự phòng
Hermes hỗ trợ chuỗi nhà cung cấp dự phòng được định cấu hình - danh sách các mục
(provider, model)
đã được thử theo thứ tự khi mô hình chính gặp lỗi. Lệnh fallback_model
` cặp đơn kế thừa vẫn được chấp nhận để tương thích ngược (và được di chuyển trong lần ghi đầu tiên).
Cách thức hoạt động nội bộ
- Bộ nhớ:
AIAgent.__init__lưu trữ lệnhfallback_modelvà đặt `_fallback_activated = False
.
2. Điểm kích hoạt:
_try_activate_fallback() được gọi từ ba vị trí trong vòng thử lại chính trong
`run_agent.py
:
- Sau khi thử lại tối đa các phản hồi API không hợp lệ (Không có lựa chọn nào, thiếu nội dung)
- Về lỗi máy khách không thể thử lại (HTTP 401, 403, 404)
- Sau khi thử lại tối đa các lỗi tạm thời (HTTP 429, 500, 502, 503)
- Luồng kích hoạt ( `_try_activate_fallback
):
- Trả về
Falsengay lập tức nếu đã kích hoạt hoặc chưa được cấu hình - Gọi
resolve_provider_CLIent()từauxiliary_CLIent.pyđể xây dựng ứng dụng khách mới với xác thực phù hợp - Xác định `API_mode
:
Codex_responses cho OpenAI-Codex,
Anthropic_messages cho nhân loại,
chat_completions cho mọi thứ khác
- Hoán đổi tại chỗ: `self.model
, `self.provider
, `self.base_url
, `self.API_mode
, `self.CLIent
, `self._CLIent_kwargs
-
Đối với dự phòng nhân loại: xây dựng ứng dụng khách Anthropic gốc thay vì tương thích với OpenAI
-
Đánh giá lại bộ nhớ đệm nhanh chóng (được bật cho các mô hình Claude trên OpenRouter)
-
Đặt `_fallback_activated = True
-
ngăn kích hoạt lại
- Đặt lại số lần thử về 0 và tiếp tục vòng lặp
- Luồng cấu hình:
-
CLI:
CLI.pyđọcCLI_CONFIG["fallback_model"]→ chuyển sang `AIAgent(fallback_model=...) -
Cổng:
gateway/run.py._load_fallback_model()đọcconfig.yaml→ chuyển tới `AIAgent -
Xác thực: cả khóa
providervàmodelphải không trống hoặc khóa dự phòng bị tắt
-
Điều gì KHÔNG hỗ trợ dự phòng
- Ủy quyền đại lý phụ ( `tools/delegate_tool.py
): đại lý phụ kế thừa nhà cung cấp của nhà cung cấp mẹ nhưng không kế thừa cấu hình dự phòng
- Nhiệm vụ phụ trợ: sử dụng chuỗi tự động phát hiện nhà cung cấp độc lập của riêng họ (xem Định tuyến mô hình phụ trợ ở trên)
Công việc định kỳ do hỗ trợ dự phòng:
run_job() đọc
fallback_providers (hoặc
fallback_model kế thừa) từ
config.yaml và chuyển nó tới
`AIAgent(fallback_model=...)
, khớp với mẫu
_load_fallback_model() của cổng. Xem Cron Internals.
Phạm vi kiểm tra
Xem
tests/test_fallback_model.py để biết các bài kiểm tra toàn diện bao gồm tất cả các nhà cung cấp được hỗ trợ, ngữ nghĩa một lần và các trường hợp khó khăn.