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.name | Typical Frametail span type | Use case |
|---|---|---|
chat | llm | OpenRouter chat, Vercel AI SDK generateText / streamText (via OTEL telemetry) |
generate_content | compose or video.generate | Image/video generation (Fal, AI SDK wrappers) |
execute_tool | tool | Queue submit, model listing, video poll helpers |
Multimodal messages
Text prompts and media outputs are encoded as JSON arrays on:
gen_ai.input.messages— usually ausermessage with atextpartgen_ai.output.messages—assistantmessages withuriparts (modality: imageorvideo)
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.