OpenTelemetry 与 AI Gateway
AI Gateway 开发中
AI Gateway 这种接法正在开发,暂时不能在平台上选用;OpenTelemetry 现在就能用。网关的地址照常开着:已经用它接好的项目照常可用,机器上没有 OpenAI 密钥的本地测试机也照旧经它调用模型。
不用 SDK 也能把追踪发进项目的日志:给已经用 OpenTelemetry 埋点的应用的 OTLP 接收端,以及 AI Gateway(你们的 OpenAI 或 Anthropic SDK 改为调用它,而不是直接调服务商)。两者都用有上传权限的项目令牌(pj_…,在自动化 →「API 令牌」里新建时勾上「允许上传日志与实验」),都写进这个令牌所属的项目。
OpenTelemetry(OTLP)
POST https://<平台地址>/otel/v1/traces
| 协议 | OTLP over HTTP:application/x-protobuf(或 application/protobuf),或 application/json |
| 压缩 | gzip 或不压缩 |
| 认证 | Authorization: Bearer pj_… 或 x-api-key: pj_… |
| 大小 | 每个请求最多 8 MB,解压前后都算(超过是 413:一次少发几个跨度) |
| 回答 | 全部收下时 200 加 {},否则 {"partialSuccess": {"rejectedSpans": "N", "errorMessage": "…"}}:读不了的跨度单独拒收,不会整个请求拒掉。出错时是 google.rpc.Status(401 没有令牌,403 没有上传权限,415 别的内容类型) |
导出器常用的变量:
OTEL_EXPORTER_OTLP_ENDPOINT=https://<平台地址>/otel
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_OTLP_HEADERS=Authorization=Bearer%20pj_你的令牌
OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=prod,service.name=support-agent读哪些属性。 每个跨度按它带的第一种约定读:Vercel AI SDK(ai.*)、OpenInference(openinference.span.kind、input.value、llm.*)、OpenLLMetry / Traceloop(traceloop.*、gen_ai.prompt.N.*),然后是 OpenTelemetry GenAI 语义约定(gen_ai.operation.name、gen_ai.request.model、gen_ai.response.model、gen_ai.usage.*、gen_ai.input.messages、gen_ai.output.messages、工具调用和它们的事件)。都不带的跨度作为 other 种类保存,保留属性。每个跨度最多 256 个属性、单个字符串 32 KB、32 个事件。
- 种类和成本:模型和嵌入跨度会得到模型、token,以及按模型标价算出的成本;模型没有已知价格的,在追踪的元数据里记作没有定价。
- 环境标签:来自资源的
deployment.environment.name(或deployment.environment):dev/development/local→dev,staging/stage→staging,prod/production→prod,ci→ci;别的值丢掉。没有时用请求头x-preworld-environment(写在OTEL_EXPORTER_OTLP_HEADERS里)。 - 版本:
service.version显示为追踪的版本。 - 连到实验:跨度属性
preworld.experiment_id和preworld.row_key(SDK 在 Eval 里自动带上)。别的项目的实验会被忽略。
OTLP 现在没有请求速率上限。发来的数据量记作「上传的追踪」,现在不收费。
AI Gateway
| 地址 | 形状 |
|---|---|
POST /gw/openai/v1/chat/completions | OpenAI chat completions,支持流式 |
POST /gw/openai/v1/responses | OpenAI responses |
POST /gw/openai/v1/embeddings | OpenAI embeddings |
GET /gw/openai/v1/models | 平台的模型(OpenAI 的列表格式) |
POST /gw/anthropic/v1/messages | Anthropic messages,支持流式 |
把 SDK 的 base URL 设成 https://<平台地址>/gw/openai/v1(OpenAI)或 https://<平台地址>/gw/anthropic(Anthropic),API key 设成项目令牌:Authorization: Bearer pj_… 和 x-api-key: pj_… 都行。
平台的模型,还是你们自己的密钥
| 平台的模型 | 你们自己的服务商密钥 | |
|---|---|---|
| 怎么用 | 请求平台提供的模型(GET /gw/openai/v1/models):Gemini 4 Argon、GPT-6.1 Sol、Gemini 3.8 Flash、GPT-6 Luna;开通了的话还有嵌入模型 gemini-embedding-001。模型名照列表写(gemini-3.8-flash),带上平台的前缀也行(vertex:gemini-3.8-flash、azure:gpt-6.1-sol,就是项目设置里模型的写法) | 加请求头 x-provider-key: <你们的密钥> |
| 谁来回答 | 平台的模型,用平台自己在 Azure 或 Google Cloud 的账户 | 服务商:Anthropic 形状发给 Anthropic;OpenAI 形状下 gemini… / google/… 模型发给 Google,claude… 模型发给 Anthropic,其余发给 OpenAI |
| 怎么收费 | token 按模型标价加 30%,记在组织账单的「平台模型(被测 AI)」里 | 这次调用我们不收费,由服务商向你们收。追踪里照样按标价写出这次调用的成本 |
| 额度 | 每次调用前检查:额度用完是 402,组织被暂停是 403 org_suspended | 不需要 |
服务商密钥只用于这一次调用,从不保存、不记日志、不写进追踪。对平台模型发 Anthropic 形状的请求会先转换;平台模型没有的功能(服务端工具、文档块)回答 400 unsupported_on_platform_model。
请求头
| 请求头 | 方向 | 意思 |
|---|---|---|
x-provider-key | 请求 | 你们的服务商密钥(8 到 512 个可打印字符) |
x-preworld-environment | 请求 | dev、staging、prod 或 ci,给追踪用 |
anthropic-version、anthropic-beta、openai-organization、openai-project | 请求 | 转给服务商 |
x-preworld-trace-id | 回答 | 这次调用变成的追踪 |
retry-after、x-ratelimit-*、anthropic-ratelimit-*、x-request-id | 回答 | 从服务商转回来 |
记下什么
每次调用一条追踪(来源「Gateway」)、一个跨度:chat <模型> 或 embeddings <模型>,它的 token(包括缓存的)、成本,请求正文作为输入、回复作为输出,以及 gen_ai.* 属性。流式的在结束后整段记下。调用方拿到流的最后一句([DONE]、结束原因、message_stop)就关掉连接——OpenAI 的 Python SDK 就这样——回复是完整的,不算断。没到最后一句调用方就关了连接的,记成「调用方取消」(状态 cancelled,preworld.gateway.broken_off_reason 是 caller_closed),不算出错。真的中途断了的标成出错,跨度上写明原因(preworld.gateway.broken_off_reason):模型 120 秒没动静、模型的回答断了,或者流没到最后一句就结束了。出错的调用在跨度的 error.type 和 otel.status_description 写明为什么:服务商的错误信息,或者流为什么断。日志列表的「输入」「输出」是最后一条用户消息和模型回复的文字;完整的请求和回复在追踪侧栏里。在线评分规则给这些追踪打分,和别的追踪一样;「调用方取消」的不打。
上限和错误
- 默认每个组织每分钟 600 次(超过是
429 rate_limited,带Retry-After)。 - 请求正文最多 4 MB;
max_tokens(或max_completion_tokens、max_output_tokens)最多 32,000。 - 120 秒收不到模型的一个字节:
504 upstream_timeout。 - 错误按这个地址的形状回答:OpenAI 的
{"error": {"message", "type", "code"}}或 Anthropic 的{"type": "error", "error": {"type", "message"}}。错误码有unauthorized、invalid_api_key、token_scope_missing、model_not_found(不是平台的模型:把你们的密钥放在x-provider-key里发)、platform_models_off、max_tokens_too_large、invalid_provider_key、upstream_unreachable等。服务商自己的错误照它的状态码转回,换成这个地址的形状,保留服务商的原话(比如 Vertex 回的是列表[{"error": …}],转成 OpenAI 的{"error": {"message", "type", "code": "invalid_argument"}});本来就是这个形状的,原样转回。
计费
见价格:对平台模型的调用按用量计费,标价加 30%;带自己密钥的调用和 OTLP 追踪不收费;追踪的数据量照常计量,写在用量页上。