Frametail
Observability

OpenTelemetry Gen AI semantics

How Frametail maps gen_ai.* span attributes for LLM, image, and video generation.

Frametail aligns exported spans with the OpenTelemetry Gen AI semantic conventions. Provider wrappers and the optional frametail/otel entrypoint populate dotted keys such as gen_ai.provider.name, gen_ai.operation.name, gen_ai.request.model, gen_ai.input.messages, and gen_ai.output.messages.

Operations

gen_ai.operation.nameTypical Frametail span typeUse case
chatllmOpenRouter chat, Vercel AI SDK generateText / streamText (via OTEL telemetry)
generate_contentcompose or video.generateImage/video generation (Fal, AI SDK wrappers)
execute_tooltoolQueue submit, model listing, video poll helpers

Multimodal messages

Text prompts and media outputs are encoded as JSON arrays on:

  • gen_ai.input.messages — usually a user message with a text part
  • gen_ai.output.messagesassistant messages with uri parts (modality: image or video)

Example output message part:

{ "type": "uri", "uri": "https://cdn.example/out.mp4", "modality": "video" }

The dashboard projects these fields into filter columns (prompt, video URL, image URL, model) from gen_ai.* message attributes (with structured span payloads as fallback).

Vercel AI SDK (experimental telemetry)

When you use the AI SDK’s built-in OpenTelemetry integration, register Frametail as the trace sink:

import { generateObject } from 'ai'
import { FrametailHttpExporter } from 'frametail'
import { registerFrametailOtel } from 'frametail/otel'

const { tracer } = registerFrametailOtel({
  exporter: new FrametailHttpExporter({
    apiKey: process.env.FRAMETAIL_API_KEY!,
    projectKey: process.env.FRAMETAIL_PROJECT_KEY!,
  }),
})

await generateObject({
  model: yourModel,
  schema: yourSchema,
  prompt: 'Score this frame',
  experimental_telemetry: { isEnabled: true, tracer },
})

Install optional peers: @opentelemetry/api and @opentelemetry/sdk-trace-base.