
opik
Reference for the Opik SDK — tracing, span types, framework integrations, threads, and the prompt library (Python, TypeScript, REST). Use for "what span types exist", "how do I flush", "trackopenai", "add OpikTracer", "version a prompt". To instrument a repo end to end, use the opik-instrument skill.
- Installs
- 532
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/comet-ml/opik-skills --skill opik- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads opik automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Opik SDK Reference
Opik is an open-source LLM observability platform. This skill is a reference
for the SDK. To instrument a codebase step by step (detect frameworks, add
config, emit and verify a trace), use the task-shaped opik-instrument skill.
Core concepts
A trace is one execution path (one request → one response). Spans are the operations inside it and form a hierarchy.
Span types — the ONLY valid values
| Type | Use for |
|---|---|
general | orchestration, agent entry points |
llm | model calls |
tool | tools, retrieval, API / DB calls |
guardrail | safety / validation checks |
Do NOT use retrieval or any other value.
Python — tracing
import opik
@opik.track(name="agent", type="general")
def agent(query: str) -> str:
return generate(retrieve(query))
@opik.track(type="tool")
def retrieve(query): ...
@opik.track(type="llm")
def generate(ctx): ...
opik.flush_tracker() # required in scripts
TypeScript — tracing
import { Opik } from "opik";
const client = new Opik({ projectName: "my-project" });
const trace = client.trace({ name: "agent", input: { query } });
const span = trace.span({ name: "llm-call", type: "llm" });
span.end({ output });
trace.end({ output });
await client.flush();
Framework integrations
Prefer an integration over manual @opik.track — integrations capture tokens,
model, and cost automatically. Patterns (full list in
references/integrations.md):
- wrap-the-client —
track_openai(OpenAI()),track_anthropic(...) - global-enable —
track_crewai(crew=crew) - callback —
dspy.configure(callbacks=[OpikCallback()]) - tracer —
OpikTracer()for LangChain / LangGraph / LlamaIndex - agent-specific —
track_adk_agent_recursive(agent, OpikTracer())
LiteLLM inside @opik.track (common trap)
If code uses litellm and you add @opik.track, pass current_span_data
via metadata on every completion call — otherwise OpikLogger emits orphaned
top-level traces instead of nesting under your span.
from opik.opik_context import get_current_span_data
@opik.track
def call_llm(messages):
return litellm.completion(
model="gpt-4o", messages=messages,
metadata={"opik": {"current_span_data": get_current_span_data()}},
)
Threads (conversations)
Group turns with thread_id — one turn = one trace, shared thread_id = one
thread. Use for chat / multi-turn; skip for single-shot.
@opik.track(entrypoint=True)
def handle(session_id: str, message: str) -> str:
opik.update_current_trace(thread_id=session_id)
return reply(message)
Prompt library
Version prompts with client.get_prompt / create_prompt (chat variants:
get_chat_prompt / create_chat_prompt). Store model + temperature in the
prompt metadata so they version with the text. Call get_prompt inside a
@opik.track function so the version links to the trace.
@opik.track(entrypoint=True)
def run(question: str) -> str:
p = client.get_prompt(name="system") or client.create_prompt(
name="system",
prompt="You help with {{product}}.",
metadata={"model": "gpt-4o", "temperature": 0.7},
)
return llm(p.format(product="Opik"), model=p.metadata["model"])
How a project is doing
With the MCP connected, start at the project, not at its traces:
read("project", "<project name or id>")
One call returns the last 7 days against the 7 before — trace count, error
rate, average duration, total cost, SDK traffic only, which is what the Logs
page's four cards show — plus the score names and usage keys the project
actually records, and the freshest experiment, dataset, prompt version and
optimization run in it. since/until pick another window; since="30d" is
what the UI opens on. A rate or an average over a window with no traces comes
back null rather than 0, because a rate over no samples is undefined and
"0% errors" is advice someone may act on.
Then attribute the change rather than restating it:
list("project_metric", project_name="<project>", metric_type="trace_cost")
list("project_metric", project_name="<project>", metric_type="span_count",
breakdown="model", since="30d")
Rows are time buckets, not records — interval is hourly/daily/weekly/
total, and page/size/sort do not apply. schema("list.project_metric")
is the metric list, what each is about, and which groupings each accepts; seven
of them accept none. The score names the overview returned are the ones worth
filtering on, and list("score_name", project_name=…) has the rest.
Searching traces
One filter grammar, OQL, serves both the hosted MCP's list tool and the
SDK's search_traces / search_spans / search_threads:
<field>[.<key>] <op> <value> [AND ...]
ops: = != > >= < <= contains not_contains starts_with ends_with is_empty is_not_empty in not_in
Strings in double quotes, numbers bare, duration in milliseconds, dates as
ISO-8601 instants with a timezone ("2026-09-08T10:00:00Z"). Scores and
dictionaries take a key: feedback_scores.accuracy < 0.5,
metadata.environment = "prod". AND is the only connector.
error_info is_not_empty AND duration > 5000
type = "llm" AND usage.total_tokens > 10000 # spans
feedback_scores.hallucination > 0.5 AND start_time >= "2026-09-08T00:00:00Z"
With the MCP connected, prefer list — it also sorts (sort="duration desc"),
windows (since="1h", "7d"), and searches free text (search="order-42"):
list(entity_type="trace", project_name="<project>", since="1h",
filters="error_info is_not_empty", sort="duration desc")
Trace, span and thread lists add source = "sdk" unless you name source, so
evaluator, playground and experiment traces stay out of the way. A rejected
filter comes back with what fixes it; schema("list.trace") (or list.span,
list.thread, list.experiment) is the full field and operator reference.
Without the MCP, the same string goes to the SDK:
client.search_traces(project_name="<project>", filter_string="error_info is_not_empty")
Anti-patterns
| Anti-pattern | Fix |
|---|---|
span type retrieval / custom | use tool (or general) |
get_prompt outside @opik.track | fetch inside — else no trace link |
deprecated opik.Prompt / opik.Config | use client.get_prompt / config file |
litellm without current_span_data | pass it — else orphaned traces |
| no flush in scripts | opik.flush_tracker() / await client.flush() |
References
| Topic | File |
|---|---|
| Python SDK (async, distributed, context) | references/tracing-python.md |
| TypeScript SDK | references/tracing-typescript.md |
| REST API | references/tracing-rest-api.md |
| All integrations | references/integrations.md |
| Core concepts (traces, spans, threads) | references/observability.md |
| Best practices (lifecycle, monitoring, anti-patterns) | references/best-practices.md |
| Agent architecture, reliability, security | references/agent-patterns.md |
| Production monitoring, alerts, guardrails | references/production.md |
| Evaluation datasets & test suites (reference) | references/evaluation-datasets.md, references/evaluation-test-suites.md |
To build and run an evaluation, use the opik-evaluate skill. For repo instrumentation and config, use the opik-instrument skill.
FAQ
What does the opik skill do?
Reference for the Opik SDK — tracing, span types, framework integrations, threads, and the prompt library (Python, TypeScript, REST). Use for "what span types exist", "how do I flush", "trackopenai", "add OpikTracer", "version a prompt". To instrument a repo end to end, use the opik-instrument skill.
How do I install opik?
Run npx skills add https://github.com/comet-ml/opik-skills --skill opik in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/opik/ (personal) or .claude/skills/opik/ (project).
Which AI agents can use opik?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is opik safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains opik?
It is published by comet-ml in comet-ml/opik-skills. It has 532 recorded installs.
More from comet-ml/opik-skills
opik-test
comet-ml/opik-skills
Open the skill to read its SKILL.md instructions.
Popular ai & agents skills
google-agents-cli-publish
google/agents-cli
This skill should be used when the user wants to "publish an agent", "publish my ADK agent", "register an agent with Gemini", "publish to Gemini" (formerly Gemini Enterprise), or needs guidance on the agents-cli publish gemini command. Also use when the user wants to "manage agents in Agent Registry", "list/update/delete registered agents", or "register an MCP server". Covers ADK vs A2A registration modes, programmatic and interactive usage, flag reference, auto-detection from deployment metadata, Agent Registry fleet management, and troubleshooting. Part of the agents-cli skills suite. Do NOT use for deployment (use google-agents-cli-deploy).
google-agents-cli-eval
google/agents-cli
This skill should be used when the user wants to "run an evaluation", "evaluate my agent", "evaluate my ADK agent", "write an eval dataset", "analyze eval failures", "compare eval results", "optimize agent", or needs guidance on the Gemini platform eval methodology and the Quality Flywheel. Covers eval metrics, dataset schema, LLM-as-judge scoring, and common failure causes. Applies to any agents-cli project, whatever framework the agent is written in. Do NOT use for agent API code patterns (ADK: use google-agents-cli-adk-code), deployment (use google-agents-cli-deploy), or project scaffolding (use google-agents-cli-scaffold).
skill-creator
anthropics/skills
Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
codex-pet
prime-skills/runcomfy-agent-skills
Codex Pet generator on RunComfy. Build a Codex-compatible Codex Pet spritesheet.webp + pet.json from a single reference image, drop it into ${CODEXHOME:-$HOME/.codex}/pets/ / and Codex picks it up as a custom Codex Pet next to the 8 built-ins. This skill produces the exact Codex Pet atlas Codex expects (1536x1872 PNG/WebP, 8 cols x 9 rows, 192x208 cells, 9 animation states — idle, running-right, running-left, waving, jumping, failed, waiting, running, review). Calls OpenAI GPT Image 2 edit ONCE via the local RunComfy CLI as runcomfy run openai/gpt-image-2/edit to produce a canonical Codex Pet pose, then assembles all 9 animation rows programmatically with ImageMagick micro-transforms — no Codex Pro, no $imagegen, no OPENAIAPIKEY required, only RUNCOMFYTOKEN. Triggers on "codex pet", "create codex pet", "make codex pet", "hatch codex pet", "/hatch image", "desktop pet codex", "codex pets", "spritesheet.webp", or any explicit ask to build a custom pet for OpenAI Codex.
full-output-enforcement
leonxlnx/taste-skill
Overrides default LLM truncation behavior. Enforces complete code generation, bans placeholder patterns, and handles token-limit splits cleanly. Apply to any task requiring exhaustive, unabridged output.
executing-plans
obra/superpowers
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available