opik-optimizer 1.0.3__tar.gz → 1.0.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {opik_optimizer-1.0.3/src/opik_optimizer.egg-info → opik_optimizer-1.0.5}/PKG-INFO +4 -3
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/README.md +3 -2
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/setup.py +1 -1
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/evolutionary_optimizer/evolutionary_optimizer.py +12 -8
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/meta_prompt_optimizer/meta_prompt_optimizer.py +7 -3
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/optimization_result.py +7 -1
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/utils.py +8 -1
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5/src/opik_optimizer.egg-info}/PKG-INFO +4 -3
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/LICENSE +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/pyproject.toml +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/setup.cfg +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/__init__.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/_throttle.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/base_optimizer.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/cache_config.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/data/hotpot-500.json +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/__init__.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/ai2_arc.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/cnn_dailymail.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/election_questions.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/gsm8k.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/halu_eval.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/hotpot_qa.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/medhallu.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/rag_hallucinations.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/ragbench.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/tiny_test.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/truthful_qa.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/demo/__init__.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/demo/cache.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/demo/datasets.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/evolutionary_optimizer/__init__.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/evolutionary_optimizer/reporting.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/few_shot_bayesian_optimizer/__init__.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/few_shot_bayesian_optimizer/few_shot_bayesian_optimizer.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/few_shot_bayesian_optimizer/reporting.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/logging_config.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/meta_prompt_optimizer/__init__.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/meta_prompt_optimizer/reporting.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/mipro_optimizer/__init__.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/mipro_optimizer/_lm.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/mipro_optimizer/_mipro_optimizer_v2.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/mipro_optimizer/mipro_optimizer.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/mipro_optimizer/utils.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/optimizable_agent.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/optimization_config/__init__.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/optimization_config/chat_prompt.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/optimization_config/configs.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/optimization_config/mappers.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/py.typed +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/reporting_utils.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/task_evaluator.py +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer.egg-info/SOURCES.txt +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer.egg-info/dependency_links.txt +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer.egg-info/requires.txt +0 -0
- {opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: opik_optimizer
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.5
|
4
4
|
Summary: Agent optimization with Opik
|
5
5
|
Home-page: https://github.com/comet-ml/opik
|
6
6
|
Author: Comet ML
|
@@ -119,19 +119,20 @@ from opik_optimizer.datasets import hotpot_300
|
|
119
119
|
# Load a sample dataset
|
120
120
|
hot_pot_dataset = hotpot_300()
|
121
121
|
|
122
|
+
project_name = "optimize-few-shot-bayesian-hotpot" # For Comet logging
|
123
|
+
|
122
124
|
# Define the instruction for your chat prompt.
|
123
125
|
# Input parameters from dataset examples will be interpolated into the full prompt.
|
124
126
|
prompt = ChatPrompt(
|
127
|
+
project_name=project_name,
|
125
128
|
messages=[
|
126
129
|
{"role": "system", "content": "You are a helpful assistant."},
|
127
130
|
{"role": "user", "content": "{question}"}
|
128
131
|
]
|
129
132
|
)
|
130
|
-
project_name = "optimize-few-shot-bayesian-hotpot" # For Comet logging
|
131
133
|
|
132
134
|
optimizer = FewShotBayesianOptimizer(
|
133
135
|
model="gpt-4o-mini", # LiteLLM name to use for generation and optimization
|
134
|
-
project_name=project_name, # Associates the run with a Comet project
|
135
136
|
min_examples=3, # Min few-shot examples
|
136
137
|
max_examples=8, # Max few-shot examples
|
137
138
|
n_threads=16, # Parallel threads for evaluation
|
@@ -79,19 +79,20 @@ from opik_optimizer.datasets import hotpot_300
|
|
79
79
|
# Load a sample dataset
|
80
80
|
hot_pot_dataset = hotpot_300()
|
81
81
|
|
82
|
+
project_name = "optimize-few-shot-bayesian-hotpot" # For Comet logging
|
83
|
+
|
82
84
|
# Define the instruction for your chat prompt.
|
83
85
|
# Input parameters from dataset examples will be interpolated into the full prompt.
|
84
86
|
prompt = ChatPrompt(
|
87
|
+
project_name=project_name,
|
85
88
|
messages=[
|
86
89
|
{"role": "system", "content": "You are a helpful assistant."},
|
87
90
|
{"role": "user", "content": "{question}"}
|
88
91
|
]
|
89
92
|
)
|
90
|
-
project_name = "optimize-few-shot-bayesian-hotpot" # For Comet logging
|
91
93
|
|
92
94
|
optimizer = FewShotBayesianOptimizer(
|
93
95
|
model="gpt-4o-mini", # LiteLLM name to use for generation and optimization
|
94
|
-
project_name=project_name, # Associates the run with a Comet project
|
95
96
|
min_examples=3, # Min few-shot examples
|
96
97
|
max_examples=8, # Max few-shot examples
|
97
98
|
n_threads=16, # Parallel threads for evaluation
|
@@ -102,7 +102,7 @@ Return ONLY this descriptive string, with no preamble or extra formatting.
|
|
102
102
|
mutation_rate: float = DEFAULT_MUTATION_RATE,
|
103
103
|
crossover_rate: float = DEFAULT_CROSSOVER_RATE,
|
104
104
|
tournament_size: int = DEFAULT_TOURNAMENT_SIZE,
|
105
|
-
num_threads: int =
|
105
|
+
num_threads: Optional[int] = None,
|
106
106
|
elitism_size: int = DEFAULT_ELITISM_SIZE,
|
107
107
|
adaptive_mutation: bool = DEFAULT_ADAPTIVE_MUTATION,
|
108
108
|
enable_moo: bool = DEFAULT_ENABLE_MOO,
|
@@ -111,6 +111,7 @@ Return ONLY this descriptive string, with no preamble or extra formatting.
|
|
111
111
|
output_style_guidance: Optional[str] = None,
|
112
112
|
infer_output_style: bool = False,
|
113
113
|
verbose: int = 1,
|
114
|
+
n_threads: int = DEFAULT_NUM_THREADS,
|
114
115
|
**model_kwargs: Any,
|
115
116
|
) -> None:
|
116
117
|
"""
|
@@ -121,7 +122,7 @@ Return ONLY this descriptive string, with no preamble or extra formatting.
|
|
121
122
|
mutation_rate: Mutation rate for genetic operations
|
122
123
|
crossover_rate: Crossover rate for genetic operations
|
123
124
|
tournament_size: Tournament size for selection
|
124
|
-
|
125
|
+
n_threads: Number of threads for parallel evaluation
|
125
126
|
elitism_size: Number of elitism prompts
|
126
127
|
adaptive_mutation: Whether to use adaptive mutation
|
127
128
|
enable_moo: Whether to enable multi-objective optimization - When enable optimizes for both the supplied metric and the length of the prompt
|
@@ -145,7 +146,10 @@ Return ONLY this descriptive string, with no preamble or extra formatting.
|
|
145
146
|
self.mutation_rate = mutation_rate
|
146
147
|
self.crossover_rate = crossover_rate
|
147
148
|
self.tournament_size = tournament_size
|
148
|
-
|
149
|
+
if num_threads is not None:
|
150
|
+
print("num_threads is deprecated; use n_threads instead")
|
151
|
+
n_threads = num_threads
|
152
|
+
self.num_threads = n_threads
|
149
153
|
self.elitism_size = elitism_size
|
150
154
|
self.adaptive_mutation = adaptive_mutation
|
151
155
|
self.enable_moo = enable_moo
|
@@ -1529,26 +1533,26 @@ Return only the new prompt list object.
|
|
1529
1533
|
"""
|
1530
1534
|
total_items = len(dataset.get_items())
|
1531
1535
|
|
1536
|
+
new_prompt = prompt.copy()
|
1537
|
+
new_prompt.set_messages(messages)
|
1538
|
+
|
1532
1539
|
experiment_config = experiment_config or {}
|
1533
1540
|
experiment_config["project_name"] = self.agent_class.project_name
|
1534
1541
|
experiment_config = {
|
1535
1542
|
**experiment_config,
|
1536
1543
|
"optimizer": self.__class__.__name__,
|
1537
1544
|
"agent_class": self.agent_class.__name__,
|
1538
|
-
"agent_config":
|
1545
|
+
"agent_config": new_prompt.to_dict(),
|
1539
1546
|
"metric": metric.__name__,
|
1540
1547
|
"dataset": dataset.name,
|
1541
1548
|
"configuration": {
|
1542
|
-
"prompt":
|
1549
|
+
"prompt": new_prompt.get_messages(),
|
1543
1550
|
"n_samples_for_eval": (
|
1544
1551
|
len(dataset_item_ids) if dataset_item_ids is not None else n_samples
|
1545
1552
|
),
|
1546
1553
|
"total_dataset_items": total_items,
|
1547
1554
|
},
|
1548
1555
|
}
|
1549
|
-
|
1550
|
-
new_prompt = prompt.copy()
|
1551
|
-
new_prompt.set_messages(messages)
|
1552
1556
|
try:
|
1553
1557
|
agent = self.agent_class(new_prompt)
|
1554
1558
|
except Exception:
|
@@ -85,9 +85,10 @@ class MetaPromptOptimizer(BaseOptimizer):
|
|
85
85
|
reasoning_model: Optional[str] = None,
|
86
86
|
rounds: int = DEFAULT_ROUNDS,
|
87
87
|
num_prompts_per_round: int = DEFAULT_PROMPTS_PER_ROUND,
|
88
|
-
num_threads: int =
|
88
|
+
num_threads: Optional[int] = None,
|
89
89
|
verbose: int = 1,
|
90
90
|
enable_context: bool = True,
|
91
|
+
n_threads: int = 12,
|
91
92
|
**model_kwargs: Any,
|
92
93
|
) -> None:
|
93
94
|
"""
|
@@ -96,7 +97,7 @@ class MetaPromptOptimizer(BaseOptimizer):
|
|
96
97
|
reasoning_model: The model to use for reasoning and prompt generation
|
97
98
|
rounds: Number of optimization rounds
|
98
99
|
num_prompts_per_round: Number of prompts to generate per round
|
99
|
-
|
100
|
+
n_threads: Number of threads for parallel evaluation
|
100
101
|
verbose: Controls internal logging/progress bars (0=off, 1=on).
|
101
102
|
enable_context: Whether to include task-specific context (metrics, examples) in the reasoning prompt.
|
102
103
|
**model_kwargs: Additional model parameters
|
@@ -111,7 +112,10 @@ class MetaPromptOptimizer(BaseOptimizer):
|
|
111
112
|
self.reasoning_model = reasoning_model if reasoning_model is not None else model
|
112
113
|
self.rounds = rounds
|
113
114
|
self.num_prompts_per_round = num_prompts_per_round
|
114
|
-
|
115
|
+
if num_threads is not None:
|
116
|
+
print("num_threads is deprecated; use n_threads instead")
|
117
|
+
n_threads = num_threads
|
118
|
+
self.num_threads = n_threads
|
115
119
|
self.dataset: Optional[Dataset] = None
|
116
120
|
self._opik_client = opik_client.get_client_cached()
|
117
121
|
self.llm_call_counter = 0
|
@@ -5,7 +5,7 @@ from typing import Any, Dict, List, Optional
|
|
5
5
|
import pydantic
|
6
6
|
import rich
|
7
7
|
|
8
|
-
from .reporting_utils import get_console, get_link_text
|
8
|
+
from .reporting_utils import get_console, get_link_text, get_optimization_run_url_by_id
|
9
9
|
|
10
10
|
|
11
11
|
class OptimizationResult(pydantic.BaseModel):
|
@@ -35,6 +35,11 @@ class OptimizationResult(pydantic.BaseModel):
|
|
35
35
|
|
36
36
|
model_config = pydantic.ConfigDict(arbitrary_types_allowed=True)
|
37
37
|
|
38
|
+
def get_run_link(self) -> str:
|
39
|
+
return get_optimization_run_url_by_id(
|
40
|
+
optimization_id=self.optimization_id, dataset_id=self.dataset_id
|
41
|
+
)
|
42
|
+
|
38
43
|
def model_dump(self, *kargs: Any, **kwargs: Any) -> Dict[str, Any]:
|
39
44
|
return super().model_dump(*kargs, **kwargs)
|
40
45
|
|
@@ -200,3 +205,4 @@ class OptimizationResult(pydantic.BaseModel):
|
|
200
205
|
"""
|
201
206
|
console = get_console()
|
202
207
|
console.print(self)
|
208
|
+
print("Optimization run link:", self.get_run_link())
|
@@ -257,7 +257,14 @@ def ensure_ending_slash(url: str) -> str:
|
|
257
257
|
return url.rstrip("/") + "/"
|
258
258
|
|
259
259
|
|
260
|
-
def get_optimization_run_url_by_id(
|
260
|
+
def get_optimization_run_url_by_id(
|
261
|
+
dataset_id: Optional[str], optimization_id: Optional[str]
|
262
|
+
) -> str:
|
263
|
+
if dataset_id is None or optimization_id is None:
|
264
|
+
raise ValueError(
|
265
|
+
"Cannot create a new run link without a dataset_id and optimization_id."
|
266
|
+
)
|
267
|
+
|
261
268
|
opik_config = opik.config.get_from_user_inputs()
|
262
269
|
url_override = opik_config.url_override
|
263
270
|
encoded_opik_url = base64.b64encode(url_override.encode("utf-8")).decode("utf-8")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: opik_optimizer
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.5
|
4
4
|
Summary: Agent optimization with Opik
|
5
5
|
Home-page: https://github.com/comet-ml/opik
|
6
6
|
Author: Comet ML
|
@@ -119,19 +119,20 @@ from opik_optimizer.datasets import hotpot_300
|
|
119
119
|
# Load a sample dataset
|
120
120
|
hot_pot_dataset = hotpot_300()
|
121
121
|
|
122
|
+
project_name = "optimize-few-shot-bayesian-hotpot" # For Comet logging
|
123
|
+
|
122
124
|
# Define the instruction for your chat prompt.
|
123
125
|
# Input parameters from dataset examples will be interpolated into the full prompt.
|
124
126
|
prompt = ChatPrompt(
|
127
|
+
project_name=project_name,
|
125
128
|
messages=[
|
126
129
|
{"role": "system", "content": "You are a helpful assistant."},
|
127
130
|
{"role": "user", "content": "{question}"}
|
128
131
|
]
|
129
132
|
)
|
130
|
-
project_name = "optimize-few-shot-bayesian-hotpot" # For Comet logging
|
131
133
|
|
132
134
|
optimizer = FewShotBayesianOptimizer(
|
133
135
|
model="gpt-4o-mini", # LiteLLM name to use for generation and optimization
|
134
|
-
project_name=project_name, # Associates the run with a Comet project
|
135
136
|
min_examples=3, # Min few-shot examples
|
136
137
|
max_examples=8, # Max few-shot examples
|
137
138
|
n_threads=16, # Parallel threads for evaluation
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/election_questions.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/datasets/rag_hallucinations.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/evolutionary_optimizer/__init__.py
RENAMED
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/evolutionary_optimizer/reporting.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/meta_prompt_optimizer/__init__.py
RENAMED
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/meta_prompt_optimizer/reporting.py
RENAMED
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/mipro_optimizer/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/mipro_optimizer/mipro_optimizer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/optimization_config/__init__.py
RENAMED
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/optimization_config/chat_prompt.py
RENAMED
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/optimization_config/configs.py
RENAMED
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer/optimization_config/mappers.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{opik_optimizer-1.0.3 → opik_optimizer-1.0.5}/src/opik_optimizer.egg-info/dependency_links.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|