synth-ai 0.2.9.dev5__py3-none-any.whl → 0.2.10__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 (349) hide show
  1. examples/__init__.py +16 -0
  2. examples/crafter_debug_render.py +23 -17
  3. examples/dev/qwen3_32b_qlora_4xh100.toml +40 -0
  4. examples/multi_step/crafter_rl_lora.md +29 -0
  5. examples/qwen_coder/README.md +102 -0
  6. examples/qwen_coder/_shared.py +113 -0
  7. examples/qwen_coder/configs/coder_lora_30b.toml +61 -0
  8. examples/qwen_coder/configs/coder_lora_4b.toml +57 -0
  9. examples/qwen_coder/configs/coder_lora_small.toml +58 -0
  10. examples/qwen_coder/generate_dataset.py +98 -0
  11. examples/qwen_coder/infer_ft_smoke.py +65 -0
  12. examples/qwen_coder/infer_prod_proxy.py +73 -0
  13. examples/qwen_coder/infer_via_synth.py +87 -0
  14. examples/qwen_coder/scripts/infer_coder.sh +19 -0
  15. examples/qwen_coder/scripts/train_coder_30b.sh +22 -0
  16. examples/qwen_coder/sft_full_17b.py +103 -0
  17. examples/qwen_coder/sft_lora_30b.py +110 -0
  18. examples/qwen_coder/subset_jsonl.py +39 -0
  19. examples/qwen_coder/todos.md +38 -0
  20. examples/qwen_coder/validate_jsonl.py +60 -0
  21. examples/rl/configs/eval_base_qwen.toml +1 -1
  22. examples/rl/configs/rl_from_base_qwen17.toml +1 -1
  23. examples/rl/download_dataset.py +26 -10
  24. examples/rl/run_eval.py +53 -52
  25. examples/rl/run_rl_and_save.py +29 -12
  26. examples/rl/task_app/math_single_step.py +180 -41
  27. examples/rl/task_app/math_task_app.py +14 -6
  28. examples/sft/README.md +139 -0
  29. examples/sft/configs/crafter_fft_qwen0p6b.toml +44 -0
  30. examples/sft/configs/crafter_lora_qwen0p6b.toml +45 -0
  31. examples/sft/evaluate.py +117 -0
  32. examples/sft/export_dataset.py +117 -0
  33. examples/sft/generate_traces.py +162 -0
  34. examples/swe/__init__.py +12 -0
  35. examples/swe/task_app/README.md +105 -0
  36. examples/swe/task_app/__init__.py +2 -0
  37. examples/swe/task_app/grpo_swe_mini.py +571 -0
  38. examples/swe/task_app/grpo_swe_mini_task_app.py +136 -0
  39. examples/swe/task_app/hosted/README.md +173 -0
  40. examples/swe/task_app/hosted/__init__.py +5 -0
  41. examples/swe/task_app/hosted/branching.py +143 -0
  42. examples/swe/task_app/hosted/environment_routes.py +1289 -0
  43. examples/swe/task_app/hosted/envs/__init__.py +1 -0
  44. examples/swe/task_app/hosted/envs/crafter/__init__.py +6 -0
  45. examples/swe/task_app/hosted/envs/crafter/app.py +1 -0
  46. examples/swe/task_app/hosted/envs/crafter/environment.py +522 -0
  47. examples/swe/task_app/hosted/envs/crafter/policy.py +478 -0
  48. examples/swe/task_app/hosted/envs/crafter/react_agent.py +108 -0
  49. examples/swe/task_app/hosted/envs/crafter/shared.py +305 -0
  50. examples/swe/task_app/hosted/envs/crafter/tools.py +47 -0
  51. examples/swe/task_app/hosted/envs/mini_swe/__init__.py +8 -0
  52. examples/swe/task_app/hosted/envs/mini_swe/environment.py +1164 -0
  53. examples/swe/task_app/hosted/envs/mini_swe/policy.py +355 -0
  54. examples/swe/task_app/hosted/envs/mini_swe/shared.py +83 -0
  55. examples/swe/task_app/hosted/envs/mini_swe/tools.py +96 -0
  56. examples/swe/task_app/hosted/hosted_app.py +204 -0
  57. examples/swe/task_app/hosted/inference/__init__.py +5 -0
  58. examples/swe/task_app/hosted/inference/openai_client.py +618 -0
  59. examples/swe/task_app/hosted/main.py +100 -0
  60. examples/swe/task_app/hosted/policy_routes.py +1079 -0
  61. examples/swe/task_app/hosted/registry.py +195 -0
  62. examples/swe/task_app/hosted/rollout.py +1869 -0
  63. examples/swe/task_app/hosted/storage/__init__.py +5 -0
  64. examples/swe/task_app/hosted/storage/volume.py +211 -0
  65. examples/swe/task_app/hosted/test_agents.py +161 -0
  66. examples/swe/task_app/hosted/test_service.py +137 -0
  67. examples/swe/task_app/hosted/utils.py +62 -0
  68. examples/vlm/PROPOSAL.md +53 -0
  69. examples/vlm/README.md +68 -0
  70. examples/vlm/configs/crafter_vlm_gpt4o.toml +44 -0
  71. examples/vlm/crafter_image_only_agent.py +207 -0
  72. examples/vlm/crafter_openai_vlm_agent.py +277 -0
  73. examples/vlm/filter_image_rows.py +63 -0
  74. examples/vlm/run_crafter_vlm_benchmark.py +316 -0
  75. examples/warming_up_to_rl/analyze_trace_db.py +12 -10
  76. examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +11 -1
  77. examples/warming_up_to_rl/export_trace_sft.py +218 -36
  78. examples/warming_up_to_rl/groq_test.py +15 -8
  79. examples/warming_up_to_rl/manage_secrets.py +29 -25
  80. examples/warming_up_to_rl/readme.md +9 -2
  81. examples/warming_up_to_rl/run_eval.py +137 -61
  82. examples/warming_up_to_rl/run_fft_and_save.py +131 -60
  83. examples/warming_up_to_rl/run_local_rollout.py +88 -39
  84. examples/warming_up_to_rl/run_local_rollout_modal.py +114 -28
  85. examples/warming_up_to_rl/run_local_rollout_parallel.py +81 -20
  86. examples/warming_up_to_rl/run_local_rollout_traced.py +126 -23
  87. examples/warming_up_to_rl/run_rl_and_save.py +35 -12
  88. examples/warming_up_to_rl/run_rollout_remote.py +44 -19
  89. examples/warming_up_to_rl/task_app/README.md +6 -2
  90. examples/warming_up_to_rl/task_app/grpo_crafter.py +319 -57
  91. examples/warming_up_to_rl/task_app/grpo_crafter_task_app.py +11 -30
  92. examples/warming_up_to_rl/task_app/synth_envs_hosted/__init__.py +1 -1
  93. examples/warming_up_to_rl/task_app/synth_envs_hosted/branching.py +9 -11
  94. examples/warming_up_to_rl/task_app/synth_envs_hosted/environment_routes.py +137 -182
  95. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/__init__.py +1 -1
  96. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/__init__.py +1 -1
  97. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/app.py +1 -1
  98. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/environment.py +150 -57
  99. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/policy.py +105 -69
  100. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/react_agent.py +19 -7
  101. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/shared.py +45 -42
  102. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/tools.py +1 -1
  103. examples/warming_up_to_rl/task_app/synth_envs_hosted/hosted_app.py +47 -45
  104. examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/__init__.py +1 -1
  105. examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py +198 -92
  106. examples/warming_up_to_rl/task_app/synth_envs_hosted/main.py +0 -2
  107. examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py +361 -263
  108. examples/warming_up_to_rl/task_app/synth_envs_hosted/registry.py +21 -23
  109. examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py +394 -274
  110. examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/__init__.py +1 -1
  111. examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/volume.py +56 -62
  112. examples/warming_up_to_rl/task_app/synth_envs_hosted/test_agents.py +1 -0
  113. examples/warming_up_to_rl/task_app/synth_envs_hosted/test_service.py +6 -15
  114. examples/warming_up_to_rl/task_app/synth_envs_hosted/utils.py +4 -3
  115. synth_ai/__init__.py +1 -0
  116. synth_ai/api/models/supported.py +376 -0
  117. synth_ai/api/train/builders.py +157 -26
  118. synth_ai/api/train/cli.py +213 -57
  119. synth_ai/api/train/config_finder.py +65 -5
  120. synth_ai/api/train/env_resolver.py +33 -15
  121. synth_ai/api/train/pollers.py +13 -4
  122. synth_ai/api/train/supported_algos.py +139 -0
  123. synth_ai/api/train/task_app.py +5 -3
  124. synth_ai/api/train/utils.py +33 -48
  125. synth_ai/cli/__init__.py +19 -4
  126. synth_ai/cli/_modal_wrapper.py +28 -0
  127. synth_ai/cli/_typer_patch.py +49 -0
  128. synth_ai/cli/balance.py +2 -3
  129. synth_ai/cli/calc.py +1 -1
  130. synth_ai/cli/demo.py +21 -6
  131. synth_ai/cli/recent.py +2 -2
  132. synth_ai/cli/rl_demo.py +77 -17
  133. synth_ai/cli/root.py +116 -39
  134. synth_ai/cli/status.py +2 -2
  135. synth_ai/cli/task_apps.py +1699 -259
  136. synth_ai/cli/traces.py +7 -4
  137. synth_ai/cli/turso.py +73 -0
  138. synth_ai/cli/watch.py +12 -18
  139. synth_ai/core/experiment.py +0 -2
  140. synth_ai/demo_registry.py +68 -31
  141. synth_ai/demos/core/cli.py +516 -194
  142. synth_ai/demos/demo_task_apps/__init__.py +3 -3
  143. synth_ai/demos/demo_task_apps/core.py +64 -28
  144. synth_ai/demos/demo_task_apps/crafter/configs/crafter_fft_4b.toml +2 -3
  145. synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +37 -30
  146. synth_ai/demos/demo_task_apps/math/_common.py +1 -2
  147. synth_ai/demos/demo_task_apps/math/app.py +2 -1
  148. synth_ai/demos/demo_task_apps/math/deploy_modal.py +3 -6
  149. synth_ai/demos/demo_task_apps/math/modal_task_app.py +183 -82
  150. synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -2
  151. synth_ai/environments/examples/bandit/engine.py +12 -4
  152. synth_ai/environments/examples/bandit/taskset.py +4 -4
  153. synth_ai/environments/examples/crafter_classic/environment.py +76 -1
  154. synth_ai/environments/reproducibility/tree.py +5 -6
  155. synth_ai/environments/service/app.py +11 -12
  156. synth_ai/environments/service/core_routes.py +10 -9
  157. synth_ai/environments/stateful/engine.py +1 -1
  158. synth_ai/environments/tasks/core.py +1 -0
  159. synth_ai/environments/tasks/filters.py +5 -6
  160. synth_ai/environments/tasks/utils.py +4 -5
  161. synth_ai/evals/base.py +0 -2
  162. synth_ai/handshake.py +11 -9
  163. synth_ai/http.py +1 -1
  164. synth_ai/http_client.py +43 -11
  165. synth_ai/inference/__init__.py +0 -2
  166. synth_ai/inference/client.py +20 -6
  167. synth_ai/jobs/client.py +103 -78
  168. synth_ai/learning/__init__.py +41 -6
  169. synth_ai/learning/algorithms.py +14 -0
  170. synth_ai/learning/client.py +121 -29
  171. synth_ai/learning/config.py +2 -40
  172. synth_ai/learning/constants.py +0 -2
  173. synth_ai/learning/ft_client.py +4 -56
  174. synth_ai/learning/health.py +13 -7
  175. synth_ai/learning/jobs.py +43 -47
  176. synth_ai/{rl → learning/rl}/__init__.py +14 -5
  177. synth_ai/learning/rl/client.py +267 -0
  178. synth_ai/learning/rl/config.py +31 -0
  179. synth_ai/{rl → learning/rl}/contracts.py +5 -10
  180. synth_ai/{rl → learning/rl}/env_keys.py +45 -16
  181. synth_ai/learning/rl/secrets.py +13 -0
  182. synth_ai/learning/rl_client.py +2 -253
  183. synth_ai/learning/sft/__init__.py +29 -0
  184. synth_ai/learning/sft/client.py +68 -0
  185. synth_ai/learning/sft/config.py +270 -0
  186. synth_ai/learning/sft/data.py +295 -0
  187. synth_ai/learning/sse.py +25 -26
  188. synth_ai/learning/validators.py +25 -24
  189. synth_ai/lm/__init__.py +21 -47
  190. synth_ai/task/__init__.py +26 -27
  191. synth_ai/task/apps/__init__.py +18 -19
  192. synth_ai/task/auth.py +35 -23
  193. synth_ai/task/client.py +15 -13
  194. synth_ai/task/contracts.py +37 -35
  195. synth_ai/task/datasets.py +9 -6
  196. synth_ai/task/errors.py +11 -10
  197. synth_ai/task/health.py +17 -11
  198. synth_ai/task/json.py +58 -24
  199. synth_ai/task/proxy.py +15 -14
  200. synth_ai/task/rubrics.py +22 -15
  201. synth_ai/task/server.py +43 -17
  202. synth_ai/task/tracing_utils.py +12 -7
  203. synth_ai/task/validators.py +0 -1
  204. synth_ai/task/vendors.py +5 -7
  205. synth_ai/tracing_v3/__init__.py +2 -0
  206. synth_ai/tracing_v3/abstractions.py +21 -4
  207. synth_ai/tracing_v3/db_config.py +26 -1
  208. synth_ai/tracing_v3/decorators.py +18 -15
  209. synth_ai/tracing_v3/examples/basic_usage.py +3 -2
  210. synth_ai/tracing_v3/hooks.py +6 -4
  211. synth_ai/tracing_v3/llm_call_record_helpers.py +6 -6
  212. synth_ai/tracing_v3/replica_sync.py +1 -0
  213. synth_ai/tracing_v3/session_tracer.py +63 -16
  214. synth_ai/tracing_v3/storage/base.py +89 -1
  215. synth_ai/tracing_v3/storage/config.py +21 -8
  216. synth_ai/tracing_v3/storage/factory.py +10 -8
  217. synth_ai/tracing_v3/storage/utils.py +4 -2
  218. synth_ai/tracing_v3/turso/daemon.py +7 -2
  219. synth_ai/tracing_v3/turso/models.py +5 -2
  220. synth_ai/tracing_v3/turso/native_manager.py +1173 -0
  221. synth_ai/tracing_v3/utils.py +4 -3
  222. synth_ai/v0/api/__init__.py +8 -0
  223. synth_ai/v0/api/models/__init__.py +8 -0
  224. synth_ai/v0/api/models/supported.py +8 -0
  225. synth_ai/v0/config/__init__.py +15 -0
  226. synth_ai/v0/config/base_url.py +12 -0
  227. synth_ai/v0/lm/__init__.py +51 -0
  228. synth_ai/{lm → v0/lm}/caching/ephemeral.py +3 -5
  229. synth_ai/{lm → v0/lm}/caching/handler.py +4 -4
  230. synth_ai/{lm → v0/lm}/caching/initialize.py +1 -1
  231. synth_ai/{lm → v0/lm}/caching/persistent.py +1 -1
  232. synth_ai/{lm → v0/lm}/config.py +6 -1
  233. synth_ai/{lm → v0/lm}/core/all.py +9 -9
  234. synth_ai/{lm → v0/lm}/core/exceptions.py +0 -2
  235. synth_ai/{lm → v0/lm}/core/main.py +19 -7
  236. synth_ai/{lm → v0/lm}/core/main_v3.py +10 -10
  237. synth_ai/{lm → v0/lm}/core/synth_models.py +2 -15
  238. synth_ai/{lm → v0/lm}/core/vendor_clients.py +6 -4
  239. synth_ai/{lm → v0/lm}/overrides.py +4 -4
  240. synth_ai/{lm → v0/lm}/provider_support/anthropic.py +4 -4
  241. synth_ai/{lm → v0/lm}/provider_support/openai.py +5 -5
  242. synth_ai/{lm → v0/lm}/structured_outputs/handler.py +5 -5
  243. synth_ai/{lm → v0/lm}/structured_outputs/rehabilitate.py +1 -1
  244. synth_ai/{lm → v0/lm}/vendors/core/anthropic_api.py +16 -16
  245. synth_ai/{lm → v0/lm}/vendors/core/gemini_api.py +5 -5
  246. synth_ai/{lm → v0/lm}/vendors/core/mistral_api.py +5 -5
  247. synth_ai/{lm → v0/lm}/vendors/core/openai_api.py +12 -10
  248. synth_ai/{lm → v0/lm}/vendors/openai_standard.py +11 -9
  249. synth_ai/{lm → v0/lm}/vendors/openai_standard_responses.py +8 -5
  250. synth_ai/{lm → v0/lm}/vendors/supported/custom_endpoint.py +4 -6
  251. synth_ai/{lm → v0/lm}/vendors/supported/deepseek.py +2 -2
  252. synth_ai/{lm → v0/lm}/vendors/supported/grok.py +2 -2
  253. synth_ai/{lm → v0/lm}/vendors/supported/groq.py +1 -1
  254. synth_ai/{lm → v0/lm}/vendors/supported/ollama.py +1 -1
  255. synth_ai/{lm → v0/lm}/vendors/supported/openrouter.py +3 -3
  256. synth_ai/{lm → v0/lm}/vendors/supported/together.py +1 -1
  257. synth_ai/{lm → v0/lm}/vendors/synth_client.py +38 -11
  258. synth_ai/v0/tracing/upload.py +32 -135
  259. synth_ai/v0/tracing_v3/__init__.py +10 -0
  260. synth_ai/v0/tracing_v3/abstractions.py +3 -0
  261. synth_ai/v0/tracing_v3/decorators.py +3 -0
  262. synth_ai/v0/tracing_v3/llm_call_record_helpers.py +3 -0
  263. synth_ai/v0/tracing_v3/session_tracer.py +3 -0
  264. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/METADATA +10 -7
  265. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/RECORD +294 -258
  266. examples/common_old/backend.py +0 -21
  267. examples/evals_old/README.md +0 -98
  268. examples/evals_old/__init__.py +0 -6
  269. examples/evals_old/compare_models.py +0 -1037
  270. examples/evals_old/example_log.md +0 -145
  271. examples/evals_old/run_demo.sh +0 -126
  272. examples/evals_old/trace_analysis.py +0 -270
  273. examples/finetuning_old/_backup_synth_qwen/config.toml +0 -29
  274. examples/finetuning_old/_backup_synth_qwen/example_log.md +0 -324
  275. examples/finetuning_old/_backup_synth_qwen/filter_traces.py +0 -60
  276. examples/finetuning_old/_backup_synth_qwen/filter_traces_achievements.py +0 -239
  277. examples/finetuning_old/_backup_synth_qwen/purge_v3_traces.py +0 -109
  278. examples/finetuning_old/_backup_synth_qwen/react_agent_lm.py +0 -1924
  279. examples/finetuning_old/_backup_synth_qwen/readme.md +0 -49
  280. examples/finetuning_old/_backup_synth_qwen/run_crafter_qwen4b.py +0 -114
  281. examples/finetuning_old/_backup_synth_qwen/run_demo.sh +0 -195
  282. examples/finetuning_old/_backup_synth_qwen/sft_kickoff.py +0 -118
  283. examples/finetuning_old/synth_qwen_v1/README.md +0 -68
  284. examples/finetuning_old/synth_qwen_v1/filter_traces.py +0 -60
  285. examples/finetuning_old/synth_qwen_v1/filter_traces_achievements.py +0 -239
  286. examples/finetuning_old/synth_qwen_v1/finetune.py +0 -46
  287. examples/finetuning_old/synth_qwen_v1/hello_ft_model.py +0 -71
  288. examples/finetuning_old/synth_qwen_v1/infer.py +0 -37
  289. examples/finetuning_old/synth_qwen_v1/poll.py +0 -44
  290. examples/finetuning_old/synth_qwen_v1/prepare_data.py +0 -35
  291. examples/finetuning_old/synth_qwen_v1/purge_v3_traces.py +0 -109
  292. examples/finetuning_old/synth_qwen_v1/react_agent_lm.py +0 -1932
  293. examples/finetuning_old/synth_qwen_v1/run_crafter_sft_job.py +0 -207
  294. examples/finetuning_old/synth_qwen_v1/run_ft_job.py +0 -232
  295. examples/finetuning_old/synth_qwen_v1/upload_data.py +0 -34
  296. examples/finetuning_old/synth_qwen_v1/util.py +0 -147
  297. examples/rl_old/task_app.py +0 -962
  298. synth_ai/experimental/synth_oss.py +0 -446
  299. synth_ai/install_sqld.sh +0 -40
  300. synth_ai/learning/filtering.py +0 -0
  301. synth_ai/learning/offline/dpo.py +0 -0
  302. synth_ai/learning/offline/providers.py +0 -7
  303. synth_ai/learning/offline/sft.py +0 -0
  304. synth_ai/learning/offline/shared.py +0 -0
  305. synth_ai/learning/online/grpo.py +0 -0
  306. synth_ai/learning/online/irft.py +0 -0
  307. synth_ai/learning/prompts/banking77_injection_eval.py +0 -168
  308. synth_ai/learning/prompts/gepa.py +0 -0
  309. synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +0 -213
  310. synth_ai/learning/prompts/mipro.py +0 -289
  311. synth_ai/learning/prompts/random_search.py +0 -246
  312. synth_ai/learning/prompts/run_mipro_banking77.py +0 -172
  313. synth_ai/learning/prompts/run_random_search_banking77.py +0 -324
  314. synth_ai/rl/secrets.py +0 -19
  315. synth_ai/scripts/verify_rewards.py +0 -100
  316. synth_ai/tracing/__init__.py +0 -30
  317. synth_ai/tracing_v1/__init__.py +0 -33
  318. synth_ai/tracing_v3/turso/__init__.py +0 -25
  319. synth_ai/tracing_v3/turso/manager.py +0 -774
  320. synth_ai/zyk/__init__.py +0 -30
  321. /synth_ai/{lm → v0/lm}/caching/__init__.py +0 -0
  322. /synth_ai/{lm → v0/lm}/caching/constants.py +0 -0
  323. /synth_ai/{lm → v0/lm}/caching/dbs.py +0 -0
  324. /synth_ai/{lm → v0/lm}/constants.py +0 -0
  325. /synth_ai/{lm → v0/lm}/core/__init__.py +0 -0
  326. /synth_ai/{lm → v0/lm}/cost/__init__.py +0 -0
  327. /synth_ai/{lm → v0/lm}/cost/monitor.py +0 -0
  328. /synth_ai/{lm → v0/lm}/cost/statefulness.py +0 -0
  329. /synth_ai/{lm → v0/lm}/injection.py +0 -0
  330. /synth_ai/{lm → v0/lm}/provider_support/__init__.py +0 -0
  331. /synth_ai/{lm → v0/lm}/provider_support/suppress_logging.py +0 -0
  332. /synth_ai/{lm → v0/lm}/structured_outputs/__init__.py +0 -0
  333. /synth_ai/{lm → v0/lm}/structured_outputs/inject.py +0 -0
  334. /synth_ai/{lm → v0/lm}/tools/__init__.py +0 -0
  335. /synth_ai/{lm → v0/lm}/tools/base.py +0 -0
  336. /synth_ai/{lm → v0/lm}/unified_interface.py +0 -0
  337. /synth_ai/{lm → v0/lm}/vendors/__init__.py +0 -0
  338. /synth_ai/{lm → v0/lm}/vendors/base.py +0 -0
  339. /synth_ai/{lm → v0/lm}/vendors/core/__init__.py +0 -0
  340. /synth_ai/{lm → v0/lm}/vendors/core/synth_dev_api.py +0 -0
  341. /synth_ai/{lm → v0/lm}/vendors/local/__init__.py +0 -0
  342. /synth_ai/{lm → v0/lm}/vendors/local/ollama.py +0 -0
  343. /synth_ai/{lm → v0/lm}/vendors/retries.py +0 -0
  344. /synth_ai/{lm → v0/lm}/vendors/supported/__init__.py +0 -0
  345. /synth_ai/{lm → v0/lm}/warmup.py +0 -0
  346. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/WHEEL +0 -0
  347. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/entry_points.txt +0 -0
  348. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/licenses/LICENSE +0 -0
  349. {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/top_level.txt +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
-