synth-ai 0.2.7__tar.gz → 0.2.8__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.

Potentially problematic release.


This version of synth-ai might be problematic. Click here for more details.

Files changed (427) hide show
  1. {synth_ai-0.2.7/synth_ai.egg-info → synth_ai-0.2.8}/PKG-INFO +9 -7
  2. {synth_ai-0.2.7 → synth_ai-0.2.8}/README.md +7 -5
  3. {synth_ai-0.2.7 → synth_ai-0.2.8}/pyproject.toml +2 -2
  4. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/demo.py +44 -39
  5. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/root.py +6 -0
  6. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/core/cli.py +19 -25
  7. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/modal_task_app.py +9 -3
  8. synth_ai-0.2.8/synth_ai/handshake.py +107 -0
  9. {synth_ai-0.2.7 → synth_ai-0.2.8/synth_ai.egg-info}/PKG-INFO +9 -7
  10. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai.egg-info/requires.txt +1 -1
  11. synth_ai-0.2.7/synth_ai/handshake.py +0 -63
  12. {synth_ai-0.2.7 → synth_ai-0.2.8}/LICENSE +0 -0
  13. {synth_ai-0.2.7 → synth_ai-0.2.8}/MANIFEST.in +0 -0
  14. {synth_ai-0.2.7 → synth_ai-0.2.8}/setup.cfg +0 -0
  15. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/__init__.py +0 -0
  16. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/__main__.py +0 -0
  17. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/__init__.py +0 -0
  18. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/balance.py +0 -0
  19. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/calc.py +0 -0
  20. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/legacy_root_backup.py +0 -0
  21. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/man.py +0 -0
  22. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/recent.py +0 -0
  23. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/rl_demo.py +0 -0
  24. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/status.py +0 -0
  25. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/traces.py +0 -0
  26. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/watch.py +0 -0
  27. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/compound/cais.py +0 -0
  28. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/config/base_url.py +0 -0
  29. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/core/experiment.py +0 -0
  30. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/core/system.py +0 -0
  31. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/core/__init__.py +0 -0
  32. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/__init__.py +0 -0
  33. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/core.py +0 -0
  34. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/__init__.py +0 -0
  35. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/_common.py +0 -0
  36. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/app.py +0 -0
  37. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/config.toml +0 -0
  38. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/deploy_modal.py +0 -0
  39. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -0
  40. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/__init__.py +0 -0
  41. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/__init__.py +0 -0
  42. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/artifacts/__init__.py +0 -0
  43. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/artifacts/base.py +0 -0
  44. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/core.py +0 -0
  45. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/db/__init__.py +0 -0
  46. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/db/sqlite.py +0 -0
  47. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/registry.py +0 -0
  48. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/resources/sqlite.py +0 -0
  49. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/results.py +0 -0
  50. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/rewards/__init__.py +0 -0
  51. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/rewards/core.py +0 -0
  52. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/shared_engine.py +0 -0
  53. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/tools/__init__.py +0 -0
  54. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/__init__.py +0 -0
  55. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/bandit/__init__.py +0 -0
  56. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/bandit/engine.py +0 -0
  57. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/bandit/environment.py +0 -0
  58. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/bandit/taskset.py +0 -0
  59. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/__init__.py +0 -0
  60. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -0
  61. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -0
  62. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -0
  63. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -0
  64. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -0
  65. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -0
  66. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -0
  67. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -0
  68. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -0
  69. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -0
  70. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -0
  71. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -0
  72. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -0
  73. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -0
  74. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -0
  75. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -0
  76. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -0
  77. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -0
  78. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -0
  79. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -0
  80. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -0
  81. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -0
  82. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -0
  83. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -0
  84. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -0
  85. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -0
  86. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -0
  87. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -0
  88. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -0
  89. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -0
  90. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -0
  91. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -0
  92. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -0
  93. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -0
  94. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -0
  95. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -0
  96. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -0
  97. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -0
  98. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -0
  99. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -0
  100. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -0
  101. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -0
  102. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -0
  103. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -0
  104. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -0
  105. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -0
  106. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -0
  107. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -0
  108. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -0
  109. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -0
  110. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -0
  111. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -0
  112. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -0
  113. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -0
  114. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -0
  115. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -0
  116. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -0
  117. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -0
  118. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -0
  119. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -0
  120. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -0
  121. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -0
  122. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -0
  123. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -0
  124. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/config_logging.py +0 -0
  125. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
  126. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/engine.py +0 -0
  127. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -0
  128. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -0
  129. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -0
  130. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -0
  131. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/environment.py +0 -0
  132. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/taskset.py +0 -0
  133. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -0
  134. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -0
  135. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/__init__.py +0 -0
  136. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -0
  137. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -0
  138. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -0
  139. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -0
  140. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -0
  141. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -0
  142. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -0
  143. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -0
  144. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -0
  145. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -0
  146. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -0
  147. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/environment.py +0 -0
  148. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -0
  149. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -0
  150. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -0
  151. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -0
  152. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -0
  153. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -0
  154. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -0
  155. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -0
  156. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -0
  157. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -0
  158. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/engine.py +0 -0
  159. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/environment.py +0 -0
  160. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/taskset.py +0 -0
  161. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/units/keyword_stats.py +0 -0
  162. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/__init__.py +0 -0
  163. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -0
  164. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -0
  165. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -0
  166. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -0
  167. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/engine.py +0 -0
  168. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/environment.py +0 -0
  169. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/environment_mapping.py +0 -0
  170. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -0
  171. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/taskset.py +0 -0
  172. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/__init__.py +0 -0
  173. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/achievements.py +0 -0
  174. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -0
  175. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -0
  176. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -0
  177. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/engine.py +0 -0
  178. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/environment.py +0 -0
  179. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/__init__.py +0 -0
  180. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -0
  181. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -0
  182. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -0
  183. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -0
  184. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -0
  185. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -0
  186. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -0
  187. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/taskset.py +0 -0
  188. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/__init__.py +0 -0
  189. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/agent_demos/__init__.py +0 -0
  190. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/config_logging.py +0 -0
  191. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine.py +0 -0
  192. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -0
  193. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -0
  194. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -0
  195. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -0
  196. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -0
  197. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -0
  198. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -0
  199. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -0
  200. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -0
  201. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -0
  202. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -0
  203. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -0
  204. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -0
  205. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -0
  206. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -0
  207. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -0
  208. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -0
  209. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/environment.py +0 -0
  210. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/taskset.py +0 -0
  211. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/units/__init__.py +0 -0
  212. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/__init__.py +0 -0
  213. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -0
  214. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine.py +0 -0
  215. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -0
  216. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -0
  217. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -0
  218. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -0
  219. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -0
  220. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -0
  221. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -0
  222. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -0
  223. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -0
  224. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -0
  225. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -0
  226. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -0
  227. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/environment.py +0 -0
  228. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -0
  229. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -0
  230. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/taskset.py +0 -0
  231. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/units/astar_common.py +0 -0
  232. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/tictactoe/__init__.py +0 -0
  233. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/tictactoe/engine.py +0 -0
  234. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/tictactoe/environment.py +0 -0
  235. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/tictactoe/taskset.py +0 -0
  236. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/verilog/__init__.py +0 -0
  237. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/verilog/engine.py +0 -0
  238. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/verilog/environment.py +0 -0
  239. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/verilog/taskset.py +0 -0
  240. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/wordle/__init__.py +0 -0
  241. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/wordle/engine.py +0 -0
  242. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/wordle/environment.py +0 -0
  243. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -0
  244. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/wordle/taskset.py +0 -0
  245. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/reproducibility/core.py +0 -0
  246. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/reproducibility/helpers.py +0 -0
  247. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/reproducibility/tree.py +0 -0
  248. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/service/app.py +0 -0
  249. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/service/core_routes.py +0 -0
  250. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/service/external_registry.py +0 -0
  251. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/service/registry.py +0 -0
  252. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/stateful/__init__.py +0 -0
  253. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/stateful/core.py +0 -0
  254. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/stateful/engine.py +0 -0
  255. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/stateful/state.py +0 -0
  256. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/tasks/api.py +0 -0
  257. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/tasks/core.py +0 -0
  258. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/tasks/filters.py +0 -0
  259. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/tasks/utils.py +0 -0
  260. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/v0_observability/history.py +0 -0
  261. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/v0_observability/log.py +0 -0
  262. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/evals/base.py +0 -0
  263. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/experimental/synth_oss.py +0 -0
  264. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/http.py +0 -0
  265. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/http_client.py +0 -0
  266. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/inference/__init__.py +0 -0
  267. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/inference/client.py +0 -0
  268. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/install_sqld.sh +0 -0
  269. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/jobs/client.py +0 -0
  270. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/__init__.py +0 -0
  271. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/client.py +0 -0
  272. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/config.py +0 -0
  273. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/constants.py +0 -0
  274. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/core.py +0 -0
  275. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/filtering.py +0 -0
  276. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/ft_client.py +0 -0
  277. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/gateway.py +0 -0
  278. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/health.py +0 -0
  279. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/jobs.py +0 -0
  280. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/offline/dpo.py +0 -0
  281. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/offline/providers.py +0 -0
  282. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/offline/sft.py +0 -0
  283. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/offline/shared.py +0 -0
  284. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/online/grpo.py +0 -0
  285. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/online/irft.py +0 -0
  286. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/banking77_injection_eval.py +0 -0
  287. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/gepa.py +0 -0
  288. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +0 -0
  289. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/mipro.py +0 -0
  290. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/random_search.py +0 -0
  291. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/run_mipro_banking77.py +0 -0
  292. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/run_random_search_banking77.py +0 -0
  293. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/rl_client.py +0 -0
  294. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/sse.py +0 -0
  295. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/validators.py +0 -0
  296. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/__init__.py +0 -0
  297. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/__init__.py +0 -0
  298. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/constants.py +0 -0
  299. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/dbs.py +0 -0
  300. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/ephemeral.py +0 -0
  301. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/handler.py +0 -0
  302. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/initialize.py +0 -0
  303. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/persistent.py +0 -0
  304. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/config.py +0 -0
  305. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/constants.py +0 -0
  306. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/__init__.py +0 -0
  307. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/all.py +0 -0
  308. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/exceptions.py +0 -0
  309. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/main.py +0 -0
  310. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/main_v3.py +0 -0
  311. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/synth_models.py +0 -0
  312. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/vendor_clients.py +0 -0
  313. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/cost/__init__.py +0 -0
  314. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/cost/monitor.py +0 -0
  315. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/cost/statefulness.py +0 -0
  316. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/injection.py +0 -0
  317. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/overrides.py +0 -0
  318. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/provider_support/__init__.py +0 -0
  319. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/provider_support/anthropic.py +0 -0
  320. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/provider_support/openai.py +0 -0
  321. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/provider_support/suppress_logging.py +0 -0
  322. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/structured_outputs/__init__.py +0 -0
  323. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/structured_outputs/handler.py +0 -0
  324. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/structured_outputs/inject.py +0 -0
  325. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/structured_outputs/rehabilitate.py +0 -0
  326. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/tools/__init__.py +0 -0
  327. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/tools/base.py +0 -0
  328. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/unified_interface.py +0 -0
  329. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/__init__.py +0 -0
  330. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/base.py +0 -0
  331. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/__init__.py +0 -0
  332. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/anthropic_api.py +0 -0
  333. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/gemini_api.py +0 -0
  334. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/mistral_api.py +0 -0
  335. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/openai_api.py +0 -0
  336. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/synth_dev_api.py +0 -0
  337. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/local/__init__.py +0 -0
  338. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/local/ollama.py +0 -0
  339. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/openai_standard.py +0 -0
  340. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/openai_standard_responses.py +0 -0
  341. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/retries.py +0 -0
  342. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/__init__.py +0 -0
  343. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/custom_endpoint.py +0 -0
  344. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/deepseek.py +0 -0
  345. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/grok.py +0 -0
  346. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/groq.py +0 -0
  347. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/ollama.py +0 -0
  348. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/openrouter.py +0 -0
  349. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/together.py +0 -0
  350. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/synth_client.py +0 -0
  351. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/warmup.py +0 -0
  352. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/rl/__init__.py +0 -0
  353. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/rl/contracts.py +0 -0
  354. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/rl/env_keys.py +0 -0
  355. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/rl/secrets.py +0 -0
  356. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/scripts/verify_rewards.py +0 -0
  357. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/task/__init__.py +0 -0
  358. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/task/contracts.py +0 -0
  359. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/task/health.py +0 -0
  360. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/task/validators.py +0 -0
  361. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing/__init__.py +0 -0
  362. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v1/__init__.py +0 -0
  363. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/__init__.py +0 -0
  364. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/abstractions.py +0 -0
  365. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/config.py +0 -0
  366. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/db_config.py +0 -0
  367. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/decorators.py +0 -0
  368. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/examples/basic_usage.py +0 -0
  369. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/hooks.py +0 -0
  370. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/llm_call_record_helpers.py +0 -0
  371. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/lm_call_record_abstractions.py +0 -0
  372. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/migration_helper.py +0 -0
  373. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/replica_sync.py +0 -0
  374. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/session_tracer.py +0 -0
  375. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/__init__.py +0 -0
  376. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/base.py +0 -0
  377. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/config.py +0 -0
  378. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/exceptions.py +0 -0
  379. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/factory.py +0 -0
  380. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/types.py +0 -0
  381. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/utils.py +0 -0
  382. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/turso/__init__.py +0 -0
  383. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/turso/daemon.py +0 -0
  384. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/turso/manager.py +0 -0
  385. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/turso/models.py +0 -0
  386. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/utils.py +0 -0
  387. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/__init__.py +0 -0
  388. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/abstractions.py +0 -0
  389. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/base_client.py +0 -0
  390. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/client_manager.py +0 -0
  391. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/config.py +0 -0
  392. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/context.py +0 -0
  393. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/decorators.py +0 -0
  394. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/events/__init__.py +0 -0
  395. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/events/manage.py +0 -0
  396. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/events/scope.py +0 -0
  397. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/events/store.py +0 -0
  398. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/immediate_client.py +0 -0
  399. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/local.py +0 -0
  400. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/log_client_base.py +0 -0
  401. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/retry_queue.py +0 -0
  402. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/trackers.py +0 -0
  403. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/upload.py +0 -0
  404. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/utils.py +0 -0
  405. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/__init__.py +0 -0
  406. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/abstractions.py +0 -0
  407. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/base_client.py +0 -0
  408. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/client_manager.py +0 -0
  409. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/config.py +0 -0
  410. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/context.py +0 -0
  411. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/decorators.py +0 -0
  412. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/events/__init__.py +0 -0
  413. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/events/manage.py +0 -0
  414. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/events/scope.py +0 -0
  415. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/events/store.py +0 -0
  416. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/immediate_client.py +0 -0
  417. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/local.py +0 -0
  418. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/log_client_base.py +0 -0
  419. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/retry_queue.py +0 -0
  420. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/trackers.py +0 -0
  421. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/upload.py +0 -0
  422. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/utils.py +0 -0
  423. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/zyk/__init__.py +0 -0
  424. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai.egg-info/SOURCES.txt +0 -0
  425. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai.egg-info/dependency_links.txt +0 -0
  426. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai.egg-info/entry_points.txt +0 -0
  427. {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Summary: RL as a service SDK - Core AI functionality and tracing
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -53,7 +53,7 @@ Requires-Dist: asyncpg>=0.30.0
53
53
  Requires-Dist: aiohttp>=3.8.0
54
54
  Requires-Dist: datasets>=4.0.0
55
55
  Requires-Dist: transformers>=4.56.1
56
- Requires-Dist: modal>=1.1.4
56
+ Requires-Dist: modal>=1.1.0
57
57
  Provides-Extra: dev
58
58
  Requires-Dist: build>=1.2.2.post1; extra == "dev"
59
59
  Requires-Dist: twine>=4.0.0; extra == "dev"
@@ -98,16 +98,17 @@ synth-ai comes with a built-in RL example tailored for training Qwen/Qwen3-0.6B
98
98
  Please create an account at [Synth](https://usesynth.ai) and [Modal](https://modal.com) for the Math hello‑world test run. Then run:
99
99
 
100
100
  ```bash
101
- uvx synth-ai rl_demo setup
102
- uvx synth-ai rl_demo deploy
101
+ uvx synth-ai demo
102
+ uvx synth-ai setup
103
+ uvx synth-ai deploy
103
104
  uvx synth-ai run
104
105
  ```
105
106
 
106
107
  To walk through kicking off your first RL run, see the [Synth‑AI Documentation](https://docs.usesynth.ai/synth-ai/introduction).
107
108
 
108
- ### What `rl_demo setup` does now
109
+ ### What `setup` does now
109
110
 
110
- When you run `uvx synth-ai rl_demo setup`, the SDK opens your browser to the Synth dashboard for a one‑time pairing (handshake) with your signed‑in session. The SDK will automatically:
111
+ When you run `uvx synth-ai setup` (or the legacy `uvx synth-ai rl_demo setup`), the SDK opens your browser to the Synth dashboard for a one‑time pairing (handshake) with your signed‑in session. The SDK will automatically:
111
112
 
112
113
  - Detect your current user and organization
113
114
  - Ensure both API keys exist for that user+org
@@ -124,5 +125,6 @@ If your browser isn’t already signed in, sign in when prompted and the pairing
124
125
 
125
126
  Environment variables:
126
127
 
127
- - `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `http://localhost:3000`).
128
+ - `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `https://www.usesynth.ai/dashboard`).
129
+ - `SYNTH_CANONICAL_DEV` (optional): set to `1`, `true`, `yes`, or `on` to target the local dashboard at `http://localhost:3000`.
128
130
  - Keys are stored only in your project’s `.env` file, not exported to your shell.
@@ -24,16 +24,17 @@ synth-ai comes with a built-in RL example tailored for training Qwen/Qwen3-0.6B
24
24
  Please create an account at [Synth](https://usesynth.ai) and [Modal](https://modal.com) for the Math hello‑world test run. Then run:
25
25
 
26
26
  ```bash
27
- uvx synth-ai rl_demo setup
28
- uvx synth-ai rl_demo deploy
27
+ uvx synth-ai demo
28
+ uvx synth-ai setup
29
+ uvx synth-ai deploy
29
30
  uvx synth-ai run
30
31
  ```
31
32
 
32
33
  To walk through kicking off your first RL run, see the [Synth‑AI Documentation](https://docs.usesynth.ai/synth-ai/introduction).
33
34
 
34
- ### What `rl_demo setup` does now
35
+ ### What `setup` does now
35
36
 
36
- When you run `uvx synth-ai rl_demo setup`, the SDK opens your browser to the Synth dashboard for a one‑time pairing (handshake) with your signed‑in session. The SDK will automatically:
37
+ When you run `uvx synth-ai setup` (or the legacy `uvx synth-ai rl_demo setup`), the SDK opens your browser to the Synth dashboard for a one‑time pairing (handshake) with your signed‑in session. The SDK will automatically:
37
38
 
38
39
  - Detect your current user and organization
39
40
  - Ensure both API keys exist for that user+org
@@ -50,5 +51,6 @@ If your browser isn’t already signed in, sign in when prompted and the pairing
50
51
 
51
52
  Environment variables:
52
53
 
53
- - `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `http://localhost:3000`).
54
+ - `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `https://www.usesynth.ai/dashboard`).
55
+ - `SYNTH_CANONICAL_DEV` (optional): set to `1`, `true`, `yes`, or `on` to target the local dashboard at `http://localhost:3000`.
54
56
  - Keys are stored only in your project’s `.env` file, not exported to your shell.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synth-ai"
3
- version = "0.2.7"
3
+ version = "0.2.8"
4
4
  description = "RL as a service SDK - Core AI functionality and tracing"
5
5
  authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
6
6
  license = "MIT"
@@ -55,7 +55,7 @@ dependencies = [
55
55
  "aiohttp>=3.8.0", # For async HTTP requests in Harmony integration
56
56
  "datasets>=4.0.0",
57
57
  "transformers>=4.56.1",
58
- "modal>=1.1.4",
58
+ "modal>=1.1.0",
59
59
  ]
60
60
 
61
61
  [project.scripts]
@@ -35,60 +35,65 @@ def _forward_to_new(args: list[str]) -> None:
35
35
 
36
36
  def register(cli):
37
37
  @cli.group("demo", invoke_without_command=True)
38
+ @click.option("--force", is_flag=True, help="Overwrite existing files in CWD when initializing demo")
38
39
  @click.option("--list", "list_only", is_flag=True, help="List available legacy demos and exit")
39
40
  @click.option("-f", "filter_term", default="", help="Filter legacy demos by substring")
40
41
  @click.pass_context
41
- def demo(ctx: click.Context, list_only: bool, filter_term: str):
42
+ def demo(ctx: click.Context, force: bool, list_only: bool, filter_term: str):
42
43
  """Demo helpers.
43
44
 
44
- - Legacy mode (no subcommand): find and run examples/*/run_demo.sh
45
+ - Default (no subcommand): initialize RL demo files into ./synth_demo/ (alias of rl_demo init)
46
+ - Legacy mode: with --list, find and run examples/*/run_demo.sh
45
47
  - New RL demo subcommands: deploy, configure, run
46
48
  """
47
49
  if ctx.invoked_subcommand is not None:
48
50
  return
49
- # Legacy behavior: interactive examples runner
50
- repo_root = Path(os.getcwd())
51
- examples_dir = repo_root / "examples"
52
- demos = _find_demo_scripts(examples_dir)
53
- if filter_term:
54
- demos = [p for p in demos if filter_term.lower() in str(p).lower()]
55
-
56
- if not demos:
57
- click.echo("No run_demo.sh scripts found under examples/.")
58
- return
59
51
 
52
+ # If explicitly asked to list legacy demos, show interactive picker
60
53
  if list_only:
54
+ repo_root = Path(os.getcwd())
55
+ examples_dir = repo_root / "examples"
56
+ demos = _find_demo_scripts(examples_dir)
57
+ if filter_term:
58
+ demos = [p for p in demos if filter_term.lower() in str(p).lower()]
59
+
60
+ if not demos:
61
+ click.echo("No run_demo.sh scripts found under examples/.")
62
+ return
63
+
61
64
  click.echo("Available demos:")
62
- for p in demos:
63
- click.echo(f" - {p.relative_to(repo_root)}")
64
- return
65
+ for idx, p in enumerate(demos, start=1):
66
+ click.echo(f" {idx}. {p.relative_to(repo_root)}")
67
+ click.echo("")
68
+
69
+ def _validate_choice(val: str) -> int:
70
+ try:
71
+ i = int(val)
72
+ except Exception as err:
73
+ raise click.BadParameter("Enter a number from the list") from err
74
+ if i < 1 or i > len(demos):
75
+ raise click.BadParameter(f"Choose a number between 1 and {len(demos)}")
76
+ return i
65
77
 
66
- click.echo("Available demos:")
67
- for idx, p in enumerate(demos, start=1):
68
- click.echo(f" {idx}. {p.relative_to(repo_root)}")
69
- click.echo("")
78
+ choice = click.prompt("Select a demo to run", value_proc=_validate_choice)
79
+ script = demos[choice - 1]
80
+
81
+ click.echo("")
82
+ click.echo(f"🚀 Running {script.relative_to(repo_root)}\n")
70
83
 
71
- def _validate_choice(val: str) -> int:
72
84
  try:
73
- i = int(val)
74
- except Exception as err:
75
- raise click.BadParameter("Enter a number from the list") from err
76
- if i < 1 or i > len(demos):
77
- raise click.BadParameter(f"Choose a number between 1 and {len(demos)}")
78
- return i
79
-
80
- choice = click.prompt("Select a demo to run", value_proc=_validate_choice)
81
- script = demos[choice - 1]
82
-
83
- click.echo("")
84
- click.echo(f"🚀 Running {script.relative_to(repo_root)}\n")
85
-
86
- try:
87
- subprocess.run(["bash", str(script)], check=True)
88
- except subprocess.CalledProcessError as e:
89
- click.echo(f"❌ Demo exited with non-zero status: {e.returncode}")
90
- except KeyboardInterrupt:
91
- click.echo("\n🛑 Demo interrupted by user")
85
+ subprocess.run(["bash", str(script)], check=True)
86
+ except subprocess.CalledProcessError as e:
87
+ click.echo(f" Demo exited with non-zero status: {e.returncode}")
88
+ except KeyboardInterrupt:
89
+ click.echo("\n🛑 Demo interrupted by user")
90
+ return
91
+
92
+ # Default: forward to RL demo init behavior, optionally with --force
93
+ args: list[str] = ["rl_demo.init"]
94
+ if force:
95
+ args.append("--force")
96
+ _forward_to_new(args)
92
97
 
93
98
  # (prepare command removed; configure now prepares baseline TOML)
94
99
 
@@ -142,6 +142,12 @@ def run(batch_size: int | None, group_size: int | None, model: str | None, timeo
142
142
  _forward_to_demo(args)
143
143
 
144
144
 
145
+ @cli.command()
146
+ def setup():
147
+ """Perform SDK handshake and write keys to .env."""
148
+ _forward_to_demo(["rl_demo.setup"])
149
+
150
+
145
151
  @cli.command()
146
152
  @click.option("--db-file", default="traces/v3/synth_ai.db", help="Database file path")
147
153
  @click.option("--sqld-port", default=8080, type=int, help="Port for sqld HTTP interface")
@@ -66,15 +66,6 @@ def cmd_setup(_args: argparse.Namespace) -> int:
66
66
  env = demo_core.load_env()
67
67
  local_env = demo_core.load_dotenv_file(cwd_env_path)
68
68
 
69
- def _is_modal_public_url(u: str) -> bool:
70
- try:
71
- s = (u or "").strip().lower()
72
- if not (s.startswith("http://") or s.startswith("https://")):
73
- return False
74
- return (".modal.run" in s) and ("modal.local" not in s) and ("pypi-mirror" not in s)
75
- except Exception:
76
- return False
77
-
78
69
  def _maybe_fix_task_url() -> None:
79
70
  if not env.task_app_name:
80
71
  return
@@ -772,7 +763,10 @@ def cmd_deploy(args: argparse.Namespace) -> int:
772
763
  raise FileNotFoundError(f"App file not found: {app_path}")
773
764
  # Surface the app path before asking for the name
774
765
  print(f"Using task app: {app_path}")
775
- suggested_name = args.name or f"synth-{os.path.splitext(os.path.basename(app_path))[0]}"
766
+ existing_name = (args.name or env.task_app_name or "").strip()
767
+ if not existing_name:
768
+ existing_name = f"synth-{os.path.splitext(os.path.basename(app_path))[0]}"
769
+ suggested_name = existing_name
776
770
  name_in = input(f"Modal app name [{suggested_name}]: ").strip() or suggested_name
777
771
  app_name = name_in
778
772
  print("\nAbout to deploy with:")
@@ -783,7 +777,11 @@ def cmd_deploy(args: argparse.Namespace) -> int:
783
777
  print("Aborted by user.")
784
778
  return 1
785
779
 
786
- secret_name = (env.task_app_secret_name or "").strip() or f"{name_in}-secret"
780
+ prev_secret = (env.task_app_secret_name or "").strip()
781
+ default_secret = f"{name_in}-secret"
782
+ secret_name = default_secret if not prev_secret else prev_secret
783
+ if prev_secret and prev_secret != default_secret:
784
+ secret_name = default_secret
787
785
  existing_env_key = (env.env_api_key or "").strip()
788
786
  env_key: str | None = existing_env_key or None
789
787
  if existing_env_key:
@@ -808,24 +806,24 @@ def cmd_deploy(args: argparse.Namespace) -> int:
808
806
  print("[deploy] Minted new ENVIRONMENT_API_KEY")
809
807
 
810
808
  # Optionally upload the new key to the backend using sealed box helper
811
- backend_base = env.dev_backend_url or ""
809
+ backend_base = (env.dev_backend_url or "").rstrip("/")
812
810
  synth_key = (env.synth_api_key or os.environ.get("SYNTH_API_KEY") or local_env.get("SYNTH_API_KEY") or "").strip()
813
811
  if backend_base and synth_key:
814
- backend_base = backend_base.rstrip("/")
815
- if not backend_base.endswith("/api"):
816
- backend_base = f"{backend_base}/api"
812
+ # Pass a base WITHOUT trailing /api to setup_environment_api_key,
813
+ # since it appends /api/v1/... internally.
814
+ non_api_base = backend_base[:-4] if backend_base.endswith("/api") else backend_base
817
815
  try:
818
816
  choice = input(
819
- f"Upload ENVIRONMENT_API_KEY to backend {backend_base}? [Y/n]: "
817
+ f"Upload ENVIRONMENT_API_KEY to backend {non_api_base}? [Y/n]: "
820
818
  ).strip().lower() or "y"
821
819
  except Exception:
822
820
  choice = "y"
823
821
  if choice.startswith("y"):
824
822
  try:
825
- print(f"[deploy] Uploading ENVIRONMENT_API_KEY to {backend_base} …")
823
+ print(f"[deploy] Uploading ENVIRONMENT_API_KEY to {non_api_base} …")
826
824
  from synth_ai.rl.env_keys import setup_environment_api_key
827
825
 
828
- setup_environment_api_key(backend_base.rstrip("/"), synth_key, token=env_key)
826
+ setup_environment_api_key(non_api_base, synth_key, token=env_key)
829
827
  print("[deploy] Backend sealed-box upload complete.")
830
828
  except Exception as upload_err:
831
829
  print(f"[deploy] Failed to upload ENVIRONMENT_API_KEY: {upload_err}")
@@ -926,7 +924,7 @@ def cmd_deploy(args: argparse.Namespace) -> int:
926
924
  print(f" export TASK_APP_NAME={app_name}")
927
925
  print(f" export TASK_APP_SECRET_NAME={app_name}-secret")
928
926
  print(f"Persisted to {dotenv_path}")
929
- print("Next: uvx synth-ai run")
927
+ print("\nNext step:\n$ uvx synth-ai run")
930
928
  return 0
931
929
  except Exception as e:
932
930
  print(f"Deploy error: {e}")
@@ -1079,11 +1077,7 @@ fi
1079
1077
  if os.path.exists(dst_cfg):
1080
1078
  print(f" - {dst_cfg} (seeded)")
1081
1079
  print("")
1082
- print("Next steps:")
1083
- print(" 1) cd synth_demo && put your ENVIRONMENT_API_KEY in ./.env")
1084
- print(" 2) Deploy to Modal:")
1085
- print(" uvx bash ./deploy_task_app.sh")
1086
- print(" 3) From project root, run: uvx synth-ai run")
1080
+ print("\nNext step:\n$ uvx synth-ai setup")
1087
1081
  return 0
1088
1082
  except Exception as e:
1089
1083
  print(f"Init error: {e}")
@@ -1372,7 +1366,7 @@ def main(argv: list[str] | None = None) -> int:
1372
1366
  def _deploy_opts(parser):
1373
1367
  parser.add_argument("--local", action="store_true", help="Run local FastAPI instead of Modal deploy")
1374
1368
  parser.add_argument("--app", type=str, default=None, help="Path to Modal app.py for uv run modal deploy")
1375
- parser.add_argument("--name", type=str, default="synth-math-demo", help="Modal app name")
1369
+ parser.add_argument("--name", type=str, default=None, help="Modal app name")
1376
1370
  parser.add_argument("--script", type=str, default=None, help="Path to deploy_task_app.sh (optional legacy)")
1377
1371
  parser.set_defaults(func=cmd_deploy)
1378
1372
 
@@ -43,7 +43,15 @@ if _SYNTH_HOSTED is not None:
43
43
  # No extra local dirs required; app is self-contained
44
44
 
45
45
  app = App("hendrycks-math-task-app")
46
- _SECRET_NAME = os.getenv("MATH_TASK_APP_SECRET", "crafter-environment-sdk")
46
+ _SECRET_NAME = (
47
+ os.getenv("TASK_APP_SECRET_NAME")
48
+ or os.getenv("MATH_TASK_APP_SECRET")
49
+ or os.getenv("TASK_APP_NAME", "").strip()
50
+ )
51
+ if not _SECRET_NAME:
52
+ _SECRET_NAME = "synth-math-demo-secret"
53
+ elif not _SECRET_NAME.endswith("-secret"):
54
+ _SECRET_NAME = f"{_SECRET_NAME}-secret"
47
55
 
48
56
 
49
57
  @app.function(
@@ -411,5 +419,3 @@ def fastapi_app():
411
419
  }
412
420
 
413
421
  return api
414
-
415
-
@@ -0,0 +1,107 @@
1
+ from __future__ import annotations
2
+ import os
3
+ import time
4
+ import webbrowser
5
+ from typing import Any, Dict, Tuple
6
+ from urllib.parse import urljoin, urlsplit, urlunsplit
7
+
8
+ import requests
9
+
10
+
11
+ class HandshakeError(Exception):
12
+ pass
13
+
14
+
15
+ _TRUTHY = {"1", "true", "yes", "on"}
16
+
17
+
18
+ def _origin() -> str:
19
+ """Resolve the dashboard origin for the browser handshake.
20
+
21
+ Priority order:
22
+ 1. Explicit ``SYNTH_CANONICAL_ORIGIN`` override.
23
+ 2. Development flag ``SYNTH_CANONICAL_DEV`` (case-insensitive truthy) → localhost.
24
+ 3. Production dashboard at ``https://www.usesynth.ai/dashboard``.
25
+ """
26
+
27
+ override = (os.getenv("SYNTH_CANONICAL_ORIGIN") or "").strip()
28
+ if override:
29
+ return override.rstrip("/")
30
+
31
+ dev_flag = (os.getenv("SYNTH_CANONICAL_DEV") or "").strip().lower()
32
+ if dev_flag in _TRUTHY:
33
+ print("USING DEV ORIGIN")
34
+ return "http://localhost:3000"
35
+
36
+ return "https://www.usesynth.ai/dashboard"
37
+
38
+
39
+ def _split_origin(origin: str) -> tuple[str, str]:
40
+ parsed = urlsplit(origin)
41
+ bare = urlunsplit((parsed.scheme, parsed.netloc, "", "", ""))
42
+ path = parsed.path.rstrip("/")
43
+ return bare, path
44
+
45
+
46
+ def _ensure_verification_uri(data: Dict[str, Any], base_with_path: str) -> None:
47
+ uri = data.get("verification_uri")
48
+ if not isinstance(uri, str) or not uri:
49
+ return
50
+ if uri.startswith("http://") or uri.startswith("https://"):
51
+ return
52
+ data["verification_uri"] = urljoin(base_with_path.rstrip("/") + "/", uri.lstrip("/"))
53
+
54
+
55
+ def start_handshake_session(origin: str | None = None) -> Tuple[str, str, int, int]:
56
+ base = (origin or _origin()).rstrip("/")
57
+ api_origin, _ = _split_origin(base)
58
+ url = urljoin(api_origin.rstrip("/") + "/", "api/sdk/handshake/init")
59
+ r = requests.post(url, timeout=10)
60
+ if r.status_code != 200:
61
+ raise HandshakeError(f"init failed: {r.status_code} {r.text}")
62
+ try:
63
+ data = r.json()
64
+ except ValueError as exc: # pragma: no cover - network dependent
65
+ raise HandshakeError(f"init returned malformed JSON: {exc}") from exc
66
+ _ensure_verification_uri(data, base)
67
+ return (
68
+ str(data.get("device_code")),
69
+ str(data.get("verification_uri")),
70
+ int(data.get("expires_in", 600)),
71
+ int(data.get("interval", 3)),
72
+ )
73
+
74
+
75
+ def poll_handshake_token(device_code: str, origin: str | None = None, *, timeout_s: int | None = None) -> Dict[str, Any]:
76
+ base = (origin or _origin()).rstrip("/")
77
+ api_origin, _ = _split_origin(base)
78
+ url = urljoin(api_origin.rstrip("/") + "/", "api/sdk/handshake/token")
79
+ deadline = time.time() + (timeout_s or 600)
80
+ while True:
81
+ if time.time() > deadline:
82
+ raise HandshakeError("handshake timed out")
83
+ try:
84
+ r = requests.post(url, json={"device_code": device_code}, timeout=10)
85
+ except Exception as e:
86
+ time.sleep(2)
87
+ continue
88
+ if r.status_code == 200:
89
+ try:
90
+ data = r.json()
91
+ except ValueError as exc: # pragma: no cover - network dependent
92
+ raise HandshakeError(f"token returned malformed JSON: {exc}") from exc
93
+ _ensure_verification_uri(data, base)
94
+ return data
95
+ elif r.status_code in (404, 410):
96
+ raise HandshakeError(f"handshake failed: {r.status_code}")
97
+ # 428 authorization_pending or others → wait and retry
98
+ time.sleep(2)
99
+
100
+
101
+ def run_handshake(origin: str | None = None) -> Dict[str, Any]:
102
+ device_code, verification_uri, expires_in, interval = start_handshake_session(origin)
103
+ try:
104
+ webbrowser.open(verification_uri)
105
+ except Exception:
106
+ pass
107
+ return poll_handshake_token(device_code, origin, timeout_s=expires_in)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Summary: RL as a service SDK - Core AI functionality and tracing
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -53,7 +53,7 @@ Requires-Dist: asyncpg>=0.30.0
53
53
  Requires-Dist: aiohttp>=3.8.0
54
54
  Requires-Dist: datasets>=4.0.0
55
55
  Requires-Dist: transformers>=4.56.1
56
- Requires-Dist: modal>=1.1.4
56
+ Requires-Dist: modal>=1.1.0
57
57
  Provides-Extra: dev
58
58
  Requires-Dist: build>=1.2.2.post1; extra == "dev"
59
59
  Requires-Dist: twine>=4.0.0; extra == "dev"
@@ -98,16 +98,17 @@ synth-ai comes with a built-in RL example tailored for training Qwen/Qwen3-0.6B
98
98
  Please create an account at [Synth](https://usesynth.ai) and [Modal](https://modal.com) for the Math hello‑world test run. Then run:
99
99
 
100
100
  ```bash
101
- uvx synth-ai rl_demo setup
102
- uvx synth-ai rl_demo deploy
101
+ uvx synth-ai demo
102
+ uvx synth-ai setup
103
+ uvx synth-ai deploy
103
104
  uvx synth-ai run
104
105
  ```
105
106
 
106
107
  To walk through kicking off your first RL run, see the [Synth‑AI Documentation](https://docs.usesynth.ai/synth-ai/introduction).
107
108
 
108
- ### What `rl_demo setup` does now
109
+ ### What `setup` does now
109
110
 
110
- When you run `uvx synth-ai rl_demo setup`, the SDK opens your browser to the Synth dashboard for a one‑time pairing (handshake) with your signed‑in session. The SDK will automatically:
111
+ When you run `uvx synth-ai setup` (or the legacy `uvx synth-ai rl_demo setup`), the SDK opens your browser to the Synth dashboard for a one‑time pairing (handshake) with your signed‑in session. The SDK will automatically:
111
112
 
112
113
  - Detect your current user and organization
113
114
  - Ensure both API keys exist for that user+org
@@ -124,5 +125,6 @@ If your browser isn’t already signed in, sign in when prompted and the pairing
124
125
 
125
126
  Environment variables:
126
127
 
127
- - `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `http://localhost:3000`).
128
+ - `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `https://www.usesynth.ai/dashboard`).
129
+ - `SYNTH_CANONICAL_DEV` (optional): set to `1`, `true`, `yes`, or `on` to target the local dashboard at `http://localhost:3000`.
128
130
  - Keys are stored only in your project’s `.env` file, not exported to your shell.
@@ -41,7 +41,7 @@ asyncpg>=0.30.0
41
41
  aiohttp>=3.8.0
42
42
  datasets>=4.0.0
43
43
  transformers>=4.56.1
44
- modal>=1.1.4
44
+ modal>=1.1.0
45
45
 
46
46
  [all]
47
47
  crafter>=1.8.3
@@ -1,63 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- import os
5
- import time
6
- import webbrowser
7
- from typing import Any, Dict, Tuple
8
-
9
- import requests
10
-
11
-
12
- class HandshakeError(Exception):
13
- pass
14
-
15
-
16
- def _origin() -> str:
17
- # Prefer explicit env; fallback to localhost dashboard
18
- return (os.getenv("SYNTH_CANONICAL_ORIGIN", "") or "http://localhost:3000").rstrip("/")
19
-
20
-
21
- def start_handshake_session(origin: str | None = None) -> Tuple[str, str, int, int]:
22
- base = (origin or _origin()).rstrip("/")
23
- url = f"{base}/api/sdk/handshake/init"
24
- r = requests.post(url, timeout=10)
25
- if r.status_code != 200:
26
- raise HandshakeError(f"init failed: {r.status_code} {r.text}")
27
- data = r.json()
28
- return (
29
- str(data.get("device_code")),
30
- str(data.get("verification_uri")),
31
- int(data.get("expires_in", 600)),
32
- int(data.get("interval", 3)),
33
- )
34
-
35
-
36
- def poll_handshake_token(device_code: str, origin: str | None = None, *, timeout_s: int | None = None) -> Dict[str, Any]:
37
- base = (origin or _origin()).rstrip("/")
38
- url = f"{base}/api/sdk/handshake/token"
39
- deadline = time.time() + (timeout_s or 600)
40
- while True:
41
- if time.time() > deadline:
42
- raise HandshakeError("handshake timed out")
43
- try:
44
- r = requests.post(url, json={"device_code": device_code}, timeout=10)
45
- except Exception as e:
46
- time.sleep(2)
47
- continue
48
- if r.status_code == 200:
49
- return r.json()
50
- elif r.status_code in (404, 410):
51
- raise HandshakeError(f"handshake failed: {r.status_code}")
52
- # 428 authorization_pending or others → wait and retry
53
- time.sleep(2)
54
-
55
-
56
- def run_handshake(origin: str | None = None) -> Dict[str, Any]:
57
- device_code, verification_uri, expires_in, interval = start_handshake_session(origin)
58
- try:
59
- webbrowser.open(verification_uri)
60
- except Exception:
61
- pass
62
- return poll_handshake_token(device_code, origin, timeout_s=expires_in)
63
-
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes