词元之母TOK.MOM - 平台充值汇率 1:1 即 1 人民币充值到账 1 美元,支持一个 Key 调用近 600+ 海内外模型,限时特价模型低至 1 折,欢迎上岸!
azure-foundry provider 支持 Microsoft Foundry(原 Azure AI Foundry)和 Azure OpenAI。单个 Foundry 资源可以托管两种不同传输格式的模型:https://<resource>.openai.azure.com/openai/v1 等端点上执行 POST /v1/chat/completions。用于 GPT-4.x、GPT-5.x、Llama、Mistral 及大多数开放权重模型。https://<resource>.services.ai.azure.com/anthropic 等端点上执行 POST /v1/messages。当 Microsoft Foundry 通过 Anthropic Messages API 格式提供 Claude 模型时使用。/anthropic 结尾的 URL 被识别为 Microsoft Foundry Claude 路由。GET <base>/models — 如果端点返回 OpenAI 格式的模型列表,Hermes 切换到 chat_completions 并用返回的部署 ID 预填选择器。/models 但接受 Anthropic Messages 格式的端点的回退方案。models.dev、provider 元数据及硬编码的系列回退)解析,并存储在 config.yaml 中,以便模型正确确定自身的上下文窗口大小。api_mode: chat_completions / codex_responses)— GPT-4/5、Llama、Mistral、DeepSeek 等。api_mode: anthropic_messages)— Microsoft Foundry 上的 Claude 模型。Azure AI User 授予两种接口的访问权限;某些租户可能显示为 Foundry User),Microsoft 文档对两者使用相同的推理 scope(https://ai.azure.com/.default)。底层实现:api_key= 契约——SDK 每次请求自动生成新的 JWT。httpx.Client,该 hook 由 agent.azure_identity_adapter.build_bearer_http_client 安装,因为 Anthropic SDK 原生不接受可调用的 auth_token。该 hook 在每次出站请求 时重写 Authorization: Bearer <fresh-jwt>。RBAC 和 Foundry scope 相同——唯一的区别在于 SDK 契约。Azure AI User,无需重写配置。az login 进行本地开发。azure-identity 在首次使用时通过 Hermes 的懒加载安装路径自动安装。如需预先安装:config.yaml 的配置config.yaml 中只管理一个 Entra 专属配置项:scope — OAuth 资源 scope。默认为 Microsoft 文档中的推理 scope(https://ai.azure.com/.default)。仅在你的资源针对非标 准 audience 进行了预配时才需要覆盖。azure-identity 直接从标准 AZURE_* 环境变量读取——参见下方的凭据解析顺序。在 ~/.hermes/.env 或你的部署环境中设置这些变量,与 Microsoft SDK 参考文档的描述完全一致。~/.hermes/.env——azure-identity 在进程内缓存令牌(在可用时也会使用操作系统密钥链 / ~/.IdentityService)。azure-identity 的 DefaultAzureCredential 在每次令牌请求时按以下链路逐一尝试,在第一个返回令牌的凭据处停止:AZURE_TENANT_ID + AZURE_CLIENT_ID + AZURE_CLIENT_SECRET(或 AZURE_CLIENT_CERTIFICATE_PATH / AZURE_FEDERATED_TOKEN_FILE)。AZURE_FEDERATED_TOKEN_FILE(AKS 联合令牌 / OIDC)。169.254.169.254);App Service / Functions / Container Apps 使用 IDENTITY_ENDPOINT。Foundry Agent Service 托管 Agent 使用托管 Agent 的 Agent 标识。az login 会话。azd auth login。Connect-AzAccount。Azure AI User(或 Foundry User)角色。model.auth_mode: entra_id——无需环境变量。AZURE_CLIENT_ID 设置为用户分配标识的客户端 ID,以便 DefaultAzureCredential 选择正确的标识。Azure AI User(或 Foundry User)角色。Hermes 在托管 Agent 内部使用 ManagedIdentityCredential;角色分配应针对 Agent 标识,而非仅针对父项目或你的用户。AZURE_FEDERATED_TOKEN_FILE 自动检测。model.auth_mode: entra_id 无需进一步修改配置即可使用。AZURE_TENANT_ID、AZURE_CLIENT_ID、AZURE_CLIENT_SECRET。AZURE_AUTHORITY_HOST(例如 Azure Government 使用 https://login.microsoftonline.us,Azure China 使用 https://login.partner.microsoftonline.cn)。azure-identity 会直接读取该变量。model.auth_mode: entra_id 时,hermes doctor 会对 DefaultAzureCredential 运行 10 秒探测,报告哪个内部凭据成功(环境变量是否存在、托管标识端点是否可达等)。hermes auth 显示结构化状态块:azure-foundry (Microsoft Entra ID):
Endpoint: https://my-resource.openai.azure.com/openai/v1
Scope: https://ai.azure.com/.default
Status: configured; live token probe is skipped hereauth_token。Hermes 在自定义 httpx.Client 上安装请求事件 hook,每次出站请求时生成新的 JWT 并重写 Authorization: Bearer <jwt>。这在功能上等同于 OpenAI SDK 原生的 Callable[[], str] 契约,但多了一层间接调用。如果 Anthropic SDK 在未来版本中添加对可调用认证的原生支持,Hermes 将透明地切换到该方式。multiprocessing.Pool。 Entra 令牌 provider 是一个闭包,无法跨进程边界序列化。batch_runner.py 会自动从 worker 配置中移除该可调用对象,让每个 worker 进程从 config.yaml 重建自己的 provider——无需用户操作,但每个 worker 在启动时需要执行一次凭据链遍历。auth.json 中持 久化 Bearer JWT。 Hermes 不复制 azure-identity 的内部令牌缓存;冷启动时会在首次推理时遍历凭据链。config.yaml)~/.hermes/.env 中:AZURE_FOUNDRY_API_KEY=<your-azure-key>openai Python 客户端,改动极少:/chat/completions 会返回 400 "The requested operation is unsupported."。Hermes 通过名称检测这些模型系列,并透明地将 api_mode 升级为 codex_responses,即使 config.yaml 中仍写着 api_mode: chat_completions。GPT-4、GPT-4o、Llama、Mistral 及其他部署保持使用 /chat/completions。max_completion_tokens。 Azure OpenAI(与直接使用 OpenAI 一样)对 gpt-4o、o 系列和 gpt-5.x 模型要求使用 max_completion_tokens。Hermes 根据端点发送正确的参数。api-version 的旧版端点。 如果你有类似 https://<resource>.openai.azure.com/openai?api-version=2025-04-01-preview 的旧版 base URL,Hermes 会提取查询字符串并通过每次请求的 default_query 转发(否则 OpenAI SDK 在拼接路径时会丢弃它)。/v1。 Anthropic SDK 在每次请求 URL 后追加 /v1/messages——Hermes 在将 URL 传递给 SDK 之前移除末尾的 /v1,以避免出现双重 /v1 路径。api-version 通过 default_query 传递,而非追加到 URL。 Azure Anthropic 要求 api-version 查询字符串。将其嵌入 base URL 会产生类似 /anthropic?api-version=.../v1/messages 的畸形路径并返回 404。Hermes 通过 Anthropic SDK 的 default_query 传递 api-version=2025-04-15。x-api-key。 Azure 的 Anthropic 兼容路由要求 Authorization: Bearer <key>,而非 Anthropic 原生的 x-api-key 头。Hermes 检测到 base URL 中包含 azure.com 时,通过 SDK 的 auth_token 字段路由 API 密钥,确保正确的头部到达上游。anthropic-beta: context-1m-2025-08-07 头控制 1M token Claude 上下文(Opus 4.6/4.7、Sonnet 4.6)的访问。Hermes 在 Azure 路径上保留该 beta 头(在原生 Anthropic OAuth 请求中会被去除,因为某些订阅会拒绝它,但 Azure 要求它)。~/.claude/.credentials.json OAuth 令牌刷新循环对 Azure 端点明确跳过,以防止 Claude Code OAuth 令牌在会话中途覆盖你的 Azure 密钥。provider: anthropic + Azure base URLprovider: anthropic 并只想将其指向 Microsoft Foundry 以使用 Claude,可以完全跳过 azure-foundry provider:~/.hermes/.env 中设置 AZURE_ANTHROPIC_KEY。Hermes 检测到 base URL 中包含 azure.com 时,会绕过 Claude Code OAuth 令牌链,直接使用 Azure 密钥进行 x-api-key 认证。key_env 是规范的 snake_case 字段名;api_key_env(以及驼峰式 keyEnv / apiKeyEnv)作为别名被接受。如果同时设置了 key_env 和 AZURE_ANTHROPIC_KEY/ANTHROPIC_API_KEY,key_env 指定的环境变量优先。az cognitiveservices account deployment list)和 Azure AD 主体,而非推理 API 密钥。<resource>.openai.azure.com/openai/v1)通过 GET /models 暴露资源的可用模型目录。Hermes 使用此列表预填模型选择器。/anthropic 路由:通过 URL 路径检测,模型名称手动输入。| 变量 | 用途 |
|---|---|
AZURE_FOUNDRY_API_KEY | Microsoft Foundry / Azure OpenAI 的主 API 密钥(api_key 模式) |
AZURE_FOUNDRY_BASE_URL | 端点 URL(通过 hermes model 设置;环境变量作为回退) |
AZURE_ANTHROPIC_KEY | 由 provider: anthropic + Azure base URL 使用(ANTHROPIC_API_KEY 的替代) |
AZURE_TENANT_ID | 服务主体流程的 Entra ID 租户 |
AZURE_CLIENT_ID | Entra ID 客户端 ID(服务主体、工作负载标识或用户分配的托管标识) |
AZURE_CLIENT_SECRET | 服务主体密钥 |
AZURE_CLIENT_CERTIFICATE_PATH | 服务主体证书(密钥的替代方案) |
AZURE_FEDERATED_TOKEN_FILE | 工作负载标识联合令牌路径(AKS) |
AZURE_AUTHORITY_HOST | 主权云 authority 主机覆盖 |
IDENTITY_ENDPOINT / MSI_ENDPOINT | App Service、Functions 和 Container Apps 的托管标识端点;VM 通常改用 IMDS |
AZURE_* 环境变量。Hermes 除在 hermes doctor 输出中报告哪些来源存在外,不会检查这些变量。/chat/completions 上提供 gpt-5.x,而非 /responses。当 URL 包含 openai.azure.com 时,Hermes 会自动处理此问题,但如果你看到带有 Invalid API key 正文的 401,请检查 config.yaml 中的 api_mode 是否为 chat_completions。/v1/messages?api-version=.../v1/messages 返回 404。api-version 参数现在通过 default_query 传递,而非嵌入 base URL,因此 SDK 在 URL 拼接时不会破坏它。/models 探测和 Anthropic Messages 探测。这对于防火墙后或设有 IP 白名单的私有端点是正常现象。回退到手动选择 API 模式并输入部署名称——一切仍然正常工作,Hermes 只是无法预填选择器。hermes model,向导将重新探测。如果探测仍然选择了错误的模式,可以直接编辑 config.yaml:auth_mode: entra_id 后返回 401 Unauthorized。az login 刷新你的开发者会话(缓存的令牌可能已过期)。Azure AI User(或 Foundry User)角色分配是否已生效:az role assignment list --assignee <user-or-identity-id> 应在你的 Foundry 资源上列出该角色。角色传播最多需要 5 分钟。AZURE_CLIENT_ID 是否与附加到计算资源的标识匹配。hermes doctor——Azure Entra 探测会报告令牌获取是否成功, 并提供修复提示。hermes doctor。常见原因包括令牌服务不可达或本地登录状态过期——在 CI 中优先使用工作负载标识,使用服务主体时设置 AZURE_TENANT_ID+AZURE_CLIENT_ID+AZURE_CLIENT_SECRET,或在本地开发时运行 az login。Azure AI User(或 Foundry User)角色是否已在 Foundry 资源上分配(它同时覆盖 /openai/v1 和 /anthropic 路径)。如果向导期间 OpenAI 风格探测成功,但运行时 claude-* 请求失败,最常见的原因是早期向导运行遗留的过时 model.entra.scope——从 config.yaml 中删除 entra.scope 行,使运行时回退到默认的 https://ai.azure.com/.default scope。