opik-optimizer 1.0.3__py3-none-any.whl → 1.0.5__py3-none-any.whl

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.
@@ -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 = DEFAULT_NUM_THREADS,
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
- num_threads: Number of threads for parallel evaluation
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
- self.num_threads = num_threads
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": prompt.to_dict(),
1545
+ "agent_config": new_prompt.to_dict(),
1539
1546
  "metric": metric.__name__,
1540
1547
  "dataset": dataset.name,
1541
1548
  "configuration": {
1542
- "prompt": prompt.get_messages(),
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 = 12,
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
- num_threads: Number of threads for parallel evaluation
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
- self.num_threads = num_threads
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())
opik_optimizer/utils.py CHANGED
@@ -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(dataset_id: str, optimization_id: str) -> str:
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
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
@@ -4,11 +4,11 @@ opik_optimizer/base_optimizer.py,sha256=-hFlV7i9gLSR0-ODlUo-_YzNOSBUzxuw52DcCQF7
4
4
  opik_optimizer/cache_config.py,sha256=Xd3NdUsL7bLQWoNe3pESqH4nHucU1iNTSGp-RqbwDog,599
5
5
  opik_optimizer/logging_config.py,sha256=kUGr4K1mpfprA7AiJrl9evnJAgzEEw9Jkddo58okCWo,2809
6
6
  opik_optimizer/optimizable_agent.py,sha256=BVSUdrx6nu-2Sh5rSBQq7Op3u_zYwTp8cj2eCBu0Ay4,6019
7
- opik_optimizer/optimization_result.py,sha256=cHtNwVTUfc8ZwIAHKLN0NClrpNewHhCt6B953XiSKzg,7499
7
+ opik_optimizer/optimization_result.py,sha256=sLW0TzcawBHEV6c174czLbu_kN7EHA5R9bDuZWDNRXE,7762
8
8
  opik_optimizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  opik_optimizer/reporting_utils.py,sha256=rutmDk5ATH7lbWvgaiZENWav1WzsIdN0U-xrVXpn4s0,6840
10
10
  opik_optimizer/task_evaluator.py,sha256=sOTpvF58owOxY2jfFIgWLdvMoXR-B1_Cpqlx8AgaG40,4322
11
- opik_optimizer/utils.py,sha256=MrfpO0xvpbKjJG01vUM1hTbtek5-S0PT53WOeUtVeGg,10389
11
+ opik_optimizer/utils.py,sha256=0lHYqleN2OfOZ5WVqQsfglbCPQpjMxjZUWTueM9Tql4,10591
12
12
  opik_optimizer/data/hotpot-500.json,sha256=YXxCtuvYvxSu5u0y4559a6b1qwgAYsWzT_SUKv_21ew,76862
13
13
  opik_optimizer/datasets/__init__.py,sha256=V4LVDOaRjwzaYvhdQ3V6CAwFaeKnxyTV1lp_ES9Z31E,691
14
14
  opik_optimizer/datasets/ai2_arc.py,sha256=vIxb8qlCAxx4_cz2P7SIqS7flquj--7XVUaDmy12UfY,1440
@@ -26,13 +26,13 @@ opik_optimizer/demo/__init__.py,sha256=KSpFYhzN7fTmLEsIaciRHwxcJDeAiX5NDmYLdPsfp
26
26
  opik_optimizer/demo/cache.py,sha256=CwjdmVjokVxmPXvgfOutZK8e0sV-PIUz3ou6ODXZBts,3738
27
27
  opik_optimizer/demo/datasets.py,sha256=idod4NYHw1IbxhA8c0XVFD_pGpMZagNGNZuEYDTbbMM,2357
28
28
  opik_optimizer/evolutionary_optimizer/__init__.py,sha256=bDa6FZR9Y_a5z337I4EtvaB69jB542P4dbruhYPHCEU,95
29
- opik_optimizer/evolutionary_optimizer/evolutionary_optimizer.py,sha256=fVYHE_kD8uw02DffGps-Inrm_jWO2QLQioUyeAdnIkU,82401
29
+ opik_optimizer/evolutionary_optimizer/evolutionary_optimizer.py,sha256=OfTf__Sd_1dX9XF2IUabR1xEQz6QONrYCj8lXT39F4c,82588
30
30
  opik_optimizer/evolutionary_optimizer/reporting.py,sha256=wxzaUYS-gl5wt9msdIIIY-L7oLZE-OTrjeKf11arf_g,11364
31
31
  opik_optimizer/few_shot_bayesian_optimizer/__init__.py,sha256=VuH7FOROyGcjMPryejtZC-5Y0QHlVTFLTGUDgNqRAFw,113
32
32
  opik_optimizer/few_shot_bayesian_optimizer/few_shot_bayesian_optimizer.py,sha256=kFx34JPR61JUi4lJs_kWfuozbgNGkb1CqYjQik1r9oE,27552
33
33
  opik_optimizer/few_shot_bayesian_optimizer/reporting.py,sha256=z6jI52uAg232TVc3b6uxbNzNlntkDcunvprZq0hEJvs,6036
34
34
  opik_optimizer/meta_prompt_optimizer/__init__.py,sha256=syiN2_fMm5iZDQezZCHYe-ZiGOIPlBkLt49Sa1kuR70,97
35
- opik_optimizer/meta_prompt_optimizer/meta_prompt_optimizer.py,sha256=3UbVUnE3_ccjxFj-9Pst4YijaF6--VL-tBq1nzTIDwk,38140
35
+ opik_optimizer/meta_prompt_optimizer/meta_prompt_optimizer.py,sha256=3llumRjK00CSl8IHosyFrRStRcbB8ewcxmd6cTJIDws,38319
36
36
  opik_optimizer/meta_prompt_optimizer/reporting.py,sha256=wGFmnwV7Ys0kzyrz2BJwArVymoCBWObJBvKfxLhlVwY,7456
37
37
  opik_optimizer/mipro_optimizer/__init__.py,sha256=7sMq9OSWyjITqK7sVtkO9fhG1w6KRE8bN7V52CKaGvo,94
38
38
  opik_optimizer/mipro_optimizer/_lm.py,sha256=bSxQZtWg5zzqIK_FERV7v4PkDouTXP3Fw5fVgBVoKPQ,16748
@@ -43,8 +43,8 @@ opik_optimizer/optimization_config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQe
43
43
  opik_optimizer/optimization_config/chat_prompt.py,sha256=h2C1qtcgDc3nyEcjxUz6zotHydcnQi6vuNYqfO8OsA0,6268
44
44
  opik_optimizer/optimization_config/configs.py,sha256=fY6td3_hX7c6CYWtOINZE7NWtzVdsTxx4isootHZ-lE,419
45
45
  opik_optimizer/optimization_config/mappers.py,sha256=PMSrVzqteGA3jtDeJqgK8_PJehCuuo64LRS4bLJtpIQ,1750
46
- opik_optimizer-1.0.3.dist-info/licenses/LICENSE,sha256=dTRSwwCHdWeSjzodvnivYqcwi8x3Qfr21yv65QUWWBE,1062
47
- opik_optimizer-1.0.3.dist-info/METADATA,sha256=Hlhp8y844aXihCnKiWMRos6-AdyEiuaczrnzHkMtV9E,6576
48
- opik_optimizer-1.0.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
- opik_optimizer-1.0.3.dist-info/top_level.txt,sha256=ondOlpq6_yFckqpxoAHSfzZS2N-JfgmA-QQhOJfz7m0,15
50
- opik_optimizer-1.0.3.dist-info/RECORD,,
46
+ opik_optimizer-1.0.5.dist-info/licenses/LICENSE,sha256=dTRSwwCHdWeSjzodvnivYqcwi8x3Qfr21yv65QUWWBE,1062
47
+ opik_optimizer-1.0.5.dist-info/METADATA,sha256=0cxjz8yyqWxa7sCmr4YXjargLPe1tGeyYRBoW8v-Bu4,6535
48
+ opik_optimizer-1.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
+ opik_optimizer-1.0.5.dist-info/top_level.txt,sha256=ondOlpq6_yFckqpxoAHSfzZS2N-JfgmA-QQhOJfz7m0,15
50
+ opik_optimizer-1.0.5.dist-info/RECORD,,