Skip to content

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 别的内容类型)

导出器常用的变量:

bash
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/completionsOpenAI chat completions,支持流式
POST /gw/openai/v1/responsesOpenAI responses
POST /gw/openai/v1/embeddingsOpenAI embeddings
GET /gw/openai/v1/models平台的模型(OpenAI 的列表格式)
POST /gw/anthropic/v1/messagesAnthropic 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 追踪不收费;追踪的数据量照常计量,写在用量页上。

本站的法律文件都是草稿,待律师审阅,尚未生效。