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,404 +0,0 @@
1
- """CrafterClassicEnvironment — thin wrapper exposing CrafterEngine via StatefulEnvironment API."""
2
-
3
- from __future__ import annotations
4
-
5
- import dataclasses
6
- import logging
7
- import time
8
- from typing import Any, Dict, List, Optional, Union
9
-
10
- # Import tracing abstractions
11
- from synth_ai.tracing_v3.abstractions import (
12
- RuntimeEvent,
13
- SessionEventMarkovBlanketMessage,
14
- TimeRecord,
15
- )
16
-
17
- # Import logging configuration to suppress JAX debug messages
18
- from .config_logging import safe_compare
19
-
20
- logger = logging.getLogger(__name__)
21
-
22
- from pydantic import BaseModel, Field
23
-
24
- from synth_ai.environments.environment.shared_engine import (
25
- GetObservationCallable,
26
- InternalObservation,
27
- )
28
- from synth_ai.environments.environment.tools import (
29
- TOOL_REGISTRY,
30
- AbstractTool,
31
- EnvToolCall,
32
- ToolResult,
33
- register_tool,
34
- )
35
- from synth_ai.environments.examples.crafter_classic.engine import (
36
- CrafterEngine,
37
- CrafterEngineSnapshot,
38
- CrafterPrivateState,
39
- CrafterPublicState,
40
- )
41
- from synth_ai.environments.examples.crafter_classic.taskset import CrafterTaskInstance
42
- from synth_ai.environments.reproducibility.core import ReproducibleEnvironment
43
- from synth_ai.environments.stateful.core import StatefulEnvironment
44
-
45
-
46
- # --- Tool Definition ---
47
- class CrafterActionInput(BaseModel):
48
- action: int = Field(..., description="Integer action for the Crafter environment.")
49
-
50
-
51
- class CrafterInteractTool(AbstractTool):
52
- name = "interact"
53
- description = "Performs an action in the Crafter environment."
54
- call_schema = CrafterActionInput
55
- result_schema = ToolResult
56
-
57
- def __init__(self, engine: CrafterEngine, session_tracer: Optional[Any] = None):
58
- self.engine = engine
59
- self.session_tracer = session_tracer
60
-
61
- async def __call__(self, call: EnvToolCall) -> ToolResult:
62
- try:
63
- # Store state before execution
64
- state_before = {"action_args": call.args}
65
-
66
- validated_args = self.call_schema(**call.args)
67
- action_to_pass = self.engine._validate_action_engine(validated_args.action)
68
-
69
- # Execute the engine step
70
- priv_state, pub_state = await self.engine._step_engine(action_to_pass)
71
-
72
- # Store state after execution
73
- state_after = {
74
- "engine_result": {"private_state": priv_state, "public_state": pub_state}
75
- }
76
-
77
- # Record runtime event for tool execution
78
- if (
79
- self.session_tracer
80
- and hasattr(self.session_tracer, "current_session")
81
- and self.session_tracer.current_session
82
- ):
83
- runtime_execution_event = RuntimeEvent()
84
- runtime_execution_event.time_record = TimeRecord()
85
- runtime_execution_event.time_record.event_time = time.time()
86
- runtime_execution_event.time_record.message_time = None
87
- runtime_execution_event.system_instance_id = "crafter_interact_tool"
88
- runtime_execution_event.system_state_before = state_before
89
- runtime_execution_event.system_state_after = state_after
90
- runtime_execution_event.actions = [action_to_pass]
91
- runtime_execution_event.metadata = {"execution_step": "engine_action"}
92
- # Add directly to event history, bypassing timestep requirement
93
- self.session_tracer.current_session.add_event(runtime_execution_event)
94
-
95
- return ToolResult(
96
- ok=True,
97
- payload={
98
- "public_state": pub_state,
99
- "private_state": priv_state,
100
- },
101
- )
102
- except Exception as e:
103
- pub_state_on_error = self.engine._get_public_state_from_env() # Use engine helper
104
- # Get a safe private state for error cases
105
- health_dead = safe_compare(0, self.engine.env._player.health, ">=")
106
- step_exceeded = safe_compare(self.engine.env._length, self.engine.env._step, "<=")
107
- priv_state_on_error = self.engine._get_private_state_from_env(
108
- 0, health_dead, step_exceeded
109
- )
110
- return ToolResult(
111
- ok=False,
112
- error=str(e),
113
- payload={
114
- "public_state": pub_state_on_error,
115
- "private_state": priv_state_on_error,
116
- },
117
- )
118
-
119
-
120
- # Default observation callable (can be customized via __init__)
121
- class SynthCrafterObservationCallable(GetObservationCallable):
122
- """Default observation: public state dict + per-step reward/flags.
123
-
124
- Additionally computes a small local semantic patch centered on the player
125
- to simplify visualization on the client. The patch is exposed under the
126
- key `semantic_map_patch7` as a list-of-lists of ints (7x7 unless the
127
- semantic map is smaller, in which case it is cropped at edges).
128
- """
129
-
130
- def __init__(self, view_size: int = 7) -> None:
131
- self.view_size = max(1, int(view_size))
132
-
133
- async def get_observation(
134
- self, pub: CrafterPublicState, priv: CrafterPrivateState
135
- ) -> InternalObservation:
136
- obs_dict: Dict[str, Any] = dataclasses.asdict(pub) # type: ignore
137
- obs_dict["reward_last_step"] = priv.reward_last_step
138
- obs_dict["total_reward_episode"] = priv.total_reward_episode
139
- obs_dict["terminated"] = priv.terminated
140
- obs_dict["truncated"] = priv.truncated
141
- if pub.error_info:
142
- obs_dict["tool_error"] = pub.error_info
143
-
144
- # Derive a simple local semantic patch around the player for easy rendering
145
- try:
146
- sem = pub.semantic_map
147
- if sem is not None:
148
- rows = int(getattr(sem, "shape", [0, 0])[0]) # type: ignore
149
- cols = int(getattr(sem, "shape", [0, 0])[1]) # type: ignore
150
- if rows > 0 and cols > 0:
151
- px, py = int(pub.player_position[0]), int(pub.player_position[1])
152
- half = max(1, self.view_size // 2)
153
- x0, y0 = px - half, py - half
154
- x1, y1 = px + half, py + half
155
- patch: list[list[int]] = []
156
- for gy in range(y0, y1 + 1):
157
- row_vals: list[int] = []
158
- for gx in range(x0, x1 + 1):
159
- if 0 <= gy < rows and 0 <= gx < cols:
160
- try:
161
- val = int(sem[gy, gx]) # type: ignore[index]
162
- except Exception:
163
- val = 0
164
- else:
165
- val = 0
166
- row_vals.append(val)
167
- patch.append(row_vals)
168
- obs_dict["semantic_map_patch7"] = patch
169
- except Exception:
170
- # Best-effort; omit patch on error
171
- pass
172
-
173
- return obs_dict
174
-
175
-
176
- class CrafterClassicEnvironment(StatefulEnvironment, ReproducibleEnvironment[CrafterEngine]):
177
- """Environment wrapper bridging agent tool‑calls to `crafter.Env` dynamics."""
178
-
179
- def __init__(
180
- self,
181
- task_instance: "CrafterTaskInstance",
182
- custom_step_obs: Optional[GetObservationCallable] = None,
183
- custom_ckpt_obs: Optional[GetObservationCallable] = None,
184
- session_tracer: Optional[Any] = None, # SessionTracer from higher level
185
- ) -> None:
186
- self.name = "CrafterClassic"
187
- self.task_instance = task_instance
188
- self.custom_step_observation_callable = custom_step_obs or SynthCrafterObservationCallable()
189
- self.custom_checkpoint_observation_callable = (
190
- custom_ckpt_obs or SynthCrafterObservationCallable()
191
- )
192
- self.engine = CrafterEngine(task_instance)
193
- self.session_tracer = session_tracer # Store tracer for runtime events
194
-
195
- self._interact_tool = CrafterInteractTool(self.engine, session_tracer=session_tracer)
196
- if self._interact_tool.name not in TOOL_REGISTRY:
197
- register_tool(self._interact_tool)
198
-
199
- # ────────────────────────────────────────────────────────────────────
200
- # Lifecycle helpers
201
- # ────────────────────────────────────────────────────────────────────
202
-
203
- async def initialize(self, seed: Optional[int] = None) -> InternalObservation: # type: ignore[override]
204
- # Check if seed was provided in task instance metadata
205
- if (
206
- seed is None
207
- and hasattr(self.task_instance, "metadata")
208
- and hasattr(self.task_instance.metadata, "seed")
209
- ):
210
- seed = self.task_instance.metadata.seed
211
- # Check if seed was provided in initial_engine_snapshot
212
- elif (
213
- seed is None
214
- and hasattr(self.task_instance, "initial_engine_snapshot")
215
- and isinstance(self.task_instance.initial_engine_snapshot, dict)
216
- ):
217
- seed = self.task_instance.initial_engine_snapshot.get("seed")
218
-
219
- # Initialize with seed from various sources
220
-
221
- priv, pub = await self.engine._reset_engine(seed=seed)
222
- return await self._to_observation(priv, pub, self.custom_step_observation_callable)
223
-
224
- async def terminate(self) -> InternalObservation: # type: ignore[override]
225
- pub = self.engine._get_public_state_from_env()
226
- priv = self.engine._get_private_state_from_env(0, True, False) # Terminated state
227
- priv.terminated = True
228
- obs_dict = {"status": "Environment terminated."}
229
- return await self._to_observation(
230
- priv, pub, self.custom_step_observation_callable, extra_obs=obs_dict
231
- )
232
-
233
- # ────────────────────────────────────────────────────────────────────
234
- # Step + checkpoint
235
- # ────────────────────────────────────────────────────────────────────
236
-
237
- def validate_tool_calls(
238
- self, tool_calls: Union[EnvToolCall, List[EnvToolCall], List[List[EnvToolCall]]]
239
- ) -> EnvToolCall:
240
- # Store the original tool calls for tracing
241
- state_before = {"tool_calls": tool_calls}
242
-
243
- # Normalize and validate to a single EnvToolCall (same as Sokoban)
244
- if isinstance(tool_calls, list):
245
- if not tool_calls:
246
- raise ValueError("Received empty list of tool calls.")
247
- if isinstance(tool_calls[0], list):
248
- if not tool_calls[0]:
249
- raise ValueError("Received empty inner list of tool calls.")
250
- agent_call = tool_calls[0][0]
251
- else:
252
- agent_call = tool_calls[0]
253
- elif isinstance(tool_calls, EnvToolCall):
254
- agent_call = tool_calls
255
- else:
256
- raise TypeError(f"Unexpected type for tool_calls: {type(tool_calls)}")
257
-
258
- if not isinstance(agent_call, EnvToolCall):
259
- raise TypeError(f"Processed call is not EnvToolCall: {type(agent_call)}")
260
- if agent_call.tool != "interact":
261
- raise ValueError(f"Unknown tool: {agent_call.tool}. Expected 'interact'.")
262
-
263
- # Record runtime event for tool call validation
264
- if (
265
- self.session_tracer
266
- and hasattr(self.session_tracer, "current_session")
267
- and self.session_tracer.current_session
268
- ):
269
- runtime_validation_event = RuntimeEvent()
270
- runtime_validation_event.time_record = TimeRecord()
271
- runtime_validation_event.time_record.event_time = time.time()
272
- runtime_validation_event.time_record.message_time = None
273
- runtime_validation_event.system_instance_id = "crafter_environment"
274
- runtime_validation_event.system_state_before = state_before
275
- runtime_validation_event.system_state_after = {"validated_call": agent_call}
276
- runtime_validation_event.metadata = {"validation_step": "tool_call_validation"}
277
- # Add directly to event history, bypassing timestep requirement
278
- self.session_tracer.current_session.add_event(runtime_validation_event)
279
-
280
- return agent_call
281
-
282
- async def step(
283
- self, tool_calls: Union[EnvToolCall, List[EnvToolCall], List[List[EnvToolCall]]]
284
- ) -> InternalObservation: # type: ignore[override]
285
- step_start_time = time.time()
286
- agent_call = self.validate_tool_calls(tool_calls)
287
- interact_start = time.time()
288
- tool_result: ToolResult = await self._interact_tool(agent_call)
289
- interact_time = time.time() - interact_start
290
-
291
- payload_dict = tool_result.payload
292
- pub_state: CrafterPublicState
293
- priv_state: CrafterPrivateState
294
-
295
- if tool_result.ok:
296
- # payload contains the actual state objects from the interact tool
297
- priv_state = payload_dict.get("private_state")
298
- pub_state = payload_dict.get("public_state")
299
-
300
- # Validate we got the expected state objects
301
- if not isinstance(priv_state, CrafterPrivateState) or not isinstance(
302
- pub_state, CrafterPublicState
303
- ):
304
- logger.error(
305
- f"Invalid state types in payload: priv={type(priv_state)}, pub={type(pub_state)}"
306
- )
307
- # Fall back to getting current state
308
- pub_state = self.engine._get_public_state_from_env()
309
- health_dead = safe_compare(0, self.engine.env._player.health, ">=")
310
- step_exceeded = safe_compare(self.engine.env._length, self.engine.env._step, "<=")
311
- priv_state = self.engine._get_private_state_from_env(0, health_dead, step_exceeded)
312
- pub_state.error_info = "Invalid state types in tool result"
313
- else:
314
- # Tool call failed, use states from payload if available, otherwise get current state
315
- priv_state = payload_dict.get("private_state")
316
- pub_state = payload_dict.get("public_state")
317
-
318
- if not isinstance(priv_state, CrafterPrivateState) or not isinstance(
319
- pub_state, CrafterPublicState
320
- ):
321
- # Fall back to getting current state
322
- pub_state = self.engine._get_public_state_from_env()
323
- health_dead = safe_compare(0, self.engine.env._player.health, ">=")
324
- step_exceeded = safe_compare(self.engine.env._length, self.engine.env._step, "<=")
325
- priv_state = self.engine._get_private_state_from_env(0, health_dead, step_exceeded)
326
-
327
- if tool_result.error:
328
- pub_state.error_info = tool_result.error
329
-
330
- obs = await self._to_observation(
331
- priv_state, pub_state, self.custom_step_observation_callable
332
- )
333
- total_step_time = time.time() - step_start_time
334
- logger.info(
335
- f"CrafterClassic step completed in {total_step_time:.3f}s (interact: {interact_time:.3f}s)"
336
- )
337
- return obs
338
-
339
- async def checkpoint(self) -> InternalObservation: # type: ignore[override]
340
- engine_snapshot: CrafterEngineSnapshot = await self.engine._serialize_engine()
341
- priv = self.engine._get_private_state_from_env(0, False, False) # Get current state for obs
342
- pub = self.engine._get_public_state_from_env()
343
- obs_data = await self._to_observation(
344
- priv, pub, self.custom_checkpoint_observation_callable
345
- )
346
- if isinstance(obs_data, dict):
347
- obs_data["engine_snapshot_data"] = engine_snapshot.model_dump()
348
- return obs_data
349
-
350
- # ────────────────────────────────────────────────────────────────────
351
- # Helpers
352
- # ────────────────────────────────────────────────────────────────────
353
-
354
- async def _to_observation(
355
- self,
356
- priv: CrafterPrivateState,
357
- pub: CrafterPublicState,
358
- obs_cb: Optional[GetObservationCallable],
359
- extra_obs: Optional[Dict[str, Any]] = None,
360
- ) -> InternalObservation:
361
- # Store state before observation generation
362
- state_before = {"private_state": priv, "public_state": pub}
363
-
364
- active_obs_cb = obs_cb or SynthCrafterObservationCallable()
365
- observation = await active_obs_cb.get_observation(pub, priv)
366
- if extra_obs and isinstance(observation, dict):
367
- observation.update(extra_obs)
368
-
369
- # Record runtime event for observation generation
370
- if (
371
- self.session_tracer
372
- and hasattr(self.session_tracer, "current_session")
373
- and self.session_tracer.current_session
374
- ):
375
- runtime_obs_event = RuntimeEvent()
376
- runtime_obs_event.time_record = TimeRecord()
377
- runtime_obs_event.time_record.event_time = time.time()
378
- runtime_obs_event.time_record.message_time = None
379
- runtime_obs_event.system_instance_id = "observation_generator"
380
- runtime_obs_event.system_state_before = state_before
381
- runtime_obs_event.system_state_after = {"observation": observation}
382
- runtime_obs_event.metadata = {"observation_step": "state_to_obs_conversion"}
383
- # Add directly to event history, bypassing timestep requirement
384
- self.session_tracer.current_session.add_event(runtime_obs_event)
385
-
386
- return observation
387
-
388
- # ────────────────────────────────────────────────────────────────────
389
- # ReproducibleEnvironment plumbing
390
- # ────────────────────────────────────────────────────────────────────
391
-
392
- async def _serialize_engine(self) -> CrafterEngineSnapshot:
393
- return await self.engine._serialize_engine()
394
-
395
- @classmethod
396
- async def _deserialize_engine(
397
- cls, snapshot: CrafterEngineSnapshot, task_instance: "CrafterTaskInstance"
398
- ) -> "CrafterClassicEnvironment":
399
- eng = await CrafterEngine._deserialize_engine(snapshot, task_instance)
400
- env = cls(task_instance)
401
- env.engine = eng
402
- # CRITICAL: Update the interact tool to use the new engine!
403
- env._interact_tool.engine = eng
404
- return env
@@ -1,233 +0,0 @@
1
- """Procedural Crafter taskset generation with seed filtering by world traits.
2
- Run this to build a TaskInstanceSet with reproducible initial snapshots.
3
- """
4
-
5
- from __future__ import annotations
6
-
7
- import asyncio
8
- import random
9
- from dataclasses import asdict, dataclass, fields
10
- from typing import Dict, List
11
- from uuid import UUID, uuid4
12
-
13
- import crafter
14
- import numpy as np
15
- from crafter import objects
16
-
17
- from synth_ai.environments.tasks.core import (
18
- Impetus,
19
- Intent,
20
- SplitInfo,
21
- Task,
22
- TaskInstance,
23
- TaskInstanceMetadata,
24
- TaskInstanceSet,
25
- )
26
-
27
- # ──────────────────────────────────────────────────────────────────────────────
28
- # Config
29
- # ──────────────────────────────────────────────────────────────────────────────
30
- TASK = Task(
31
- global_premises="Procedural Crafter seed generation",
32
- global_constraints="",
33
- global_objectives="Survive and unlock achievements.",
34
- shared_env_params={},
35
- )
36
-
37
- AREA = (64, 64)
38
- LEN = 10000
39
- RADIUS = 10 # Manhattan distance for local trait count
40
- SEED_START = 0
41
- NUM_INSTANCES = 50
42
-
43
- # Desired trait ranges per difficulty tier
44
- TRAIT_BOUNDS = {
45
- "easy": {
46
- "min_trees": 4,
47
- "max_hostiles": 0,
48
- },
49
- "medium": {
50
- "min_trees": 2,
51
- "max_hostiles": 2,
52
- },
53
- "hard": {
54
- "min_trees": 0,
55
- "max_hostiles": 5,
56
- },
57
- }
58
-
59
- # ──────────────────────────────────────────────────────────────────────────────
60
- # Metadata + instance helpers
61
- # ──────────────────────────────────────────────────────────────────────────────
62
-
63
-
64
- from typing import Optional
65
-
66
-
67
- @dataclass
68
- class CrafterTaskInstanceMetadata(TaskInstanceMetadata):
69
- difficulty: str
70
- seed: int
71
- num_trees_radius: int
72
- num_cows_radius: int
73
- num_hostiles_radius: int
74
- world_config: Optional[str] = "normal" # 'easy', 'normal', 'hard', 'peaceful'
75
- world_config_path: Optional[str] = None # Path to custom JSON config
76
-
77
-
78
- @dataclass
79
- class CrafterTaskInstance(TaskInstance):
80
- async def serialize(self) -> dict: # identical to Sokoban pattern
81
- data = asdict(self)
82
- if isinstance(data.get("id"), UUID):
83
- data["id"] = str(data["id"])
84
- if "intent" in data and data["intent"] is not None:
85
- data["intent"]["deterministic_eval_functions"] = []
86
- return data
87
-
88
- @classmethod
89
- async def deserialize(cls, data: dict) -> "CrafterTaskInstance":
90
- if "id" in data:
91
- try:
92
- data["id"] = UUID(str(data["id"]))
93
- except Exception:
94
- pass
95
- if "impetus" in data and isinstance(data["impetus"], dict):
96
- impetus_data = data["impetus"]
97
- # Ensure instructions field exists with default if missing
98
- if "instructions" not in impetus_data:
99
- impetus_data["instructions"] = "Survive and unlock achievements"
100
- data["impetus"] = Impetus(**impetus_data)
101
- if "intent" in data and isinstance(data["intent"], dict):
102
- intent_data = data["intent"]
103
- # Ensure required fields exist with defaults if missing
104
- if "rubric" not in intent_data:
105
- intent_data["rubric"] = {"goal": "Unlock achievements"}
106
- if "gold_trajectories" not in intent_data:
107
- intent_data["gold_trajectories"] = None
108
- if "gold_state_diff" not in intent_data:
109
- intent_data["gold_state_diff"] = {}
110
- intent_data["deterministic_eval_functions"] = []
111
- data["intent"] = Intent(**intent_data)
112
- if "metadata" in data and isinstance(data["metadata"], dict):
113
- metadata_data = data["metadata"]
114
- # Ensure required fields exist with defaults if missing
115
- if "difficulty" not in metadata_data:
116
- metadata_data["difficulty"] = "medium"
117
- if "seed" not in metadata_data:
118
- metadata_data["seed"] = 0
119
- if "num_trees_radius" not in metadata_data:
120
- metadata_data["num_trees_radius"] = 0
121
- if "num_cows_radius" not in metadata_data:
122
- metadata_data["num_cows_radius"] = 0
123
- if "num_hostiles_radius" not in metadata_data:
124
- metadata_data["num_hostiles_radius"] = 0
125
- data["metadata"] = CrafterTaskInstanceMetadata(**metadata_data)
126
- keep = {f.name for f in fields(cls)}
127
- return cls(**{k: v for k, v in data.items() if k in keep})
128
-
129
-
130
- # ──────────────────────────────────────────────────────────────────────────────
131
- # Trait extraction util
132
- # ──────────────────────────────────────────────────────────────────────────────
133
-
134
-
135
- def world_traits(env: crafter.Env, radius: int = RADIUS) -> Dict[str, int]:
136
- player = env._player # type: ignore[attr-defined]
137
- pos = np.array(player.pos)
138
- counts = {"trees": 0, "cows": 0, "hostiles": 0}
139
- for obj in env._world._objects: # type: ignore[attr-defined]
140
- if obj is None or obj is player:
141
- continue
142
- if np.abs(obj.pos - pos).sum() > radius:
143
- continue
144
- if isinstance(obj, objects.Plant) and getattr(obj, "kind", "") == "tree":
145
- counts["trees"] += 1
146
- elif isinstance(obj, objects.Cow):
147
- counts["cows"] += 1
148
- elif isinstance(obj, (objects.Zombie, objects.Skeleton)):
149
- counts["hostiles"] += 1
150
- return counts
151
-
152
-
153
- # ──────────────────────────────────────────────────────────────────────────────
154
- # Main generator
155
- # ──────────────────────────────────────────────────────────────────────────────
156
-
157
-
158
- async def create_crafter_taskset(num_instances: int = NUM_INSTANCES) -> TaskInstanceSet:
159
- instances: List[CrafterTaskInstance] = []
160
- seed = SEED_START
161
- while len(instances) < num_instances:
162
- env = crafter.Env(area=AREA, length=LEN, seed=seed)
163
- _ = env.reset()
164
- traits = world_traits(env)
165
- # assign difficulty tier first match
166
- difficulty: str | None = None
167
- for diff, bounds in TRAIT_BOUNDS.items():
168
- if (
169
- traits["trees"] >= bounds["min_trees"]
170
- and traits["hostiles"] <= bounds["max_hostiles"]
171
- ):
172
- difficulty = diff
173
- break
174
- if difficulty is None:
175
- seed += 1
176
- continue
177
- # build instance
178
- impetus = Impetus(instructions=f"Survive and unlock achievements. Difficulty={difficulty}.")
179
- intent = Intent(
180
- rubric={"goal": "Unlock as many achievements as possible."},
181
- gold_trajectories=None,
182
- gold_state_diff={},
183
- )
184
- metadata = CrafterTaskInstanceMetadata(
185
- difficulty=difficulty,
186
- seed=seed,
187
- num_trees_radius=traits["trees"],
188
- num_cows_radius=traits["cows"],
189
- num_hostiles_radius=traits["hostiles"],
190
- )
191
- instance = CrafterTaskInstance(
192
- id=uuid4(),
193
- impetus=impetus,
194
- intent=intent,
195
- metadata=metadata,
196
- is_reproducible=True,
197
- initial_engine_snapshot=None, # will be filled lazily when env starts
198
- )
199
- instances.append(instance)
200
- seed += 1
201
-
202
- # simple random split 80/10/10
203
- random.shuffle(instances)
204
- n = len(instances)
205
- val_ids = {inst.id for inst in instances[int(0.8 * n) : int(0.9 * n)]}
206
- test_ids = {inst.id for inst in instances[int(0.9 * n) :]}
207
- split = SplitInfo(val_instance_ids=val_ids, test_instance_ids=test_ids, _is_split_defined=True)
208
-
209
- return TaskInstanceSet(
210
- name="Crafter Procedural TaskSet",
211
- description="Crafter seeds filtered by local world traits around spawn.",
212
- instances=instances,
213
- split_info=split,
214
- )
215
-
216
-
217
- # ──────────────────────────────────────────────────────────────────────────────
218
- # CLI example
219
- # ──────────────────────────────────────────────────────────────────────────────
220
-
221
- if __name__ == "__main__":
222
- import json
223
- import pathlib
224
-
225
- async def _main():
226
- ts = await create_crafter_taskset(30)
227
- serial = await asyncio.gather(*(inst.serialize() for inst in ts.instances))
228
- out = pathlib.Path("dataset/crafter_instances.json")
229
- out.parent.mkdir(parents=True, exist_ok=True)
230
- out.write_text(json.dumps(serial, indent=2))
231
- print(f"Saved {len(serial)} instances → {out}")
232
-
233
- asyncio.run(_main())