synth-ai 0.2.14__py3-none-any.whl → 0.4.4__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 (1086) hide show
  1. synth_ai/__init__.py +25 -46
  2. synth_ai/__main__.py +30 -3
  3. synth_ai/cli/__init__.py +98 -72
  4. synth_ai/cli/__main__.py +42 -0
  5. synth_ai/cli/_internal/__init__.py +5 -0
  6. synth_ai/cli/_internal/modal_wrapper.py +31 -0
  7. synth_ai/cli/_internal/storage.py +20 -0
  8. synth_ai/cli/_internal/typer_patch.py +47 -0
  9. synth_ai/cli/_internal/validate_task_app.py +29 -0
  10. synth_ai/cli/agents/__init__.py +17 -0
  11. synth_ai/cli/agents/claude.py +77 -0
  12. synth_ai/cli/agents/codex.py +265 -0
  13. synth_ai/cli/agents/opencode.py +253 -0
  14. synth_ai/cli/commands/__init__.py +18 -0
  15. synth_ai/cli/commands/artifacts/__init__.py +13 -0
  16. synth_ai/cli/commands/artifacts/client.py +119 -0
  17. synth_ai/cli/commands/artifacts/config.py +57 -0
  18. synth_ai/cli/commands/artifacts/core.py +24 -0
  19. synth_ai/cli/commands/artifacts/download.py +188 -0
  20. synth_ai/cli/commands/artifacts/export.py +186 -0
  21. synth_ai/cli/commands/artifacts/list.py +156 -0
  22. synth_ai/cli/commands/artifacts/parsing.py +250 -0
  23. synth_ai/cli/commands/artifacts/show.py +336 -0
  24. synth_ai/cli/commands/demo/__init__.py +3 -0
  25. synth_ai/cli/commands/demo/core.py +153 -0
  26. synth_ai/cli/commands/eval/__init__.py +10 -0
  27. synth_ai/cli/commands/eval/config.py +338 -0
  28. synth_ai/cli/commands/eval/core.py +258 -0
  29. synth_ai/cli/commands/eval/runner.py +704 -0
  30. synth_ai/cli/commands/eval/validation.py +60 -0
  31. synth_ai/cli/commands/filter/__init__.py +12 -0
  32. synth_ai/cli/commands/filter/core.py +424 -0
  33. synth_ai/cli/commands/filter/errors.py +55 -0
  34. synth_ai/cli/commands/filter/validation.py +77 -0
  35. synth_ai/cli/commands/help/__init__.py +185 -0
  36. synth_ai/cli/commands/help/core.py +72 -0
  37. synth_ai/cli/commands/scan/__init__.py +19 -0
  38. synth_ai/cli/commands/scan/cloudflare_scanner.py +403 -0
  39. synth_ai/cli/commands/scan/core.py +344 -0
  40. synth_ai/cli/commands/scan/health_checker.py +242 -0
  41. synth_ai/cli/commands/scan/local_scanner.py +278 -0
  42. synth_ai/cli/commands/scan/models.py +83 -0
  43. synth_ai/cli/commands/smoke/__init__.py +7 -0
  44. synth_ai/cli/commands/smoke/core.py +1428 -0
  45. synth_ai/cli/commands/status/__init__.py +3 -0
  46. synth_ai/cli/commands/status/client.py +91 -0
  47. synth_ai/cli/commands/status/config.py +12 -0
  48. synth_ai/cli/commands/status/errors.py +11 -0
  49. synth_ai/cli/commands/status/subcommands/__init__.py +3 -0
  50. synth_ai/cli/commands/status/subcommands/config.py +13 -0
  51. synth_ai/cli/commands/status/subcommands/files.py +34 -0
  52. synth_ai/cli/commands/status/subcommands/jobs.py +51 -0
  53. synth_ai/cli/commands/status/subcommands/models.py +35 -0
  54. synth_ai/cli/commands/status/subcommands/runs.py +34 -0
  55. synth_ai/cli/commands/status/subcommands/session.py +77 -0
  56. synth_ai/cli/commands/status/subcommands/summary.py +39 -0
  57. synth_ai/cli/commands/status/subcommands/utils.py +41 -0
  58. synth_ai/cli/commands/status/utils.py +23 -0
  59. synth_ai/cli/commands/train/__init__.py +51 -0
  60. synth_ai/cli/commands/train/core.py +22 -0
  61. synth_ai/cli/commands/train/errors.py +117 -0
  62. synth_ai/cli/commands/train/prompt_learning_validation.py +632 -0
  63. synth_ai/cli/commands/train/validation.py +392 -0
  64. synth_ai/cli/commands/train/verifier_schemas.py +200 -0
  65. synth_ai/cli/commands/train/verifier_validation.py +235 -0
  66. synth_ai/cli/demo_apps/__init__.py +10 -0
  67. synth_ai/cli/demo_apps/core/__init__.py +28 -0
  68. synth_ai/cli/demo_apps/core/cli.py +1735 -0
  69. synth_ai/cli/demo_apps/crafter/crafter_fft_4b.toml +55 -0
  70. synth_ai/cli/demo_apps/crafter/grpo_crafter_task_app.py +186 -0
  71. synth_ai/cli/demo_apps/crafter/rl_from_base_qwen4b.toml +74 -0
  72. synth_ai/cli/demo_apps/demo_registry.py +176 -0
  73. synth_ai/cli/demo_apps/demo_task_apps/core.py +440 -0
  74. synth_ai/cli/demo_apps/demo_task_apps/crafter/__init__.py +1 -0
  75. synth_ai/cli/demo_apps/demo_task_apps/crafter/grpo_crafter_task_app.py +185 -0
  76. synth_ai/cli/demo_apps/demo_task_apps/math/config.toml +73 -0
  77. synth_ai/cli/demo_apps/demo_task_apps/math/modal_task_app.py +738 -0
  78. synth_ai/cli/demo_apps/demo_task_apps/math/task_app_entry.py +39 -0
  79. synth_ai/cli/demo_apps/math/__init__.py +1 -0
  80. synth_ai/cli/demo_apps/math/_common.py +16 -0
  81. synth_ai/cli/demo_apps/math/app.py +38 -0
  82. synth_ai/cli/demo_apps/math/config.toml +75 -0
  83. synth_ai/cli/demo_apps/math/deploy_modal.py +54 -0
  84. synth_ai/cli/demo_apps/math/modal_task_app.py +698 -0
  85. synth_ai/cli/demo_apps/math/task_app_entry.py +53 -0
  86. synth_ai/cli/demo_apps/mipro/main.py +271 -0
  87. synth_ai/cli/demo_apps/mipro/task_app.py +911 -0
  88. synth_ai/cli/demo_apps/mipro/train_cfg.toml +92 -0
  89. synth_ai/cli/demos/__init__.py +12 -0
  90. synth_ai/cli/demos/demo.py +32 -0
  91. synth_ai/cli/demos/rl_demo.py +254 -0
  92. synth_ai/cli/deploy.py +216 -0
  93. synth_ai/cli/infra/__init__.py +14 -0
  94. synth_ai/cli/infra/balance.py +216 -0
  95. synth_ai/cli/infra/mcp.py +35 -0
  96. synth_ai/cli/infra/modal_app.py +36 -0
  97. synth_ai/cli/infra/setup.py +69 -0
  98. synth_ai/cli/infra/status.py +16 -0
  99. synth_ai/cli/infra/turso.py +77 -0
  100. synth_ai/cli/lib/__init__.py +10 -0
  101. synth_ai/cli/lib/agents.py +76 -0
  102. synth_ai/cli/lib/apps/modal_app.py +101 -0
  103. synth_ai/cli/lib/apps/task_app.py +642 -0
  104. synth_ai/cli/lib/bin.py +39 -0
  105. synth_ai/cli/lib/env.py +375 -0
  106. synth_ai/cli/lib/errors.py +85 -0
  107. synth_ai/cli/lib/modal.py +315 -0
  108. synth_ai/cli/lib/plotting.py +126 -0
  109. synth_ai/cli/lib/prompt_args.py +39 -0
  110. synth_ai/cli/lib/prompts.py +284 -0
  111. synth_ai/cli/lib/sqld.py +122 -0
  112. synth_ai/cli/lib/task_app_discovery.py +884 -0
  113. synth_ai/cli/lib/task_app_env.py +295 -0
  114. synth_ai/cli/lib/train_cfgs.py +300 -0
  115. synth_ai/cli/lib/tunnel_records.py +207 -0
  116. synth_ai/cli/local/__init__.py +14 -0
  117. synth_ai/cli/local/experiment_queue/__init__.py +72 -0
  118. synth_ai/cli/local/experiment_queue/api_schemas.py +221 -0
  119. synth_ai/cli/local/experiment_queue/celery_app.py +208 -0
  120. synth_ai/cli/local/experiment_queue/config.py +128 -0
  121. synth_ai/cli/local/experiment_queue/config_utils.py +272 -0
  122. synth_ai/cli/local/experiment_queue/database.py +175 -0
  123. synth_ai/cli/local/experiment_queue/dispatcher.py +119 -0
  124. synth_ai/cli/local/experiment_queue/models.py +231 -0
  125. synth_ai/cli/local/experiment_queue/progress_info.py +160 -0
  126. synth_ai/cli/local/experiment_queue/results.py +373 -0
  127. synth_ai/cli/local/experiment_queue/schemas.py +131 -0
  128. synth_ai/cli/local/experiment_queue/service.py +344 -0
  129. synth_ai/cli/local/experiment_queue/status.py +372 -0
  130. synth_ai/cli/local/experiment_queue/status_tracker.py +360 -0
  131. synth_ai/cli/local/experiment_queue/tasks.py +1984 -0
  132. synth_ai/cli/local/experiment_queue/trace_storage.py +65 -0
  133. synth_ai/cli/local/experiment_queue/validation.py +157 -0
  134. synth_ai/cli/local/session/__init__.py +92 -0
  135. synth_ai/cli/local/session/client.py +383 -0
  136. synth_ai/cli/local/session/constants.py +63 -0
  137. synth_ai/cli/local/session/exceptions.py +105 -0
  138. synth_ai/cli/local/session/manager.py +139 -0
  139. synth_ai/cli/local/session/models.py +89 -0
  140. synth_ai/cli/local/session/query.py +110 -0
  141. synth_ai/cli/root.py +30 -6
  142. synth_ai/cli/task_apps/__init__.py +37 -0
  143. synth_ai/cli/task_apps/commands.py +3145 -0
  144. synth_ai/cli/task_apps/deploy.py +7 -0
  145. synth_ai/cli/task_apps/list.py +26 -0
  146. synth_ai/cli/task_apps/main.py +36 -0
  147. synth_ai/cli/task_apps/modal_serve.py +11 -0
  148. synth_ai/cli/task_apps/serve.py +11 -0
  149. synth_ai/cli/training/__init__.py +8 -0
  150. synth_ai/cli/training/train.py +5 -0
  151. synth_ai/cli/training/train_cfg.py +34 -0
  152. synth_ai/cli/training/watch.py +506 -0
  153. synth_ai/cli/turso.py +34 -55
  154. synth_ai/cli/utils/__init__.py +8 -0
  155. synth_ai/cli/utils/experiments.py +235 -0
  156. synth_ai/cli/utils/queue.py +504 -0
  157. synth_ai/cli/utils/recent.py +133 -0
  158. synth_ai/cli/utils/traces.py +164 -0
  159. synth_ai/contracts/__init__.py +67 -0
  160. synth_ai/core/__init__.py +100 -0
  161. synth_ai/core/_utils/__init__.py +54 -0
  162. synth_ai/core/_utils/base_url.py +10 -0
  163. synth_ai/core/_utils/http.py +10 -0
  164. synth_ai/core/_utils/prompts.py +14 -0
  165. synth_ai/core/_utils/task_app_state.py +12 -0
  166. synth_ai/core/_utils/user_config.py +10 -0
  167. synth_ai/core/apps/common.py +116 -0
  168. synth_ai/core/auth.py +95 -0
  169. synth_ai/core/cfgs.py +240 -0
  170. synth_ai/core/config/__init__.py +16 -0
  171. synth_ai/core/config/base.py +168 -0
  172. synth_ai/core/config/resolver.py +89 -0
  173. synth_ai/core/env.py +231 -0
  174. synth_ai/core/errors.py +125 -0
  175. synth_ai/core/http.py +230 -0
  176. synth_ai/core/integrations/__init__.py +11 -0
  177. synth_ai/core/integrations/cloudflare.py +1886 -0
  178. synth_ai/core/integrations/mcp/__init__.py +6 -0
  179. synth_ai/core/integrations/mcp/__main__.py +8 -0
  180. synth_ai/core/integrations/mcp/claude.py +36 -0
  181. synth_ai/core/integrations/mcp/main.py +254 -0
  182. synth_ai/core/integrations/mcp/setup.py +100 -0
  183. synth_ai/core/integrations/modal.py +277 -0
  184. synth_ai/core/json.py +72 -0
  185. synth_ai/core/log_filter.py +99 -0
  186. synth_ai/core/logging.py +82 -0
  187. synth_ai/core/paths.py +107 -0
  188. synth_ai/core/pricing.py +109 -0
  189. synth_ai/core/process.py +233 -0
  190. synth_ai/core/ssl.py +25 -0
  191. synth_ai/core/storage/__init__.py +71 -0
  192. synth_ai/core/task_app_state.py +318 -0
  193. synth_ai/core/telemetry.py +282 -0
  194. synth_ai/core/tracing_v3/__init__.py +99 -0
  195. synth_ai/core/tracing_v3/abstractions.py +348 -0
  196. synth_ai/core/tracing_v3/config.py +229 -0
  197. synth_ai/core/tracing_v3/constants.py +21 -0
  198. synth_ai/core/tracing_v3/db_config.py +182 -0
  199. synth_ai/core/tracing_v3/decorators.py +401 -0
  200. synth_ai/core/tracing_v3/llm_call_record_helpers.py +437 -0
  201. synth_ai/core/tracing_v3/migration_helper.py +119 -0
  202. synth_ai/core/tracing_v3/session_tracer.py +542 -0
  203. synth_ai/core/tracing_v3/storage/base.py +211 -0
  204. synth_ai/core/tracing_v3/storage/config.py +109 -0
  205. synth_ai/core/tracing_v3/storage/factory.py +39 -0
  206. synth_ai/core/tracing_v3/trace_utils.py +326 -0
  207. synth_ai/core/tracing_v3/turso/daemon.py +278 -0
  208. synth_ai/core/tracing_v3/turso/models.py +470 -0
  209. synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
  210. synth_ai/core/tracing_v3/utils.py +108 -0
  211. synth_ai/core/urls.py +18 -0
  212. synth_ai/core/user_config.py +137 -0
  213. synth_ai/core/uvicorn.py +222 -0
  214. synth_ai/data/__init__.py +83 -0
  215. synth_ai/data/enums.py +122 -0
  216. synth_ai/data/rewards.py +249 -0
  217. synth_ai/data/traces.py +35 -0
  218. synth_ai/products/__init__.py +6 -0
  219. synth_ai/products/graph_evolve/__init__.py +45 -0
  220. synth_ai/products/graph_evolve/client.py +226 -0
  221. synth_ai/products/graph_evolve/config.py +591 -0
  222. synth_ai/products/graph_evolve/converters/__init__.py +42 -0
  223. synth_ai/products/graph_evolve/converters/openai_sft.py +484 -0
  224. synth_ai/products/graph_evolve/examples/hotpotqa/config.toml +109 -0
  225. synth_ai/products/graph_evolve/run.py +222 -0
  226. synth_ai/products/graph_gepa/__init__.py +23 -0
  227. synth_ai/products/graph_gepa/converters/__init__.py +19 -0
  228. synth_ai/products/graph_gepa/converters/openai_sft.py +29 -0
  229. synth_ai/sdk/__init__.py +129 -0
  230. synth_ai/sdk/api/__init__.py +1 -0
  231. synth_ai/sdk/api/eval/__init__.py +33 -0
  232. synth_ai/sdk/api/eval/job.py +732 -0
  233. synth_ai/sdk/api/models/supported.py +514 -0
  234. synth_ai/sdk/api/research_agent/__init__.py +296 -0
  235. synth_ai/sdk/api/train/__init__.py +85 -0
  236. synth_ai/sdk/api/train/builders.py +1076 -0
  237. synth_ai/sdk/api/train/cli.py +2196 -0
  238. synth_ai/sdk/api/train/config_finder.py +267 -0
  239. synth_ai/sdk/api/train/configs/__init__.py +67 -0
  240. synth_ai/sdk/api/train/configs/prompt_learning.py +1800 -0
  241. synth_ai/sdk/api/train/configs/rl.py +436 -0
  242. synth_ai/sdk/api/train/configs/sft.py +263 -0
  243. synth_ai/sdk/api/train/configs/shared.py +81 -0
  244. synth_ai/sdk/api/train/context_learning.py +312 -0
  245. synth_ai/sdk/api/train/env_resolver.py +418 -0
  246. synth_ai/sdk/api/train/graph_validators.py +216 -0
  247. synth_ai/sdk/api/train/graphgen.py +1102 -0
  248. synth_ai/sdk/api/train/graphgen_models.py +873 -0
  249. synth_ai/sdk/api/train/graphgen_validators.py +109 -0
  250. synth_ai/sdk/api/train/local_api.py +10 -0
  251. synth_ai/sdk/api/train/pollers.py +160 -0
  252. synth_ai/sdk/api/train/progress/__init__.py +97 -0
  253. synth_ai/sdk/api/train/progress/dataclasses.py +569 -0
  254. synth_ai/sdk/api/train/progress/events.py +326 -0
  255. synth_ai/sdk/api/train/progress/results.py +428 -0
  256. synth_ai/sdk/api/train/progress/tracker.py +641 -0
  257. synth_ai/sdk/api/train/prompt_learning.py +800 -0
  258. synth_ai/sdk/api/train/rl.py +478 -0
  259. synth_ai/sdk/api/train/sft.py +398 -0
  260. synth_ai/sdk/api/train/summary.py +522 -0
  261. synth_ai/sdk/api/train/supported_algos.py +147 -0
  262. synth_ai/sdk/api/train/task_app.py +351 -0
  263. synth_ai/sdk/api/train/utils.py +279 -0
  264. synth_ai/sdk/api/train/validators.py +2424 -0
  265. synth_ai/sdk/graphs/__init__.py +15 -0
  266. synth_ai/sdk/graphs/completions.py +776 -0
  267. synth_ai/sdk/graphs/verifier_schemas.py +222 -0
  268. synth_ai/sdk/inference/__init__.py +6 -0
  269. synth_ai/sdk/inference/client.py +128 -0
  270. synth_ai/sdk/jobs/__init__.py +16 -0
  271. synth_ai/sdk/jobs/client.py +371 -0
  272. synth_ai/sdk/learning/__init__.py +99 -0
  273. synth_ai/sdk/learning/client.py +240 -0
  274. synth_ai/sdk/learning/context_learning_client.py +531 -0
  275. synth_ai/sdk/learning/context_learning_types.py +294 -0
  276. synth_ai/sdk/learning/ft_client.py +7 -0
  277. synth_ai/sdk/learning/health.py +49 -0
  278. synth_ai/sdk/learning/jobs.py +202 -0
  279. synth_ai/sdk/learning/prompt_extraction.py +334 -0
  280. synth_ai/sdk/learning/prompt_learning_client.py +455 -0
  281. synth_ai/sdk/learning/prompt_learning_types.py +186 -0
  282. synth_ai/sdk/learning/rl/__init__.py +35 -0
  283. synth_ai/sdk/learning/rl/client.py +268 -0
  284. synth_ai/sdk/learning/rl/contracts.py +23 -0
  285. synth_ai/sdk/learning/rl/env_keys.py +166 -0
  286. synth_ai/sdk/learning/rl/secrets.py +13 -0
  287. synth_ai/sdk/learning/sft/client.py +95 -0
  288. synth_ai/sdk/learning/sft/config.py +270 -0
  289. synth_ai/sdk/learning/sft/data.py +698 -0
  290. synth_ai/sdk/learning/validators.py +52 -0
  291. synth_ai/sdk/localapi/__init__.py +40 -0
  292. synth_ai/sdk/localapi/apps/__init__.py +28 -0
  293. synth_ai/sdk/localapi/client.py +10 -0
  294. synth_ai/sdk/localapi/contracts.py +10 -0
  295. synth_ai/sdk/localapi/helpers.py +519 -0
  296. synth_ai/sdk/localapi/rollouts.py +93 -0
  297. synth_ai/sdk/localapi/server.py +29 -0
  298. synth_ai/sdk/localapi/template.py +49 -0
  299. synth_ai/sdk/streaming/__init__.py +35 -0
  300. synth_ai/sdk/streaming/config.py +94 -0
  301. synth_ai/sdk/streaming/handlers.py +1997 -0
  302. synth_ai/sdk/streaming/streamer.py +708 -0
  303. synth_ai/sdk/streaming/types.py +112 -0
  304. synth_ai/sdk/task/__init__.py +164 -0
  305. synth_ai/sdk/task/apps/__init__.py +169 -0
  306. synth_ai/sdk/task/client.py +175 -0
  307. synth_ai/sdk/task/config.py +256 -0
  308. synth_ai/sdk/task/contracts.py +340 -0
  309. synth_ai/sdk/task/datasets.py +108 -0
  310. synth_ai/sdk/task/in_process.py +1200 -0
  311. synth_ai/sdk/task/in_process_runner.py +314 -0
  312. synth_ai/sdk/task/inference_api.py +299 -0
  313. synth_ai/sdk/task/proxy.py +287 -0
  314. synth_ai/sdk/task/rubrics/__init__.py +54 -0
  315. synth_ai/sdk/task/rubrics/loaders.py +156 -0
  316. synth_ai/sdk/task/rubrics/strict.py +148 -0
  317. synth_ai/sdk/task/rubrics.py +219 -0
  318. synth_ai/sdk/task/server.py +640 -0
  319. synth_ai/sdk/task/trace_correlation_helpers.py +557 -0
  320. synth_ai/sdk/task/tracing_utils.py +95 -0
  321. synth_ai/sdk/task/validators.py +441 -0
  322. synth_ai/sdk/training/__init__.py +93 -0
  323. synth_ai/sdk/tunnels/__init__.py +118 -0
  324. synth_ai/sdk/tunnels/cleanup.py +83 -0
  325. synth_ai/sdk/tunnels/ports.py +120 -0
  326. synth_ai/sdk/tunnels/tunneled_api.py +363 -0
  327. synth_ai/utils/__init__.py +213 -0
  328. synth_ai-0.4.4.dist-info/METADATA +262 -0
  329. synth_ai-0.4.4.dist-info/RECORD +369 -0
  330. synth_ai-0.4.4.dist-info/top_level.txt +1 -0
  331. examples/__init__.py +0 -16
  332. examples/analyze_semantic_words.sh +0 -17
  333. examples/crafter_debug_render.py +0 -186
  334. examples/dev/qwen3_32b_qlora_4xh100.toml +0 -40
  335. examples/multi_step/configs/README_verilog_rl.md +0 -77
  336. examples/multi_step/configs/VERILOG_REWARDS.md +0 -90
  337. examples/multi_step/configs/VERILOG_RL_CHECKLIST.md +0 -183
  338. examples/multi_step/configs/crafter_eval_synth_qwen4b.toml +0 -35
  339. examples/multi_step/configs/crafter_eval_text_only_groq_qwen32b.toml +0 -36
  340. examples/multi_step/configs/crafter_rl_outcome.toml +0 -74
  341. examples/multi_step/configs/crafter_rl_stepwise_hosted_judge.toml +0 -187
  342. examples/multi_step/configs/crafter_rl_stepwise_shaped.toml +0 -83
  343. examples/multi_step/configs/crafter_rl_stepwise_simple.toml +0 -78
  344. examples/multi_step/configs/crafter_synth_backend.md +0 -40
  345. examples/multi_step/configs/verilog_eval_groq_qwen32b.toml +0 -31
  346. examples/multi_step/configs/verilog_eval_synth_qwen8b.toml +0 -33
  347. examples/multi_step/configs/verilog_rl_lora.toml +0 -190
  348. examples/multi_step/crafter_rl_lora.md +0 -70
  349. examples/multi_step/judges/crafter_backend_judge.py +0 -220
  350. examples/multi_step/judges/verilog_backend_judge.py +0 -234
  351. examples/multi_step/readme.md +0 -48
  352. examples/multi_step/sse_metrics_streaming_notes.md +0 -357
  353. examples/multi_step/task_app_config_notes.md +0 -494
  354. examples/multi_step/verilog_rl_lora.md +0 -218
  355. examples/qwen_coder/README.md +0 -102
  356. examples/qwen_coder/_shared.py +0 -113
  357. examples/qwen_coder/configs/coder_lora_30b.toml +0 -61
  358. examples/qwen_coder/configs/coder_lora_4b.toml +0 -57
  359. examples/qwen_coder/configs/coder_lora_small.toml +0 -58
  360. examples/qwen_coder/generate_dataset.py +0 -98
  361. examples/qwen_coder/infer_ft_smoke.py +0 -65
  362. examples/qwen_coder/infer_prod_proxy.py +0 -73
  363. examples/qwen_coder/infer_via_synth.py +0 -87
  364. examples/qwen_coder/scripts/infer_coder.sh +0 -19
  365. examples/qwen_coder/scripts/train_coder_30b.sh +0 -22
  366. examples/qwen_coder/sft_full_17b.py +0 -103
  367. examples/qwen_coder/sft_lora_30b.py +0 -110
  368. examples/qwen_coder/subset_jsonl.py +0 -39
  369. examples/qwen_coder/todos.md +0 -38
  370. examples/qwen_coder/validate_jsonl.py +0 -60
  371. examples/rl/README.md +0 -169
  372. examples/rl/download_dataset.py +0 -80
  373. examples/run_crafter_demo.sh +0 -10
  374. examples/sft/README.md +0 -139
  375. examples/sft/configs/crafter_fft_qwen0p6b.toml +0 -44
  376. examples/sft/configs/crafter_lora_qwen0p6b.toml +0 -45
  377. examples/sft/evaluate.py +0 -119
  378. examples/sft/export_dataset.py +0 -117
  379. examples/sft/generate_traces.py +0 -164
  380. examples/swe/__init__.py +0 -12
  381. examples/swe/task_app/README.md +0 -105
  382. examples/swe/task_app/__init__.py +0 -2
  383. examples/swe/task_app/grpo_swe_mini.py +0 -601
  384. examples/swe/task_app/grpo_swe_mini_task_app.py +0 -136
  385. examples/swe/task_app/hosted/README.md +0 -173
  386. examples/swe/task_app/hosted/__init__.py +0 -5
  387. examples/swe/task_app/hosted/branching.py +0 -143
  388. examples/swe/task_app/hosted/environment_routes.py +0 -1289
  389. examples/swe/task_app/hosted/envs/__init__.py +0 -1
  390. examples/swe/task_app/hosted/envs/crafter/__init__.py +0 -6
  391. examples/swe/task_app/hosted/envs/crafter/app.py +0 -1
  392. examples/swe/task_app/hosted/envs/crafter/environment.py +0 -522
  393. examples/swe/task_app/hosted/envs/crafter/policy.py +0 -478
  394. examples/swe/task_app/hosted/envs/crafter/react_agent.py +0 -108
  395. examples/swe/task_app/hosted/envs/crafter/shared.py +0 -305
  396. examples/swe/task_app/hosted/envs/crafter/tools.py +0 -47
  397. examples/swe/task_app/hosted/envs/mini_swe/__init__.py +0 -8
  398. examples/swe/task_app/hosted/envs/mini_swe/environment.py +0 -1164
  399. examples/swe/task_app/hosted/envs/mini_swe/policy.py +0 -355
  400. examples/swe/task_app/hosted/envs/mini_swe/shared.py +0 -83
  401. examples/swe/task_app/hosted/envs/mini_swe/tools.py +0 -96
  402. examples/swe/task_app/hosted/hosted_app.py +0 -204
  403. examples/swe/task_app/hosted/inference/__init__.py +0 -5
  404. examples/swe/task_app/hosted/inference/openai_client.py +0 -618
  405. examples/swe/task_app/hosted/main.py +0 -100
  406. examples/swe/task_app/hosted/policy_routes.py +0 -1079
  407. examples/swe/task_app/hosted/registry.py +0 -195
  408. examples/swe/task_app/hosted/rollout.py +0 -1911
  409. examples/swe/task_app/hosted/storage/__init__.py +0 -5
  410. examples/swe/task_app/hosted/storage/volume.py +0 -211
  411. examples/swe/task_app/hosted/test_agents.py +0 -161
  412. examples/swe/task_app/hosted/test_service.py +0 -136
  413. examples/swe/task_app/hosted/utils.py +0 -62
  414. examples/task_apps/IMAGE_ONLY_EVAL_QUICKSTART.md +0 -258
  415. examples/task_apps/TESTING.md +0 -275
  416. examples/task_apps/crafter/CREATE_SFT_DATASET.md +0 -273
  417. examples/task_apps/crafter/EVAL_IMAGE_ONLY_RESULTS.md +0 -152
  418. examples/task_apps/crafter/FILTER_COMMAND_STATUS.md +0 -174
  419. examples/task_apps/crafter/FILTER_COMMAND_SUCCESS.md +0 -268
  420. examples/task_apps/crafter/QUERY_EXAMPLES.md +0 -203
  421. examples/task_apps/crafter/README_IMAGE_ONLY_EVAL.md +0 -316
  422. examples/task_apps/crafter/__init__.py +0 -0
  423. examples/task_apps/crafter/eval_image_only_gpt4o.toml +0 -28
  424. examples/task_apps/crafter/eval_text_only_groq_llama.toml +0 -36
  425. examples/task_apps/crafter/filter_sft_dataset.toml +0 -16
  426. examples/task_apps/crafter/task_app/README.md +0 -42
  427. examples/task_apps/crafter/task_app/__init__.py +0 -5
  428. examples/task_apps/crafter/task_app/grpo_crafter.py +0 -973
  429. examples/task_apps/crafter/task_app/grpo_crafter_task_app.py +0 -146
  430. examples/task_apps/crafter/task_app/synth_envs_hosted/README.md +0 -173
  431. examples/task_apps/crafter/task_app/synth_envs_hosted/__init__.py +0 -5
  432. examples/task_apps/crafter/task_app/synth_envs_hosted/branching.py +0 -143
  433. examples/task_apps/crafter/task_app/synth_envs_hosted/environment_routes.py +0 -1226
  434. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/__init__.py +0 -1
  435. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/__init__.py +0 -6
  436. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/app.py +0 -1
  437. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/environment.py +0 -532
  438. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/policy.py +0 -547
  439. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/react_agent.py +0 -123
  440. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/shared.py +0 -305
  441. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/tools.py +0 -47
  442. examples/task_apps/crafter/task_app/synth_envs_hosted/hosted_app.py +0 -204
  443. examples/task_apps/crafter/task_app/synth_envs_hosted/inference/__init__.py +0 -5
  444. examples/task_apps/crafter/task_app/synth_envs_hosted/inference/openai_client.py +0 -704
  445. examples/task_apps/crafter/task_app/synth_envs_hosted/main.py +0 -100
  446. examples/task_apps/crafter/task_app/synth_envs_hosted/policy_routes.py +0 -1152
  447. examples/task_apps/crafter/task_app/synth_envs_hosted/registry.py +0 -195
  448. examples/task_apps/crafter/task_app/synth_envs_hosted/rollout.py +0 -2160
  449. examples/task_apps/crafter/task_app/synth_envs_hosted/storage/__init__.py +0 -5
  450. examples/task_apps/crafter/task_app/synth_envs_hosted/storage/volume.py +0 -211
  451. examples/task_apps/crafter/task_app/synth_envs_hosted/test_agents.py +0 -161
  452. examples/task_apps/crafter/task_app/synth_envs_hosted/test_service.py +0 -136
  453. examples/task_apps/crafter/task_app/synth_envs_hosted/utils.py +0 -218
  454. examples/task_apps/dev/pokemon_emerald/__init__.py +0 -2
  455. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/README.md +0 -811
  456. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/__init__.py +0 -120
  457. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/action.py +0 -160
  458. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/memory.py +0 -155
  459. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/perception.py +0 -69
  460. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/planning.py +0 -96
  461. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/simple.py +0 -1502
  462. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/system_prompt.py +0 -4
  463. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/grab_map.py +0 -68
  464. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/manual.py +0 -216
  465. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/__init__.py +0 -35
  466. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/emerald_utils.py +0 -631
  467. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/emulator.py +0 -1544
  468. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/enums.py +0 -1428
  469. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/memory_reader.py +0 -4848
  470. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/types.py +0 -41
  471. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/utils.py +0 -298
  472. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pyproject.toml +0 -95
  473. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/run.py +0 -204
  474. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/__init__.py +0 -0
  475. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/app.py +0 -2152
  476. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/client.py +0 -429
  477. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/frame_server.py +0 -155
  478. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/README.md +0 -78
  479. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/__init__.py +0 -0
  480. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/run_tests.py +0 -122
  481. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_agent_direct.py +0 -76
  482. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_agent_prompts.py +0 -413
  483. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_battle_state_formatting.py +0 -204
  484. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_dialogue_detection.py +0 -133
  485. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_dialogue_detection_comprehensive.py +0 -229
  486. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_direct_agent_emulator.py +0 -300
  487. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_fps_adjustment_pytest.py +0 -205
  488. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_house_to_outside_direct.py +0 -200
  489. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_house_to_outside_transition.py +0 -284
  490. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_map_ground_truth_comparison.py +0 -468
  491. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_memory_map.py +0 -575
  492. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_server_map_validation.py +0 -311
  493. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_torchic_state.py +0 -259
  494. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/__init__.py +0 -0
  495. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/anticheat.py +0 -372
  496. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/checkpoint.py +0 -296
  497. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/error_handler.py +0 -275
  498. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/get_local_ip.py +0 -22
  499. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/helpers.py +0 -44
  500. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/llm_logger.py +0 -514
  501. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_formatter.py +0 -415
  502. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_stitcher.py +0 -1763
  503. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_stitcher_singleton.py +0 -33
  504. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_trimmer.py +0 -106
  505. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_visualizer.py +0 -334
  506. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/ocr_dialogue.py +0 -1020
  507. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/recording.py +0 -188
  508. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/state_formatter.py +0 -1481
  509. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/vlm.py +0 -862
  510. examples/task_apps/dev/pokemon_emerald/modal_app.py +0 -114
  511. examples/task_apps/dev/pokemon_emerald/task_app/README.md +0 -81
  512. examples/task_apps/dev/pokemon_emerald/task_app/__init__.py +0 -6
  513. examples/task_apps/dev/pokemon_emerald/task_app/pokemon_emerald.py +0 -685
  514. examples/task_apps/enron/__init__.py +0 -1
  515. examples/task_apps/enron/eval_groq_qwen32.toml +0 -16
  516. examples/task_apps/enron/filter_sft.toml +0 -5
  517. examples/task_apps/enron/task_app/README.md +0 -14
  518. examples/task_apps/enron/task_app/__init__.py +0 -1
  519. examples/task_apps/enron/task_app/grpo_enron.py +0 -906
  520. examples/task_apps/enron/task_app/grpo_enron_task_app.py +0 -146
  521. examples/task_apps/enron/tests/__init__.py +0 -4
  522. examples/task_apps/enron/tests/conftest.py +0 -115
  523. examples/task_apps/enron/tests/integration/__init__.py +0 -4
  524. examples/task_apps/enron/tests/integration/test_enron_eval.py +0 -179
  525. examples/task_apps/enron/tests/integration/test_enron_rollout.py +0 -135
  526. examples/task_apps/enron/tests/unit/__init__.py +0 -4
  527. examples/task_apps/enron/tests/unit/test_enron_environment.py +0 -126
  528. examples/task_apps/math/README.md +0 -22
  529. examples/task_apps/math/__init__.py +0 -0
  530. examples/task_apps/math/math_single_step.py +0 -1000
  531. examples/task_apps/math/math_task_app.py +0 -115
  532. examples/task_apps/pokemon_battle/__init__.py +0 -2
  533. examples/task_apps/pokemon_battle/modal_app.py +0 -104
  534. examples/task_apps/pokemon_battle/task_app/README.md +0 -68
  535. examples/task_apps/pokemon_battle/task_app/__init__.py +0 -6
  536. examples/task_apps/pokemon_battle/task_app/pokemon_showdown.py +0 -932
  537. examples/task_apps/pokemon_red/EVAL_IMAGE_ONLY_COMPLETE.md +0 -283
  538. examples/task_apps/pokemon_red/EVAL_IMAGE_ONLY_STATUS.md +0 -155
  539. examples/task_apps/pokemon_red/README.md +0 -357
  540. examples/task_apps/pokemon_red/README_IMAGE_ONLY_EVAL.md +0 -415
  541. examples/task_apps/pokemon_red/__init__.py +0 -3
  542. examples/task_apps/pokemon_red/eval_image_only_gpt4o.toml +0 -29
  543. examples/task_apps/pokemon_red/eval_pokemon_red_policy.py +0 -225
  544. examples/task_apps/pokemon_red/pallet_town_rl_config.toml +0 -75
  545. examples/task_apps/pokemon_red/task_app.py +0 -799
  546. examples/task_apps/pokemon_red/test_pallet_town_rewards.py +0 -193
  547. examples/task_apps/sokoban/README.md +0 -307
  548. examples/task_apps/sokoban/__init__.py +0 -3
  549. examples/task_apps/sokoban/eval_groq_qwen32.toml +0 -16
  550. examples/task_apps/sokoban/eval_openai_gpt5.toml +0 -16
  551. examples/task_apps/sokoban/filter_sft.toml +0 -5
  552. examples/task_apps/sokoban/task_app.py +0 -1058
  553. examples/task_apps/sokoban/tests/__init__.py +0 -4
  554. examples/task_apps/sokoban/tests/conftest.py +0 -113
  555. examples/task_apps/sokoban/tests/integration/__init__.py +0 -4
  556. examples/task_apps/sokoban/tests/integration/test_sokoban_eval.py +0 -57
  557. examples/task_apps/sokoban/tests/integration/test_sokoban_rollout.py +0 -198
  558. examples/task_apps/sokoban/tests/unit/__init__.py +0 -4
  559. examples/task_apps/sokoban/tests/unit/test_sokoban_environment.py +0 -114
  560. examples/task_apps/verilog/__init__.py +0 -1
  561. examples/task_apps/verilog/eval_groq_qwen32b.toml +0 -24
  562. examples/task_apps/verilog/filter_sft.toml +0 -5
  563. examples/task_apps/verilog/task_app/README.md +0 -12
  564. examples/task_apps/verilog/task_app/__init__.py +0 -1
  565. examples/task_apps/verilog/task_app/grpo_verilog.py +0 -1166
  566. examples/task_apps/verilog/task_app/grpo_verilog_task_app.py +0 -145
  567. examples/task_apps/verilog/tests/__init__.py +0 -4
  568. examples/task_apps/verilog/tests/conftest.py +0 -115
  569. examples/task_apps/verilog/tests/integration/__init__.py +0 -4
  570. examples/task_apps/verilog/tests/integration/test_verilog_eval.py +0 -181
  571. examples/task_apps/verilog/tests/integration/test_verilog_rollout.py +0 -55
  572. examples/task_apps/verilog/tests/unit/__init__.py +0 -4
  573. examples/task_apps/verilog/tests/unit/test_verilog_scoring.py +0 -118
  574. examples/vlm/PROPOSAL.md +0 -53
  575. examples/vlm/README.md +0 -68
  576. examples/vlm/configs/crafter_vlm_gpt4o.toml +0 -44
  577. examples/vlm/crafter_image_only_agent.py +0 -207
  578. examples/vlm/crafter_openai_vlm_agent.py +0 -277
  579. examples/vlm/filter_image_rows.py +0 -63
  580. examples/vlm/run_crafter_vlm_benchmark.py +0 -316
  581. examples/warming_up_to_rl/analyze_trace_db.py +0 -422
  582. examples/warming_up_to_rl/configs/crafter_fft.toml +0 -48
  583. examples/warming_up_to_rl/configs/crafter_fft_4b.toml +0 -54
  584. examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml +0 -20
  585. examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml +0 -13
  586. examples/warming_up_to_rl/configs/eval_modal_qwen4b.toml +0 -23
  587. examples/warming_up_to_rl/configs/eval_stepwise_complex.toml +0 -35
  588. examples/warming_up_to_rl/configs/eval_stepwise_consistent.toml +0 -26
  589. examples/warming_up_to_rl/configs/eval_stepwise_per_achievement.toml +0 -36
  590. examples/warming_up_to_rl/configs/eval_stepwise_simple.toml +0 -32
  591. examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +0 -83
  592. examples/warming_up_to_rl/configs/rl_from_ft.toml +0 -56
  593. examples/warming_up_to_rl/export_trace_sft.py +0 -723
  594. examples/warming_up_to_rl/groq_test.py +0 -97
  595. examples/warming_up_to_rl/manage_secrets.py +0 -131
  596. examples/warming_up_to_rl/old/event_rewards.md +0 -234
  597. examples/warming_up_to_rl/old/notes.md +0 -73
  598. examples/warming_up_to_rl/readme.md +0 -179
  599. examples/warming_up_to_rl/run_eval.py +0 -736
  600. examples/warming_up_to_rl/run_fft_and_save.py +0 -380
  601. examples/warming_up_to_rl/run_local_rollout.py +0 -239
  602. examples/warming_up_to_rl/run_local_rollout_modal.py +0 -248
  603. examples/warming_up_to_rl/run_local_rollout_parallel.py +0 -405
  604. examples/warming_up_to_rl/run_local_rollout_traced.py +0 -477
  605. examples/warming_up_to_rl/run_rl_and_save.py +0 -124
  606. examples/warming_up_to_rl/run_rollout_remote.py +0 -156
  607. examples/workflows/__init__.py +0 -0
  608. examples/workflows/math_rl/__init__.py +0 -0
  609. examples/workflows/math_rl/configs/eval_base_qwen.toml +0 -15
  610. examples/workflows/math_rl/configs/eval_rl_qwen.toml +0 -11
  611. examples/workflows/math_rl/configs/rl_from_base_qwen.toml +0 -35
  612. examples/workflows/math_rl/configs/rl_from_base_qwen17.toml +0 -74
  613. examples/workflows/math_rl/configs/rl_from_ft_qwen.toml +0 -35
  614. examples/workflows/math_rl/download_dataset.py +0 -80
  615. examples/workflows/math_rl/run_eval.py +0 -436
  616. examples/workflows/math_rl/run_rl_and_save.py +0 -111
  617. synth_ai/api/models/supported.py +0 -377
  618. synth_ai/api/train/__init__.py +0 -5
  619. synth_ai/api/train/builders.py +0 -351
  620. synth_ai/api/train/cli.py +0 -635
  621. synth_ai/api/train/config_finder.py +0 -228
  622. synth_ai/api/train/configs/__init__.py +0 -44
  623. synth_ai/api/train/configs/rl.py +0 -134
  624. synth_ai/api/train/configs/sft.py +0 -95
  625. synth_ai/api/train/configs/shared.py +0 -24
  626. synth_ai/api/train/env_resolver.py +0 -349
  627. synth_ai/api/train/pollers.py +0 -75
  628. synth_ai/api/train/supported_algos.py +0 -147
  629. synth_ai/api/train/task_app.py +0 -195
  630. synth_ai/api/train/utils.py +0 -225
  631. synth_ai/cli/_modal_wrapper.py +0 -29
  632. synth_ai/cli/_storage.py +0 -20
  633. synth_ai/cli/_typer_patch.py +0 -49
  634. synth_ai/cli/_validate_task_app.py +0 -11
  635. synth_ai/cli/balance.py +0 -216
  636. synth_ai/cli/calc.py +0 -84
  637. synth_ai/cli/demo.py +0 -165
  638. synth_ai/cli/legacy_root_backup.py +0 -468
  639. synth_ai/cli/man.py +0 -106
  640. synth_ai/cli/recent.py +0 -132
  641. synth_ai/cli/rl_demo.py +0 -254
  642. synth_ai/cli/status.py +0 -134
  643. synth_ai/cli/task_apps.py +0 -4523
  644. synth_ai/cli/traces.py +0 -164
  645. synth_ai/cli/tui.py +0 -57
  646. synth_ai/cli/watch.py +0 -506
  647. synth_ai/compound/cais.py +0 -0
  648. synth_ai/config/base_url.py +0 -107
  649. synth_ai/core/experiment.py +0 -13
  650. synth_ai/core/system.py +0 -15
  651. synth_ai/demo_registry.py +0 -295
  652. synth_ai/demos/core/__init__.py +0 -1
  653. synth_ai/demos/core/cli.py +0 -1718
  654. synth_ai/demos/demo_task_apps/core.py +0 -440
  655. synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +0 -184
  656. synth_ai/demos/demo_task_apps/math/config.toml +0 -74
  657. synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
  658. synth_ai/demos/demo_task_apps/math/modal_task_app.py +0 -739
  659. synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -37
  660. synth_ai/environments/__init__.py +0 -31
  661. synth_ai/environments/environment/__init__.py +0 -1
  662. synth_ai/environments/environment/artifacts/__init__.py +0 -1
  663. synth_ai/environments/environment/artifacts/base.py +0 -52
  664. synth_ai/environments/environment/core.py +0 -67
  665. synth_ai/environments/environment/db/__init__.py +0 -1
  666. synth_ai/environments/environment/db/sqlite.py +0 -45
  667. synth_ai/environments/environment/registry.py +0 -233
  668. synth_ai/environments/environment/resources/sqlite.py +0 -45
  669. synth_ai/environments/environment/results.py +0 -1
  670. synth_ai/environments/environment/rewards/__init__.py +0 -1
  671. synth_ai/environments/environment/rewards/core.py +0 -29
  672. synth_ai/environments/environment/shared_engine.py +0 -26
  673. synth_ai/environments/environment/tools/__init__.py +0 -200
  674. synth_ai/environments/examples/__init__.py +0 -1
  675. synth_ai/environments/examples/bandit/__init__.py +0 -33
  676. synth_ai/environments/examples/bandit/engine.py +0 -302
  677. synth_ai/environments/examples/bandit/environment.py +0 -194
  678. synth_ai/environments/examples/bandit/taskset.py +0 -200
  679. synth_ai/environments/examples/crafter_classic/__init__.py +0 -8
  680. synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -250
  681. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -59
  682. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -152
  683. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -24
  684. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -1194
  685. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -56
  686. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -32
  687. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -738
  688. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -384
  689. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -53
  690. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -178
  691. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -222
  692. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -183
  693. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -210
  694. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -206
  695. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -49
  696. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -64
  697. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -88
  698. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -77
  699. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -324
  700. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -580
  701. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -362
  702. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -49
  703. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -332
  704. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -97
  705. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -217
  706. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -87
  707. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -88
  708. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -195
  709. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -400
  710. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -195
  711. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -56
  712. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -858
  713. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -52
  714. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -874
  715. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -1412
  716. synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -216
  717. synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -296
  718. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -58
  719. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -464
  720. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -152
  721. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -51
  722. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -1412
  723. synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -112
  724. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -203
  725. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -305
  726. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -126
  727. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -94
  728. synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -142
  729. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -26
  730. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -984
  731. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -724
  732. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -386
  733. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -205
  734. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -150
  735. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -283
  736. synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -280
  737. synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -456
  738. synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -166
  739. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -102
  740. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -128
  741. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -655
  742. synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -202
  743. synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -166
  744. synth_ai/environments/examples/crafter_classic/config_logging.py +0 -111
  745. synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
  746. synth_ai/environments/examples/crafter_classic/engine.py +0 -579
  747. synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -64
  748. synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -6
  749. synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -75
  750. synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -267
  751. synth_ai/environments/examples/crafter_classic/environment.py +0 -495
  752. synth_ai/environments/examples/crafter_classic/taskset.py +0 -233
  753. synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -228
  754. synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -299
  755. synth_ai/environments/examples/crafter_custom/__init__.py +0 -4
  756. synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -1
  757. synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -202
  758. synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -7
  759. synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -182
  760. synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -8
  761. synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -269
  762. synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -262
  763. synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -417
  764. synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -187
  765. synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -118
  766. synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -373
  767. synth_ai/environments/examples/crafter_custom/environment.py +0 -312
  768. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -159
  769. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -158
  770. synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -71
  771. synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -105
  772. synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -119
  773. synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -52
  774. synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -305
  775. synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -156
  776. synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -281
  777. synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -25
  778. synth_ai/environments/examples/enron/engine.py +0 -300
  779. synth_ai/environments/examples/enron/environment.py +0 -234
  780. synth_ai/environments/examples/enron/taskset.py +0 -112
  781. synth_ai/environments/examples/enron/units/keyword_stats.py +0 -112
  782. synth_ai/environments/examples/minigrid/__init__.py +0 -48
  783. synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -1188
  784. synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -48
  785. synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -562
  786. synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -221
  787. synth_ai/environments/examples/minigrid/engine.py +0 -589
  788. synth_ai/environments/examples/minigrid/environment.py +0 -274
  789. synth_ai/environments/examples/minigrid/environment_mapping.py +0 -242
  790. synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -417
  791. synth_ai/environments/examples/minigrid/taskset.py +0 -583
  792. synth_ai/environments/examples/nethack/__init__.py +0 -7
  793. synth_ai/environments/examples/nethack/achievements.py +0 -337
  794. synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -981
  795. synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -74
  796. synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -831
  797. synth_ai/environments/examples/nethack/engine.py +0 -739
  798. synth_ai/environments/examples/nethack/environment.py +0 -256
  799. synth_ai/environments/examples/nethack/helpers/__init__.py +0 -41
  800. synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -301
  801. synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -402
  802. synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -433
  803. synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -200
  804. synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -269
  805. synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -308
  806. synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -431
  807. synth_ai/environments/examples/nethack/taskset.py +0 -323
  808. synth_ai/environments/examples/red/__init__.py +0 -7
  809. synth_ai/environments/examples/red/agent_demos/__init__.py +0 -1
  810. synth_ai/environments/examples/red/config_logging.py +0 -110
  811. synth_ai/environments/examples/red/engine.py +0 -721
  812. synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -1
  813. synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -35
  814. synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -276
  815. synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -142
  816. synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -57
  817. synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -284
  818. synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -150
  819. synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -138
  820. synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -57
  821. synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -331
  822. synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -121
  823. synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_progression.py +0 -477
  824. synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -559
  825. synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -313
  826. synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -148
  827. synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -247
  828. synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -368
  829. synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -172
  830. synth_ai/environments/examples/red/environment.py +0 -298
  831. synth_ai/environments/examples/red/taskset.py +0 -79
  832. synth_ai/environments/examples/red/units/__init__.py +0 -1
  833. synth_ai/environments/examples/sokoban/__init__.py +0 -1
  834. synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -899
  835. synth_ai/environments/examples/sokoban/engine.py +0 -678
  836. synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -1
  837. synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -657
  838. synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -18
  839. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -3
  840. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -131
  841. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -370
  842. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -332
  843. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -306
  844. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -67
  845. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -115
  846. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -123
  847. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -394
  848. synth_ai/environments/examples/sokoban/environment.py +0 -229
  849. synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -440
  850. synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -312
  851. synth_ai/environments/examples/sokoban/taskset.py +0 -544
  852. synth_ai/environments/examples/tictactoe/__init__.py +0 -1
  853. synth_ai/environments/examples/tictactoe/engine.py +0 -368
  854. synth_ai/environments/examples/tictactoe/environment.py +0 -240
  855. synth_ai/environments/examples/tictactoe/taskset.py +0 -215
  856. synth_ai/environments/examples/verilog/__init__.py +0 -10
  857. synth_ai/environments/examples/verilog/engine.py +0 -421
  858. synth_ai/environments/examples/verilog/environment.py +0 -350
  859. synth_ai/environments/examples/verilog/taskset.py +0 -420
  860. synth_ai/environments/examples/wordle/__init__.py +0 -29
  861. synth_ai/environments/examples/wordle/engine.py +0 -398
  862. synth_ai/environments/examples/wordle/environment.py +0 -159
  863. synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -75
  864. synth_ai/environments/examples/wordle/taskset.py +0 -230
  865. synth_ai/environments/reproducibility/core.py +0 -42
  866. synth_ai/environments/reproducibility/helpers.py +0 -0
  867. synth_ai/environments/reproducibility/tree.py +0 -363
  868. synth_ai/environments/service/app.py +0 -97
  869. synth_ai/environments/service/core_routes.py +0 -1021
  870. synth_ai/environments/service/external_registry.py +0 -56
  871. synth_ai/environments/service/registry.py +0 -9
  872. synth_ai/environments/stateful/__init__.py +0 -1
  873. synth_ai/environments/stateful/core.py +0 -163
  874. synth_ai/environments/stateful/engine.py +0 -21
  875. synth_ai/environments/stateful/state.py +0 -7
  876. synth_ai/environments/tasks/api.py +0 -19
  877. synth_ai/environments/tasks/core.py +0 -81
  878. synth_ai/environments/tasks/filters.py +0 -40
  879. synth_ai/environments/tasks/utils.py +0 -90
  880. synth_ai/environments/v0_observability/history.py +0 -3
  881. synth_ai/environments/v0_observability/log.py +0 -2
  882. synth_ai/evals/__init__.py +0 -15
  883. synth_ai/evals/base.py +0 -13
  884. synth_ai/evals/client.py +0 -82
  885. synth_ai/evals/types.py +0 -42
  886. synth_ai/handshake.py +0 -109
  887. synth_ai/http.py +0 -26
  888. synth_ai/http_client.py +0 -136
  889. synth_ai/inference/__init__.py +0 -5
  890. synth_ai/inference/client.py +0 -34
  891. synth_ai/jobs/client.py +0 -295
  892. synth_ai/judge_schemas.py +0 -127
  893. synth_ai/learning/__init__.py +0 -59
  894. synth_ai/learning/client.py +0 -241
  895. synth_ai/learning/ft_client.py +0 -7
  896. synth_ai/learning/health.py +0 -49
  897. synth_ai/learning/jobs.py +0 -201
  898. synth_ai/learning/rl/__init__.py +0 -39
  899. synth_ai/learning/rl/client.py +0 -267
  900. synth_ai/learning/rl/contracts.py +0 -27
  901. synth_ai/learning/rl/env_keys.py +0 -166
  902. synth_ai/learning/rl/secrets.py +0 -13
  903. synth_ai/learning/sft/client.py +0 -68
  904. synth_ai/learning/sft/config.py +0 -270
  905. synth_ai/learning/sft/data.py +0 -295
  906. synth_ai/learning/validators.py +0 -49
  907. synth_ai/lm/__init__.py +0 -25
  908. synth_ai/task/__init__.py +0 -121
  909. synth_ai/task/apps/__init__.py +0 -129
  910. synth_ai/task/client.py +0 -167
  911. synth_ai/task/config.py +0 -257
  912. synth_ai/task/contracts.py +0 -236
  913. synth_ai/task/datasets.py +0 -108
  914. synth_ai/task/proxy.py +0 -251
  915. synth_ai/task/rubrics/__init__.py +0 -56
  916. synth_ai/task/rubrics/loaders.py +0 -152
  917. synth_ai/task/rubrics/strict.py +0 -149
  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/deploy_modal.py +0 -0
  1057. {examples/task_apps → synth_ai/core/apps}/__init__.py +0 -0
  1058. /synth_ai/{tracing_v3 → core/tracing_v3}/examples/basic_usage.py +0 -0
  1059. /synth_ai/{tracing_v3 → core/tracing_v3}/hooks.py +0 -0
  1060. /synth_ai/{tracing_v3 → core/tracing_v3}/lm_call_record_abstractions.py +0 -0
  1061. /synth_ai/{tracing_v3 → core/tracing_v3}/replica_sync.py +0 -0
  1062. /synth_ai/{tracing_v3 → core/tracing_v3}/serialization.py +0 -0
  1063. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/__init__.py +0 -0
  1064. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/exceptions.py +0 -0
  1065. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/types.py +0 -0
  1066. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/utils.py +0 -0
  1067. /synth_ai/{tracing_v3 → core/tracing_v3}/turso/__init__.py +0 -0
  1068. /synth_ai/{learning → sdk/learning}/algorithms.py +0 -0
  1069. /synth_ai/{learning → sdk/learning}/config.py +0 -0
  1070. /synth_ai/{learning → sdk/learning}/constants.py +0 -0
  1071. /synth_ai/{learning → sdk/learning}/core.py +0 -0
  1072. /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
  1073. /synth_ai/{learning → sdk/learning}/rl/config.py +0 -0
  1074. /synth_ai/{learning → sdk/learning}/rl_client.py +0 -0
  1075. /synth_ai/{learning → sdk/learning}/sft/__init__.py +0 -0
  1076. /synth_ai/{learning → sdk/learning}/sse.py +0 -0
  1077. /synth_ai/{task → sdk/task}/auth.py +0 -0
  1078. /synth_ai/{task → sdk/task}/errors.py +0 -0
  1079. /synth_ai/{task → sdk/task}/health.py +0 -0
  1080. /synth_ai/{task → sdk/task}/json.py +0 -0
  1081. /synth_ai/{task → sdk/task}/rubrics/models.py +0 -0
  1082. /synth_ai/{task → sdk/task}/rubrics/scoring.py +0 -0
  1083. /synth_ai/{task → sdk/task}/vendors.py +0 -0
  1084. {synth_ai-0.2.14.dist-info → synth_ai-0.4.4.dist-info}/WHEEL +0 -0
  1085. {synth_ai-0.2.14.dist-info → synth_ai-0.4.4.dist-info}/entry_points.txt +0 -0
  1086. {synth_ai-0.2.14.dist-info → synth_ai-0.4.4.dist-info}/licenses/LICENSE +0 -0
@@ -1,1058 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- import os
5
- import re
6
- import contextlib
7
- import time
8
- from datetime import datetime, timezone
9
- from typing import Any, Dict, List, Mapping, Optional, Sequence
10
-
11
- import httpx
12
-
13
- from fastapi import APIRouter, HTTPException, Request
14
- from fastapi.exceptions import RequestValidationError
15
- from fastapi.responses import JSONResponse
16
-
17
- from synth_ai.environments.environment.tools import EnvToolCall
18
- from synth_ai.environments.examples.sokoban.environment import SokobanEnvironment
19
- from synth_ai.environments.examples.sokoban.taskset import (
20
- SokobanTaskInstance,
21
- SokobanTaskSet,
22
- create_task_instance_from_seed,
23
- )
24
- from synth_ai.task.apps import TaskAppEntry, register_task_app
25
- from synth_ai.task.contracts import (
26
- RolloutMetrics,
27
- RolloutRequest,
28
- RolloutResponse,
29
- RolloutStep,
30
- RolloutTrajectory,
31
- TaskInfo,
32
- )
33
- from synth_ai.task.auth import is_api_key_header_authorized, normalize_environment_api_key
34
- from synth_ai.task.server import TaskAppConfig, create_task_app
35
-
36
-
37
- ACTION_ID_TO_NAME = {0: "left", 1: "up", 2: "right", 3: "down"}
38
- ACTION_TOKEN_TO_ID = {
39
- "0": 0,
40
- "1": 1,
41
- "2": 2,
42
- "3": 3,
43
- "left": 0,
44
- "move_left": 0,
45
- "west": 0,
46
- "l": 0,
47
- "up": 1,
48
- "move_up": 1,
49
- "north": 1,
50
- "u": 1,
51
- "right": 2,
52
- "move_right": 2,
53
- "east": 2,
54
- "r": 2,
55
- "down": 3,
56
- "move_down": 3,
57
- "south": 3,
58
- "d": 3,
59
- }
60
-
61
- SOKOBAN_SYSTEM_PROMPT = """You are an agent playing Sokoban.
62
- The grid uses characters: '#' wall, '_' floor, 'O' box, '√' box on target, 'X' target, 'P' player.
63
- Always respond with a single tool call named interact_many containing 1-5 actions.
64
- Valid action tokens are digits 0/1/2/3 or their direction words (left/up/right/down).
65
- Mapping: 0=left, 1=up, 2=right, 3=down. Avoid undoing progress and focus on pushing boxes onto targets."""
66
-
67
-
68
- def _short_text(value: Any, *, limit: int = 280) -> str:
69
- if value is None:
70
- return ""
71
- if isinstance(value, str):
72
- text = value.strip()
73
- return text if len(text) <= limit else text[: limit - 1] + "…"
74
- if isinstance(value, (int, float, bool)):
75
- return str(value)
76
- try:
77
- text = json.dumps(value, ensure_ascii=False)
78
- except Exception:
79
- text = str(value)
80
- text = text.strip()
81
- return text if len(text) <= limit else text[: limit - 1] + "…"
82
-
83
-
84
- def _summarize_observation(observation: Any) -> str:
85
- if isinstance(observation, dict):
86
- for key in ("room_text", "observation", "grid"):
87
- value = observation.get(key)
88
- if isinstance(value, str) and value.strip():
89
- return _short_text(value, limit=512)
90
- preview = {
91
- key: observation.get(key)
92
- for key in ("player_position", "boxes_on_target", "num_boxes", "steps_taken")
93
- if key in observation
94
- }
95
- if preview:
96
- return _short_text(preview, limit=512)
97
- return _short_text(observation, limit=512)
98
-
99
-
100
- def _format_tool_calls(tool_calls: Sequence[Dict[str, Any]] | None) -> str:
101
- if not tool_calls:
102
- return "<noop>"
103
- formatted: list[str] = []
104
- for call in tool_calls:
105
- args = call.get("args") if isinstance(call, dict) else None
106
- if not isinstance(args, dict):
107
- continue
108
- if "actions" in args and isinstance(args["actions"], list):
109
- parts: list[str] = []
110
- for item in args["actions"]:
111
- try:
112
- val = int(item)
113
- except Exception:
114
- token = str(item).strip().lower()
115
- val = ACTION_TOKEN_TO_ID.get(token)
116
- name = ACTION_ID_TO_NAME.get(val, str(item)) if val is not None else str(item)
117
- parts.append(str(name))
118
- if parts:
119
- formatted.append("[" + ", ".join(parts) + "]")
120
- continue
121
- action = args.get("action")
122
- if action is None:
123
- continue
124
- try:
125
- action = int(action)
126
- except Exception:
127
- token = str(action).strip().lower()
128
- action = ACTION_TOKEN_TO_ID.get(token, action)
129
- name = ACTION_ID_TO_NAME.get(action, str(action))
130
- formatted.append(str(name))
131
- return ", ".join(formatted) if formatted else "<noop>"
132
-
133
-
134
- def _build_trace_payload(
135
- request: RolloutRequest,
136
- steps: Sequence[RolloutStep],
137
- metrics: RolloutMetrics,
138
- *,
139
- difficulty: str,
140
- initial_observation: Any,
141
- provider: str = "local",
142
- ) -> Dict[str, Any]:
143
- created_at = datetime.now(timezone.utc)
144
- base_time = time.time()
145
- event_history: list[dict[str, Any]] = []
146
- markov_messages: list[dict[str, Any]] = []
147
- session_steps: list[dict[str, Any]] = []
148
-
149
- if not steps:
150
- observation_text = _summarize_observation(initial_observation)
151
- event_time = base_time
152
- observation_msg = {
153
- "content": {"text": observation_text},
154
- "message_type": "observation",
155
- "time_record": {"event_time": event_time},
156
- "metadata": {"step_index": 0},
157
- }
158
- markov_messages.append(observation_msg)
159
- event_history.append(
160
- {
161
- "system_instance_id": "sokoban.step.0",
162
- "time_record": {"event_time": event_time},
163
- "reward": 0.0,
164
- "terminated": True,
165
- "truncated": False,
166
- "metadata": {
167
- "tool_calls": [],
168
- },
169
- }
170
- )
171
- session_steps.append(
172
- {
173
- "step_id": "step_0",
174
- "step_index": 0,
175
- "events": [event_history[-1]],
176
- "markov_blanket_messages": markov_messages[-1:],
177
- "step_metadata": {"reward": 0.0, "done": True, "truncated": False},
178
- }
179
- )
180
- else:
181
- for idx, step in enumerate(steps):
182
- event_time = base_time + idx * 0.01
183
- observation_text = _summarize_observation(step.obs)
184
- action_text = _format_tool_calls(step.tool_calls)
185
- observation_msg = {
186
- "content": {"text": observation_text},
187
- "message_type": "observation",
188
- "time_record": {"event_time": event_time},
189
- "metadata": {"step_index": idx},
190
- }
191
- action_msg = {
192
- "content": {"text": action_text},
193
- "message_type": "action",
194
- "time_record": {"event_time": event_time + 0.0005},
195
- "metadata": {"step_index": idx},
196
- }
197
- markov_messages.extend([observation_msg, action_msg])
198
- reward_val = float(step.reward or 0.0)
199
- event_history.append(
200
- {
201
- "system_instance_id": f"sokoban.step.{idx}",
202
- "time_record": {"event_time": event_time},
203
- "reward": reward_val,
204
- "terminated": bool(step.done),
205
- "truncated": bool(step.truncated),
206
- "metadata": {
207
- "tool_calls": step.tool_calls,
208
- "info": step.info or {},
209
- },
210
- }
211
- )
212
- session_steps.append(
213
- {
214
- "step_id": f"step_{idx}",
215
- "step_index": idx,
216
- "events": [event_history[-1]],
217
- "markov_blanket_messages": [observation_msg, action_msg],
218
- "step_metadata": {
219
- "reward": reward_val,
220
- "done": bool(step.done),
221
- "truncated": bool(step.truncated),
222
- },
223
- }
224
- )
225
-
226
- session_trace = {
227
- "session_id": str(request.run_id),
228
- "created_at": created_at.isoformat(),
229
- "metadata": {
230
- "task": "sokoban",
231
- "difficulty": difficulty,
232
- "seed": request.env.seed,
233
- "provider": provider,
234
- "env": request.env.model_dump(),
235
- "policy": request.policy.model_dump(),
236
- },
237
- "session_time_steps": session_steps,
238
- "event_history": event_history,
239
- "markov_blanket_message_history": markov_messages,
240
- }
241
-
242
- return {
243
- "version": 3,
244
- "session_trace": session_trace,
245
- "run_id": request.run_id,
246
- "policy_id": request.policy.policy_id or request.policy.policy_name,
247
- "reward": metrics.mean_return,
248
- "episode_returns": metrics.episode_returns,
249
- "mean_return": metrics.mean_return,
250
- "num_steps": metrics.num_steps,
251
- }
252
-
253
-
254
-
255
- def _task_info() -> TaskInfo:
256
- return TaskInfo(
257
- task={"id": "sokoban", "name": "Sokoban", "version": "1.0.0"},
258
- environment="sokoban",
259
- action_space={
260
- "type": "tool_call",
261
- "tools": [{"name": "interact", "schema": {"action": "int"}}],
262
- "max_calls": 1,
263
- },
264
- observation={"summary": "Sokoban grid observation", "keys": ["grid", "player"]},
265
- dataset={"id": "sokoban", "name": "Sokoban", "version": "1.0.0"},
266
- rubric={"version": "1", "criteria_count": 1, "source": "inline"},
267
- inference={"supports_proxy": False},
268
- limits={"max_turns": 200},
269
- )
270
-
271
-
272
- router = APIRouter()
273
-
274
-
275
- async def rollout_executor(request: RolloutRequest, fastapi_request: Request) -> RolloutResponse:
276
- policy_cfg = dict(request.policy.config or {})
277
- provider = str(policy_cfg.get("provider") or "").strip().lower()
278
- if provider == "groq":
279
- return await _rollout_with_groq(request, fastapi_request, policy_cfg)
280
- if provider == "openai":
281
- return await _rollout_with_openai(request, fastapi_request, policy_cfg)
282
-
283
- taskset: SokobanTaskSet = fastapi_request.app.state.sokoban_taskset
284
- seed = request.env.seed or 0
285
- difficulty = (request.env.config or {}).get("difficulty") or "easy"
286
- # Create deterministic instance from seed
287
- instance: SokobanTaskInstance = await create_task_instance_from_seed(str(difficulty), int(seed))
288
- env = SokobanEnvironment(instance)
289
- obs = await env.initialize()
290
- initial_observation = obs
291
-
292
- tool_calls: List[Dict[str, Any]] = []
293
- # If a predefined action sequence is provided, execute it (evaluation-style)
294
- actions: Optional[Sequence[int]] = None
295
- try:
296
- cfg = request.policy.config or {}
297
- if isinstance(cfg.get("actions"), list):
298
- actions = [int(a) for a in cfg["actions"]]
299
- except Exception:
300
- actions = None
301
-
302
- last_obs: Any = obs
303
- steps: List[RolloutStep] = []
304
- max_steps = int((request.env.config or {}).get("max_steps") or 50)
305
- executed = 0
306
- if actions:
307
- for a in actions[:max_steps]:
308
- last_obs = await env.step(EnvToolCall(tool="interact", args={"action": int(a)}))
309
- executed += 1
310
- steps.append(
311
- RolloutStep(obs=last_obs, tool_calls=[{"tool": "interact", "args": {"action": int(a)}}], reward=0.0, done=False, info={})
312
- )
313
- # Mark episode end (single-episode trajectory)
314
- final = {"observation": last_obs, "reward": 0.0}
315
- if not steps:
316
- steps = [RolloutStep(obs=last_obs, tool_calls=[], reward=0.0, done=True, info={})]
317
-
318
- # Extract inference_url from policy config (None for manual rollouts)
319
- inference_url = policy_cfg.get("inference_url")
320
-
321
- traj = RolloutTrajectory(
322
- env_id="sokoban",
323
- policy_id=request.policy.policy_id or "policy",
324
- steps=steps,
325
- final=final,
326
- length=len(steps),
327
- inference_url=inference_url, # NEW: Required for trace correlation
328
- )
329
- metrics = RolloutMetrics(
330
- episode_returns=[final.get("reward", 0.0) or 0.0],
331
- mean_return=final.get("reward", 0.0) or 0.0,
332
- num_steps=len(steps),
333
- num_episodes=1,
334
- outcome_score=None,
335
- events_score=None,
336
- details={},
337
- )
338
- trace_payload = _build_trace_payload(
339
- request,
340
- steps,
341
- metrics,
342
- difficulty=str(difficulty),
343
- initial_observation=initial_observation,
344
- )
345
- return RolloutResponse(
346
- run_id=request.run_id,
347
- trajectories=[traj],
348
- branches={},
349
- metrics=metrics,
350
- aborted=False,
351
- ops_executed=1 + executed,
352
- trace=trace_payload,
353
- )
354
-
355
-
356
- def _format_sokoban_prompt(observation: dict[str, Any], last_actions: list[int]) -> str:
357
- grid = observation.get("room_text", "")
358
- boxes = observation.get("boxes_on_target", 0)
359
- total_boxes = observation.get("num_boxes", boxes)
360
- position = observation.get("player_position", ())
361
- reward_last = observation.get("reward_last", 0.0)
362
- steps_taken = observation.get("steps_taken", 0)
363
- max_steps = observation.get("max_steps", 0)
364
- last_str = (
365
- ", ".join(ACTION_ID_TO_NAME.get(a, str(a)) for a in last_actions) if last_actions else "none"
366
- )
367
- return (
368
- f"Step {steps_taken} / {max_steps}\n"
369
- f"Player position: {position}\n"
370
- f"Boxes on target: {boxes} / {total_boxes}\n"
371
- f"Last reward: {reward_last}\n"
372
- f"Previous actions: {last_str}\n"
373
- "Grid:\n"
374
- f"{grid}\n"
375
- "Select up to five next actions via the interact_many tool."
376
- )
377
-
378
-
379
- def _extract_actions_from_response(
380
- response: dict[str, Any], max_actions: int
381
- ) -> list[int]:
382
- import json as json_lib
383
- print(f"[extract] FULL RESPONSE:", flush=True)
384
- print(json_lib.dumps(response, indent=2)[:2000], flush=True)
385
-
386
- actions: list[int] = []
387
- choices = response.get("choices") or []
388
- print(f"[extract] {len(choices)} choices", flush=True)
389
- if choices:
390
- msg = choices[0].get("message", {})
391
- print(f"[extract] tool_calls: {msg.get('tool_calls')}", flush=True)
392
- print(f"[extract] content: {msg.get('content')}", flush=True)
393
- print(f"[extract] finish_reason: {choices[0].get('finish_reason')}", flush=True)
394
- for choice in choices:
395
- message = choice.get("message") or {}
396
- tool_calls = message.get("tool_calls") or []
397
- for tool_call in tool_calls:
398
- function = tool_call.get("function") or {}
399
- arguments = function.get("arguments")
400
- payload: dict[str, Any] | None = None
401
- if isinstance(arguments, str):
402
- try:
403
- payload = json.loads(arguments)
404
- except json.JSONDecodeError:
405
- payload = None
406
- elif isinstance(arguments, dict):
407
- payload = arguments
408
- if not payload:
409
- continue
410
- raw_actions = payload.get("actions")
411
- if isinstance(raw_actions, list):
412
- for item in raw_actions:
413
- if isinstance(item, int) and item in ACTION_ID_TO_NAME:
414
- actions.append(int(item))
415
- continue
416
- if isinstance(item, str):
417
- token = item.strip().lower()
418
- if token in ACTION_TOKEN_TO_ID:
419
- actions.append(ACTION_TOKEN_TO_ID[token])
420
- if actions:
421
- break
422
- if actions:
423
- break
424
-
425
- if not actions and choices:
426
- # Fallback: parse tokens from assistant text
427
- text = choices[0].get("message", {}).get("content") or ""
428
- tokens = re.findall(r"[0-3a-zA-Z_]+", text)
429
- for tok in tokens:
430
- token = tok.strip().lower()
431
- if token in ACTION_TOKEN_TO_ID:
432
- actions.append(ACTION_TOKEN_TO_ID[token])
433
-
434
- if len(actions) > max_actions:
435
- return actions[:max_actions]
436
- return actions
437
-
438
-
439
- async def _call_groq_chat(
440
- client: httpx.AsyncClient,
441
- api_key: str,
442
- payload: dict[str, Any],
443
- ) -> tuple[dict[str, Any], dict[str, Any]]:
444
- try:
445
- response = await client.post(
446
- "https://api.groq.com/openai/v1/chat/completions",
447
- json=payload,
448
- headers={"Authorization": f"Bearer {api_key}"},
449
- )
450
- response.raise_for_status()
451
- data = response.json()
452
- return data, {
453
- "status": response.status_code,
454
- "headers": dict(response.headers),
455
- "body": data,
456
- }
457
- except httpx.HTTPStatusError as exc:
458
- try:
459
- body = exc.response.json()
460
- except Exception:
461
- body = {"raw": exc.response.text}
462
- error_detail = {
463
- "status": exc.response.status_code,
464
- "body": body,
465
- "headers": dict(exc.response.headers),
466
- }
467
- raise HTTPException(status_code=exc.response.status_code, detail=error_detail) from exc
468
- except httpx.RequestError as exc:
469
- raise HTTPException(status_code=502, detail=f"Groq request error: {exc}") from exc
470
-
471
-
472
- async def _call_openai_chat(
473
- client: httpx.AsyncClient,
474
- api_key: str,
475
- payload: dict[str, Any],
476
- ) -> tuple[dict[str, Any], dict[str, Any]]:
477
- try:
478
- response = await client.post(
479
- "https://api.openai.com/v1/chat/completions",
480
- json=payload,
481
- headers={"Authorization": f"Bearer {api_key}"},
482
- )
483
- response.raise_for_status()
484
- data = response.json()
485
- return data, {
486
- "status": response.status_code,
487
- "headers": dict(response.headers),
488
- "body": data,
489
- }
490
- except httpx.HTTPStatusError as exc:
491
- try:
492
- body = exc.response.json()
493
- except Exception:
494
- body = {"raw": exc.response.text}
495
- error_detail = {
496
- "status": exc.response.status_code,
497
- "body": body,
498
- "headers": dict(exc.response.headers),
499
- }
500
- try:
501
- print("[openai:error]", error_detail, flush=True)
502
- except Exception:
503
- pass
504
- raise HTTPException(status_code=exc.response.status_code, detail=error_detail) from exc
505
- except httpx.RequestError as exc:
506
- raise HTTPException(status_code=502, detail=f"OpenAI request error: {exc}") from exc
507
-
508
-
509
- async def _rollout_with_groq(
510
- request: RolloutRequest,
511
- fastapi_request: Request,
512
- config: dict[str, Any],
513
- ) -> RolloutResponse:
514
- api_key = os.getenv("GROQ_API_KEY")
515
- if not api_key:
516
- raise HTTPException(
517
- status_code=503,
518
- detail="GROQ_API_KEY environment variable is required for Groq rollouts.",
519
- )
520
-
521
- seed = request.env.seed or 0
522
- difficulty = (request.env.config or {}).get("difficulty") or "easy"
523
- instance: SokobanTaskInstance = await create_task_instance_from_seed(str(difficulty), int(seed))
524
- env = SokobanEnvironment(instance)
525
- observation = await env.initialize()
526
- initial_observation = observation
527
-
528
- model = config.get("model") or "qwen/qwen3-32b"
529
- temperature = float(config.get("temperature", 0.0) or 0.0)
530
- top_p = float(config.get("top_p", 0.95) or 0.95)
531
- max_tokens = int(config.get("max_tokens", 128) or 128)
532
- actions_per_call = int(config.get("max_actions_per_call", 4) or 4)
533
- actions_per_call = max(1, min(8, actions_per_call))
534
-
535
- max_steps = int((request.env.config or {}).get("max_steps") or 50)
536
-
537
- steps: List[RolloutStep] = []
538
- last_actions: list[int] = []
539
- total_reward = float(observation.get("total_reward") or 0.0)
540
- executed = 0
541
-
542
- tool_items_enum = sorted(set(ACTION_TOKEN_TO_ID.keys()))
543
- tool_schema = {
544
- "type": "function",
545
- "function": {
546
- "name": "interact_many",
547
- "description": "Execute a short sequence of Sokoban moves in order.",
548
- "parameters": {
549
- "type": "object",
550
- "properties": {
551
- "actions": {
552
- "type": "array",
553
- "items": {"type": "string", "enum": tool_items_enum},
554
- "minItems": 1,
555
- "maxItems": actions_per_call,
556
- }
557
- },
558
- "required": ["actions"],
559
- "additionalProperties": False,
560
- },
561
- },
562
- }
563
-
564
- async with httpx.AsyncClient(timeout=httpx.Timeout(30.0)) as client:
565
- for _ in range(max_steps):
566
- user_prompt = _format_sokoban_prompt(observation, last_actions)
567
- messages = [
568
- {"role": "system", "content": SOKOBAN_SYSTEM_PROMPT},
569
- {"role": "user", "content": user_prompt},
570
- ]
571
- payload = {
572
- "model": model,
573
- "messages": messages,
574
- "temperature": temperature,
575
- "top_p": top_p,
576
- "max_tokens": max_tokens,
577
- "tools": [tool_schema],
578
- "tool_choice": {"type": "function", "function": {"name": "interact_many"}},
579
- }
580
- vendor_attempts: list[dict[str, Any]] = []
581
- try:
582
- response, response_meta = await _call_groq_chat(client, api_key, payload)
583
- vendor_attempts.append({"request": payload, "response": response_meta})
584
- except HTTPException as exc:
585
- detail = exc.detail
586
- if isinstance(detail, dict):
587
- vendor_attempts.append({"request": payload, "error": detail})
588
- else:
589
- vendor_attempts.append({"request": payload, "error": {"message": str(detail)}})
590
- raise
591
-
592
- actions = _extract_actions_from_response(response, actions_per_call)
593
- if not actions:
594
- break
595
-
596
- aggregated_actions: list[int] = []
597
- aggregated_reward = 0.0
598
- done = False
599
- truncated = False
600
- intermediate_rewards: list[float] = []
601
- if executed >= max_steps:
602
- break
603
-
604
- for action in actions:
605
- if executed >= max_steps:
606
- break
607
- aggregated_actions.append(int(action))
608
- observation = await env.step(
609
- EnvToolCall(tool="interact", args={"action": int(action)})
610
- )
611
- current_total = float(observation.get("total_reward") or total_reward)
612
- reward_delta = current_total - total_reward
613
- total_reward = current_total
614
- aggregated_reward += reward_delta
615
- intermediate_rewards.append(reward_delta)
616
- done = bool(observation.get("terminated"))
617
- truncated = bool(observation.get("truncated"))
618
- executed += 1
619
- if done or truncated:
620
- break
621
-
622
- if not aggregated_actions:
623
- continue
624
-
625
- last_actions = aggregated_actions
626
- step = RolloutStep(
627
- obs=observation,
628
- tool_calls=[
629
- {
630
- "tool": "interact_many",
631
- "args": {"actions": [int(a) for a in aggregated_actions]},
632
- "source": "groq",
633
- }
634
- ],
635
- reward=aggregated_reward,
636
- done=done,
637
- truncated=truncated if truncated else None,
638
- info={
639
- "provider": "groq",
640
- "model": model,
641
- "actions_executed": aggregated_actions,
642
- "prompt": user_prompt,
643
- "reward_deltas": intermediate_rewards,
644
- "vendor_attempts": vendor_attempts,
645
- "groq_attempts": vendor_attempts,
646
- },
647
- )
648
- steps.append(step)
649
-
650
- if step.done or (step.truncated or False):
651
- break
652
-
653
- final = {"observation": observation, "reward": total_reward}
654
- inference_url_groq = "https://api.groq.com/openai/v1/chat/completions"
655
-
656
- trajectory = RolloutTrajectory(
657
- env_id=request.env.env_id or request.env.env_name or "sokoban",
658
- policy_id=request.policy.policy_id or request.policy.policy_name or "sokoban-groq",
659
- steps=steps,
660
- final=final,
661
- length=len(steps),
662
- inference_url=inference_url_groq, # NEW: Required for trace correlation
663
- )
664
- metrics = RolloutMetrics(
665
- episode_returns=[total_reward],
666
- mean_return=total_reward if steps else 0.0,
667
- num_steps=len(steps),
668
- num_episodes=1,
669
- outcome_score=None,
670
- events_score=None,
671
- details={"provider": "groq", "model": model},
672
- )
673
- trace_payload = _build_trace_payload(
674
- request,
675
- steps,
676
- metrics,
677
- difficulty=str(difficulty),
678
- initial_observation=initial_observation,
679
- provider="groq",
680
- )
681
- return RolloutResponse(
682
- run_id=request.run_id,
683
- trajectories=[trajectory],
684
- branches={},
685
- metrics=metrics,
686
- aborted=False,
687
- ops_executed=executed,
688
- trace=trace_payload,
689
- )
690
-
691
-
692
- async def _rollout_with_openai(
693
- request: RolloutRequest,
694
- fastapi_request: Request,
695
- config: dict[str, Any],
696
- ) -> RolloutResponse:
697
- api_key = os.getenv("OPENAI_API_KEY")
698
- if not api_key:
699
- raise HTTPException(
700
- status_code=503,
701
- detail="OPENAI_API_KEY environment variable is required for OpenAI rollouts.",
702
- )
703
-
704
- seed = request.env.seed or 0
705
- difficulty = (request.env.config or {}).get("difficulty") or "easy"
706
- instance: SokobanTaskInstance = await create_task_instance_from_seed(str(difficulty), int(seed))
707
- env = SokobanEnvironment(instance)
708
- observation = await env.initialize()
709
- initial_observation = observation
710
-
711
- model = config.get("model") or "gpt-5"
712
- temperature_cfg = config.get("temperature")
713
- top_p_cfg = config.get("top_p")
714
- completion_tokens = int(
715
- config.get("max_completion_tokens")
716
- or config.get("max_tokens")
717
- or 4000
718
- )
719
- actions_per_call = int(config.get("max_actions_per_call", 4) or 4)
720
- actions_per_call = max(1, min(8, actions_per_call))
721
-
722
- max_steps = int((request.env.config or {}).get("max_steps") or 50)
723
-
724
- steps: List[RolloutStep] = []
725
- last_actions: list[int] = []
726
- total_reward = float(observation.get("total_reward") or 0.0)
727
- executed = 0
728
-
729
- tool_items_enum = sorted(set(ACTION_TOKEN_TO_ID.keys()))
730
- tool_schema = {
731
- "type": "function",
732
- "function": {
733
- "name": "interact_many",
734
- "description": "Execute a short sequence of Sokoban moves in order.",
735
- "parameters": {
736
- "type": "object",
737
- "properties": {
738
- "actions": {
739
- "type": "array",
740
- "items": {"type": "string", "enum": tool_items_enum},
741
- "minItems": 1,
742
- "maxItems": actions_per_call,
743
- }
744
- },
745
- "required": ["actions"],
746
- "additionalProperties": False,
747
- },
748
- },
749
- }
750
-
751
- async with httpx.AsyncClient(timeout=httpx.Timeout(120.0)) as client:
752
- # Process ops array - each "policy" op triggers one LLM call
753
- ops_to_process = request.ops or []
754
- if not ops_to_process:
755
- # If no ops provided, default to max_steps policy calls
756
- ops_to_process = ["policy"] * max_steps
757
-
758
- for op_idx, op in enumerate(ops_to_process):
759
- # Only process "policy" ops, skip explicit actions for now
760
- if op != "policy" and not (isinstance(op, str) and op.lower() == "policy"):
761
- continue
762
-
763
- user_prompt = _format_sokoban_prompt(observation, last_actions)
764
- messages = [
765
- {"role": "system", "content": SOKOBAN_SYSTEM_PROMPT},
766
- {"role": "user", "content": user_prompt},
767
- ]
768
- payload_base: dict[str, Any] = {
769
- "model": model,
770
- "messages": messages,
771
- "max_completion_tokens": completion_tokens,
772
- "tools": [tool_schema],
773
- "tool_choice": {"type": "function", "function": {"name": "interact_many"}},
774
- }
775
- # GPT-5 models don't support temperature/top_p (only default value of 1)
776
- is_gpt5 = "gpt-5" in model.lower()
777
- if temperature_cfg is not None and not is_gpt5:
778
- with contextlib.suppress(Exception):
779
- payload_base["temperature"] = float(temperature_cfg)
780
- if top_p_cfg is not None and not is_gpt5:
781
- with contextlib.suppress(Exception):
782
- payload_base["top_p"] = float(top_p_cfg)
783
-
784
- vendor_attempts: list[dict[str, Any]] = []
785
- attempt_payload = dict(payload_base)
786
- while True:
787
- attempt_record: dict[str, Any] = {"request": dict(attempt_payload)}
788
- try:
789
- response, response_meta = await _call_openai_chat(client, api_key, attempt_payload)
790
- attempt_record["response"] = response_meta
791
- vendor_attempts.append(attempt_record)
792
- break
793
- except HTTPException as exc:
794
- detail = exc.detail
795
- attempt_record["error"] = detail if isinstance(detail, dict) else {"message": str(detail)}
796
- vendor_attempts.append(attempt_record)
797
- handled = False
798
- body = detail.get("body") if isinstance(detail, dict) else None
799
- error_info = body.get("error") if isinstance(body, dict) else None
800
- code = error_info.get("code") if isinstance(error_info, dict) else None
801
- param = error_info.get("param") if isinstance(error_info, dict) else None
802
- if code in {"unsupported_parameter", "unsupported_value"}:
803
- if param == "temperature" and "temperature" in attempt_payload:
804
- attempt_payload = dict(attempt_payload)
805
- attempt_payload.pop("temperature", None)
806
- handled = True
807
- elif param == "top_p" and "top_p" in attempt_payload:
808
- attempt_payload = dict(attempt_payload)
809
- attempt_payload.pop("top_p", None)
810
- handled = True
811
- if handled:
812
- continue
813
- raise
814
-
815
- actions = _extract_actions_from_response(response, actions_per_call)
816
- if not actions:
817
- break
818
-
819
- aggregated_actions: list[int] = []
820
- aggregated_reward = 0.0
821
- done = False
822
- truncated = False
823
- intermediate_rewards: list[float] = []
824
- if executed >= max_steps:
825
- break
826
-
827
- print(f"[debug] Processing {len(actions)} actions from LLM", flush=True)
828
- for action in actions:
829
- if executed >= max_steps:
830
- break
831
- aggregated_actions.append(int(action))
832
- observation = await env.step(
833
- EnvToolCall(tool="interact", args={"action": int(action)})
834
- )
835
- current_total = float(observation.get("total_reward") or total_reward)
836
- reward_delta = current_total - total_reward
837
- total_reward = current_total
838
- aggregated_reward += reward_delta
839
- intermediate_rewards.append(reward_delta)
840
- done = bool(observation.get("terminated"))
841
- truncated = bool(observation.get("truncated"))
842
- executed += 1
843
- if done or truncated:
844
- break
845
-
846
- print(f"[debug] After action {action}: done={done}, trunc={truncated}, exec={executed}", flush=True)
847
- if not aggregated_actions:
848
- continue
849
-
850
- last_actions = aggregated_actions
851
- step = RolloutStep(
852
- obs=observation,
853
- tool_calls=[
854
- {
855
- "tool": "interact_many",
856
- "args": {"actions": [int(a) for a in aggregated_actions]},
857
- "source": "openai",
858
- }
859
- ],
860
- reward=aggregated_reward,
861
- done=done,
862
- truncated=truncated if truncated else None,
863
- info={
864
- "provider": "openai",
865
- "model": model,
866
- "actions_executed": aggregated_actions,
867
- "prompt": user_prompt,
868
- "reward_deltas": intermediate_rewards,
869
- "vendor_attempts": vendor_attempts,
870
- "openai_attempts": vendor_attempts,
871
- "max_completion_tokens": completion_tokens,
872
- "temperature_requested": temperature_cfg,
873
- "top_p_requested": top_p_cfg,
874
- },
875
- )
876
- steps.append(step)
877
-
878
- if step.done or (step.truncated or False):
879
- break
880
-
881
- final = {"observation": observation, "reward": total_reward}
882
- inference_url_openai = "https://api.openai.com/v1/chat/completions"
883
-
884
- trajectory = RolloutTrajectory(
885
- env_id=request.env.env_id or request.env.env_name or "sokoban",
886
- policy_id=request.policy.policy_id or request.policy.policy_name or "sokoban-openai",
887
- steps=steps,
888
- final=final,
889
- length=len(steps),
890
- inference_url=inference_url_openai, # NEW: Required for trace correlation
891
- )
892
- metrics = RolloutMetrics(
893
- episode_returns=[total_reward],
894
- mean_return=total_reward if steps else 0.0,
895
- num_steps=len(steps),
896
- num_episodes=1,
897
- outcome_score=None,
898
- events_score=None,
899
- details={"provider": "openai", "model": model},
900
- )
901
- trace_payload = _build_trace_payload(
902
- request,
903
- steps,
904
- metrics,
905
- difficulty=str(difficulty),
906
- initial_observation=initial_observation,
907
- provider="openai",
908
- )
909
- return RolloutResponse(
910
- run_id=request.run_id,
911
- trajectories=[trajectory],
912
- branches={},
913
- metrics=metrics,
914
- aborted=False,
915
- ops_executed=executed,
916
- trace=trace_payload,
917
- )
918
-
919
-
920
- def build_config() -> TaskAppConfig:
921
- taskset = SokobanTaskSet()
922
- base = _task_info()
923
- app_state: dict[str, Any] = {"sokoban_taskset": taskset, "sokoban_envs": {}}
924
- config = TaskAppConfig(
925
- app_id="sokoban",
926
- name="Sokoban Task App",
927
- description="Sokoban environment exposed as a Synth task app.",
928
- base_task_info=base,
929
- describe_taskset=lambda: {"id": "sokoban", "name": "Sokoban"},
930
- provide_task_instances=lambda seeds: taskset.provide_task_instances(seeds),
931
- rollout=rollout_executor,
932
- dataset_registry=None,
933
- rubrics=None,
934
- proxy=None,
935
- routers=(router,),
936
- app_state=app_state,
937
- cors_origins=["*"],
938
- )
939
- return config
940
-
941
-
942
- # --- Health routes (auth-tolerant) ---
943
- def fastapi_app():
944
- app = create_task_app(build_config())
945
-
946
- # Replace default health handlers to log expected ENVIRONMENT_API_KEY when unauthorized
947
- filtered_routes = []
948
- for route in app.router.routes:
949
- path = getattr(route, "path", None)
950
- methods = getattr(route, "methods", set()) or set()
951
- if path in {"/health", "/health/rollout"} and "GET" in methods:
952
- continue
953
- filtered_routes.append(route)
954
- app.router.routes = filtered_routes
955
-
956
- def _key_prefix() -> Optional[str]:
957
- key = normalize_environment_api_key()
958
- return key[: max(1, len(key) // 2)] if key else None
959
-
960
- @app.get("/health")
961
- async def health(request: Request):
962
- env_key = normalize_environment_api_key()
963
- if not env_key:
964
- return JSONResponse(status_code=503, content={"status": "unhealthy", "detail": "Missing ENVIRONMENT_API_KEY"})
965
- if not is_api_key_header_authorized(request):
966
- content: Dict[str, Any] = {"status": "healthy", "authorized": False}
967
- prefix = _key_prefix()
968
- if prefix:
969
- content["expected_api_key_prefix"] = prefix
970
- return JSONResponse(status_code=200, content=content)
971
- return {"status": "healthy", "authorized": True}
972
-
973
- @app.get("/health/rollout")
974
- async def health_rollout(request: Request):
975
- env_key = normalize_environment_api_key()
976
- if not env_key:
977
- return JSONResponse(status_code=503, content={"status": "unhealthy", "detail": "Missing ENVIRONMENT_API_KEY"})
978
- if not is_api_key_header_authorized(request):
979
- content: Dict[str, Any] = {"status": "healthy", "authorized": False}
980
- prefix = _key_prefix()
981
- if prefix:
982
- content["expected_api_key_prefix"] = prefix
983
- return JSONResponse(status_code=200, content=content)
984
- return {"ok": True, "authorized": True}
985
-
986
- # Basic env lifecycle routes (for local eval only)
987
- @app.post("/env/sokoban/initialize")
988
- async def initialize_env(request: Request, payload: Dict[str, Any]):
989
- difficulty = str((payload.get("config") or {}).get("difficulty") or "easy")
990
- seed = payload.get("seed")
991
- try:
992
- instance: SokobanTaskInstance = await create_task_instance_from_seed(difficulty, int(seed) if seed is not None else 0)
993
- except Exception as exc:
994
- raise HTTPException(status_code=400, detail=str(exc))
995
- env = SokobanEnvironment(instance)
996
- obs = await env.initialize()
997
- envs: Dict[str, SokobanEnvironment] = request.app.state.sokoban_envs
998
- env_id = f"{difficulty}:{seed or 0}"
999
- envs[env_id] = env
1000
- return {"env_id": env_id, "observation": obs}
1001
-
1002
- @app.post("/env/sokoban/step")
1003
- async def step_env(request: Request, payload: Dict[str, Any]):
1004
- env_id = str(payload.get("env_id") or "")
1005
- if not env_id:
1006
- raise HTTPException(status_code=400, detail="env_id required")
1007
- envs: Dict[str, SokobanEnvironment] = request.app.state.sokoban_envs
1008
- env = envs.get(env_id)
1009
- if not env:
1010
- raise HTTPException(status_code=404, detail="Unknown env_id")
1011
-
1012
- action = None
1013
- tool_calls = payload.get("tool_calls") or []
1014
- if tool_calls:
1015
- try:
1016
- first = tool_calls[0] or {}
1017
- args = first.get("args") or {}
1018
- action = int(args.get("action")) if "action" in args else None
1019
- except Exception:
1020
- action = None
1021
- if action is None and "action" in payload:
1022
- try:
1023
- action = int(payload.get("action"))
1024
- except Exception:
1025
- action = None
1026
- if action is None:
1027
- raise HTTPException(status_code=400, detail="action required")
1028
- obs = await env.step(EnvToolCall(tool="interact", args={"action": int(action)}))
1029
- return {"observation": obs}
1030
-
1031
- @app.post("/env/sokoban/terminate")
1032
- async def terminate_env(request: Request, payload: Dict[str, Any]):
1033
- env_id = str(payload.get("env_id") or "")
1034
- envs: Dict[str, SokobanEnvironment] = request.app.state.sokoban_envs
1035
- env = envs.pop(env_id, None)
1036
- if env:
1037
- obs = await env.terminate()
1038
- else:
1039
- obs = {"terminated": True}
1040
- return {"ok": True, "observation": obs}
1041
-
1042
- @app.exception_handler(RequestValidationError)
1043
- async def _on_validation_error(_request: Request, exc: RequestValidationError):
1044
- return JSONResponse(status_code=422, content={"status": "invalid", "detail": exc.errors()[:5]})
1045
-
1046
- return app
1047
-
1048
-
1049
- register_task_app(
1050
- entry=TaskAppEntry(
1051
- app_id="sokoban",
1052
- description="Sokoban task app",
1053
- config_factory=build_config,
1054
- aliases=("sokoban-rl",),
1055
- env_files=(),
1056
- modal=None,
1057
- )
1058
- )