synth-ai 0.2.6.dev1__py3-none-any.whl → 0.4.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (738) hide show
  1. synth_ai/__init__.py +44 -24
  2. synth_ai/__main__.py +30 -3
  3. synth_ai/cli/__init__.py +103 -48
  4. synth_ai/cli/__main__.py +42 -0
  5. synth_ai/cli/_internal/__init__.py +5 -0
  6. synth_ai/cli/_internal/modal_wrapper.py +31 -0
  7. synth_ai/cli/_internal/storage.py +20 -0
  8. synth_ai/cli/_internal/typer_patch.py +47 -0
  9. synth_ai/cli/_internal/validate_task_app.py +29 -0
  10. synth_ai/cli/agents/__init__.py +17 -0
  11. synth_ai/cli/agents/claude.py +77 -0
  12. synth_ai/cli/agents/codex.py +265 -0
  13. synth_ai/cli/agents/opencode.py +253 -0
  14. synth_ai/cli/commands/__init__.py +18 -0
  15. synth_ai/cli/commands/artifacts/__init__.py +13 -0
  16. synth_ai/cli/commands/artifacts/client.py +119 -0
  17. synth_ai/cli/commands/artifacts/config.py +57 -0
  18. synth_ai/cli/commands/artifacts/core.py +24 -0
  19. synth_ai/cli/commands/artifacts/download.py +188 -0
  20. synth_ai/cli/commands/artifacts/export.py +186 -0
  21. synth_ai/cli/commands/artifacts/list.py +156 -0
  22. synth_ai/cli/commands/artifacts/parsing.py +250 -0
  23. synth_ai/cli/commands/artifacts/show.py +336 -0
  24. synth_ai/cli/commands/demo/__init__.py +3 -0
  25. synth_ai/cli/commands/demo/core.py +153 -0
  26. synth_ai/cli/commands/eval/__init__.py +10 -0
  27. synth_ai/cli/commands/eval/config.py +338 -0
  28. synth_ai/cli/commands/eval/core.py +256 -0
  29. synth_ai/cli/commands/eval/runner.py +704 -0
  30. synth_ai/cli/commands/eval/validation.py +60 -0
  31. synth_ai/cli/commands/filter/__init__.py +12 -0
  32. synth_ai/cli/commands/filter/core.py +424 -0
  33. synth_ai/cli/commands/filter/errors.py +55 -0
  34. synth_ai/cli/commands/filter/validation.py +77 -0
  35. synth_ai/cli/commands/help/__init__.py +185 -0
  36. synth_ai/cli/commands/help/core.py +72 -0
  37. synth_ai/cli/commands/scan/__init__.py +19 -0
  38. synth_ai/cli/commands/scan/cloudflare_scanner.py +403 -0
  39. synth_ai/cli/commands/scan/core.py +344 -0
  40. synth_ai/cli/commands/scan/health_checker.py +242 -0
  41. synth_ai/cli/commands/scan/local_scanner.py +278 -0
  42. synth_ai/cli/commands/scan/models.py +83 -0
  43. synth_ai/cli/commands/smoke/__init__.py +7 -0
  44. synth_ai/cli/commands/smoke/core.py +1428 -0
  45. synth_ai/cli/commands/status/__init__.py +3 -0
  46. synth_ai/cli/commands/status/client.py +91 -0
  47. synth_ai/cli/commands/status/config.py +12 -0
  48. synth_ai/cli/commands/status/errors.py +11 -0
  49. synth_ai/cli/commands/status/subcommands/__init__.py +3 -0
  50. synth_ai/cli/commands/status/subcommands/config.py +13 -0
  51. synth_ai/cli/commands/status/subcommands/files.py +34 -0
  52. synth_ai/cli/commands/status/subcommands/jobs.py +51 -0
  53. synth_ai/cli/commands/status/subcommands/models.py +35 -0
  54. synth_ai/cli/commands/status/subcommands/runs.py +34 -0
  55. synth_ai/cli/commands/status/subcommands/session.py +77 -0
  56. synth_ai/cli/commands/status/subcommands/summary.py +39 -0
  57. synth_ai/cli/commands/status/subcommands/utils.py +41 -0
  58. synth_ai/cli/commands/status/utils.py +23 -0
  59. synth_ai/cli/commands/train/__init__.py +53 -0
  60. synth_ai/cli/commands/train/core.py +22 -0
  61. synth_ai/cli/commands/train/errors.py +117 -0
  62. synth_ai/cli/commands/train/judge_schemas.py +201 -0
  63. synth_ai/cli/commands/train/judge_validation.py +305 -0
  64. synth_ai/cli/commands/train/prompt_learning_validation.py +633 -0
  65. synth_ai/cli/commands/train/validation.py +392 -0
  66. synth_ai/cli/demo_apps/__init__.py +10 -0
  67. synth_ai/cli/demo_apps/core/__init__.py +28 -0
  68. synth_ai/cli/demo_apps/core/cli.py +1735 -0
  69. synth_ai/cli/demo_apps/crafter/__init__.py +1 -0
  70. synth_ai/cli/demo_apps/crafter/crafter_fft_4b.toml +55 -0
  71. synth_ai/cli/demo_apps/crafter/grpo_crafter_task_app.py +186 -0
  72. synth_ai/cli/demo_apps/crafter/rl_from_base_qwen4b.toml +74 -0
  73. synth_ai/cli/demo_apps/demo_registry.py +176 -0
  74. synth_ai/cli/demo_apps/demo_task_apps/__init__.py +7 -0
  75. synth_ai/{demos → cli/demo_apps}/demo_task_apps/core.py +117 -51
  76. synth_ai/cli/demo_apps/demo_task_apps/crafter/__init__.py +1 -0
  77. synth_ai/cli/demo_apps/demo_task_apps/crafter/configs/crafter_fft_4b.toml +53 -0
  78. synth_ai/cli/demo_apps/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +73 -0
  79. synth_ai/cli/demo_apps/demo_task_apps/crafter/grpo_crafter_task_app.py +185 -0
  80. synth_ai/cli/demo_apps/demo_task_apps/math/_common.py +16 -0
  81. synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/app.py +2 -1
  82. synth_ai/cli/demo_apps/demo_task_apps/math/config.toml +73 -0
  83. synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/deploy_modal.py +3 -6
  84. synth_ai/cli/demo_apps/demo_task_apps/math/modal_task_app.py +738 -0
  85. synth_ai/cli/demo_apps/demo_task_apps/math/task_app_entry.py +39 -0
  86. synth_ai/cli/demo_apps/math/__init__.py +1 -0
  87. synth_ai/cli/demo_apps/math/_common.py +16 -0
  88. synth_ai/cli/demo_apps/math/app.py +38 -0
  89. synth_ai/cli/demo_apps/math/config.toml +75 -0
  90. synth_ai/cli/demo_apps/math/deploy_modal.py +54 -0
  91. synth_ai/cli/demo_apps/math/modal_task_app.py +698 -0
  92. synth_ai/cli/demo_apps/math/task_app_entry.py +53 -0
  93. synth_ai/cli/demo_apps/mipro/main.py +271 -0
  94. synth_ai/cli/demo_apps/mipro/task_app.py +922 -0
  95. synth_ai/cli/demo_apps/mipro/train_cfg.toml +92 -0
  96. synth_ai/cli/demos/__init__.py +12 -0
  97. synth_ai/cli/demos/demo.py +32 -0
  98. synth_ai/cli/demos/rl_demo.py +254 -0
  99. synth_ai/cli/deploy.py +216 -0
  100. synth_ai/cli/infra/__init__.py +14 -0
  101. synth_ai/cli/{balance.py → infra/balance.py} +21 -3
  102. synth_ai/cli/infra/mcp.py +35 -0
  103. synth_ai/cli/infra/modal_app.py +36 -0
  104. synth_ai/cli/infra/setup.py +69 -0
  105. synth_ai/cli/infra/status.py +16 -0
  106. synth_ai/cli/infra/turso.py +77 -0
  107. synth_ai/cli/lib/__init__.py +10 -0
  108. synth_ai/cli/lib/agents.py +76 -0
  109. synth_ai/cli/lib/apps/modal_app.py +101 -0
  110. synth_ai/cli/lib/apps/task_app.py +642 -0
  111. synth_ai/cli/lib/bin.py +39 -0
  112. synth_ai/cli/lib/env.py +375 -0
  113. synth_ai/cli/lib/errors.py +85 -0
  114. synth_ai/cli/lib/modal.py +315 -0
  115. synth_ai/cli/lib/plotting.py +126 -0
  116. synth_ai/cli/lib/prompt_args.py +39 -0
  117. synth_ai/cli/lib/prompts.py +284 -0
  118. synth_ai/cli/lib/sqld.py +122 -0
  119. synth_ai/cli/lib/task_app_discovery.py +884 -0
  120. synth_ai/cli/lib/task_app_env.py +295 -0
  121. synth_ai/cli/lib/train_cfgs.py +300 -0
  122. synth_ai/cli/lib/tunnel_records.py +207 -0
  123. synth_ai/cli/local/__init__.py +14 -0
  124. synth_ai/cli/local/experiment_queue/__init__.py +72 -0
  125. synth_ai/cli/local/experiment_queue/api_schemas.py +221 -0
  126. synth_ai/cli/local/experiment_queue/celery_app.py +208 -0
  127. synth_ai/cli/local/experiment_queue/config.py +128 -0
  128. synth_ai/cli/local/experiment_queue/config_utils.py +272 -0
  129. synth_ai/cli/local/experiment_queue/database.py +175 -0
  130. synth_ai/cli/local/experiment_queue/dispatcher.py +119 -0
  131. synth_ai/cli/local/experiment_queue/models.py +231 -0
  132. synth_ai/cli/local/experiment_queue/progress_info.py +160 -0
  133. synth_ai/cli/local/experiment_queue/results.py +373 -0
  134. synth_ai/cli/local/experiment_queue/schemas.py +131 -0
  135. synth_ai/cli/local/experiment_queue/service.py +344 -0
  136. synth_ai/cli/local/experiment_queue/status.py +372 -0
  137. synth_ai/cli/local/experiment_queue/status_tracker.py +360 -0
  138. synth_ai/cli/local/experiment_queue/tasks.py +1984 -0
  139. synth_ai/cli/local/experiment_queue/trace_storage.py +65 -0
  140. synth_ai/cli/local/experiment_queue/validation.py +157 -0
  141. synth_ai/cli/local/session/__init__.py +92 -0
  142. synth_ai/cli/local/session/client.py +383 -0
  143. synth_ai/cli/local/session/constants.py +63 -0
  144. synth_ai/cli/local/session/exceptions.py +105 -0
  145. synth_ai/cli/local/session/manager.py +139 -0
  146. synth_ai/cli/local/session/models.py +89 -0
  147. synth_ai/cli/local/session/query.py +110 -0
  148. synth_ai/cli/root.py +150 -102
  149. synth_ai/cli/task_apps/__init__.py +37 -0
  150. synth_ai/cli/task_apps/commands.py +3145 -0
  151. synth_ai/cli/task_apps/deploy.py +7 -0
  152. synth_ai/cli/task_apps/list.py +26 -0
  153. synth_ai/cli/task_apps/main.py +36 -0
  154. synth_ai/cli/task_apps/modal_serve.py +11 -0
  155. synth_ai/cli/task_apps/serve.py +11 -0
  156. synth_ai/cli/training/__init__.py +8 -0
  157. synth_ai/cli/training/train.py +5 -0
  158. synth_ai/cli/training/train_cfg.py +34 -0
  159. synth_ai/cli/{watch.py → training/watch.py} +13 -18
  160. synth_ai/cli/turso.py +52 -0
  161. synth_ai/cli/utils/__init__.py +8 -0
  162. synth_ai/cli/utils/experiments.py +235 -0
  163. synth_ai/cli/utils/queue.py +504 -0
  164. synth_ai/cli/{recent.py → utils/recent.py} +13 -7
  165. synth_ai/cli/{traces.py → utils/traces.py} +9 -5
  166. synth_ai/contracts/__init__.py +67 -0
  167. synth_ai/core/__init__.py +100 -0
  168. synth_ai/core/_utils/__init__.py +54 -0
  169. synth_ai/core/_utils/base_url.py +10 -0
  170. synth_ai/core/_utils/http.py +10 -0
  171. synth_ai/core/_utils/prompts.py +14 -0
  172. synth_ai/core/_utils/task_app_state.py +12 -0
  173. synth_ai/core/_utils/user_config.py +10 -0
  174. synth_ai/core/apps/common.py +116 -0
  175. synth_ai/core/auth.py +95 -0
  176. synth_ai/core/cfgs.py +240 -0
  177. synth_ai/core/config/__init__.py +16 -0
  178. synth_ai/core/config/base.py +168 -0
  179. synth_ai/core/config/resolver.py +89 -0
  180. synth_ai/core/env.py +231 -0
  181. synth_ai/core/errors.py +126 -0
  182. synth_ai/core/http.py +230 -0
  183. synth_ai/core/integrations/__init__.py +11 -0
  184. synth_ai/core/integrations/cloudflare.py +1710 -0
  185. synth_ai/core/integrations/mcp/__init__.py +6 -0
  186. synth_ai/core/integrations/mcp/__main__.py +8 -0
  187. synth_ai/core/integrations/mcp/claude.py +36 -0
  188. synth_ai/core/integrations/mcp/main.py +254 -0
  189. synth_ai/core/integrations/mcp/setup.py +100 -0
  190. synth_ai/core/integrations/modal.py +277 -0
  191. synth_ai/core/json.py +72 -0
  192. synth_ai/core/log_filter.py +99 -0
  193. synth_ai/core/logging.py +82 -0
  194. synth_ai/core/paths.py +107 -0
  195. synth_ai/core/pricing.py +109 -0
  196. synth_ai/core/process.py +233 -0
  197. synth_ai/core/ssl.py +25 -0
  198. synth_ai/core/storage/__init__.py +71 -0
  199. synth_ai/core/task_app_state.py +318 -0
  200. synth_ai/core/telemetry.py +282 -0
  201. synth_ai/{tracing_v3 → core/tracing_v3}/__init__.py +5 -1
  202. synth_ai/{tracing_v3 → core/tracing_v3}/abstractions.py +21 -4
  203. synth_ai/core/tracing_v3/config.py +229 -0
  204. synth_ai/core/tracing_v3/constants.py +21 -0
  205. synth_ai/{tracing_v3 → core/tracing_v3}/db_config.py +42 -29
  206. synth_ai/{tracing_v3 → core/tracing_v3}/decorators.py +80 -45
  207. synth_ai/{tracing_v3 → core/tracing_v3}/examples/basic_usage.py +15 -9
  208. synth_ai/{tracing_v3 → core/tracing_v3}/hooks.py +6 -4
  209. synth_ai/{tracing_v3 → core/tracing_v3}/llm_call_record_helpers.py +161 -61
  210. synth_ai/{tracing_v3 → core/tracing_v3}/migration_helper.py +1 -2
  211. synth_ai/{tracing_v3 → core/tracing_v3}/replica_sync.py +12 -7
  212. synth_ai/core/tracing_v3/serialization.py +130 -0
  213. synth_ai/{tracing_v3 → core/tracing_v3}/session_tracer.py +88 -21
  214. synth_ai/{tracing_v3 → core/tracing_v3}/storage/base.py +99 -12
  215. synth_ai/core/tracing_v3/storage/config.py +109 -0
  216. synth_ai/{tracing_v3 → core/tracing_v3}/storage/factory.py +11 -9
  217. synth_ai/{tracing_v3 → core/tracing_v3}/storage/utils.py +15 -11
  218. synth_ai/core/tracing_v3/trace_utils.py +326 -0
  219. synth_ai/core/tracing_v3/turso/__init__.py +12 -0
  220. synth_ai/core/tracing_v3/turso/daemon.py +278 -0
  221. synth_ai/{tracing_v3 → core/tracing_v3}/turso/models.py +7 -3
  222. synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
  223. synth_ai/{tracing_v3 → core/tracing_v3}/utils.py +5 -4
  224. synth_ai/core/urls.py +18 -0
  225. synth_ai/core/user_config.py +137 -0
  226. synth_ai/core/uvicorn.py +222 -0
  227. synth_ai/data/__init__.py +83 -0
  228. synth_ai/data/enums.py +123 -0
  229. synth_ai/data/rewards.py +152 -0
  230. synth_ai/data/traces.py +35 -0
  231. synth_ai/products/__init__.py +6 -0
  232. synth_ai/products/graph_evolve/__init__.py +46 -0
  233. synth_ai/products/graph_evolve/client.py +226 -0
  234. synth_ai/products/graph_evolve/config.py +591 -0
  235. synth_ai/products/graph_evolve/converters/__init__.py +42 -0
  236. synth_ai/products/graph_evolve/converters/openai_sft.py +484 -0
  237. synth_ai/products/graph_evolve/examples/hotpotqa/config.toml +109 -0
  238. synth_ai/products/graph_evolve/run.py +222 -0
  239. synth_ai/products/graph_gepa/__init__.py +23 -0
  240. synth_ai/products/graph_gepa/converters/__init__.py +19 -0
  241. synth_ai/products/graph_gepa/converters/openai_sft.py +29 -0
  242. synth_ai/sdk/__init__.py +123 -0
  243. synth_ai/sdk/api/__init__.py +1 -0
  244. synth_ai/sdk/api/models/supported.py +514 -0
  245. synth_ai/sdk/api/research_agent/__init__.py +296 -0
  246. synth_ai/sdk/api/train/__init__.py +85 -0
  247. synth_ai/sdk/api/train/builders.py +895 -0
  248. synth_ai/sdk/api/train/cli.py +2199 -0
  249. synth_ai/sdk/api/train/config_finder.py +267 -0
  250. synth_ai/sdk/api/train/configs/__init__.py +65 -0
  251. synth_ai/sdk/api/train/configs/prompt_learning.py +1706 -0
  252. synth_ai/sdk/api/train/configs/rl.py +187 -0
  253. synth_ai/sdk/api/train/configs/sft.py +99 -0
  254. synth_ai/sdk/api/train/configs/shared.py +81 -0
  255. synth_ai/sdk/api/train/context_learning.py +312 -0
  256. synth_ai/sdk/api/train/env_resolver.py +418 -0
  257. synth_ai/sdk/api/train/graph_validators.py +216 -0
  258. synth_ai/sdk/api/train/graphgen.py +984 -0
  259. synth_ai/sdk/api/train/graphgen_models.py +823 -0
  260. synth_ai/sdk/api/train/graphgen_validators.py +109 -0
  261. synth_ai/sdk/api/train/local_api.py +10 -0
  262. synth_ai/sdk/api/train/pollers.py +124 -0
  263. synth_ai/sdk/api/train/progress/__init__.py +97 -0
  264. synth_ai/sdk/api/train/progress/dataclasses.py +569 -0
  265. synth_ai/sdk/api/train/progress/events.py +326 -0
  266. synth_ai/sdk/api/train/progress/results.py +428 -0
  267. synth_ai/sdk/api/train/progress/tracker.py +641 -0
  268. synth_ai/sdk/api/train/prompt_learning.py +469 -0
  269. synth_ai/sdk/api/train/rl.py +441 -0
  270. synth_ai/sdk/api/train/sft.py +396 -0
  271. synth_ai/sdk/api/train/summary.py +522 -0
  272. synth_ai/sdk/api/train/supported_algos.py +147 -0
  273. synth_ai/sdk/api/train/task_app.py +351 -0
  274. synth_ai/sdk/api/train/utils.py +279 -0
  275. synth_ai/sdk/api/train/validators.py +2424 -0
  276. synth_ai/sdk/graphs/__init__.py +15 -0
  277. synth_ai/sdk/graphs/completions.py +570 -0
  278. synth_ai/{inference → sdk/inference}/__init__.py +0 -1
  279. synth_ai/sdk/inference/client.py +128 -0
  280. synth_ai/sdk/jobs/__init__.py +16 -0
  281. synth_ai/sdk/jobs/client.py +371 -0
  282. synth_ai/sdk/judging/__init__.py +14 -0
  283. synth_ai/sdk/judging/base.py +24 -0
  284. synth_ai/sdk/judging/client.py +40 -0
  285. synth_ai/sdk/judging/schemas.py +222 -0
  286. synth_ai/sdk/judging/types.py +42 -0
  287. synth_ai/sdk/learning/__init__.py +99 -0
  288. synth_ai/sdk/learning/algorithms.py +14 -0
  289. synth_ai/{learning → sdk/learning}/client.py +121 -30
  290. synth_ai/sdk/learning/config.py +5 -0
  291. synth_ai/{learning → sdk/learning}/constants.py +0 -2
  292. synth_ai/sdk/learning/context_learning_client.py +531 -0
  293. synth_ai/sdk/learning/context_learning_types.py +292 -0
  294. synth_ai/sdk/learning/ft_client.py +7 -0
  295. synth_ai/{learning → sdk/learning}/health.py +15 -9
  296. synth_ai/{learning → sdk/learning}/jobs.py +44 -47
  297. synth_ai/sdk/learning/prompt_extraction.py +334 -0
  298. synth_ai/sdk/learning/prompt_learning_client.py +455 -0
  299. synth_ai/sdk/learning/prompt_learning_types.py +186 -0
  300. synth_ai/{rl → sdk/learning/rl}/__init__.py +13 -8
  301. synth_ai/{learning/rl_client.py → sdk/learning/rl/client.py} +89 -77
  302. synth_ai/sdk/learning/rl/config.py +31 -0
  303. synth_ai/{rl → sdk/learning/rl}/contracts.py +5 -14
  304. synth_ai/{rl → sdk/learning/rl}/env_keys.py +45 -16
  305. synth_ai/sdk/learning/rl/secrets.py +13 -0
  306. synth_ai/sdk/learning/rl_client.py +5 -0
  307. synth_ai/sdk/learning/sft/__init__.py +29 -0
  308. synth_ai/sdk/learning/sft/client.py +95 -0
  309. synth_ai/sdk/learning/sft/config.py +270 -0
  310. synth_ai/sdk/learning/sft/data.py +698 -0
  311. synth_ai/sdk/learning/sse.py +57 -0
  312. synth_ai/sdk/learning/validators.py +52 -0
  313. synth_ai/sdk/localapi/__init__.py +40 -0
  314. synth_ai/sdk/localapi/apps/__init__.py +28 -0
  315. synth_ai/sdk/localapi/client.py +10 -0
  316. synth_ai/sdk/localapi/contracts.py +10 -0
  317. synth_ai/sdk/localapi/helpers.py +519 -0
  318. synth_ai/sdk/localapi/rollouts.py +87 -0
  319. synth_ai/sdk/localapi/server.py +29 -0
  320. synth_ai/sdk/localapi/template.py +70 -0
  321. synth_ai/sdk/streaming/__init__.py +35 -0
  322. synth_ai/sdk/streaming/config.py +94 -0
  323. synth_ai/sdk/streaming/handlers.py +1997 -0
  324. synth_ai/sdk/streaming/streamer.py +713 -0
  325. synth_ai/sdk/streaming/types.py +112 -0
  326. synth_ai/sdk/task/__init__.py +164 -0
  327. synth_ai/sdk/task/apps/__init__.py +169 -0
  328. synth_ai/sdk/task/auth.py +165 -0
  329. synth_ai/sdk/task/client.py +175 -0
  330. synth_ai/sdk/task/config.py +257 -0
  331. synth_ai/sdk/task/contracts.py +219 -0
  332. synth_ai/sdk/task/datasets.py +108 -0
  333. synth_ai/sdk/task/errors.py +50 -0
  334. synth_ai/sdk/task/health.py +34 -0
  335. synth_ai/sdk/task/in_process.py +1190 -0
  336. synth_ai/sdk/task/in_process_runner.py +314 -0
  337. synth_ai/sdk/task/inference_api.py +299 -0
  338. synth_ai/sdk/task/json.py +111 -0
  339. synth_ai/sdk/task/proxy.py +287 -0
  340. synth_ai/sdk/task/rubrics/__init__.py +55 -0
  341. synth_ai/sdk/task/rubrics/loaders.py +156 -0
  342. synth_ai/sdk/task/rubrics/models.py +57 -0
  343. synth_ai/sdk/task/rubrics/scoring.py +116 -0
  344. synth_ai/sdk/task/rubrics/strict.py +149 -0
  345. synth_ai/sdk/task/rubrics.py +219 -0
  346. synth_ai/sdk/task/server.py +631 -0
  347. synth_ai/sdk/task/trace_correlation_helpers.py +539 -0
  348. synth_ai/sdk/task/tracing_utils.py +95 -0
  349. synth_ai/sdk/task/validators.py +441 -0
  350. synth_ai/sdk/task/vendors.py +59 -0
  351. synth_ai/sdk/training/__init__.py +102 -0
  352. synth_ai/sdk/tunnels/__init__.py +83 -0
  353. synth_ai/sdk/tunnels/cleanup.py +83 -0
  354. synth_ai/sdk/tunnels/ports.py +120 -0
  355. synth_ai/utils/__init__.py +213 -0
  356. synth_ai-0.4.3.dist-info/METADATA +262 -0
  357. synth_ai-0.4.3.dist-info/RECORD +370 -0
  358. {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/entry_points.txt +0 -1
  359. synth_ai/cli/calc.py +0 -69
  360. synth_ai/cli/demo.py +0 -131
  361. synth_ai/cli/legacy_root_backup.py +0 -470
  362. synth_ai/cli/man.py +0 -106
  363. synth_ai/cli/rl_demo.py +0 -137
  364. synth_ai/cli/status.py +0 -133
  365. synth_ai/config/base_url.py +0 -98
  366. synth_ai/core/experiment.py +0 -15
  367. synth_ai/core/system.py +0 -15
  368. synth_ai/demos/core/__init__.py +0 -1
  369. synth_ai/demos/core/cli.py +0 -685
  370. synth_ai/demos/demo_task_apps/__init__.py +0 -1
  371. synth_ai/demos/demo_task_apps/math/config.toml +0 -44
  372. synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
  373. synth_ai/environments/__init__.py +0 -31
  374. synth_ai/environments/environment/__init__.py +0 -1
  375. synth_ai/environments/environment/artifacts/__init__.py +0 -1
  376. synth_ai/environments/environment/artifacts/base.py +0 -52
  377. synth_ai/environments/environment/core.py +0 -67
  378. synth_ai/environments/environment/db/__init__.py +0 -1
  379. synth_ai/environments/environment/db/sqlite.py +0 -45
  380. synth_ai/environments/environment/registry.py +0 -233
  381. synth_ai/environments/environment/resources/sqlite.py +0 -45
  382. synth_ai/environments/environment/results.py +0 -1
  383. synth_ai/environments/environment/rewards/__init__.py +0 -1
  384. synth_ai/environments/environment/rewards/core.py +0 -29
  385. synth_ai/environments/environment/shared_engine.py +0 -26
  386. synth_ai/environments/environment/tools/__init__.py +0 -200
  387. synth_ai/environments/examples/__init__.py +0 -1
  388. synth_ai/environments/examples/bandit/__init__.py +0 -33
  389. synth_ai/environments/examples/bandit/engine.py +0 -294
  390. synth_ai/environments/examples/bandit/environment.py +0 -194
  391. synth_ai/environments/examples/bandit/taskset.py +0 -200
  392. synth_ai/environments/examples/crafter_classic/__init__.py +0 -8
  393. synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -250
  394. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -59
  395. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -152
  396. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -24
  397. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -1194
  398. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -56
  399. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -32
  400. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -724
  401. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -384
  402. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -53
  403. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -178
  404. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -222
  405. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -183
  406. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -210
  407. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -206
  408. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -49
  409. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -64
  410. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -88
  411. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -77
  412. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -324
  413. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -580
  414. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -362
  415. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -49
  416. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -332
  417. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -97
  418. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -217
  419. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -87
  420. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -88
  421. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -195
  422. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -400
  423. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -195
  424. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -56
  425. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -858
  426. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -52
  427. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -874
  428. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -1412
  429. synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -216
  430. synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -296
  431. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -58
  432. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -464
  433. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -152
  434. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -51
  435. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -1412
  436. synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -112
  437. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -203
  438. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -305
  439. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -126
  440. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -94
  441. synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -142
  442. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -26
  443. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -984
  444. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -724
  445. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -386
  446. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -205
  447. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -150
  448. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -283
  449. synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -280
  450. synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -456
  451. synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -166
  452. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -102
  453. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -128
  454. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -655
  455. synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -202
  456. synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -166
  457. synth_ai/environments/examples/crafter_classic/config_logging.py +0 -111
  458. synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
  459. synth_ai/environments/examples/crafter_classic/engine.py +0 -579
  460. synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -64
  461. synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -6
  462. synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -75
  463. synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -267
  464. synth_ai/environments/examples/crafter_classic/environment.py +0 -404
  465. synth_ai/environments/examples/crafter_classic/taskset.py +0 -233
  466. synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -228
  467. synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -299
  468. synth_ai/environments/examples/crafter_custom/__init__.py +0 -4
  469. synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -1
  470. synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -202
  471. synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -7
  472. synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -182
  473. synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -8
  474. synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -269
  475. synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -262
  476. synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -417
  477. synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -187
  478. synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -118
  479. synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -373
  480. synth_ai/environments/examples/crafter_custom/environment.py +0 -312
  481. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -159
  482. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -158
  483. synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -71
  484. synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -105
  485. synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -119
  486. synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -52
  487. synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -305
  488. synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -156
  489. synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -281
  490. synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -25
  491. synth_ai/environments/examples/enron/engine.py +0 -295
  492. synth_ai/environments/examples/enron/environment.py +0 -166
  493. synth_ai/environments/examples/enron/taskset.py +0 -112
  494. synth_ai/environments/examples/enron/units/keyword_stats.py +0 -112
  495. synth_ai/environments/examples/minigrid/__init__.py +0 -48
  496. synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -1188
  497. synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -48
  498. synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -562
  499. synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -221
  500. synth_ai/environments/examples/minigrid/engine.py +0 -589
  501. synth_ai/environments/examples/minigrid/environment.py +0 -274
  502. synth_ai/environments/examples/minigrid/environment_mapping.py +0 -242
  503. synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -417
  504. synth_ai/environments/examples/minigrid/taskset.py +0 -583
  505. synth_ai/environments/examples/nethack/__init__.py +0 -7
  506. synth_ai/environments/examples/nethack/achievements.py +0 -337
  507. synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -981
  508. synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -74
  509. synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -831
  510. synth_ai/environments/examples/nethack/engine.py +0 -739
  511. synth_ai/environments/examples/nethack/environment.py +0 -256
  512. synth_ai/environments/examples/nethack/helpers/__init__.py +0 -41
  513. synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -301
  514. synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -402
  515. synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -433
  516. synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -200
  517. synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -269
  518. synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -308
  519. synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -431
  520. synth_ai/environments/examples/nethack/taskset.py +0 -323
  521. synth_ai/environments/examples/red/__init__.py +0 -7
  522. synth_ai/environments/examples/red/agent_demos/__init__.py +0 -1
  523. synth_ai/environments/examples/red/config_logging.py +0 -110
  524. synth_ai/environments/examples/red/engine.py +0 -694
  525. synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -1
  526. synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -28
  527. synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -276
  528. synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -142
  529. synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -57
  530. synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -284
  531. synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -150
  532. synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -138
  533. synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -57
  534. synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -331
  535. synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -121
  536. synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -559
  537. synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -313
  538. synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -148
  539. synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -247
  540. synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -368
  541. synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -140
  542. synth_ai/environments/examples/red/environment.py +0 -238
  543. synth_ai/environments/examples/red/taskset.py +0 -79
  544. synth_ai/environments/examples/red/units/__init__.py +0 -1
  545. synth_ai/environments/examples/sokoban/__init__.py +0 -1
  546. synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -899
  547. synth_ai/environments/examples/sokoban/engine.py +0 -678
  548. synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -1
  549. synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -657
  550. synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -18
  551. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -3
  552. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -131
  553. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -370
  554. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -332
  555. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -306
  556. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -67
  557. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -115
  558. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -123
  559. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -394
  560. synth_ai/environments/examples/sokoban/environment.py +0 -229
  561. synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -440
  562. synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -312
  563. synth_ai/environments/examples/sokoban/taskset.py +0 -428
  564. synth_ai/environments/examples/sokoban/units/astar_common.py +0 -95
  565. synth_ai/environments/examples/tictactoe/__init__.py +0 -1
  566. synth_ai/environments/examples/tictactoe/engine.py +0 -368
  567. synth_ai/environments/examples/tictactoe/environment.py +0 -240
  568. synth_ai/environments/examples/tictactoe/taskset.py +0 -215
  569. synth_ai/environments/examples/verilog/__init__.py +0 -10
  570. synth_ai/environments/examples/verilog/engine.py +0 -329
  571. synth_ai/environments/examples/verilog/environment.py +0 -350
  572. synth_ai/environments/examples/verilog/taskset.py +0 -420
  573. synth_ai/environments/examples/wordle/__init__.py +0 -29
  574. synth_ai/environments/examples/wordle/engine.py +0 -398
  575. synth_ai/environments/examples/wordle/environment.py +0 -159
  576. synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -75
  577. synth_ai/environments/examples/wordle/taskset.py +0 -230
  578. synth_ai/environments/reproducibility/core.py +0 -42
  579. synth_ai/environments/reproducibility/helpers.py +0 -0
  580. synth_ai/environments/reproducibility/tree.py +0 -364
  581. synth_ai/environments/service/app.py +0 -91
  582. synth_ai/environments/service/core_routes.py +0 -1020
  583. synth_ai/environments/service/external_registry.py +0 -56
  584. synth_ai/environments/service/registry.py +0 -9
  585. synth_ai/environments/stateful/__init__.py +0 -1
  586. synth_ai/environments/stateful/core.py +0 -163
  587. synth_ai/environments/stateful/engine.py +0 -21
  588. synth_ai/environments/stateful/state.py +0 -7
  589. synth_ai/environments/tasks/api.py +0 -19
  590. synth_ai/environments/tasks/core.py +0 -80
  591. synth_ai/environments/tasks/filters.py +0 -41
  592. synth_ai/environments/tasks/utils.py +0 -91
  593. synth_ai/environments/v0_observability/history.py +0 -3
  594. synth_ai/environments/v0_observability/log.py +0 -2
  595. synth_ai/evals/base.py +0 -15
  596. synth_ai/experimental/synth_oss.py +0 -446
  597. synth_ai/http.py +0 -102
  598. synth_ai/inference/client.py +0 -20
  599. synth_ai/install_sqld.sh +0 -40
  600. synth_ai/jobs/client.py +0 -246
  601. synth_ai/learning/__init__.py +0 -24
  602. synth_ai/learning/config.py +0 -43
  603. synth_ai/learning/filtering.py +0 -0
  604. synth_ai/learning/ft_client.py +0 -59
  605. synth_ai/learning/offline/dpo.py +0 -0
  606. synth_ai/learning/offline/providers.py +0 -7
  607. synth_ai/learning/offline/sft.py +0 -0
  608. synth_ai/learning/offline/shared.py +0 -0
  609. synth_ai/learning/online/grpo.py +0 -0
  610. synth_ai/learning/online/irft.py +0 -0
  611. synth_ai/learning/prompts/banking77_injection_eval.py +0 -168
  612. synth_ai/learning/prompts/gepa.py +0 -0
  613. synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +0 -213
  614. synth_ai/learning/prompts/mipro.py +0 -289
  615. synth_ai/learning/prompts/random_search.py +0 -246
  616. synth_ai/learning/prompts/run_mipro_banking77.py +0 -172
  617. synth_ai/learning/prompts/run_random_search_banking77.py +0 -324
  618. synth_ai/learning/sse.py +0 -58
  619. synth_ai/learning/validators.py +0 -48
  620. synth_ai/lm/__init__.py +0 -51
  621. synth_ai/lm/caching/constants.py +0 -6
  622. synth_ai/lm/caching/dbs.py +0 -0
  623. synth_ai/lm/caching/ephemeral.py +0 -102
  624. synth_ai/lm/caching/handler.py +0 -137
  625. synth_ai/lm/caching/initialize.py +0 -11
  626. synth_ai/lm/caching/persistent.py +0 -114
  627. synth_ai/lm/config.py +0 -110
  628. synth_ai/lm/constants.py +0 -32
  629. synth_ai/lm/core/__init__.py +0 -8
  630. synth_ai/lm/core/all.py +0 -73
  631. synth_ai/lm/core/exceptions.py +0 -7
  632. synth_ai/lm/core/main.py +0 -319
  633. synth_ai/lm/core/main_v3.py +0 -594
  634. synth_ai/lm/core/synth_models.py +0 -48
  635. synth_ai/lm/core/vendor_clients.py +0 -188
  636. synth_ai/lm/cost/__init__.py +0 -0
  637. synth_ai/lm/cost/monitor.py +0 -1
  638. synth_ai/lm/cost/statefulness.py +0 -1
  639. synth_ai/lm/injection.py +0 -80
  640. synth_ai/lm/overrides.py +0 -206
  641. synth_ai/lm/provider_support/__init__.py +0 -8
  642. synth_ai/lm/provider_support/anthropic.py +0 -972
  643. synth_ai/lm/provider_support/openai.py +0 -1139
  644. synth_ai/lm/provider_support/suppress_logging.py +0 -31
  645. synth_ai/lm/structured_outputs/__init__.py +0 -0
  646. synth_ai/lm/structured_outputs/handler.py +0 -440
  647. synth_ai/lm/structured_outputs/inject.py +0 -297
  648. synth_ai/lm/structured_outputs/rehabilitate.py +0 -185
  649. synth_ai/lm/tools/__init__.py +0 -3
  650. synth_ai/lm/tools/base.py +0 -172
  651. synth_ai/lm/unified_interface.py +0 -202
  652. synth_ai/lm/vendors/__init__.py +0 -0
  653. synth_ai/lm/vendors/base.py +0 -81
  654. synth_ai/lm/vendors/core/__init__.py +0 -0
  655. synth_ai/lm/vendors/core/anthropic_api.py +0 -387
  656. synth_ai/lm/vendors/core/gemini_api.py +0 -292
  657. synth_ai/lm/vendors/core/mistral_api.py +0 -322
  658. synth_ai/lm/vendors/core/openai_api.py +0 -220
  659. synth_ai/lm/vendors/core/synth_dev_api.py +0 -0
  660. synth_ai/lm/vendors/local/__init__.py +0 -0
  661. synth_ai/lm/vendors/local/ollama.py +0 -0
  662. synth_ai/lm/vendors/openai_standard.py +0 -780
  663. synth_ai/lm/vendors/openai_standard_responses.py +0 -256
  664. synth_ai/lm/vendors/retries.py +0 -22
  665. synth_ai/lm/vendors/supported/__init__.py +0 -0
  666. synth_ai/lm/vendors/supported/custom_endpoint.py +0 -417
  667. synth_ai/lm/vendors/supported/deepseek.py +0 -69
  668. synth_ai/lm/vendors/supported/grok.py +0 -75
  669. synth_ai/lm/vendors/supported/groq.py +0 -16
  670. synth_ai/lm/vendors/supported/ollama.py +0 -15
  671. synth_ai/lm/vendors/supported/openrouter.py +0 -74
  672. synth_ai/lm/vendors/supported/together.py +0 -11
  673. synth_ai/lm/vendors/synth_client.py +0 -808
  674. synth_ai/lm/warmup.py +0 -186
  675. synth_ai/rl/secrets.py +0 -19
  676. synth_ai/scripts/verify_rewards.py +0 -100
  677. synth_ai/task/__init__.py +0 -10
  678. synth_ai/task/contracts.py +0 -120
  679. synth_ai/task/health.py +0 -28
  680. synth_ai/task/validators.py +0 -12
  681. synth_ai/tracing/__init__.py +0 -30
  682. synth_ai/tracing_v1/__init__.py +0 -33
  683. synth_ai/tracing_v3/config.py +0 -84
  684. synth_ai/tracing_v3/storage/config.py +0 -62
  685. synth_ai/tracing_v3/turso/__init__.py +0 -25
  686. synth_ai/tracing_v3/turso/daemon.py +0 -144
  687. synth_ai/tracing_v3/turso/manager.py +0 -760
  688. synth_ai/v0/tracing/__init__.py +0 -0
  689. synth_ai/v0/tracing/abstractions.py +0 -224
  690. synth_ai/v0/tracing/base_client.py +0 -91
  691. synth_ai/v0/tracing/client_manager.py +0 -131
  692. synth_ai/v0/tracing/config.py +0 -140
  693. synth_ai/v0/tracing/context.py +0 -146
  694. synth_ai/v0/tracing/decorators.py +0 -680
  695. synth_ai/v0/tracing/events/__init__.py +0 -0
  696. synth_ai/v0/tracing/events/manage.py +0 -147
  697. synth_ai/v0/tracing/events/scope.py +0 -86
  698. synth_ai/v0/tracing/events/store.py +0 -228
  699. synth_ai/v0/tracing/immediate_client.py +0 -151
  700. synth_ai/v0/tracing/local.py +0 -18
  701. synth_ai/v0/tracing/log_client_base.py +0 -73
  702. synth_ai/v0/tracing/retry_queue.py +0 -186
  703. synth_ai/v0/tracing/trackers.py +0 -515
  704. synth_ai/v0/tracing/upload.py +0 -510
  705. synth_ai/v0/tracing/utils.py +0 -9
  706. synth_ai/v0/tracing_v1/__init__.py +0 -16
  707. synth_ai/v0/tracing_v1/abstractions.py +0 -224
  708. synth_ai/v0/tracing_v1/base_client.py +0 -91
  709. synth_ai/v0/tracing_v1/client_manager.py +0 -131
  710. synth_ai/v0/tracing_v1/config.py +0 -140
  711. synth_ai/v0/tracing_v1/context.py +0 -146
  712. synth_ai/v0/tracing_v1/decorators.py +0 -701
  713. synth_ai/v0/tracing_v1/events/__init__.py +0 -0
  714. synth_ai/v0/tracing_v1/events/manage.py +0 -147
  715. synth_ai/v0/tracing_v1/events/scope.py +0 -86
  716. synth_ai/v0/tracing_v1/events/store.py +0 -228
  717. synth_ai/v0/tracing_v1/immediate_client.py +0 -151
  718. synth_ai/v0/tracing_v1/local.py +0 -18
  719. synth_ai/v0/tracing_v1/log_client_base.py +0 -73
  720. synth_ai/v0/tracing_v1/retry_queue.py +0 -186
  721. synth_ai/v0/tracing_v1/trackers.py +0 -515
  722. synth_ai/v0/tracing_v1/upload.py +0 -525
  723. synth_ai/v0/tracing_v1/utils.py +0 -9
  724. synth_ai/zyk/__init__.py +0 -30
  725. synth_ai-0.2.6.dev1.dist-info/METADATA +0 -106
  726. synth_ai-0.2.6.dev1.dist-info/RECORD +0 -416
  727. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
  728. /synth_ai/{lm/caching → core/apps}/__init__.py +0 -0
  729. /synth_ai/{tracing_v3 → core/tracing_v3}/lm_call_record_abstractions.py +0 -0
  730. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/__init__.py +0 -0
  731. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/exceptions.py +0 -0
  732. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/types.py +0 -0
  733. /synth_ai/{compound/cais.py → py.typed} +0 -0
  734. /synth_ai/{learning → sdk/learning}/core.py +0 -0
  735. /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
  736. {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/WHEEL +0 -0
  737. {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/licenses/LICENSE +0 -0
  738. {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/top_level.txt +0 -0
@@ -1,229 +0,0 @@
1
- import dataclasses
2
- from typing import Any, Dict, List, Optional, Union
3
-
4
- from pydantic import BaseModel
5
-
6
- from synth_ai.environments.environment.shared_engine import (
7
- GetObservationCallable,
8
- InternalObservation,
9
- )
10
- from synth_ai.environments.environment.tools import (
11
- TOOL_REGISTRY,
12
- AbstractTool,
13
- EnvToolCall,
14
- ToolResult,
15
- register_tool,
16
- )
17
- from synth_ai.environments.examples.sokoban.engine import (
18
- SokobanEngine,
19
- SokobanEngineSnapshot,
20
- SokobanPrivateState,
21
- SokobanPublicState,
22
- SynthSokobanCheckpointObservationCallable,
23
- SynthSokobanObservationCallable,
24
- )
25
- from synth_ai.environments.reproducibility.core import ReproducibleEnvironment
26
- from synth_ai.environments.stateful.core import StatefulEnvironment
27
- from synth_ai.environments.tasks.core import TaskInstance
28
-
29
-
30
- # --- Tool Definition ---
31
- class SokobanActionInput(BaseModel):
32
- action: int
33
-
34
-
35
- class SokobanInteractTool(AbstractTool):
36
- name = "interact"
37
- description = "Performs an action (e.g., move) in the Sokoban environment."
38
- call_schema = SokobanActionInput
39
- result_schema = ToolResult
40
-
41
- def __init__(self, engine: SokobanEngine):
42
- self.engine = engine
43
-
44
- async def __call__(self, call: EnvToolCall) -> ToolResult:
45
- try:
46
- validated_args = self.call_schema(**call.args)
47
- priv_state, pub_state = await self.engine._step_engine(validated_args.action)
48
- return ToolResult(
49
- ok=True,
50
- payload={
51
- "public": pub_state.to_dict(),
52
- "private": priv_state.to_dict(),
53
- },
54
- )
55
- except Exception as e:
56
- # Add current public state to payload for context in case of error
57
- _, pub_state_on_error = self.engine.get_current_states_for_observation()
58
- return ToolResult(
59
- ok=False,
60
- error=str(e),
61
- payload={"public": pub_state_on_error.to_dict()},
62
- )
63
-
64
-
65
- class SokobanEnvironment(StatefulEnvironment, ReproducibleEnvironment[SokobanEngine]):
66
- def __init__(
67
- self,
68
- task_instance: TaskInstance,
69
- custom_step_obs: Optional[GetObservationCallable] = None,
70
- custom_ckpt_obs: Optional[GetObservationCallable] = None,
71
- ):
72
- self.name = "Sokoban"
73
- self.task_instance = task_instance
74
- # Default to SynthSokobanObservationCallable if none provided
75
- self.custom_step_observation_callable = custom_step_obs or SynthSokobanObservationCallable()
76
- self.custom_checkpoint_observation_callable = (
77
- custom_ckpt_obs or SynthSokobanCheckpointObservationCallable()
78
- )
79
- self.engine: SokobanEngine = SokobanEngine(task_instance)
80
-
81
- self._interact_tool = SokobanInteractTool(self.engine)
82
- if self._interact_tool.name not in TOOL_REGISTRY:
83
- register_tool(self._interact_tool)
84
- # elif getattr(TOOL_REGISTRY[self._interact_tool.name], 'engine', None) is not self.engine:
85
- # register_tool(self._interact_tool) # More robust check if tool has engine attr
86
-
87
- async def initialize(self) -> InternalObservation:
88
- priv, pub = await self.engine._reset_engine()
89
- return await self._to_observation(priv, pub, self.custom_step_observation_callable)
90
-
91
- async def terminate(self) -> InternalObservation:
92
- priv, pub = self.engine.get_current_states_for_observation()
93
- priv.terminated = True # Mark as terminated
94
- obs_dict = {"terminated": True, "message": "Environment terminated."}
95
- # Use _to_observation to format, including final state
96
- return await self._to_observation(
97
- priv, pub, self.custom_step_observation_callable, extra_obs=obs_dict
98
- )
99
-
100
- def validate_tool_calls(
101
- self,
102
- tool_calls: Union[
103
- EnvToolCall,
104
- List[Dict[str, Any]],
105
- List[List[Dict[str, Any]]],
106
- Dict[str, Any],
107
- ],
108
- ) -> EnvToolCall:
109
- # Normalize and validate to a single EnvToolCall
110
- raw_call_data: Dict[str, Any]
111
- if isinstance(tool_calls, list):
112
- if not tool_calls:
113
- raise ValueError("Received empty list of tool calls.")
114
- first_item = tool_calls[0]
115
- if isinstance(first_item, list):
116
- if not first_item:
117
- raise ValueError("Received empty inner list of tool calls.")
118
- raw_call_data = first_item[0]
119
- elif isinstance(first_item, dict):
120
- raw_call_data = first_item
121
- elif isinstance(first_item, EnvToolCall): # Already an EnvToolCall instance
122
- agent_call = first_item # Assuming direct single call if already instance
123
- if agent_call.tool != "interact":
124
- raise ValueError(f"Unknown tool: {agent_call.tool}. Expected 'interact'.")
125
- return agent_call
126
- else:
127
- raise TypeError(f"Unexpected type in tool_calls list: {type(first_item)}")
128
- elif isinstance(tool_calls, dict): # Single call passed as dict
129
- raw_call_data = tool_calls
130
- elif isinstance(tool_calls, EnvToolCall): # Single call already an instance
131
- if tool_calls.tool != "interact":
132
- raise ValueError(f"Unknown tool: {tool_calls.tool}. Expected 'interact'.")
133
- return tool_calls
134
- else:
135
- raise TypeError(f"Unexpected type for tool_calls: {type(tool_calls)}")
136
-
137
- if not isinstance(raw_call_data, dict):
138
- raise TypeError(f"Processed call data is not a dict: {type(raw_call_data)}")
139
-
140
- # Convert dict to EnvToolCall instance
141
- tool_name = raw_call_data.get("tool")
142
- tool_args = raw_call_data.get("args", {})
143
- if tool_name != "interact":
144
- raise ValueError(f"Unknown tool: {tool_name}. Expected 'interact'.")
145
-
146
- agent_call = EnvToolCall(tool=tool_name, args=tool_args)
147
- return agent_call
148
-
149
- async def step(
150
- self,
151
- tool_calls: Union[
152
- EnvToolCall,
153
- List[Dict[str, Any]],
154
- List[List[Dict[str, Any]]],
155
- Dict[str, Any],
156
- ],
157
- ) -> InternalObservation:
158
- agent_call = self.validate_tool_calls(tool_calls)
159
- tool_result: ToolResult = await self._interact_tool(agent_call)
160
-
161
- payload_dict = tool_result.payload
162
- if not tool_result.ok or not isinstance(payload_dict, dict): # Check tool_result.ok
163
- # Fallback if payload isn't as expected or tool reported an error
164
- priv_state, pub_state = self.engine.get_current_states_for_observation()
165
- if tool_result.error and hasattr(pub_state, "error_info"):
166
- pub_state.error_info = tool_result.error
167
- else:
168
- # This block assumes tool_result.ok is True and payload is a dict
169
- priv_dict = payload_dict.get("private")
170
- pub_dict = payload_dict.get("public")
171
-
172
- if priv_dict is None or pub_dict is None:
173
- # This case should ideally not happen if tool_result.ok is True
174
- # and the tool is well-behaved, but as a safeguard:
175
- priv_state, pub_state = self.engine.get_current_states_for_observation()
176
- if tool_result.error and hasattr(
177
- pub_state, "error_info"
178
- ): # Apply error even in this sub-optimal case
179
- pub_state.error_info = tool_result.error
180
- else:
181
- priv_state = SokobanPrivateState(**priv_dict)
182
- pub_state = SokobanPublicState(**pub_dict)
183
- if tool_result.error and hasattr(pub_state, "error_info"):
184
- pub_state.error_info = tool_result.error
185
-
186
- return await self._to_observation(
187
- priv_state, pub_state, self.custom_step_observation_callable
188
- )
189
-
190
- async def checkpoint(self) -> InternalObservation:
191
- engine_snapshot: SokobanEngineSnapshot = await self.engine._serialize_engine()
192
- # For checkpoint, we might want to convey the snapshot data differently.
193
- # The existing _to_observation expects live priv/pub states.
194
- # For now, using current live states for observation, plus snapshot.
195
- priv, pub = self.engine.get_current_states_for_observation()
196
- obs_data = await self._to_observation(
197
- priv, pub, self.custom_checkpoint_observation_callable
198
- )
199
- if isinstance(obs_data, dict):
200
- obs_data["engine_snapshot_data"] = (
201
- engine_snapshot.model_dump()
202
- ) # Add snapshot if obs is dict
203
- return obs_data
204
-
205
- async def _to_observation(
206
- self,
207
- priv: SokobanPrivateState,
208
- pub: SokobanPublicState,
209
- obs_cb: Optional[GetObservationCallable],
210
- extra_obs: Optional[Dict[str, Any]] = None, # For adding things like termination messages
211
- ) -> InternalObservation:
212
- # Ensure obs_cb is not None; use a default if necessary (though __init__ sets one)
213
- active_obs_cb = obs_cb or SynthSokobanObservationCallable()
214
- observation = await active_obs_cb.get_observation(pub, priv)
215
- if extra_obs and isinstance(observation, dict):
216
- observation.update(extra_obs)
217
- return observation
218
-
219
- async def _serialize_engine(self) -> SokobanEngineSnapshot: # Changed type hint
220
- return await self.engine._serialize_engine()
221
-
222
- @classmethod
223
- async def _deserialize_engine(
224
- cls, snapshot: SokobanEngineSnapshot, task_instance: TaskInstance
225
- ) -> "SokobanEnvironment": # Changed type hint
226
- eng = await SokobanEngine._deserialize_engine(snapshot, task_instance)
227
- env = cls(task_instance) # Uses task_instance from deserialized engine
228
- env.engine = eng
229
- return env
@@ -1,440 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Generate verified solvable Sokoban puzzles.
4
-
5
- This script creates 500 solvable Sokoban puzzles (100 each for 5 difficulty levels)
6
- and saves them as JSON. Each puzzle is verified to be solvable using BFS.
7
- """
8
-
9
- import json
10
- import logging
11
- from dataclasses import asdict, dataclass
12
- from pathlib import Path
13
- from typing import Any, Dict, List, Optional, Set, Tuple
14
-
15
- import numpy as np
16
-
17
- from synth_ai.environments.examples.sokoban.engine_helpers.room_utils import (
18
- generate_room,
19
- get_shortest_action_path,
20
- )
21
-
22
- # Set up logging
23
- logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
24
- logger = logging.getLogger(__name__)
25
-
26
-
27
- @dataclass
28
- class SokobanPuzzle:
29
- """Represents a verified solvable Sokoban puzzle."""
30
-
31
- id: str
32
- difficulty: str
33
- num_boxes: int
34
- dim_room: Tuple[int, int]
35
- room_fixed: List[List[int]]
36
- room_state: List[List[int]]
37
- box_mapping: Dict[str, List[int]]
38
- solution_path: List[int]
39
- solution_length: int
40
- generation_seed: int
41
- max_steps: int
42
-
43
-
44
- # Define difficulty configurations
45
- DIFFICULTY_CONFIGS = {
46
- "ultra_easy": {
47
- "num_boxes": 1,
48
- "dim_room": (5, 5),
49
- "max_steps": 50,
50
- "target_solution_length": (3, 8),
51
- "search_depth": 30,
52
- },
53
- "easy": {
54
- "num_boxes": 1,
55
- "dim_room": (6, 6),
56
- "max_steps": 80,
57
- "target_solution_length": (8, 15),
58
- "search_depth": 50,
59
- },
60
- "medium": {
61
- "num_boxes": 2,
62
- "dim_room": (7, 7),
63
- "max_steps": 120,
64
- "target_solution_length": (15, 30),
65
- "search_depth": 80,
66
- },
67
- "hard": {
68
- "num_boxes": 3,
69
- "dim_room": (8, 8),
70
- "max_steps": 200,
71
- "target_solution_length": (30, 60),
72
- "search_depth": 120,
73
- },
74
- }
75
-
76
-
77
- def verify_puzzle_solvable(
78
- room_fixed: np.ndarray, room_state: np.ndarray, max_depth: int = 200
79
- ) -> Optional[List[int]]:
80
- """
81
- Verify that a puzzle is solvable using BFS and return the solution path.
82
-
83
- Args:
84
- room_fixed: The fixed room structure (walls, targets, floors)
85
- room_state: The current room state (player, boxes)
86
- max_depth: Maximum search depth
87
-
88
- Returns:
89
- List of actions if solvable, None if not solvable
90
- """
91
- try:
92
- solution_path = get_shortest_action_path(room_fixed, room_state, MAX_DEPTH=max_depth)
93
- return solution_path if solution_path else None
94
- except Exception as e:
95
- logger.warning(f"Error verifying puzzle: {e}")
96
- return None
97
-
98
-
99
- def setup_instances_directory() -> Path:
100
- """Create the instances directory if it doesn't exist."""
101
- instances_dir = Path(__file__).parent / "instances"
102
- instances_dir.mkdir(exist_ok=True)
103
- return instances_dir
104
-
105
-
106
- def get_jsonl_path(instances_dir: Path, difficulty: str) -> Path:
107
- """Get the JSONL file path for a difficulty level."""
108
- return instances_dir / f"{difficulty}.jsonl"
109
-
110
-
111
- def save_puzzle_to_jsonl(puzzle: SokobanPuzzle, jsonl_path: Path):
112
- """Save a single puzzle to a JSONL file."""
113
- with open(jsonl_path, "a") as f:
114
- f.write(json.dumps(asdict(puzzle), default=convert_numpy_types) + "\n")
115
-
116
-
117
- def convert_numpy_types(obj):
118
- """Convert numpy types to Python types for JSON serialization."""
119
- if isinstance(obj, np.integer):
120
- return int(obj)
121
- elif isinstance(obj, np.floating):
122
- return float(obj)
123
- elif isinstance(obj, np.ndarray):
124
- return obj.tolist()
125
- raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable")
126
-
127
-
128
- def load_existing_puzzles(jsonl_path: Path) -> Set[str]:
129
- """Load existing puzzle IDs from a JSONL file."""
130
- existing_ids = set()
131
- if jsonl_path.exists():
132
- with open(jsonl_path, "r") as f:
133
- for line in f:
134
- try:
135
- puzzle_data = json.loads(line.strip())
136
- existing_ids.add(puzzle_data["id"])
137
- except json.JSONDecodeError:
138
- continue
139
- return existing_ids
140
-
141
-
142
- def count_existing_puzzles(jsonl_path: Path) -> int:
143
- """Count existing puzzles in a JSONL file."""
144
- if not jsonl_path.exists():
145
- return 0
146
- with open(jsonl_path, "r") as f:
147
- return sum(1 for line in f if line.strip())
148
-
149
-
150
- def generate_puzzle_for_difficulty(
151
- difficulty: str, config: Dict, seed: int, puzzle_id: str
152
- ) -> Optional[SokobanPuzzle]:
153
- """
154
- Generate a single puzzle for a given difficulty level.
155
-
156
- Args:
157
- difficulty: The difficulty level name
158
- config: Configuration for this difficulty
159
- seed: Random seed for generation
160
- puzzle_id: Unique identifier for this puzzle
161
-
162
- Returns:
163
- SokobanPuzzle if successfully generated and verified, None otherwise
164
- """
165
- max_attempts = 20
166
-
167
- for attempt in range(max_attempts):
168
- current_seed = seed + attempt * 1000
169
-
170
- try:
171
- # Generate room
172
- room_structure, room_state, box_mapping, action_sequence = generate_room(
173
- dim=config["dim_room"],
174
- initial_seed=current_seed,
175
- num_boxes=config["num_boxes"],
176
- search_depth=config["search_depth"],
177
- num_steps=config["search_depth"] // 2,
178
- )
179
-
180
- # Verify solvability
181
- solution_path = verify_puzzle_solvable(
182
- room_structure, room_state, max_depth=config["max_steps"]
183
- )
184
-
185
- if solution_path is None:
186
- logger.debug(f"Puzzle {puzzle_id} attempt {attempt + 1} not solvable")
187
- continue
188
-
189
- solution_length = len(solution_path)
190
- target_min, target_max = config["target_solution_length"]
191
-
192
- # Check if solution length is within desired range
193
- if not (target_min <= solution_length <= target_max):
194
- logger.debug(
195
- f"Puzzle {puzzle_id} attempt {attempt + 1} solution length {solution_length} not in range {target_min}-{target_max}"
196
- )
197
- continue
198
-
199
- # Convert numpy arrays to lists for JSON serialization
200
- room_fixed_list = room_structure.tolist()
201
- room_state_list = room_state.tolist()
202
-
203
- # Convert box mapping to serializable format
204
- box_mapping_serializable = {}
205
- for key, value in box_mapping.items():
206
- if isinstance(key, tuple):
207
- # Convert numpy integers to regular integers
208
- key_str = f"{int(key[0])},{int(key[1])}"
209
- if isinstance(value, tuple):
210
- box_mapping_serializable[key_str] = [int(value[0]), int(value[1])]
211
- else:
212
- box_mapping_serializable[key_str] = value
213
- else:
214
- box_mapping_serializable[str(key)] = value
215
-
216
- puzzle = SokobanPuzzle(
217
- id=puzzle_id,
218
- difficulty=difficulty,
219
- num_boxes=int(config["num_boxes"]),
220
- dim_room=config["dim_room"],
221
- room_fixed=room_fixed_list,
222
- room_state=room_state_list,
223
- box_mapping=box_mapping_serializable,
224
- solution_path=[int(action) for action in solution_path], # Convert to regular ints
225
- solution_length=int(solution_length),
226
- generation_seed=int(current_seed),
227
- max_steps=int(config["max_steps"]),
228
- )
229
-
230
- logger.info(
231
- f"Generated {difficulty} puzzle {puzzle_id} (seed: {current_seed}, solution length: {solution_length})"
232
- )
233
- return puzzle
234
-
235
- except Exception as e:
236
- logger.warning(f"Error generating puzzle {puzzle_id} attempt {attempt + 1}: {e}")
237
- continue
238
-
239
- logger.error(f"Failed to generate puzzle {puzzle_id} after {max_attempts} attempts")
240
- return None
241
-
242
-
243
- def generate_all_puzzles(num_per_difficulty: int = 100) -> Dict[str, List[SokobanPuzzle]]:
244
- """
245
- Generate all puzzles for all difficulty levels with incremental saving.
246
-
247
- Args:
248
- num_per_difficulty: Number of puzzles to generate per difficulty level
249
-
250
- Returns:
251
- Dictionary mapping difficulty names to lists of puzzles
252
- """
253
- all_puzzles = {}
254
- total_puzzles = 0
255
-
256
- # Setup instances directory
257
- instances_dir = setup_instances_directory()
258
- logger.info(f"Using instances directory: {instances_dir}")
259
-
260
- for difficulty, config in DIFFICULTY_CONFIGS.items():
261
- jsonl_path = get_jsonl_path(instances_dir, difficulty)
262
- existing_ids = load_existing_puzzles(jsonl_path)
263
- existing_count = count_existing_puzzles(jsonl_path)
264
-
265
- logger.info(f"Processing {difficulty} difficulty...")
266
- logger.info(f" Found {existing_count} existing puzzles")
267
- logger.info(f" Target: {num_per_difficulty} puzzles")
268
-
269
- puzzles = []
270
- base_seed = hash(difficulty) % 100000
271
-
272
- # Generate puzzles until we have enough
273
- i = 0
274
- generated_this_run = 0
275
- while (
276
- len(puzzles) + existing_count < num_per_difficulty and i < num_per_difficulty * 5
277
- ): # Safety limit
278
- puzzle_id = f"{difficulty}_{i:03d}"
279
-
280
- # Skip if already exists
281
- if puzzle_id in existing_ids:
282
- i += 1
283
- continue
284
-
285
- puzzle = generate_puzzle_for_difficulty(
286
- difficulty=difficulty, config=config, seed=base_seed + i, puzzle_id=puzzle_id
287
- )
288
-
289
- if puzzle:
290
- puzzles.append(puzzle)
291
- # Save immediately to JSONL
292
- save_puzzle_to_jsonl(puzzle, jsonl_path)
293
- generated_this_run += 1
294
- total_puzzles += 1
295
- logger.info(
296
- f"Generated and saved {difficulty} puzzle {puzzle_id} ({generated_this_run}/{num_per_difficulty - existing_count} new)"
297
- )
298
- else:
299
- logger.warning(f"Failed to generate puzzle {puzzle_id}")
300
-
301
- i += 1
302
-
303
- all_puzzles[difficulty] = puzzles
304
- logger.info(
305
- f"Completed {difficulty}: {generated_this_run} new puzzles generated, {existing_count + len(puzzles)} total"
306
- )
307
-
308
- logger.info(f"Total new puzzles generated this run: {total_puzzles}")
309
- return all_puzzles
310
-
311
-
312
- def load_all_puzzles_from_jsonl(instances_dir: Path) -> Dict[str, List[SokobanPuzzle]]:
313
- """Load all puzzles from JSONL files."""
314
- all_puzzles = {}
315
-
316
- for difficulty in DIFFICULTY_CONFIGS.keys():
317
- jsonl_path = get_jsonl_path(instances_dir, difficulty)
318
- puzzles = []
319
-
320
- if jsonl_path.exists():
321
- with open(jsonl_path, "r") as f:
322
- for line in f:
323
- try:
324
- puzzle_data = json.loads(line.strip())
325
- puzzle = SokobanPuzzle(
326
- id=puzzle_data["id"],
327
- difficulty=puzzle_data["difficulty"],
328
- num_boxes=puzzle_data["num_boxes"],
329
- dim_room=tuple(puzzle_data["dim_room"]),
330
- room_fixed=puzzle_data["room_fixed"],
331
- room_state=puzzle_data["room_state"],
332
- box_mapping=puzzle_data["box_mapping"],
333
- solution_path=puzzle_data["solution_path"],
334
- solution_length=puzzle_data["solution_length"],
335
- generation_seed=puzzle_data["generation_seed"],
336
- max_steps=puzzle_data["max_steps"],
337
- )
338
- puzzles.append(puzzle)
339
- except (json.JSONDecodeError, KeyError) as e:
340
- logger.warning(f"Error loading puzzle from {jsonl_path}: {e}")
341
- continue
342
-
343
- all_puzzles[difficulty] = puzzles
344
-
345
- return all_puzzles
346
-
347
-
348
- def save_puzzles_to_json(puzzles: Dict[str, List[SokobanPuzzle]], output_path: Path):
349
- """
350
- Save puzzles to JSON file.
351
-
352
- Args:
353
- puzzles: Dictionary of puzzles by difficulty
354
- output_path: Path to save the JSON file
355
- """
356
- # Convert to serializable format
357
- serializable_puzzles = {}
358
- for difficulty, puzzle_list in puzzles.items():
359
- serializable_puzzles[difficulty] = [asdict(puzzle) for puzzle in puzzle_list]
360
-
361
- # Add metadata
362
- output_data = {
363
- "metadata": {
364
- "version": "1.0",
365
- "total_puzzles": sum(len(puzzles) for puzzles in serializable_puzzles.values()),
366
- "difficulties": list(DIFFICULTY_CONFIGS.keys()),
367
- "generated_at": "2024-01-01T00:00:00Z", # Will be updated when actually generated
368
- },
369
- "puzzles": serializable_puzzles,
370
- }
371
-
372
- with open(output_path, "w") as f:
373
- json.dump(output_data, f, indent=2, default=convert_numpy_types)
374
-
375
- logger.info(f"Saved puzzles to {output_path}")
376
-
377
-
378
- def create_unified_json_from_jsonl():
379
- """Create a unified JSON file from all JSONL files for the puzzle loader."""
380
- instances_dir = setup_instances_directory()
381
- all_puzzles = load_all_puzzles_from_jsonl(instances_dir)
382
-
383
- # Save to JSON
384
- output_path = Path(__file__).parent / "verified_puzzles.json"
385
- save_puzzles_to_json(all_puzzles, output_path)
386
-
387
- return all_puzzles
388
-
389
-
390
- def main():
391
- """Main function to generate and save all puzzles."""
392
- logger.info("Starting Sokoban puzzle generation with incremental saving...")
393
-
394
- # Generate puzzles (saves incrementally to JSONL)
395
- puzzles = generate_all_puzzles(num_per_difficulty=100)
396
-
397
- # Print summary of this run
398
- logger.info("Puzzle generation complete!")
399
- logger.info("Summary of this run:")
400
- for difficulty, puzzle_list in puzzles.items():
401
- if puzzle_list:
402
- avg_solution_length = sum(p.solution_length for p in puzzle_list) / len(puzzle_list)
403
- logger.info(
404
- f" {difficulty}: {len(puzzle_list)} new puzzles, avg solution length: {avg_solution_length:.1f}"
405
- )
406
- else:
407
- logger.info(f" {difficulty}: 0 new puzzles")
408
-
409
- # Show total counts from JSONL files
410
- instances_dir = setup_instances_directory()
411
- logger.info("Total puzzles saved:")
412
- for difficulty in DIFFICULTY_CONFIGS.keys():
413
- jsonl_path = get_jsonl_path(instances_dir, difficulty)
414
- total_count = count_existing_puzzles(jsonl_path)
415
- logger.info(f" {difficulty}: {total_count} total puzzles")
416
-
417
- # Create unified JSON file for the puzzle loader
418
- logger.info("Creating unified JSON file for puzzle loader...")
419
- create_unified_json_from_jsonl()
420
- logger.info("Unified JSON file created successfully!")
421
-
422
-
423
- if __name__ == "__main__":
424
- import sys
425
-
426
- if len(sys.argv) > 1 and sys.argv[1] == "--create-json":
427
- # Just create the unified JSON from existing JSONL files
428
- logger.info("Creating unified JSON file from existing JSONL files...")
429
- puzzles = create_unified_json_from_jsonl()
430
- logger.info("Summary of loaded puzzles:")
431
- for difficulty, puzzle_list in puzzles.items():
432
- if puzzle_list:
433
- avg_solution_length = sum(p.solution_length for p in puzzle_list) / len(puzzle_list)
434
- logger.info(
435
- f" {difficulty}: {len(puzzle_list)} puzzles, avg solution length: {avg_solution_length:.1f}"
436
- )
437
- else:
438
- logger.info(f" {difficulty}: 0 puzzles")
439
- else:
440
- main()