- 对 Playground 或 LLM 作为评判的评估 请求进行身份验证,以对接您自己的提供商网关。
- 注入特定于提供商的 API 密钥或认证头,而不将其暴露给最终用户。
- 转换请求或响应主体(例如,在 OpenAI 格式和自定义网关格式之间转换)。
工作原理
来自 LangSmith 的每个请求在代理中经过以下步骤:- 验证 JWT(签名、签发者、受众)
- 调用您的
ext_authz服务,该服务接收已验证的 JWT 并返回要作为头信息注入的提供商凭据 - 可选地调用您的
ext_proc转换器,它可以重写请求和响应主体(例如,在 OpenAI 格式和自定义网关格式之间转换) - 将带有自定义头(静态或动态)的请求转发到上游提供商
ext_authz 服务和转换器都是客户部署的组件,与代理一起在您的环境中运行。根据您的用例,可以启用其中一个或两个(取决于您的用例)。

先决条件
- LangSmith 企业版计划(SaaS 或版本 0.13.33+ 的自托管)
- 带有 Helm 3 的 Kubernetes 集群
- Envoy v1.37 或更高版本(Helm chart 默认为
envoyproxy/envoy:v1.37-latest) - 您的上游 LLM 提供商或网关的 URL(代理将请求转发到的目标)
认证代理目前支持 Playground、Evals、Fleet、Polly 和 Insights 功能。
Playground 和 Evals 在 v0.13.33+ 中可用。Polly 和 Insights 在 v0.13.39+ 中可用。
1. 配置 JWT 签名(仅限自托管 LangSmith)
对于 LangSmith SaaS,请跳过此步骤。JWT 签名已配置。 使用 step CLI(或您偏好的内部流程)生成 Ed25519 密钥对。Ed25519 是 LangSmith 用于签署 JWT 的签名算法。私钥对每个请求进行签名;认证代理仅使用公钥验证签名。LANGSMITH_SIGNING_JWKS 包含 Ed25519 私钥,并作为 Kubernetes Secret 存储。它永远不会被暴露。LangSmith 自动提取相应的公钥并在 /.well-known/jwks.json 提供服务。认证代理获取此公共端点以验证 JWT 签名,而无需私钥。
在您的 LangSmith values.yaml 中引用该 Secret:
LLM_AUTH_PROXY_ISSUER 设置签名 JWT 中的 iss 声明。使用 langsmith 以匹配 SaaS 默认值,或使用自定义标识符如 langsmith:self-hosted:<short_identifier> 来区分您的安装。该值必须与 步骤 4 中认证代理 chart 中的 jwtIssuer 匹配。
2. 为您的组织启用 LLM 认证代理
- 自托管
- SaaS
选项 A: 为特定组织启用:在 LangSmith UI 中,导航到 Settings 页面,复制左上角 Organizations 旁边的组织 ID。针对您的 LangSmith PostgreSQL 数据库运行以下命令:选项 B: 为安装中的所有组织启用:在您的 LangSmith
values.yaml 中的 commonEnv 添加以下内容:此设置对个人组织无效。
3. 在 LangSmith 中配置组织设置
在 LangSmith UI 中,导航到 Settings > General,配置以下内容:-
JWT 受众: 代理将验证的
aud声明值(例如example-audience)。这必须与 步骤 4 中认证代理 chart 中的jwtAudiences匹配。 - 启用 LLM 认证代理: 为您的组织开启此开关。
-
允许的 URL: 控制代理被允许将 JWT 转发到的目标 URL。这可以防止凭据被转发到非预期的主机。选择以下三个选项之一:
- 允许全部(默认):允许将 JWT 转发到任何上游 URL。等同于无限制。
- 阻止全部: 阻止将 JWT 转发到所有 URL。
- 自定义: 指定允许的 URL 模式的显式列表。不接受空字符串和裸
*。当 LLM 认证代理开关关闭时,此控件被禁用。

4. 安装认证代理 Helm chart
添加 LangChain Helm 仓库:values.yaml。JWKS 配置有两个选项:
jwksUri(推荐): 指向您的 LangSmith 实例的/.well-known/jwks.json端点。Envoy 自动获取和缓存公钥,支持无缝密钥轮换。jwksJson(内联): 将 JWKS JSON 直接粘贴到values.yaml中。用于测试或认证代理无法访问 LangSmith 的网络隔离环境。需要更新 chart 来轮换密钥。仅包含公钥组件;省略d字段(私钥)。
jwksUri 优先。
编写 ext_authz 服务
当您需要添加、删除或编辑授权头时,使用 ext_authz,例如,根据 JWT 中的身份注入提供商 API 密钥。您的服务接收已验证的 JWT 和可选的请求主体,并返回要注入上游的头信息。这使用 Envoy 的 HTTP ext_authz 过滤器(不是 gRPC)。
在 values.yaml 中启用它:
工作原理
在转发每个请求之前,Envoy 使用与原始请求相同的 HTTP 方法调用您的服务,地址为<serviceUrl>/check<original_path>。您的服务在 x-langsmith-llm-auth 头中接收已验证的 JWT。
您的服务返回一个普通的 HTTP 响应:
2xx: 允许请求。任何匹配allowedUpstreamHeaders模式(默认:authorization和x-*)的头都会注入到上游请求中。要在转发前剥离 JWT,请在响应中包含x-envoy-auth-headers-to-remove: x-langsmith-llm-auth。- 非
2xx: 拒绝请求。状态码和任何匹配allowedClientHeaders模式(默认:www-authenticate和x-*)的头会返回给客户端。
部署选项
您的ext_authz 服务可以以两种方式运行:
- Sidecar: 在与代理相同的 Pod 中运行服务。在
values.yaml的authProxy.deployment.sidecars下添加容器,在authProxy.deployment.volumes下添加任何所需的卷。使用localhostURL,例如http://localhost:10002。 - 独立部署: 独立部署服务,并将
extAuthz.serviceUrl指向它。使用集群内 DNS 名称,例如http://my-auth-service.my-namespace.svc.cluster.local:8080,或者如果服务有自己的入口,则使用外部 HTTPS URL。
示例部署
下面的示例是一个最小的 Pythonext_authz 服务,执行 OAuth2 客户端凭据令牌交换。在每个请求上,它返回一个缓存的 Authorization 头,其中包含新的访问令牌,并在令牌过期前从配置的令牌端点刷新它。完整示例请参见 chart 仓库中的 e2e/oauth/。
ext-authz-oauth.py
ext-authz-oauth.py
extAuthz 参数的完整列表,请参阅 Helm chart README。
编写 ext_proc 转换器
当您需要重写请求或响应主体时,使用 ext_proc,例如,在 OpenAI 格式和自定义网关格式之间转换,或向请求负载注入额外字段。这使用 Envoy 的 ext_proc 过滤器。
与 ext_authz(HTTP)不同,ext_proc 使用双向 gRPC 流。Envoy 在每个处理阶段(请求头、请求体、响应头、响应体)向您的转换器服务发送一条消息,您的服务为每个阶段回复变更。您的转换器必须实现 envoy.service.ext_proc.v3.ExternalProcessor gRPC 服务。示例 Go 实现请参见 chart 仓库中的 e2e/transformer/。
何时使用 ext_proc 与 ext_authz
| 能力 | ext_authz | ext_proc |
|---|---|---|
| 修改请求头 | 是 | 是 |
| 修改响应头 | 否 | 是 |
| 修改请求体 | 否 | 是 |
| 修改响应体 | 否 | 是 |
| 协议 | HTTP | gRPC |
ext_authz。如果您需要重写主体,请使用 ext_proc。两者可以同时启用。
在 values.yaml 中启用 ext_proc:
failureModeAllow: true 以在转换器不可用时允许请求通过。默认值(false)会拒绝请求。
处理模式
通过processingMode 控制哪些阶段发送到您的转换器。仅启用您需要的阶段,因为禁用未使用的阶段可以减少延迟。
| 字段 | 选项 | 描述 |
|---|---|---|
requestHeaderMode | SEND, SKIP, DEFAULT | 是否转发请求头。 |
responseHeaderMode | SEND, SKIP, DEFAULT | 是否转发响应头。 |
requestBodyMode | NONE, BUFFERED, STREAMED, BUFFERED_PARTIAL | 如何发送请求体。 |
responseBodyMode | NONE, BUFFERED, STREAMED, BUFFERED_PARTIAL | 如何发送响应体。 |
requestTrailerMode | SEND, SKIP | 是否转发请求尾部。 |
responseTrailerMode | SEND, SKIP | 是否转发响应尾部。 |
- 对于请求体重写,使用
BUFFERED:在发送前缓冲完整主体,对于 JSON 重写最简单。 - 对于流式 LLM 响应体重写,使用
STREAMED:在数据块到达时发送,延迟更低但实现更复杂。 - 使用
NONE完全跳过某个阶段。
请求流程
启用ext_proc 进行头注入和主体重写的示例:
示例部署
下面的示例将一个最小的 Go 转换器部署为 Kubernetes Deployment。它从请求头中读取 JWT,注入Authorization 头,并将请求体从 OpenAI 格式重写为自定义格式。
transformer-configmap.yaml
transformer-configmap.yaml
transformer-deployment.yaml
transformer-deployment.yaml
对于生产环境,请预先构建容器镜像,而不是在 init 容器中编译。示例多阶段构建请参见 Helm chart 仓库 中的
e2e/transformer/Dockerfile。附加配置
HTTP 代理
Envoy 不遵循HTTP_PROXY、HTTPS_PROXY 或 NO_PROXY 环境变量。请显式配置 HTTP 代理:
其他选项
有关入口、自动扩缩、资源限制和其他配置选项,请参阅 Helm chart README。完整配置示例
JWT 声明参考
LangSmith 使用 Ed25519 (EdDSA) 签署 JWT。公钥在/.well-known/jwks.json 提供服务,并由代理自动获取。认证代理使用这些公钥验证签名。
| 声明 | 描述 |
|---|---|
iat, exp, jti, nbf | 标准 JWT 声明(签发时间、过期时间、JWT ID、生效时间) |
iss | 签发者。SaaS 为 langsmith;自托管通过 LLM_AUTH_PROXY_ISSUER 设置 |
aud | 受众。与 LangSmith 组织设置中的 JWT 受众匹配 |
sub | 操作者标识符(用户 ID、评估者 ID、助手 ID 或 API 密钥 ID) |
actor_type | 以下之一:user、evaluator、agent-builder、api_key |
workspace_id | 工作区 ID |
workspace_name | 工作区名称 |
organization_id | 组织 ID |
organization_name | 组织名称 |
request_id | 请求关联 ID |
ls_user_id | LangSmith 用户 ID(仅当 actor_type 为 user 时存在) |
x-langsmith-llm-auth 请求头传递给您的 ext_authz 或转换器服务。
常见问题
认证代理是否支持企业代理?
认证代理是否支持企业代理?
是。通过
values.yaml 中的 httpProxy 部分配置 HTTP 代理。详情请参阅 HTTP 代理。认证代理是否支持自定义证书?
认证代理是否支持自定义证书?
是,通过
customCa 用于自定义 CA 证书,通过 mtls 用于双向 TLS。单个认证代理是否可以路由到多个上游 LLM 网关?
单个认证代理是否可以路由到多个上游 LLM 网关?
否。认证代理只有一个
upstream 字段。认证代理是否可以为多个组织提供服务?
认证代理是否可以为多个组织提供服务?
是。多个组织可以通过其在 LangSmith 中的模型配置指向同一个认证代理实例。
LangSmith 到认证代理的连接是否可以使用 HTTP 而不是 HTTPS?
LangSmith 到认证代理的连接是否可以使用 HTTP 而不是 HTTPS?
可以,但仅限于自托管,我们通常建议将认证代理放在专用入口后面,以便通信使用 HTTPS。要允许 HTTP,请在您的 LangSmith
values.yaml 中的 commonEnv 和 playground.deployment.extraEnv 添加 LLM_AUTH_PROXY_ACCEPT_HTTP。
要为 Polly 和 Insights 启用到认证代理的 HTTP 流量,请在相应的 extraEnv 部分设置此环境变量:config.polly.agent.extraEnv 和 config.insights.agent.extraEnv。Helm chart 参考
有关可配置值的完整列表,请参阅 Helm chart README。通过 MCP 将这些文档 连接到 Claude、VSCode 等,以获取实时答案。



