synth-ai 0.2.14__py3-none-any.whl → 0.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (1091) hide show
  1. synth_ai/__init__.py +19 -40
  2. synth_ai/__main__.py +30 -3
  3. synth_ai/cli/__init__.py +105 -70
  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/baseline/__init__.py +12 -0
  25. synth_ai/cli/commands/baseline/core.py +636 -0
  26. synth_ai/cli/commands/baseline/list.py +94 -0
  27. synth_ai/cli/commands/demo/__init__.py +3 -0
  28. synth_ai/cli/commands/demo/core.py +153 -0
  29. synth_ai/cli/commands/eval/__init__.py +19 -0
  30. synth_ai/cli/commands/eval/core.py +1113 -0
  31. synth_ai/cli/commands/eval/errors.py +81 -0
  32. synth_ai/cli/commands/eval/validation.py +133 -0
  33. synth_ai/cli/commands/filter/__init__.py +12 -0
  34. synth_ai/cli/commands/filter/core.py +424 -0
  35. synth_ai/cli/commands/filter/errors.py +55 -0
  36. synth_ai/cli/commands/filter/validation.py +77 -0
  37. synth_ai/cli/commands/help/__init__.py +185 -0
  38. synth_ai/cli/commands/help/core.py +72 -0
  39. synth_ai/cli/commands/scan/__init__.py +19 -0
  40. synth_ai/cli/commands/scan/cloudflare_scanner.py +403 -0
  41. synth_ai/cli/commands/scan/core.py +344 -0
  42. synth_ai/cli/commands/scan/health_checker.py +242 -0
  43. synth_ai/cli/commands/scan/local_scanner.py +278 -0
  44. synth_ai/cli/commands/scan/models.py +83 -0
  45. synth_ai/cli/commands/smoke/__init__.py +7 -0
  46. synth_ai/cli/commands/smoke/core.py +1438 -0
  47. synth_ai/cli/commands/status/__init__.py +66 -0
  48. synth_ai/cli/commands/status/client.py +192 -0
  49. synth_ai/cli/commands/status/config.py +92 -0
  50. synth_ai/cli/commands/status/errors.py +20 -0
  51. synth_ai/cli/commands/status/formatters.py +164 -0
  52. synth_ai/cli/commands/status/subcommands/__init__.py +9 -0
  53. synth_ai/cli/commands/status/subcommands/files.py +79 -0
  54. synth_ai/cli/commands/status/subcommands/jobs.py +334 -0
  55. synth_ai/cli/commands/status/subcommands/models.py +79 -0
  56. synth_ai/cli/commands/status/subcommands/pricing.py +23 -0
  57. synth_ai/cli/commands/status/subcommands/runs.py +81 -0
  58. synth_ai/cli/commands/status/subcommands/session.py +182 -0
  59. synth_ai/cli/commands/status/subcommands/summary.py +47 -0
  60. synth_ai/cli/commands/status/subcommands/usage.py +203 -0
  61. synth_ai/cli/commands/status/utils.py +114 -0
  62. synth_ai/cli/commands/train/__init__.py +53 -0
  63. synth_ai/cli/commands/train/core.py +22 -0
  64. synth_ai/cli/commands/train/errors.py +117 -0
  65. synth_ai/cli/commands/train/judge_schemas.py +201 -0
  66. synth_ai/cli/commands/train/judge_validation.py +305 -0
  67. synth_ai/cli/commands/train/prompt_learning_validation.py +633 -0
  68. synth_ai/cli/commands/train/validation.py +392 -0
  69. synth_ai/cli/demo_apps/__init__.py +10 -0
  70. synth_ai/cli/demo_apps/core/__init__.py +28 -0
  71. synth_ai/cli/demo_apps/core/cli.py +1735 -0
  72. synth_ai/cli/demo_apps/crafter/crafter_fft_4b.toml +55 -0
  73. synth_ai/cli/demo_apps/crafter/grpo_crafter_task_app.py +186 -0
  74. synth_ai/cli/demo_apps/crafter/rl_from_base_qwen4b.toml +74 -0
  75. synth_ai/cli/demo_apps/demo_registry.py +176 -0
  76. synth_ai/cli/demo_apps/demo_task_apps/core.py +440 -0
  77. synth_ai/cli/demo_apps/demo_task_apps/crafter/__init__.py +1 -0
  78. synth_ai/cli/demo_apps/demo_task_apps/crafter/grpo_crafter_task_app.py +185 -0
  79. synth_ai/cli/demo_apps/demo_task_apps/math/modal_task_app.py +742 -0
  80. synth_ai/cli/demo_apps/demo_task_apps/math/task_app_entry.py +39 -0
  81. synth_ai/cli/demo_apps/math/__init__.py +1 -0
  82. synth_ai/cli/demo_apps/math/_common.py +16 -0
  83. synth_ai/cli/demo_apps/math/app.py +38 -0
  84. synth_ai/cli/demo_apps/math/config.toml +76 -0
  85. synth_ai/cli/demo_apps/math/deploy_modal.py +54 -0
  86. synth_ai/cli/demo_apps/math/modal_task_app.py +702 -0
  87. synth_ai/cli/demo_apps/math/task_app_entry.py +53 -0
  88. synth_ai/cli/demo_apps/mipro/main.py +271 -0
  89. synth_ai/cli/demo_apps/mipro/task_app.py +933 -0
  90. synth_ai/cli/demo_apps/mipro/train_cfg.toml +92 -0
  91. synth_ai/cli/demos/__init__.py +12 -0
  92. synth_ai/cli/demos/demo.py +32 -0
  93. synth_ai/cli/demos/rl_demo.py +254 -0
  94. synth_ai/cli/deploy.py +216 -0
  95. synth_ai/cli/infra/__init__.py +14 -0
  96. synth_ai/cli/infra/balance.py +216 -0
  97. synth_ai/cli/infra/mcp.py +35 -0
  98. synth_ai/cli/infra/modal_app.py +36 -0
  99. synth_ai/cli/infra/setup.py +69 -0
  100. synth_ai/cli/infra/status.py +16 -0
  101. synth_ai/cli/infra/turso.py +77 -0
  102. synth_ai/cli/lib/__init__.py +10 -0
  103. synth_ai/cli/lib/agents.py +76 -0
  104. synth_ai/cli/lib/apps/modal_app.py +101 -0
  105. synth_ai/cli/lib/apps/task_app.py +643 -0
  106. synth_ai/cli/lib/bin.py +39 -0
  107. synth_ai/cli/lib/env.py +375 -0
  108. synth_ai/cli/lib/errors.py +85 -0
  109. synth_ai/cli/lib/modal.py +315 -0
  110. synth_ai/cli/lib/plotting.py +126 -0
  111. synth_ai/cli/lib/prompt_args.py +39 -0
  112. synth_ai/cli/lib/prompts.py +284 -0
  113. synth_ai/cli/lib/sqld.py +122 -0
  114. synth_ai/cli/lib/task_app_discovery.py +884 -0
  115. synth_ai/cli/lib/task_app_env.py +295 -0
  116. synth_ai/cli/lib/train_cfgs.py +300 -0
  117. synth_ai/cli/lib/tunnel_records.py +207 -0
  118. synth_ai/cli/local/__init__.py +14 -0
  119. synth_ai/cli/local/experiment_queue/__init__.py +72 -0
  120. synth_ai/cli/local/experiment_queue/api_schemas.py +221 -0
  121. synth_ai/cli/local/experiment_queue/celery_app.py +208 -0
  122. synth_ai/cli/local/experiment_queue/config.py +128 -0
  123. synth_ai/cli/local/experiment_queue/config_utils.py +272 -0
  124. synth_ai/cli/local/experiment_queue/database.py +175 -0
  125. synth_ai/cli/local/experiment_queue/dispatcher.py +119 -0
  126. synth_ai/cli/local/experiment_queue/models.py +231 -0
  127. synth_ai/cli/local/experiment_queue/progress_info.py +160 -0
  128. synth_ai/cli/local/experiment_queue/results.py +373 -0
  129. synth_ai/cli/local/experiment_queue/schemas.py +131 -0
  130. synth_ai/cli/local/experiment_queue/service.py +344 -0
  131. synth_ai/cli/local/experiment_queue/status.py +372 -0
  132. synth_ai/cli/local/experiment_queue/status_tracker.py +360 -0
  133. synth_ai/cli/local/experiment_queue/tasks.py +1984 -0
  134. synth_ai/cli/local/experiment_queue/trace_storage.py +65 -0
  135. synth_ai/cli/local/experiment_queue/validation.py +157 -0
  136. synth_ai/cli/local/session/__init__.py +92 -0
  137. synth_ai/cli/local/session/client.py +383 -0
  138. synth_ai/cli/local/session/constants.py +63 -0
  139. synth_ai/cli/local/session/exceptions.py +105 -0
  140. synth_ai/cli/local/session/manager.py +139 -0
  141. synth_ai/cli/local/session/models.py +89 -0
  142. synth_ai/cli/local/session/query.py +110 -0
  143. synth_ai/cli/root.py +30 -6
  144. synth_ai/cli/task_apps/__init__.py +26 -0
  145. synth_ai/cli/task_apps/commands.py +3153 -0
  146. synth_ai/cli/task_apps/deploy.py +7 -0
  147. synth_ai/cli/task_apps/list.py +26 -0
  148. synth_ai/cli/task_apps/main.py +36 -0
  149. synth_ai/cli/task_apps/modal_serve.py +11 -0
  150. synth_ai/cli/task_apps/serve.py +11 -0
  151. synth_ai/cli/training/__init__.py +8 -0
  152. synth_ai/cli/training/train.py +5 -0
  153. synth_ai/cli/training/train_cfg.py +34 -0
  154. synth_ai/cli/training/watch.py +506 -0
  155. synth_ai/cli/turso.py +34 -55
  156. synth_ai/cli/usage.py +159 -0
  157. synth_ai/cli/utils/__init__.py +8 -0
  158. synth_ai/cli/utils/experiments.py +235 -0
  159. synth_ai/cli/utils/queue.py +504 -0
  160. synth_ai/cli/utils/recent.py +133 -0
  161. synth_ai/cli/utils/traces.py +164 -0
  162. synth_ai/contracts/__init__.py +67 -0
  163. synth_ai/core/__init__.py +100 -0
  164. synth_ai/core/_utils/__init__.py +54 -0
  165. synth_ai/core/_utils/base_url.py +10 -0
  166. synth_ai/core/_utils/http.py +10 -0
  167. synth_ai/core/_utils/prompts.py +14 -0
  168. synth_ai/core/_utils/task_app_state.py +12 -0
  169. synth_ai/core/_utils/user_config.py +10 -0
  170. synth_ai/core/apps/common.py +116 -0
  171. synth_ai/core/auth.py +95 -0
  172. synth_ai/core/cfgs.py +240 -0
  173. synth_ai/core/config/__init__.py +16 -0
  174. synth_ai/core/config/base.py +168 -0
  175. synth_ai/core/config/resolver.py +89 -0
  176. synth_ai/core/env.py +220 -0
  177. synth_ai/core/errors.py +126 -0
  178. synth_ai/core/http.py +230 -0
  179. synth_ai/core/integrations/__init__.py +11 -0
  180. synth_ai/core/integrations/cloudflare.py +1710 -0
  181. synth_ai/core/integrations/mcp/__init__.py +6 -0
  182. synth_ai/core/integrations/mcp/__main__.py +8 -0
  183. synth_ai/core/integrations/mcp/claude.py +36 -0
  184. synth_ai/core/integrations/mcp/main.py +254 -0
  185. synth_ai/core/integrations/mcp/setup.py +100 -0
  186. synth_ai/core/integrations/modal.py +277 -0
  187. synth_ai/core/json.py +72 -0
  188. synth_ai/core/log_filter.py +99 -0
  189. synth_ai/core/logging.py +82 -0
  190. synth_ai/core/paths.py +107 -0
  191. synth_ai/core/pricing.py +109 -0
  192. synth_ai/core/process.py +233 -0
  193. synth_ai/core/ssl.py +25 -0
  194. synth_ai/core/storage/__init__.py +71 -0
  195. synth_ai/core/task_app_state.py +318 -0
  196. synth_ai/core/telemetry.py +282 -0
  197. synth_ai/core/tracing_v3/__init__.py +99 -0
  198. synth_ai/core/tracing_v3/abstractions.py +302 -0
  199. synth_ai/core/tracing_v3/config.py +229 -0
  200. synth_ai/core/tracing_v3/constants.py +21 -0
  201. synth_ai/core/tracing_v3/db_config.py +182 -0
  202. synth_ai/core/tracing_v3/decorators.py +401 -0
  203. synth_ai/core/tracing_v3/llm_call_record_helpers.py +437 -0
  204. synth_ai/core/tracing_v3/migration_helper.py +119 -0
  205. synth_ai/core/tracing_v3/session_tracer.py +542 -0
  206. synth_ai/core/tracing_v3/storage/base.py +211 -0
  207. synth_ai/core/tracing_v3/storage/config.py +109 -0
  208. synth_ai/core/tracing_v3/storage/factory.py +39 -0
  209. synth_ai/core/tracing_v3/trace_utils.py +326 -0
  210. synth_ai/core/tracing_v3/turso/daemon.py +278 -0
  211. synth_ai/core/tracing_v3/turso/models.py +470 -0
  212. synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
  213. synth_ai/core/tracing_v3/utils.py +108 -0
  214. synth_ai/core/urls.py +18 -0
  215. synth_ai/core/user_config.py +137 -0
  216. synth_ai/core/uvicorn.py +222 -0
  217. synth_ai/data/__init__.py +110 -0
  218. synth_ai/data/enums.py +141 -0
  219. synth_ai/data/rewards.py +152 -0
  220. synth_ai/data/specs.py +36 -0
  221. synth_ai/data/traces.py +35 -0
  222. synth_ai/products/__init__.py +6 -0
  223. synth_ai/products/graph_evolve/__init__.py +46 -0
  224. synth_ai/products/graph_evolve/client.py +226 -0
  225. synth_ai/products/graph_evolve/config.py +591 -0
  226. synth_ai/products/graph_evolve/converters/__init__.py +42 -0
  227. synth_ai/products/graph_evolve/converters/openai_sft.py +484 -0
  228. synth_ai/products/graph_evolve/examples/hotpotqa/config.toml +109 -0
  229. synth_ai/products/graph_evolve/run.py +222 -0
  230. synth_ai/sdk/__init__.py +119 -0
  231. synth_ai/sdk/api/__init__.py +1 -0
  232. synth_ai/sdk/api/models/supported.py +514 -0
  233. synth_ai/sdk/api/research_agent/__init__.py +86 -0
  234. synth_ai/sdk/api/research_agent/cli.py +428 -0
  235. synth_ai/sdk/api/research_agent/config.py +357 -0
  236. synth_ai/sdk/api/research_agent/job.py +717 -0
  237. synth_ai/sdk/api/train/__init__.py +85 -0
  238. synth_ai/sdk/api/train/builders.py +895 -0
  239. synth_ai/sdk/api/train/cli.py +2188 -0
  240. synth_ai/sdk/api/train/config_finder.py +267 -0
  241. synth_ai/sdk/api/train/configs/__init__.py +65 -0
  242. synth_ai/sdk/api/train/configs/prompt_learning.py +1706 -0
  243. synth_ai/sdk/api/train/configs/rl.py +188 -0
  244. synth_ai/sdk/api/train/configs/sft.py +99 -0
  245. synth_ai/sdk/api/train/configs/shared.py +81 -0
  246. synth_ai/sdk/api/train/context_learning.py +312 -0
  247. synth_ai/sdk/api/train/env_resolver.py +418 -0
  248. synth_ai/sdk/api/train/graph_validators.py +216 -0
  249. synth_ai/sdk/api/train/graphgen.py +984 -0
  250. synth_ai/sdk/api/train/graphgen_models.py +823 -0
  251. synth_ai/sdk/api/train/graphgen_validators.py +109 -0
  252. synth_ai/sdk/api/train/pollers.py +124 -0
  253. synth_ai/sdk/api/train/progress/__init__.py +97 -0
  254. synth_ai/sdk/api/train/progress/dataclasses.py +569 -0
  255. synth_ai/sdk/api/train/progress/events.py +326 -0
  256. synth_ai/sdk/api/train/progress/results.py +428 -0
  257. synth_ai/sdk/api/train/progress/tracker.py +641 -0
  258. synth_ai/sdk/api/train/prompt_learning.py +470 -0
  259. synth_ai/sdk/api/train/rl.py +442 -0
  260. synth_ai/sdk/api/train/sft.py +396 -0
  261. synth_ai/sdk/api/train/summary.py +522 -0
  262. synth_ai/sdk/api/train/supported_algos.py +147 -0
  263. synth_ai/sdk/api/train/task_app.py +331 -0
  264. synth_ai/sdk/api/train/utils.py +279 -0
  265. synth_ai/sdk/api/train/validators.py +2424 -0
  266. synth_ai/sdk/baseline/__init__.py +25 -0
  267. synth_ai/sdk/baseline/config.py +209 -0
  268. synth_ai/sdk/baseline/discovery.py +216 -0
  269. synth_ai/sdk/baseline/execution.py +154 -0
  270. synth_ai/sdk/graphs/__init__.py +15 -0
  271. synth_ai/sdk/graphs/completions.py +570 -0
  272. synth_ai/sdk/inference/__init__.py +6 -0
  273. synth_ai/sdk/inference/client.py +128 -0
  274. synth_ai/sdk/jobs/__init__.py +16 -0
  275. synth_ai/sdk/jobs/client.py +371 -0
  276. synth_ai/sdk/judging/__init__.py +15 -0
  277. synth_ai/sdk/judging/base.py +24 -0
  278. synth_ai/sdk/judging/client.py +191 -0
  279. synth_ai/sdk/judging/schemas.py +222 -0
  280. synth_ai/sdk/learning/__init__.py +69 -0
  281. synth_ai/sdk/learning/client.py +240 -0
  282. synth_ai/sdk/learning/ft_client.py +7 -0
  283. synth_ai/sdk/learning/health.py +49 -0
  284. synth_ai/sdk/learning/jobs.py +202 -0
  285. synth_ai/sdk/learning/prompt_extraction.py +334 -0
  286. synth_ai/sdk/learning/prompt_learning_client.py +455 -0
  287. synth_ai/sdk/learning/prompt_learning_types.py +185 -0
  288. synth_ai/sdk/learning/rl/client.py +268 -0
  289. synth_ai/sdk/learning/rl/contracts.py +27 -0
  290. synth_ai/sdk/learning/rl/env_keys.py +166 -0
  291. synth_ai/sdk/learning/rl/secrets.py +13 -0
  292. synth_ai/sdk/learning/sft/client.py +95 -0
  293. synth_ai/sdk/learning/sft/config.py +270 -0
  294. synth_ai/sdk/learning/sft/data.py +698 -0
  295. synth_ai/sdk/learning/validators.py +52 -0
  296. synth_ai/sdk/research_agent/__init__.py +34 -0
  297. synth_ai/sdk/research_agent/container_builder.py +328 -0
  298. synth_ai/sdk/research_agent/container_spec.py +198 -0
  299. synth_ai/sdk/research_agent/defaults.py +34 -0
  300. synth_ai/sdk/research_agent/results_collector.py +69 -0
  301. synth_ai/sdk/specs/__init__.py +46 -0
  302. synth_ai/sdk/specs/dataclasses.py +149 -0
  303. synth_ai/sdk/specs/loader.py +144 -0
  304. synth_ai/sdk/specs/serializer.py +199 -0
  305. synth_ai/sdk/specs/validation.py +250 -0
  306. synth_ai/sdk/streaming/__init__.py +35 -0
  307. synth_ai/sdk/streaming/config.py +94 -0
  308. synth_ai/sdk/streaming/handlers.py +1997 -0
  309. synth_ai/sdk/streaming/streamer.py +704 -0
  310. synth_ai/sdk/streaming/types.py +112 -0
  311. synth_ai/sdk/task/__init__.py +151 -0
  312. synth_ai/sdk/task/apps/__init__.py +133 -0
  313. synth_ai/sdk/task/config.py +261 -0
  314. synth_ai/sdk/task/contracts.py +298 -0
  315. synth_ai/sdk/task/datasets.py +108 -0
  316. synth_ai/sdk/task/in_process.py +1190 -0
  317. synth_ai/sdk/task/in_process_runner.py +309 -0
  318. synth_ai/sdk/task/inference_api.py +299 -0
  319. synth_ai/sdk/task/proxy.py +287 -0
  320. synth_ai/sdk/task/rubrics/__init__.py +55 -0
  321. synth_ai/sdk/task/rubrics/loaders.py +156 -0
  322. synth_ai/sdk/task/rubrics.py +219 -0
  323. synth_ai/sdk/task/server.py +580 -0
  324. synth_ai/sdk/task/trace_correlation_helpers.py +506 -0
  325. synth_ai/sdk/task/tracing_utils.py +95 -0
  326. synth_ai/sdk/task/validators.py +456 -0
  327. synth_ai/sdk/tracing/__init__.py +39 -0
  328. synth_ai/sdk/training/__init__.py +102 -0
  329. synth_ai/sdk/usage/__init__.py +37 -0
  330. synth_ai/sdk/usage/client.py +171 -0
  331. synth_ai/sdk/usage/models.py +261 -0
  332. synth_ai/utils/__init__.py +213 -0
  333. synth_ai-0.4.1.dist-info/METADATA +195 -0
  334. synth_ai-0.4.1.dist-info/RECORD +379 -0
  335. synth_ai-0.4.1.dist-info/top_level.txt +1 -0
  336. examples/__init__.py +0 -16
  337. examples/analyze_semantic_words.sh +0 -17
  338. examples/crafter_debug_render.py +0 -186
  339. examples/dev/qwen3_32b_qlora_4xh100.toml +0 -40
  340. examples/multi_step/configs/README_verilog_rl.md +0 -77
  341. examples/multi_step/configs/VERILOG_REWARDS.md +0 -90
  342. examples/multi_step/configs/VERILOG_RL_CHECKLIST.md +0 -183
  343. examples/multi_step/configs/crafter_eval_synth_qwen4b.toml +0 -35
  344. examples/multi_step/configs/crafter_eval_text_only_groq_qwen32b.toml +0 -36
  345. examples/multi_step/configs/crafter_rl_outcome.toml +0 -74
  346. examples/multi_step/configs/crafter_rl_stepwise_hosted_judge.toml +0 -187
  347. examples/multi_step/configs/crafter_rl_stepwise_shaped.toml +0 -83
  348. examples/multi_step/configs/crafter_rl_stepwise_simple.toml +0 -78
  349. examples/multi_step/configs/crafter_synth_backend.md +0 -40
  350. examples/multi_step/configs/verilog_eval_groq_qwen32b.toml +0 -31
  351. examples/multi_step/configs/verilog_eval_synth_qwen8b.toml +0 -33
  352. examples/multi_step/configs/verilog_rl_lora.toml +0 -190
  353. examples/multi_step/crafter_rl_lora.md +0 -70
  354. examples/multi_step/judges/crafter_backend_judge.py +0 -220
  355. examples/multi_step/judges/verilog_backend_judge.py +0 -234
  356. examples/multi_step/readme.md +0 -48
  357. examples/multi_step/sse_metrics_streaming_notes.md +0 -357
  358. examples/multi_step/task_app_config_notes.md +0 -494
  359. examples/multi_step/verilog_rl_lora.md +0 -218
  360. examples/qwen_coder/README.md +0 -102
  361. examples/qwen_coder/_shared.py +0 -113
  362. examples/qwen_coder/configs/coder_lora_30b.toml +0 -61
  363. examples/qwen_coder/configs/coder_lora_4b.toml +0 -57
  364. examples/qwen_coder/configs/coder_lora_small.toml +0 -58
  365. examples/qwen_coder/generate_dataset.py +0 -98
  366. examples/qwen_coder/infer_ft_smoke.py +0 -65
  367. examples/qwen_coder/infer_prod_proxy.py +0 -73
  368. examples/qwen_coder/infer_via_synth.py +0 -87
  369. examples/qwen_coder/scripts/infer_coder.sh +0 -19
  370. examples/qwen_coder/scripts/train_coder_30b.sh +0 -22
  371. examples/qwen_coder/sft_full_17b.py +0 -103
  372. examples/qwen_coder/sft_lora_30b.py +0 -110
  373. examples/qwen_coder/subset_jsonl.py +0 -39
  374. examples/qwen_coder/todos.md +0 -38
  375. examples/qwen_coder/validate_jsonl.py +0 -60
  376. examples/rl/README.md +0 -169
  377. examples/rl/download_dataset.py +0 -80
  378. examples/run_crafter_demo.sh +0 -10
  379. examples/sft/README.md +0 -139
  380. examples/sft/configs/crafter_fft_qwen0p6b.toml +0 -44
  381. examples/sft/configs/crafter_lora_qwen0p6b.toml +0 -45
  382. examples/sft/evaluate.py +0 -119
  383. examples/sft/export_dataset.py +0 -117
  384. examples/sft/generate_traces.py +0 -164
  385. examples/swe/__init__.py +0 -12
  386. examples/swe/task_app/README.md +0 -105
  387. examples/swe/task_app/__init__.py +0 -2
  388. examples/swe/task_app/grpo_swe_mini.py +0 -601
  389. examples/swe/task_app/grpo_swe_mini_task_app.py +0 -136
  390. examples/swe/task_app/hosted/README.md +0 -173
  391. examples/swe/task_app/hosted/__init__.py +0 -5
  392. examples/swe/task_app/hosted/branching.py +0 -143
  393. examples/swe/task_app/hosted/environment_routes.py +0 -1289
  394. examples/swe/task_app/hosted/envs/__init__.py +0 -1
  395. examples/swe/task_app/hosted/envs/crafter/__init__.py +0 -6
  396. examples/swe/task_app/hosted/envs/crafter/app.py +0 -1
  397. examples/swe/task_app/hosted/envs/crafter/environment.py +0 -522
  398. examples/swe/task_app/hosted/envs/crafter/policy.py +0 -478
  399. examples/swe/task_app/hosted/envs/crafter/react_agent.py +0 -108
  400. examples/swe/task_app/hosted/envs/crafter/shared.py +0 -305
  401. examples/swe/task_app/hosted/envs/crafter/tools.py +0 -47
  402. examples/swe/task_app/hosted/envs/mini_swe/__init__.py +0 -8
  403. examples/swe/task_app/hosted/envs/mini_swe/environment.py +0 -1164
  404. examples/swe/task_app/hosted/envs/mini_swe/policy.py +0 -355
  405. examples/swe/task_app/hosted/envs/mini_swe/shared.py +0 -83
  406. examples/swe/task_app/hosted/envs/mini_swe/tools.py +0 -96
  407. examples/swe/task_app/hosted/hosted_app.py +0 -204
  408. examples/swe/task_app/hosted/inference/__init__.py +0 -5
  409. examples/swe/task_app/hosted/inference/openai_client.py +0 -618
  410. examples/swe/task_app/hosted/main.py +0 -100
  411. examples/swe/task_app/hosted/policy_routes.py +0 -1079
  412. examples/swe/task_app/hosted/registry.py +0 -195
  413. examples/swe/task_app/hosted/rollout.py +0 -1911
  414. examples/swe/task_app/hosted/storage/__init__.py +0 -5
  415. examples/swe/task_app/hosted/storage/volume.py +0 -211
  416. examples/swe/task_app/hosted/test_agents.py +0 -161
  417. examples/swe/task_app/hosted/test_service.py +0 -136
  418. examples/swe/task_app/hosted/utils.py +0 -62
  419. examples/task_apps/IMAGE_ONLY_EVAL_QUICKSTART.md +0 -258
  420. examples/task_apps/TESTING.md +0 -275
  421. examples/task_apps/crafter/CREATE_SFT_DATASET.md +0 -273
  422. examples/task_apps/crafter/EVAL_IMAGE_ONLY_RESULTS.md +0 -152
  423. examples/task_apps/crafter/FILTER_COMMAND_STATUS.md +0 -174
  424. examples/task_apps/crafter/FILTER_COMMAND_SUCCESS.md +0 -268
  425. examples/task_apps/crafter/QUERY_EXAMPLES.md +0 -203
  426. examples/task_apps/crafter/README_IMAGE_ONLY_EVAL.md +0 -316
  427. examples/task_apps/crafter/__init__.py +0 -0
  428. examples/task_apps/crafter/eval_image_only_gpt4o.toml +0 -28
  429. examples/task_apps/crafter/eval_text_only_groq_llama.toml +0 -36
  430. examples/task_apps/crafter/filter_sft_dataset.toml +0 -16
  431. examples/task_apps/crafter/task_app/README.md +0 -42
  432. examples/task_apps/crafter/task_app/__init__.py +0 -5
  433. examples/task_apps/crafter/task_app/grpo_crafter.py +0 -973
  434. examples/task_apps/crafter/task_app/grpo_crafter_task_app.py +0 -146
  435. examples/task_apps/crafter/task_app/synth_envs_hosted/README.md +0 -173
  436. examples/task_apps/crafter/task_app/synth_envs_hosted/__init__.py +0 -5
  437. examples/task_apps/crafter/task_app/synth_envs_hosted/branching.py +0 -143
  438. examples/task_apps/crafter/task_app/synth_envs_hosted/environment_routes.py +0 -1226
  439. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/__init__.py +0 -1
  440. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/__init__.py +0 -6
  441. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/app.py +0 -1
  442. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/environment.py +0 -532
  443. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/policy.py +0 -547
  444. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/react_agent.py +0 -123
  445. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/shared.py +0 -305
  446. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/tools.py +0 -47
  447. examples/task_apps/crafter/task_app/synth_envs_hosted/hosted_app.py +0 -204
  448. examples/task_apps/crafter/task_app/synth_envs_hosted/inference/__init__.py +0 -5
  449. examples/task_apps/crafter/task_app/synth_envs_hosted/inference/openai_client.py +0 -704
  450. examples/task_apps/crafter/task_app/synth_envs_hosted/main.py +0 -100
  451. examples/task_apps/crafter/task_app/synth_envs_hosted/policy_routes.py +0 -1152
  452. examples/task_apps/crafter/task_app/synth_envs_hosted/registry.py +0 -195
  453. examples/task_apps/crafter/task_app/synth_envs_hosted/rollout.py +0 -2160
  454. examples/task_apps/crafter/task_app/synth_envs_hosted/storage/__init__.py +0 -5
  455. examples/task_apps/crafter/task_app/synth_envs_hosted/storage/volume.py +0 -211
  456. examples/task_apps/crafter/task_app/synth_envs_hosted/test_agents.py +0 -161
  457. examples/task_apps/crafter/task_app/synth_envs_hosted/test_service.py +0 -136
  458. examples/task_apps/crafter/task_app/synth_envs_hosted/utils.py +0 -218
  459. examples/task_apps/dev/pokemon_emerald/__init__.py +0 -2
  460. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/README.md +0 -811
  461. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/__init__.py +0 -120
  462. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/action.py +0 -160
  463. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/memory.py +0 -155
  464. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/perception.py +0 -69
  465. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/planning.py +0 -96
  466. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/simple.py +0 -1502
  467. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/system_prompt.py +0 -4
  468. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/grab_map.py +0 -68
  469. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/manual.py +0 -216
  470. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/__init__.py +0 -35
  471. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/emerald_utils.py +0 -631
  472. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/emulator.py +0 -1544
  473. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/enums.py +0 -1428
  474. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/memory_reader.py +0 -4848
  475. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/types.py +0 -41
  476. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/utils.py +0 -298
  477. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pyproject.toml +0 -95
  478. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/run.py +0 -204
  479. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/__init__.py +0 -0
  480. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/app.py +0 -2152
  481. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/client.py +0 -429
  482. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/frame_server.py +0 -155
  483. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/README.md +0 -78
  484. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/__init__.py +0 -0
  485. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/run_tests.py +0 -122
  486. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_agent_direct.py +0 -76
  487. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_agent_prompts.py +0 -413
  488. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_battle_state_formatting.py +0 -204
  489. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_dialogue_detection.py +0 -133
  490. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_dialogue_detection_comprehensive.py +0 -229
  491. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_direct_agent_emulator.py +0 -300
  492. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_fps_adjustment_pytest.py +0 -205
  493. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_house_to_outside_direct.py +0 -200
  494. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_house_to_outside_transition.py +0 -284
  495. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_map_ground_truth_comparison.py +0 -468
  496. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_memory_map.py +0 -575
  497. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_server_map_validation.py +0 -311
  498. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_torchic_state.py +0 -259
  499. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/__init__.py +0 -0
  500. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/anticheat.py +0 -372
  501. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/checkpoint.py +0 -296
  502. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/error_handler.py +0 -275
  503. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/get_local_ip.py +0 -22
  504. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/helpers.py +0 -44
  505. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/llm_logger.py +0 -514
  506. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_formatter.py +0 -415
  507. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_stitcher.py +0 -1763
  508. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_stitcher_singleton.py +0 -33
  509. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_trimmer.py +0 -106
  510. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_visualizer.py +0 -334
  511. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/ocr_dialogue.py +0 -1020
  512. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/recording.py +0 -188
  513. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/state_formatter.py +0 -1481
  514. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/vlm.py +0 -862
  515. examples/task_apps/dev/pokemon_emerald/modal_app.py +0 -114
  516. examples/task_apps/dev/pokemon_emerald/task_app/README.md +0 -81
  517. examples/task_apps/dev/pokemon_emerald/task_app/__init__.py +0 -6
  518. examples/task_apps/dev/pokemon_emerald/task_app/pokemon_emerald.py +0 -685
  519. examples/task_apps/enron/__init__.py +0 -1
  520. examples/task_apps/enron/eval_groq_qwen32.toml +0 -16
  521. examples/task_apps/enron/filter_sft.toml +0 -5
  522. examples/task_apps/enron/task_app/README.md +0 -14
  523. examples/task_apps/enron/task_app/__init__.py +0 -1
  524. examples/task_apps/enron/task_app/grpo_enron.py +0 -906
  525. examples/task_apps/enron/task_app/grpo_enron_task_app.py +0 -146
  526. examples/task_apps/enron/tests/__init__.py +0 -4
  527. examples/task_apps/enron/tests/conftest.py +0 -115
  528. examples/task_apps/enron/tests/integration/__init__.py +0 -4
  529. examples/task_apps/enron/tests/integration/test_enron_eval.py +0 -179
  530. examples/task_apps/enron/tests/integration/test_enron_rollout.py +0 -135
  531. examples/task_apps/enron/tests/unit/__init__.py +0 -4
  532. examples/task_apps/enron/tests/unit/test_enron_environment.py +0 -126
  533. examples/task_apps/math/README.md +0 -22
  534. examples/task_apps/math/__init__.py +0 -0
  535. examples/task_apps/math/math_single_step.py +0 -1000
  536. examples/task_apps/math/math_task_app.py +0 -115
  537. examples/task_apps/pokemon_battle/__init__.py +0 -2
  538. examples/task_apps/pokemon_battle/modal_app.py +0 -104
  539. examples/task_apps/pokemon_battle/task_app/README.md +0 -68
  540. examples/task_apps/pokemon_battle/task_app/__init__.py +0 -6
  541. examples/task_apps/pokemon_battle/task_app/pokemon_showdown.py +0 -932
  542. examples/task_apps/pokemon_red/EVAL_IMAGE_ONLY_COMPLETE.md +0 -283
  543. examples/task_apps/pokemon_red/EVAL_IMAGE_ONLY_STATUS.md +0 -155
  544. examples/task_apps/pokemon_red/README.md +0 -357
  545. examples/task_apps/pokemon_red/README_IMAGE_ONLY_EVAL.md +0 -415
  546. examples/task_apps/pokemon_red/__init__.py +0 -3
  547. examples/task_apps/pokemon_red/eval_image_only_gpt4o.toml +0 -29
  548. examples/task_apps/pokemon_red/eval_pokemon_red_policy.py +0 -225
  549. examples/task_apps/pokemon_red/pallet_town_rl_config.toml +0 -75
  550. examples/task_apps/pokemon_red/task_app.py +0 -799
  551. examples/task_apps/pokemon_red/test_pallet_town_rewards.py +0 -193
  552. examples/task_apps/sokoban/README.md +0 -307
  553. examples/task_apps/sokoban/__init__.py +0 -3
  554. examples/task_apps/sokoban/eval_groq_qwen32.toml +0 -16
  555. examples/task_apps/sokoban/eval_openai_gpt5.toml +0 -16
  556. examples/task_apps/sokoban/filter_sft.toml +0 -5
  557. examples/task_apps/sokoban/task_app.py +0 -1058
  558. examples/task_apps/sokoban/tests/__init__.py +0 -4
  559. examples/task_apps/sokoban/tests/conftest.py +0 -113
  560. examples/task_apps/sokoban/tests/integration/__init__.py +0 -4
  561. examples/task_apps/sokoban/tests/integration/test_sokoban_eval.py +0 -57
  562. examples/task_apps/sokoban/tests/integration/test_sokoban_rollout.py +0 -198
  563. examples/task_apps/sokoban/tests/unit/__init__.py +0 -4
  564. examples/task_apps/sokoban/tests/unit/test_sokoban_environment.py +0 -114
  565. examples/task_apps/verilog/__init__.py +0 -1
  566. examples/task_apps/verilog/eval_groq_qwen32b.toml +0 -24
  567. examples/task_apps/verilog/filter_sft.toml +0 -5
  568. examples/task_apps/verilog/task_app/README.md +0 -12
  569. examples/task_apps/verilog/task_app/__init__.py +0 -1
  570. examples/task_apps/verilog/task_app/grpo_verilog.py +0 -1166
  571. examples/task_apps/verilog/task_app/grpo_verilog_task_app.py +0 -145
  572. examples/task_apps/verilog/tests/__init__.py +0 -4
  573. examples/task_apps/verilog/tests/conftest.py +0 -115
  574. examples/task_apps/verilog/tests/integration/__init__.py +0 -4
  575. examples/task_apps/verilog/tests/integration/test_verilog_eval.py +0 -181
  576. examples/task_apps/verilog/tests/integration/test_verilog_rollout.py +0 -55
  577. examples/task_apps/verilog/tests/unit/__init__.py +0 -4
  578. examples/task_apps/verilog/tests/unit/test_verilog_scoring.py +0 -118
  579. examples/vlm/PROPOSAL.md +0 -53
  580. examples/vlm/README.md +0 -68
  581. examples/vlm/configs/crafter_vlm_gpt4o.toml +0 -44
  582. examples/vlm/crafter_image_only_agent.py +0 -207
  583. examples/vlm/crafter_openai_vlm_agent.py +0 -277
  584. examples/vlm/filter_image_rows.py +0 -63
  585. examples/vlm/run_crafter_vlm_benchmark.py +0 -316
  586. examples/warming_up_to_rl/analyze_trace_db.py +0 -422
  587. examples/warming_up_to_rl/configs/crafter_fft.toml +0 -48
  588. examples/warming_up_to_rl/configs/crafter_fft_4b.toml +0 -54
  589. examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml +0 -20
  590. examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml +0 -13
  591. examples/warming_up_to_rl/configs/eval_modal_qwen4b.toml +0 -23
  592. examples/warming_up_to_rl/configs/eval_stepwise_complex.toml +0 -35
  593. examples/warming_up_to_rl/configs/eval_stepwise_consistent.toml +0 -26
  594. examples/warming_up_to_rl/configs/eval_stepwise_per_achievement.toml +0 -36
  595. examples/warming_up_to_rl/configs/eval_stepwise_simple.toml +0 -32
  596. examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +0 -83
  597. examples/warming_up_to_rl/configs/rl_from_ft.toml +0 -56
  598. examples/warming_up_to_rl/export_trace_sft.py +0 -723
  599. examples/warming_up_to_rl/groq_test.py +0 -97
  600. examples/warming_up_to_rl/manage_secrets.py +0 -131
  601. examples/warming_up_to_rl/old/event_rewards.md +0 -234
  602. examples/warming_up_to_rl/old/notes.md +0 -73
  603. examples/warming_up_to_rl/readme.md +0 -179
  604. examples/warming_up_to_rl/run_eval.py +0 -736
  605. examples/warming_up_to_rl/run_fft_and_save.py +0 -380
  606. examples/warming_up_to_rl/run_local_rollout.py +0 -239
  607. examples/warming_up_to_rl/run_local_rollout_modal.py +0 -248
  608. examples/warming_up_to_rl/run_local_rollout_parallel.py +0 -405
  609. examples/warming_up_to_rl/run_local_rollout_traced.py +0 -477
  610. examples/warming_up_to_rl/run_rl_and_save.py +0 -124
  611. examples/warming_up_to_rl/run_rollout_remote.py +0 -156
  612. examples/workflows/__init__.py +0 -0
  613. examples/workflows/math_rl/__init__.py +0 -0
  614. examples/workflows/math_rl/configs/eval_base_qwen.toml +0 -15
  615. examples/workflows/math_rl/configs/eval_rl_qwen.toml +0 -11
  616. examples/workflows/math_rl/configs/rl_from_base_qwen.toml +0 -35
  617. examples/workflows/math_rl/configs/rl_from_base_qwen17.toml +0 -74
  618. examples/workflows/math_rl/configs/rl_from_ft_qwen.toml +0 -35
  619. examples/workflows/math_rl/download_dataset.py +0 -80
  620. examples/workflows/math_rl/run_eval.py +0 -436
  621. examples/workflows/math_rl/run_rl_and_save.py +0 -111
  622. synth_ai/api/models/supported.py +0 -377
  623. synth_ai/api/train/__init__.py +0 -5
  624. synth_ai/api/train/builders.py +0 -351
  625. synth_ai/api/train/cli.py +0 -635
  626. synth_ai/api/train/config_finder.py +0 -228
  627. synth_ai/api/train/configs/__init__.py +0 -44
  628. synth_ai/api/train/configs/rl.py +0 -134
  629. synth_ai/api/train/configs/sft.py +0 -95
  630. synth_ai/api/train/configs/shared.py +0 -24
  631. synth_ai/api/train/env_resolver.py +0 -349
  632. synth_ai/api/train/pollers.py +0 -75
  633. synth_ai/api/train/supported_algos.py +0 -147
  634. synth_ai/api/train/task_app.py +0 -195
  635. synth_ai/api/train/utils.py +0 -225
  636. synth_ai/cli/_modal_wrapper.py +0 -29
  637. synth_ai/cli/_storage.py +0 -20
  638. synth_ai/cli/_typer_patch.py +0 -49
  639. synth_ai/cli/_validate_task_app.py +0 -11
  640. synth_ai/cli/balance.py +0 -216
  641. synth_ai/cli/calc.py +0 -84
  642. synth_ai/cli/demo.py +0 -165
  643. synth_ai/cli/legacy_root_backup.py +0 -468
  644. synth_ai/cli/man.py +0 -106
  645. synth_ai/cli/recent.py +0 -132
  646. synth_ai/cli/rl_demo.py +0 -254
  647. synth_ai/cli/status.py +0 -134
  648. synth_ai/cli/task_apps.py +0 -4523
  649. synth_ai/cli/traces.py +0 -164
  650. synth_ai/cli/tui.py +0 -57
  651. synth_ai/cli/watch.py +0 -506
  652. synth_ai/compound/cais.py +0 -0
  653. synth_ai/config/base_url.py +0 -107
  654. synth_ai/core/experiment.py +0 -13
  655. synth_ai/core/system.py +0 -15
  656. synth_ai/demo_registry.py +0 -295
  657. synth_ai/demos/core/__init__.py +0 -1
  658. synth_ai/demos/core/cli.py +0 -1718
  659. synth_ai/demos/demo_task_apps/core.py +0 -440
  660. synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +0 -184
  661. synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
  662. synth_ai/demos/demo_task_apps/math/modal_task_app.py +0 -739
  663. synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -37
  664. synth_ai/environments/__init__.py +0 -31
  665. synth_ai/environments/environment/__init__.py +0 -1
  666. synth_ai/environments/environment/artifacts/__init__.py +0 -1
  667. synth_ai/environments/environment/artifacts/base.py +0 -52
  668. synth_ai/environments/environment/core.py +0 -67
  669. synth_ai/environments/environment/db/__init__.py +0 -1
  670. synth_ai/environments/environment/db/sqlite.py +0 -45
  671. synth_ai/environments/environment/registry.py +0 -233
  672. synth_ai/environments/environment/resources/sqlite.py +0 -45
  673. synth_ai/environments/environment/results.py +0 -1
  674. synth_ai/environments/environment/rewards/__init__.py +0 -1
  675. synth_ai/environments/environment/rewards/core.py +0 -29
  676. synth_ai/environments/environment/shared_engine.py +0 -26
  677. synth_ai/environments/environment/tools/__init__.py +0 -200
  678. synth_ai/environments/examples/__init__.py +0 -1
  679. synth_ai/environments/examples/bandit/__init__.py +0 -33
  680. synth_ai/environments/examples/bandit/engine.py +0 -302
  681. synth_ai/environments/examples/bandit/environment.py +0 -194
  682. synth_ai/environments/examples/bandit/taskset.py +0 -200
  683. synth_ai/environments/examples/crafter_classic/__init__.py +0 -8
  684. synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -250
  685. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -59
  686. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -152
  687. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -24
  688. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -1194
  689. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -56
  690. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -32
  691. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -738
  692. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -384
  693. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -53
  694. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -178
  695. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -222
  696. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -183
  697. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -210
  698. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -206
  699. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -49
  700. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -64
  701. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -88
  702. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -77
  703. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -324
  704. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -580
  705. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -362
  706. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -49
  707. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -332
  708. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -97
  709. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -217
  710. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -87
  711. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -88
  712. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -195
  713. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -400
  714. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -195
  715. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -56
  716. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -858
  717. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -52
  718. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -874
  719. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -1412
  720. synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -216
  721. synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -296
  722. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -58
  723. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -464
  724. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -152
  725. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -51
  726. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -1412
  727. synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -112
  728. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -203
  729. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -305
  730. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -126
  731. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -94
  732. synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -142
  733. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -26
  734. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -984
  735. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -724
  736. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -386
  737. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -205
  738. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -150
  739. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -283
  740. synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -280
  741. synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -456
  742. synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -166
  743. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -102
  744. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -128
  745. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -655
  746. synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -202
  747. synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -166
  748. synth_ai/environments/examples/crafter_classic/config_logging.py +0 -111
  749. synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
  750. synth_ai/environments/examples/crafter_classic/engine.py +0 -579
  751. synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -64
  752. synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -6
  753. synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -75
  754. synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -267
  755. synth_ai/environments/examples/crafter_classic/environment.py +0 -495
  756. synth_ai/environments/examples/crafter_classic/taskset.py +0 -233
  757. synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -228
  758. synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -299
  759. synth_ai/environments/examples/crafter_custom/__init__.py +0 -4
  760. synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -1
  761. synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -202
  762. synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -7
  763. synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -182
  764. synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -8
  765. synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -269
  766. synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -262
  767. synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -417
  768. synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -187
  769. synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -118
  770. synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -373
  771. synth_ai/environments/examples/crafter_custom/environment.py +0 -312
  772. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -159
  773. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -158
  774. synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -71
  775. synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -105
  776. synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -119
  777. synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -52
  778. synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -305
  779. synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -156
  780. synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -281
  781. synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -25
  782. synth_ai/environments/examples/enron/engine.py +0 -300
  783. synth_ai/environments/examples/enron/environment.py +0 -234
  784. synth_ai/environments/examples/enron/taskset.py +0 -112
  785. synth_ai/environments/examples/enron/units/keyword_stats.py +0 -112
  786. synth_ai/environments/examples/minigrid/__init__.py +0 -48
  787. synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -1188
  788. synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -48
  789. synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -562
  790. synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -221
  791. synth_ai/environments/examples/minigrid/engine.py +0 -589
  792. synth_ai/environments/examples/minigrid/environment.py +0 -274
  793. synth_ai/environments/examples/minigrid/environment_mapping.py +0 -242
  794. synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -417
  795. synth_ai/environments/examples/minigrid/taskset.py +0 -583
  796. synth_ai/environments/examples/nethack/__init__.py +0 -7
  797. synth_ai/environments/examples/nethack/achievements.py +0 -337
  798. synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -981
  799. synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -74
  800. synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -831
  801. synth_ai/environments/examples/nethack/engine.py +0 -739
  802. synth_ai/environments/examples/nethack/environment.py +0 -256
  803. synth_ai/environments/examples/nethack/helpers/__init__.py +0 -41
  804. synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -301
  805. synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -402
  806. synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -433
  807. synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -200
  808. synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -269
  809. synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -308
  810. synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -431
  811. synth_ai/environments/examples/nethack/taskset.py +0 -323
  812. synth_ai/environments/examples/red/__init__.py +0 -7
  813. synth_ai/environments/examples/red/agent_demos/__init__.py +0 -1
  814. synth_ai/environments/examples/red/config_logging.py +0 -110
  815. synth_ai/environments/examples/red/engine.py +0 -721
  816. synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -1
  817. synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -35
  818. synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -276
  819. synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -142
  820. synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -57
  821. synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -284
  822. synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -150
  823. synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -138
  824. synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -57
  825. synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -331
  826. synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -121
  827. synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_progression.py +0 -477
  828. synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -559
  829. synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -313
  830. synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -148
  831. synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -247
  832. synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -368
  833. synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -172
  834. synth_ai/environments/examples/red/environment.py +0 -298
  835. synth_ai/environments/examples/red/taskset.py +0 -79
  836. synth_ai/environments/examples/red/units/__init__.py +0 -1
  837. synth_ai/environments/examples/sokoban/__init__.py +0 -1
  838. synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -899
  839. synth_ai/environments/examples/sokoban/engine.py +0 -678
  840. synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -1
  841. synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -657
  842. synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -18
  843. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -3
  844. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -131
  845. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -370
  846. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -332
  847. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -306
  848. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -67
  849. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -115
  850. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -123
  851. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -394
  852. synth_ai/environments/examples/sokoban/environment.py +0 -229
  853. synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -440
  854. synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -312
  855. synth_ai/environments/examples/sokoban/taskset.py +0 -544
  856. synth_ai/environments/examples/tictactoe/__init__.py +0 -1
  857. synth_ai/environments/examples/tictactoe/engine.py +0 -368
  858. synth_ai/environments/examples/tictactoe/environment.py +0 -240
  859. synth_ai/environments/examples/tictactoe/taskset.py +0 -215
  860. synth_ai/environments/examples/verilog/__init__.py +0 -10
  861. synth_ai/environments/examples/verilog/engine.py +0 -421
  862. synth_ai/environments/examples/verilog/environment.py +0 -350
  863. synth_ai/environments/examples/verilog/taskset.py +0 -420
  864. synth_ai/environments/examples/wordle/__init__.py +0 -29
  865. synth_ai/environments/examples/wordle/engine.py +0 -398
  866. synth_ai/environments/examples/wordle/environment.py +0 -159
  867. synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -75
  868. synth_ai/environments/examples/wordle/taskset.py +0 -230
  869. synth_ai/environments/reproducibility/core.py +0 -42
  870. synth_ai/environments/reproducibility/helpers.py +0 -0
  871. synth_ai/environments/reproducibility/tree.py +0 -363
  872. synth_ai/environments/service/app.py +0 -97
  873. synth_ai/environments/service/core_routes.py +0 -1021
  874. synth_ai/environments/service/external_registry.py +0 -56
  875. synth_ai/environments/service/registry.py +0 -9
  876. synth_ai/environments/stateful/__init__.py +0 -1
  877. synth_ai/environments/stateful/core.py +0 -163
  878. synth_ai/environments/stateful/engine.py +0 -21
  879. synth_ai/environments/stateful/state.py +0 -7
  880. synth_ai/environments/tasks/api.py +0 -19
  881. synth_ai/environments/tasks/core.py +0 -81
  882. synth_ai/environments/tasks/filters.py +0 -40
  883. synth_ai/environments/tasks/utils.py +0 -90
  884. synth_ai/environments/v0_observability/history.py +0 -3
  885. synth_ai/environments/v0_observability/log.py +0 -2
  886. synth_ai/evals/__init__.py +0 -15
  887. synth_ai/evals/base.py +0 -13
  888. synth_ai/evals/client.py +0 -82
  889. synth_ai/handshake.py +0 -109
  890. synth_ai/http.py +0 -26
  891. synth_ai/http_client.py +0 -136
  892. synth_ai/inference/__init__.py +0 -5
  893. synth_ai/inference/client.py +0 -34
  894. synth_ai/jobs/client.py +0 -295
  895. synth_ai/judge_schemas.py +0 -127
  896. synth_ai/learning/__init__.py +0 -59
  897. synth_ai/learning/client.py +0 -241
  898. synth_ai/learning/ft_client.py +0 -7
  899. synth_ai/learning/health.py +0 -49
  900. synth_ai/learning/jobs.py +0 -201
  901. synth_ai/learning/rl/client.py +0 -267
  902. synth_ai/learning/rl/contracts.py +0 -27
  903. synth_ai/learning/rl/env_keys.py +0 -166
  904. synth_ai/learning/rl/secrets.py +0 -13
  905. synth_ai/learning/sft/client.py +0 -68
  906. synth_ai/learning/sft/config.py +0 -270
  907. synth_ai/learning/sft/data.py +0 -295
  908. synth_ai/learning/validators.py +0 -49
  909. synth_ai/lm/__init__.py +0 -25
  910. synth_ai/task/__init__.py +0 -121
  911. synth_ai/task/apps/__init__.py +0 -129
  912. synth_ai/task/config.py +0 -257
  913. synth_ai/task/contracts.py +0 -236
  914. synth_ai/task/datasets.py +0 -108
  915. synth_ai/task/proxy.py +0 -251
  916. synth_ai/task/rubrics/__init__.py +0 -56
  917. synth_ai/task/rubrics/loaders.py +0 -152
  918. synth_ai/task/server.py +0 -432
  919. synth_ai/task/trace_correlation_helpers.py +0 -315
  920. synth_ai/task/tracing_utils.py +0 -84
  921. synth_ai/task/validators.py +0 -418
  922. synth_ai/tracing_v3/__init__.py +0 -97
  923. synth_ai/tracing_v3/abstractions.py +0 -302
  924. synth_ai/tracing_v3/config.py +0 -84
  925. synth_ai/tracing_v3/db_config.py +0 -194
  926. synth_ai/tracing_v3/decorators.py +0 -398
  927. synth_ai/tracing_v3/llm_call_record_helpers.py +0 -391
  928. synth_ai/tracing_v3/migration_helper.py +0 -120
  929. synth_ai/tracing_v3/session_tracer.py +0 -540
  930. synth_ai/tracing_v3/storage/base.py +0 -210
  931. synth_ai/tracing_v3/storage/config.py +0 -75
  932. synth_ai/tracing_v3/storage/factory.py +0 -39
  933. synth_ai/tracing_v3/trace_utils.py +0 -317
  934. synth_ai/tracing_v3/turso/daemon.py +0 -151
  935. synth_ai/tracing_v3/turso/models.py +0 -469
  936. synth_ai/tracing_v3/turso/native_manager.py +0 -1209
  937. synth_ai/tracing_v3/utils.py +0 -108
  938. synth_ai/tui/__init__.py +0 -5
  939. synth_ai/tui/__main__.py +0 -13
  940. synth_ai/tui/cli/__init__.py +0 -1
  941. synth_ai/tui/cli/query_experiments.py +0 -164
  942. synth_ai/tui/cli/query_experiments_v3.py +0 -164
  943. synth_ai/tui/dashboard.py +0 -906
  944. synth_ai/v0/api/__init__.py +0 -8
  945. synth_ai/v0/api/models/__init__.py +0 -8
  946. synth_ai/v0/api/models/supported.py +0 -8
  947. synth_ai/v0/config/__init__.py +0 -15
  948. synth_ai/v0/config/base_url.py +0 -12
  949. synth_ai/v0/lm/__init__.py +0 -51
  950. synth_ai/v0/lm/caching/__init__.py +0 -0
  951. synth_ai/v0/lm/caching/constants.py +0 -6
  952. synth_ai/v0/lm/caching/dbs.py +0 -0
  953. synth_ai/v0/lm/caching/ephemeral.py +0 -100
  954. synth_ai/v0/lm/caching/handler.py +0 -137
  955. synth_ai/v0/lm/caching/initialize.py +0 -11
  956. synth_ai/v0/lm/caching/persistent.py +0 -114
  957. synth_ai/v0/lm/config.py +0 -115
  958. synth_ai/v0/lm/constants.py +0 -32
  959. synth_ai/v0/lm/core/__init__.py +0 -8
  960. synth_ai/v0/lm/core/all.py +0 -73
  961. synth_ai/v0/lm/core/exceptions.py +0 -5
  962. synth_ai/v0/lm/core/main.py +0 -331
  963. synth_ai/v0/lm/core/main_v3.py +0 -594
  964. synth_ai/v0/lm/core/synth_models.py +0 -35
  965. synth_ai/v0/lm/core/vendor_clients.py +0 -190
  966. synth_ai/v0/lm/cost/__init__.py +0 -0
  967. synth_ai/v0/lm/cost/monitor.py +0 -1
  968. synth_ai/v0/lm/cost/statefulness.py +0 -1
  969. synth_ai/v0/lm/injection.py +0 -80
  970. synth_ai/v0/lm/overrides.py +0 -206
  971. synth_ai/v0/lm/provider_support/__init__.py +0 -8
  972. synth_ai/v0/lm/provider_support/anthropic.py +0 -972
  973. synth_ai/v0/lm/provider_support/openai.py +0 -1139
  974. synth_ai/v0/lm/provider_support/suppress_logging.py +0 -31
  975. synth_ai/v0/lm/structured_outputs/__init__.py +0 -0
  976. synth_ai/v0/lm/structured_outputs/handler.py +0 -440
  977. synth_ai/v0/lm/structured_outputs/inject.py +0 -297
  978. synth_ai/v0/lm/structured_outputs/rehabilitate.py +0 -185
  979. synth_ai/v0/lm/tools/__init__.py +0 -3
  980. synth_ai/v0/lm/tools/base.py +0 -172
  981. synth_ai/v0/lm/unified_interface.py +0 -202
  982. synth_ai/v0/lm/vendors/__init__.py +0 -0
  983. synth_ai/v0/lm/vendors/base.py +0 -81
  984. synth_ai/v0/lm/vendors/core/__init__.py +0 -0
  985. synth_ai/v0/lm/vendors/core/anthropic_api.py +0 -387
  986. synth_ai/v0/lm/vendors/core/gemini_api.py +0 -292
  987. synth_ai/v0/lm/vendors/core/mistral_api.py +0 -322
  988. synth_ai/v0/lm/vendors/core/openai_api.py +0 -227
  989. synth_ai/v0/lm/vendors/core/synth_dev_api.py +0 -0
  990. synth_ai/v0/lm/vendors/local/__init__.py +0 -0
  991. synth_ai/v0/lm/vendors/local/ollama.py +0 -0
  992. synth_ai/v0/lm/vendors/openai_standard.py +0 -782
  993. synth_ai/v0/lm/vendors/openai_standard_responses.py +0 -259
  994. synth_ai/v0/lm/vendors/retries.py +0 -22
  995. synth_ai/v0/lm/vendors/supported/__init__.py +0 -0
  996. synth_ai/v0/lm/vendors/supported/custom_endpoint.py +0 -415
  997. synth_ai/v0/lm/vendors/supported/deepseek.py +0 -69
  998. synth_ai/v0/lm/vendors/supported/grok.py +0 -75
  999. synth_ai/v0/lm/vendors/supported/groq.py +0 -16
  1000. synth_ai/v0/lm/vendors/supported/ollama.py +0 -15
  1001. synth_ai/v0/lm/vendors/supported/openrouter.py +0 -74
  1002. synth_ai/v0/lm/vendors/supported/together.py +0 -11
  1003. synth_ai/v0/lm/vendors/synth_client.py +0 -835
  1004. synth_ai/v0/lm/warmup.py +0 -186
  1005. synth_ai/v0/tracing/__init__.py +0 -0
  1006. synth_ai/v0/tracing/abstractions.py +0 -224
  1007. synth_ai/v0/tracing/base_client.py +0 -91
  1008. synth_ai/v0/tracing/client_manager.py +0 -131
  1009. synth_ai/v0/tracing/config.py +0 -142
  1010. synth_ai/v0/tracing/context.py +0 -146
  1011. synth_ai/v0/tracing/decorators.py +0 -682
  1012. synth_ai/v0/tracing/events/__init__.py +0 -0
  1013. synth_ai/v0/tracing/events/manage.py +0 -147
  1014. synth_ai/v0/tracing/events/scope.py +0 -86
  1015. synth_ai/v0/tracing/events/store.py +0 -228
  1016. synth_ai/v0/tracing/immediate_client.py +0 -151
  1017. synth_ai/v0/tracing/local.py +0 -18
  1018. synth_ai/v0/tracing/log_client_base.py +0 -73
  1019. synth_ai/v0/tracing/retry_queue.py +0 -186
  1020. synth_ai/v0/tracing/trackers.py +0 -515
  1021. synth_ai/v0/tracing/upload.py +0 -409
  1022. synth_ai/v0/tracing/utils.py +0 -9
  1023. synth_ai/v0/tracing_v1/__init__.py +0 -16
  1024. synth_ai/v0/tracing_v1/abstractions.py +0 -224
  1025. synth_ai/v0/tracing_v1/base_client.py +0 -91
  1026. synth_ai/v0/tracing_v1/client_manager.py +0 -131
  1027. synth_ai/v0/tracing_v1/config.py +0 -142
  1028. synth_ai/v0/tracing_v1/context.py +0 -146
  1029. synth_ai/v0/tracing_v1/decorators.py +0 -703
  1030. synth_ai/v0/tracing_v1/events/__init__.py +0 -0
  1031. synth_ai/v0/tracing_v1/events/manage.py +0 -147
  1032. synth_ai/v0/tracing_v1/events/scope.py +0 -86
  1033. synth_ai/v0/tracing_v1/events/store.py +0 -228
  1034. synth_ai/v0/tracing_v1/immediate_client.py +0 -151
  1035. synth_ai/v0/tracing_v1/local.py +0 -18
  1036. synth_ai/v0/tracing_v1/log_client_base.py +0 -73
  1037. synth_ai/v0/tracing_v1/retry_queue.py +0 -186
  1038. synth_ai/v0/tracing_v1/trackers.py +0 -515
  1039. synth_ai/v0/tracing_v1/upload.py +0 -527
  1040. synth_ai/v0/tracing_v1/utils.py +0 -9
  1041. synth_ai/v0/tracing_v3/__init__.py +0 -10
  1042. synth_ai/v0/tracing_v3/abstractions.py +0 -3
  1043. synth_ai/v0/tracing_v3/decorators.py +0 -3
  1044. synth_ai/v0/tracing_v3/llm_call_record_helpers.py +0 -3
  1045. synth_ai/v0/tracing_v3/session_tracer.py +0 -3
  1046. synth_ai-0.2.14.dist-info/METADATA +0 -139
  1047. synth_ai-0.2.14.dist-info/RECORD +0 -762
  1048. synth_ai-0.2.14.dist-info/top_level.txt +0 -2
  1049. /synth_ai/{demos/demo_task_apps → cli/demo_apps}/crafter/__init__.py +0 -0
  1050. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/__init__.py +0 -0
  1051. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/crafter/configs/crafter_fft_4b.toml +0 -0
  1052. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +0 -0
  1053. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
  1054. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/_common.py +0 -0
  1055. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/app.py +0 -0
  1056. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/config.toml +0 -0
  1057. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/deploy_modal.py +0 -0
  1058. {examples/task_apps → synth_ai/core/apps}/__init__.py +0 -0
  1059. /synth_ai/{tracing_v3 → core/tracing_v3}/examples/basic_usage.py +0 -0
  1060. /synth_ai/{tracing_v3 → core/tracing_v3}/hooks.py +0 -0
  1061. /synth_ai/{tracing_v3 → core/tracing_v3}/lm_call_record_abstractions.py +0 -0
  1062. /synth_ai/{tracing_v3 → core/tracing_v3}/replica_sync.py +0 -0
  1063. /synth_ai/{tracing_v3 → core/tracing_v3}/serialization.py +0 -0
  1064. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/__init__.py +0 -0
  1065. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/exceptions.py +0 -0
  1066. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/types.py +0 -0
  1067. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/utils.py +0 -0
  1068. /synth_ai/{tracing_v3 → core/tracing_v3}/turso/__init__.py +0 -0
  1069. /synth_ai/{evals → sdk/judging}/types.py +0 -0
  1070. /synth_ai/{learning → sdk/learning}/algorithms.py +0 -0
  1071. /synth_ai/{learning → sdk/learning}/config.py +0 -0
  1072. /synth_ai/{learning → sdk/learning}/constants.py +0 -0
  1073. /synth_ai/{learning → sdk/learning}/core.py +0 -0
  1074. /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
  1075. /synth_ai/{learning → sdk/learning}/rl/__init__.py +0 -0
  1076. /synth_ai/{learning → sdk/learning}/rl/config.py +0 -0
  1077. /synth_ai/{learning → sdk/learning}/rl_client.py +0 -0
  1078. /synth_ai/{learning → sdk/learning}/sft/__init__.py +0 -0
  1079. /synth_ai/{learning → sdk/learning}/sse.py +0 -0
  1080. /synth_ai/{task → sdk/task}/auth.py +0 -0
  1081. /synth_ai/{task → sdk/task}/client.py +0 -0
  1082. /synth_ai/{task → sdk/task}/errors.py +0 -0
  1083. /synth_ai/{task → sdk/task}/health.py +0 -0
  1084. /synth_ai/{task → sdk/task}/json.py +0 -0
  1085. /synth_ai/{task → sdk/task}/rubrics/models.py +0 -0
  1086. /synth_ai/{task → sdk/task}/rubrics/scoring.py +0 -0
  1087. /synth_ai/{task → sdk/task}/rubrics/strict.py +0 -0
  1088. /synth_ai/{task → sdk/task}/vendors.py +0 -0
  1089. {synth_ai-0.2.14.dist-info → synth_ai-0.4.1.dist-info}/WHEEL +0 -0
  1090. {synth_ai-0.2.14.dist-info → synth_ai-0.4.1.dist-info}/entry_points.txt +0 -0
  1091. {synth_ai-0.2.14.dist-info → synth_ai-0.4.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,973 +0,0 @@
1
- """Task App configuration for the GRPO Crafter example."""
2
-
3
- from __future__ import annotations
4
-
5
- import json
6
- import logging
7
- import os
8
- import sys
9
- from collections.abc import Iterable, Sequence
10
- from dataclasses import dataclass
11
- from pathlib import Path
12
- from typing import Any
13
-
14
- from synth_ai.task.apps import ModalDeploymentConfig, TaskAppEntry, register_task_app
15
- from synth_ai.task.contracts import RolloutMetrics, RolloutMode, RolloutRequest, RolloutResponse, TaskInfo
16
- from synth_ai.task.datasets import TaskDatasetRegistry, TaskDatasetSpec
17
- from synth_ai.task.json import to_jsonable # noqa: F401 (imported for side-effect compatibility)
18
- from synth_ai.task.rubrics import load_rubric
19
- from synth_ai.task.server import ProxyConfig, RubricBundle, TaskAppConfig
20
- from synth_ai.task.validators import normalize_inference_url
21
- from synth_ai.task.tracing_utils import (
22
- build_tracer_factory,
23
- resolve_sft_output_dir,
24
- resolve_tracing_db_url,
25
- tracing_env_enabled,
26
- )
27
- from synth_ai.tracing_v3.session_tracer import SessionTracer
28
-
29
- try:
30
- from .synth_envs_hosted.utils import (
31
- ensure_chat_completions_url,
32
- extract_trace_correlation_id,
33
- )
34
- except Exception: # pragma: no cover - utils unavailable if optional deps missing
35
- def ensure_chat_completions_url(raw_url, mode=None):
36
- """Fallback to shared utility for URL normalization."""
37
- return normalize_inference_url(raw_url) if raw_url else raw_url
38
-
39
- def extract_trace_correlation_id(_raw_url):
40
- return None
41
- logger = logging.getLogger(__name__)
42
-
43
- DEFAULT_ALIAS_OPS: list[str] = ["agent", "env"] * 10
44
- DEFAULT_ALIAS_STEP_REWARDS: dict[str, Any] = {
45
- "enabled": True,
46
- "mode": "decision_stepwise",
47
- "indicator_lambda": 1.0,
48
- "step_beta": 0.0,
49
- }
50
-
51
- _HERE = Path(__file__).resolve()
52
-
53
-
54
- def _resolve_repo_root() -> Path:
55
- """Best-effort detection of the Synth AI repo root across local and Modal mounts."""
56
-
57
- candidates: list[Path] = []
58
- env_root = os.getenv("SYNTH_AI_REPO_ROOT")
59
- if env_root:
60
- candidates.append(Path(env_root).expanduser())
61
- candidates.append(Path("/opt/synth_ai_repo"))
62
- candidates.extend(parent for parent in [_HERE.parent, *_HERE.parents])
63
-
64
- for candidate in candidates:
65
- try:
66
- resolved = candidate.resolve()
67
- except Exception:
68
- continue
69
- if not resolved.exists():
70
- continue
71
- if (resolved / "pyproject.toml").exists() or (resolved / "uv.lock").exists():
72
- return resolved
73
- if (resolved / "synth_ai").is_dir():
74
- return resolved
75
-
76
- try:
77
- return _HERE.parents[3]
78
- except IndexError:
79
- return _HERE.parent
80
-
81
-
82
- def _resolve_task_app_root(repo_root: Path) -> Path:
83
- """Locate the task_app directory even when the module is copied to a temp mount."""
84
-
85
- preferred = (repo_root / "examples" / "task_apps" / "crafter" / "task_app").resolve()
86
- if preferred.is_dir():
87
- return preferred
88
-
89
- local_parent = _HERE.parent.resolve()
90
- if (local_parent / "synth_envs_hosted").is_dir():
91
- return local_parent
92
-
93
- for parent in _HERE.parents:
94
- candidate = parent.resolve()
95
- if (candidate / "synth_envs_hosted").is_dir():
96
- return candidate
97
-
98
- fallback = Path("/opt/synth_ai_repo/examples/task_apps/crafter/task_app")
99
- if fallback.is_dir():
100
- return fallback.resolve()
101
-
102
- return local_parent
103
-
104
-
105
- REPO_ROOT = _resolve_repo_root()
106
- TASK_APP_ROOT = _resolve_task_app_root(REPO_ROOT)
107
- SYNTH_ENVS_HOSTED_ROOT = (TASK_APP_ROOT / "synth_envs_hosted").resolve()
108
-
109
- EXAMPLES_ROOT = (REPO_ROOT / "examples").resolve()
110
- RUBRICS_ROOT = (EXAMPLES_ROOT / "multi_step" / "rubrics").resolve()
111
-
112
- DEFAULT_OUTCOME_RUBRIC_DATA: dict[str, Any] = {
113
- "version": "1",
114
- "goal_text": (
115
- "Reward episodes that climb the Crafter achievement ladder, stockpile key resources "
116
- "(especially wood), and finish alive with clear understanding of any failure."
117
- ),
118
- "aggregation": "weighted_sum",
119
- "criteria": [
120
- {
121
- "id": "achievement_progression",
122
- "description": (
123
- "Weigh achievements by tier: late-game unlocks (iron tools, furnace, armor) earn "
124
- "the most, mid-tier crafting (stone tools, furnace prep) gets partial credit, early "
125
- "tasks (collecting saplings/wood tools) only lightly scored."
126
- ),
127
- "weight": 0.35,
128
- },
129
- {
130
- "id": "resource_stockpile",
131
- "description": (
132
- "Assess resource totals with emphasis on wood stores; high scores require abundant "
133
- "wood plus supporting materials (stone, coal, iron) that signal readiness for "
134
- "crafting."
135
- ),
136
- "weight": 0.2,
137
- },
138
- {
139
- "id": "survival_state",
140
- "description": (
141
- "Reward finishing alive with healthy food/drink bars and safe positioning; penalize "
142
- "deaths, low vitals, or lingering hazards at episode end."
143
- ),
144
- "weight": 0.2,
145
- },
146
- {
147
- "id": "failure_analysis",
148
- "description": (
149
- "If the run ends in death or timeout, clearly identify the cause and deduct unless "
150
- "the agent mitigated risk; highlight when the agent survives despite danger."
151
- ),
152
- "weight": 0.15,
153
- },
154
- {
155
- "id": "future_readiness",
156
- "description": (
157
- "Describe how prepared the agent is for the next objectives (tools crafted, shelters, "
158
- "furnaces, smelted materials) and whether the inventory supports further progress."
159
- ),
160
- "weight": 0.1,
161
- },
162
- ],
163
- }
164
-
165
- DEFAULT_EVENTS_RUBRIC_DATA: dict[str, Any] = {
166
- "version": "1",
167
- "goal_text": (
168
- "Score each decision in proportion to the concrete Crafter achievement progress it "
169
- "delivers, topping out the scale when the log shows a fresh achievement unlock and keeping "
170
- "routine upkeep near zero."
171
- ),
172
- "aggregation": "weighted_sum",
173
- "criteria": [
174
- {
175
- "id": "achievement_unlocks",
176
- "description": (
177
- "Assign 0.9-1.0 when the decision explicitly unlocks a new Crafter achievement (look "
178
- 'for "Achievement unlocked" messages or equivalent deterministic completions such as '
179
- "placing a furnace that immediately crafts ingots). Cap the score at 0.4 when no new "
180
- "achievement fires, and drop to <=0.1 if the turn repeats known actions without "
181
- "measurable progress."
182
- ),
183
- "weight": 0.55,
184
- },
185
- {
186
- "id": "milestone_setup",
187
- "description": (
188
- "Give 0.5-0.7 when the action completes the last prerequisite for a specific upcoming "
189
- "achievement (e.g., gathering the final ore before smelting, crafting sticks right "
190
- "before a tool). Keep the score <=0.3 if the progress is speculative or still several "
191
- "steps away."
192
- ),
193
- "weight": 0.2,
194
- },
195
- {
196
- "id": "inventory_depth",
197
- "description": (
198
- "Reward 0.3-0.5 for pulls that clearly deepen critical buffers (fuel, food, ore) and "
199
- "immediately unblock the next milestone. If resources are already plentiful or the "
200
- "haul is generic filler, stay at <=0.2."
201
- ),
202
- "weight": 0.15,
203
- },
204
- {
205
- "id": "execution_quality",
206
- "description": (
207
- "Only add up to 0.1 for clean, legal execution that avoids wasted turns; drop to 0.0 "
208
- "whenever the agent idles, repeats failed moves, or takes damage without compensating "
209
- "progress."
210
- ),
211
- "weight": 0.1,
212
- },
213
- ],
214
- }
215
-
216
- for path in (REPO_ROOT, TASK_APP_ROOT, SYNTH_ENVS_HOSTED_ROOT, EXAMPLES_ROOT):
217
- try:
218
- resolved = path.resolve()
219
- except Exception:
220
- resolved = path
221
- if resolved.exists():
222
- path_str = str(resolved)
223
- if path_str not in sys.path:
224
- sys.path.insert(0, path_str)
225
-
226
- # Fallback: explicitly add Modal mount path for 'examples' if REPO_ROOT detection fails
227
- try:
228
- _hard_examples = Path("/opt/synth_ai_repo/examples")
229
- if _hard_examples.exists():
230
- _hard_examples_str = str(_hard_examples.resolve())
231
- if _hard_examples_str not in sys.path:
232
- sys.path.insert(0, _hard_examples_str)
233
- except Exception:
234
- pass
235
-
236
- def _load_rubric_with_fallback(filename: str, fallback: dict[str, Any]):
237
- """Load rubric from JSON file when available, otherwise use bundled fallback."""
238
-
239
- search_paths = [RUBRICS_ROOT / filename, TASK_APP_ROOT / "rubrics" / filename]
240
- for path in search_paths:
241
- try:
242
- if path.exists():
243
- logger.debug("Loading rubric from %s", path)
244
- return load_rubric(str(path))
245
- except Exception as exc:
246
- logger.warning("Failed to load rubric %s from %s: %s", filename, path, exc)
247
-
248
- logger.warning("Falling back to inline rubric %s: file not available", filename)
249
- try:
250
- materialized = search_paths[0]
251
- materialized.parent.mkdir(parents=True, exist_ok=True)
252
- materialized.write_text(json.dumps(fallback, indent=2), encoding="utf-8")
253
- except Exception:
254
- logger.debug("Unable to materialize inline rubric %s", filename, exc_info=True)
255
- return load_rubric(fallback)
256
-
257
-
258
- HAS_HOSTED = True
259
- try:
260
- import crafter # type: ignore
261
- import crafter.constants as crafter_constants # type: ignore
262
- from synth_ai.environments.examples.crafter_classic.taskset import TRAIT_BOUNDS
263
- from synth_envs_hosted.branching import router as branching_router # type: ignore
264
- from synth_envs_hosted.environment_routes import router as environment_router # type: ignore
265
- from synth_envs_hosted.hosted_app import TaskApp as HostedTaskApp # type: ignore
266
- from synth_envs_hosted.policy_routes import router as policy_router # type: ignore
267
- from synth_envs_hosted.rollout import ( # type: ignore
268
- RolloutEnvSpec as LegacyRolloutEnvSpec,
269
- )
270
- from synth_envs_hosted.rollout import (
271
- RolloutPolicySpec as LegacyRolloutPolicySpec,
272
- )
273
- from synth_envs_hosted.rollout import (
274
- RolloutRecordConfig as LegacyRolloutRecordConfig,
275
- )
276
- from synth_envs_hosted.rollout import (
277
- RolloutRequest as LegacyRolloutRequest,
278
- )
279
- from synth_envs_hosted.rollout import (
280
- RolloutResponse as LegacyRolloutResponse,
281
- )
282
- from synth_envs_hosted.rollout import (
283
- RolloutSafetyConfig as LegacyRolloutSafetyConfig,
284
- )
285
- from synth_envs_hosted.rollout import (
286
- execute_rollout as legacy_execute_rollout,
287
- )
288
- except Exception as exc: # pragma: no cover - import-time validation
289
- # Provide a more actionable error with the missing module and fix hints
290
- missing_mod = None
291
- if isinstance(exc, ModuleNotFoundError):
292
- missing_mod = (
293
- getattr(exc, "name", None) or str(exc).split("'")[1] if "'" in str(exc) else None
294
- )
295
- fix_hint = None
296
- if missing_mod:
297
- mapping = {
298
- "dotenv": "python-dotenv",
299
- "crafter": "crafter",
300
- "httpx": "httpx",
301
- "aiohttp": "aiohttp",
302
- "fastapi": "fastapi",
303
- "uvicorn": "uvicorn",
304
- "sqlalchemy": "sqlalchemy",
305
- "aiosqlite": "aiosqlite",
306
- "greenlet": "greenlet",
307
- }
308
- pkg = mapping.get(missing_mod, missing_mod)
309
- fix_hint = (
310
- f"Missing Python module '{missing_mod}'. Install the package '{pkg}'.\n"
311
- f"For Modal: add '{pkg}' to ModalDeploymentConfig.pip_packages in synth_ai/task/apps/grpo_crafter.py.\n"
312
- f"Locally: pip install {pkg}"
313
- )
314
- # Allow running without synth_envs_hosted; gate hosted features off
315
- if missing_mod == "synth_envs_hosted":
316
- HAS_HOSTED = False
317
- else:
318
- detailed = (
319
- "grpo_crafter task app requires example dependencies and runtime libs.\n"
320
- + (fix_hint + "\n" if fix_hint else "")
321
- + f"Original error: {exc}"
322
- )
323
- raise RuntimeError(detailed) from exc
324
-
325
-
326
- CRAFTING_RULES_SYSTEM_HINT = (
327
- "Crafter crafting rules (from the paper):\n"
328
- "- Make Wood Pickaxe: Nearby a table; have wood in inventory.\n"
329
- "- Make Stone Pickaxe: Nearby a table; have wood and stone in inventory.\n"
330
- "- Make Iron Pickaxe: Nearby a table; furnace exists; have wood, coal, and iron in inventory.\n"
331
- "- Make Wood Sword: Nearby a table; have wood in inventory.\n"
332
- "- Make Stone Sword: Nearby a table; have wood and stone in inventory.\n"
333
- "- Make Iron Sword: Nearby a table; furnace exists; have wood, coal, and iron in inventory."
334
- )
335
-
336
-
337
- DATASET_SPEC = TaskDatasetSpec(
338
- id="crafter_classic_procedural",
339
- name="Crafter Classic Procedural Seeds",
340
- version="1.0.0",
341
- splits=["train"],
342
- default_split="train",
343
- description="Procedural Crafter Classic seeds with reproducible world traits.",
344
- )
345
-
346
-
347
- @dataclass
348
- class CrafterDataset:
349
- spec: TaskDatasetSpec
350
-
351
- def __post_init__(self) -> None:
352
- self.default_seed = int(env_value("CRAFTER_DEFAULT_SEED", 42))
353
- self.seed_min = 0
354
- self.seed_max = int(env_value("CRAFTER_MAX_SEED", 2**31 - 1))
355
- area_env = env_value("CRAFTER_AREA", "64,64")
356
- self.area = tuple(int(x) for x in str(area_env).split(","))
357
- self.length = int(env_value("CRAFTER_EPISODE_LENGTH", 10000))
358
- self._cache: dict[int, dict[str, Any]] = {}
359
-
360
- def config_for_seed(self, seed: int) -> dict[str, Any]:
361
- return {
362
- "seed": int(seed),
363
- "area": list(self.area),
364
- "length": self.length,
365
- }
366
-
367
- def describe_seed(self, seed: int) -> dict[str, Any]:
368
- seed = int(seed)
369
- if seed in self._cache:
370
- return self._cache[seed]
371
- env = crafter.Env(area=self.area, length=self.length, seed=seed)
372
- try:
373
- env.reset()
374
- traits = _compute_world_traits(env)
375
- player = getattr(env, "_player", None)
376
- inventory = dict(getattr(player, "inventory", {})) if player else {}
377
- position = getattr(player, "pos", None)
378
- finally:
379
- close_fn = getattr(env, "close", None)
380
- if callable(close_fn):
381
- close_fn()
382
- summary = {
383
- "seed": seed,
384
- "difficulty": self._difficulty(traits),
385
- "traits": traits,
386
- "inventory": inventory,
387
- "player_position": list(position) if position is not None else None,
388
- "config": self.config_for_seed(seed),
389
- }
390
- self._cache[seed] = summary
391
- return summary
392
-
393
- def _difficulty(self, traits: dict[str, int]) -> str:
394
- for difficulty, bounds in TRAIT_BOUNDS.items():
395
- if traits.get("trees", 0) >= bounds.get("min_trees", 0) and traits.get(
396
- "hostiles", 0
397
- ) <= bounds.get("max_hostiles", 0):
398
- return difficulty
399
- return "custom"
400
-
401
- @property
402
- def seed_range(self) -> list[int]:
403
- return [self.seed_min, self.seed_max]
404
-
405
-
406
- def _compute_world_traits(env: crafter.Env, radius: int = 10) -> dict[str, int]:
407
- # Local copy to avoid import-time issues; mirrors synth_ai.environments.examples.crafter_classic.taskset.world_traits
408
- import numpy as _np # type: ignore
409
- from crafter import objects as _objects # type: ignore
410
-
411
- player = getattr(env, "_player", None)
412
- if player is None:
413
- return {"trees": 0, "cows": 0, "hostiles": 0}
414
- pos = _np.array(getattr(player, "pos", [0, 0]))
415
- counts = {"trees": 0, "cows": 0, "hostiles": 0}
416
- world = getattr(env, "_world", None)
417
- objects = getattr(world, "_objects", []) if world is not None else []
418
- for obj in objects:
419
- if obj is None or obj is player:
420
- continue
421
- try:
422
- if _np.abs(obj.pos - pos).sum() > radius:
423
- continue
424
- except Exception:
425
- continue
426
- if isinstance(obj, _objects.Plant) and getattr(obj, "kind", "") == "tree":
427
- counts["trees"] += 1
428
- elif isinstance(obj, _objects.Cow):
429
- counts["cows"] += 1
430
- elif isinstance(obj, _objects.Zombie | _objects.Skeleton):
431
- counts["hostiles"] += 1
432
- return counts
433
-
434
-
435
- def env_value(key: str, default: Any) -> Any:
436
- return os.getenv(key, default)
437
-
438
-
439
- def build_dataset() -> tuple[TaskDatasetRegistry, CrafterDataset]:
440
- registry = TaskDatasetRegistry()
441
- dataset = CrafterDataset(DATASET_SPEC)
442
- registry.register(DATASET_SPEC, lambda _spec: dataset, cache=True)
443
- return registry, dataset
444
-
445
-
446
- def _base_task_info(dataset: CrafterDataset) -> TaskInfo:
447
- return TaskInfo(
448
- task={"id": "crafter_classic", "name": "Crafter Classic", "version": "1.0.0"},
449
- environment="crafter",
450
- action_space={
451
- "type": "discrete",
452
- "description": f"Discrete action space with {len(crafter_constants.actions)} actions including movement, crafting, and interaction",
453
- "size": len(crafter_constants.actions),
454
- "actions": list(crafter_constants.actions),
455
- },
456
- observation={
457
- "type": "dict",
458
- "description": "RGB frame (64x64x3) plus inventory counts, achievements, and semantic map patches",
459
- "summary": "RGB frame plus inventory, achievements, and semantic map patches.",
460
- "keys": ["image", "inventory", "achievements", "semantic_map_patch7"],
461
- "image_shape": [64, 64, 3],
462
- },
463
- dataset={
464
- **DATASET_SPEC.model_dump(),
465
- "seed_range": dataset.seed_range,
466
- "default_seed": dataset.default_seed,
467
- },
468
- rubric={
469
- "version": "1",
470
- "criteria_count": 2,
471
- "source": "inline",
472
- "aggregation": "weighted_sum",
473
- },
474
- inference={
475
- "supports_proxy": True,
476
- "endpoints": {
477
- "openai": "/proxy/v1/chat/completions",
478
- "groq": "/proxy/groq/v1/chat/completions",
479
- },
480
- "tool": {"name": "interact", "parallel_tool_calls": False},
481
- },
482
- limits={"max_ops": 100000, "max_time_s": 3600},
483
- )
484
-
485
-
486
- OUTCOME_RUBRIC = _load_rubric_with_fallback(
487
- "crafter_outcome_rubric.json", DEFAULT_OUTCOME_RUBRIC_DATA
488
- )
489
-
490
- EVENTS_RUBRIC = _load_rubric_with_fallback(
491
- "crafter_events_rubric.json", DEFAULT_EVENTS_RUBRIC_DATA
492
- )
493
-
494
-
495
- def describe_taskset(dataset: CrafterDataset) -> dict[str, Any]:
496
- return {
497
- **DATASET_SPEC.model_dump(),
498
- "seed_range": dataset.seed_range,
499
- "default_seed": dataset.default_seed,
500
- "config": {
501
- "area": list(dataset.area),
502
- "length": dataset.length,
503
- },
504
- }
505
-
506
-
507
- def provide_task_instances(
508
- dataset: CrafterDataset, base_info: TaskInfo, seeds: Sequence[int]
509
- ) -> Iterable[TaskInfo]:
510
- infos: list[TaskInfo] = []
511
- base_observation = getattr(base_info, "observation", None)
512
- if hasattr(base_observation, "model_dump"):
513
- observation_template = base_observation.model_dump()
514
- elif isinstance(base_observation, dict):
515
- observation_template = dict(base_observation)
516
- else:
517
- observation_template = {}
518
-
519
- for seed_value in seeds:
520
- summary = dataset.describe_seed(seed_value)
521
- infos.append(
522
- TaskInfo(
523
- task=base_info.task,
524
- environment=base_info.environment,
525
- action_space=base_info.action_space,
526
- observation={
527
- **observation_template,
528
- "seed": seed_value,
529
- "traits": summary["traits"],
530
- "inventory": summary["inventory"],
531
- "player_position": summary["player_position"],
532
- },
533
- dataset={
534
- **base_info.dataset.model_dump(),
535
- "seed": seed_value,
536
- "difficulty": summary["difficulty"],
537
- "config": summary["config"],
538
- },
539
- rubric=base_info.rubric,
540
- inference=base_info.inference,
541
- limits=base_info.limits,
542
- )
543
- )
544
- return infos
545
-
546
-
547
- def _normalise_op(op_value: Any, index: int) -> str:
548
- if isinstance(op_value, str):
549
- candidate = op_value
550
- elif isinstance(op_value, dict):
551
- candidate = op_value.get("type") or op_value.get("op")
552
- else:
553
- candidate = None
554
- if not candidate:
555
- raise ValueError(f"Missing op type at index {index}")
556
- lowered = str(candidate).strip().lower()
557
- if lowered in {"policy", "agent", "model"}:
558
- return "agent"
559
- if lowered in {"env", "environment", "step"}:
560
- return "env"
561
- raise ValueError(f"Unsupported op type '{candidate}' at index {index}")
562
-
563
-
564
- def _coerce_math_to_crafter(request: RolloutRequest) -> RolloutRequest:
565
- """Map legacy math env/policy names to crafter and enrich rollout defaults."""
566
-
567
- def _needs_crafter(name: str | None) -> bool:
568
- if not name:
569
- return False
570
- lowered = str(name).strip().lower()
571
- return lowered.startswith("math")
572
-
573
- env_updates: dict[str, Any] = {}
574
- policy_updates: dict[str, Any] = {}
575
- alias_applied = False
576
-
577
- if _needs_crafter(request.env.env_name):
578
- env_updates["env_name"] = "crafter"
579
- alias_applied = True
580
- if request.env.env_id and _needs_crafter(request.env.env_id):
581
- env_updates["env_id"] = None
582
- alias_applied = True
583
- if _needs_crafter(request.policy.policy_name):
584
- policy_updates["policy_name"] = "crafter-react"
585
- alias_applied = True
586
- if request.policy.policy_id and _needs_crafter(request.policy.policy_id):
587
- policy_updates["policy_id"] = None
588
- alias_applied = True
589
-
590
- if not alias_applied:
591
- return request
592
-
593
- updated_env = request.env.model_copy(update=env_updates) if env_updates else request.env
594
- updated_policy = (
595
- request.policy.model_copy(update=policy_updates) if policy_updates else request.policy
596
- )
597
-
598
- env_cfg = dict(updated_env.config or {})
599
- env_cfg.setdefault("difficulty", "normal")
600
- env_cfg.setdefault("step_rewards", dict(DEFAULT_ALIAS_STEP_REWARDS))
601
- env_cfg.setdefault("env_params", {"max_steps_per_episode": 200})
602
- updated_env = updated_env.model_copy(update={"config": env_cfg})
603
-
604
- policy_cfg = dict(updated_policy.config or {})
605
- policy_cfg.setdefault("max_llm_calls", 10)
606
- policy_cfg.setdefault("max_completion_tokens", 1024)
607
- policy_cfg.setdefault("temperature", 0.2)
608
- policy_cfg.setdefault("step_rewards", dict(DEFAULT_ALIAS_STEP_REWARDS))
609
- updated_policy = updated_policy.model_copy(update={"config": policy_cfg})
610
-
611
- ops_override = request.ops
612
- if not ops_override or len(ops_override) < len(DEFAULT_ALIAS_OPS):
613
- ops_override = list(DEFAULT_ALIAS_OPS)
614
-
615
- coerced = request.model_copy(update={"env": updated_env, "policy": updated_policy, "ops": ops_override})
616
-
617
- try:
618
- print(
619
- "[rollout] remapped math request -> crafter "
620
- f"(env={request.env.env_name!r}→{coerced.env.env_name!r}, "
621
- f"policy={request.policy.policy_name!r}→{coerced.policy.policy_name!r})",
622
- flush=True,
623
- )
624
- except Exception:
625
- pass
626
- try:
627
- logger.info(
628
- "ROLLOUT_ALIAS: remapped math env/policy to crafter (env=%s→%s, policy=%s→%s)",
629
- request.env.env_name,
630
- coerced.env.env_name,
631
- request.policy.policy_name,
632
- coerced.policy.policy_name,
633
- )
634
- except Exception:
635
- pass
636
-
637
- return coerced
638
-
639
-
640
- def _resolve_trace_correlation_id(policy_cfg: dict[str, Any], mode: Any = None) -> str | None:
641
- """Best-effort extraction of the trace correlation identifier."""
642
- candidates: list[Any] = [
643
- policy_cfg.get("trace_correlation_id"),
644
- policy_cfg.get("trace"),
645
- ]
646
- logger.debug(
647
- "_resolve_trace_correlation_id: inspecting policy_cfg keys=%s candidates=%s",
648
- sorted(policy_cfg.keys()),
649
- candidates,
650
- )
651
- for candidate in candidates:
652
- if isinstance(candidate, str):
653
- stripped = candidate.strip()
654
- if stripped:
655
- return stripped
656
-
657
- return extract_trace_correlation_id(policy_cfg.get("inference_url"), mode=mode)
658
-
659
-
660
- async def rollout_executor(request: RolloutRequest, fastapi_request) -> RolloutResponse:
661
- request = _coerce_math_to_crafter(request)
662
-
663
- policy_cfg = dict(request.policy.config or {})
664
- logger.info(
665
- "ROLLOUT_EXEC: incoming policy config keys=%s inference_url=%s run_id=%s mode=%s",
666
- sorted(policy_cfg.keys()),
667
- policy_cfg.get("inference_url"),
668
- request.run_id,
669
- request.mode,
670
- )
671
- inferred_url = ensure_chat_completions_url(policy_cfg.get("inference_url"), mode=request.mode)
672
- if isinstance(inferred_url, str) and inferred_url:
673
- if inferred_url != policy_cfg.get("inference_url"):
674
- logger.warning(
675
- "ROLLOUT_EXEC: normalized inference_url run_id=%s from %s to %s",
676
- request.run_id,
677
- policy_cfg.get("inference_url"),
678
- inferred_url,
679
- )
680
- policy_cfg["inference_url"] = inferred_url
681
- else:
682
- logger.warning(
683
- "ROLLOUT_EXEC: inference_url missing or not normalized run_id=%s raw=%s",
684
- request.run_id,
685
- policy_cfg.get("inference_url"),
686
- )
687
-
688
- trace_correlation_id = _resolve_trace_correlation_id(policy_cfg, mode=request.mode)
689
-
690
- # ASSERTION: trace_correlation_id MUST be present for RL mode (but not EVAL mode)
691
- if request.mode == RolloutMode.RL:
692
- assert trace_correlation_id is not None, (
693
- f"FATAL: trace_correlation_id extraction failed for run_id={request.run_id}. "
694
- f"policy_cfg_keys={sorted(policy_cfg.keys())} "
695
- f"inference_url={policy_cfg.get('inference_url')}"
696
- )
697
- assert isinstance(trace_correlation_id, str) and trace_correlation_id.strip(), (
698
- f"FATAL: trace_correlation_id is empty for run_id={request.run_id}. "
699
- f"Got: {trace_correlation_id!r}"
700
- )
701
-
702
- if trace_correlation_id:
703
- policy_cfg["trace_correlation_id"] = trace_correlation_id
704
- logger.info(
705
- "ROLLOUT_EXEC: resolved trace_correlation_id=%s run_id=%s",
706
- trace_correlation_id,
707
- request.run_id,
708
- )
709
-
710
- pipeline_metadata: dict[str, Any] = {}
711
- if trace_correlation_id:
712
- pipeline_metadata["trace_correlation_id"] = trace_correlation_id
713
- if isinstance(policy_cfg.get("inference_url"), str) and policy_cfg["inference_url"]:
714
- pipeline_metadata.setdefault("inference_url", policy_cfg["inference_url"])
715
- logger.info(
716
- "ROLLOUT_EXEC: pipeline metadata prepared run_id=%s metadata=%s",
717
- request.run_id,
718
- pipeline_metadata,
719
- )
720
-
721
- # If hosted env service code is not bundled, return a no-op rollout response compatible with contracts
722
- if not HAS_HOSTED:
723
- logger.warning(
724
- "ROLLOUT_EXEC: HAS_HOSTED disabled, returning stub response run_id=%s metadata=%s",
725
- request.run_id,
726
- pipeline_metadata,
727
- )
728
- return RolloutResponse(
729
- run_id=request.run_id,
730
- trajectories=[],
731
- branches={},
732
- metrics=RolloutMetrics(
733
- episode_returns=[],
734
- mean_return=0.0,
735
- num_steps=0,
736
- num_episodes=0,
737
- details={},
738
- ),
739
- aborted=False,
740
- ops_executed=0,
741
- trace=None,
742
- trace_correlation_id=trace_correlation_id or f"trace_{request.run_id}",
743
- pipeline_metadata=pipeline_metadata,
744
- )
745
-
746
- try:
747
- max_llm_calls = int(policy_cfg.get("max_llm_calls") or 10)
748
- except Exception:
749
- max_llm_calls = 10
750
- policy_cfg.setdefault("max_llm_calls", max_llm_calls)
751
- policy_cfg.setdefault("max_tokens", 512)
752
- policy_cfg.setdefault("max_completion_tokens", 512)
753
- policy_cfg.setdefault("temperature", 0.2)
754
- policy_cfg.setdefault("top_p", 0.95)
755
-
756
- env_cfg = dict(request.env.config or {})
757
- env_params = dict(env_cfg.get("env_params") or {})
758
- try:
759
- max_steps_episode = int(env_params.get("max_steps_per_episode") or max_llm_calls)
760
- except Exception:
761
- max_steps_episode = max_llm_calls
762
- desired_steps = max(max_llm_calls, max_steps_episode)
763
- env_params["max_steps_per_episode"] = int(desired_steps)
764
- env_cfg["env_params"] = env_params
765
-
766
- updated_policy = request.policy.model_copy(update={"config": policy_cfg})
767
- updated_env = request.env.model_copy(update={"config": env_cfg})
768
- request = request.model_copy(update={"policy": updated_policy, "env": updated_env})
769
-
770
- converted_ops: list[str] = [_normalise_op(op, idx) for idx, op in enumerate(request.ops)]
771
- max_ops_allowed = max_llm_calls * 2 if max_llm_calls > 0 else len(converted_ops)
772
- if max_ops_allowed and len(converted_ops) > max_ops_allowed:
773
- converted_ops = converted_ops[:max_ops_allowed]
774
- legacy_request = LegacyRolloutRequest(
775
- run_id=request.run_id,
776
- mode=request.mode, # Preserve mode for nested requests
777
- env=LegacyRolloutEnvSpec(
778
- env_id=request.env.env_id,
779
- env_name=request.env.env_name,
780
- config=env_cfg,
781
- seed=request.env.seed,
782
- ),
783
- policy=LegacyRolloutPolicySpec(
784
- policy_id=request.policy.policy_id,
785
- policy_name=request.policy.policy_name,
786
- config=policy_cfg,
787
- ),
788
- ops=converted_ops,
789
- record=LegacyRolloutRecordConfig(**request.record.model_dump()),
790
- on_done=request.on_done,
791
- branch=None,
792
- safety=LegacyRolloutSafetyConfig(**request.safety.model_dump()),
793
- training_session_id=request.training_session_id,
794
- synth_base_url=request.synth_base_url,
795
- )
796
-
797
- legacy_response: LegacyRolloutResponse = await legacy_execute_rollout(
798
- legacy_request, fastapi_request
799
- )
800
- logger.info(
801
- "ROLLOUT_EXEC: legacy rollout completed run_id=%s trace_id=%s",
802
- request.run_id,
803
- trace_correlation_id,
804
- )
805
- data = legacy_response.model_dump()
806
- metrics = data.get("metrics", {}) or {}
807
- metrics.setdefault("outcome_score", None)
808
- metrics.setdefault("events_score", None)
809
- metrics.setdefault("details", {})
810
- data["metrics"] = metrics
811
-
812
- # Add trace_correlation_id at TOP-LEVEL (REQUIRED for RL training pipeline)
813
- # Use fallback if somehow missing
814
- data["trace_correlation_id"] = trace_correlation_id or f"trace_{request.run_id}"
815
-
816
- # Add trace_correlation_id to pipeline_metadata
817
- existing_meta = data.get("pipeline_metadata")
818
- if not isinstance(existing_meta, dict):
819
- existing_meta = {}
820
- # ALWAYS set trace_correlation_id (use fallback if needed)
821
- final_cid = trace_correlation_id or f"trace_{request.run_id}"
822
- existing_meta["trace_correlation_id"] = final_cid
823
- if isinstance(policy_cfg.get("inference_url"), str) and policy_cfg["inference_url"]:
824
- existing_meta.setdefault("inference_url", policy_cfg["inference_url"])
825
- data["pipeline_metadata"] = existing_meta
826
-
827
- # Add trace_correlation_id to each trajectory (required for RL training pipeline)
828
- if "trajectories" in data:
829
- for traj in data.get("trajectories", []):
830
- if isinstance(traj, dict):
831
- traj["trace_correlation_id"] = final_cid
832
- logger.info(
833
- "ROLLOUT_EXEC: final pipeline metadata run_id=%s metadata=%s",
834
- request.run_id,
835
- existing_meta,
836
- )
837
- if trace_correlation_id and existing_meta.get("trace_correlation_id") != trace_correlation_id:
838
- logger.error(
839
- "ROLLOUT_EXEC: metadata trace mismatch run_id=%s expected=%s actual=%s",
840
- request.run_id,
841
- trace_correlation_id,
842
- existing_meta.get("trace_correlation_id"),
843
- )
844
- if not existing_meta.get("trace_correlation_id"):
845
- logger.error(
846
- "ROLLOUT_EXEC: final metadata missing trace_correlation_id run_id=%s metadata=%s",
847
- request.run_id,
848
- existing_meta,
849
- )
850
-
851
- # ASSERTION: Verify trace_correlation_id is present in response at all required levels
852
- assert "trace_correlation_id" in data, (
853
- f"FATAL: trace_correlation_id missing from top-level response data for run_id={request.run_id}. "
854
- f"Keys: {list(data.keys())}"
855
- )
856
- assert data["trace_correlation_id"] == final_cid, (
857
- f"FATAL: trace_correlation_id mismatch in response for run_id={request.run_id}. "
858
- f"Expected: {final_cid!r}, Got: {data.get('trace_correlation_id')!r}"
859
- )
860
- assert "pipeline_metadata" in data, (
861
- f"FATAL: pipeline_metadata missing from response for run_id={request.run_id}"
862
- )
863
- assert data["pipeline_metadata"].get("trace_correlation_id") == final_cid, (
864
- f"FATAL: trace_correlation_id missing or mismatched in pipeline_metadata for run_id={request.run_id}. "
865
- f"Expected: {final_cid!r}, Got: {data['pipeline_metadata'].get('trace_correlation_id')!r}"
866
- )
867
- logger.info(
868
- "ROLLOUT_EXEC: assertions passed - trace_correlation_id present in response run_id=%s cid=%s",
869
- request.run_id,
870
- final_cid,
871
- )
872
-
873
- return RolloutResponse.model_validate(data)
874
-
875
-
876
- def build_config() -> TaskAppConfig:
877
- registry, dataset = build_dataset()
878
- base_info = _base_task_info(dataset)
879
-
880
- hosted_task_app = HostedTaskApp() if HAS_HOSTED else None
881
-
882
- tracing_enabled = tracing_env_enabled()
883
- tracing_db_url = resolve_tracing_db_url()
884
- tracer_factory = build_tracer_factory(
885
- SessionTracer, enabled=tracing_enabled, db_url=tracing_db_url
886
- )
887
- sft_output_dir = resolve_sft_output_dir()
888
-
889
- app_state: dict[str, Any] = {
890
- "task_app": hosted_task_app,
891
- "allowed_environments": ["crafter"],
892
- "tracing_enabled": tracing_enabled,
893
- }
894
- if tracer_factory is not None:
895
- app_state["session_tracer_factory"] = tracer_factory
896
- if sft_output_dir:
897
- app_state["sft_output_dir"] = sft_output_dir
898
-
899
- if tracing_enabled:
900
- status_msg = f"[task:tracing] enabled (db={tracing_db_url or 'default'})"
901
- else:
902
- status_msg = "[task:tracing] disabled"
903
- print(status_msg, flush=True)
904
- if sft_output_dir:
905
- print(f"[task:sft] writing JSONL to {sft_output_dir}", flush=True)
906
-
907
- def _describe_taskset() -> dict[str, Any]:
908
- return describe_taskset(dataset)
909
-
910
- def _provide_instances(seeds: Sequence[int]):
911
- return provide_task_instances(dataset, base_info, seeds)
912
-
913
- routers: tuple = (environment_router, policy_router, branching_router) if HAS_HOSTED else ()
914
-
915
- config = TaskAppConfig(
916
- app_id="grpo-crafter-task-app",
917
- name="GRPO Crafter Task App",
918
- description="Crafter Classic environment with GRPO task endpoints and LLM proxies.",
919
- base_task_info=base_info,
920
- describe_taskset=_describe_taskset,
921
- provide_task_instances=_provide_instances,
922
- rollout=rollout_executor,
923
- dataset_registry=registry,
924
- rubrics=RubricBundle(outcome=OUTCOME_RUBRIC, events=EVENTS_RUBRIC),
925
- proxy=ProxyConfig(
926
- enable_openai=True, enable_groq=True, system_hint=CRAFTING_RULES_SYSTEM_HINT
927
- ),
928
- routers=routers,
929
- app_state=app_state,
930
- cors_origins=["*"],
931
- )
932
- return config
933
-
934
-
935
- register_task_app(
936
- entry=TaskAppEntry(
937
- app_id="grpo-crafter-task-app",
938
- description="Crafter Classic task app with rollout + proxy endpoints",
939
- config_factory=build_config,
940
- aliases=("crafter", "crafter-task"),
941
- env_files=(str(REPO_ROOT / "backend" / ".env.dev"),),
942
- modal=ModalDeploymentConfig(
943
- app_name="grpo-crafter-task-app",
944
- python_version="3.11",
945
- pip_packages=(
946
- "fastapi>=0.100.0",
947
- "uvicorn>=0.23.0",
948
- "pydantic>=2.0.0",
949
- "numpy>=1.24.0",
950
- "aiohttp>=3.8.0",
951
- "httpx>=0.24.0",
952
- "python-dotenv>=1.0.1",
953
- # Tracing/DB runtime deps
954
- "sqlalchemy>=2.0.42",
955
- "aiosqlite>=0.21.0",
956
- "greenlet>=3.2.3",
957
- "crafter",
958
- ),
959
- extra_local_dirs=(
960
- # Mount repo root so local modules resolve when deployed on Modal
961
- (str(REPO_ROOT), "/opt/synth_ai_repo"),
962
- (str(REPO_ROOT / "synth_ai"), "/opt/synth_ai_repo/synth_ai"),
963
- (str(TASK_APP_ROOT), "/opt/synth_ai_repo/examples/task_apps/crafter/task_app"),
964
- # Explicitly mount rubrics directory
965
- (str(RUBRICS_ROOT), "/opt/synth_ai_repo/examples/multi_step/rubrics"),
966
- ),
967
- secret_names=("groq-api-key", "openai-api-key"),
968
- memory=16384,
969
- cpu=4.0,
970
- max_containers=10,
971
- ),
972
- )
973
- )