Skip to Content

What does the gen_ai.provider.name attribute mean in Rius?

Rius reads gen_ai.provider.name as a string that names the provider behind a model call, for example openai or anthropic. It is stored on the span, and Rius moves the value of the older gen_ai.system key onto it when spans are ingested. Cost does not come from it: Rius computes cost from the request model and the token counts.

How it works

  • What the key holds. A string with the provider’s name, such as openai or anthropic. The span attribute reference lists it with the model attributes that drive model analytics.
  • What sits next to it. gen_ai.request.model is the model you asked for. gen_ai.response.model is the model the provider reports. gen_ai.response.id is the provider’s completion id. gen_ai.provider.name names the provider itself.
  • The older name. gen_ai.system is deprecated. Rius moves its value to gen_ai.provider.name at ingest and stores it under the new key. Search and filter on gen_ai.provider.name, because the old key no longer holds the value. Rius normalizes by filling gaps, never by overwriting, so a value you send natively under gen_ai.provider.name is the one that stays.
  • What it does not do. Cost is computed server-side from gen_ai.request.model plus the gen_ai.usage.* token counts. The provider name is not one of those inputs, so setting it does not change a span’s cost. You never send a cost attribute.
  • Who defines it. It is an OpenTelemetry GenAI convention key, listed with the other upstream keys Rius reads in the registry.

Set it up

  1. Send your spans to the Rius ingest endpoint over OTLP/HTTP with an API key from the console. This is the wire contract in short. The full setup for your language is in Trace LLM calls with OpenTelemetry.

    POST https://ingest.eu.console.rius-glassflow.com/v1/traces Authorization: Bearer <your API key> Content-Type: application/x-protobuf
  2. On the span for each model call, set gen_ai.provider.name as a string, for example openai or anthropic.

  3. Set gen_ai.request.model and the gen_ai.usage.* token counts on the same span. These are what Rius uses to compute cost. A span with no model, or with no token counts, gets no cost, whether or not it has a provider name.

  4. If your instrumentation still writes gen_ai.system, you do not need to rename it. Rius moves the value to gen_ai.provider.name at ingest.

  5. If you export without the Rius SDKs, raise the attribute limit. OpenTelemetry SDKs keep at most 128 attributes per span and drop the rest without an error, so a crowded span can lose its model, tools, usage or messages, and any other attribute you set on it can be dropped too.

    export OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT=4096

What you get

  • The provider name is stored on the span as gen_ai.provider.name, so you can search and filter trace inspection on it.
  • Spans from instrumentation that still sends gen_ai.system end up under the same key as spans that send the current name. You search one key for both.
  • Cost for the span is unaffected by this key. Rius computes it from the request model and the token counts, as a list-price estimate in US dollars.
  • A span that carries the key, the model and the token counts has the provider, the model and the usage described in one place.

When something else fits

  • If you want to know which model served a call, read gen_ai.request.model and gen_ai.response.model, not the provider name.
  • If you want cost, send the request model and token counts. The full list of attributes Rius reads is in the span attribute reference.

Still stuck? Get help

Last updated on