Agent optimization with Opik
Project description
Opik Agent Optimizer
The Opik Agent Optimizer refines your prompts to achieve better performance from your Large Language Models (LLMs). It supports a variety of optimization algorithms, all with a standardized API for consistent usage and chaining:
- EvolutionaryOptimizer - Uses genetic algorithms for prompt evolution
- FewShotBayesianOptimizer - Uses few-shot learning with Bayesian optimization
- MetaPromptOptimizer - Employs meta-prompting techniques for optimization
- MiproOptimizer - Implements MIPRO (Multi-Input Prompt Optimization) algorithm
- GepaOptimizer - Leverages GEPA (Genetic-Pareto) optimization approach
- ParameterOptimizer - Optimizes LLM call parameters (temperature, top_p, etc.) using Bayesian optimization
🎯 Key Features
- Standardized API: All optimizers follow the same interface for
optimize_prompt()andoptimize_mcp()methods - Optimizer Chaining: Results from one optimizer can be used as input for another
- MCP Support: Built-in support for Model Context Protocol tool calling
- Consistent Results: All optimizers return standardized
OptimizationResultobjects - Counter Tracking: Built-in LLM and tool call counters for monitoring usage
- Type Safety: Full type hints and validation for robust development
- Backward Compatibility: All original parameters preserved through kwargs extraction
- Deprecation Warnings: Clear warnings for deprecated parameters with migration guidance
Opik Optimizer is a component of the Opik platform, an open-source LLM evaluation platform by Comet. For more information about the broader Opik ecosystem, visit our Website or Documentation.
Quickstart
Explore Opik Optimizer's capabilities with our interactive notebook:
Setup
To get started with Opik Optimizer, follow these steps:
-
Install the package:
# using pip pip install opik-optimizer # using uv (faster) uv pip install opik-optimizer
-
Configure Opik (Optional, for advanced features):
If you plan to log optimization experiments to Comet or use Opik Datasets, you'll need to configure the Opik client:
# Install the main Opik CLI (if not already installed) pip install opik # Configure your Comet API key and workspace opik configure # When prompted, enter your Opik API key and workspace details.
Using Opik with Comet allows you to track your optimization runs, compare results, and manage datasets seamlessly.
-
Set up LLM Provider API Keys:
Ensure your environment variables are set for the LLM(s) you intend to use. For example, for OpenAI models:
export OPENAI_API_KEY="your_openai_api_key"
The optimizer utilizes LiteLLM, so you can configure keys for various providers as per LiteLLM's documentation.
You'll typically need:
- An LLM model name (e.g., "gpt-4o-mini", "claude-3-haiku-20240307").
- An Opik Dataset (or a compatible local dataset/data generator).
- An Opik Metric (or a custom evaluation function).
- A starting prompt (template string).
Standardized API
All optimizers follow the same interface, making it easy to switch between algorithms or chain them together:
# All optimizers have the same signature
def optimize_prompt(
self,
prompt: ChatPrompt,
dataset: Dataset,
metric: Callable,
experiment_config: dict | None = None,
n_samples: int | None = None,
auto_continue: bool = False,
agent_class: type[OptimizableAgent] | None = None,
**kwargs: Any,
) -> OptimizationResult
# All optimizers return the same result type
result = optimizer.optimize_prompt(
prompt=prompt,
dataset=dataset,
metric=metric,
n_samples=100
)
# Results can be chained
chained_result = another_optimizer.optimize_prompt(
prompt=ChatPrompt.from_result(result), # Use previous result
dataset=dataset,
metric=metric
)
Example
Here's a brief example of how to use the FewShotBayesianOptimizer. We'll use a sample dataset provided by Opik.
Available sample datasets for testing include "tiny-test", "halu-eval-300", and the
full HotpotQA splits via hotpot(split="train", count=300).
from opik.evaluation.metrics import LevenshteinRatio
from opik_optimizer import FewShotBayesianOptimizer, ChatPrompt
from opik_optimizer.datasets import hotpot
# Load a sample dataset
hot_pot_dataset = hotpot(count=300)
project_name = "optimize-few-shot-bayesian-hotpot" # For Comet logging
# Define the instruction for your chat prompt.
# Input parameters from dataset examples will be interpolated into the full prompt.
prompt = ChatPrompt(
project_name=project_name,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "{question}"}
]
)
optimizer = FewShotBayesianOptimizer(
model="gpt-4o-mini", # LiteLLM name to use for generation and optimization
min_examples=3, # Min few-shot examples
max_examples=8, # Max few-shot examples
n_threads=16, # Parallel threads for evaluation
seed=42,
)
def levenshtein_ratio(dataset_item, llm_output):
return LevenshteinRatio().score(reference=dataset_item["answer"], output=llm_output)
# Run the optimization
result = optimizer.optimize_prompt(
prompt=prompt,
dataset=hot_pot_dataset,
metric=levenshtein_ratio,
n_samples=150 # Number of dataset samples for evaluation per trial
)
# Display the best prompt and its score
result.display()
The result object contains the optimized prompt, evaluation scores, and other details from the optimization process. If project_name is provided and Opik is configured, results will also be logged to your Comet workspace.
The optimizer automatically logs run metadata—including optimizer version, tool schemas, prompt messages, and the models used—so you get consistent experiment context without any additional arguments. If you still need custom tags (for example identifying the dataset or task), pass an experiment_config dictionary and your fields will be merged on top of the defaults.
Tool Optimization (MCP) - Beta
The Opik Agent Optimizer supports true tool optimization for MCP (Model Context Protocol) tools. This feature is currently in Beta and supported by the MetaPrompt Optimizer.
Key Features
- MCP Tool Optimization - Optimize MCP tool descriptions and usage patterns (Beta)
- Tool-Aware Analysis - The optimizer understands MCP tool schemas and usage patterns
- Multi-step Workflow Support - Optimize complex agent workflows involving MCP tools
Agent Function Calling (Not Tool Optimization)
Many optimizers can optimize agents that use function calling, but this is different from true tool optimization. Here's an example with GEPA:
from opik_optimizer import GepaOptimizer, ChatPrompt
# GEPA example: optimizing an agent with function calling
prompt = ChatPrompt(
system="You are a helpful assistant. Use the search_wikipedia tool when needed.",
user="{question}",
tools=[
{
"type": "function",
"function": {
"name": "search_wikipedia",
"description": "This function searches Wikipedia abstracts.",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"}
},
"required": ["query"]
}
}
}
],
function_map={
"search_wikipedia": lambda query: search_wikipedia(query, use_api=True)
}
)
# GEPA optimizes the agent's prompt, not the tools themselves
optimizer = GepaOptimizer(model="gpt-4o-mini")
result = optimizer.optimize_prompt(prompt=prompt, dataset=dataset, metric=metric)
True Tool Optimization (MCP) - Beta
from opik_optimizer import MetaPromptOptimizer
# MCP tool optimization is currently in Beta
# See scripts/litellm_metaprompt_context7_mcp_example.py for working examples
optimizer = MetaPromptOptimizer(model="gpt-4")
# MCP tools are configured through mcp.json manifests
For comprehensive documentation on tool optimization, see the Tool Optimization Guide.
Deprecation Warnings
The following parameters are deprecated and will be removed in future versions:
Constructor Parameters
project_namein optimizer constructors: Setproject_namein theChatPromptinsteadnum_threadsin optimizer constructors: Usen_threadsinstead
Example Migration
# ❌ Deprecated
optimizer = FewShotBayesianOptimizer(
model="gpt-4o-mini",
project_name="my-project", # Deprecated
num_threads=16, # Deprecated
)
# ✅ Correct
optimizer = FewShotBayesianOptimizer(
model="gpt-4o-mini",
n_threads=16, # Use n_threads instead
)
prompt = ChatPrompt(
project_name="my-project", # Set here instead
messages=[...]
)
Suppressing Deprecation Warnings
To suppress deprecation warnings during development:
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
MCP Integration (Beta)
The optimizer includes utilities for MCP tool integration:
# Install MCP Python SDK
pip install mcp
# Run MCP examples (Beta)
python scripts/litellm_metaprompt_context7_mcp_example.py
Underlying utilities are available in src/opik_optimizer/utils/{prompt_segments,mcp,mcp_simulator}.py.
Development
To contribute or use the Opik Optimizer from source:
-
Clone the Opik repository:
git clone git@github.com:comet-ml/opik.git
-
Navigate to the optimizer's directory:
cd opik/sdks/opik_optimizer # Adjust 'opik' if you cloned into a different folder name
-
Install in editable mode (with development dependencies):
pip install -e .[dev]
The
[dev]extra installs dependencies useful for development, such aspytest.
Requirements
- Python
>=3.10,<3.13(see Python version requirements) - Opik API key (recommended for full functionality, configure via
opik configure) - API key for your chosen LLM provider (e.g., OpenAI, Anthropic, Gemini), configured as per LiteLLM guidelines.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file opik_optimizer-2.3.10.tar.gz.
File metadata
- Download URL: opik_optimizer-2.3.10.tar.gz
- Upload date:
- Size: 191.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75f57f94823ca3b6b6a1b8d4a4d4eefc260dd7c7776f59d0679a6fb01e235120
|
|
| MD5 |
e2c5900694b244c30490d868b66d34f6
|
|
| BLAKE2b-256 |
5275feb50eea7d0f017f470306eea1891c10e8676f27a27136b7f3f6d52dced6
|
File details
Details for the file opik_optimizer-2.3.10-py3-none-any.whl.
File metadata
- Download URL: opik_optimizer-2.3.10-py3-none-any.whl
- Upload date:
- Size: 230.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a4768080359b1939ac08f8749955bc5eb83efb68ccb1cb80734061fd5f00ac3
|
|
| MD5 |
2cd7e019db42bd2dfb43c92f5d0e31ea
|
|
| BLAKE2b-256 |
41bf59acd532667ac7d93e4fef3d348cf9516c30cb0d075b72dd0b0b927fb5e3
|