Hermes Provider 抽象
设计哲学
Hermes 以 OpenAI-compatible Chat Completions 为窄腰,特殊 provider 通过 transport/adapter 适配:
AIAgent (runtime)
↓
OpenAI SDK (默认 transport)
↓
ProviderTransport (可选特殊 transport)
↓
HTTP requestProviderTransport
text
agent/transports/base.pypython
class ProviderTransport(ABC):
"""A transport owns the data path for one api_mode."""
@abstractmethod
def convert_messages(self, messages): ...
@abstractmethod
def convert_tools(self, tools): ...
@abstractmethod
def build_kwargs(self, messages, tools, ...): ...
@abstractmethod
def normalize_response(self, response): ...Transport 实现
| Transport | 文件 | api_mode |
|---|---|---|
| Chat Completions | transports/chat_completions.py | chat_completions |
| Anthropic | transports/anthropic.py | anthropic_messages |
| Bedrock | transports/bedrock.py | bedrock_converse |
| Codex | transports/codex.py | codex_responses |
Transport 不负责的事
text
TRANSPORT OWNS: RUNTIME OWNS (AIAgent):
convert_messages client construction
convert_tools streaming
build_kwargs credential refresh
normalize_response prompt caching
interrupt handling
retry logicapi_mode
python
# 不同 api_mode 用不同 transport
if api_mode == 'codex_responses':
transport = CodexResponsesTransport()
elif api_mode == 'anthropic_messages':
transport = AnthropicMessagesTransport()
elif api_mode == 'bedrock_converse':
transport = BedrockConverseTransport()
else:
transport = ChatCompletionsTransport() # default与 OpenCode Route 分解对比
| 维度 | Hermes | OpenCode |
|---|---|---|
| 核心抽象 | ProviderTransport | Route (Protocol+Endpoint+Auth+Framing) |
| 默认假设 | OpenAI SDK | Effect fetch |
| 消息转换 | convert_messages | Protocol.toRequest |
| 响应转换 | normalize_response | Protocol.fromResponse + Framing.parse |
| 新增 Provider | transport 类 | 5-15 行 Route.make() |
| 认证 | API key on AIAgent | Route.auth per-request |
| 复杂度 | 中 | 高(更灵活) |