Upgrading to 1.0
Version 1.0.0 of both SDKs, glassflow-rius for Python and
@glassflow-ai/rius for TypeScript, finishes the move from the GlassFlow
name to Rius and brings span names in line with the OpenTelemetry GenAI
conventions. The package names, the Python import (rius), and the
supported runtimes (Python 3.10+, Node 18+) are unchanged.
1.0.0 needs the Rius platform release of 2026-09-29 or later, which reads
the new rius.span.pending attribute. The hosted platform already runs it.
Python: rename your GLASSFLOW_* environment variables first. 1.0.0
reads only RIUS_* names. A GLASSFLOW_API_KEY or GLASSFLOW_ENDPOINT
left in the environment is ignored, and with no API key the SDK exports
nothing. The TypeScript SDK never read the old names.
Upgrade checklist
-
Rename environment variables from
GLASSFLOW_*toRIUS_*, for exampleGLASSFLOW_API_KEYtoRIUS_API_KEYandGLASSFLOW_ENDPOINTtoRIUS_ENDPOINT(Python only). -
Upgrade the package:
pip install --upgrade "glassflow-rius>=1.0.0" npm install @glassflow-ai/rius@^1.0.0 -
TypeScript with the Anthropic OpenInference instrumentation: upgrade
@arizeai/openinference-instrumentation-anthropicto^0.2.7or later, the first version that reports prompt-cache tokens. -
Review saved searches, alerts, and dashboards that match on span names, operation names, or
gen_ai.request.*keys. The tables below list what moved. -
If you run Langfuse, Traceloop, Logfire, MLflow, OpenLIT, or Laminar in the same process, decide whether to turn on the foreign provider bridge.
Breaking changes
| What changed | What to do |
|---|---|
Python no longer reads GLASSFLOW_* environment variables. | Rename them to RIUS_*. |
The pending-span attribute is rius.span.pending, not glassflow.span.pending. | Update any code that imports the constant. |
The tracer scope is rius, not glassflow. | Update collector or processor rules that filter on the instrumentation scope. |
Unnamed spans follow the GenAI conventions: chat {model}, embeddings {model}, execute_tool {tool}, invoke_agent {agent}, retrieval {data_source}. CHAIN spans keep the function name, and an explicit name still wins. | Update saved searches, alerts, and dashboards keyed on span name, or pass an explicit name. |
RETRIEVER spans carry gen_ai.operation.name="retrieval" and accept data_source_id= (dataSourceId in TypeScript). | Update filters on the old operation name. |
model_parameters (modelParameters) maps 43 aliases onto 15 standard gen_ai.request.* keys. Other keys go under rius.request.*. | Filter on the standard keys, or on rius.request.<key> for the rest. |
TypeScript: the @arizeai/openinference-instrumentation-anthropic peer needs ^0.2.7. | Upgrade that peer dependency. |
Request parameters that moved
A parameter the GenAI conventions do not define no longer lands under
gen_ai.request.*. The most common one is response_format:
| 0.x | 1.0 |
|---|---|
gen_ai.request.response_format | rius.request.response_format, as compact JSON |
gen_ai.request.tool_choice | rius.request.tool_choice |
gen_ai.request.max_completion_tokens | gen_ai.request.max_tokens |
gen_ai.request.stop | gen_ai.request.stop_sequences |
See Request parameters for the full mapping rules.
Behaviour changes
- Tool names. Python
TOOLspans taketool_name=, and the TypeScript span helpers taketoolName, so the tool name no longer comes from the span name. In Python the old form still works but emits aDeprecationWarning. - Attribute limit. A span can carry up to 4096 attributes, up from 128,
so long agent spans keep their model, tools, usage, and system prompt. An
OTEL_*attribute-count limit you set yourself still wins. See Span attribute limit. - Content capture. With content capture off, the OpenInference
request-parameter bag (
llm.invocation_parameters) is treated as content and is not sent. Embedding vectors are no longer exported by the Python SDK. - OpenInference spans are normalized to the GenAI conventions inside the
SDK, so query the canonical keys, for example
gen_ai.usage.input_tokensrather thanllm.token_count.prompt.
Other OpenTelemetry SDKs in the same process
When Langfuse, Traceloop, Logfire, MLflow, OpenLIT, or Laminar owns the global tracer provider, Rius can bridge it, so that their spans, often the parents of your LLM calls, reach Rius too. The bridge is off by default. Turn it on with:
export RIUS_BRIDGE_FOREIGN_PROVIDER=1or in code with bridge_foreign_provider=True (Python) or
bridgeForeignProvider: true (TypeScript). Spans whose parent Rius never saw
are flagged rius.parent.foreign either way.
With content capture off, the content keys those SDKs write are stripped
too: Langfuse, Traceloop, Logfire, MLflow, and OpenLIT in Python, and
Laminar’s lmnr.* keys in both SDKs.
Also new in 1.0
- Context-size attribution on LLM spans, which feeds the context usage view.
record_exception,agent_nameandagent_id, theRIUS_MAIN_AGENT_*environment variables, a first-token event, the response id, andservice.version.
The full list is in each SDK’s changelog on GitHub: Python and TypeScript .
Next steps
- Troubleshooting: queries or alerts that stopped matching after the upgrade.
- Span names and identity: the naming rules in full.
- Installation and configuration: the
RIUS_*configuration reference.