synth-ai 0.2.4.dev5__py3-none-any.whl → 0.2.4.dev6__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.
Files changed (26) hide show
  1. synth_ai/environments/examples/crafter_classic/engine.py +8 -4
  2. synth_ai/environments/examples/wordle/__init__.py +29 -0
  3. synth_ai/environments/examples/wordle/engine.py +391 -0
  4. synth_ai/environments/examples/wordle/environment.py +154 -0
  5. synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +75 -0
  6. synth_ai/environments/examples/wordle/taskset.py +222 -0
  7. synth_ai/environments/service/app.py +8 -0
  8. synth_ai/environments/service/core_routes.py +38 -0
  9. synth_ai/learning/prompts/banking77_injection_eval.py +163 -0
  10. synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +201 -0
  11. synth_ai/learning/prompts/mipro.py +273 -1
  12. synth_ai/learning/prompts/random_search.py +247 -0
  13. synth_ai/learning/prompts/run_mipro_banking77.py +160 -0
  14. synth_ai/learning/prompts/run_random_search_banking77.py +305 -0
  15. synth_ai/lm/injection.py +81 -0
  16. synth_ai/lm/overrides.py +204 -0
  17. synth_ai/lm/provider_support/anthropic.py +39 -12
  18. synth_ai/lm/provider_support/openai.py +31 -4
  19. synth_ai/lm/vendors/core/anthropic_api.py +16 -0
  20. synth_ai/lm/vendors/openai_standard.py +35 -5
  21. {synth_ai-0.2.4.dev5.dist-info → synth_ai-0.2.4.dev6.dist-info}/METADATA +2 -1
  22. {synth_ai-0.2.4.dev5.dist-info → synth_ai-0.2.4.dev6.dist-info}/RECORD +26 -14
  23. {synth_ai-0.2.4.dev5.dist-info → synth_ai-0.2.4.dev6.dist-info}/WHEEL +0 -0
  24. {synth_ai-0.2.4.dev5.dist-info → synth_ai-0.2.4.dev6.dist-info}/entry_points.txt +0 -0
  25. {synth_ai-0.2.4.dev5.dist-info → synth_ai-0.2.4.dev6.dist-info}/licenses/LICENSE +0 -0
  26. {synth_ai-0.2.4.dev5.dist-info → synth_ai-0.2.4.dev6.dist-info}/top_level.txt +0 -0
@@ -27,6 +27,13 @@ from langfuse.decorators import langfuse_context
27
27
  from langfuse.utils import _get_timestamp
28
28
  from langfuse.utils.langfuse_singleton import LangfuseSingleton
29
29
  from wrapt import wrap_function_wrapper
30
+ from synth_ai.lm.overrides import (
31
+ use_overrides_for_messages,
32
+ apply_injection as apply_injection_overrides,
33
+ apply_param_overrides,
34
+ apply_tool_overrides,
35
+ )
36
+ from synth_ai.lm.injection import apply_injection
30
37
 
31
38
  from synth_ai.lm.provider_support.suppress_logging import *
32
39
  from synth_ai.tracing_v1.trackers import (
@@ -349,7 +356,17 @@ def _wrap(anthropic_resource: AnthropicDefinition, initialize, wrapped, args, kw
349
356
  generation = new_langfuse.generation(**generation_data)
350
357
 
351
358
  try:
352
- anthropic_response = wrapped(*args, **arg_extractor.get_anthropic_args())
359
+ call_kwargs = arg_extractor.get_anthropic_args()
360
+ # Apply context-scoped injection to chat messages if present
361
+ if isinstance(call_kwargs, dict) and "messages" in call_kwargs:
362
+ try:
363
+ with use_overrides_for_messages(call_kwargs["messages"]): # type: ignore[arg-type]
364
+ call_kwargs["messages"] = apply_injection_overrides(call_kwargs["messages"]) # type: ignore[arg-type]
365
+ call_kwargs = apply_tool_overrides(call_kwargs)
366
+ call_kwargs = apply_param_overrides(call_kwargs)
367
+ except Exception:
368
+ pass
369
+ anthropic_response = wrapped(*args, **call_kwargs)
353
370
 
354
371
  # If it's a streaming call, returns a generator
355
372
  if isinstance(anthropic_response, types.GeneratorType):
@@ -363,10 +380,10 @@ def _wrap(anthropic_resource: AnthropicDefinition, initialize, wrapped, args, kw
363
380
  else:
364
381
  model, completion, usage = _extract_anthropic_completion(anthropic_response)
365
382
  # Synth tracking
366
- if "messages" in arg_extractor.get_anthropic_args():
383
+ if "messages" in call_kwargs:
367
384
  # print("\nWRAP: Messages API path")
368
- system_content = arg_extractor.get_anthropic_args().get("system")
369
- original_messages = arg_extractor.get_anthropic_args()["messages"]
385
+ system_content = call_kwargs.get("system")
386
+ original_messages = call_kwargs["messages"]
370
387
  # print(f"WRAP: Original messages: {original_messages}")
371
388
  # print(f"WRAP: System content: {system_content}")
372
389
 
@@ -397,9 +414,9 @@ def _wrap(anthropic_resource: AnthropicDefinition, initialize, wrapped, args, kw
397
414
  )
398
415
  # print("Finished tracking LM output")
399
416
 
400
- elif "prompt" in arg_extractor.get_anthropic_args():
417
+ elif "prompt" in call_kwargs:
401
418
  # print("\nWRAP: Completions API path")
402
- user_prompt = arg_extractor.get_anthropic_args().get("prompt", "")
419
+ user_prompt = call_kwargs.get("prompt", "")
403
420
  # print(f"WRAP: User prompt: {user_prompt}")
404
421
  messages = [{"role": "user", "content": user_prompt}]
405
422
  # print(f"WRAP: Messages created: {messages}")
@@ -476,17 +493,27 @@ async def _wrap_async(anthropic_resource: AnthropicDefinition, initialize, wrapp
476
493
 
477
494
  try:
478
495
  logger.debug("About to call wrapped function")
479
- response = await wrapped(*args, **kwargs)
496
+ call_kwargs = kwargs
497
+ # Apply context-scoped injection to chat messages if present
498
+ if isinstance(call_kwargs, dict) and "messages" in call_kwargs:
499
+ try:
500
+ with use_overrides_for_messages(call_kwargs["messages"]): # type: ignore[arg-type]
501
+ call_kwargs["messages"] = apply_injection_overrides(call_kwargs["messages"]) # type: ignore[arg-type]
502
+ call_kwargs = apply_tool_overrides(call_kwargs)
503
+ call_kwargs = apply_param_overrides(call_kwargs)
504
+ except Exception:
505
+ pass
506
+ response = await wrapped(*args, **call_kwargs)
480
507
  logger.debug(f"Got response: {response}")
481
508
 
482
509
  model, completion, usage = _extract_anthropic_completion(response)
483
510
  logger.debug(f"Extracted completion - Model: {model}, Usage: {usage}")
484
511
 
485
512
  # Synth tracking
486
- if "messages" in arg_extractor.get_anthropic_args():
513
+ if "messages" in call_kwargs:
487
514
  # logger.debug("WRAP_ASYNC: Messages API path detected")
488
- system_content = arg_extractor.get_anthropic_args().get("system")
489
- original_messages = arg_extractor.get_anthropic_args()["messages"]
515
+ system_content = call_kwargs.get("system")
516
+ original_messages = call_kwargs["messages"]
490
517
  # logger.debug("WRAP_ASYNC: Original messages: %s", original_messages)
491
518
  # logger.debug("WRAP_ASYNC: System content: %s", system_content)
492
519
 
@@ -511,9 +538,9 @@ async def _wrap_async(anthropic_resource: AnthropicDefinition, initialize, wrapp
511
538
  model_name=model,
512
539
  finetune=False,
513
540
  )
514
- elif "prompt" in arg_extractor.get_anthropic_args():
541
+ elif "prompt" in call_kwargs:
515
542
  # Handle Completions API format
516
- user_prompt = arg_extractor.get_anthropic_args().get("prompt", "")
543
+ user_prompt = call_kwargs.get("prompt", "")
517
544
  messages = [{"role": "user", "content": user_prompt}]
518
545
  assistant_msg = [{"role": "assistant", "content": completion}]
519
546
 
@@ -15,6 +15,13 @@ from langfuse.utils.langfuse_singleton import LangfuseSingleton
15
15
  from packaging.version import Version
16
16
  from pydantic import BaseModel
17
17
  from wrapt import wrap_function_wrapper
18
+ from synth_ai.lm.overrides import (
19
+ use_overrides_for_messages,
20
+ apply_injection as apply_injection_overrides,
21
+ apply_param_overrides,
22
+ apply_tool_overrides,
23
+ )
24
+ from synth_ai.lm.injection import apply_injection
18
25
 
19
26
  from synth_ai.lm.provider_support.suppress_logging import *
20
27
  from synth_ai.tracing_v1.abstractions import MessageInputs
@@ -475,7 +482,17 @@ def _wrap(open_ai_resource: OpenAiDefinition, initialize, wrapped, args, kwargs)
475
482
  )
476
483
  generation = new_langfuse.generation(**generation)
477
484
  try:
478
- openai_response = wrapped(**arg_extractor.get_openai_args())
485
+ openai_args = arg_extractor.get_openai_args()
486
+ # Apply context-scoped injection to chat messages if present
487
+ if isinstance(openai_args, dict) and "messages" in openai_args:
488
+ try:
489
+ with use_overrides_for_messages(openai_args["messages"]): # type: ignore[arg-type]
490
+ openai_args["messages"] = apply_injection_overrides(openai_args["messages"]) # type: ignore[arg-type]
491
+ openai_args = apply_tool_overrides(openai_args)
492
+ openai_args = apply_param_overrides(openai_args)
493
+ except Exception:
494
+ pass
495
+ openai_response = wrapped(**openai_args)
479
496
 
480
497
  if _is_streaming_response(openai_response):
481
498
  return LangfuseResponseGeneratorSync(
@@ -527,7 +544,7 @@ def _wrap(open_ai_resource: OpenAiDefinition, initialize, wrapped, args, kwargs)
527
544
  )
528
545
 
529
546
  elif open_ai_resource.type == "chat":
530
- messages = arg_extractor.get_openai_args().get("messages", [])
547
+ messages = openai_args.get("messages", [])
531
548
  message_input = MessageInputs(messages=messages)
532
549
 
533
550
  # Track user input
@@ -605,7 +622,17 @@ async def _wrap_async(open_ai_resource: OpenAiDefinition, initialize, wrapped, a
605
622
  generation = new_langfuse.generation(**generation)
606
623
 
607
624
  try:
608
- openai_response = await wrapped(**arg_extractor.get_openai_args())
625
+ openai_args = arg_extractor.get_openai_args()
626
+ # Apply context-scoped injection to chat messages if present
627
+ if isinstance(openai_args, dict) and "messages" in openai_args:
628
+ try:
629
+ with use_overrides_for_messages(openai_args["messages"]): # type: ignore[arg-type]
630
+ openai_args["messages"] = apply_injection_overrides(openai_args["messages"]) # type: ignore[arg-type]
631
+ openai_args = apply_tool_overrides(openai_args)
632
+ openai_args = apply_param_overrides(openai_args)
633
+ except Exception:
634
+ pass
635
+ openai_response = await wrapped(**openai_args)
609
636
 
610
637
  if _is_streaming_response(openai_response):
611
638
  return LangfuseResponseGeneratorAsync(
@@ -654,7 +681,7 @@ async def _wrap_async(open_ai_resource: OpenAiDefinition, initialize, wrapped, a
654
681
  )
655
682
 
656
683
  elif open_ai_resource.type == "chat":
657
- messages = arg_extractor.get_openai_args().get("messages", [])
684
+ messages = openai_args.get("messages", [])
658
685
  message_input = MessageInputs(messages=messages)
659
686
 
660
687
  # Track user input
@@ -12,6 +12,8 @@ from synth_ai.lm.tools.base import BaseTool
12
12
  from synth_ai.lm.vendors.base import BaseLMResponse, VendorBase
13
13
  from synth_ai.lm.constants import SPECIAL_BASE_TEMPS, CLAUDE_REASONING_MODELS, SONNET_37_BUDGETS
14
14
  from synth_ai.lm.vendors.core.openai_api import OpenAIStructuredOutputClient
15
+ from synth_ai.lm.overrides import use_overrides_for_messages, apply_injection as apply_injection_overrides, apply_param_overrides
16
+ from synth_ai.lm.injection import apply_injection
15
17
 
16
18
  ANTHROPIC_EXCEPTIONS_TO_RETRY: Tuple[Type[Exception], ...] = (anthropic.APIError,)
17
19
 
@@ -56,6 +58,9 @@ class AnthropicAPI(VendorBase):
56
58
  )
57
59
  used_cache_handler = get_cache_handler(use_ephemeral_cache_only)
58
60
  lm_config["reasoning_effort"] = reasoning_effort
61
+ # Apply context-scoped overrides and injection before splitting
62
+ with use_overrides_for_messages(messages):
63
+ messages = apply_injection_overrides(messages)
59
64
  cache_result = used_cache_handler.hit_managed_cache(
60
65
  model, messages, lm_config=lm_config, tools=tools
61
66
  )
@@ -70,6 +75,10 @@ class AnthropicAPI(VendorBase):
70
75
  "max_tokens": lm_config.get("max_tokens", 4096),
71
76
  "temperature": lm_config.get("temperature", SPECIAL_BASE_TEMPS.get(model, 0)),
72
77
  }
78
+ with use_overrides_for_messages(messages):
79
+ from synth_ai.lm.overrides import apply_tool_overrides
80
+ api_params = apply_tool_overrides(api_params)
81
+ api_params = apply_param_overrides(api_params)
73
82
 
74
83
  # Add tools if provided
75
84
  if tools:
@@ -147,6 +156,9 @@ class AnthropicAPI(VendorBase):
147
156
  )
148
157
  used_cache_handler = get_cache_handler(use_ephemeral_cache_only=use_ephemeral_cache_only)
149
158
  lm_config["reasoning_effort"] = reasoning_effort
159
+ with use_overrides_for_messages(messages):
160
+ # Apply context-scoped injection before splitting into system/messages
161
+ messages = apply_injection_overrides(messages)
150
162
  cache_result = used_cache_handler.hit_managed_cache(
151
163
  model, messages, lm_config=lm_config, tools=tools
152
164
  )
@@ -161,6 +173,10 @@ class AnthropicAPI(VendorBase):
161
173
  "max_tokens": lm_config.get("max_tokens", 4096),
162
174
  "temperature": lm_config.get("temperature", SPECIAL_BASE_TEMPS.get(model, 0)),
163
175
  }
176
+ with use_overrides_for_messages(messages):
177
+ from synth_ai.lm.overrides import apply_tool_overrides
178
+ api_params = apply_tool_overrides(api_params)
179
+ api_params = apply_param_overrides(api_params)
164
180
 
165
181
  # Add tools if provided
166
182
  if tools:
@@ -13,6 +13,8 @@ from synth_ai.lm.caching.initialize import (
13
13
  )
14
14
  from synth_ai.lm.tools.base import BaseTool
15
15
  from synth_ai.lm.vendors.base import BaseLMResponse, VendorBase
16
+ from synth_ai.lm.injection import apply_injection
17
+ from synth_ai.lm.overrides import use_overrides_for_messages, apply_param_overrides, apply_tool_overrides
16
18
  from synth_ai.lm.constants import SPECIAL_BASE_TEMPS
17
19
  from synth_ai.lm.vendors.retries import MAX_BACKOFF
18
20
  from synth_ai.lm.vendors.openai_standard_responses import OpenAIResponsesAPIMixin
@@ -123,6 +125,9 @@ class OpenAIStandard(VendorBase, OpenAIResponsesAPIMixin):
123
125
  print(f" LM config: {lm_config}")
124
126
 
125
127
  messages = special_orion_transform(model, messages)
128
+ # Apply context-scoped overrides and prompt injection just before building API params
129
+ with use_overrides_for_messages(messages):
130
+ messages = apply_injection(messages)
126
131
  used_cache_handler = get_cache_handler(use_ephemeral_cache_only)
127
132
  lm_config["reasoning_effort"] = reasoning_effort
128
133
  cache_result = used_cache_handler.hit_managed_cache(
@@ -143,6 +148,8 @@ class OpenAIStandard(VendorBase, OpenAIResponsesAPIMixin):
143
148
  "model": model,
144
149
  "messages": messages,
145
150
  }
151
+ with use_overrides_for_messages(messages):
152
+ api_params = apply_param_overrides(api_params)
146
153
 
147
154
  # Add tools if provided
148
155
  if tools and all(isinstance(tool, BaseTool) for tool in tools):
@@ -150,8 +157,11 @@ class OpenAIStandard(VendorBase, OpenAIResponsesAPIMixin):
150
157
  elif tools:
151
158
  api_params["tools"] = tools
152
159
 
153
- # Only add temperature for non o1/o3 models
154
- if not any(prefix in model for prefix in ["o1-", "o3-"]):
160
+ # Only add temperature for non o1/o3 models, and do not override if already set via overrides
161
+ if (
162
+ not any(prefix in model for prefix in ["o1-", "o3-"])
163
+ and "temperature" not in api_params
164
+ ):
155
165
  api_params["temperature"] = lm_config.get(
156
166
  "temperature", SPECIAL_BASE_TEMPS.get(model, 0)
157
167
  )
@@ -187,6 +197,11 @@ class OpenAIStandard(VendorBase, OpenAIResponsesAPIMixin):
187
197
  api_params["extra_headers"] = hdrs
188
198
  except Exception:
189
199
  pass
200
+ # Apply overrides (tools and params) from context after building baseline params
201
+ with use_overrides_for_messages(messages):
202
+ api_params = apply_tool_overrides(api_params)
203
+ api_params = apply_param_overrides(api_params)
204
+
190
205
  # Forward Qwen3 chat template kwargs via extra_body when requested
191
206
  if lm_config.get("enable_thinking") is not None:
192
207
  api_params["extra_body"] = api_params.get("extra_body", {})
@@ -417,12 +432,17 @@ class OpenAIStandard(VendorBase, OpenAIResponsesAPIMixin):
417
432
  "response_model is not supported for standard calls"
418
433
  )
419
434
  messages = special_orion_transform(model, messages)
435
+ with use_overrides_for_messages(messages):
436
+ # Apply context-scoped prompt injection just before building API params
437
+ messages = apply_injection(messages)
420
438
  used_cache_handler = get_cache_handler(use_ephemeral_cache_only=use_ephemeral_cache_only)
421
439
  lm_config["reasoning_effort"] = reasoning_effort
422
440
  cache_result = used_cache_handler.hit_managed_cache(
423
441
  model, messages, lm_config=lm_config, tools=tools
424
442
  )
425
- if cache_result:
443
+ # During pytest runs, bypass returning cache to allow tests to inspect outgoing params
444
+ IN_PYTEST = os.getenv("PYTEST_CURRENT_TEST") is not None
445
+ if cache_result and not IN_PYTEST:
426
446
  return cache_result
427
447
 
428
448
  # Common API call params
@@ -430,6 +450,8 @@ class OpenAIStandard(VendorBase, OpenAIResponsesAPIMixin):
430
450
  "model": model,
431
451
  "messages": messages,
432
452
  }
453
+ with use_overrides_for_messages(messages):
454
+ api_params = apply_param_overrides(api_params)
433
455
 
434
456
  # Add tools if provided
435
457
  if tools and all(isinstance(tool, BaseTool) for tool in tools):
@@ -437,8 +459,16 @@ class OpenAIStandard(VendorBase, OpenAIResponsesAPIMixin):
437
459
  elif tools:
438
460
  api_params["tools"] = tools
439
461
 
440
- # Only add temperature for non o1/o3 models
441
- if not any(prefix in model for prefix in ["o1-", "o3-"]):
462
+ # Apply overrides (tools and params) using module-level imports
463
+ with use_overrides_for_messages(messages):
464
+ api_params = apply_tool_overrides(api_params)
465
+ api_params = apply_param_overrides(api_params)
466
+
467
+ # Only add temperature for non o1/o3 models, and do not override if already set via overrides
468
+ if (
469
+ not any(prefix in model for prefix in ["o1-", "o3-"])
470
+ and "temperature" not in api_params
471
+ ):
442
472
  api_params["temperature"] = lm_config.get(
443
473
  "temperature", SPECIAL_BASE_TEMPS.get(model, 0)
444
474
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.2.4.dev5
3
+ Version: 0.2.4.dev6
4
4
  Summary: Software for aiding the best and multiplying the will - Core AI functionality and tracing
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -49,6 +49,7 @@ Requires-Dist: textual>=1.1.0
49
49
  Requires-Dist: openai-harmony>=0.0.1
50
50
  Requires-Dist: asyncpg>=0.30.0
51
51
  Requires-Dist: aiohttp>=3.8.0
52
+ Requires-Dist: datasets>=4.0.0
52
53
  Provides-Extra: dev
53
54
  Requires-Dist: build>=1.2.2.post1; extra == "dev"
54
55
  Requires-Dist: twine>=4.0.0; extra == "dev"
@@ -33,7 +33,7 @@ synth_ai/environments/examples/__init__.py,sha256=POgz9O4n1tvPAW1rYNUNeQGrMlWxoP
33
33
  synth_ai/environments/examples/crafter_classic/__init__.py,sha256=waICaSbO19tTJpj-BxCURLDxRdx_gnSVQXLIwo4gqLM,270
34
34
  synth_ai/environments/examples/crafter_classic/config_logging.py,sha256=Eqq35s0lPAmBiU0neZM6vmHPct15gp9TwS3vogrNziM,3794
35
35
  synth_ai/environments/examples/crafter_classic/debug_translation.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- synth_ai/environments/examples/crafter_classic/engine.py,sha256=Nvp3aSd2Qqby6eJOPH1bLXuk-rU6EuUC-HEs8d-D-sY,25046
36
+ synth_ai/environments/examples/crafter_classic/engine.py,sha256=j3ld7vuWx5KZgs_4g2u8UPJuOhvUL3qt4TZM3Cuo8NU,25257
37
37
  synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py,sha256=Jhn4dtLypG4-eLMsHxesagVTGJtzoGF6UssEfblEJYE,2801
38
38
  synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py,sha256=E7EA1IODxeb8Fq6uV15pL5HFuv4q-KTwnmRGqweuM34,11126
39
39
  synth_ai/environments/examples/crafter_classic/environment.py,sha256=6Us77M0AhVOrBwZoaZesxC4QXC6q1tmVphga2BZvVv4,17218
@@ -127,11 +127,16 @@ synth_ai/environments/examples/verilog/__init__.py,sha256=JBf4ayWGO-VPK7PLitp_-j
127
127
  synth_ai/environments/examples/verilog/engine.py,sha256=jxpVJ5oVbRyObCLnETfy-sPARunaoYLLaPx7cyl68jc,12170
128
128
  synth_ai/environments/examples/verilog/environment.py,sha256=M6igedpgJWvLjw_ta1k4fwY9Kz0dPDIEgO9S4B-eBGg,12329
129
129
  synth_ai/environments/examples/verilog/taskset.py,sha256=-Vqrc_HY07WHcHLDQJ3KIDU3kNjpCgAMqCUYtay2Vyg,13336
130
+ synth_ai/environments/examples/wordle/__init__.py,sha256=tQIybhLzILCDhOTYFdToG8nSzVXx9zAIduMPJ6E3zb0,804
131
+ synth_ai/environments/examples/wordle/engine.py,sha256=HJO2VVRiAx6ddY-cjsMidIaFJY9d2bvzjEGA-uQ6RvM,13044
132
+ synth_ai/environments/examples/wordle/environment.py,sha256=mlmSubr8se7i-p858xLKQWcTK0dgcrXOTQ6NTjeoGZ0,6326
133
+ synth_ai/environments/examples/wordle/taskset.py,sha256=vM3sm91Fc6g5hmk-d36YhHTz4gnZ5WlYFGiZBn6XqEw,8182
134
+ synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py,sha256=PH-grN1UgonZzrqxo15tbYYxYgNTBMwfqbaHpt-fIMQ,2510
130
135
  synth_ai/environments/reproducibility/core.py,sha256=y4__bivu_tdyIas509oK2EH9KUdLaQfbJ6z3dK8wYxc,1499
131
136
  synth_ai/environments/reproducibility/helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
137
  synth_ai/environments/reproducibility/tree.py,sha256=bl0lfIjrJGxMNmcWs75uPBwurgd1ENjN_mI5RHfrANY,13743
133
- synth_ai/environments/service/app.py,sha256=KoouFEIOHQFSfP1CfiS756VTK6ActRG-jZ1v6xrVq0U,2637
134
- synth_ai/environments/service/core_routes.py,sha256=vblHFC5ibOyCkLRmTusOXmJnrXBty_FStqVVMTsl-_w,37226
138
+ synth_ai/environments/service/app.py,sha256=d_2OFCbywdM0C3UH3T7gdEl_Sh2SBheV2qi1QIzT-xs,2980
139
+ synth_ai/environments/service/core_routes.py,sha256=xA1db-D-GhBtIINdGAI8s5XhnwL2_F79A0PQqF_QS10,38735
135
140
  synth_ai/environments/service/external_registry.py,sha256=x7Qgbw83-1xcN69J337UHm4xPpWc5B0KUZrNUFtutLE,1795
136
141
  synth_ai/environments/service/registry.py,sha256=Ex9c3ZwfZ-oW9nGz7bwCj1GNzvu78Z54rwufjKhsnMg,405
137
142
  synth_ai/environments/stateful/__init__.py,sha256=UPNmotqxS2zXjSfhBui6R4qsDOIxKECL5xVTVDHcvsk,39
@@ -155,11 +160,18 @@ synth_ai/learning/offline/sft.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
155
160
  synth_ai/learning/offline/shared.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
161
  synth_ai/learning/online/grpo.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
162
  synth_ai/learning/online/irft.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
163
+ synth_ai/learning/prompts/banking77_injection_eval.py,sha256=hlmm1neRtZBp0g0mCw0FZAr-564EVhIt92scvgZPdVM,5687
158
164
  synth_ai/learning/prompts/gepa.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
- synth_ai/learning/prompts/mipro.py,sha256=nIw7v6t3DXA8MbmPFQTxKbpFhMa1ocMmWLtxhfONwoc,51
165
+ synth_ai/learning/prompts/hello_world_in_context_injection_ex.py,sha256=NV4GA8vmW0jD9vSAdb_qDCHCUmSOyxVtHQKOjCGM8e4,8990
166
+ synth_ai/learning/prompts/mipro.py,sha256=H62Ig7E_ujDVp_qhX1bmbznU0UtEKSDlIvRRRvhudOc,9465
167
+ synth_ai/learning/prompts/random_search.py,sha256=z87u41gpt377347ea1jpQisSryuLu6DQrldytZDzGCY,8321
168
+ synth_ai/learning/prompts/run_mipro_banking77.py,sha256=pae3ij_U_0SJ9I8VP4o2GGkXwiFY6M-dIzBLkVL7GHU,5308
169
+ synth_ai/learning/prompts/run_random_search_banking77.py,sha256=u3TvIJe2sXNV5hGDlOTYeQdPGwJk5lQ0CWf1mzeRuJ0,13236
160
170
  synth_ai/lm/__init__.py,sha256=aylYW_xWcQlRppFNfys7VtkNICMyYe6FMZmjVRN_BmM,1142
161
171
  synth_ai/lm/config.py,sha256=LW5QG-U2heRdvXQ9qi5NWExOF8yprQi-cCo817nf28g,3604
162
172
  synth_ai/lm/constants.py,sha256=ToYCu-ZeHgbb7VIRpDcCDV2D668P4UEHOKXM7urkp08,1248
173
+ synth_ai/lm/injection.py,sha256=8yzqoeuc530TqsAl1afZPhUnFaP7HZuRkh0IcyN0IpQ,2836
174
+ synth_ai/lm/overrides.py,sha256=R_H8L0_h1mHKGXvrsBV0FVpj0OWlhEBNx-7mLIlFiY8,6900
163
175
  synth_ai/lm/unified_interface.py,sha256=4rK0uU84w5tJObxZw6LqZOrPRrAAKd9R1Um2SYIVbbM,6474
164
176
  synth_ai/lm/warmup.py,sha256=_THQV-YUO7XQzH8IgHWRqxjISmN02K5E3iwS8HrvYOk,6791
165
177
  synth_ai/lm/caching/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -179,8 +191,8 @@ synth_ai/lm/cost/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
179
191
  synth_ai/lm/cost/monitor.py,sha256=DkeLUlrb7rGx3nZ04aADU9HXXu5mZTf_DBwT0xhzIv4,7
180
192
  synth_ai/lm/cost/statefulness.py,sha256=SO-H9_R1_KL110z_ceRIJzH6n8D9gpx-R1-_mtO7pNI,37
181
193
  synth_ai/lm/provider_support/__init__.py,sha256=4wd2x_gsRAVnGwHsK4nR0rlyIctPEpbZDETAtSh7doA,225
182
- synth_ai/lm/provider_support/anthropic.py,sha256=ohytXTK643SkBsm2bwwG7l0e0bIPja_LK5BYj8nUXqg,34431
183
- synth_ai/lm/provider_support/openai.py,sha256=T8rps5kc2HxKuSGO44SJNc55Qr7GVu7NCHRWeg7gO8U,38770
194
+ synth_ai/lm/provider_support/anthropic.py,sha256=Dh4j5Xwv1KEtTMXA6bg4yanWuh0tScClq2AZP0f83Ro,35630
195
+ synth_ai/lm/provider_support/openai.py,sha256=yxVL7DQToIUcYqgJRYK-Pev522jW6pkxrtkL13cPtb0,40159
184
196
  synth_ai/lm/provider_support/suppress_logging.py,sha256=CKk8yGVWUZT6YLqzALOf4PZ3WyqMC_DiUTx6vF9O0zo,1037
185
197
  synth_ai/lm/structured_outputs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
186
198
  synth_ai/lm/structured_outputs/handler.py,sha256=BrGuBT3XjPJBNR5YhrHQvu1wuJB9_q83ONDhxuJlFpo,17294
@@ -190,12 +202,12 @@ synth_ai/lm/tools/__init__.py,sha256=3JM5vqZqKloaeHaxuO49C8A_0qljys3pQ1yt70WKhho
190
202
  synth_ai/lm/tools/base.py,sha256=i4pXGXLbuU5paxIEpEwgb5cRYB-m4ovRZbftm17mXDM,5816
191
203
  synth_ai/lm/vendors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
192
204
  synth_ai/lm/vendors/base.py,sha256=g2u1Z2irv1EbMRmSE57_6xbInicW4yZM23lpqZZDaKo,2522
193
- synth_ai/lm/vendors/openai_standard.py,sha256=NqHXJAu1nyAoympz1H_YyLo3qRGDnQtnf8X3_E9BOu8,30127
205
+ synth_ai/lm/vendors/openai_standard.py,sha256=YjGfr3vJa5pEAc-q74jLd0WFiY0Wuj1cLdeoQExP7P0,31802
194
206
  synth_ai/lm/vendors/openai_standard_responses.py,sha256=P4-2QhxPfs4PRpqATOdGi_Yo2GW7XxbH_TEsYgXS458,10357
195
207
  synth_ai/lm/vendors/retries.py,sha256=DkLYngUdqiDnLPv5n-gV9Tdq1ChRxmA8emLSMTcZJwM,429
196
208
  synth_ai/lm/vendors/synth_client.py,sha256=uSZfsyr1cjW53tOVEuNUOCdfJuMvcTpmJ2WDtcpapBQ,16279
197
209
  synth_ai/lm/vendors/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
198
- synth_ai/lm/vendors/core/anthropic_api.py,sha256=GPKqai4RABMgk8t_0YLmYiuG_cZyE5g73AcGksNs470,13986
210
+ synth_ai/lm/vendors/core/anthropic_api.py,sha256=S8s-CMO5GhbQ_V4CmVaNICF56If3wmT0PmCszKvTSeg,15011
199
211
  synth_ai/lm/vendors/core/gemini_api.py,sha256=eCMhRSGH5ATAiszFuwGW1Nja6dgzvEOq4sZACjU4XrM,11274
200
212
  synth_ai/lm/vendors/core/mistral_api.py,sha256=vf_AK-zBwa0xICdQYBcIxxtK94pus94XafXhurR0T4I,11926
201
213
  synth_ai/lm/vendors/core/openai_api.py,sha256=Li9OIkvNltAtZN1MUw3RzEM0rp4PciM9SLM4y9OQmZ4,7140
@@ -279,9 +291,9 @@ synth_ai/v0/tracing_v1/events/manage.py,sha256=dgIlH43aEz7yA1_rj4IisJP6ROiROmLwD
279
291
  synth_ai/v0/tracing_v1/events/scope.py,sha256=BuBkhSpVHUJt8iGT9HJZF82rbb88mQcd2vM2shg-w2I,2550
280
292
  synth_ai/v0/tracing_v1/events/store.py,sha256=gVM3L_bV_PAEh9GD9eg2AQqNfANu-zH9ied7bAKk_Eg,9040
281
293
  synth_ai/zyk/__init__.py,sha256=6HFa13sdHCouhzKOUPEWcJeVxKlzjWO7ERsrrwtTugs,752
282
- synth_ai-0.2.4.dev5.dist-info/licenses/LICENSE,sha256=ynhjRQUfqA_RdGRATApfFA_fBAy9cno04sLtLUqxVFM,1069
283
- synth_ai-0.2.4.dev5.dist-info/METADATA,sha256=j8LGEHF6txGGKOR6MSHd2zPoUUkgS5QeZbsoS-EJids,7150
284
- synth_ai-0.2.4.dev5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
285
- synth_ai-0.2.4.dev5.dist-info/entry_points.txt,sha256=GSFXaJreq4PJXbixkUI0GHZwGh2dZDG5pYaoVmqr_KE,46
286
- synth_ai-0.2.4.dev5.dist-info/top_level.txt,sha256=fBmtZyVHuKaGa29oHBaaUkrUIWTqSpoVMPiVdCDP3k8,9
287
- synth_ai-0.2.4.dev5.dist-info/RECORD,,
294
+ synth_ai-0.2.4.dev6.dist-info/licenses/LICENSE,sha256=ynhjRQUfqA_RdGRATApfFA_fBAy9cno04sLtLUqxVFM,1069
295
+ synth_ai-0.2.4.dev6.dist-info/METADATA,sha256=89Oe0wNXNB8HhowQ3cRClzDFwoAXbWaHEiblVwmUF6g,7181
296
+ synth_ai-0.2.4.dev6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
297
+ synth_ai-0.2.4.dev6.dist-info/entry_points.txt,sha256=GSFXaJreq4PJXbixkUI0GHZwGh2dZDG5pYaoVmqr_KE,46
298
+ synth_ai-0.2.4.dev6.dist-info/top_level.txt,sha256=fBmtZyVHuKaGa29oHBaaUkrUIWTqSpoVMPiVdCDP3k8,9
299
+ synth_ai-0.2.4.dev6.dist-info/RECORD,,