Skip to main content

telemetry-dev-openrouter

OpenRouter SDK instrumentation for telemetry.dev. It wraps the official openrouter Python SDK and emits telemetry.dev generation and embedding spans through telemetry-dev.

Install

pip install telemetry-dev-openrouter

Initialize the core SDK first:

import telemetry_dev

telemetry_dev.init(
    api_key="td_live_...",
    service_name="my-service",
)

Per-client wrapping

from openrouter import OpenRouter
from telemetry_dev_openrouter import wrap_open_router

client = wrap_open_router(OpenRouter(api_key="sk-or-v1-..."))

client.chat.send(
    model="openai/gpt-4o-mini",
    messages=[{"role": "user", "content": "Tell me a joke about OpenTelemetry"}],
)

Use this when you want explicit control over which clients are instrumented. The same wrapped client supports synchronous methods and their *_async counterparts.

Global instrumentation

from openrouter import OpenRouter
from telemetry_dev_openrouter import instrument_openrouter, uninstrument_openrouter

instrument_openrouter()
client = OpenRouter(api_key="sk-or-v1-...")

try:
    client.responses.send(model="openai/gpt-4o-mini", input="Explain OpenTelemetry briefly")
finally:
    uninstrument_openrouter()

Use this as the app-wide one-liner at startup when all OpenRouter clients should be instrumented. Repeated wrapping or global instrumentation is safe, and uninstrument_openrouter() restores the original SDK methods.

Instrumented surfaces

Synchronous and asynchronous variants are covered:

  • client.chat.send(...) and client.chat.send_async(...)
  • client.responses.send(...) and client.responses.send_async(...)
  • client.embeddings.generate(...) and client.embeddings.generate_async(...)

All spans use gen_ai.provider.name = "openrouter". Generation spans capture the request model and input, supported sampling parameters, response model and ID, finish reasons, output messages, and token usage. Embedding spans capture the request input, request and response models, and token usage; embedding vectors are intentionally not captured as output.

When OpenRouter returns cost information, the integration records gen_ai.usage.cost from usage.cost. If that field is absent, it falls back to usage.cost_details.upstream_inference_cost. The cost attribute is omitted when neither value is available.

Streaming

Chat and Responses API streams are traced for sync and async callers. The integration accumulates captured output, records time to first chunk, and maps terminal usage and cost when OpenRouter provides them. Terminal Responses API events close the span, including completed, failed, incomplete, and error events.

Responses stream output can include reconstructed output items followed by bounded {"type": "telemetry.dev.response_stream_event", "event_type": ..., "payload": ...} entries for consumed image-generation lifecycle and partial-image events, apply-patch diff events, fusion lifecycle, analysis, and panel events, web-search lifecycle events, and debug timing events. OpenRouter debug upstream request-body echoes are not retained. These provider-event entries share the stream capture budget and set telemetry.dev.capture.truncated = true when only a prefix can be retained.

Requests are passed to OpenRouter unchanged. The integration does not add or modify stream_options, so streaming usage and cost are available only when they are present in the stream returned by OpenRouter.

Failure behavior

Instrumentation is fail-open when telemetry_dev.init() has not been called: OpenRouter requests still execute and return their normal SDK values without exporting telemetry.

Limitations

  • Unconsumed streams end their spans only when the stream is exhausted, errors, or is closed.
  • Streaming output is retained only up to the core SDK capture budget; terminal metadata and usage can still be recorded after the budget is reached. A span with partial captured output includes telemetry.dev.capture.truncated = true.
  • Only the SDK methods listed above are instrumented in this version.

Development

From sdks/python-openrouter:

uv sync
uv run ruff format .
uv run pytest
uv run ruff format --check .
uv run ruff check .
uv run pyright

Metadata

Release files for telemetry-dev-openrouter 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for telemetry-dev-openrouter 0.1.3
File Size Uploaded
telemetry_dev_openrouter-0.1.3.tar.gz 13.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for telemetry-dev-openrouter 0.1.3
File Interpreter ABI Platform
telemetry_dev_openrouter-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 27.6 kB

Release files / telemetry_dev_openrouter-0.1.3.tar.gz

Download URL telemetry_dev_openrouter-0.1.3.tar.gz
Size 13.4 kB
Tags Source
SHA-256 checksum
How to use checksums
4af458b6f8b2e4a990eb639c0d8612076db82c8621826233e46e453e0a25ef6e
BLAKE2b-256 checksum
How to use checksums
9dc10050b8328a3fff00a6f268ee3515419065fdd0dbb7806a7be2e492117906
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / telemetry_dev_openrouter-0.1.3-py3-none-any.whl

Download URL telemetry_dev_openrouter-0.1.3-py3-none-any.whl
Size 14.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
64a60427e1284252e5b851b9827423baeb82def75941941a2b9dad62dfbdeaf4
BLAKE2b-256 checksum
How to use checksums
5bdf15756af98e848fc63d4a331398eb102ed215e7f3b029bac5a2dd2ccdb8e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page