Context attributes refer to span attributes that can be read from the OTEL Context. Our packages offer very convenient tools to write and read from the OTEL Context. The benefit of this approach is that OpenInference auto will attempt to pass these attributes to all other spans underneath a parent trace.
Supported Context Attributes include:
Session ID: Unique identifier for a session.
User ID: identifier for a user.
Metadata: Metadata associated with a span.
Tags: List of tags to give the span a category.
Prompt Template:
Template: Used to generate prompts as Python f-strings.
Version: The version of the prompt template.
Variables: key-value pairs applied to the prompt template.
Python
Install the core instrumentation package via
pip install openinference-instrumentation
using_session
from openinference.instrumentation import using_session
with using_session(session_id="my-session-id"):
# Calls within this block will generate spans with the attributes:
# "session.id" = "my-session-id"
...
It can also be used as a decorator:
@using_session(session_id="my-session-id")
def call_fn(*args, **kwargs):
# Calls within this function will generate spans with the attributes:
# "session.id" = "my-session-id"
...
using_user
from openinference.instrumentation import using_user
with using_user("my-user-id"):
# Calls within this block will generate spans with the attributes:
# "user.id" = "my-user-id"
...
It can also be used as a decorator:
@using_user("my-user-id")
def call_fn(*args, **kwargs):
# Calls within this function will generate spans with the attributes:
# "user.id" = "my-user-id"
...
using_metadata
from openinference.instrumentation import using_metadata
metadata = {
"key-1": value_1,
"key-2": value_2,
...
}
with using_metadata(metadata):
# Calls within this block will generate spans with the attributes:
# "metadata" = "{\"key-1\": value_1, \"key-2\": value_2, ... }" # JSON serialized
...
It can also be used as a decorator:
@using_metadata(metadata)
def call_fn(*args, **kwargs):
# Calls within this function will generate spans with the attributes:
# "metadata" = "{\"key-1\": value_1, \"key-2\": value_2, ... }" # JSON serialized
...
using_tags
from openinference.instrumentation import using_tags
tags = ["tag_1", "tag_2", ...]
with using_tags(tags):
# Calls within this block will generate spans with the attributes:
# "tag.tags" = "["tag_1","tag_2",...]"
...
It can also be used as a decorator:
@using_tags(tags)
def call_fn(*args, **kwargs):
# Calls within this function will generate spans with the attributes:
# "tag.tags" = "["tag_1","tag_2",...]"
...
using_prompt_template
Template: non-empty string.
Version: non-empty string.
Variables: a dictionary with string keys. This dictionary will be serialized to JSON when saved to the OTEL Context and remain a JSON string when sent as a span attribute.
from openinference.instrumentation import using_prompt_template
prompt_template = "Please describe the weather forecast for {city} on {date}"
prompt_template_variables = {"city": "Johannesburg", "date":"July 11"}
with using_prompt_template(
template=prompt_template,
version=prompt_template_variables,
variables="v1.0",
):
# Calls within this block will generate spans with the attributes:
# "llm.prompt_template.template" = "Please describe the weather forecast for {city} on {date}"
# "llm.prompt_template.version" = "v1.0"
# "llm.prompt_template.variables" = "{\"city\": \"Johannesburg\", \"date\": \"July 11\"}" # JSON serialized
...
It can also be used as a decorator:
@using_prompt_template(
template=prompt_template,
version=prompt_template_variables,
variables="v1.0",
)
def call_fn(*args, **kwargs):
# Calls within this function will generate spans with the attributes:
# "llm.prompt_template.template" = "Please describe the weather forecast for {city} on {date}"
# "llm.prompt_template.version" = "v1.0"
# "llm.prompt_template.variables" = "{\"city\": \"Johannesburg\", \"date\": \"July 11\"}" # JSON serialized
...
using_attributes
from openinference.instrumentation import using_attributes
tags = ["tag_1", "tag_2", ...]
metadata = {
"key-1": value_1,
"key-2": value_2,
...
}
prompt_template = "Please describe the weather forecast for {city} on {date}"
prompt_template_variables = {"city": "Johannesburg", "date":"July 11"}
prompt_template_version = "v1.0"
with using_attributes(
session_id="my-session-id",
user_id="my-user-id",
metadata=metadata,
tags=tags,
prompt_template=prompt_template,
prompt_template_version=prompt_template_version,
prompt_template_variables=prompt_template_variables,
):
# Calls within this block will generate spans with the attributes:
# "session.id" = "my-session-id"
# "user.id" = "my-user-id"
# "metadata" = "{\"key-1\": value_1, \"key-2\": value_2, ... }" # JSON serialized
# "tag.tags" = "["tag_1","tag_2",...]"
# "llm.prompt_template.template" = "Please describe the weather forecast for {city} on {date}"
# "llm.prompt_template.variables" = "{\"city\": \"Johannesburg\", \"date\": \"July 11\"}" # JSON serialized
# "llm.prompt_template.version " = "v1.0"
...
The previous example is equivalent to doing the following, making using_attributes a very convenient tool for the more complex settings.
with (
using_session("my-session-id"),
using_user("my-user-id"),
using_metadata(metadata),
using_tags(tags),
using_prompt_template(
template=prompt_template,
version=prompt_template_version,
variables=prompt_template_variables,
),
):
# Calls within this block will generate spans with the attributes:
# "session.id" = "my-session-id"
# "user.id" = "my-user-id"
# "metadata" = "{\"key-1\": value_1, \"key-2\": value_2, ... }" # JSON serialized
# "tag.tags" = "["tag_1","tag_2",...]"
# "llm.prompt_template.template" = "Please describe the weather forecast for {city} on {date}"
# "llm.prompt_template.variables" = "{\"city\": \"Johannesburg\", \"date\": \"July 11\"}" # JSON serialized
# "llm.prompt_template.version " = "v1.0"
...
It can also be used as a decorator:
@using_attributes(
session_id="my-session-id",
user_id="my-user-id",
metadata=metadata,
tags=tags,
prompt_template=prompt_template,
prompt_template_version=prompt_template_version,
prompt_template_variables=prompt_template_variables,
)
def call_fn(*args, **kwargs):
# Calls within this function will generate spans with the attributes:
# "session.id" = "my-session-id"
# "user.id" = "my-user-id"
# "metadata" = "{\"key-1\": value_1, \"key-2\": value_2, ... }" # JSON serialized
# "tag.tags" = "["tag_1","tag_2",...]"
# "llm.prompt_template.template" = "Please describe the weather forecast for {city} on {date}"
# "llm.prompt_template.variables" = "{\"city\": \"Johannesburg\", \"date\": \"July 11\"}" # JSON serialized
# "llm.prompt_template.version " = "v1.0"
...
JavaScript (Coming Soon)
Context manager to add session ID to the current OpenTelemetry Context. OpenInference auto will read this Context and pass the session ID as a span attribute, following the OpenInference . Its input, the session ID, must be a non-empty string.
Context manager to add user ID to the current OpenTelemetry Context. OpenInference auto will read this Context and pass the user ID as a span attribute, following the OpenInference . Its input, the user ID, must be a non-empty string.
Context manager to add metadata to the current OpenTelemetry Context. OpenInference auto will read this Context and pass the metadata as a span attribute, following the OpenInference . Its input, the metadata, must be a dictionary with string keys. This dictionary will be serialized to JSON when saved to the OTEL Context and remain a JSON string when sent as a span attribute.
Context manager to add tags to the current OpenTelemetry Context. OpenInference auto will read this Context and pass the tags as a span attribute, following the OpenInference . ts input, the tag list, must be a list of strings.
Context manager to add a prompt template (including its version and variables) to the current OpenTelemetry Context. OpenInference auto will read this Context and pass the prompt template fields as span attributes, following the OpenInference . Its inputs must be of the following type:
Context manager to add attributes to the current OpenTelemetry Context. OpenInference auto will read this Context and pass the attributes fields as span attributes, following the OpenInference . This is a convenient context manager to use if you find yourself using many of the previous ones in conjunction.