Skip to main content

Latest updates

Stay up to date with the latest changes to the Beacon Observe SDK.

Unreleased

  • Promised async iterators stay traced through consumption · An observed async function returning an async generator or query iterator ended its span before the first item was read. Iterators with their own next() now keep the same consumption, cancellation and context behavior as directly returned iterators. Platform streams without next() remain unchanged values.
  • Anthropic instrumentModules example fixed · The documented import Anthropic from example crashed Observe.initialize(); pass the module namespace (import * as Anthropic) instead, and a clear error now says so.
  • Empty environment variables are ignored · A declared but empty ASYMPTOTE_BASE_URL made Observe.initialize() throw Invalid URL, and an empty OTEL_SERVICE_NAME exported spans with a blank service name. Empty values now fall back to the defaults.

October 2026

v0.2.0 · October 22, 2026

  • Early-cancelled streams keep the consumer’s error · Cancelling an observed stream before reading it kept the consumer’s error and exported its span only if the source’s return() rejected; a return() that throws synchronously now behaves the same.
  • Global tracers export after reinitialization · After Observe.shutdown() and Observe.initialize(), spans from trace.getTracer() were dropped because the stopped provider stayed registered globally. New global tracers now use the new provider; a host’s own tracer provider is left untouched.
  • Observed streams read through their own API keep their span · An observed function returning a stream that has its own reading API, such as the Anthropic SDK’s client.messages.stream() read with finalMessage() or events, a ReadableStream read with getReader(), or a Node stream sent through pipe(), never exported its span: the SDK replaced the stream with a wrapper that only for await went through, which also made instanceof checks on it fail. Such streams are now returned unchanged and their span ends when the function returns. Async generators and the Claude Agent SDK’s query() are still traced until they are read to the end.
  • Observe endpoints keep their query string · An endpoint with query parameters, such as a gateway URL carrying a tenant or routing parameter, had /v1/observe appended after its query, so spans went to the wrong route without any error. The path is now added to the URL’s path, and the query and fragment are kept. Observe.initialize() now throws for an endpoint that is not an absolute URL, instead of exporting to an unusable address.
  • Spans from an observed stream nest under it · Work an observed async generator does as it is read, such as tool or model calls, was recorded under whoever consumed the stream, so those spans appeared beside the stream’s span instead of inside it. They are now its children, including work in the stream’s cleanup.
  • Cancelling a query before reading it closes the query · Calling return() or throw() on a query from wrapClaudeAgentQuery before its first message left the Claude Code process the query had already started running, and its span never ended. The query is now closed as the unwrapped one would be, and its span is exported.
  • API key scoped to Beacon Cloud · ASYMPTOTE_API_KEY is now sent only to Beacon Cloud: in hosted mode, or to an explicit OTLP endpoint on the same origin as the base URL. Previously a service with both ASYMPTOTE_API_KEY and a generic OTEL_EXPORTER_OTLP_ENDPOINT sent the key to that collector on every export. Caller-supplied headers are unchanged.
  • HTTPS required for the API key · Observe.initialize() now throws when the key would be sent to a non-loopback http:// base URL. http://localhost, http://127.0.0.1 and http://[::1] remain allowed for local stubs.

June 2026

v0.1.0 · June 10, 2026

  • Initial TypeScript SDK release · Published @asymptote/sdk for instrumenting cloud-hosted agent applications with OpenTelemetry spans compatible with Beacon’s normalized event model.
  • Hosted and customer-managed export · Added hosted Beacon Observe export through ASYMPTOTE_API_KEY and customer-managed OTLP export through OTEL_EXPORTER_OTLP_ENDPOINT or Observe.initialize({ otlpEndpoint }).
  • AI SDK instrumentation · Enabled OpenAI and Anthropic OpenLLMetry instrumentation by default, with configuration hooks for disabling or tuning provider instrumentation.
  • Agent integration helpers · Added Observe.observe(), Observe.getTracer(), Observe.wrapClaudeAgentQuery(), Observe.flush(), and Observe.shutdown() for custom agent steps, Vercel AI SDK telemetry, Claude Agent SDK query wrapping, and process lifecycle handling.
  • Beacon compatibility attributes · Exported constants for Beacon-compatible fields such as beacon.origin, beacon.harness.name, beacon.event.action, and beacon.prompt.text.