5a558eb09e
TypeScript SDK Compatibility V1.x E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / TypeScript SDK Compatibility V1.x E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
TypeScript SDK E2E Tests / TypeScript SDK E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
Python SDK E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK E2E Tests / Python SDK E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK E2E Tests / build-opik (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Python SDK Compatibility V1.x E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK E2E Tests / build-opik (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer E2E Tests Python ${{matrix.python_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer Integration Smoke Tests (push) Has been cancelled
🐙 Code Quality / detect (push) Has been cancelled
🐙 Code Quality / lint (${{ matrix.leg.name }}) (push) Has been cancelled
🐙 Code Quality / summary (push) Has been cancelled
TypeScript SDK Library Integration Tests / Check Secrets (push) Has been cancelled
TypeScript SDK Library Integration Tests / opik-vercel (Vercel AI SDK / eve) (push) Has been cancelled
SDK Library Integration Tests Runner / Check Secrets (push) Has been cancelled
SDK Library Integration Tests Runner / Missed OpenAI API Key Warning (push) Has been cancelled
SDK Library Integration Tests Runner / Build (push) Has been cancelled
SDK Library Integration Tests Runner / openai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_legacy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / llama_index_tests (push) Has been cancelled
SDK Library Integration Tests Runner / anthropic_tests (push) Has been cancelled
SDK Library Integration Tests Runner / mistral_tests (push) Has been cancelled
SDK Library Integration Tests Runner / groq_tests (push) Has been cancelled
SDK Library Integration Tests Runner / aisuite_tests (push) Has been cancelled
SDK Library Integration Tests Runner / haystack_tests (push) Has been cancelled
SDK Library Integration Tests Runner / dspy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v1_tests (push) Has been cancelled
SDK Library Integration Tests Runner / genai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_legacy_1_3_0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / evaluation_metrics_tests (push) Has been cancelled
SDK Library Integration Tests Runner / bedrock_tests (push) Has been cancelled
SDK Library Integration Tests Runner / litellm_tests (push) Has been cancelled
SDK Library Integration Tests Runner / harbor_tests (push) Has been cancelled
SDK Library Integration Tests Runner / Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / render-equality (push) Has been cancelled
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Has been cancelled
Python BE E2E Tests / Python BE E2E (push) Has been cancelled
Python Backend Tests / run-python-backend-tests (push) Has been cancelled
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
SDK E2E Libraries Integration Tests / Check Secrets (push) Has been cancelled
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Has been cancelled
SDK E2E Libraries Integration Tests / build-opik (push) Has been cancelled
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Has been cancelled
TypeScript SDK Build & Publish / build-and-publish (push) Has been cancelled
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Has been cancelled
Backend Tests / discover-tests (push) Has been cancelled
Backend Tests / ${{ matrix.name }} (push) Has been cancelled
Build and Publish SDK / build-and-publish (push) Has been cancelled
Build Opik Docker Images / set-version (push) Has been cancelled
Build Opik Docker Images / build-backend (push) Has been cancelled
Build Opik Docker Images / build-sandbox-executor-python (push) Has been cancelled
Build Opik Docker Images / build-python-backend (push) Has been cancelled
Build Opik Docker Images / build-frontend (push) Has been cancelled
Build Opik Docker Images / create-git-tag (push) Has been cancelled
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Has been cancelled
Docs - Publish / run (push) Has been cancelled
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Has been cancelled
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Has been cancelled
Frontend Unit Tests / Test on Node 20 (push) Has been cancelled
Guardrails E2E Tests / Select Python version matrix (push) Has been cancelled
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Guardrails E2E Tests / 📢 Slack Notification (push) Has been cancelled
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Has been cancelled
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Has been cancelled
Lint Opik Helm Chart / unittest-helm-chart (push) Has been cancelled
164 lines
5.6 KiB
Plaintext
164 lines
5.6 KiB
Plaintext
---
|
|
description: Start here to integrate Opik into your Instructor-based genai application
|
|
for structured output tracking, schema validation monitoring, and LLM call observability.
|
|
headline: Instructor | Opik Documentation
|
|
og:description: Learn to integrate Opik with Instructor to log all calls as traces,
|
|
enhancing your structured output management in LLMs.
|
|
og:site_name: Opik Documentation
|
|
og:title: Integrate Instructor with Opik for Enhanced Tracing
|
|
title: Structured Output Tracking for Instructor with Opik
|
|
---
|
|
|
|
[Instructor](https://github.com/instructor-ai/instructor) is a Python library for working with structured outputs
|
|
for LLMs built on top of Pydantic. It provides a simple way to manage schema validations, retries and streaming responses.
|
|
|
|
In this guide, we will showcase how to integrate Opik with Instructor so that all the Instructor calls are logged as traces in Opik.
|
|
|
|
## Account Setup
|
|
|
|
[Comet](https://www.comet.com/site?from=llm&utm_source=opik&utm_medium=colab&utm_content=instructor&utm_campaign=opik) provides a hosted version of the Opik platform, [simply create an account](https://www.comet.com/signup?from=llm&utm_source=opik&utm_medium=colab&utm_content=instructor&utm_campaign=opik) and grab your API Key.
|
|
|
|
> You can also run the Opik platform locally, see the [installation guide](https://www.comet.com/docs/opik/self-host/overview/?from=llm&utm_source=opik&utm_medium=colab&utm_content=instructor&utm_campaign=opik) for more information.
|
|
|
|
## Getting Started
|
|
|
|
### Installation
|
|
|
|
First, ensure you have both `opik` and `instructor` installed:
|
|
|
|
```bash
|
|
pip install opik instructor
|
|
```
|
|
|
|
### Configuring Opik
|
|
|
|
Configure the Opik Python SDK for your deployment type. See the [Python SDK Configuration guide](/tracing/advanced/sdk_configuration) for detailed instructions on:
|
|
|
|
- **CLI configuration**: `opik configure`
|
|
- **Code configuration**: `opik.configure()`
|
|
- **Self-hosted vs Cloud vs Enterprise** setup
|
|
- **Configuration files** and environment variables
|
|
|
|
### Configuring Instructor
|
|
|
|
In order to use Instructor, you will need to configure your LLM provider API keys. For this example, we'll use OpenAI, Anthropic, and Gemini. You can [find or create your API keys in these pages](https://platform.openai.com/settings/organization/api-keys):
|
|
|
|
You can set them as environment variables:
|
|
|
|
```bash
|
|
export OPENAI_API_KEY="YOUR_API_KEY"
|
|
export ANTHROPIC_API_KEY="YOUR_API_KEY"
|
|
export GOOGLE_API_KEY="YOUR_API_KEY"
|
|
```
|
|
|
|
Or set them programmatically:
|
|
|
|
```python
|
|
import os
|
|
import getpass
|
|
|
|
if "OPENAI_API_KEY" not in os.environ:
|
|
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API key: ")
|
|
|
|
if "ANTHROPIC_API_KEY" not in os.environ:
|
|
os.environ["ANTHROPIC_API_KEY"] = getpass.getpass("Enter your Anthropic API key: ")
|
|
|
|
if "GOOGLE_API_KEY" not in os.environ:
|
|
os.environ["GOOGLE_API_KEY"] = getpass.getpass("Enter your Google API key: ")
|
|
```
|
|
|
|
## Using Opik with Instructor library
|
|
|
|
In order to log traces from Instructor into Opik, we are going to patch the `instructor` library. This will log each LLM call to the Opik platform.
|
|
|
|
For all the integrations, we will first add tracking to the LLM client and then pass it to the Instructor library:
|
|
|
|
```python
|
|
from opik.integrations.openai import track_openai
|
|
import instructor
|
|
from pydantic import BaseModel
|
|
from openai import OpenAI
|
|
|
|
# We will first create the OpenAI client and add the `track_openai`
|
|
# method to log data to Opik
|
|
openai_client = track_openai(OpenAI())
|
|
|
|
# Patch the OpenAI client for Instructor
|
|
client = instructor.from_openai(openai_client)
|
|
|
|
# Define your desired output structure
|
|
class UserInfo(BaseModel):
|
|
name: str
|
|
age: int
|
|
|
|
user_info = client.chat.completions.create(
|
|
model="gpt-4o-mini",
|
|
response_model=UserInfo,
|
|
messages=[{"role": "user", "content": "John Doe is 30 years old."}],
|
|
)
|
|
|
|
print(user_info)
|
|
```
|
|
|
|
Thanks to the `track_openai` method, all the calls made to OpenAI will be logged to the Opik platform. This approach also works well if you are also using the `opik.track` decorator as it will automatically log the LLM call made with Instructor to the relevant trace.
|
|
|
|
<Frame>
|
|
<img src="/img/cookbook/instructor_cookbook.png" />
|
|
</Frame>
|
|
|
|
## Integrating with other LLM providers
|
|
|
|
The instructor library supports many LLM providers beyond OpenAI, including: Anthropic, AWS Bedrock, Gemini, etc. Opik supports the majority of these providers as well.
|
|
|
|
Here are the code snippets needed for the integration with different providers:
|
|
|
|
### Anthropic
|
|
|
|
```python
|
|
from opik.integrations.anthropic import track_anthropic
|
|
import instructor
|
|
from anthropic import Anthropic
|
|
|
|
# Add Opik tracking
|
|
anthropic_client = track_anthropic(Anthropic())
|
|
|
|
# Patch the Anthropic client for Instructor
|
|
client = instructor.from_anthropic(
|
|
anthropic_client, mode=instructor.Mode.ANTHROPIC_JSON
|
|
)
|
|
|
|
user_info = client.chat.completions.create(
|
|
model="claude-3-5-sonnet-20241022",
|
|
response_model=UserInfo,
|
|
messages=[{"role": "user", "content": "John Doe is 30 years old."}],
|
|
max_tokens=1000,
|
|
)
|
|
|
|
print(user_info)
|
|
```
|
|
|
|
### Gemini
|
|
|
|
```python
|
|
from opik.integrations.genai import track_genai
|
|
import instructor
|
|
from google import genai
|
|
|
|
# Add Opik tracking
|
|
gemini_client = track_genai(genai.Client())
|
|
|
|
# Patch the GenAI client for Instructor
|
|
client = instructor.from_genai(
|
|
gemini_client, mode=instructor.Mode.GENAI_STRUCTURED_OUTPUTS
|
|
)
|
|
|
|
user_info = client.chat.completions.create(
|
|
model="gemini-2.0-flash-001",
|
|
response_model=UserInfo,
|
|
messages=[{"role": "user", "content": "John Doe is 30 years old."}],
|
|
)
|
|
|
|
print(user_info)
|
|
```
|
|
|
|
You can read more about how to use the Instructor library in [their documentation](https://python.useinstructor.com/). |