synth-ai 0.2.8.dev2__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 (740) 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/{demos → cli/demo_apps}/core/cli.py +783 -441
  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 +75 -37
  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/{demos → cli/demo_apps}/demo_task_apps/math/_common.py +1 -2
  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} +16 -4
  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 -108
  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.8.dev2.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 -144
  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 -202
  364. synth_ai/cli/status.py +0 -133
  365. synth_ai/config/base_url.py +0 -107
  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/demo_task_apps/__init__.py +0 -1
  370. synth_ai/demos/demo_task_apps/math/config.toml +0 -129
  371. synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
  372. synth_ai/demos/demo_task_apps/math/modal_task_app.py +0 -415
  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 -738
  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 -98
  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/handshake.py +0 -63
  598. synth_ai/http.py +0 -26
  599. synth_ai/http_client.py +0 -104
  600. synth_ai/inference/client.py +0 -20
  601. synth_ai/install_sqld.sh +0 -40
  602. synth_ai/jobs/client.py +0 -246
  603. synth_ai/learning/__init__.py +0 -24
  604. synth_ai/learning/config.py +0 -43
  605. synth_ai/learning/filtering.py +0 -0
  606. synth_ai/learning/ft_client.py +0 -59
  607. synth_ai/learning/offline/dpo.py +0 -0
  608. synth_ai/learning/offline/providers.py +0 -7
  609. synth_ai/learning/offline/sft.py +0 -0
  610. synth_ai/learning/offline/shared.py +0 -0
  611. synth_ai/learning/online/grpo.py +0 -0
  612. synth_ai/learning/online/irft.py +0 -0
  613. synth_ai/learning/prompts/banking77_injection_eval.py +0 -168
  614. synth_ai/learning/prompts/gepa.py +0 -0
  615. synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +0 -213
  616. synth_ai/learning/prompts/mipro.py +0 -289
  617. synth_ai/learning/prompts/random_search.py +0 -246
  618. synth_ai/learning/prompts/run_mipro_banking77.py +0 -172
  619. synth_ai/learning/prompts/run_random_search_banking77.py +0 -324
  620. synth_ai/learning/sse.py +0 -58
  621. synth_ai/learning/validators.py +0 -48
  622. synth_ai/lm/__init__.py +0 -51
  623. synth_ai/lm/caching/constants.py +0 -6
  624. synth_ai/lm/caching/dbs.py +0 -0
  625. synth_ai/lm/caching/ephemeral.py +0 -102
  626. synth_ai/lm/caching/handler.py +0 -137
  627. synth_ai/lm/caching/initialize.py +0 -11
  628. synth_ai/lm/caching/persistent.py +0 -114
  629. synth_ai/lm/config.py +0 -110
  630. synth_ai/lm/constants.py +0 -32
  631. synth_ai/lm/core/__init__.py +0 -8
  632. synth_ai/lm/core/all.py +0 -73
  633. synth_ai/lm/core/exceptions.py +0 -7
  634. synth_ai/lm/core/main.py +0 -319
  635. synth_ai/lm/core/main_v3.py +0 -594
  636. synth_ai/lm/core/synth_models.py +0 -48
  637. synth_ai/lm/core/vendor_clients.py +0 -188
  638. synth_ai/lm/cost/__init__.py +0 -0
  639. synth_ai/lm/cost/monitor.py +0 -1
  640. synth_ai/lm/cost/statefulness.py +0 -1
  641. synth_ai/lm/injection.py +0 -80
  642. synth_ai/lm/overrides.py +0 -206
  643. synth_ai/lm/provider_support/__init__.py +0 -8
  644. synth_ai/lm/provider_support/anthropic.py +0 -972
  645. synth_ai/lm/provider_support/openai.py +0 -1139
  646. synth_ai/lm/provider_support/suppress_logging.py +0 -31
  647. synth_ai/lm/structured_outputs/__init__.py +0 -0
  648. synth_ai/lm/structured_outputs/handler.py +0 -440
  649. synth_ai/lm/structured_outputs/inject.py +0 -297
  650. synth_ai/lm/structured_outputs/rehabilitate.py +0 -185
  651. synth_ai/lm/tools/__init__.py +0 -3
  652. synth_ai/lm/tools/base.py +0 -172
  653. synth_ai/lm/unified_interface.py +0 -202
  654. synth_ai/lm/vendors/__init__.py +0 -0
  655. synth_ai/lm/vendors/base.py +0 -81
  656. synth_ai/lm/vendors/core/__init__.py +0 -0
  657. synth_ai/lm/vendors/core/anthropic_api.py +0 -387
  658. synth_ai/lm/vendors/core/gemini_api.py +0 -292
  659. synth_ai/lm/vendors/core/mistral_api.py +0 -322
  660. synth_ai/lm/vendors/core/openai_api.py +0 -225
  661. synth_ai/lm/vendors/core/synth_dev_api.py +0 -0
  662. synth_ai/lm/vendors/local/__init__.py +0 -0
  663. synth_ai/lm/vendors/local/ollama.py +0 -0
  664. synth_ai/lm/vendors/openai_standard.py +0 -780
  665. synth_ai/lm/vendors/openai_standard_responses.py +0 -256
  666. synth_ai/lm/vendors/retries.py +0 -22
  667. synth_ai/lm/vendors/supported/__init__.py +0 -0
  668. synth_ai/lm/vendors/supported/custom_endpoint.py +0 -417
  669. synth_ai/lm/vendors/supported/deepseek.py +0 -69
  670. synth_ai/lm/vendors/supported/grok.py +0 -75
  671. synth_ai/lm/vendors/supported/groq.py +0 -16
  672. synth_ai/lm/vendors/supported/ollama.py +0 -15
  673. synth_ai/lm/vendors/supported/openrouter.py +0 -74
  674. synth_ai/lm/vendors/supported/together.py +0 -11
  675. synth_ai/lm/vendors/synth_client.py +0 -808
  676. synth_ai/lm/warmup.py +0 -186
  677. synth_ai/rl/secrets.py +0 -19
  678. synth_ai/scripts/verify_rewards.py +0 -100
  679. synth_ai/task/__init__.py +0 -10
  680. synth_ai/task/contracts.py +0 -120
  681. synth_ai/task/health.py +0 -28
  682. synth_ai/task/validators.py +0 -12
  683. synth_ai/tracing/__init__.py +0 -30
  684. synth_ai/tracing_v1/__init__.py +0 -33
  685. synth_ai/tracing_v3/config.py +0 -84
  686. synth_ai/tracing_v3/storage/config.py +0 -62
  687. synth_ai/tracing_v3/turso/__init__.py +0 -25
  688. synth_ai/tracing_v3/turso/daemon.py +0 -144
  689. synth_ai/tracing_v3/turso/manager.py +0 -760
  690. synth_ai/v0/tracing/__init__.py +0 -0
  691. synth_ai/v0/tracing/abstractions.py +0 -224
  692. synth_ai/v0/tracing/base_client.py +0 -91
  693. synth_ai/v0/tracing/client_manager.py +0 -131
  694. synth_ai/v0/tracing/config.py +0 -142
  695. synth_ai/v0/tracing/context.py +0 -146
  696. synth_ai/v0/tracing/decorators.py +0 -682
  697. synth_ai/v0/tracing/events/__init__.py +0 -0
  698. synth_ai/v0/tracing/events/manage.py +0 -147
  699. synth_ai/v0/tracing/events/scope.py +0 -86
  700. synth_ai/v0/tracing/events/store.py +0 -228
  701. synth_ai/v0/tracing/immediate_client.py +0 -151
  702. synth_ai/v0/tracing/local.py +0 -18
  703. synth_ai/v0/tracing/log_client_base.py +0 -73
  704. synth_ai/v0/tracing/retry_queue.py +0 -186
  705. synth_ai/v0/tracing/trackers.py +0 -515
  706. synth_ai/v0/tracing/upload.py +0 -512
  707. synth_ai/v0/tracing/utils.py +0 -9
  708. synth_ai/v0/tracing_v1/__init__.py +0 -16
  709. synth_ai/v0/tracing_v1/abstractions.py +0 -224
  710. synth_ai/v0/tracing_v1/base_client.py +0 -91
  711. synth_ai/v0/tracing_v1/client_manager.py +0 -131
  712. synth_ai/v0/tracing_v1/config.py +0 -142
  713. synth_ai/v0/tracing_v1/context.py +0 -146
  714. synth_ai/v0/tracing_v1/decorators.py +0 -703
  715. synth_ai/v0/tracing_v1/events/__init__.py +0 -0
  716. synth_ai/v0/tracing_v1/events/manage.py +0 -147
  717. synth_ai/v0/tracing_v1/events/scope.py +0 -86
  718. synth_ai/v0/tracing_v1/events/store.py +0 -228
  719. synth_ai/v0/tracing_v1/immediate_client.py +0 -151
  720. synth_ai/v0/tracing_v1/local.py +0 -18
  721. synth_ai/v0/tracing_v1/log_client_base.py +0 -73
  722. synth_ai/v0/tracing_v1/retry_queue.py +0 -186
  723. synth_ai/v0/tracing_v1/trackers.py +0 -515
  724. synth_ai/v0/tracing_v1/upload.py +0 -527
  725. synth_ai/v0/tracing_v1/utils.py +0 -9
  726. synth_ai/zyk/__init__.py +0 -30
  727. synth_ai-0.2.8.dev2.dist-info/METADATA +0 -129
  728. synth_ai-0.2.8.dev2.dist-info/RECORD +0 -420
  729. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
  730. /synth_ai/{lm/caching → core/apps}/__init__.py +0 -0
  731. /synth_ai/{tracing_v3 → core/tracing_v3}/lm_call_record_abstractions.py +0 -0
  732. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/__init__.py +0 -0
  733. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/exceptions.py +0 -0
  734. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/types.py +0 -0
  735. /synth_ai/{compound/cais.py → py.typed} +0 -0
  736. /synth_ai/{learning → sdk/learning}/core.py +0 -0
  737. /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
  738. {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/WHEEL +0 -0
  739. {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/licenses/LICENSE +0 -0
  740. {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/top_level.txt +0 -0
@@ -1,579 +0,0 @@
1
- """CrafterEngine — Stateful, reproducible wrapper around danijar/crafter.Env.
2
- This file follows the same structure as the SokobanEngine shown earlier.
3
- """
4
-
5
- from __future__ import annotations
6
-
7
- import copy
8
- import dataclasses
9
- import logging
10
- import time
11
- from dataclasses import dataclass
12
- from typing import Any, Dict, Optional, Tuple, Union
13
-
14
- import crafter # type: ignore
15
- import numpy as np
16
-
17
- from synth_ai.environments.environment.rewards.core import RewardComponent, RewardStack # Added
18
- from synth_ai.environments.environment.shared_engine import (
19
- GetObservationCallable,
20
- InternalObservation,
21
- )
22
- from synth_ai.environments.reproducibility.core import IReproducibleEngine
23
- from synth_ai.environments.stateful.engine import StatefulEngine, StatefulEngineSnapshot
24
- from synth_ai.environments.tasks.core import TaskInstance
25
-
26
- # Import patches
27
- from . import engine_deterministic_patch # Ensures deterministic behavior
28
- from . import engine_serialization_patch_v3 as engine_serialization_patch # Adds save/load methods
29
- from . import world_config_patch_simple as world_config_patch # Adds configurable world generation
30
-
31
- # Import logging configuration first to suppress JAX debug messages
32
- from .config_logging import safe_compare
33
-
34
- # Local helper imports (must exist relative to this file)
35
- from .engine_helpers.action_map import CRAFTER_ACTION_MAP # action‑name → int
36
- from .engine_helpers.serialization import (
37
- serialize_world_object,
38
- )
39
-
40
- logger = logging.getLogger(__name__)
41
- logging.basicConfig(level=logging.INFO)
42
-
43
- # -----------------------------------------------------------------------------
44
- # Dataclasses for snapshot & (public, private) runtime state
45
- # -----------------------------------------------------------------------------
46
-
47
-
48
- @dataclass
49
- class CrafterEngineSnapshot(StatefulEngineSnapshot):
50
- env_raw_state: Any # from crafter.Env.save()
51
- total_reward_snapshot: float
52
- crafter_seed: Optional[int] = None
53
- # Store previous states needed for reward calculation to resume correctly
54
- previous_public_state_snapshot: Optional[Dict] = None
55
- previous_private_state_snapshot: Optional[Dict] = None
56
- # Add _previous_public_state_for_reward and _previous_private_state_for_reward if needed for perfect resume
57
- # For RewardStack, its configuration is fixed at init. If it had internal state, that would need saving.
58
-
59
-
60
- @dataclass
61
- class CrafterPublicState:
62
- inventory: Dict[str, int]
63
- achievements_status: Dict[str, bool]
64
- player_position: Tuple[int, int]
65
- player_direction: Union[int, Tuple[int, int]]
66
- semantic_map: Optional[np.ndarray]
67
- world_material_map: np.ndarray
68
- observation_image: np.ndarray
69
- num_steps_taken: int
70
- max_steps_episode: int
71
- error_info: Optional[str] = None
72
-
73
- def diff(self, prev_state: "CrafterPublicState") -> Dict[str, Any]:
74
- changes = {}
75
- for field in self.__dataclass_fields__: # type: ignore[attr-defined]
76
- new_v, old_v = getattr(self, field), getattr(prev_state, field)
77
- if isinstance(new_v, np.ndarray):
78
- if not np.array_equal(new_v, old_v):
79
- changes[field] = True
80
- elif new_v != old_v:
81
- changes[field] = (old_v, new_v)
82
- return changes
83
-
84
-
85
- @dataclass
86
- class CrafterPrivateState:
87
- reward_last_step: float
88
- total_reward_episode: float
89
- achievements_current_values: Dict[str, int]
90
- terminated: bool
91
- truncated: bool
92
- player_internal_stats: Dict[str, Any]
93
- world_rng_state_snapshot: Any
94
-
95
- def diff(self, prev_state: "CrafterPrivateState") -> Dict[str, Any]:
96
- changes = {}
97
- for field in self.__dataclass_fields__: # type: ignore[attr-defined]
98
- new_v, old_v = getattr(self, field), getattr(prev_state, field)
99
- if new_v != old_v:
100
- changes[field] = (old_v, new_v)
101
- return changes
102
-
103
-
104
- # -----------------------------------------------------------------------------
105
- # Observation helpers
106
- # -----------------------------------------------------------------------------
107
-
108
-
109
- class CrafterObservationCallable(GetObservationCallable):
110
- def __init__(self) -> None:
111
- pass
112
-
113
- async def get_observation(
114
- self, pub: CrafterPublicState, priv: CrafterPrivateState
115
- ) -> InternalObservation: # type: ignore[override]
116
- observation: Dict[str, Any] = {
117
- "inventory": pub.inventory,
118
- "achievements": pub.achievements_status,
119
- "player_pos": pub.player_position,
120
- "steps": pub.num_steps_taken,
121
- "reward_last": priv.reward_last_step,
122
- "total_reward": priv.total_reward_episode,
123
- "terminated": priv.terminated,
124
- "truncated": priv.truncated,
125
- }
126
- return observation # type: ignore[return-value]
127
-
128
-
129
- # -----------------------------------------------------------------------------
130
- # CrafterEngine implementation
131
- # -----------------------------------------------------------------------------
132
-
133
-
134
- class CrafterEngine(StatefulEngine, IReproducibleEngine):
135
- """StatefulEngine wrapper around `crafter.Env` supporting full snapshotting."""
136
-
137
- task_instance: TaskInstance
138
- env: crafter.Env
139
-
140
- # ────────────────────────────────────────────────────────────────────────
141
- # Construction helpers
142
- # ────────────────────────────────────────────────────────────────────────
143
-
144
- def __init__(self, task_instance: TaskInstance):
145
- self.task_instance = task_instance
146
- self._total_reward: float = 0.0
147
- self._current_action_for_reward: Optional[int] = None
148
- self._previous_public_state_for_reward: Optional[CrafterPublicState] = None
149
- self._previous_private_state_for_reward: Optional[CrafterPrivateState] = (
150
- None # For stat changes
151
- )
152
-
153
- # Initialize achievements tracking
154
- self.achievements_unlocked: set = set()
155
-
156
- cfg = getattr(task_instance, "config", {}) or {}
157
- area: Tuple[int, int] = tuple(cfg.get("area", (64, 64))) # type: ignore[arg-type]
158
- length: int = int(cfg.get("length", 10000))
159
-
160
- # Get seed from metadata if available, otherwise fall back to config
161
- seed: Optional[int] = cfg.get("seed")
162
- if hasattr(task_instance, "metadata") and hasattr(task_instance.metadata, "seed"):
163
- seed = task_instance.metadata.seed
164
-
165
- # Get world configuration from metadata or config
166
- world_config = "normal" # default
167
- world_config_path = None
168
-
169
- if hasattr(task_instance, "metadata") and hasattr(task_instance.metadata, "world_config"):
170
- world_config = task_instance.metadata.world_config
171
- logger.info(f"CrafterEngine: Using world_config from metadata: {world_config}")
172
- elif cfg.get("world_config"):
173
- world_config = cfg.get("world_config")
174
- logger.info(f"CrafterEngine: Using world_config from cfg: {world_config}")
175
-
176
- if hasattr(task_instance, "metadata") and hasattr(
177
- task_instance.metadata, "world_config_path"
178
- ):
179
- world_config_path = task_instance.metadata.world_config_path
180
- elif cfg.get("world_config_path"):
181
- world_config_path = cfg.get("world_config_path")
182
-
183
- logger.info(f"CrafterEngine: Creating Env with world_config={world_config}, seed={seed}")
184
- self.env = crafter.Env(
185
- area=area,
186
- length=length,
187
- seed=seed,
188
- world_config=world_config,
189
- world_config_path=world_config_path,
190
- )
191
- # store original seed for reproducibility
192
- self.env._seed = seed
193
-
194
- self.reward_stack = RewardStack(
195
- components=[
196
- CrafterAchievementComponent(),
197
- CrafterPlayerStatComponent(),
198
- CrafterStepPenaltyComponent(penalty=-0.001),
199
- ]
200
- )
201
-
202
- # ────────────────────────────────────────────────────────────────────────
203
- # Utility: action validation / mapping
204
- # ────────────────────────────────────────────────────────────────────────
205
-
206
- def _validate_action_engine(self, action: Union[int, str]) -> int: # type: ignore[override]
207
- if isinstance(action, str):
208
- action = CRAFTER_ACTION_MAP.get(action, 0)
209
- if not isinstance(action, int):
210
- return 0
211
- return int(np.clip(action, 0, len(crafter.constants.actions) - 1)) # type: ignore
212
-
213
- # ────────────────────────────────────────────────────────────────────────
214
- # Core StatefulEngine API
215
- # ────────────────────────────────────────────────────────────────────────
216
-
217
- async def _reset_engine(
218
- self, *, seed: Optional[int] | None = None
219
- ) -> Tuple[CrafterPrivateState, CrafterPublicState]:
220
- if seed is not None:
221
- # Re‑instantiate env with new seed to match crafter's internal reseeding convention
222
- self.env = crafter.Env(area=self.env._area, length=self.env._length, seed=seed)
223
- obs_img = self.env.reset()
224
- self._total_reward = 0.0
225
- pub = self._build_public_state(obs_img)
226
- priv = self._build_private_state(reward=0.0, terminated=False, truncated=False)
227
-
228
- # Player starting position tracked internally
229
-
230
- return priv, pub
231
-
232
- async def _step_engine(self, action: int) -> Tuple[CrafterPrivateState, CrafterPublicState]:
233
- step_start_time = time.time()
234
- try:
235
- # Validate action is in valid range
236
- if action < 0 or action >= self.env.action_space.n:
237
- raise ValueError(
238
- f"Invalid action {action}, must be in range [0, {self.env.action_space.n})"
239
- )
240
-
241
- # Ensure player reference is valid before proceeding
242
- if self.env._player is None:
243
- # Try to find player in world objects
244
- for obj in self.env._world._objects:
245
- if (
246
- obj is not None
247
- and hasattr(obj, "__class__")
248
- and obj.__class__.__name__ == "Player"
249
- ):
250
- self.env._player = obj
251
- break
252
-
253
- if self.env._player is None:
254
- raise RuntimeError("Player object not found in world")
255
-
256
- # Build public state BEFORE step (baseline if needed)
257
- pub_state_before = self._build_public_state(self.env.render())
258
-
259
- # Step the environment
260
- crafter_step_start = time.time()
261
- obs, reward, done, info = self.env.step(action)
262
- crafter_step_time = time.time() - crafter_step_start
263
- logger.debug(f"Crafter env.step() took {crafter_step_time:.3f}s")
264
-
265
- # Update internal state
266
- self.obs = obs
267
- self.done = done
268
- self.info = info
269
- self.last_reward = reward
270
-
271
- # Step count is tracked by the crafter environment itself in self.env._step
272
-
273
- # Process achievements - check what was unlocked this step
274
- new_achievements = set()
275
- if "achievements" in info:
276
- for achievement, status in info["achievements"].items():
277
- if status and achievement not in self.achievements_unlocked:
278
- new_achievements.add(achievement)
279
- self.achievements_unlocked.add(achievement)
280
-
281
- # Calculate reward
282
- reward_from_stack = 0
283
- try:
284
- if hasattr(self, "_reward_stack") and self._reward_stack:
285
- reward_from_stack = sum(self._reward_stack)
286
- self._reward_stack.clear()
287
- except Exception as e:
288
- reward_from_stack = 0
289
-
290
- # Create private state
291
- # Current episode reward
292
- final_reward = self._total_reward + reward + reward_from_stack
293
- self._total_reward = final_reward
294
-
295
- # Determine proper termination reason based on game state
296
- player = self.env._player # type: ignore[attr-defined]
297
- current_step = self.env._step # type: ignore[attr-defined]
298
- max_steps = self.env._length # type: ignore[attr-defined]
299
-
300
- # Check if player died (health <= 0)
301
- player_died = player.health <= 0
302
-
303
- # Check if max steps reached
304
- max_steps_reached = current_step >= max_steps
305
-
306
- # Set termination flags properly:
307
- # - terminated=True only if player actually died
308
- # - truncated=True only if episode ended due to step limit
309
- if done:
310
- if player_died:
311
- terminated = True
312
- truncated = False
313
- elif max_steps_reached:
314
- terminated = False
315
- truncated = True
316
- else:
317
- # Fallback: if done=True but unclear reason, assume timeout
318
- terminated = False
319
- truncated = True
320
- else:
321
- terminated = False
322
- truncated = False
323
-
324
- final_priv_state = self._build_private_state(final_reward, terminated, truncated)
325
-
326
- # Build public state AFTER step to reflect latest world and achievements
327
- pub_state_after = self._build_public_state(obs, info)
328
-
329
- # Store post-step state as baseline for next step
330
- self._previous_public_state_for_reward = pub_state_after
331
- self._previous_private_state_for_reward = final_priv_state
332
-
333
- total_step_time = time.time() - step_start_time
334
- logger.debug(
335
- f"CrafterEngine _step_engine took {total_step_time:.3f}s (crafter.step: {crafter_step_time:.3f}s)"
336
- )
337
- return final_priv_state, pub_state_after
338
-
339
- except Exception as e:
340
- # Create error state
341
- import traceback
342
-
343
- logger.error(f"Step engine error: {e}")
344
- logger.error(traceback.format_exc())
345
- error_pub_state = self._get_public_state_from_env()
346
- error_pub_state.error_info = f"Step engine error: {e}"
347
- error_priv_state = self._get_private_state_from_env(
348
- reward=-1.0, terminated=True, truncated=False
349
- )
350
- return error_priv_state, error_pub_state
351
-
352
- # ------------------------------------------------------------------
353
- # Rendering (simple text summary)
354
- # ------------------------------------------------------------------
355
-
356
- async def _render(
357
- self,
358
- private_state: CrafterPrivateState,
359
- public_state: CrafterPublicState,
360
- get_observation: Optional[GetObservationCallable] = None,
361
- ) -> str: # type: ignore[override]
362
- obs_cb = get_observation or CrafterObservationCallable()
363
- obs = await obs_cb.get_observation(public_state, private_state)
364
- if isinstance(obs, str):
365
- return obs
366
- if isinstance(obs, dict):
367
- header = f"steps: {public_state.num_steps_taken}/{public_state.max_steps_episode} | "
368
- header += f"last_r: {private_state.reward_last_step:.2f} | total_r: {private_state.total_reward_episode:.2f}"
369
- inv = ", ".join(f"{k}:{v}" for k, v in public_state.inventory.items() if v)
370
- ach = ", ".join(k for k, v in public_state.achievements_status.items() if v)
371
- return f"{header}\ninv: {inv}\nach: {ach}"
372
- return str(obs)
373
-
374
- # ------------------------------------------------------------------
375
- # Snapshotting for exact reproducibility
376
- # ------------------------------------------------------------------
377
-
378
- async def _serialize_engine(self) -> CrafterEngineSnapshot:
379
- world = self.env._world # type: ignore[attr-defined]
380
- objects_state = [None if o is None else serialize_world_object(o) for o in world._objects]
381
- # capture total reward and original seed
382
- total_reward = self._total_reward
383
- snap = CrafterEngineSnapshot(
384
- env_raw_state=self.env.save(),
385
- total_reward_snapshot=total_reward,
386
- crafter_seed=self.env._seed,
387
- previous_public_state_snapshot=dataclasses.asdict(
388
- self._previous_public_state_for_reward
389
- )
390
- if self._previous_public_state_for_reward
391
- else None,
392
- previous_private_state_snapshot=dataclasses.asdict(
393
- self._previous_private_state_for_reward
394
- )
395
- if self._previous_private_state_for_reward
396
- else None,
397
- )
398
- return snap
399
-
400
- @classmethod
401
- async def _deserialize_engine(
402
- cls, snapshot: CrafterEngineSnapshot, task_instance: TaskInstance
403
- ) -> "CrafterEngine":
404
- engine = cls(task_instance)
405
- # Initialize env first to create structures
406
- obs = engine.env.reset()
407
- # Then load the saved state (this overrides the reset)
408
- engine.env.load(snapshot.env_raw_state)
409
- engine._total_reward = snapshot.total_reward_snapshot
410
- engine.env._seed = snapshot.crafter_seed
411
-
412
- # Initialize engine state attributes that step() expects
413
- engine.obs = engine.env.render()
414
- engine.done = False
415
- engine.info = {}
416
- engine.last_reward = 0.0
417
-
418
- # Ensure achievements tracking is initialized
419
- engine.achievements_unlocked = set()
420
-
421
- # Re-establish previous states for reward system continuity if first step after load
422
- engine._previous_public_state_for_reward = engine._build_public_state(engine.env.render())
423
- # Safe comparisons to avoid string vs int errors
424
- health_dead = safe_compare(0, engine.env._player.health, ">=")
425
- step_exceeded = safe_compare(engine.env._length, engine.env._step, "<=")
426
- engine._previous_private_state_for_reward = engine._build_private_state(
427
- 0.0, health_dead, step_exceeded
428
- )
429
- return engine
430
-
431
- # ------------------------------------------------------------------
432
- # Internal helpers
433
- # ------------------------------------------------------------------
434
-
435
- def _build_public_state(
436
- self, obs_img: np.ndarray, info: Optional[Dict[str, Any]] | None = None
437
- ) -> CrafterPublicState:
438
- try:
439
- if info is None:
440
- player = self.env._player # type: ignore[attr-defined]
441
- # Safe achievement status check
442
- achievements_status = {}
443
- for k, v in player.achievements.items():
444
- achievements_status[k] = safe_compare(0, v, "<")
445
- inventory = player.inventory.copy()
446
- semantic = getattr(self.env, "_sem_view", lambda: None)()
447
- else:
448
- inventory = info.get("inventory", {})
449
- # Safe achievement status check from info
450
- achievements_status = {}
451
- achievements_info = info.get("achievements", {})
452
- for k, v in achievements_info.items():
453
- achievements_status[k] = safe_compare(0, v, "<")
454
- semantic = info.get("semantic")
455
-
456
- player = self.env._player # type: ignore[attr-defined]
457
- return CrafterPublicState(
458
- inventory=inventory,
459
- achievements_status=achievements_status,
460
- player_position=tuple(player.pos), # type: ignore[attr-defined]
461
- player_direction=player.facing, # type: ignore[attr-defined]
462
- semantic_map=semantic,
463
- world_material_map=self.env._world._mat_map.copy(), # type: ignore[attr-defined]
464
- observation_image=obs_img,
465
- num_steps_taken=self.env._step, # type: ignore[attr-defined]
466
- max_steps_episode=self.env._length, # type: ignore[attr-defined]
467
- error_info=info.get("error_info") if info else None,
468
- )
469
- except Exception as e:
470
- logging.error(f"Error building public state: {e}")
471
- # Return minimal safe state
472
- return CrafterPublicState(
473
- inventory={},
474
- achievements_status={},
475
- player_position=(0, 0),
476
- player_direction=0,
477
- semantic_map=None,
478
- world_material_map=np.zeros((1, 1), dtype=np.uint8),
479
- observation_image=obs_img
480
- if obs_img is not None
481
- else np.zeros((64, 64, 3), dtype=np.uint8),
482
- num_steps_taken=0,
483
- max_steps_episode=10000,
484
- error_info=f"State building error: {e}",
485
- )
486
-
487
- def _build_private_state(
488
- self, reward: float, terminated: bool, truncated: bool
489
- ) -> CrafterPrivateState:
490
- player = self.env._player # type: ignore[attr-defined]
491
- stats = {
492
- "health": player.health,
493
- "food": player.inventory.get("food"),
494
- "drink": player.inventory.get("drink"),
495
- "energy": player.inventory.get("energy"),
496
- "_hunger": getattr(player, "_hunger", 0),
497
- "_thirst": getattr(player, "_thirst", 0),
498
- }
499
- return CrafterPrivateState(
500
- reward_last_step=reward,
501
- total_reward_episode=self._total_reward,
502
- achievements_current_values=player.achievements.copy(),
503
- terminated=terminated,
504
- truncated=truncated,
505
- player_internal_stats=stats,
506
- world_rng_state_snapshot=self.env._world.random.get_state(), # type: ignore[attr-defined]
507
- )
508
-
509
- def _get_public_state_from_env(self) -> CrafterPublicState:
510
- """Helper method to get current public state from synth_ai.environments.environment"""
511
- try:
512
- obs_img = self.env.render()
513
- return self._build_public_state(obs_img)
514
- except Exception as e:
515
- logging.error(f"Error getting public state from env: {e}")
516
- # Return default state
517
- return CrafterPublicState(
518
- inventory={},
519
- achievements_status={},
520
- player_position=(0, 0),
521
- player_direction=0,
522
- semantic_map=None,
523
- world_material_map=np.zeros((1, 1), dtype=np.uint8),
524
- observation_image=np.zeros((64, 64, 3), dtype=np.uint8),
525
- num_steps_taken=0,
526
- max_steps_episode=10000,
527
- error_info=f"State extraction error: {e}",
528
- )
529
-
530
- def _get_private_state_from_env(
531
- self, reward: float, terminated: bool, truncated: bool
532
- ) -> CrafterPrivateState:
533
- """Helper method to get current private state from synth_ai.environments.environment"""
534
- try:
535
- return self._build_private_state(reward, terminated, truncated)
536
- except Exception as e:
537
- logging.error(f"Error getting private state from env: {e}")
538
- # Return default state
539
- return CrafterPrivateState(
540
- reward_last_step=reward,
541
- total_reward_episode=0.0,
542
- achievements_current_values={},
543
- terminated=terminated,
544
- truncated=truncated,
545
- player_internal_stats={},
546
- world_rng_state_snapshot=None,
547
- )
548
-
549
-
550
- # --- Reward Components ---
551
- class CrafterAchievementComponent(RewardComponent):
552
- async def score(self, state: CrafterPublicState, action: Dict[str, Any]) -> float:
553
- prev_achievements = action.get("previous_public_state_achievements", {})
554
- current_achievements = state.achievements_status
555
- new_achievements = sum(
556
- 1
557
- for ach, status in current_achievements.items()
558
- if status and not prev_achievements.get(ach)
559
- )
560
- return float(new_achievements) * 0.1
561
-
562
-
563
- class CrafterPlayerStatComponent(RewardComponent):
564
- async def score(self, state: CrafterPrivateState, action: Dict[str, Any]) -> float:
565
- current_health = state.player_internal_stats.get("health", 0)
566
- prev_health = action.get("previous_private_state_stats", {}).get("health", current_health)
567
- if current_health < prev_health:
568
- return -0.05 # Lost health penalty
569
- return 0.0
570
-
571
-
572
- class CrafterStepPenaltyComponent(RewardComponent):
573
- def __init__(self, penalty: float = -0.001):
574
- super().__init__()
575
- self.penalty = penalty
576
- self.weight = 1.0
577
-
578
- async def score(self, state: Any, action: Any) -> float:
579
- return self.penalty
@@ -1,64 +0,0 @@
1
- """
2
- Apply once (import this module anywhere before CrafterEngine is used).
3
- It replaces Env._balance_object so that every per-chunk object list is
4
- sorted by (x, y, class-name) before any random choice is made – removing
5
- the hash-based set-iteration nondeterminism that caused the drift.
6
- """
7
-
8
- import collections
9
-
10
- import crafter
11
-
12
- print("[PATCH] Attempting to apply Crafter deterministic patch...")
13
-
14
- # -----------------------------------------------------------------------------
15
- # 1. Make per–chunk object order stable
16
- # -----------------------------------------------------------------------------
17
- if not hasattr(crafter.Env, "_orig_balance_object"):
18
- print("[PATCH] Patching crafter.Env._balance_object...")
19
- crafter.Env._orig_balance_object = crafter.Env._balance_object
20
-
21
- def _balance_object_det(self, chunk, objs, *args, **kwargs):
22
- # cls, material, span_dist, despan_dist, spawn_prob, despawn_prob, ctor, target_fn
23
- # were part of the original signature, but *args, **kwargs is more robust.
24
- objs = sorted(objs, key=lambda o: (o.pos[0], o.pos[1], o.__class__.__name__))
25
- return crafter.Env._orig_balance_object(self, chunk, objs, *args, **kwargs)
26
-
27
- crafter.Env._balance_object = _balance_object_det
28
- print("[PATCH] crafter.Env._balance_object patched.")
29
- else:
30
- print("[PATCH] crafter.Env._balance_object already patched or _orig_balance_object exists.")
31
-
32
- # -----------------------------------------------------------------------------
33
- # 2. Make *chunk* iteration order stable
34
- # -----------------------------------------------------------------------------
35
- if not hasattr(crafter.engine.World, "_orig_chunks_prop"):
36
- crafter.engine.World._orig_chunks_prop = crafter.engine.World.chunks
37
-
38
- def _chunks_sorted(self):
39
- # OrderedDict keeps the sorted key order during iteration
40
- return collections.OrderedDict(sorted(self._chunks.items()))
41
-
42
- crafter.engine.World.chunks = property(_chunks_sorted)
43
-
44
- # -----------------------------------------------------------------------------
45
- # 3. NEW: keep per-frame object update order deterministic
46
- # -----------------------------------------------------------------------------
47
- if not hasattr(crafter.engine.World, "_orig_objects_prop"):
48
- crafter.engine.World._orig_objects_prop = crafter.engine.World.objects # save original
49
-
50
- @property
51
- def _objects_sorted(self):
52
- objs = [o for o in self._objects if o] # Filter out None (removed) objects
53
- # stable order: x, y, class-name, creation-index
54
- return sorted(
55
- objs,
56
- key=lambda o: (
57
- o.pos[0],
58
- o.pos[1],
59
- o.__class__.__name__,
60
- getattr(o, "_id", 0),
61
- ),
62
- )
63
-
64
- crafter.engine.World.objects = _objects_sorted
@@ -1,6 +0,0 @@
1
- from typing import Dict
2
-
3
- import crafter.constants as C
4
-
5
- # Map each action name to its corresponding index in the crafter package
6
- CRAFTER_ACTION_MAP: Dict[str, int] = {action_name: idx for idx, action_name in enumerate(C.actions)}