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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (738) hide show
  1. synth_ai/__init__.py +44 -24
  2. synth_ai/__main__.py +30 -3
  3. synth_ai/cli/__init__.py +103 -48
  4. synth_ai/cli/__main__.py +42 -0
  5. synth_ai/cli/_internal/__init__.py +5 -0
  6. synth_ai/cli/_internal/modal_wrapper.py +31 -0
  7. synth_ai/cli/_internal/storage.py +20 -0
  8. synth_ai/cli/_internal/typer_patch.py +47 -0
  9. synth_ai/cli/_internal/validate_task_app.py +29 -0
  10. synth_ai/cli/agents/__init__.py +17 -0
  11. synth_ai/cli/agents/claude.py +77 -0
  12. synth_ai/cli/agents/codex.py +265 -0
  13. synth_ai/cli/agents/opencode.py +253 -0
  14. synth_ai/cli/commands/__init__.py +18 -0
  15. synth_ai/cli/commands/artifacts/__init__.py +13 -0
  16. synth_ai/cli/commands/artifacts/client.py +119 -0
  17. synth_ai/cli/commands/artifacts/config.py +57 -0
  18. synth_ai/cli/commands/artifacts/core.py +24 -0
  19. synth_ai/cli/commands/artifacts/download.py +188 -0
  20. synth_ai/cli/commands/artifacts/export.py +186 -0
  21. synth_ai/cli/commands/artifacts/list.py +156 -0
  22. synth_ai/cli/commands/artifacts/parsing.py +250 -0
  23. synth_ai/cli/commands/artifacts/show.py +336 -0
  24. synth_ai/cli/commands/demo/__init__.py +3 -0
  25. synth_ai/cli/commands/demo/core.py +153 -0
  26. synth_ai/cli/commands/eval/__init__.py +10 -0
  27. synth_ai/cli/commands/eval/config.py +338 -0
  28. synth_ai/cli/commands/eval/core.py +256 -0
  29. synth_ai/cli/commands/eval/runner.py +704 -0
  30. synth_ai/cli/commands/eval/validation.py +60 -0
  31. synth_ai/cli/commands/filter/__init__.py +12 -0
  32. synth_ai/cli/commands/filter/core.py +424 -0
  33. synth_ai/cli/commands/filter/errors.py +55 -0
  34. synth_ai/cli/commands/filter/validation.py +77 -0
  35. synth_ai/cli/commands/help/__init__.py +185 -0
  36. synth_ai/cli/commands/help/core.py +72 -0
  37. synth_ai/cli/commands/scan/__init__.py +19 -0
  38. synth_ai/cli/commands/scan/cloudflare_scanner.py +403 -0
  39. synth_ai/cli/commands/scan/core.py +344 -0
  40. synth_ai/cli/commands/scan/health_checker.py +242 -0
  41. synth_ai/cli/commands/scan/local_scanner.py +278 -0
  42. synth_ai/cli/commands/scan/models.py +83 -0
  43. synth_ai/cli/commands/smoke/__init__.py +7 -0
  44. synth_ai/cli/commands/smoke/core.py +1428 -0
  45. synth_ai/cli/commands/status/__init__.py +3 -0
  46. synth_ai/cli/commands/status/client.py +91 -0
  47. synth_ai/cli/commands/status/config.py +12 -0
  48. synth_ai/cli/commands/status/errors.py +11 -0
  49. synth_ai/cli/commands/status/subcommands/__init__.py +3 -0
  50. synth_ai/cli/commands/status/subcommands/config.py +13 -0
  51. synth_ai/cli/commands/status/subcommands/files.py +34 -0
  52. synth_ai/cli/commands/status/subcommands/jobs.py +51 -0
  53. synth_ai/cli/commands/status/subcommands/models.py +35 -0
  54. synth_ai/cli/commands/status/subcommands/runs.py +34 -0
  55. synth_ai/cli/commands/status/subcommands/session.py +77 -0
  56. synth_ai/cli/commands/status/subcommands/summary.py +39 -0
  57. synth_ai/cli/commands/status/subcommands/utils.py +41 -0
  58. synth_ai/cli/commands/status/utils.py +23 -0
  59. synth_ai/cli/commands/train/__init__.py +53 -0
  60. synth_ai/cli/commands/train/core.py +22 -0
  61. synth_ai/cli/commands/train/errors.py +117 -0
  62. synth_ai/cli/commands/train/judge_schemas.py +201 -0
  63. synth_ai/cli/commands/train/judge_validation.py +305 -0
  64. synth_ai/cli/commands/train/prompt_learning_validation.py +633 -0
  65. synth_ai/cli/commands/train/validation.py +392 -0
  66. synth_ai/cli/demo_apps/__init__.py +10 -0
  67. synth_ai/cli/demo_apps/core/__init__.py +28 -0
  68. synth_ai/cli/demo_apps/core/cli.py +1735 -0
  69. synth_ai/cli/demo_apps/crafter/__init__.py +1 -0
  70. synth_ai/cli/demo_apps/crafter/crafter_fft_4b.toml +55 -0
  71. synth_ai/cli/demo_apps/crafter/grpo_crafter_task_app.py +186 -0
  72. synth_ai/cli/demo_apps/crafter/rl_from_base_qwen4b.toml +74 -0
  73. synth_ai/cli/demo_apps/demo_registry.py +176 -0
  74. synth_ai/cli/demo_apps/demo_task_apps/__init__.py +7 -0
  75. synth_ai/{demos → cli/demo_apps}/demo_task_apps/core.py +117 -51
  76. synth_ai/cli/demo_apps/demo_task_apps/crafter/__init__.py +1 -0
  77. synth_ai/cli/demo_apps/demo_task_apps/crafter/configs/crafter_fft_4b.toml +53 -0
  78. synth_ai/cli/demo_apps/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +73 -0
  79. synth_ai/cli/demo_apps/demo_task_apps/crafter/grpo_crafter_task_app.py +185 -0
  80. synth_ai/cli/demo_apps/demo_task_apps/math/_common.py +16 -0
  81. synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/app.py +2 -1
  82. synth_ai/cli/demo_apps/demo_task_apps/math/config.toml +73 -0
  83. synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/deploy_modal.py +3 -6
  84. synth_ai/cli/demo_apps/demo_task_apps/math/modal_task_app.py +738 -0
  85. synth_ai/cli/demo_apps/demo_task_apps/math/task_app_entry.py +39 -0
  86. synth_ai/cli/demo_apps/math/__init__.py +1 -0
  87. synth_ai/cli/demo_apps/math/_common.py +16 -0
  88. synth_ai/cli/demo_apps/math/app.py +38 -0
  89. synth_ai/cli/demo_apps/math/config.toml +75 -0
  90. synth_ai/cli/demo_apps/math/deploy_modal.py +54 -0
  91. synth_ai/cli/demo_apps/math/modal_task_app.py +698 -0
  92. synth_ai/cli/demo_apps/math/task_app_entry.py +53 -0
  93. synth_ai/cli/demo_apps/mipro/main.py +271 -0
  94. synth_ai/cli/demo_apps/mipro/task_app.py +922 -0
  95. synth_ai/cli/demo_apps/mipro/train_cfg.toml +92 -0
  96. synth_ai/cli/demos/__init__.py +12 -0
  97. synth_ai/cli/demos/demo.py +32 -0
  98. synth_ai/cli/demos/rl_demo.py +254 -0
  99. synth_ai/cli/deploy.py +216 -0
  100. synth_ai/cli/infra/__init__.py +14 -0
  101. synth_ai/cli/{balance.py → infra/balance.py} +21 -3
  102. synth_ai/cli/infra/mcp.py +35 -0
  103. synth_ai/cli/infra/modal_app.py +36 -0
  104. synth_ai/cli/infra/setup.py +69 -0
  105. synth_ai/cli/infra/status.py +16 -0
  106. synth_ai/cli/infra/turso.py +77 -0
  107. synth_ai/cli/lib/__init__.py +10 -0
  108. synth_ai/cli/lib/agents.py +76 -0
  109. synth_ai/cli/lib/apps/modal_app.py +101 -0
  110. synth_ai/cli/lib/apps/task_app.py +642 -0
  111. synth_ai/cli/lib/bin.py +39 -0
  112. synth_ai/cli/lib/env.py +375 -0
  113. synth_ai/cli/lib/errors.py +85 -0
  114. synth_ai/cli/lib/modal.py +315 -0
  115. synth_ai/cli/lib/plotting.py +126 -0
  116. synth_ai/cli/lib/prompt_args.py +39 -0
  117. synth_ai/cli/lib/prompts.py +284 -0
  118. synth_ai/cli/lib/sqld.py +122 -0
  119. synth_ai/cli/lib/task_app_discovery.py +884 -0
  120. synth_ai/cli/lib/task_app_env.py +295 -0
  121. synth_ai/cli/lib/train_cfgs.py +300 -0
  122. synth_ai/cli/lib/tunnel_records.py +207 -0
  123. synth_ai/cli/local/__init__.py +14 -0
  124. synth_ai/cli/local/experiment_queue/__init__.py +72 -0
  125. synth_ai/cli/local/experiment_queue/api_schemas.py +221 -0
  126. synth_ai/cli/local/experiment_queue/celery_app.py +208 -0
  127. synth_ai/cli/local/experiment_queue/config.py +128 -0
  128. synth_ai/cli/local/experiment_queue/config_utils.py +272 -0
  129. synth_ai/cli/local/experiment_queue/database.py +175 -0
  130. synth_ai/cli/local/experiment_queue/dispatcher.py +119 -0
  131. synth_ai/cli/local/experiment_queue/models.py +231 -0
  132. synth_ai/cli/local/experiment_queue/progress_info.py +160 -0
  133. synth_ai/cli/local/experiment_queue/results.py +373 -0
  134. synth_ai/cli/local/experiment_queue/schemas.py +131 -0
  135. synth_ai/cli/local/experiment_queue/service.py +344 -0
  136. synth_ai/cli/local/experiment_queue/status.py +372 -0
  137. synth_ai/cli/local/experiment_queue/status_tracker.py +360 -0
  138. synth_ai/cli/local/experiment_queue/tasks.py +1984 -0
  139. synth_ai/cli/local/experiment_queue/trace_storage.py +65 -0
  140. synth_ai/cli/local/experiment_queue/validation.py +157 -0
  141. synth_ai/cli/local/session/__init__.py +92 -0
  142. synth_ai/cli/local/session/client.py +383 -0
  143. synth_ai/cli/local/session/constants.py +63 -0
  144. synth_ai/cli/local/session/exceptions.py +105 -0
  145. synth_ai/cli/local/session/manager.py +139 -0
  146. synth_ai/cli/local/session/models.py +89 -0
  147. synth_ai/cli/local/session/query.py +110 -0
  148. synth_ai/cli/root.py +150 -102
  149. synth_ai/cli/task_apps/__init__.py +37 -0
  150. synth_ai/cli/task_apps/commands.py +3145 -0
  151. synth_ai/cli/task_apps/deploy.py +7 -0
  152. synth_ai/cli/task_apps/list.py +26 -0
  153. synth_ai/cli/task_apps/main.py +36 -0
  154. synth_ai/cli/task_apps/modal_serve.py +11 -0
  155. synth_ai/cli/task_apps/serve.py +11 -0
  156. synth_ai/cli/training/__init__.py +8 -0
  157. synth_ai/cli/training/train.py +5 -0
  158. synth_ai/cli/training/train_cfg.py +34 -0
  159. synth_ai/cli/{watch.py → training/watch.py} +13 -18
  160. synth_ai/cli/turso.py +52 -0
  161. synth_ai/cli/utils/__init__.py +8 -0
  162. synth_ai/cli/utils/experiments.py +235 -0
  163. synth_ai/cli/utils/queue.py +504 -0
  164. synth_ai/cli/{recent.py → utils/recent.py} +13 -7
  165. synth_ai/cli/{traces.py → utils/traces.py} +9 -5
  166. synth_ai/contracts/__init__.py +67 -0
  167. synth_ai/core/__init__.py +100 -0
  168. synth_ai/core/_utils/__init__.py +54 -0
  169. synth_ai/core/_utils/base_url.py +10 -0
  170. synth_ai/core/_utils/http.py +10 -0
  171. synth_ai/core/_utils/prompts.py +14 -0
  172. synth_ai/core/_utils/task_app_state.py +12 -0
  173. synth_ai/core/_utils/user_config.py +10 -0
  174. synth_ai/core/apps/common.py +116 -0
  175. synth_ai/core/auth.py +95 -0
  176. synth_ai/core/cfgs.py +240 -0
  177. synth_ai/core/config/__init__.py +16 -0
  178. synth_ai/core/config/base.py +168 -0
  179. synth_ai/core/config/resolver.py +89 -0
  180. synth_ai/core/env.py +231 -0
  181. synth_ai/core/errors.py +126 -0
  182. synth_ai/core/http.py +230 -0
  183. synth_ai/core/integrations/__init__.py +11 -0
  184. synth_ai/core/integrations/cloudflare.py +1710 -0
  185. synth_ai/core/integrations/mcp/__init__.py +6 -0
  186. synth_ai/core/integrations/mcp/__main__.py +8 -0
  187. synth_ai/core/integrations/mcp/claude.py +36 -0
  188. synth_ai/core/integrations/mcp/main.py +254 -0
  189. synth_ai/core/integrations/mcp/setup.py +100 -0
  190. synth_ai/core/integrations/modal.py +277 -0
  191. synth_ai/core/json.py +72 -0
  192. synth_ai/core/log_filter.py +99 -0
  193. synth_ai/core/logging.py +82 -0
  194. synth_ai/core/paths.py +107 -0
  195. synth_ai/core/pricing.py +109 -0
  196. synth_ai/core/process.py +233 -0
  197. synth_ai/core/ssl.py +25 -0
  198. synth_ai/core/storage/__init__.py +71 -0
  199. synth_ai/core/task_app_state.py +318 -0
  200. synth_ai/core/telemetry.py +282 -0
  201. synth_ai/{tracing_v3 → core/tracing_v3}/__init__.py +5 -1
  202. synth_ai/{tracing_v3 → core/tracing_v3}/abstractions.py +21 -4
  203. synth_ai/core/tracing_v3/config.py +229 -0
  204. synth_ai/core/tracing_v3/constants.py +21 -0
  205. synth_ai/{tracing_v3 → core/tracing_v3}/db_config.py +42 -29
  206. synth_ai/{tracing_v3 → core/tracing_v3}/decorators.py +80 -45
  207. synth_ai/{tracing_v3 → core/tracing_v3}/examples/basic_usage.py +15 -9
  208. synth_ai/{tracing_v3 → core/tracing_v3}/hooks.py +6 -4
  209. synth_ai/{tracing_v3 → core/tracing_v3}/llm_call_record_helpers.py +161 -61
  210. synth_ai/{tracing_v3 → core/tracing_v3}/migration_helper.py +1 -2
  211. synth_ai/{tracing_v3 → core/tracing_v3}/replica_sync.py +12 -7
  212. synth_ai/core/tracing_v3/serialization.py +130 -0
  213. synth_ai/{tracing_v3 → core/tracing_v3}/session_tracer.py +88 -21
  214. synth_ai/{tracing_v3 → core/tracing_v3}/storage/base.py +99 -12
  215. synth_ai/core/tracing_v3/storage/config.py +109 -0
  216. synth_ai/{tracing_v3 → core/tracing_v3}/storage/factory.py +11 -9
  217. synth_ai/{tracing_v3 → core/tracing_v3}/storage/utils.py +15 -11
  218. synth_ai/core/tracing_v3/trace_utils.py +326 -0
  219. synth_ai/core/tracing_v3/turso/__init__.py +12 -0
  220. synth_ai/core/tracing_v3/turso/daemon.py +278 -0
  221. synth_ai/{tracing_v3 → core/tracing_v3}/turso/models.py +7 -3
  222. synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
  223. synth_ai/{tracing_v3 → core/tracing_v3}/utils.py +5 -4
  224. synth_ai/core/urls.py +18 -0
  225. synth_ai/core/user_config.py +137 -0
  226. synth_ai/core/uvicorn.py +222 -0
  227. synth_ai/data/__init__.py +83 -0
  228. synth_ai/data/enums.py +123 -0
  229. synth_ai/data/rewards.py +152 -0
  230. synth_ai/data/traces.py +35 -0
  231. synth_ai/products/__init__.py +6 -0
  232. synth_ai/products/graph_evolve/__init__.py +46 -0
  233. synth_ai/products/graph_evolve/client.py +226 -0
  234. synth_ai/products/graph_evolve/config.py +591 -0
  235. synth_ai/products/graph_evolve/converters/__init__.py +42 -0
  236. synth_ai/products/graph_evolve/converters/openai_sft.py +484 -0
  237. synth_ai/products/graph_evolve/examples/hotpotqa/config.toml +109 -0
  238. synth_ai/products/graph_evolve/run.py +222 -0
  239. synth_ai/products/graph_gepa/__init__.py +23 -0
  240. synth_ai/products/graph_gepa/converters/__init__.py +19 -0
  241. synth_ai/products/graph_gepa/converters/openai_sft.py +29 -0
  242. synth_ai/sdk/__init__.py +123 -0
  243. synth_ai/sdk/api/__init__.py +1 -0
  244. synth_ai/sdk/api/models/supported.py +514 -0
  245. synth_ai/sdk/api/research_agent/__init__.py +296 -0
  246. synth_ai/sdk/api/train/__init__.py +85 -0
  247. synth_ai/sdk/api/train/builders.py +895 -0
  248. synth_ai/sdk/api/train/cli.py +2199 -0
  249. synth_ai/sdk/api/train/config_finder.py +267 -0
  250. synth_ai/sdk/api/train/configs/__init__.py +65 -0
  251. synth_ai/sdk/api/train/configs/prompt_learning.py +1706 -0
  252. synth_ai/sdk/api/train/configs/rl.py +187 -0
  253. synth_ai/sdk/api/train/configs/sft.py +99 -0
  254. synth_ai/sdk/api/train/configs/shared.py +81 -0
  255. synth_ai/sdk/api/train/context_learning.py +312 -0
  256. synth_ai/sdk/api/train/env_resolver.py +418 -0
  257. synth_ai/sdk/api/train/graph_validators.py +216 -0
  258. synth_ai/sdk/api/train/graphgen.py +984 -0
  259. synth_ai/sdk/api/train/graphgen_models.py +823 -0
  260. synth_ai/sdk/api/train/graphgen_validators.py +109 -0
  261. synth_ai/sdk/api/train/local_api.py +10 -0
  262. synth_ai/sdk/api/train/pollers.py +124 -0
  263. synth_ai/sdk/api/train/progress/__init__.py +97 -0
  264. synth_ai/sdk/api/train/progress/dataclasses.py +569 -0
  265. synth_ai/sdk/api/train/progress/events.py +326 -0
  266. synth_ai/sdk/api/train/progress/results.py +428 -0
  267. synth_ai/sdk/api/train/progress/tracker.py +641 -0
  268. synth_ai/sdk/api/train/prompt_learning.py +469 -0
  269. synth_ai/sdk/api/train/rl.py +441 -0
  270. synth_ai/sdk/api/train/sft.py +396 -0
  271. synth_ai/sdk/api/train/summary.py +522 -0
  272. synth_ai/sdk/api/train/supported_algos.py +147 -0
  273. synth_ai/sdk/api/train/task_app.py +351 -0
  274. synth_ai/sdk/api/train/utils.py +279 -0
  275. synth_ai/sdk/api/train/validators.py +2424 -0
  276. synth_ai/sdk/graphs/__init__.py +15 -0
  277. synth_ai/sdk/graphs/completions.py +570 -0
  278. synth_ai/{inference → sdk/inference}/__init__.py +0 -1
  279. synth_ai/sdk/inference/client.py +128 -0
  280. synth_ai/sdk/jobs/__init__.py +16 -0
  281. synth_ai/sdk/jobs/client.py +371 -0
  282. synth_ai/sdk/judging/__init__.py +14 -0
  283. synth_ai/sdk/judging/base.py +24 -0
  284. synth_ai/sdk/judging/client.py +40 -0
  285. synth_ai/sdk/judging/schemas.py +222 -0
  286. synth_ai/sdk/judging/types.py +42 -0
  287. synth_ai/sdk/learning/__init__.py +99 -0
  288. synth_ai/sdk/learning/algorithms.py +14 -0
  289. synth_ai/{learning → sdk/learning}/client.py +121 -30
  290. synth_ai/sdk/learning/config.py +5 -0
  291. synth_ai/{learning → sdk/learning}/constants.py +0 -2
  292. synth_ai/sdk/learning/context_learning_client.py +531 -0
  293. synth_ai/sdk/learning/context_learning_types.py +292 -0
  294. synth_ai/sdk/learning/ft_client.py +7 -0
  295. synth_ai/{learning → sdk/learning}/health.py +15 -9
  296. synth_ai/{learning → sdk/learning}/jobs.py +44 -47
  297. synth_ai/sdk/learning/prompt_extraction.py +334 -0
  298. synth_ai/sdk/learning/prompt_learning_client.py +455 -0
  299. synth_ai/sdk/learning/prompt_learning_types.py +186 -0
  300. synth_ai/{rl → sdk/learning/rl}/__init__.py +13 -8
  301. synth_ai/{learning/rl_client.py → sdk/learning/rl/client.py} +89 -77
  302. synth_ai/sdk/learning/rl/config.py +31 -0
  303. synth_ai/{rl → sdk/learning/rl}/contracts.py +5 -14
  304. synth_ai/{rl → sdk/learning/rl}/env_keys.py +45 -16
  305. synth_ai/sdk/learning/rl/secrets.py +13 -0
  306. synth_ai/sdk/learning/rl_client.py +5 -0
  307. synth_ai/sdk/learning/sft/__init__.py +29 -0
  308. synth_ai/sdk/learning/sft/client.py +95 -0
  309. synth_ai/sdk/learning/sft/config.py +270 -0
  310. synth_ai/sdk/learning/sft/data.py +698 -0
  311. synth_ai/sdk/learning/sse.py +57 -0
  312. synth_ai/sdk/learning/validators.py +52 -0
  313. synth_ai/sdk/localapi/__init__.py +40 -0
  314. synth_ai/sdk/localapi/apps/__init__.py +28 -0
  315. synth_ai/sdk/localapi/client.py +10 -0
  316. synth_ai/sdk/localapi/contracts.py +10 -0
  317. synth_ai/sdk/localapi/helpers.py +519 -0
  318. synth_ai/sdk/localapi/rollouts.py +87 -0
  319. synth_ai/sdk/localapi/server.py +29 -0
  320. synth_ai/sdk/localapi/template.py +70 -0
  321. synth_ai/sdk/streaming/__init__.py +35 -0
  322. synth_ai/sdk/streaming/config.py +94 -0
  323. synth_ai/sdk/streaming/handlers.py +1997 -0
  324. synth_ai/sdk/streaming/streamer.py +713 -0
  325. synth_ai/sdk/streaming/types.py +112 -0
  326. synth_ai/sdk/task/__init__.py +164 -0
  327. synth_ai/sdk/task/apps/__init__.py +169 -0
  328. synth_ai/sdk/task/auth.py +165 -0
  329. synth_ai/sdk/task/client.py +175 -0
  330. synth_ai/sdk/task/config.py +257 -0
  331. synth_ai/sdk/task/contracts.py +219 -0
  332. synth_ai/sdk/task/datasets.py +108 -0
  333. synth_ai/sdk/task/errors.py +50 -0
  334. synth_ai/sdk/task/health.py +34 -0
  335. synth_ai/sdk/task/in_process.py +1190 -0
  336. synth_ai/sdk/task/in_process_runner.py +314 -0
  337. synth_ai/sdk/task/inference_api.py +299 -0
  338. synth_ai/sdk/task/json.py +111 -0
  339. synth_ai/sdk/task/proxy.py +287 -0
  340. synth_ai/sdk/task/rubrics/__init__.py +55 -0
  341. synth_ai/sdk/task/rubrics/loaders.py +156 -0
  342. synth_ai/sdk/task/rubrics/models.py +57 -0
  343. synth_ai/sdk/task/rubrics/scoring.py +116 -0
  344. synth_ai/sdk/task/rubrics/strict.py +149 -0
  345. synth_ai/sdk/task/rubrics.py +219 -0
  346. synth_ai/sdk/task/server.py +631 -0
  347. synth_ai/sdk/task/trace_correlation_helpers.py +539 -0
  348. synth_ai/sdk/task/tracing_utils.py +95 -0
  349. synth_ai/sdk/task/validators.py +441 -0
  350. synth_ai/sdk/task/vendors.py +59 -0
  351. synth_ai/sdk/training/__init__.py +102 -0
  352. synth_ai/sdk/tunnels/__init__.py +83 -0
  353. synth_ai/sdk/tunnels/cleanup.py +83 -0
  354. synth_ai/sdk/tunnels/ports.py +120 -0
  355. synth_ai/utils/__init__.py +213 -0
  356. synth_ai-0.4.3.dist-info/METADATA +262 -0
  357. synth_ai-0.4.3.dist-info/RECORD +370 -0
  358. {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/entry_points.txt +0 -1
  359. synth_ai/cli/calc.py +0 -69
  360. synth_ai/cli/demo.py +0 -131
  361. synth_ai/cli/legacy_root_backup.py +0 -470
  362. synth_ai/cli/man.py +0 -106
  363. synth_ai/cli/rl_demo.py +0 -137
  364. synth_ai/cli/status.py +0 -133
  365. synth_ai/config/base_url.py +0 -98
  366. synth_ai/core/experiment.py +0 -15
  367. synth_ai/core/system.py +0 -15
  368. synth_ai/demos/core/__init__.py +0 -1
  369. synth_ai/demos/core/cli.py +0 -685
  370. synth_ai/demos/demo_task_apps/__init__.py +0 -1
  371. synth_ai/demos/demo_task_apps/math/config.toml +0 -44
  372. synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
  373. synth_ai/environments/__init__.py +0 -31
  374. synth_ai/environments/environment/__init__.py +0 -1
  375. synth_ai/environments/environment/artifacts/__init__.py +0 -1
  376. synth_ai/environments/environment/artifacts/base.py +0 -52
  377. synth_ai/environments/environment/core.py +0 -67
  378. synth_ai/environments/environment/db/__init__.py +0 -1
  379. synth_ai/environments/environment/db/sqlite.py +0 -45
  380. synth_ai/environments/environment/registry.py +0 -233
  381. synth_ai/environments/environment/resources/sqlite.py +0 -45
  382. synth_ai/environments/environment/results.py +0 -1
  383. synth_ai/environments/environment/rewards/__init__.py +0 -1
  384. synth_ai/environments/environment/rewards/core.py +0 -29
  385. synth_ai/environments/environment/shared_engine.py +0 -26
  386. synth_ai/environments/environment/tools/__init__.py +0 -200
  387. synth_ai/environments/examples/__init__.py +0 -1
  388. synth_ai/environments/examples/bandit/__init__.py +0 -33
  389. synth_ai/environments/examples/bandit/engine.py +0 -294
  390. synth_ai/environments/examples/bandit/environment.py +0 -194
  391. synth_ai/environments/examples/bandit/taskset.py +0 -200
  392. synth_ai/environments/examples/crafter_classic/__init__.py +0 -8
  393. synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -250
  394. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -59
  395. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -152
  396. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -24
  397. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -1194
  398. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -56
  399. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -32
  400. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -724
  401. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -384
  402. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -53
  403. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -178
  404. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -222
  405. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -183
  406. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -210
  407. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -206
  408. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -49
  409. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -64
  410. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -88
  411. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -77
  412. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -324
  413. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -580
  414. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -362
  415. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -49
  416. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -332
  417. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -97
  418. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -217
  419. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -87
  420. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -88
  421. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -195
  422. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -400
  423. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -195
  424. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -56
  425. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -858
  426. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -52
  427. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -874
  428. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -1412
  429. synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -216
  430. synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -296
  431. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -58
  432. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -464
  433. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -152
  434. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -51
  435. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -1412
  436. synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -112
  437. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -203
  438. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -305
  439. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -126
  440. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -94
  441. synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -142
  442. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -26
  443. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -984
  444. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -724
  445. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -386
  446. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -205
  447. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -150
  448. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -283
  449. synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -280
  450. synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -456
  451. synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -166
  452. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -102
  453. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -128
  454. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -655
  455. synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -202
  456. synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -166
  457. synth_ai/environments/examples/crafter_classic/config_logging.py +0 -111
  458. synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
  459. synth_ai/environments/examples/crafter_classic/engine.py +0 -579
  460. synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -64
  461. synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -6
  462. synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -75
  463. synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -267
  464. synth_ai/environments/examples/crafter_classic/environment.py +0 -404
  465. synth_ai/environments/examples/crafter_classic/taskset.py +0 -233
  466. synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -228
  467. synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -299
  468. synth_ai/environments/examples/crafter_custom/__init__.py +0 -4
  469. synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -1
  470. synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -202
  471. synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -7
  472. synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -182
  473. synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -8
  474. synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -269
  475. synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -262
  476. synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -417
  477. synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -187
  478. synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -118
  479. synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -373
  480. synth_ai/environments/examples/crafter_custom/environment.py +0 -312
  481. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -159
  482. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -158
  483. synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -71
  484. synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -105
  485. synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -119
  486. synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -52
  487. synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -305
  488. synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -156
  489. synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -281
  490. synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -25
  491. synth_ai/environments/examples/enron/engine.py +0 -295
  492. synth_ai/environments/examples/enron/environment.py +0 -166
  493. synth_ai/environments/examples/enron/taskset.py +0 -112
  494. synth_ai/environments/examples/enron/units/keyword_stats.py +0 -112
  495. synth_ai/environments/examples/minigrid/__init__.py +0 -48
  496. synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -1188
  497. synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -48
  498. synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -562
  499. synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -221
  500. synth_ai/environments/examples/minigrid/engine.py +0 -589
  501. synth_ai/environments/examples/minigrid/environment.py +0 -274
  502. synth_ai/environments/examples/minigrid/environment_mapping.py +0 -242
  503. synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -417
  504. synth_ai/environments/examples/minigrid/taskset.py +0 -583
  505. synth_ai/environments/examples/nethack/__init__.py +0 -7
  506. synth_ai/environments/examples/nethack/achievements.py +0 -337
  507. synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -981
  508. synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -74
  509. synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -831
  510. synth_ai/environments/examples/nethack/engine.py +0 -739
  511. synth_ai/environments/examples/nethack/environment.py +0 -256
  512. synth_ai/environments/examples/nethack/helpers/__init__.py +0 -41
  513. synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -301
  514. synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -402
  515. synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -433
  516. synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -200
  517. synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -269
  518. synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -308
  519. synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -431
  520. synth_ai/environments/examples/nethack/taskset.py +0 -323
  521. synth_ai/environments/examples/red/__init__.py +0 -7
  522. synth_ai/environments/examples/red/agent_demos/__init__.py +0 -1
  523. synth_ai/environments/examples/red/config_logging.py +0 -110
  524. synth_ai/environments/examples/red/engine.py +0 -694
  525. synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -1
  526. synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -28
  527. synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -276
  528. synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -142
  529. synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -57
  530. synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -284
  531. synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -150
  532. synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -138
  533. synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -57
  534. synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -331
  535. synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -121
  536. synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -559
  537. synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -313
  538. synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -148
  539. synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -247
  540. synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -368
  541. synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -140
  542. synth_ai/environments/examples/red/environment.py +0 -238
  543. synth_ai/environments/examples/red/taskset.py +0 -79
  544. synth_ai/environments/examples/red/units/__init__.py +0 -1
  545. synth_ai/environments/examples/sokoban/__init__.py +0 -1
  546. synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -899
  547. synth_ai/environments/examples/sokoban/engine.py +0 -678
  548. synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -1
  549. synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -657
  550. synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -18
  551. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -3
  552. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -131
  553. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -370
  554. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -332
  555. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -306
  556. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -67
  557. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -115
  558. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -123
  559. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -394
  560. synth_ai/environments/examples/sokoban/environment.py +0 -229
  561. synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -440
  562. synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -312
  563. synth_ai/environments/examples/sokoban/taskset.py +0 -428
  564. synth_ai/environments/examples/sokoban/units/astar_common.py +0 -95
  565. synth_ai/environments/examples/tictactoe/__init__.py +0 -1
  566. synth_ai/environments/examples/tictactoe/engine.py +0 -368
  567. synth_ai/environments/examples/tictactoe/environment.py +0 -240
  568. synth_ai/environments/examples/tictactoe/taskset.py +0 -215
  569. synth_ai/environments/examples/verilog/__init__.py +0 -10
  570. synth_ai/environments/examples/verilog/engine.py +0 -329
  571. synth_ai/environments/examples/verilog/environment.py +0 -350
  572. synth_ai/environments/examples/verilog/taskset.py +0 -420
  573. synth_ai/environments/examples/wordle/__init__.py +0 -29
  574. synth_ai/environments/examples/wordle/engine.py +0 -398
  575. synth_ai/environments/examples/wordle/environment.py +0 -159
  576. synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -75
  577. synth_ai/environments/examples/wordle/taskset.py +0 -230
  578. synth_ai/environments/reproducibility/core.py +0 -42
  579. synth_ai/environments/reproducibility/helpers.py +0 -0
  580. synth_ai/environments/reproducibility/tree.py +0 -364
  581. synth_ai/environments/service/app.py +0 -91
  582. synth_ai/environments/service/core_routes.py +0 -1020
  583. synth_ai/environments/service/external_registry.py +0 -56
  584. synth_ai/environments/service/registry.py +0 -9
  585. synth_ai/environments/stateful/__init__.py +0 -1
  586. synth_ai/environments/stateful/core.py +0 -163
  587. synth_ai/environments/stateful/engine.py +0 -21
  588. synth_ai/environments/stateful/state.py +0 -7
  589. synth_ai/environments/tasks/api.py +0 -19
  590. synth_ai/environments/tasks/core.py +0 -80
  591. synth_ai/environments/tasks/filters.py +0 -41
  592. synth_ai/environments/tasks/utils.py +0 -91
  593. synth_ai/environments/v0_observability/history.py +0 -3
  594. synth_ai/environments/v0_observability/log.py +0 -2
  595. synth_ai/evals/base.py +0 -15
  596. synth_ai/experimental/synth_oss.py +0 -446
  597. synth_ai/http.py +0 -102
  598. synth_ai/inference/client.py +0 -20
  599. synth_ai/install_sqld.sh +0 -40
  600. synth_ai/jobs/client.py +0 -246
  601. synth_ai/learning/__init__.py +0 -24
  602. synth_ai/learning/config.py +0 -43
  603. synth_ai/learning/filtering.py +0 -0
  604. synth_ai/learning/ft_client.py +0 -59
  605. synth_ai/learning/offline/dpo.py +0 -0
  606. synth_ai/learning/offline/providers.py +0 -7
  607. synth_ai/learning/offline/sft.py +0 -0
  608. synth_ai/learning/offline/shared.py +0 -0
  609. synth_ai/learning/online/grpo.py +0 -0
  610. synth_ai/learning/online/irft.py +0 -0
  611. synth_ai/learning/prompts/banking77_injection_eval.py +0 -168
  612. synth_ai/learning/prompts/gepa.py +0 -0
  613. synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +0 -213
  614. synth_ai/learning/prompts/mipro.py +0 -289
  615. synth_ai/learning/prompts/random_search.py +0 -246
  616. synth_ai/learning/prompts/run_mipro_banking77.py +0 -172
  617. synth_ai/learning/prompts/run_random_search_banking77.py +0 -324
  618. synth_ai/learning/sse.py +0 -58
  619. synth_ai/learning/validators.py +0 -48
  620. synth_ai/lm/__init__.py +0 -51
  621. synth_ai/lm/caching/constants.py +0 -6
  622. synth_ai/lm/caching/dbs.py +0 -0
  623. synth_ai/lm/caching/ephemeral.py +0 -102
  624. synth_ai/lm/caching/handler.py +0 -137
  625. synth_ai/lm/caching/initialize.py +0 -11
  626. synth_ai/lm/caching/persistent.py +0 -114
  627. synth_ai/lm/config.py +0 -110
  628. synth_ai/lm/constants.py +0 -32
  629. synth_ai/lm/core/__init__.py +0 -8
  630. synth_ai/lm/core/all.py +0 -73
  631. synth_ai/lm/core/exceptions.py +0 -7
  632. synth_ai/lm/core/main.py +0 -319
  633. synth_ai/lm/core/main_v3.py +0 -594
  634. synth_ai/lm/core/synth_models.py +0 -48
  635. synth_ai/lm/core/vendor_clients.py +0 -188
  636. synth_ai/lm/cost/__init__.py +0 -0
  637. synth_ai/lm/cost/monitor.py +0 -1
  638. synth_ai/lm/cost/statefulness.py +0 -1
  639. synth_ai/lm/injection.py +0 -80
  640. synth_ai/lm/overrides.py +0 -206
  641. synth_ai/lm/provider_support/__init__.py +0 -8
  642. synth_ai/lm/provider_support/anthropic.py +0 -972
  643. synth_ai/lm/provider_support/openai.py +0 -1139
  644. synth_ai/lm/provider_support/suppress_logging.py +0 -31
  645. synth_ai/lm/structured_outputs/__init__.py +0 -0
  646. synth_ai/lm/structured_outputs/handler.py +0 -440
  647. synth_ai/lm/structured_outputs/inject.py +0 -297
  648. synth_ai/lm/structured_outputs/rehabilitate.py +0 -185
  649. synth_ai/lm/tools/__init__.py +0 -3
  650. synth_ai/lm/tools/base.py +0 -172
  651. synth_ai/lm/unified_interface.py +0 -202
  652. synth_ai/lm/vendors/__init__.py +0 -0
  653. synth_ai/lm/vendors/base.py +0 -81
  654. synth_ai/lm/vendors/core/__init__.py +0 -0
  655. synth_ai/lm/vendors/core/anthropic_api.py +0 -387
  656. synth_ai/lm/vendors/core/gemini_api.py +0 -292
  657. synth_ai/lm/vendors/core/mistral_api.py +0 -322
  658. synth_ai/lm/vendors/core/openai_api.py +0 -220
  659. synth_ai/lm/vendors/core/synth_dev_api.py +0 -0
  660. synth_ai/lm/vendors/local/__init__.py +0 -0
  661. synth_ai/lm/vendors/local/ollama.py +0 -0
  662. synth_ai/lm/vendors/openai_standard.py +0 -780
  663. synth_ai/lm/vendors/openai_standard_responses.py +0 -256
  664. synth_ai/lm/vendors/retries.py +0 -22
  665. synth_ai/lm/vendors/supported/__init__.py +0 -0
  666. synth_ai/lm/vendors/supported/custom_endpoint.py +0 -417
  667. synth_ai/lm/vendors/supported/deepseek.py +0 -69
  668. synth_ai/lm/vendors/supported/grok.py +0 -75
  669. synth_ai/lm/vendors/supported/groq.py +0 -16
  670. synth_ai/lm/vendors/supported/ollama.py +0 -15
  671. synth_ai/lm/vendors/supported/openrouter.py +0 -74
  672. synth_ai/lm/vendors/supported/together.py +0 -11
  673. synth_ai/lm/vendors/synth_client.py +0 -808
  674. synth_ai/lm/warmup.py +0 -186
  675. synth_ai/rl/secrets.py +0 -19
  676. synth_ai/scripts/verify_rewards.py +0 -100
  677. synth_ai/task/__init__.py +0 -10
  678. synth_ai/task/contracts.py +0 -120
  679. synth_ai/task/health.py +0 -28
  680. synth_ai/task/validators.py +0 -12
  681. synth_ai/tracing/__init__.py +0 -30
  682. synth_ai/tracing_v1/__init__.py +0 -33
  683. synth_ai/tracing_v3/config.py +0 -84
  684. synth_ai/tracing_v3/storage/config.py +0 -62
  685. synth_ai/tracing_v3/turso/__init__.py +0 -25
  686. synth_ai/tracing_v3/turso/daemon.py +0 -144
  687. synth_ai/tracing_v3/turso/manager.py +0 -760
  688. synth_ai/v0/tracing/__init__.py +0 -0
  689. synth_ai/v0/tracing/abstractions.py +0 -224
  690. synth_ai/v0/tracing/base_client.py +0 -91
  691. synth_ai/v0/tracing/client_manager.py +0 -131
  692. synth_ai/v0/tracing/config.py +0 -140
  693. synth_ai/v0/tracing/context.py +0 -146
  694. synth_ai/v0/tracing/decorators.py +0 -680
  695. synth_ai/v0/tracing/events/__init__.py +0 -0
  696. synth_ai/v0/tracing/events/manage.py +0 -147
  697. synth_ai/v0/tracing/events/scope.py +0 -86
  698. synth_ai/v0/tracing/events/store.py +0 -228
  699. synth_ai/v0/tracing/immediate_client.py +0 -151
  700. synth_ai/v0/tracing/local.py +0 -18
  701. synth_ai/v0/tracing/log_client_base.py +0 -73
  702. synth_ai/v0/tracing/retry_queue.py +0 -186
  703. synth_ai/v0/tracing/trackers.py +0 -515
  704. synth_ai/v0/tracing/upload.py +0 -510
  705. synth_ai/v0/tracing/utils.py +0 -9
  706. synth_ai/v0/tracing_v1/__init__.py +0 -16
  707. synth_ai/v0/tracing_v1/abstractions.py +0 -224
  708. synth_ai/v0/tracing_v1/base_client.py +0 -91
  709. synth_ai/v0/tracing_v1/client_manager.py +0 -131
  710. synth_ai/v0/tracing_v1/config.py +0 -140
  711. synth_ai/v0/tracing_v1/context.py +0 -146
  712. synth_ai/v0/tracing_v1/decorators.py +0 -701
  713. synth_ai/v0/tracing_v1/events/__init__.py +0 -0
  714. synth_ai/v0/tracing_v1/events/manage.py +0 -147
  715. synth_ai/v0/tracing_v1/events/scope.py +0 -86
  716. synth_ai/v0/tracing_v1/events/store.py +0 -228
  717. synth_ai/v0/tracing_v1/immediate_client.py +0 -151
  718. synth_ai/v0/tracing_v1/local.py +0 -18
  719. synth_ai/v0/tracing_v1/log_client_base.py +0 -73
  720. synth_ai/v0/tracing_v1/retry_queue.py +0 -186
  721. synth_ai/v0/tracing_v1/trackers.py +0 -515
  722. synth_ai/v0/tracing_v1/upload.py +0 -525
  723. synth_ai/v0/tracing_v1/utils.py +0 -9
  724. synth_ai/zyk/__init__.py +0 -30
  725. synth_ai-0.2.6.dev1.dist-info/METADATA +0 -106
  726. synth_ai-0.2.6.dev1.dist-info/RECORD +0 -416
  727. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
  728. /synth_ai/{lm/caching → core/apps}/__init__.py +0 -0
  729. /synth_ai/{tracing_v3 → core/tracing_v3}/lm_call_record_abstractions.py +0 -0
  730. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/__init__.py +0 -0
  731. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/exceptions.py +0 -0
  732. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/types.py +0 -0
  733. /synth_ai/{compound/cais.py → py.typed} +0 -0
  734. /synth_ai/{learning → sdk/learning}/core.py +0 -0
  735. /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
  736. {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/WHEEL +0 -0
  737. {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/licenses/LICENSE +0 -0
  738. {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/top_level.txt +0 -0
@@ -1,400 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Custom evaluation pipelines for analyzing Crafter traces using Gemini-1.5-flash.
4
- """
5
-
6
- import json
7
- import duckdb
8
- from typing import List, Dict, Any, Optional
9
- import asyncio
10
- import os
11
- import sys
12
- import random
13
-
14
- # Add the synth_ai path to import base classes
15
- sys.path.append(os.path.join(os.path.dirname(__file__), '../../../../../'))
16
- from synth_ai.evals.base import Judgement, BaseEval
17
- from synth_ai.lm.core.main_v2 import LM
18
-
19
- class MisunderstoodCrafterRulesEval(BaseEval):
20
- """Evaluate if the agent misunderstood Crafter game rules."""
21
-
22
- def __init__(self, model_name: str = "gpt-4o-mini"):
23
- self.model_name = model_name
24
- self.lm = LM(
25
- model_name=model_name,
26
- formatting_model_name="gpt-4o-mini",
27
- temperature=0.3 # Increased temperature for more variety
28
- )
29
-
30
- async def run(self, session_data: Dict[str, Any]) -> List[Judgement]:
31
- """Analyze if the agent misunderstood Crafter rules using LLM."""
32
-
33
- # Extract relevant data from session
34
- actions = session_data.get("actions", [])
35
- invalid_actions = session_data.get("invalid_actions", [])
36
- achievements = session_data.get("achievements", [])
37
- inventory_changes = session_data.get("inventory_changes", [])
38
- total_steps = session_data.get("total_steps", 0)
39
-
40
- # Add some randomization to the prompt
41
- random_seed = random.randint(1, 1000)
42
-
43
- # Create analysis prompt with more specific instructions
44
- prompt = f"""
45
- You are an expert evaluator analyzing a Crafter game session to determine if the agent misunderstood the game rules.
46
-
47
- CRAFTER GAME RULES:
48
- - The agent can move in 4 directions: up, down, left, right
49
- - The agent can perform actions like: collect, craft, place, eat, sleep
50
- - Valid actions depend on what's nearby and what's in inventory
51
- - The goal is to achieve various crafting milestones
52
-
53
- SESSION DATA (Seed: {random_seed}):
54
- Total steps: {total_steps}
55
- Actions taken: {actions[:30]} # First 30 actions
56
- Invalid actions: {invalid_actions[:20]} # First 20 invalid actions
57
- Achievements unlocked: {achievements}
58
- Inventory changes: {inventory_changes[:10]} # First 10 inventory changes
59
-
60
- ANALYSIS TASK:
61
- Analyze if the agent misunderstood Crafter rules. Look for:
62
- 1. Repeated invalid actions that suggest rule confusion
63
- 2. Actions that don't make sense given the game state
64
- 3. Missing obvious valid actions
65
- 4. Inefficient action patterns
66
- 5. Specific rule violations (movement, crafting, collection)
67
-
68
- Provide your analysis in this EXACT JSON format (no additional text):
69
- {{
70
- "score": <float 0-1, where 1=severe misunderstanding>,
71
- "reasoning": "<detailed explanation>",
72
- "evidence": ["<specific example 1>", "<specific example 2>", ...],
73
- "rule_violations": ["<specific rule misunderstood 1>", ...]
74
- }}
75
-
76
- Focus on concrete evidence from the session data. Be specific about what rules the agent seems to misunderstand.
77
- """
78
-
79
- try:
80
- # Use the existing LM infrastructure
81
- response = await self.lm.respond_async(
82
- system_message="You are an expert evaluator analyzing AI agent behavior in games. Respond only with valid JSON.",
83
- user_message=prompt
84
- )
85
-
86
- print(f"DEBUG - Raw LLM response: {response.raw_response[:200]}...")
87
-
88
- # Parse JSON response
89
- try:
90
- result = json.loads(response.raw_response)
91
- except json.JSONDecodeError:
92
- # Try to extract JSON from response
93
- import re
94
- json_match = re.search(r'\{.*\}', response.raw_response, re.DOTALL)
95
- if json_match:
96
- result = json.loads(json_match.group())
97
- else:
98
- result = {
99
- "score": 0.5,
100
- "reasoning": "Could not parse LLM response",
101
- "evidence": ["Response parsing failed"],
102
- "rule_violations": []
103
- }
104
-
105
- return [Judgement(
106
- criteria="misunderstood_crafter_rules",
107
- score=result.get("score", 0.5),
108
- reasoning=result.get("reasoning", "No reasoning provided"),
109
- evidence=result.get("evidence", [])
110
- )]
111
-
112
- except Exception as e:
113
- return [Judgement(
114
- criteria="misunderstood_crafter_rules",
115
- score=0.5,
116
- reasoning=f"Evaluation failed: {str(e)}",
117
- evidence=[f"Error: {str(e)}"]
118
- )]
119
-
120
- class WastedTimeEval(BaseEval):
121
- """Evaluate if the agent wasted time in inefficient actions."""
122
-
123
- def __init__(self, model_name: str = "gpt-4o-mini"):
124
- self.model_name = model_name
125
- self.lm = LM(
126
- model_name=model_name,
127
- formatting_model_name="gpt-4o-mini",
128
- temperature=0.3 # Increased temperature for more variety
129
- )
130
-
131
- async def run(self, session_data: Dict[str, Any]) -> List[Judgement]:
132
- """Analyze if the agent wasted time inefficiently using LLM."""
133
-
134
- # Extract relevant data from session
135
- actions = session_data.get("actions", [])
136
- invalid_actions = session_data.get("invalid_actions", [])
137
- achievements = session_data.get("achievements", [])
138
- inventory_changes = session_data.get("inventory_changes", [])
139
- total_steps = session_data.get("total_steps", 0)
140
-
141
- # Add some randomization to the prompt
142
- random_seed = random.randint(1, 1000)
143
-
144
- # Create analysis prompt with more specific instructions
145
- prompt = f"""
146
- You are an expert evaluator analyzing a Crafter game session to determine if the agent wasted time inefficiently.
147
-
148
- EFFICIENCY CRITERIA:
149
- - Repeated failed actions that could be avoided
150
- - Unnecessary movement patterns
151
- - Inefficient resource gathering
152
- - Poor prioritization of goals
153
- - Actions that don't contribute to achievements
154
- - Time spent on non-productive activities
155
-
156
- SESSION DATA (Seed: {random_seed}):
157
- Total steps: {total_steps}
158
- Actions taken: {actions[:40]} # First 40 actions
159
- Invalid actions: {invalid_actions[:25]} # First 25 invalid actions
160
- Achievements unlocked: {achievements}
161
- Inventory changes: {inventory_changes[:15]} # First 15 inventory changes
162
-
163
- ANALYSIS TASK:
164
- Analyze if the agent wasted time inefficiently. Look for:
165
- 1. Repeated invalid actions that waste steps
166
- 2. Inefficient movement patterns
167
- 3. Poor resource gathering strategies
168
- 4. Actions that don't advance toward goals
169
- 5. Missed opportunities for better actions
170
- 6. Time spent on non-productive activities
171
-
172
- Provide your analysis in this EXACT JSON format (no additional text):
173
- {{
174
- "score": <float 0-1, where 1=severe time wasting>,
175
- "reasoning": "<detailed explanation>",
176
- "evidence": ["<specific example 1>", "<specific example 2>", ...],
177
- "inefficiencies": ["<specific inefficiency 1>", ...],
178
- "efficiency_score": <float 0-1, where 1=very efficient>
179
- }}
180
-
181
- Focus on concrete evidence from the session data. Be specific about how the agent wasted time.
182
- """
183
-
184
- try:
185
- # Use the existing LM infrastructure
186
- response = await self.lm.respond_async(
187
- system_message="You are an expert evaluator analyzing AI agent efficiency in games. Respond only with valid JSON.",
188
- user_message=prompt
189
- )
190
-
191
- print(f"DEBUG - Raw LLM response: {response.raw_response[:200]}...")
192
-
193
- # Parse JSON response
194
- try:
195
- result = json.loads(response.raw_response)
196
- except json.JSONDecodeError:
197
- # Try to extract JSON from response
198
- import re
199
- json_match = re.search(r'\{.*\}', response.raw_response, re.DOTALL)
200
- if json_match:
201
- result = json.loads(json_match.group())
202
- else:
203
- result = {
204
- "score": 0.5,
205
- "reasoning": "Could not parse LLM response",
206
- "evidence": ["Response parsing failed"],
207
- "inefficiencies": [],
208
- "efficiency_score": 0.5
209
- }
210
-
211
- return [Judgement(
212
- criteria="wasted_time",
213
- score=result.get("score", 0.5),
214
- reasoning=result.get("reasoning", "No reasoning provided"),
215
- evidence=result.get("evidence", [])
216
- )]
217
-
218
- except Exception as e:
219
- return [Judgement(
220
- criteria="wasted_time",
221
- score=0.5,
222
- reasoning=f"Evaluation failed: {str(e)}",
223
- evidence=[f"Error: {str(e)}"]
224
- )]
225
-
226
- class CrafterTraceAnalyzer:
227
- """Main analyzer for Crafter traces."""
228
-
229
- def __init__(self, experiment_id: str, db_path: str = "crafter_traces.duckdb", model_name: str = "gpt-4o-mini"):
230
- self.experiment_id = experiment_id
231
- self.db_path = db_path
232
- self.model_name = model_name
233
-
234
- # Initialize evaluators
235
- self.misunderstood_rules_eval = MisunderstoodCrafterRulesEval(model_name)
236
- self.wasted_time_eval = WastedTimeEval(model_name)
237
-
238
- def extract_session_data(self, session_id: str) -> Dict[str, Any]:
239
- """Extract session data from DuckDB."""
240
- conn = duckdb.connect(self.db_path)
241
-
242
- # Get session metadata
243
- result = conn.execute("""
244
- SELECT metadata FROM session_traces
245
- WHERE session_id = ? AND experiment_id = ?
246
- """, [session_id, self.experiment_id]).fetchall()
247
-
248
- session_data = {}
249
- if result:
250
- metadata = json.loads(result[0][0]) if isinstance(result[0][0], str) else result[0][0]
251
-
252
- # Extract achievements
253
- for item in metadata:
254
- if item.get('metadata_type') == 'SessionMetadum':
255
- data = item.get('data', {})
256
- if 'achievements' in data:
257
- achievements = data['achievements']
258
- session_data['achievements'] = [k for k, v in achievements.items() if v]
259
- if 'num_achievements' in data:
260
- session_data['num_achievements'] = data['num_achievements']
261
- if 'total_reward' in data:
262
- session_data['total_reward'] = data['total_reward']
263
- if 'rollout_length' in data:
264
- session_data['total_steps'] = data['rollout_length']
265
-
266
- # Get events for action analysis
267
- result = conn.execute("""
268
- SELECT event_type, metadata, event_metadata
269
- FROM events
270
- WHERE session_id = ?
271
- ORDER BY event_time
272
- """, [session_id]).fetchall()
273
-
274
- actions = []
275
- invalid_actions = []
276
- inventory_changes = []
277
-
278
- for event_type, metadata, event_metadata in result:
279
- if event_type == 'runtime':
280
- # Parse action from metadata
281
- try:
282
- meta_dict = json.loads(metadata) if isinstance(metadata, str) else metadata
283
- if 'action' in meta_dict:
284
- actions.append(meta_dict['action'])
285
- except:
286
- pass
287
-
288
- # Check for invalid actions in event_metadata
289
- if event_metadata:
290
- try:
291
- hook_list = json.loads(event_metadata) if isinstance(event_metadata, str) else event_metadata
292
- for hook_str in hook_list:
293
- if isinstance(hook_str, str):
294
- import re
295
- if "'hook_name': 'invalid_action'" in hook_str:
296
- # Extract the actual action name from the description
297
- action_match = re.search(r"'action':\s*'([^']+)'", hook_str)
298
- if action_match:
299
- invalid_actions.append(action_match.group(1))
300
- else:
301
- invalid_actions.append("unknown")
302
- except:
303
- pass
304
-
305
- elif event_type == 'environment':
306
- # Check for inventory changes
307
- if event_metadata:
308
- try:
309
- hook_list = json.loads(event_metadata) if isinstance(event_metadata, str) else event_metadata
310
- for hook_str in hook_list:
311
- if isinstance(hook_str, str):
312
- if "'hook_name': 'inventory_increase'" in hook_str:
313
- inventory_changes.append("inventory_increase")
314
- except:
315
- pass
316
-
317
- session_data.update({
318
- 'actions': actions,
319
- 'invalid_actions': invalid_actions,
320
- 'inventory_changes': inventory_changes
321
- })
322
-
323
- conn.close()
324
- return session_data
325
-
326
- async def evaluate_session(self, session_id: str) -> Dict[str, List[Judgement]]:
327
- """Evaluate a single session."""
328
- session_data = self.extract_session_data(session_id)
329
-
330
- # Run evaluations
331
- misunderstood_rules = await self.misunderstood_rules_eval.run(session_data)
332
- wasted_time = await self.wasted_time_eval.run(session_data)
333
-
334
- return {
335
- 'misunderstood_rules': misunderstood_rules,
336
- 'wasted_time': wasted_time
337
- }
338
-
339
- async def evaluate_experiment(self) -> Dict[str, Any]:
340
- """Evaluate all sessions in the experiment."""
341
- conn = duckdb.connect(self.db_path)
342
-
343
- # Get all session IDs for this experiment
344
- result = conn.execute("""
345
- SELECT session_id FROM session_traces
346
- WHERE experiment_id = ?
347
- ORDER BY session_id
348
- """, [self.experiment_id]).fetchall()
349
-
350
- session_ids = [row[0] for row in result]
351
- conn.close()
352
-
353
- print(f"Evaluating {len(session_ids)} sessions in parallel...")
354
-
355
- # Create all evaluation tasks
356
- tasks = [self.evaluate_session(session_id) for session_id in session_ids]
357
-
358
- # Run all evaluations in parallel
359
- all_results_list = await asyncio.gather(*tasks)
360
-
361
- # Convert to dictionary
362
- all_results = {}
363
- for session_id, results in zip(session_ids, all_results_list):
364
- all_results[session_id] = results
365
-
366
- return all_results
367
-
368
- async def main():
369
- """Example usage."""
370
- import sys
371
-
372
- if len(sys.argv) > 1:
373
- experiment_id = sys.argv[1]
374
- else:
375
- print("Usage: python custom_eval_pipelines.py <experiment_id>")
376
- print("Example: python custom_eval_pipelines.py 77022cce-4bda-4415-9bce-0095e4ef2237")
377
- return
378
-
379
- # Use Gemini for evaluation
380
- analyzer = CrafterTraceAnalyzer(experiment_id, model_name="gemini-1.5-flash")
381
- results = await analyzer.evaluate_experiment()
382
-
383
- # Print results
384
- print("\n" + "="*80)
385
- print("EVALUATION RESULTS")
386
- print("="*80)
387
-
388
- for session_id, session_results in results.items():
389
- print(f"\nSession: {session_id}")
390
- print("-" * 60)
391
-
392
- for eval_type, judgements in session_results.items():
393
- print(f"\n{eval_type.upper()}:")
394
- for judgement in judgements:
395
- print(f" Score: {judgement.score:.3f}")
396
- print(f" Reasoning: {judgement.reasoning}")
397
- print(f" Evidence: {judgement.evidence}")
398
-
399
- if __name__ == "__main__":
400
- asyncio.run(main())
@@ -1,195 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Plot the frequency of achievements and invalid actions over time (by step number).
4
- Terminal-only version.
5
- """
6
-
7
- import duckdb
8
- import json
9
- import re
10
- from collections import defaultdict
11
- from typing import Dict, List, Tuple
12
-
13
- def extract_step_from_metadata(metadata: str) -> int:
14
- """Extract step number from event metadata."""
15
- try:
16
- metadata_dict = json.loads(metadata) if isinstance(metadata, str) else metadata
17
- return metadata_dict.get('turn', 0)
18
- except:
19
- return 0
20
-
21
- def parse_hook_metadata(event_metadata: str) -> List[Dict]:
22
- """Parse hook metadata from event_metadata string with better error handling."""
23
- hooks = []
24
- try:
25
- # The metadata is stored as a list of strings, each containing a hook dict
26
- hook_list = json.loads(event_metadata) if isinstance(event_metadata, str) else event_metadata
27
-
28
- for hook_str in hook_list:
29
- if isinstance(hook_str, str):
30
- # Use regex to extract hook_name more reliably
31
- hook_name_match = re.search(r"'hook_name':\s*'([^']+)'", hook_str)
32
- if hook_name_match:
33
- hook_name = hook_name_match.group(1)
34
- hooks.append({'hook_name': hook_name})
35
- else:
36
- hooks.append(hook_str)
37
- except Exception as e:
38
- # Try alternative parsing if JSON fails
39
- try:
40
- # Look for hook_name patterns in the string
41
- hook_names = re.findall(r"'hook_name':\s*'([^']+)'", event_metadata)
42
- for hook_name in hook_names:
43
- hooks.append({'hook_name': hook_name})
44
- except:
45
- pass
46
-
47
- return hooks
48
-
49
- def analyze_hook_frequency(experiment_id: str):
50
- """Analyze hook frequency over time."""
51
- conn = duckdb.connect("crafter_traces.duckdb")
52
-
53
- print(f"📊 ANALYZING HOOK FREQUENCY OVER TIME")
54
- print("=" * 80)
55
- print(f"Experiment ID: {experiment_id}")
56
- print()
57
-
58
- # Get events with hook metadata
59
- result = conn.execute("""
60
- SELECT e.session_id, e.event_type, e.event_metadata, e.metadata
61
- FROM events e
62
- JOIN session_traces st ON e.session_id = st.session_id
63
- WHERE st.experiment_id = ? AND e.event_metadata IS NOT NULL
64
- ORDER BY e.event_time
65
- """, [experiment_id]).fetchall()
66
-
67
- # Track hook frequency by step
68
- step_achievements = defaultdict(int)
69
- step_invalid_actions = defaultdict(int)
70
- step_inventory_increases = defaultdict(int)
71
-
72
- # Track by session for more detailed analysis
73
- session_data = defaultdict(lambda: {
74
- 'achievements': defaultdict(int),
75
- 'invalid_actions': defaultdict(int),
76
- 'inventory_increases': defaultdict(int)
77
- })
78
-
79
- for row in result:
80
- session_id, event_type, event_metadata, metadata = row
81
-
82
- # Extract step number
83
- step = extract_step_from_metadata(metadata)
84
-
85
- # Parse hook metadata
86
- hooks = parse_hook_metadata(event_metadata)
87
-
88
- for hook in hooks:
89
- hook_name = hook.get('hook_name', 'unknown')
90
-
91
- if hook_name == 'easy_achievement' or hook_name == 'medium_achievement' or hook_name == 'hard_achievement':
92
- step_achievements[step] += 1
93
- session_data[session_id]['achievements'][step] += 1
94
- elif hook_name == 'invalid_action':
95
- step_invalid_actions[step] += 1
96
- session_data[session_id]['invalid_actions'][step] += 1
97
- elif hook_name == 'inventory_increase':
98
- step_inventory_increases[step] += 1
99
- session_data[session_id]['inventory_increases'][step] += 1
100
-
101
- # Prepare data for plotting
102
- max_step = max(
103
- max(step_achievements.keys()) if step_achievements else 0,
104
- max(step_invalid_actions.keys()) if step_invalid_actions else 0,
105
- max(step_inventory_increases.keys()) if step_inventory_increases else 0
106
- )
107
-
108
- steps = list(range(max_step + 1))
109
- achievement_freq = [step_achievements[step] for step in steps]
110
- invalid_action_freq = [step_invalid_actions[step] for step in steps]
111
- inventory_freq = [step_inventory_increases[step] for step in steps]
112
-
113
- # Print summary statistics
114
- print("📈 SUMMARY STATISTICS")
115
- print("-" * 50)
116
- print(f"Total steps analyzed: {max_step + 1}")
117
- print(f"Total achievements: {sum(achievement_freq)}")
118
- print(f"Total invalid actions: {sum(invalid_action_freq)}")
119
- print(f"Total inventory increases: {sum(inventory_freq)}")
120
- print()
121
-
122
- print("🏆 ACHIEVEMENT ANALYSIS")
123
- print("-" * 50)
124
- achievement_steps = [step for step, freq in step_achievements.items() if freq > 0]
125
- if achievement_steps:
126
- print(f"Achievements occur at steps: {sorted(achievement_steps)}")
127
- print(f"Most common achievement step: {max(step_achievements.items(), key=lambda x: x[1])}")
128
- else:
129
- print("No achievements found")
130
- print()
131
-
132
- print("❌ INVALID ACTION ANALYSIS")
133
- print("-" * 50)
134
- invalid_steps = [step for step, freq in step_invalid_actions.items() if freq > 0]
135
- if invalid_steps:
136
- print(f"Invalid actions occur at steps: {sorted(invalid_steps)}")
137
- print(f"Most common invalid action step: {max(step_invalid_actions.items(), key=lambda x: x[1])}")
138
- else:
139
- print("No invalid actions found")
140
- print()
141
-
142
- print("📦 INVENTORY ANALYSIS")
143
- print("-" * 50)
144
- inventory_steps = [step for step, freq in step_inventory_increases.items() if freq > 0]
145
- if inventory_steps:
146
- print(f"Inventory increases occur at steps: {sorted(inventory_steps)}")
147
- print(f"Most common inventory increase step: {max(step_inventory_increases.items(), key=lambda x: x[1])}")
148
- else:
149
- print("No inventory increases found")
150
-
151
- # Create ASCII chart
152
- print("\n📊 ASCII FREQUENCY CHART")
153
- print("=" * 80)
154
- print("Step | Achievements | Invalid Actions | Inventory")
155
- print("-" * 80)
156
-
157
- for step in steps:
158
- achievements = step_achievements[step]
159
- invalid_actions = step_invalid_actions[step]
160
- inventory = step_inventory_increases[step]
161
-
162
- if achievements > 0 or invalid_actions > 0 or inventory > 0:
163
- print(f"{step:4d} | {achievements:11d} | {invalid_actions:14d} | {inventory:9d}")
164
-
165
- # Session-by-session breakdown
166
- print("\n📋 SESSION-BY-SESSION BREAKDOWN")
167
- print("-" * 50)
168
- for session_id, data in session_data.items():
169
- print(f"\nSession: {session_id}")
170
- if data['achievements']:
171
- print(f" Achievements: {dict(data['achievements'])}")
172
- if data['invalid_actions']:
173
- print(f" Invalid actions: {dict(data['invalid_actions'])}")
174
- if data['inventory_increases']:
175
- print(f" Inventory increases: {dict(data['inventory_increases'])}")
176
-
177
- conn.close()
178
-
179
- return {
180
- 'steps': steps,
181
- 'achievement_freq': achievement_freq,
182
- 'invalid_action_freq': invalid_action_freq,
183
- 'inventory_freq': inventory_freq,
184
- 'session_data': session_data
185
- }
186
-
187
- if __name__ == "__main__":
188
- import sys
189
-
190
- if len(sys.argv) > 1:
191
- experiment_id = sys.argv[1]
192
- analyze_hook_frequency(experiment_id)
193
- else:
194
- print("Usage: python plot_hook_frequency.py <experiment_id>")
195
- print("Example: python plot_hook_frequency.py 77022cce-4bda-4415-9bce-0095e4ef2237")
@@ -1,56 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Summary analysis of seed performance comparison between GPT-4.1-NANO and GPT-4.1-MINI.
4
- """
5
-
6
- def print_summary():
7
- print("🎯 KEY FINDINGS: SEED PERFORMANCE COMPARISON")
8
- print("=" * 60)
9
-
10
- print("\n📊 OVERALL PERFORMANCE:")
11
- print(" • GPT-4.1-MINI: 12 total achievements across 9 instances")
12
- print(" • GPT-4.1-NANO: 2 total achievements across 2 instances")
13
- print(" • MINI wins: 9 out of 10 instances (90% win rate)")
14
- print(" • NANO wins: 0 out of 10 instances")
15
- print(" • Ties: 1 instance (instance 9)")
16
-
17
- print("\n🏆 INSTANCE-BY-INSTANCE BREAKDOWN:")
18
- print(" • Instance 1 (Seed 43): MINI wins (collect_wood vs 0)")
19
- print(" • Instance 2 (Seed 44): MINI wins (collect_wood vs 0)")
20
- print(" • Instance 3 (Seed 45): MINI wins (collect_sapling vs 0)")
21
- print(" • Instance 4 (Seed 46): MINI wins (collect_wood vs 0)")
22
- print(" • Instance 5 (Seed 47): MINI wins (collect_wood vs 0)")
23
- print(" • Instance 6 (Seed 48): MINI wins (collect_sapling + eat_cow vs collect_sapling)")
24
- print(" • Instance 7 (Seed 49): MINI wins (collect_sapling + collect_wood vs 0)")
25
- print(" • Instance 8 (Seed 50): MINI wins (collect_wood vs 0)")
26
- print(" • Instance 9 (Seed 51): TIE (0 vs 0)")
27
- print(" • Instance 10 (Seed 52): MINI wins (collect_sapling + collect_wood vs collect_wood)")
28
-
29
- print("\n🎯 ACHIEVEMENT TYPE ANALYSIS:")
30
- print(" • collect_wood: MINI 7, NANO 1 (MINI dominates)")
31
- print(" • collect_sapling: MINI 4, NANO 1 (MINI dominates)")
32
- print(" • eat_cow: MINI 1, NANO 0 (MINI only)")
33
- print(" • All other achievements: 0 for both models")
34
-
35
- print("\n🔍 PATTERNS OBSERVED:")
36
- print(" 1. MINI consistently outperforms NANO across almost all seeds")
37
- print(" 2. MINI achieves more complex combinations (e.g., collect_sapling + eat_cow)")
38
- print(" 3. NANO struggles with basic achievements (only 2 total vs MINI's 12)")
39
- print(" 4. Both models struggle with advanced achievements (iron, diamond, etc.)")
40
- print(" 5. MINI shows better exploration and resource gathering capabilities")
41
-
42
- print("\n📈 IMPLICATIONS:")
43
- print(" • MINI demonstrates significantly better reasoning and planning")
44
- print(" • MINI's larger context window may enable better multi-step planning")
45
- print(" • NANO may be hitting context limits or reasoning limitations")
46
- print(" • Both models struggle with complex crafting and combat achievements")
47
- print(" • The performance gap is consistent across different environment seeds")
48
-
49
- print("\n🎲 RANDOMNESS ANALYSIS:")
50
- print(" • Seeds 43-52 were tested (10 different environments)")
51
- print(" • MINI wins 9/10 = 90% win rate")
52
- print(" • This suggests the performance difference is robust, not random")
53
- print(" • Only instance 9 was a tie, suggesting MINI's advantage is consistent")
54
-
55
- if __name__ == "__main__":
56
- print_summary()