synth-ai 0.2.9.dev5__py3-none-any.whl → 0.2.9.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.

Potentially problematic release.


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

Files changed (351) hide show
  1. examples/__init__.py +16 -0
  2. examples/crafter_debug_render.py +23 -17
  3. examples/qwen_coder/README.md +102 -0
  4. examples/qwen_coder/_shared.py +113 -0
  5. examples/qwen_coder/configs/coder_lora_30b.toml +61 -0
  6. examples/qwen_coder/configs/coder_lora_4b.toml +57 -0
  7. examples/qwen_coder/configs/coder_lora_small.toml +58 -0
  8. examples/qwen_coder/generate_dataset.py +98 -0
  9. examples/qwen_coder/infer_ft_smoke.py +64 -0
  10. examples/qwen_coder/infer_prod_proxy.py +73 -0
  11. examples/qwen_coder/infer_via_synth.py +87 -0
  12. examples/qwen_coder/scripts/infer_coder.sh +18 -0
  13. examples/qwen_coder/scripts/train_coder_30b.sh +21 -0
  14. examples/qwen_coder/sft_full_17b.py +103 -0
  15. examples/qwen_coder/sft_lora_30b.py +110 -0
  16. examples/qwen_coder/subset_jsonl.py +38 -0
  17. examples/qwen_coder/validate_jsonl.py +59 -0
  18. examples/rl/configs/eval_base_qwen.toml +1 -1
  19. examples/rl/configs/rl_from_base_qwen17.toml +1 -1
  20. examples/rl/download_dataset.py +26 -10
  21. examples/rl/run_eval.py +53 -52
  22. examples/rl/run_rl_and_save.py +29 -12
  23. examples/rl/task_app/math_single_step.py +180 -41
  24. examples/rl/task_app/math_task_app.py +14 -6
  25. examples/sft/README.md +139 -0
  26. examples/sft/configs/crafter_fft_qwen0p6b.toml +44 -0
  27. examples/sft/configs/crafter_lora_qwen0p6b.toml +45 -0
  28. examples/sft/evaluate.py +117 -0
  29. examples/sft/export_dataset.py +117 -0
  30. examples/sft/generate_traces.py +162 -0
  31. examples/swe/__init__.py +12 -0
  32. examples/swe/task_app/README.md +105 -0
  33. examples/swe/task_app/__init__.py +2 -0
  34. examples/swe/task_app/grpo_swe_mini.py +571 -0
  35. examples/swe/task_app/grpo_swe_mini_task_app.py +136 -0
  36. examples/swe/task_app/hosted/README.md +173 -0
  37. examples/swe/task_app/hosted/__init__.py +5 -0
  38. examples/swe/task_app/hosted/branching.py +143 -0
  39. examples/swe/task_app/hosted/environment_routes.py +1289 -0
  40. examples/swe/task_app/hosted/envs/__init__.py +1 -0
  41. examples/swe/task_app/hosted/envs/crafter/__init__.py +6 -0
  42. examples/swe/task_app/hosted/envs/crafter/app.py +1 -0
  43. examples/swe/task_app/hosted/envs/crafter/environment.py +522 -0
  44. examples/swe/task_app/hosted/envs/crafter/policy.py +478 -0
  45. examples/swe/task_app/hosted/envs/crafter/react_agent.py +108 -0
  46. examples/swe/task_app/hosted/envs/crafter/shared.py +305 -0
  47. examples/swe/task_app/hosted/envs/crafter/tools.py +47 -0
  48. examples/swe/task_app/hosted/envs/mini_swe/__init__.py +8 -0
  49. examples/swe/task_app/hosted/envs/mini_swe/environment.py +1164 -0
  50. examples/swe/task_app/hosted/envs/mini_swe/policy.py +355 -0
  51. examples/swe/task_app/hosted/envs/mini_swe/shared.py +83 -0
  52. examples/swe/task_app/hosted/envs/mini_swe/tools.py +96 -0
  53. examples/swe/task_app/hosted/hosted_app.py +204 -0
  54. examples/swe/task_app/hosted/inference/__init__.py +5 -0
  55. examples/swe/task_app/hosted/inference/openai_client.py +618 -0
  56. examples/swe/task_app/hosted/main.py +100 -0
  57. examples/swe/task_app/hosted/policy_routes.py +1079 -0
  58. examples/swe/task_app/hosted/registry.py +195 -0
  59. examples/swe/task_app/hosted/rollout.py +1869 -0
  60. examples/swe/task_app/hosted/storage/__init__.py +5 -0
  61. examples/swe/task_app/hosted/storage/volume.py +211 -0
  62. examples/swe/task_app/hosted/test_agents.py +161 -0
  63. examples/swe/task_app/hosted/test_service.py +137 -0
  64. examples/swe/task_app/hosted/utils.py +62 -0
  65. examples/vlm/README.md +68 -0
  66. examples/vlm/configs/crafter_vlm_gpt4o.toml +44 -0
  67. examples/vlm/crafter_image_only_agent.py +207 -0
  68. examples/vlm/crafter_openai_vlm_agent.py +277 -0
  69. examples/vlm/filter_image_rows.py +63 -0
  70. examples/vlm/run_crafter_vlm_benchmark.py +316 -0
  71. examples/warming_up_to_rl/analyze_trace_db.py +12 -10
  72. examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +11 -1
  73. examples/warming_up_to_rl/export_trace_sft.py +218 -36
  74. examples/warming_up_to_rl/groq_test.py +15 -8
  75. examples/warming_up_to_rl/manage_secrets.py +29 -25
  76. examples/warming_up_to_rl/readme.md +9 -2
  77. examples/warming_up_to_rl/run_eval.py +137 -61
  78. examples/warming_up_to_rl/run_fft_and_save.py +131 -60
  79. examples/warming_up_to_rl/run_local_rollout.py +88 -39
  80. examples/warming_up_to_rl/run_local_rollout_modal.py +114 -28
  81. examples/warming_up_to_rl/run_local_rollout_parallel.py +81 -20
  82. examples/warming_up_to_rl/run_local_rollout_traced.py +126 -23
  83. examples/warming_up_to_rl/run_rl_and_save.py +35 -12
  84. examples/warming_up_to_rl/run_rollout_remote.py +44 -19
  85. examples/warming_up_to_rl/task_app/README.md +6 -2
  86. examples/warming_up_to_rl/task_app/grpo_crafter.py +319 -57
  87. examples/warming_up_to_rl/task_app/grpo_crafter_task_app.py +11 -30
  88. examples/warming_up_to_rl/task_app/synth_envs_hosted/__init__.py +1 -1
  89. examples/warming_up_to_rl/task_app/synth_envs_hosted/branching.py +9 -11
  90. examples/warming_up_to_rl/task_app/synth_envs_hosted/environment_routes.py +137 -182
  91. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/__init__.py +1 -1
  92. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/__init__.py +1 -1
  93. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/app.py +1 -1
  94. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/environment.py +150 -57
  95. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/policy.py +105 -69
  96. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/react_agent.py +19 -7
  97. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/shared.py +45 -42
  98. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/tools.py +1 -1
  99. examples/warming_up_to_rl/task_app/synth_envs_hosted/hosted_app.py +47 -45
  100. examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/__init__.py +1 -1
  101. examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py +198 -92
  102. examples/warming_up_to_rl/task_app/synth_envs_hosted/main.py +0 -2
  103. examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py +361 -263
  104. examples/warming_up_to_rl/task_app/synth_envs_hosted/registry.py +21 -23
  105. examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py +394 -274
  106. examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/__init__.py +1 -1
  107. examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/volume.py +56 -62
  108. examples/warming_up_to_rl/task_app/synth_envs_hosted/test_agents.py +1 -0
  109. examples/warming_up_to_rl/task_app/synth_envs_hosted/test_service.py +6 -15
  110. examples/warming_up_to_rl/task_app/synth_envs_hosted/utils.py +4 -3
  111. synth/__init__.py +14 -0
  112. synth_ai/__init__.py +20 -4
  113. synth_ai/api/models/supported.py +376 -0
  114. synth_ai/api/train/builders.py +157 -26
  115. synth_ai/api/train/cli.py +213 -57
  116. synth_ai/api/train/config_finder.py +65 -5
  117. synth_ai/api/train/env_resolver.py +33 -15
  118. synth_ai/api/train/pollers.py +13 -4
  119. synth_ai/api/train/supported_algos.py +139 -0
  120. synth_ai/api/train/task_app.py +5 -3
  121. synth_ai/api/train/utils.py +33 -48
  122. synth_ai/cli/__init__.py +19 -4
  123. synth_ai/cli/_modal_wrapper.py +28 -0
  124. synth_ai/cli/_typer_patch.py +49 -0
  125. synth_ai/cli/balance.py +2 -3
  126. synth_ai/cli/calc.py +1 -1
  127. synth_ai/cli/demo.py +21 -6
  128. synth_ai/cli/recent.py +2 -2
  129. synth_ai/cli/rl_demo.py +77 -17
  130. synth_ai/cli/root.py +116 -39
  131. synth_ai/cli/status.py +2 -2
  132. synth_ai/cli/task_apps.py +1699 -259
  133. synth_ai/cli/traces.py +7 -4
  134. synth_ai/cli/turso.py +73 -0
  135. synth_ai/cli/watch.py +12 -18
  136. synth_ai/core/experiment.py +0 -2
  137. synth_ai/demo_registry.py +68 -31
  138. synth_ai/demos/core/cli.py +516 -194
  139. synth_ai/demos/demo_task_apps/__init__.py +3 -3
  140. synth_ai/demos/demo_task_apps/core.py +64 -28
  141. synth_ai/demos/demo_task_apps/crafter/configs/crafter_fft_4b.toml +2 -3
  142. synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +37 -30
  143. synth_ai/demos/demo_task_apps/math/_common.py +1 -2
  144. synth_ai/demos/demo_task_apps/math/app.py +2 -1
  145. synth_ai/demos/demo_task_apps/math/deploy_modal.py +3 -6
  146. synth_ai/demos/demo_task_apps/math/modal_task_app.py +183 -82
  147. synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -2
  148. synth_ai/environments/examples/bandit/engine.py +12 -4
  149. synth_ai/environments/examples/bandit/taskset.py +4 -4
  150. synth_ai/environments/examples/crafter_classic/environment.py +76 -1
  151. synth_ai/environments/reproducibility/tree.py +5 -6
  152. synth_ai/environments/service/app.py +11 -12
  153. synth_ai/environments/service/core_routes.py +10 -9
  154. synth_ai/environments/stateful/engine.py +1 -1
  155. synth_ai/environments/tasks/core.py +1 -0
  156. synth_ai/environments/tasks/filters.py +5 -6
  157. synth_ai/environments/tasks/utils.py +4 -5
  158. synth_ai/evals/base.py +0 -2
  159. synth_ai/handshake.py +11 -9
  160. synth_ai/http.py +1 -1
  161. synth_ai/http_client.py +43 -11
  162. synth_ai/inference/__init__.py +0 -2
  163. synth_ai/inference/client.py +20 -6
  164. synth_ai/jobs/client.py +103 -78
  165. synth_ai/learning/__init__.py +41 -6
  166. synth_ai/learning/algorithms.py +14 -0
  167. synth_ai/learning/client.py +121 -29
  168. synth_ai/learning/config.py +2 -40
  169. synth_ai/learning/constants.py +0 -2
  170. synth_ai/learning/ft_client.py +4 -56
  171. synth_ai/learning/health.py +13 -7
  172. synth_ai/learning/jobs.py +43 -47
  173. synth_ai/{rl → learning/rl}/__init__.py +14 -5
  174. synth_ai/learning/rl/client.py +267 -0
  175. synth_ai/learning/rl/config.py +31 -0
  176. synth_ai/{rl → learning/rl}/contracts.py +5 -10
  177. synth_ai/{rl → learning/rl}/env_keys.py +45 -16
  178. synth_ai/learning/rl/secrets.py +13 -0
  179. synth_ai/learning/rl_client.py +2 -253
  180. synth_ai/learning/sft/__init__.py +29 -0
  181. synth_ai/learning/sft/client.py +68 -0
  182. synth_ai/learning/sft/config.py +270 -0
  183. synth_ai/learning/sft/data.py +295 -0
  184. synth_ai/learning/sse.py +25 -26
  185. synth_ai/learning/validators.py +25 -24
  186. synth_ai/lm/__init__.py +21 -47
  187. synth_ai/task/__init__.py +26 -27
  188. synth_ai/task/apps/__init__.py +18 -19
  189. synth_ai/task/auth.py +35 -23
  190. synth_ai/task/client.py +15 -13
  191. synth_ai/task/contracts.py +37 -35
  192. synth_ai/task/datasets.py +9 -6
  193. synth_ai/task/errors.py +11 -10
  194. synth_ai/task/health.py +17 -11
  195. synth_ai/task/json.py +58 -24
  196. synth_ai/task/proxy.py +15 -14
  197. synth_ai/task/rubrics.py +22 -15
  198. synth_ai/task/server.py +43 -17
  199. synth_ai/task/tracing_utils.py +12 -7
  200. synth_ai/task/validators.py +0 -1
  201. synth_ai/task/vendors.py +5 -7
  202. synth_ai/tracing_v3/__init__.py +2 -0
  203. synth_ai/tracing_v3/abstractions.py +21 -4
  204. synth_ai/tracing_v3/db_config.py +26 -1
  205. synth_ai/tracing_v3/decorators.py +18 -15
  206. synth_ai/tracing_v3/examples/basic_usage.py +3 -2
  207. synth_ai/tracing_v3/hooks.py +6 -4
  208. synth_ai/tracing_v3/llm_call_record_helpers.py +6 -6
  209. synth_ai/tracing_v3/replica_sync.py +1 -0
  210. synth_ai/tracing_v3/session_tracer.py +63 -16
  211. synth_ai/tracing_v3/storage/base.py +89 -1
  212. synth_ai/tracing_v3/storage/config.py +21 -8
  213. synth_ai/tracing_v3/storage/factory.py +10 -8
  214. synth_ai/tracing_v3/storage/utils.py +4 -2
  215. synth_ai/tracing_v3/turso/daemon.py +7 -2
  216. synth_ai/tracing_v3/turso/models.py +5 -2
  217. synth_ai/tracing_v3/turso/native_manager.py +1173 -0
  218. synth_ai/tracing_v3/utils.py +4 -3
  219. synth_ai/v0/api/__init__.py +8 -0
  220. synth_ai/v0/api/models/__init__.py +8 -0
  221. synth_ai/v0/api/models/supported.py +8 -0
  222. synth_ai/v0/config/__init__.py +15 -0
  223. synth_ai/v0/config/base_url.py +12 -0
  224. synth_ai/v0/lm/__init__.py +51 -0
  225. synth_ai/{lm → v0/lm}/caching/ephemeral.py +3 -5
  226. synth_ai/{lm → v0/lm}/caching/handler.py +4 -4
  227. synth_ai/{lm → v0/lm}/caching/initialize.py +1 -1
  228. synth_ai/{lm → v0/lm}/caching/persistent.py +1 -1
  229. synth_ai/{lm → v0/lm}/config.py +6 -1
  230. synth_ai/{lm → v0/lm}/core/all.py +9 -9
  231. synth_ai/{lm → v0/lm}/core/exceptions.py +0 -2
  232. synth_ai/{lm → v0/lm}/core/main.py +19 -7
  233. synth_ai/{lm → v0/lm}/core/main_v3.py +10 -10
  234. synth_ai/{lm → v0/lm}/core/synth_models.py +2 -15
  235. synth_ai/{lm → v0/lm}/core/vendor_clients.py +6 -4
  236. synth_ai/{lm → v0/lm}/overrides.py +4 -4
  237. synth_ai/{lm → v0/lm}/provider_support/anthropic.py +4 -4
  238. synth_ai/{lm → v0/lm}/provider_support/openai.py +5 -5
  239. synth_ai/{lm → v0/lm}/structured_outputs/handler.py +5 -5
  240. synth_ai/{lm → v0/lm}/structured_outputs/rehabilitate.py +1 -1
  241. synth_ai/{lm → v0/lm}/vendors/core/anthropic_api.py +16 -16
  242. synth_ai/{lm → v0/lm}/vendors/core/gemini_api.py +5 -5
  243. synth_ai/{lm → v0/lm}/vendors/core/mistral_api.py +5 -5
  244. synth_ai/{lm → v0/lm}/vendors/core/openai_api.py +12 -10
  245. synth_ai/{lm → v0/lm}/vendors/openai_standard.py +11 -9
  246. synth_ai/{lm → v0/lm}/vendors/openai_standard_responses.py +8 -5
  247. synth_ai/{lm → v0/lm}/vendors/supported/custom_endpoint.py +4 -6
  248. synth_ai/{lm → v0/lm}/vendors/supported/deepseek.py +2 -2
  249. synth_ai/{lm → v0/lm}/vendors/supported/grok.py +2 -2
  250. synth_ai/{lm → v0/lm}/vendors/supported/groq.py +1 -1
  251. synth_ai/{lm → v0/lm}/vendors/supported/ollama.py +1 -1
  252. synth_ai/{lm → v0/lm}/vendors/supported/openrouter.py +3 -3
  253. synth_ai/{lm → v0/lm}/vendors/supported/together.py +1 -1
  254. synth_ai/{lm → v0/lm}/vendors/synth_client.py +38 -11
  255. synth_ai/v0/tracing/upload.py +32 -135
  256. synth_ai/v0/tracing_v3/__init__.py +10 -0
  257. synth_ai/v0/tracing_v3/abstractions.py +3 -0
  258. synth_ai/v0/tracing_v3/decorators.py +3 -0
  259. synth_ai/v0/tracing_v3/llm_call_record_helpers.py +3 -0
  260. synth_ai/v0/tracing_v3/session_tracer.py +3 -0
  261. synth_ai-0.2.9.dev6.dist-info/METADATA +191 -0
  262. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.9.dev6.dist-info}/RECORD +291 -262
  263. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.9.dev6.dist-info}/top_level.txt +1 -0
  264. examples/common_old/backend.py +0 -21
  265. examples/evals_old/README.md +0 -98
  266. examples/evals_old/__init__.py +0 -6
  267. examples/evals_old/compare_models.py +0 -1037
  268. examples/evals_old/example_log.md +0 -145
  269. examples/evals_old/run_demo.sh +0 -126
  270. examples/evals_old/trace_analysis.py +0 -270
  271. examples/finetuning_old/_backup_synth_qwen/config.toml +0 -29
  272. examples/finetuning_old/_backup_synth_qwen/example_log.md +0 -324
  273. examples/finetuning_old/_backup_synth_qwen/filter_traces.py +0 -60
  274. examples/finetuning_old/_backup_synth_qwen/filter_traces_achievements.py +0 -239
  275. examples/finetuning_old/_backup_synth_qwen/purge_v3_traces.py +0 -109
  276. examples/finetuning_old/_backup_synth_qwen/react_agent_lm.py +0 -1924
  277. examples/finetuning_old/_backup_synth_qwen/readme.md +0 -49
  278. examples/finetuning_old/_backup_synth_qwen/run_crafter_qwen4b.py +0 -114
  279. examples/finetuning_old/_backup_synth_qwen/run_demo.sh +0 -195
  280. examples/finetuning_old/_backup_synth_qwen/sft_kickoff.py +0 -118
  281. examples/finetuning_old/synth_qwen_v1/README.md +0 -68
  282. examples/finetuning_old/synth_qwen_v1/filter_traces.py +0 -60
  283. examples/finetuning_old/synth_qwen_v1/filter_traces_achievements.py +0 -239
  284. examples/finetuning_old/synth_qwen_v1/finetune.py +0 -46
  285. examples/finetuning_old/synth_qwen_v1/hello_ft_model.py +0 -71
  286. examples/finetuning_old/synth_qwen_v1/infer.py +0 -37
  287. examples/finetuning_old/synth_qwen_v1/poll.py +0 -44
  288. examples/finetuning_old/synth_qwen_v1/prepare_data.py +0 -35
  289. examples/finetuning_old/synth_qwen_v1/purge_v3_traces.py +0 -109
  290. examples/finetuning_old/synth_qwen_v1/react_agent_lm.py +0 -1932
  291. examples/finetuning_old/synth_qwen_v1/run_crafter_sft_job.py +0 -207
  292. examples/finetuning_old/synth_qwen_v1/run_ft_job.py +0 -232
  293. examples/finetuning_old/synth_qwen_v1/upload_data.py +0 -34
  294. examples/finetuning_old/synth_qwen_v1/util.py +0 -147
  295. examples/rl_old/task_app.py +0 -962
  296. examples/warming_up_to_rl/old/event_rewards.md +0 -234
  297. examples/warming_up_to_rl/old/notes.md +0 -73
  298. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -738
  299. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -580
  300. synth_ai/experimental/synth_oss.py +0 -446
  301. synth_ai/install_sqld.sh +0 -40
  302. synth_ai/learning/filtering.py +0 -0
  303. synth_ai/learning/offline/dpo.py +0 -0
  304. synth_ai/learning/offline/providers.py +0 -7
  305. synth_ai/learning/offline/sft.py +0 -0
  306. synth_ai/learning/offline/shared.py +0 -0
  307. synth_ai/learning/online/grpo.py +0 -0
  308. synth_ai/learning/online/irft.py +0 -0
  309. synth_ai/learning/prompts/banking77_injection_eval.py +0 -168
  310. synth_ai/learning/prompts/gepa.py +0 -0
  311. synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +0 -213
  312. synth_ai/learning/prompts/mipro.py +0 -289
  313. synth_ai/learning/prompts/random_search.py +0 -246
  314. synth_ai/learning/prompts/run_mipro_banking77.py +0 -172
  315. synth_ai/learning/prompts/run_random_search_banking77.py +0 -324
  316. synth_ai/rl/secrets.py +0 -19
  317. synth_ai/scripts/verify_rewards.py +0 -100
  318. synth_ai/tracing/__init__.py +0 -30
  319. synth_ai/tracing_v1/__init__.py +0 -33
  320. synth_ai/tracing_v3/turso/__init__.py +0 -25
  321. synth_ai/tracing_v3/turso/manager.py +0 -774
  322. synth_ai/zyk/__init__.py +0 -30
  323. synth_ai-0.2.9.dev5.dist-info/METADATA +0 -131
  324. /synth_ai/{lm → v0/lm}/caching/__init__.py +0 -0
  325. /synth_ai/{lm → v0/lm}/caching/constants.py +0 -0
  326. /synth_ai/{lm → v0/lm}/caching/dbs.py +0 -0
  327. /synth_ai/{lm → v0/lm}/constants.py +0 -0
  328. /synth_ai/{lm → v0/lm}/core/__init__.py +0 -0
  329. /synth_ai/{lm → v0/lm}/cost/__init__.py +0 -0
  330. /synth_ai/{lm → v0/lm}/cost/monitor.py +0 -0
  331. /synth_ai/{lm → v0/lm}/cost/statefulness.py +0 -0
  332. /synth_ai/{lm → v0/lm}/injection.py +0 -0
  333. /synth_ai/{lm → v0/lm}/provider_support/__init__.py +0 -0
  334. /synth_ai/{lm → v0/lm}/provider_support/suppress_logging.py +0 -0
  335. /synth_ai/{lm → v0/lm}/structured_outputs/__init__.py +0 -0
  336. /synth_ai/{lm → v0/lm}/structured_outputs/inject.py +0 -0
  337. /synth_ai/{lm → v0/lm}/tools/__init__.py +0 -0
  338. /synth_ai/{lm → v0/lm}/tools/base.py +0 -0
  339. /synth_ai/{lm → v0/lm}/unified_interface.py +0 -0
  340. /synth_ai/{lm → v0/lm}/vendors/__init__.py +0 -0
  341. /synth_ai/{lm → v0/lm}/vendors/base.py +0 -0
  342. /synth_ai/{lm → v0/lm}/vendors/core/__init__.py +0 -0
  343. /synth_ai/{lm → v0/lm}/vendors/core/synth_dev_api.py +0 -0
  344. /synth_ai/{lm → v0/lm}/vendors/local/__init__.py +0 -0
  345. /synth_ai/{lm → v0/lm}/vendors/local/ollama.py +0 -0
  346. /synth_ai/{lm → v0/lm}/vendors/retries.py +0 -0
  347. /synth_ai/{lm → v0/lm}/vendors/supported/__init__.py +0 -0
  348. /synth_ai/{lm → v0/lm}/warmup.py +0 -0
  349. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.9.dev6.dist-info}/WHEEL +0 -0
  350. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.9.dev6.dist-info}/entry_points.txt +0 -0
  351. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.9.dev6.dist-info}/licenses/LICENSE +0 -0
synth_ai/cli/traces.py CHANGED
@@ -26,7 +26,7 @@ def register(cli):
26
26
  console = Console()
27
27
 
28
28
  async def _run():
29
- from synth_ai.tracing_v3.turso.manager import AsyncSQLTraceManager
29
+ from synth_ai.tracing_v3.storage.factory import StorageConfig, create_storage
30
30
 
31
31
  # Discover DBs under ./synth_ai.db/dbs (or override via env)
32
32
  root = os.getenv("SYNTH_TRACES_ROOT", "./synth_ai.db/dbs")
@@ -51,13 +51,14 @@ def register(cli):
51
51
  for fn in files:
52
52
  fp = os.path.join(dp, fn)
53
53
  import contextlib
54
+
54
55
  with contextlib.suppress(OSError):
55
56
  total += os.path.getsize(fp)
56
57
  return total
57
58
 
58
59
  async def db_counts(db_dir: str) -> tuple[int, dict[str, int], int, str | None, int]:
59
60
  data_file = os.path.join(db_dir, "data")
60
- mgr = AsyncSQLTraceManager(f"sqlite+aiosqlite:///{data_file}")
61
+ mgr = create_storage(StorageConfig(connection_string=f"sqlite+aiosqlite:///{data_file}"))
61
62
  await mgr.initialize()
62
63
  try:
63
64
  traces_df = await mgr.query_traces("SELECT COUNT(*) AS c FROM session_traces")
@@ -73,9 +74,11 @@ def register(cli):
73
74
  system_counts = (
74
75
  {
75
76
  str(r["system_type"] or "-"): int(r["c"] or 0)
76
- for _, r in (systems_df or []).iterrows()
77
+ for _, r in systems_df.iterrows()
77
78
  }
78
- if systems_df is not None and not systems_df.empty
79
+ if systems_df is not None
80
+ and hasattr(systems_df, "iterrows")
81
+ and not systems_df.empty
79
82
  else {}
80
83
  )
81
84
  except Exception:
synth_ai/cli/turso.py ADDED
@@ -0,0 +1,73 @@
1
+ """Utility CLI command for managing Turso sqld binaries."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import subprocess
6
+
7
+ import click
8
+
9
+ from .root import SQLD_VERSION, find_sqld_binary, install_sqld
10
+
11
+
12
+ def register(cli: click.Group) -> None:
13
+ """Register the turso command on the main CLI group."""
14
+
15
+ cli.add_command(turso)
16
+
17
+
18
+ def _get_sqld_version(binary: str) -> str | None:
19
+ """Return the version string reported by the sqld binary."""
20
+
21
+ try:
22
+ result = subprocess.run(
23
+ [binary, "--version"],
24
+ capture_output=True,
25
+ text=True,
26
+ check=True,
27
+ timeout=5,
28
+ )
29
+ except (OSError, subprocess.CalledProcessError, ValueError):
30
+ return None
31
+
32
+ output = result.stdout.strip() or result.stderr.strip()
33
+ return output or None
34
+
35
+
36
+ @click.command()
37
+ @click.option(
38
+ "--force",
39
+ is_flag=True,
40
+ help="Reinstall the pinned sqld build even if one is already available.",
41
+ )
42
+ def turso(force: bool) -> None:
43
+ """Ensure the Turso sqld binary required for tracing v3 is installed."""
44
+
45
+ existing_path = find_sqld_binary()
46
+
47
+ if existing_path and not force:
48
+ version_info = _get_sqld_version(existing_path)
49
+ click.echo(f"✅ Turso sqld detected at {existing_path}.")
50
+ if version_info:
51
+ click.echo(f" Reported version: {version_info}")
52
+ if version_info and SQLD_VERSION not in version_info:
53
+ click.echo(
54
+ f"⚠️ Pinned version is {SQLD_VERSION}. Run with --force to install the supported build."
55
+ )
56
+ else:
57
+ click.echo("No action taken. Use --force to reinstall the pinned build.")
58
+ return
59
+
60
+ if existing_path and force:
61
+ click.echo(f"♻️ Reinstalling Turso sqld {SQLD_VERSION} (previously at {existing_path}).")
62
+ else:
63
+ click.echo(f"📦 Installing Turso sqld {SQLD_VERSION}…")
64
+
65
+ try:
66
+ installed_path = install_sqld()
67
+ except subprocess.CalledProcessError as exc: # pragma: no cover - surfaced as Click error
68
+ raise click.ClickException(
69
+ f"sqld installation failed (exit code {exc.returncode})."
70
+ ) from exc
71
+
72
+ click.echo(f"✅ sqld installed to {installed_path}")
73
+ click.echo("Ensure ~/.local/bin is on your PATH before running Synth AI services.")
synth_ai/cli/watch.py CHANGED
@@ -16,6 +16,12 @@ from rich.console import Console, Group
16
16
  from rich.panel import Panel
17
17
  from rich.table import Table
18
18
 
19
+ from synth_ai.tracing_v3.storage.factory import StorageConfig, create_storage
20
+
21
+
22
+ def _open_db(db_url: str):
23
+ return create_storage(StorageConfig(connection_string=db_url))
24
+
19
25
 
20
26
  class _State:
21
27
  def __init__(self):
@@ -48,9 +54,7 @@ def _format_int(value: Any) -> str:
48
54
 
49
55
 
50
56
  async def _fetch_experiments(db_url: str):
51
- from synth_ai.tracing_v3.turso.manager import AsyncSQLTraceManager
52
-
53
- db = AsyncSQLTraceManager(db_url)
57
+ db = _open_db(db_url)
54
58
  await db.initialize()
55
59
  try:
56
60
  df = await db.query_traces(
@@ -114,9 +118,7 @@ def _experiments_table(df, limit: int | None = None) -> Table:
114
118
 
115
119
 
116
120
  async def _experiment_detail(db_url: str, experiment_id: str) -> dict[str, Any]:
117
- from synth_ai.tracing_v3.turso.manager import AsyncSQLTraceManager
118
-
119
- db = AsyncSQLTraceManager(db_url)
121
+ db = _open_db(db_url)
120
122
  await db.initialize()
121
123
  try:
122
124
  exp_df = await db.query_traces(
@@ -253,9 +255,7 @@ def register(cli):
253
255
  console = Console()
254
256
 
255
257
  async def _run():
256
- from synth_ai.tracing_v3.turso.manager import AsyncSQLTraceManager
257
-
258
- db = AsyncSQLTraceManager(db_url)
258
+ db = _open_db(db_url)
259
259
  await db.initialize()
260
260
  try:
261
261
  df = await db.get_model_usage(model_name=model_name)
@@ -396,9 +396,7 @@ def _parse_hours(args: list[str]) -> float | None:
396
396
 
397
397
 
398
398
  async def _usage_table(db_url: str, model_name: str | None):
399
- from synth_ai.tracing_v3.turso.manager import AsyncSQLTraceManager
400
-
401
- db = AsyncSQLTraceManager(db_url)
399
+ db = _open_db(db_url)
402
400
  await db.initialize()
403
401
  try:
404
402
  df = await db.get_model_usage(model_name=model_name)
@@ -418,9 +416,7 @@ async def _usage_table(db_url: str, model_name: str | None):
418
416
 
419
417
 
420
418
  async def _traces_table(db_url: str, limit: int):
421
- from synth_ai.tracing_v3.turso.manager import AsyncSQLTraceManager
422
-
423
- db = AsyncSQLTraceManager(db_url)
419
+ db = _open_db(db_url)
424
420
  await db.initialize()
425
421
  try:
426
422
  df = await db.query_traces("SELECT * FROM session_summary ORDER BY created_at DESC")
@@ -453,10 +449,8 @@ async def _recent_table(db_url: str, hours: float, limit: int):
453
449
  # Inline the recent query to avoid cross-module coupling
454
450
  from datetime import timedelta
455
451
 
456
- from synth_ai.tracing_v3.turso.manager import AsyncSQLTraceManager
457
-
458
452
  start_time = datetime.now() - timedelta(hours=hours)
459
- db = AsyncSQLTraceManager(db_url)
453
+ db = _open_db(db_url)
460
454
  await db.initialize()
461
455
  try:
462
456
  query = """
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  class ExperimentalSystem:
4
2
  system_id: str
5
3
  system_version_id: str
synth_ai/demo_registry.py CHANGED
@@ -3,9 +3,9 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import textwrap
6
+ from collections.abc import Callable, Iterable
6
7
  from dataclasses import dataclass
7
8
  from pathlib import Path
8
- from typing import Callable, Iterable
9
9
 
10
10
  REPO_ROOT = Path(__file__).resolve().parents[1]
11
11
 
@@ -85,7 +85,7 @@ DEMO_TEMPLATES: tuple[DemoTemplate, ...] = (
85
85
  DemoTemplate(
86
86
  template_id="crafter-local",
87
87
  name="Crafter GRPO (local FastAPI)",
88
- description="Lightweight wrapper around synth_ai.task.apps.grpo_crafter for local experimentation.",
88
+ description="Lightweight wrapper around examples/warming_up_to_rl/task_app/grpo_crafter for local experimentation.",
89
89
  copy_specs=(
90
90
  CopySpec(
91
91
  "synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py",
@@ -103,6 +103,34 @@ DEMO_TEMPLATES: tuple[DemoTemplate, ...] = (
103
103
  "synth_ai/demos/demo_task_apps/crafter/configs/crafter_fft_4b.toml",
104
104
  "configs/crafter_fft_4b.toml",
105
105
  ),
106
+ CopySpec(
107
+ "examples/warming_up_to_rl/task_app/grpo_crafter.py",
108
+ "grpo_crafter.py",
109
+ ),
110
+ CopySpec(
111
+ "examples/warming_up_to_rl/task_app/synth_envs_hosted",
112
+ "synth_envs_hosted",
113
+ ),
114
+ CopySpec(
115
+ "examples/warming_up_to_rl/run_local_rollout.py",
116
+ "run_local_rollout.py",
117
+ ),
118
+ CopySpec(
119
+ "examples/warming_up_to_rl/run_local_rollout_traced.py",
120
+ "run_local_rollout_traced.py",
121
+ ),
122
+ CopySpec(
123
+ "examples/warming_up_to_rl/export_trace_sft.py",
124
+ "export_trace_sft.py",
125
+ ),
126
+ CopySpec(
127
+ "examples/warming_up_to_rl/run_fft_and_save.py",
128
+ "run_fft_and_save.py",
129
+ ),
130
+ CopySpec(
131
+ "examples/warming_up_to_rl/run_local_rollout_modal.py",
132
+ "run_local_rollout_modal.py",
133
+ ),
106
134
  ),
107
135
  default_subdir="crafter_demo",
108
136
  env_lines=(
@@ -137,12 +165,16 @@ def _postprocess_math_modal(root: Path) -> None:
137
165
  return
138
166
  text = task_path.read_text(encoding="utf-8")
139
167
  text = text.replace('App("hendrycks-math-task-app")', 'App("hendrycks-math-task-app-demo")')
140
- text = text.replace('DEFAULT_TASK_APP_SECRET_NAME = "hendrycks-math-task-app-secret"', 'DEFAULT_TASK_APP_SECRET_NAME = "hendrycks-math-task-app-demo-secret"')
168
+ text = text.replace(
169
+ 'DEFAULT_TASK_APP_SECRET_NAME = "hendrycks-math-task-app-secret"',
170
+ 'DEFAULT_TASK_APP_SECRET_NAME = "hendrycks-math-task-app-demo-secret"',
171
+ )
141
172
  task_path.write_text(text, encoding="utf-8")
142
173
 
143
174
 
144
- CRAFT_DEMO_TEMPLATE = textwrap.dedent(
145
- '''
175
+ CRAFT_DEMO_TEMPLATE = (
176
+ textwrap.dedent(
177
+ '''
146
178
  """Demo-friendly wrapper for the GRPO Crafter task app."""
147
179
 
148
180
  from __future__ import annotations
@@ -151,7 +183,12 @@ import argparse
151
183
  from pathlib import Path
152
184
 
153
185
  from synth_ai.task.apps import ModalDeploymentConfig, registry
154
- from synth_ai.task.apps.grpo_crafter import build_config
186
+ import sys
187
+ from pathlib import Path
188
+ _EXAMPLES_TASK_APP = Path(__file__).resolve().parents[4] / "examples" / "warming_up_to_rl" / "task_app"
189
+ if str(_EXAMPLES_TASK_APP) not in sys.path:
190
+ sys.path.insert(0, str(_EXAMPLES_TASK_APP))
191
+ from grpo_crafter import build_config
155
192
  from synth_ai.task.server import TaskAppConfig, create_task_app, run_task_app
156
193
 
157
194
 
@@ -159,28 +196,6 @@ APP_ID = "grpo-crafter-demo"
159
196
  BASE_APP_ID = "grpo-crafter"
160
197
 
161
198
 
162
- _BASE_CONFIG = build_config()
163
- TASK_APP_CONFIG = TaskAppConfig(
164
- app_id="grpo-crafter-demo",
165
- name=_BASE_CONFIG.name,
166
- description=_BASE_CONFIG.description,
167
- base_task_info=_BASE_CONFIG.base_task_info,
168
- describe_taskset=_BASE_CONFIG.describe_taskset,
169
- provide_task_instances=_BASE_CONFIG.provide_task_instances,
170
- rollout=_BASE_CONFIG.rollout,
171
- dataset_registry=_BASE_CONFIG.dataset_registry,
172
- rubrics=_BASE_CONFIG.rubrics,
173
- proxy=_BASE_CONFIG.proxy,
174
- routers=_BASE_CONFIG.routers,
175
- middleware=_BASE_CONFIG.middleware,
176
- app_state=_BASE_CONFIG.app_state,
177
- require_api_key=_BASE_CONFIG.require_api_key,
178
- expose_debug_env=_BASE_CONFIG.expose_debug_env,
179
- cors_origins=_BASE_CONFIG.cors_origins,
180
- startup_hooks=_BASE_CONFIG.startup_hooks,
181
- shutdown_hooks=_BASE_CONFIG.shutdown_hooks,
182
- )
183
-
184
199
  try:
185
200
  _BASE_ENTRY = registry.get(BASE_APP_ID)
186
201
  except Exception: # pragma: no cover - registry may be unavailable
@@ -213,7 +228,28 @@ ENV_FILES: tuple[str, ...] = ()
213
228
  def build_task_app_config() -> TaskAppConfig:
214
229
  """Return a fresh TaskAppConfig for the demo wrapper."""
215
230
 
216
- return TASK_APP_CONFIG.clone()
231
+ # Build config dynamically so environment variables are read at runtime
232
+ _base_config = build_config()
233
+ return TaskAppConfig(
234
+ app_id="grpo-crafter-demo",
235
+ name=_base_config.name,
236
+ description=_base_config.description,
237
+ base_task_info=_base_config.base_task_info,
238
+ describe_taskset=_base_config.describe_taskset,
239
+ provide_task_instances=_base_config.provide_task_instances,
240
+ rollout=_base_config.rollout,
241
+ dataset_registry=_base_config.dataset_registry,
242
+ rubrics=_base_config.rubrics,
243
+ proxy=_base_config.proxy,
244
+ routers=_base_config.routers,
245
+ middleware=_base_config.middleware,
246
+ app_state=_base_config.app_state,
247
+ require_api_key=_base_config.require_api_key,
248
+ expose_debug_env=_base_config.expose_debug_env,
249
+ cors_origins=_base_config.cors_origins,
250
+ startup_hooks=_base_config.startup_hooks,
251
+ shutdown_hooks=_base_config.shutdown_hooks,
252
+ )
217
253
 
218
254
 
219
255
  def fastapi_app():
@@ -247,7 +283,9 @@ if __name__ == "__main__":
247
283
  env_files=env_files,
248
284
  )
249
285
  '''
250
- ).strip() + "\n"
286
+ ).strip()
287
+ + "\n"
288
+ )
251
289
 
252
290
 
253
291
  def _postprocess_crafter_local(root: Path) -> None:
@@ -255,4 +293,3 @@ def _postprocess_crafter_local(root: Path) -> None:
255
293
  if not task_path.exists():
256
294
  return
257
295
  task_path.write_text(CRAFT_DEMO_TEMPLATE, encoding="utf-8")
258
-