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

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

Potentially problematic release.


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

Files changed (1091) hide show
  1. synth_ai/__init__.py +19 -40
  2. synth_ai/__main__.py +30 -3
  3. synth_ai/cli/__init__.py +105 -70
  4. synth_ai/cli/__main__.py +42 -0
  5. synth_ai/cli/_internal/__init__.py +5 -0
  6. synth_ai/cli/_internal/modal_wrapper.py +31 -0
  7. synth_ai/cli/_internal/storage.py +20 -0
  8. synth_ai/cli/_internal/typer_patch.py +47 -0
  9. synth_ai/cli/_internal/validate_task_app.py +29 -0
  10. synth_ai/cli/agents/__init__.py +17 -0
  11. synth_ai/cli/agents/claude.py +77 -0
  12. synth_ai/cli/agents/codex.py +265 -0
  13. synth_ai/cli/agents/opencode.py +253 -0
  14. synth_ai/cli/commands/__init__.py +18 -0
  15. synth_ai/cli/commands/artifacts/__init__.py +13 -0
  16. synth_ai/cli/commands/artifacts/client.py +119 -0
  17. synth_ai/cli/commands/artifacts/config.py +57 -0
  18. synth_ai/cli/commands/artifacts/core.py +24 -0
  19. synth_ai/cli/commands/artifacts/download.py +188 -0
  20. synth_ai/cli/commands/artifacts/export.py +186 -0
  21. synth_ai/cli/commands/artifacts/list.py +156 -0
  22. synth_ai/cli/commands/artifacts/parsing.py +250 -0
  23. synth_ai/cli/commands/artifacts/show.py +336 -0
  24. synth_ai/cli/commands/baseline/__init__.py +12 -0
  25. synth_ai/cli/commands/baseline/core.py +636 -0
  26. synth_ai/cli/commands/baseline/list.py +94 -0
  27. synth_ai/cli/commands/demo/__init__.py +3 -0
  28. synth_ai/cli/commands/demo/core.py +153 -0
  29. synth_ai/cli/commands/eval/__init__.py +19 -0
  30. synth_ai/cli/commands/eval/core.py +1113 -0
  31. synth_ai/cli/commands/eval/errors.py +81 -0
  32. synth_ai/cli/commands/eval/validation.py +133 -0
  33. synth_ai/cli/commands/filter/__init__.py +12 -0
  34. synth_ai/cli/commands/filter/core.py +424 -0
  35. synth_ai/cli/commands/filter/errors.py +55 -0
  36. synth_ai/cli/commands/filter/validation.py +77 -0
  37. synth_ai/cli/commands/help/__init__.py +185 -0
  38. synth_ai/cli/commands/help/core.py +72 -0
  39. synth_ai/cli/commands/scan/__init__.py +19 -0
  40. synth_ai/cli/commands/scan/cloudflare_scanner.py +403 -0
  41. synth_ai/cli/commands/scan/core.py +344 -0
  42. synth_ai/cli/commands/scan/health_checker.py +242 -0
  43. synth_ai/cli/commands/scan/local_scanner.py +278 -0
  44. synth_ai/cli/commands/scan/models.py +83 -0
  45. synth_ai/cli/commands/smoke/__init__.py +7 -0
  46. synth_ai/cli/commands/smoke/core.py +1438 -0
  47. synth_ai/cli/commands/status/__init__.py +66 -0
  48. synth_ai/cli/commands/status/client.py +192 -0
  49. synth_ai/cli/commands/status/config.py +92 -0
  50. synth_ai/cli/commands/status/errors.py +20 -0
  51. synth_ai/cli/commands/status/formatters.py +164 -0
  52. synth_ai/cli/commands/status/subcommands/__init__.py +9 -0
  53. synth_ai/cli/commands/status/subcommands/files.py +79 -0
  54. synth_ai/cli/commands/status/subcommands/jobs.py +334 -0
  55. synth_ai/cli/commands/status/subcommands/models.py +79 -0
  56. synth_ai/cli/commands/status/subcommands/pricing.py +23 -0
  57. synth_ai/cli/commands/status/subcommands/runs.py +81 -0
  58. synth_ai/cli/commands/status/subcommands/session.py +182 -0
  59. synth_ai/cli/commands/status/subcommands/summary.py +47 -0
  60. synth_ai/cli/commands/status/subcommands/usage.py +203 -0
  61. synth_ai/cli/commands/status/utils.py +114 -0
  62. synth_ai/cli/commands/train/__init__.py +53 -0
  63. synth_ai/cli/commands/train/core.py +22 -0
  64. synth_ai/cli/commands/train/errors.py +117 -0
  65. synth_ai/cli/commands/train/judge_schemas.py +201 -0
  66. synth_ai/cli/commands/train/judge_validation.py +305 -0
  67. synth_ai/cli/commands/train/prompt_learning_validation.py +633 -0
  68. synth_ai/cli/commands/train/validation.py +392 -0
  69. synth_ai/cli/demo_apps/__init__.py +10 -0
  70. synth_ai/cli/demo_apps/core/__init__.py +28 -0
  71. synth_ai/cli/demo_apps/core/cli.py +1735 -0
  72. synth_ai/cli/demo_apps/crafter/crafter_fft_4b.toml +55 -0
  73. synth_ai/cli/demo_apps/crafter/grpo_crafter_task_app.py +186 -0
  74. synth_ai/cli/demo_apps/crafter/rl_from_base_qwen4b.toml +74 -0
  75. synth_ai/cli/demo_apps/demo_registry.py +176 -0
  76. synth_ai/cli/demo_apps/demo_task_apps/core.py +440 -0
  77. synth_ai/cli/demo_apps/demo_task_apps/crafter/__init__.py +1 -0
  78. synth_ai/cli/demo_apps/demo_task_apps/crafter/grpo_crafter_task_app.py +185 -0
  79. synth_ai/cli/demo_apps/demo_task_apps/math/modal_task_app.py +742 -0
  80. synth_ai/cli/demo_apps/demo_task_apps/math/task_app_entry.py +39 -0
  81. synth_ai/cli/demo_apps/math/__init__.py +1 -0
  82. synth_ai/cli/demo_apps/math/_common.py +16 -0
  83. synth_ai/cli/demo_apps/math/app.py +38 -0
  84. synth_ai/cli/demo_apps/math/config.toml +76 -0
  85. synth_ai/cli/demo_apps/math/deploy_modal.py +54 -0
  86. synth_ai/cli/demo_apps/math/modal_task_app.py +702 -0
  87. synth_ai/cli/demo_apps/math/task_app_entry.py +53 -0
  88. synth_ai/cli/demo_apps/mipro/main.py +271 -0
  89. synth_ai/cli/demo_apps/mipro/task_app.py +933 -0
  90. synth_ai/cli/demo_apps/mipro/train_cfg.toml +92 -0
  91. synth_ai/cli/demos/__init__.py +12 -0
  92. synth_ai/cli/demos/demo.py +32 -0
  93. synth_ai/cli/demos/rl_demo.py +254 -0
  94. synth_ai/cli/deploy.py +216 -0
  95. synth_ai/cli/infra/__init__.py +14 -0
  96. synth_ai/cli/infra/balance.py +216 -0
  97. synth_ai/cli/infra/mcp.py +35 -0
  98. synth_ai/cli/infra/modal_app.py +36 -0
  99. synth_ai/cli/infra/setup.py +69 -0
  100. synth_ai/cli/infra/status.py +16 -0
  101. synth_ai/cli/infra/turso.py +77 -0
  102. synth_ai/cli/lib/__init__.py +10 -0
  103. synth_ai/cli/lib/agents.py +76 -0
  104. synth_ai/cli/lib/apps/modal_app.py +101 -0
  105. synth_ai/cli/lib/apps/task_app.py +643 -0
  106. synth_ai/cli/lib/bin.py +39 -0
  107. synth_ai/cli/lib/env.py +375 -0
  108. synth_ai/cli/lib/errors.py +85 -0
  109. synth_ai/cli/lib/modal.py +315 -0
  110. synth_ai/cli/lib/plotting.py +126 -0
  111. synth_ai/cli/lib/prompt_args.py +39 -0
  112. synth_ai/cli/lib/prompts.py +284 -0
  113. synth_ai/cli/lib/sqld.py +122 -0
  114. synth_ai/cli/lib/task_app_discovery.py +884 -0
  115. synth_ai/cli/lib/task_app_env.py +295 -0
  116. synth_ai/cli/lib/train_cfgs.py +300 -0
  117. synth_ai/cli/lib/tunnel_records.py +207 -0
  118. synth_ai/cli/local/__init__.py +14 -0
  119. synth_ai/cli/local/experiment_queue/__init__.py +72 -0
  120. synth_ai/cli/local/experiment_queue/api_schemas.py +221 -0
  121. synth_ai/cli/local/experiment_queue/celery_app.py +208 -0
  122. synth_ai/cli/local/experiment_queue/config.py +128 -0
  123. synth_ai/cli/local/experiment_queue/config_utils.py +272 -0
  124. synth_ai/cli/local/experiment_queue/database.py +175 -0
  125. synth_ai/cli/local/experiment_queue/dispatcher.py +119 -0
  126. synth_ai/cli/local/experiment_queue/models.py +231 -0
  127. synth_ai/cli/local/experiment_queue/progress_info.py +160 -0
  128. synth_ai/cli/local/experiment_queue/results.py +373 -0
  129. synth_ai/cli/local/experiment_queue/schemas.py +131 -0
  130. synth_ai/cli/local/experiment_queue/service.py +344 -0
  131. synth_ai/cli/local/experiment_queue/status.py +372 -0
  132. synth_ai/cli/local/experiment_queue/status_tracker.py +360 -0
  133. synth_ai/cli/local/experiment_queue/tasks.py +1984 -0
  134. synth_ai/cli/local/experiment_queue/trace_storage.py +65 -0
  135. synth_ai/cli/local/experiment_queue/validation.py +157 -0
  136. synth_ai/cli/local/session/__init__.py +92 -0
  137. synth_ai/cli/local/session/client.py +383 -0
  138. synth_ai/cli/local/session/constants.py +63 -0
  139. synth_ai/cli/local/session/exceptions.py +105 -0
  140. synth_ai/cli/local/session/manager.py +139 -0
  141. synth_ai/cli/local/session/models.py +89 -0
  142. synth_ai/cli/local/session/query.py +110 -0
  143. synth_ai/cli/root.py +30 -6
  144. synth_ai/cli/task_apps/__init__.py +26 -0
  145. synth_ai/cli/task_apps/commands.py +3153 -0
  146. synth_ai/cli/task_apps/deploy.py +7 -0
  147. synth_ai/cli/task_apps/list.py +26 -0
  148. synth_ai/cli/task_apps/main.py +36 -0
  149. synth_ai/cli/task_apps/modal_serve.py +11 -0
  150. synth_ai/cli/task_apps/serve.py +11 -0
  151. synth_ai/cli/training/__init__.py +8 -0
  152. synth_ai/cli/training/train.py +5 -0
  153. synth_ai/cli/training/train_cfg.py +34 -0
  154. synth_ai/cli/training/watch.py +506 -0
  155. synth_ai/cli/turso.py +34 -55
  156. synth_ai/cli/usage.py +159 -0
  157. synth_ai/cli/utils/__init__.py +8 -0
  158. synth_ai/cli/utils/experiments.py +235 -0
  159. synth_ai/cli/utils/queue.py +504 -0
  160. synth_ai/cli/utils/recent.py +133 -0
  161. synth_ai/cli/utils/traces.py +164 -0
  162. synth_ai/contracts/__init__.py +67 -0
  163. synth_ai/core/__init__.py +100 -0
  164. synth_ai/core/_utils/__init__.py +54 -0
  165. synth_ai/core/_utils/base_url.py +10 -0
  166. synth_ai/core/_utils/http.py +10 -0
  167. synth_ai/core/_utils/prompts.py +14 -0
  168. synth_ai/core/_utils/task_app_state.py +12 -0
  169. synth_ai/core/_utils/user_config.py +10 -0
  170. synth_ai/core/apps/common.py +116 -0
  171. synth_ai/core/auth.py +95 -0
  172. synth_ai/core/cfgs.py +240 -0
  173. synth_ai/core/config/__init__.py +16 -0
  174. synth_ai/core/config/base.py +168 -0
  175. synth_ai/core/config/resolver.py +89 -0
  176. synth_ai/core/env.py +220 -0
  177. synth_ai/core/errors.py +126 -0
  178. synth_ai/core/http.py +230 -0
  179. synth_ai/core/integrations/__init__.py +11 -0
  180. synth_ai/core/integrations/cloudflare.py +1710 -0
  181. synth_ai/core/integrations/mcp/__init__.py +6 -0
  182. synth_ai/core/integrations/mcp/__main__.py +8 -0
  183. synth_ai/core/integrations/mcp/claude.py +36 -0
  184. synth_ai/core/integrations/mcp/main.py +254 -0
  185. synth_ai/core/integrations/mcp/setup.py +100 -0
  186. synth_ai/core/integrations/modal.py +277 -0
  187. synth_ai/core/json.py +72 -0
  188. synth_ai/core/log_filter.py +99 -0
  189. synth_ai/core/logging.py +82 -0
  190. synth_ai/core/paths.py +107 -0
  191. synth_ai/core/pricing.py +109 -0
  192. synth_ai/core/process.py +233 -0
  193. synth_ai/core/ssl.py +25 -0
  194. synth_ai/core/storage/__init__.py +71 -0
  195. synth_ai/core/task_app_state.py +318 -0
  196. synth_ai/core/telemetry.py +282 -0
  197. synth_ai/core/tracing_v3/__init__.py +99 -0
  198. synth_ai/core/tracing_v3/abstractions.py +302 -0
  199. synth_ai/core/tracing_v3/config.py +229 -0
  200. synth_ai/core/tracing_v3/constants.py +21 -0
  201. synth_ai/core/tracing_v3/db_config.py +182 -0
  202. synth_ai/core/tracing_v3/decorators.py +401 -0
  203. synth_ai/core/tracing_v3/llm_call_record_helpers.py +437 -0
  204. synth_ai/core/tracing_v3/migration_helper.py +119 -0
  205. synth_ai/core/tracing_v3/session_tracer.py +542 -0
  206. synth_ai/core/tracing_v3/storage/base.py +211 -0
  207. synth_ai/core/tracing_v3/storage/config.py +109 -0
  208. synth_ai/core/tracing_v3/storage/factory.py +39 -0
  209. synth_ai/core/tracing_v3/trace_utils.py +326 -0
  210. synth_ai/core/tracing_v3/turso/daemon.py +278 -0
  211. synth_ai/core/tracing_v3/turso/models.py +470 -0
  212. synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
  213. synth_ai/core/tracing_v3/utils.py +108 -0
  214. synth_ai/core/urls.py +18 -0
  215. synth_ai/core/user_config.py +137 -0
  216. synth_ai/core/uvicorn.py +222 -0
  217. synth_ai/data/__init__.py +110 -0
  218. synth_ai/data/enums.py +141 -0
  219. synth_ai/data/rewards.py +152 -0
  220. synth_ai/data/specs.py +36 -0
  221. synth_ai/data/traces.py +35 -0
  222. synth_ai/products/__init__.py +6 -0
  223. synth_ai/products/graph_evolve/__init__.py +46 -0
  224. synth_ai/products/graph_evolve/client.py +226 -0
  225. synth_ai/products/graph_evolve/config.py +591 -0
  226. synth_ai/products/graph_evolve/converters/__init__.py +42 -0
  227. synth_ai/products/graph_evolve/converters/openai_sft.py +484 -0
  228. synth_ai/products/graph_evolve/examples/hotpotqa/config.toml +109 -0
  229. synth_ai/products/graph_evolve/run.py +222 -0
  230. synth_ai/sdk/__init__.py +119 -0
  231. synth_ai/sdk/api/__init__.py +1 -0
  232. synth_ai/sdk/api/models/supported.py +514 -0
  233. synth_ai/sdk/api/research_agent/__init__.py +86 -0
  234. synth_ai/sdk/api/research_agent/cli.py +428 -0
  235. synth_ai/sdk/api/research_agent/config.py +357 -0
  236. synth_ai/sdk/api/research_agent/job.py +717 -0
  237. synth_ai/sdk/api/train/__init__.py +85 -0
  238. synth_ai/sdk/api/train/builders.py +895 -0
  239. synth_ai/sdk/api/train/cli.py +2188 -0
  240. synth_ai/sdk/api/train/config_finder.py +267 -0
  241. synth_ai/sdk/api/train/configs/__init__.py +65 -0
  242. synth_ai/sdk/api/train/configs/prompt_learning.py +1706 -0
  243. synth_ai/sdk/api/train/configs/rl.py +188 -0
  244. synth_ai/sdk/api/train/configs/sft.py +99 -0
  245. synth_ai/sdk/api/train/configs/shared.py +81 -0
  246. synth_ai/sdk/api/train/context_learning.py +312 -0
  247. synth_ai/sdk/api/train/env_resolver.py +418 -0
  248. synth_ai/sdk/api/train/graph_validators.py +216 -0
  249. synth_ai/sdk/api/train/graphgen.py +984 -0
  250. synth_ai/sdk/api/train/graphgen_models.py +823 -0
  251. synth_ai/sdk/api/train/graphgen_validators.py +109 -0
  252. synth_ai/sdk/api/train/pollers.py +124 -0
  253. synth_ai/sdk/api/train/progress/__init__.py +97 -0
  254. synth_ai/sdk/api/train/progress/dataclasses.py +569 -0
  255. synth_ai/sdk/api/train/progress/events.py +326 -0
  256. synth_ai/sdk/api/train/progress/results.py +428 -0
  257. synth_ai/sdk/api/train/progress/tracker.py +641 -0
  258. synth_ai/sdk/api/train/prompt_learning.py +470 -0
  259. synth_ai/sdk/api/train/rl.py +442 -0
  260. synth_ai/sdk/api/train/sft.py +396 -0
  261. synth_ai/sdk/api/train/summary.py +522 -0
  262. synth_ai/sdk/api/train/supported_algos.py +147 -0
  263. synth_ai/sdk/api/train/task_app.py +331 -0
  264. synth_ai/sdk/api/train/utils.py +279 -0
  265. synth_ai/sdk/api/train/validators.py +2424 -0
  266. synth_ai/sdk/baseline/__init__.py +25 -0
  267. synth_ai/sdk/baseline/config.py +209 -0
  268. synth_ai/sdk/baseline/discovery.py +216 -0
  269. synth_ai/sdk/baseline/execution.py +154 -0
  270. synth_ai/sdk/graphs/__init__.py +15 -0
  271. synth_ai/sdk/graphs/completions.py +570 -0
  272. synth_ai/sdk/inference/__init__.py +6 -0
  273. synth_ai/sdk/inference/client.py +128 -0
  274. synth_ai/sdk/jobs/__init__.py +16 -0
  275. synth_ai/sdk/jobs/client.py +371 -0
  276. synth_ai/sdk/judging/__init__.py +15 -0
  277. synth_ai/sdk/judging/base.py +24 -0
  278. synth_ai/sdk/judging/client.py +191 -0
  279. synth_ai/sdk/judging/schemas.py +222 -0
  280. synth_ai/sdk/learning/__init__.py +69 -0
  281. synth_ai/sdk/learning/client.py +240 -0
  282. synth_ai/sdk/learning/ft_client.py +7 -0
  283. synth_ai/sdk/learning/health.py +49 -0
  284. synth_ai/sdk/learning/jobs.py +202 -0
  285. synth_ai/sdk/learning/prompt_extraction.py +334 -0
  286. synth_ai/sdk/learning/prompt_learning_client.py +455 -0
  287. synth_ai/sdk/learning/prompt_learning_types.py +185 -0
  288. synth_ai/sdk/learning/rl/client.py +268 -0
  289. synth_ai/sdk/learning/rl/contracts.py +27 -0
  290. synth_ai/sdk/learning/rl/env_keys.py +166 -0
  291. synth_ai/sdk/learning/rl/secrets.py +13 -0
  292. synth_ai/sdk/learning/sft/client.py +95 -0
  293. synth_ai/sdk/learning/sft/config.py +270 -0
  294. synth_ai/sdk/learning/sft/data.py +698 -0
  295. synth_ai/sdk/learning/validators.py +52 -0
  296. synth_ai/sdk/research_agent/__init__.py +34 -0
  297. synth_ai/sdk/research_agent/container_builder.py +328 -0
  298. synth_ai/sdk/research_agent/container_spec.py +198 -0
  299. synth_ai/sdk/research_agent/defaults.py +34 -0
  300. synth_ai/sdk/research_agent/results_collector.py +69 -0
  301. synth_ai/sdk/specs/__init__.py +46 -0
  302. synth_ai/sdk/specs/dataclasses.py +149 -0
  303. synth_ai/sdk/specs/loader.py +144 -0
  304. synth_ai/sdk/specs/serializer.py +199 -0
  305. synth_ai/sdk/specs/validation.py +250 -0
  306. synth_ai/sdk/streaming/__init__.py +35 -0
  307. synth_ai/sdk/streaming/config.py +94 -0
  308. synth_ai/sdk/streaming/handlers.py +1997 -0
  309. synth_ai/sdk/streaming/streamer.py +704 -0
  310. synth_ai/sdk/streaming/types.py +112 -0
  311. synth_ai/sdk/task/__init__.py +151 -0
  312. synth_ai/sdk/task/apps/__init__.py +133 -0
  313. synth_ai/sdk/task/config.py +261 -0
  314. synth_ai/sdk/task/contracts.py +298 -0
  315. synth_ai/sdk/task/datasets.py +108 -0
  316. synth_ai/sdk/task/in_process.py +1190 -0
  317. synth_ai/sdk/task/in_process_runner.py +309 -0
  318. synth_ai/sdk/task/inference_api.py +299 -0
  319. synth_ai/sdk/task/proxy.py +287 -0
  320. synth_ai/sdk/task/rubrics/__init__.py +55 -0
  321. synth_ai/sdk/task/rubrics/loaders.py +156 -0
  322. synth_ai/sdk/task/rubrics.py +219 -0
  323. synth_ai/sdk/task/server.py +580 -0
  324. synth_ai/sdk/task/trace_correlation_helpers.py +506 -0
  325. synth_ai/sdk/task/tracing_utils.py +95 -0
  326. synth_ai/sdk/task/validators.py +456 -0
  327. synth_ai/sdk/tracing/__init__.py +39 -0
  328. synth_ai/sdk/training/__init__.py +102 -0
  329. synth_ai/sdk/usage/__init__.py +37 -0
  330. synth_ai/sdk/usage/client.py +171 -0
  331. synth_ai/sdk/usage/models.py +261 -0
  332. synth_ai/utils/__init__.py +213 -0
  333. synth_ai-0.4.1.dist-info/METADATA +195 -0
  334. synth_ai-0.4.1.dist-info/RECORD +379 -0
  335. synth_ai-0.4.1.dist-info/top_level.txt +1 -0
  336. examples/__init__.py +0 -16
  337. examples/analyze_semantic_words.sh +0 -17
  338. examples/crafter_debug_render.py +0 -186
  339. examples/dev/qwen3_32b_qlora_4xh100.toml +0 -40
  340. examples/multi_step/configs/README_verilog_rl.md +0 -77
  341. examples/multi_step/configs/VERILOG_REWARDS.md +0 -90
  342. examples/multi_step/configs/VERILOG_RL_CHECKLIST.md +0 -183
  343. examples/multi_step/configs/crafter_eval_synth_qwen4b.toml +0 -35
  344. examples/multi_step/configs/crafter_eval_text_only_groq_qwen32b.toml +0 -36
  345. examples/multi_step/configs/crafter_rl_outcome.toml +0 -74
  346. examples/multi_step/configs/crafter_rl_stepwise_hosted_judge.toml +0 -187
  347. examples/multi_step/configs/crafter_rl_stepwise_shaped.toml +0 -83
  348. examples/multi_step/configs/crafter_rl_stepwise_simple.toml +0 -78
  349. examples/multi_step/configs/crafter_synth_backend.md +0 -40
  350. examples/multi_step/configs/verilog_eval_groq_qwen32b.toml +0 -31
  351. examples/multi_step/configs/verilog_eval_synth_qwen8b.toml +0 -33
  352. examples/multi_step/configs/verilog_rl_lora.toml +0 -190
  353. examples/multi_step/crafter_rl_lora.md +0 -70
  354. examples/multi_step/judges/crafter_backend_judge.py +0 -220
  355. examples/multi_step/judges/verilog_backend_judge.py +0 -234
  356. examples/multi_step/readme.md +0 -48
  357. examples/multi_step/sse_metrics_streaming_notes.md +0 -357
  358. examples/multi_step/task_app_config_notes.md +0 -494
  359. examples/multi_step/verilog_rl_lora.md +0 -218
  360. examples/qwen_coder/README.md +0 -102
  361. examples/qwen_coder/_shared.py +0 -113
  362. examples/qwen_coder/configs/coder_lora_30b.toml +0 -61
  363. examples/qwen_coder/configs/coder_lora_4b.toml +0 -57
  364. examples/qwen_coder/configs/coder_lora_small.toml +0 -58
  365. examples/qwen_coder/generate_dataset.py +0 -98
  366. examples/qwen_coder/infer_ft_smoke.py +0 -65
  367. examples/qwen_coder/infer_prod_proxy.py +0 -73
  368. examples/qwen_coder/infer_via_synth.py +0 -87
  369. examples/qwen_coder/scripts/infer_coder.sh +0 -19
  370. examples/qwen_coder/scripts/train_coder_30b.sh +0 -22
  371. examples/qwen_coder/sft_full_17b.py +0 -103
  372. examples/qwen_coder/sft_lora_30b.py +0 -110
  373. examples/qwen_coder/subset_jsonl.py +0 -39
  374. examples/qwen_coder/todos.md +0 -38
  375. examples/qwen_coder/validate_jsonl.py +0 -60
  376. examples/rl/README.md +0 -169
  377. examples/rl/download_dataset.py +0 -80
  378. examples/run_crafter_demo.sh +0 -10
  379. examples/sft/README.md +0 -139
  380. examples/sft/configs/crafter_fft_qwen0p6b.toml +0 -44
  381. examples/sft/configs/crafter_lora_qwen0p6b.toml +0 -45
  382. examples/sft/evaluate.py +0 -119
  383. examples/sft/export_dataset.py +0 -117
  384. examples/sft/generate_traces.py +0 -164
  385. examples/swe/__init__.py +0 -12
  386. examples/swe/task_app/README.md +0 -105
  387. examples/swe/task_app/__init__.py +0 -2
  388. examples/swe/task_app/grpo_swe_mini.py +0 -601
  389. examples/swe/task_app/grpo_swe_mini_task_app.py +0 -136
  390. examples/swe/task_app/hosted/README.md +0 -173
  391. examples/swe/task_app/hosted/__init__.py +0 -5
  392. examples/swe/task_app/hosted/branching.py +0 -143
  393. examples/swe/task_app/hosted/environment_routes.py +0 -1289
  394. examples/swe/task_app/hosted/envs/__init__.py +0 -1
  395. examples/swe/task_app/hosted/envs/crafter/__init__.py +0 -6
  396. examples/swe/task_app/hosted/envs/crafter/app.py +0 -1
  397. examples/swe/task_app/hosted/envs/crafter/environment.py +0 -522
  398. examples/swe/task_app/hosted/envs/crafter/policy.py +0 -478
  399. examples/swe/task_app/hosted/envs/crafter/react_agent.py +0 -108
  400. examples/swe/task_app/hosted/envs/crafter/shared.py +0 -305
  401. examples/swe/task_app/hosted/envs/crafter/tools.py +0 -47
  402. examples/swe/task_app/hosted/envs/mini_swe/__init__.py +0 -8
  403. examples/swe/task_app/hosted/envs/mini_swe/environment.py +0 -1164
  404. examples/swe/task_app/hosted/envs/mini_swe/policy.py +0 -355
  405. examples/swe/task_app/hosted/envs/mini_swe/shared.py +0 -83
  406. examples/swe/task_app/hosted/envs/mini_swe/tools.py +0 -96
  407. examples/swe/task_app/hosted/hosted_app.py +0 -204
  408. examples/swe/task_app/hosted/inference/__init__.py +0 -5
  409. examples/swe/task_app/hosted/inference/openai_client.py +0 -618
  410. examples/swe/task_app/hosted/main.py +0 -100
  411. examples/swe/task_app/hosted/policy_routes.py +0 -1079
  412. examples/swe/task_app/hosted/registry.py +0 -195
  413. examples/swe/task_app/hosted/rollout.py +0 -1911
  414. examples/swe/task_app/hosted/storage/__init__.py +0 -5
  415. examples/swe/task_app/hosted/storage/volume.py +0 -211
  416. examples/swe/task_app/hosted/test_agents.py +0 -161
  417. examples/swe/task_app/hosted/test_service.py +0 -136
  418. examples/swe/task_app/hosted/utils.py +0 -62
  419. examples/task_apps/IMAGE_ONLY_EVAL_QUICKSTART.md +0 -258
  420. examples/task_apps/TESTING.md +0 -275
  421. examples/task_apps/crafter/CREATE_SFT_DATASET.md +0 -273
  422. examples/task_apps/crafter/EVAL_IMAGE_ONLY_RESULTS.md +0 -152
  423. examples/task_apps/crafter/FILTER_COMMAND_STATUS.md +0 -174
  424. examples/task_apps/crafter/FILTER_COMMAND_SUCCESS.md +0 -268
  425. examples/task_apps/crafter/QUERY_EXAMPLES.md +0 -203
  426. examples/task_apps/crafter/README_IMAGE_ONLY_EVAL.md +0 -316
  427. examples/task_apps/crafter/__init__.py +0 -0
  428. examples/task_apps/crafter/eval_image_only_gpt4o.toml +0 -28
  429. examples/task_apps/crafter/eval_text_only_groq_llama.toml +0 -36
  430. examples/task_apps/crafter/filter_sft_dataset.toml +0 -16
  431. examples/task_apps/crafter/task_app/README.md +0 -42
  432. examples/task_apps/crafter/task_app/__init__.py +0 -5
  433. examples/task_apps/crafter/task_app/grpo_crafter.py +0 -973
  434. examples/task_apps/crafter/task_app/grpo_crafter_task_app.py +0 -146
  435. examples/task_apps/crafter/task_app/synth_envs_hosted/README.md +0 -173
  436. examples/task_apps/crafter/task_app/synth_envs_hosted/__init__.py +0 -5
  437. examples/task_apps/crafter/task_app/synth_envs_hosted/branching.py +0 -143
  438. examples/task_apps/crafter/task_app/synth_envs_hosted/environment_routes.py +0 -1226
  439. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/__init__.py +0 -1
  440. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/__init__.py +0 -6
  441. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/app.py +0 -1
  442. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/environment.py +0 -532
  443. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/policy.py +0 -547
  444. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/react_agent.py +0 -123
  445. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/shared.py +0 -305
  446. examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/tools.py +0 -47
  447. examples/task_apps/crafter/task_app/synth_envs_hosted/hosted_app.py +0 -204
  448. examples/task_apps/crafter/task_app/synth_envs_hosted/inference/__init__.py +0 -5
  449. examples/task_apps/crafter/task_app/synth_envs_hosted/inference/openai_client.py +0 -704
  450. examples/task_apps/crafter/task_app/synth_envs_hosted/main.py +0 -100
  451. examples/task_apps/crafter/task_app/synth_envs_hosted/policy_routes.py +0 -1152
  452. examples/task_apps/crafter/task_app/synth_envs_hosted/registry.py +0 -195
  453. examples/task_apps/crafter/task_app/synth_envs_hosted/rollout.py +0 -2160
  454. examples/task_apps/crafter/task_app/synth_envs_hosted/storage/__init__.py +0 -5
  455. examples/task_apps/crafter/task_app/synth_envs_hosted/storage/volume.py +0 -211
  456. examples/task_apps/crafter/task_app/synth_envs_hosted/test_agents.py +0 -161
  457. examples/task_apps/crafter/task_app/synth_envs_hosted/test_service.py +0 -136
  458. examples/task_apps/crafter/task_app/synth_envs_hosted/utils.py +0 -218
  459. examples/task_apps/dev/pokemon_emerald/__init__.py +0 -2
  460. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/README.md +0 -811
  461. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/__init__.py +0 -120
  462. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/action.py +0 -160
  463. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/memory.py +0 -155
  464. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/perception.py +0 -69
  465. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/planning.py +0 -96
  466. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/simple.py +0 -1502
  467. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/system_prompt.py +0 -4
  468. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/grab_map.py +0 -68
  469. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/manual.py +0 -216
  470. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/__init__.py +0 -35
  471. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/emerald_utils.py +0 -631
  472. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/emulator.py +0 -1544
  473. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/enums.py +0 -1428
  474. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/memory_reader.py +0 -4848
  475. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/types.py +0 -41
  476. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/utils.py +0 -298
  477. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pyproject.toml +0 -95
  478. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/run.py +0 -204
  479. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/__init__.py +0 -0
  480. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/app.py +0 -2152
  481. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/client.py +0 -429
  482. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/frame_server.py +0 -155
  483. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/README.md +0 -78
  484. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/__init__.py +0 -0
  485. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/run_tests.py +0 -122
  486. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_agent_direct.py +0 -76
  487. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_agent_prompts.py +0 -413
  488. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_battle_state_formatting.py +0 -204
  489. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_dialogue_detection.py +0 -133
  490. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_dialogue_detection_comprehensive.py +0 -229
  491. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_direct_agent_emulator.py +0 -300
  492. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_fps_adjustment_pytest.py +0 -205
  493. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_house_to_outside_direct.py +0 -200
  494. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_house_to_outside_transition.py +0 -284
  495. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_map_ground_truth_comparison.py +0 -468
  496. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_memory_map.py +0 -575
  497. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_server_map_validation.py +0 -311
  498. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_torchic_state.py +0 -259
  499. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/__init__.py +0 -0
  500. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/anticheat.py +0 -372
  501. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/checkpoint.py +0 -296
  502. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/error_handler.py +0 -275
  503. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/get_local_ip.py +0 -22
  504. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/helpers.py +0 -44
  505. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/llm_logger.py +0 -514
  506. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_formatter.py +0 -415
  507. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_stitcher.py +0 -1763
  508. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_stitcher_singleton.py +0 -33
  509. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_trimmer.py +0 -106
  510. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_visualizer.py +0 -334
  511. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/ocr_dialogue.py +0 -1020
  512. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/recording.py +0 -188
  513. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/state_formatter.py +0 -1481
  514. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/vlm.py +0 -862
  515. examples/task_apps/dev/pokemon_emerald/modal_app.py +0 -114
  516. examples/task_apps/dev/pokemon_emerald/task_app/README.md +0 -81
  517. examples/task_apps/dev/pokemon_emerald/task_app/__init__.py +0 -6
  518. examples/task_apps/dev/pokemon_emerald/task_app/pokemon_emerald.py +0 -685
  519. examples/task_apps/enron/__init__.py +0 -1
  520. examples/task_apps/enron/eval_groq_qwen32.toml +0 -16
  521. examples/task_apps/enron/filter_sft.toml +0 -5
  522. examples/task_apps/enron/task_app/README.md +0 -14
  523. examples/task_apps/enron/task_app/__init__.py +0 -1
  524. examples/task_apps/enron/task_app/grpo_enron.py +0 -906
  525. examples/task_apps/enron/task_app/grpo_enron_task_app.py +0 -146
  526. examples/task_apps/enron/tests/__init__.py +0 -4
  527. examples/task_apps/enron/tests/conftest.py +0 -115
  528. examples/task_apps/enron/tests/integration/__init__.py +0 -4
  529. examples/task_apps/enron/tests/integration/test_enron_eval.py +0 -179
  530. examples/task_apps/enron/tests/integration/test_enron_rollout.py +0 -135
  531. examples/task_apps/enron/tests/unit/__init__.py +0 -4
  532. examples/task_apps/enron/tests/unit/test_enron_environment.py +0 -126
  533. examples/task_apps/math/README.md +0 -22
  534. examples/task_apps/math/__init__.py +0 -0
  535. examples/task_apps/math/math_single_step.py +0 -1000
  536. examples/task_apps/math/math_task_app.py +0 -115
  537. examples/task_apps/pokemon_battle/__init__.py +0 -2
  538. examples/task_apps/pokemon_battle/modal_app.py +0 -104
  539. examples/task_apps/pokemon_battle/task_app/README.md +0 -68
  540. examples/task_apps/pokemon_battle/task_app/__init__.py +0 -6
  541. examples/task_apps/pokemon_battle/task_app/pokemon_showdown.py +0 -932
  542. examples/task_apps/pokemon_red/EVAL_IMAGE_ONLY_COMPLETE.md +0 -283
  543. examples/task_apps/pokemon_red/EVAL_IMAGE_ONLY_STATUS.md +0 -155
  544. examples/task_apps/pokemon_red/README.md +0 -357
  545. examples/task_apps/pokemon_red/README_IMAGE_ONLY_EVAL.md +0 -415
  546. examples/task_apps/pokemon_red/__init__.py +0 -3
  547. examples/task_apps/pokemon_red/eval_image_only_gpt4o.toml +0 -29
  548. examples/task_apps/pokemon_red/eval_pokemon_red_policy.py +0 -225
  549. examples/task_apps/pokemon_red/pallet_town_rl_config.toml +0 -75
  550. examples/task_apps/pokemon_red/task_app.py +0 -799
  551. examples/task_apps/pokemon_red/test_pallet_town_rewards.py +0 -193
  552. examples/task_apps/sokoban/README.md +0 -307
  553. examples/task_apps/sokoban/__init__.py +0 -3
  554. examples/task_apps/sokoban/eval_groq_qwen32.toml +0 -16
  555. examples/task_apps/sokoban/eval_openai_gpt5.toml +0 -16
  556. examples/task_apps/sokoban/filter_sft.toml +0 -5
  557. examples/task_apps/sokoban/task_app.py +0 -1058
  558. examples/task_apps/sokoban/tests/__init__.py +0 -4
  559. examples/task_apps/sokoban/tests/conftest.py +0 -113
  560. examples/task_apps/sokoban/tests/integration/__init__.py +0 -4
  561. examples/task_apps/sokoban/tests/integration/test_sokoban_eval.py +0 -57
  562. examples/task_apps/sokoban/tests/integration/test_sokoban_rollout.py +0 -198
  563. examples/task_apps/sokoban/tests/unit/__init__.py +0 -4
  564. examples/task_apps/sokoban/tests/unit/test_sokoban_environment.py +0 -114
  565. examples/task_apps/verilog/__init__.py +0 -1
  566. examples/task_apps/verilog/eval_groq_qwen32b.toml +0 -24
  567. examples/task_apps/verilog/filter_sft.toml +0 -5
  568. examples/task_apps/verilog/task_app/README.md +0 -12
  569. examples/task_apps/verilog/task_app/__init__.py +0 -1
  570. examples/task_apps/verilog/task_app/grpo_verilog.py +0 -1166
  571. examples/task_apps/verilog/task_app/grpo_verilog_task_app.py +0 -145
  572. examples/task_apps/verilog/tests/__init__.py +0 -4
  573. examples/task_apps/verilog/tests/conftest.py +0 -115
  574. examples/task_apps/verilog/tests/integration/__init__.py +0 -4
  575. examples/task_apps/verilog/tests/integration/test_verilog_eval.py +0 -181
  576. examples/task_apps/verilog/tests/integration/test_verilog_rollout.py +0 -55
  577. examples/task_apps/verilog/tests/unit/__init__.py +0 -4
  578. examples/task_apps/verilog/tests/unit/test_verilog_scoring.py +0 -118
  579. examples/vlm/PROPOSAL.md +0 -53
  580. examples/vlm/README.md +0 -68
  581. examples/vlm/configs/crafter_vlm_gpt4o.toml +0 -44
  582. examples/vlm/crafter_image_only_agent.py +0 -207
  583. examples/vlm/crafter_openai_vlm_agent.py +0 -277
  584. examples/vlm/filter_image_rows.py +0 -63
  585. examples/vlm/run_crafter_vlm_benchmark.py +0 -316
  586. examples/warming_up_to_rl/analyze_trace_db.py +0 -422
  587. examples/warming_up_to_rl/configs/crafter_fft.toml +0 -48
  588. examples/warming_up_to_rl/configs/crafter_fft_4b.toml +0 -54
  589. examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml +0 -20
  590. examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml +0 -13
  591. examples/warming_up_to_rl/configs/eval_modal_qwen4b.toml +0 -23
  592. examples/warming_up_to_rl/configs/eval_stepwise_complex.toml +0 -35
  593. examples/warming_up_to_rl/configs/eval_stepwise_consistent.toml +0 -26
  594. examples/warming_up_to_rl/configs/eval_stepwise_per_achievement.toml +0 -36
  595. examples/warming_up_to_rl/configs/eval_stepwise_simple.toml +0 -32
  596. examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +0 -83
  597. examples/warming_up_to_rl/configs/rl_from_ft.toml +0 -56
  598. examples/warming_up_to_rl/export_trace_sft.py +0 -723
  599. examples/warming_up_to_rl/groq_test.py +0 -97
  600. examples/warming_up_to_rl/manage_secrets.py +0 -131
  601. examples/warming_up_to_rl/old/event_rewards.md +0 -234
  602. examples/warming_up_to_rl/old/notes.md +0 -73
  603. examples/warming_up_to_rl/readme.md +0 -179
  604. examples/warming_up_to_rl/run_eval.py +0 -736
  605. examples/warming_up_to_rl/run_fft_and_save.py +0 -380
  606. examples/warming_up_to_rl/run_local_rollout.py +0 -239
  607. examples/warming_up_to_rl/run_local_rollout_modal.py +0 -248
  608. examples/warming_up_to_rl/run_local_rollout_parallel.py +0 -405
  609. examples/warming_up_to_rl/run_local_rollout_traced.py +0 -477
  610. examples/warming_up_to_rl/run_rl_and_save.py +0 -124
  611. examples/warming_up_to_rl/run_rollout_remote.py +0 -156
  612. examples/workflows/__init__.py +0 -0
  613. examples/workflows/math_rl/__init__.py +0 -0
  614. examples/workflows/math_rl/configs/eval_base_qwen.toml +0 -15
  615. examples/workflows/math_rl/configs/eval_rl_qwen.toml +0 -11
  616. examples/workflows/math_rl/configs/rl_from_base_qwen.toml +0 -35
  617. examples/workflows/math_rl/configs/rl_from_base_qwen17.toml +0 -74
  618. examples/workflows/math_rl/configs/rl_from_ft_qwen.toml +0 -35
  619. examples/workflows/math_rl/download_dataset.py +0 -80
  620. examples/workflows/math_rl/run_eval.py +0 -436
  621. examples/workflows/math_rl/run_rl_and_save.py +0 -111
  622. synth_ai/api/models/supported.py +0 -377
  623. synth_ai/api/train/__init__.py +0 -5
  624. synth_ai/api/train/builders.py +0 -351
  625. synth_ai/api/train/cli.py +0 -635
  626. synth_ai/api/train/config_finder.py +0 -228
  627. synth_ai/api/train/configs/__init__.py +0 -44
  628. synth_ai/api/train/configs/rl.py +0 -134
  629. synth_ai/api/train/configs/sft.py +0 -95
  630. synth_ai/api/train/configs/shared.py +0 -24
  631. synth_ai/api/train/env_resolver.py +0 -349
  632. synth_ai/api/train/pollers.py +0 -75
  633. synth_ai/api/train/supported_algos.py +0 -147
  634. synth_ai/api/train/task_app.py +0 -195
  635. synth_ai/api/train/utils.py +0 -225
  636. synth_ai/cli/_modal_wrapper.py +0 -29
  637. synth_ai/cli/_storage.py +0 -20
  638. synth_ai/cli/_typer_patch.py +0 -49
  639. synth_ai/cli/_validate_task_app.py +0 -11
  640. synth_ai/cli/balance.py +0 -216
  641. synth_ai/cli/calc.py +0 -84
  642. synth_ai/cli/demo.py +0 -165
  643. synth_ai/cli/legacy_root_backup.py +0 -468
  644. synth_ai/cli/man.py +0 -106
  645. synth_ai/cli/recent.py +0 -132
  646. synth_ai/cli/rl_demo.py +0 -254
  647. synth_ai/cli/status.py +0 -134
  648. synth_ai/cli/task_apps.py +0 -4523
  649. synth_ai/cli/traces.py +0 -164
  650. synth_ai/cli/tui.py +0 -57
  651. synth_ai/cli/watch.py +0 -506
  652. synth_ai/compound/cais.py +0 -0
  653. synth_ai/config/base_url.py +0 -107
  654. synth_ai/core/experiment.py +0 -13
  655. synth_ai/core/system.py +0 -15
  656. synth_ai/demo_registry.py +0 -295
  657. synth_ai/demos/core/__init__.py +0 -1
  658. synth_ai/demos/core/cli.py +0 -1718
  659. synth_ai/demos/demo_task_apps/core.py +0 -440
  660. synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +0 -184
  661. synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
  662. synth_ai/demos/demo_task_apps/math/modal_task_app.py +0 -739
  663. synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -37
  664. synth_ai/environments/__init__.py +0 -31
  665. synth_ai/environments/environment/__init__.py +0 -1
  666. synth_ai/environments/environment/artifacts/__init__.py +0 -1
  667. synth_ai/environments/environment/artifacts/base.py +0 -52
  668. synth_ai/environments/environment/core.py +0 -67
  669. synth_ai/environments/environment/db/__init__.py +0 -1
  670. synth_ai/environments/environment/db/sqlite.py +0 -45
  671. synth_ai/environments/environment/registry.py +0 -233
  672. synth_ai/environments/environment/resources/sqlite.py +0 -45
  673. synth_ai/environments/environment/results.py +0 -1
  674. synth_ai/environments/environment/rewards/__init__.py +0 -1
  675. synth_ai/environments/environment/rewards/core.py +0 -29
  676. synth_ai/environments/environment/shared_engine.py +0 -26
  677. synth_ai/environments/environment/tools/__init__.py +0 -200
  678. synth_ai/environments/examples/__init__.py +0 -1
  679. synth_ai/environments/examples/bandit/__init__.py +0 -33
  680. synth_ai/environments/examples/bandit/engine.py +0 -302
  681. synth_ai/environments/examples/bandit/environment.py +0 -194
  682. synth_ai/environments/examples/bandit/taskset.py +0 -200
  683. synth_ai/environments/examples/crafter_classic/__init__.py +0 -8
  684. synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -250
  685. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -59
  686. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -152
  687. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -24
  688. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -1194
  689. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -56
  690. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -32
  691. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -738
  692. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -384
  693. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -53
  694. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -178
  695. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -222
  696. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -183
  697. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -210
  698. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -206
  699. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -49
  700. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -64
  701. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -88
  702. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -77
  703. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -324
  704. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -580
  705. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -362
  706. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -49
  707. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -332
  708. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -97
  709. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -217
  710. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -87
  711. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -88
  712. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -195
  713. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -400
  714. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -195
  715. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -56
  716. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -858
  717. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -52
  718. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -874
  719. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -1412
  720. synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -216
  721. synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -296
  722. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -58
  723. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -464
  724. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -152
  725. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -51
  726. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -1412
  727. synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -112
  728. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -203
  729. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -305
  730. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -126
  731. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -94
  732. synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -142
  733. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -26
  734. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -984
  735. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -724
  736. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -386
  737. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -205
  738. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -150
  739. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -283
  740. synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -280
  741. synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -456
  742. synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -166
  743. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -102
  744. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -128
  745. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -655
  746. synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -202
  747. synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -166
  748. synth_ai/environments/examples/crafter_classic/config_logging.py +0 -111
  749. synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
  750. synth_ai/environments/examples/crafter_classic/engine.py +0 -579
  751. synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -64
  752. synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -6
  753. synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -75
  754. synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -267
  755. synth_ai/environments/examples/crafter_classic/environment.py +0 -495
  756. synth_ai/environments/examples/crafter_classic/taskset.py +0 -233
  757. synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -228
  758. synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -299
  759. synth_ai/environments/examples/crafter_custom/__init__.py +0 -4
  760. synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -1
  761. synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -202
  762. synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -7
  763. synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -182
  764. synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -8
  765. synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -269
  766. synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -262
  767. synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -417
  768. synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -187
  769. synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -118
  770. synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -373
  771. synth_ai/environments/examples/crafter_custom/environment.py +0 -312
  772. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -159
  773. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -158
  774. synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -71
  775. synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -105
  776. synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -119
  777. synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -52
  778. synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -305
  779. synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -156
  780. synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -281
  781. synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -25
  782. synth_ai/environments/examples/enron/engine.py +0 -300
  783. synth_ai/environments/examples/enron/environment.py +0 -234
  784. synth_ai/environments/examples/enron/taskset.py +0 -112
  785. synth_ai/environments/examples/enron/units/keyword_stats.py +0 -112
  786. synth_ai/environments/examples/minigrid/__init__.py +0 -48
  787. synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -1188
  788. synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -48
  789. synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -562
  790. synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -221
  791. synth_ai/environments/examples/minigrid/engine.py +0 -589
  792. synth_ai/environments/examples/minigrid/environment.py +0 -274
  793. synth_ai/environments/examples/minigrid/environment_mapping.py +0 -242
  794. synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -417
  795. synth_ai/environments/examples/minigrid/taskset.py +0 -583
  796. synth_ai/environments/examples/nethack/__init__.py +0 -7
  797. synth_ai/environments/examples/nethack/achievements.py +0 -337
  798. synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -981
  799. synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -74
  800. synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -831
  801. synth_ai/environments/examples/nethack/engine.py +0 -739
  802. synth_ai/environments/examples/nethack/environment.py +0 -256
  803. synth_ai/environments/examples/nethack/helpers/__init__.py +0 -41
  804. synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -301
  805. synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -402
  806. synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -433
  807. synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -200
  808. synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -269
  809. synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -308
  810. synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -431
  811. synth_ai/environments/examples/nethack/taskset.py +0 -323
  812. synth_ai/environments/examples/red/__init__.py +0 -7
  813. synth_ai/environments/examples/red/agent_demos/__init__.py +0 -1
  814. synth_ai/environments/examples/red/config_logging.py +0 -110
  815. synth_ai/environments/examples/red/engine.py +0 -721
  816. synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -1
  817. synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -35
  818. synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -276
  819. synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -142
  820. synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -57
  821. synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -284
  822. synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -150
  823. synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -138
  824. synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -57
  825. synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -331
  826. synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -121
  827. synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_progression.py +0 -477
  828. synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -559
  829. synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -313
  830. synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -148
  831. synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -247
  832. synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -368
  833. synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -172
  834. synth_ai/environments/examples/red/environment.py +0 -298
  835. synth_ai/environments/examples/red/taskset.py +0 -79
  836. synth_ai/environments/examples/red/units/__init__.py +0 -1
  837. synth_ai/environments/examples/sokoban/__init__.py +0 -1
  838. synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -899
  839. synth_ai/environments/examples/sokoban/engine.py +0 -678
  840. synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -1
  841. synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -657
  842. synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -18
  843. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -3
  844. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -131
  845. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -370
  846. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -332
  847. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -306
  848. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -67
  849. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -115
  850. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -123
  851. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -394
  852. synth_ai/environments/examples/sokoban/environment.py +0 -229
  853. synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -440
  854. synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -312
  855. synth_ai/environments/examples/sokoban/taskset.py +0 -544
  856. synth_ai/environments/examples/tictactoe/__init__.py +0 -1
  857. synth_ai/environments/examples/tictactoe/engine.py +0 -368
  858. synth_ai/environments/examples/tictactoe/environment.py +0 -240
  859. synth_ai/environments/examples/tictactoe/taskset.py +0 -215
  860. synth_ai/environments/examples/verilog/__init__.py +0 -10
  861. synth_ai/environments/examples/verilog/engine.py +0 -421
  862. synth_ai/environments/examples/verilog/environment.py +0 -350
  863. synth_ai/environments/examples/verilog/taskset.py +0 -420
  864. synth_ai/environments/examples/wordle/__init__.py +0 -29
  865. synth_ai/environments/examples/wordle/engine.py +0 -398
  866. synth_ai/environments/examples/wordle/environment.py +0 -159
  867. synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -75
  868. synth_ai/environments/examples/wordle/taskset.py +0 -230
  869. synth_ai/environments/reproducibility/core.py +0 -42
  870. synth_ai/environments/reproducibility/helpers.py +0 -0
  871. synth_ai/environments/reproducibility/tree.py +0 -363
  872. synth_ai/environments/service/app.py +0 -97
  873. synth_ai/environments/service/core_routes.py +0 -1021
  874. synth_ai/environments/service/external_registry.py +0 -56
  875. synth_ai/environments/service/registry.py +0 -9
  876. synth_ai/environments/stateful/__init__.py +0 -1
  877. synth_ai/environments/stateful/core.py +0 -163
  878. synth_ai/environments/stateful/engine.py +0 -21
  879. synth_ai/environments/stateful/state.py +0 -7
  880. synth_ai/environments/tasks/api.py +0 -19
  881. synth_ai/environments/tasks/core.py +0 -81
  882. synth_ai/environments/tasks/filters.py +0 -40
  883. synth_ai/environments/tasks/utils.py +0 -90
  884. synth_ai/environments/v0_observability/history.py +0 -3
  885. synth_ai/environments/v0_observability/log.py +0 -2
  886. synth_ai/evals/__init__.py +0 -15
  887. synth_ai/evals/base.py +0 -13
  888. synth_ai/evals/client.py +0 -82
  889. synth_ai/handshake.py +0 -109
  890. synth_ai/http.py +0 -26
  891. synth_ai/http_client.py +0 -136
  892. synth_ai/inference/__init__.py +0 -5
  893. synth_ai/inference/client.py +0 -34
  894. synth_ai/jobs/client.py +0 -295
  895. synth_ai/judge_schemas.py +0 -127
  896. synth_ai/learning/__init__.py +0 -59
  897. synth_ai/learning/client.py +0 -241
  898. synth_ai/learning/ft_client.py +0 -7
  899. synth_ai/learning/health.py +0 -49
  900. synth_ai/learning/jobs.py +0 -201
  901. synth_ai/learning/rl/client.py +0 -267
  902. synth_ai/learning/rl/contracts.py +0 -27
  903. synth_ai/learning/rl/env_keys.py +0 -166
  904. synth_ai/learning/rl/secrets.py +0 -13
  905. synth_ai/learning/sft/client.py +0 -68
  906. synth_ai/learning/sft/config.py +0 -270
  907. synth_ai/learning/sft/data.py +0 -295
  908. synth_ai/learning/validators.py +0 -49
  909. synth_ai/lm/__init__.py +0 -25
  910. synth_ai/task/__init__.py +0 -121
  911. synth_ai/task/apps/__init__.py +0 -129
  912. synth_ai/task/config.py +0 -257
  913. synth_ai/task/contracts.py +0 -236
  914. synth_ai/task/datasets.py +0 -108
  915. synth_ai/task/proxy.py +0 -251
  916. synth_ai/task/rubrics/__init__.py +0 -56
  917. synth_ai/task/rubrics/loaders.py +0 -152
  918. synth_ai/task/server.py +0 -432
  919. synth_ai/task/trace_correlation_helpers.py +0 -315
  920. synth_ai/task/tracing_utils.py +0 -84
  921. synth_ai/task/validators.py +0 -418
  922. synth_ai/tracing_v3/__init__.py +0 -97
  923. synth_ai/tracing_v3/abstractions.py +0 -302
  924. synth_ai/tracing_v3/config.py +0 -84
  925. synth_ai/tracing_v3/db_config.py +0 -194
  926. synth_ai/tracing_v3/decorators.py +0 -398
  927. synth_ai/tracing_v3/llm_call_record_helpers.py +0 -391
  928. synth_ai/tracing_v3/migration_helper.py +0 -120
  929. synth_ai/tracing_v3/session_tracer.py +0 -540
  930. synth_ai/tracing_v3/storage/base.py +0 -210
  931. synth_ai/tracing_v3/storage/config.py +0 -75
  932. synth_ai/tracing_v3/storage/factory.py +0 -39
  933. synth_ai/tracing_v3/trace_utils.py +0 -317
  934. synth_ai/tracing_v3/turso/daemon.py +0 -151
  935. synth_ai/tracing_v3/turso/models.py +0 -469
  936. synth_ai/tracing_v3/turso/native_manager.py +0 -1209
  937. synth_ai/tracing_v3/utils.py +0 -108
  938. synth_ai/tui/__init__.py +0 -5
  939. synth_ai/tui/__main__.py +0 -13
  940. synth_ai/tui/cli/__init__.py +0 -1
  941. synth_ai/tui/cli/query_experiments.py +0 -164
  942. synth_ai/tui/cli/query_experiments_v3.py +0 -164
  943. synth_ai/tui/dashboard.py +0 -906
  944. synth_ai/v0/api/__init__.py +0 -8
  945. synth_ai/v0/api/models/__init__.py +0 -8
  946. synth_ai/v0/api/models/supported.py +0 -8
  947. synth_ai/v0/config/__init__.py +0 -15
  948. synth_ai/v0/config/base_url.py +0 -12
  949. synth_ai/v0/lm/__init__.py +0 -51
  950. synth_ai/v0/lm/caching/__init__.py +0 -0
  951. synth_ai/v0/lm/caching/constants.py +0 -6
  952. synth_ai/v0/lm/caching/dbs.py +0 -0
  953. synth_ai/v0/lm/caching/ephemeral.py +0 -100
  954. synth_ai/v0/lm/caching/handler.py +0 -137
  955. synth_ai/v0/lm/caching/initialize.py +0 -11
  956. synth_ai/v0/lm/caching/persistent.py +0 -114
  957. synth_ai/v0/lm/config.py +0 -115
  958. synth_ai/v0/lm/constants.py +0 -32
  959. synth_ai/v0/lm/core/__init__.py +0 -8
  960. synth_ai/v0/lm/core/all.py +0 -73
  961. synth_ai/v0/lm/core/exceptions.py +0 -5
  962. synth_ai/v0/lm/core/main.py +0 -331
  963. synth_ai/v0/lm/core/main_v3.py +0 -594
  964. synth_ai/v0/lm/core/synth_models.py +0 -35
  965. synth_ai/v0/lm/core/vendor_clients.py +0 -190
  966. synth_ai/v0/lm/cost/__init__.py +0 -0
  967. synth_ai/v0/lm/cost/monitor.py +0 -1
  968. synth_ai/v0/lm/cost/statefulness.py +0 -1
  969. synth_ai/v0/lm/injection.py +0 -80
  970. synth_ai/v0/lm/overrides.py +0 -206
  971. synth_ai/v0/lm/provider_support/__init__.py +0 -8
  972. synth_ai/v0/lm/provider_support/anthropic.py +0 -972
  973. synth_ai/v0/lm/provider_support/openai.py +0 -1139
  974. synth_ai/v0/lm/provider_support/suppress_logging.py +0 -31
  975. synth_ai/v0/lm/structured_outputs/__init__.py +0 -0
  976. synth_ai/v0/lm/structured_outputs/handler.py +0 -440
  977. synth_ai/v0/lm/structured_outputs/inject.py +0 -297
  978. synth_ai/v0/lm/structured_outputs/rehabilitate.py +0 -185
  979. synth_ai/v0/lm/tools/__init__.py +0 -3
  980. synth_ai/v0/lm/tools/base.py +0 -172
  981. synth_ai/v0/lm/unified_interface.py +0 -202
  982. synth_ai/v0/lm/vendors/__init__.py +0 -0
  983. synth_ai/v0/lm/vendors/base.py +0 -81
  984. synth_ai/v0/lm/vendors/core/__init__.py +0 -0
  985. synth_ai/v0/lm/vendors/core/anthropic_api.py +0 -387
  986. synth_ai/v0/lm/vendors/core/gemini_api.py +0 -292
  987. synth_ai/v0/lm/vendors/core/mistral_api.py +0 -322
  988. synth_ai/v0/lm/vendors/core/openai_api.py +0 -227
  989. synth_ai/v0/lm/vendors/core/synth_dev_api.py +0 -0
  990. synth_ai/v0/lm/vendors/local/__init__.py +0 -0
  991. synth_ai/v0/lm/vendors/local/ollama.py +0 -0
  992. synth_ai/v0/lm/vendors/openai_standard.py +0 -782
  993. synth_ai/v0/lm/vendors/openai_standard_responses.py +0 -259
  994. synth_ai/v0/lm/vendors/retries.py +0 -22
  995. synth_ai/v0/lm/vendors/supported/__init__.py +0 -0
  996. synth_ai/v0/lm/vendors/supported/custom_endpoint.py +0 -415
  997. synth_ai/v0/lm/vendors/supported/deepseek.py +0 -69
  998. synth_ai/v0/lm/vendors/supported/grok.py +0 -75
  999. synth_ai/v0/lm/vendors/supported/groq.py +0 -16
  1000. synth_ai/v0/lm/vendors/supported/ollama.py +0 -15
  1001. synth_ai/v0/lm/vendors/supported/openrouter.py +0 -74
  1002. synth_ai/v0/lm/vendors/supported/together.py +0 -11
  1003. synth_ai/v0/lm/vendors/synth_client.py +0 -835
  1004. synth_ai/v0/lm/warmup.py +0 -186
  1005. synth_ai/v0/tracing/__init__.py +0 -0
  1006. synth_ai/v0/tracing/abstractions.py +0 -224
  1007. synth_ai/v0/tracing/base_client.py +0 -91
  1008. synth_ai/v0/tracing/client_manager.py +0 -131
  1009. synth_ai/v0/tracing/config.py +0 -142
  1010. synth_ai/v0/tracing/context.py +0 -146
  1011. synth_ai/v0/tracing/decorators.py +0 -682
  1012. synth_ai/v0/tracing/events/__init__.py +0 -0
  1013. synth_ai/v0/tracing/events/manage.py +0 -147
  1014. synth_ai/v0/tracing/events/scope.py +0 -86
  1015. synth_ai/v0/tracing/events/store.py +0 -228
  1016. synth_ai/v0/tracing/immediate_client.py +0 -151
  1017. synth_ai/v0/tracing/local.py +0 -18
  1018. synth_ai/v0/tracing/log_client_base.py +0 -73
  1019. synth_ai/v0/tracing/retry_queue.py +0 -186
  1020. synth_ai/v0/tracing/trackers.py +0 -515
  1021. synth_ai/v0/tracing/upload.py +0 -409
  1022. synth_ai/v0/tracing/utils.py +0 -9
  1023. synth_ai/v0/tracing_v1/__init__.py +0 -16
  1024. synth_ai/v0/tracing_v1/abstractions.py +0 -224
  1025. synth_ai/v0/tracing_v1/base_client.py +0 -91
  1026. synth_ai/v0/tracing_v1/client_manager.py +0 -131
  1027. synth_ai/v0/tracing_v1/config.py +0 -142
  1028. synth_ai/v0/tracing_v1/context.py +0 -146
  1029. synth_ai/v0/tracing_v1/decorators.py +0 -703
  1030. synth_ai/v0/tracing_v1/events/__init__.py +0 -0
  1031. synth_ai/v0/tracing_v1/events/manage.py +0 -147
  1032. synth_ai/v0/tracing_v1/events/scope.py +0 -86
  1033. synth_ai/v0/tracing_v1/events/store.py +0 -228
  1034. synth_ai/v0/tracing_v1/immediate_client.py +0 -151
  1035. synth_ai/v0/tracing_v1/local.py +0 -18
  1036. synth_ai/v0/tracing_v1/log_client_base.py +0 -73
  1037. synth_ai/v0/tracing_v1/retry_queue.py +0 -186
  1038. synth_ai/v0/tracing_v1/trackers.py +0 -515
  1039. synth_ai/v0/tracing_v1/upload.py +0 -527
  1040. synth_ai/v0/tracing_v1/utils.py +0 -9
  1041. synth_ai/v0/tracing_v3/__init__.py +0 -10
  1042. synth_ai/v0/tracing_v3/abstractions.py +0 -3
  1043. synth_ai/v0/tracing_v3/decorators.py +0 -3
  1044. synth_ai/v0/tracing_v3/llm_call_record_helpers.py +0 -3
  1045. synth_ai/v0/tracing_v3/session_tracer.py +0 -3
  1046. synth_ai-0.2.14.dist-info/METADATA +0 -139
  1047. synth_ai-0.2.14.dist-info/RECORD +0 -762
  1048. synth_ai-0.2.14.dist-info/top_level.txt +0 -2
  1049. /synth_ai/{demos/demo_task_apps → cli/demo_apps}/crafter/__init__.py +0 -0
  1050. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/__init__.py +0 -0
  1051. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/crafter/configs/crafter_fft_4b.toml +0 -0
  1052. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +0 -0
  1053. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
  1054. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/_common.py +0 -0
  1055. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/app.py +0 -0
  1056. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/config.toml +0 -0
  1057. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/deploy_modal.py +0 -0
  1058. {examples/task_apps → synth_ai/core/apps}/__init__.py +0 -0
  1059. /synth_ai/{tracing_v3 → core/tracing_v3}/examples/basic_usage.py +0 -0
  1060. /synth_ai/{tracing_v3 → core/tracing_v3}/hooks.py +0 -0
  1061. /synth_ai/{tracing_v3 → core/tracing_v3}/lm_call_record_abstractions.py +0 -0
  1062. /synth_ai/{tracing_v3 → core/tracing_v3}/replica_sync.py +0 -0
  1063. /synth_ai/{tracing_v3 → core/tracing_v3}/serialization.py +0 -0
  1064. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/__init__.py +0 -0
  1065. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/exceptions.py +0 -0
  1066. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/types.py +0 -0
  1067. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/utils.py +0 -0
  1068. /synth_ai/{tracing_v3 → core/tracing_v3}/turso/__init__.py +0 -0
  1069. /synth_ai/{evals → sdk/judging}/types.py +0 -0
  1070. /synth_ai/{learning → sdk/learning}/algorithms.py +0 -0
  1071. /synth_ai/{learning → sdk/learning}/config.py +0 -0
  1072. /synth_ai/{learning → sdk/learning}/constants.py +0 -0
  1073. /synth_ai/{learning → sdk/learning}/core.py +0 -0
  1074. /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
  1075. /synth_ai/{learning → sdk/learning}/rl/__init__.py +0 -0
  1076. /synth_ai/{learning → sdk/learning}/rl/config.py +0 -0
  1077. /synth_ai/{learning → sdk/learning}/rl_client.py +0 -0
  1078. /synth_ai/{learning → sdk/learning}/sft/__init__.py +0 -0
  1079. /synth_ai/{learning → sdk/learning}/sse.py +0 -0
  1080. /synth_ai/{task → sdk/task}/auth.py +0 -0
  1081. /synth_ai/{task → sdk/task}/client.py +0 -0
  1082. /synth_ai/{task → sdk/task}/errors.py +0 -0
  1083. /synth_ai/{task → sdk/task}/health.py +0 -0
  1084. /synth_ai/{task → sdk/task}/json.py +0 -0
  1085. /synth_ai/{task → sdk/task}/rubrics/models.py +0 -0
  1086. /synth_ai/{task → sdk/task}/rubrics/scoring.py +0 -0
  1087. /synth_ai/{task → sdk/task}/rubrics/strict.py +0 -0
  1088. /synth_ai/{task → sdk/task}/vendors.py +0 -0
  1089. {synth_ai-0.2.14.dist-info → synth_ai-0.4.1.dist-info}/WHEEL +0 -0
  1090. {synth_ai-0.2.14.dist-info → synth_ai-0.4.1.dist-info}/entry_points.txt +0 -0
  1091. {synth_ai-0.2.14.dist-info → synth_ai-0.4.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,1139 +0,0 @@
1
- import copy
2
- import logging
3
- import types
4
- from collections import defaultdict
5
- from dataclasses import dataclass
6
- from inspect import isclass
7
-
8
- import openai.resources
9
- from langfuse import Langfuse
10
- from langfuse.client import StatefulGenerationClient
11
- from langfuse.decorators import langfuse_context
12
- from langfuse.utils import _get_timestamp
13
- from langfuse.utils.langfuse_singleton import LangfuseSingleton
14
- from packaging.version import Version
15
- from pydantic import BaseModel
16
- from wrapt import wrap_function_wrapper
17
-
18
- from synth_ai.v0.lm.overrides import (
19
- apply_injection as apply_injection_overrides,
20
- )
21
- from synth_ai.v0.lm.overrides import (
22
- apply_param_overrides,
23
- apply_tool_overrides,
24
- use_overrides_for_messages,
25
- )
26
- from synth_ai.v0.lm.provider_support.suppress_logging import *
27
- from synth_ai.v0.v0.tracing_v1.abstractions import MessageInputs
28
- from synth_ai.v0.v0.tracing_v1.trackers import synth_tracker_async, synth_tracker_sync
29
-
30
- try:
31
- import openai
32
- except ImportError as err:
33
- raise ModuleNotFoundError(
34
- "Please install OpenAI to use this feature: 'pip install openai'"
35
- ) from err
36
-
37
- # CREDIT TO LANGFUSE FOR OPEN-SOURCING THE CODE THAT THIS IS BASED ON
38
- # USING WITH MIT LICENSE PERMISSION
39
- # https://langfuse.com
40
-
41
- try:
42
- from openai import AsyncAzureOpenAI, AsyncOpenAI, AzureOpenAI, OpenAI # noqa: F401
43
- except ImportError:
44
- AsyncAzureOpenAI = None
45
- AsyncOpenAI = None
46
- AzureOpenAI = None
47
- OpenAI = None
48
-
49
-
50
- # log = logging.getLogger("langfuse")
51
-
52
- # Add logger configuration
53
- logger = logging.getLogger(__name__)
54
- logger.setLevel(logging.DEBUG) # Set to DEBUG to see all messages
55
-
56
-
57
- @dataclass
58
- class OpenAiDefinition:
59
- module: str
60
- object: str
61
- method: str
62
- type: str
63
- sync: bool
64
- min_version: str | None = None
65
-
66
-
67
- OPENAI_METHODS_V0 = [
68
- OpenAiDefinition(
69
- module="openai",
70
- object="ChatCompletion",
71
- method="create",
72
- type="chat",
73
- sync=True,
74
- ),
75
- OpenAiDefinition(
76
- module="openai",
77
- object="Completion",
78
- method="create",
79
- type="completion",
80
- sync=True,
81
- ),
82
- ]
83
-
84
-
85
- OPENAI_METHODS_V1 = [
86
- OpenAiDefinition(
87
- module="openai.resources.chat.completions",
88
- object="Completions",
89
- method="create",
90
- type="chat",
91
- sync=True,
92
- ),
93
- OpenAiDefinition(
94
- module="openai.resources.completions",
95
- object="Completions",
96
- method="create",
97
- type="completion",
98
- sync=True,
99
- ),
100
- OpenAiDefinition(
101
- module="openai.resources.chat.completions",
102
- object="AsyncCompletions",
103
- method="create",
104
- type="chat",
105
- sync=False,
106
- ),
107
- OpenAiDefinition(
108
- module="openai.resources.completions",
109
- object="AsyncCompletions",
110
- method="create",
111
- type="completion",
112
- sync=False,
113
- ),
114
- OpenAiDefinition(
115
- module="openai.resources.chat.completions",
116
- object="Completions",
117
- method="parse",
118
- type="chat",
119
- sync=True,
120
- min_version="1.50.0",
121
- ),
122
- OpenAiDefinition(
123
- module="openai.resources.chat.completions",
124
- object="AsyncCompletions",
125
- method="parse",
126
- type="chat",
127
- sync=False,
128
- min_version="1.50.0",
129
- ),
130
- ]
131
-
132
-
133
- class OpenAiArgsExtractor:
134
- def __init__(
135
- self,
136
- name=None,
137
- metadata=None,
138
- trace_id=None,
139
- session_id=None,
140
- user_id=None,
141
- tags=None,
142
- parent_observation_id=None,
143
- langfuse_prompt=None, # we cannot use prompt because it's an argument of the old OpenAI completions API
144
- **kwargs,
145
- ):
146
- # logger.debug(f"OpenAiArgsExtractor initialized with kwargs: {kwargs}")
147
- # raise NotImplementedError("This method is not implemented yet")
148
- self.args = {}
149
- self.args["name"] = name
150
- self.args["metadata"] = (
151
- metadata
152
- if "response_format" not in kwargs
153
- else {
154
- **(metadata or {}),
155
- "response_format": kwargs["response_format"].model_json_schema()
156
- if isclass(kwargs["response_format"])
157
- and issubclass(kwargs["response_format"], BaseModel)
158
- else kwargs["response_format"],
159
- }
160
- )
161
- self.args["trace_id"] = trace_id
162
- self.args["session_id"] = session_id
163
- self.args["user_id"] = user_id
164
- self.args["tags"] = tags
165
- self.args["parent_observation_id"] = parent_observation_id
166
- self.args["langfuse_prompt"] = langfuse_prompt
167
- self.kwargs = kwargs
168
-
169
- def get_langfuse_args(self):
170
- return {**self.args, **self.kwargs}
171
-
172
- def get_openai_args(self):
173
- return self.kwargs
174
-
175
-
176
- def _langfuse_wrapper(func):
177
- def _with_langfuse(open_ai_definitions, initialize):
178
- def wrapper(wrapped, instance, args, kwargs):
179
- return func(open_ai_definitions, initialize, wrapped, args, kwargs)
180
-
181
- return wrapper
182
-
183
- return _with_langfuse
184
-
185
-
186
- def _extract_chat_prompt(kwargs: dict):
187
- """
188
- Extracts the user input from prompts. Returns an array of messages or a dict with messages and functions.
189
- """
190
- prompt = {}
191
-
192
- if kwargs.get("functions") is not None:
193
- prompt.update({"functions": kwargs["functions"]})
194
-
195
- if kwargs.get("function_call") is not None:
196
- prompt.update({"function_call": kwargs["function_call"]})
197
-
198
- if kwargs.get("tools") is not None:
199
- prompt.update({"tools": kwargs["tools"]})
200
-
201
- # existing logic to handle the case when prompt is not empty
202
- if prompt:
203
- messages = _filter_image_data(kwargs.get("messages", []))
204
- prompt.update({"messages": messages})
205
- return prompt
206
- else:
207
- # fallback: just return filtered messages
208
- messages = _filter_image_data(kwargs.get("messages", []))
209
- return messages
210
-
211
-
212
- def _extract_chat_response(kwargs: dict):
213
- """
214
- Extracts the LLM output from the response.
215
- """
216
- response = {
217
- "role": kwargs.get("role"),
218
- }
219
-
220
- if kwargs.get("function_call") is not None:
221
- response.update({"function_call": kwargs["function_call"]})
222
-
223
- if kwargs.get("tool_calls") is not None:
224
- response.update({"tool_calls": kwargs["tool_calls"]})
225
-
226
- response["content"] = kwargs.get("content")
227
- return response
228
-
229
-
230
- def _get_langfuse_data_from_kwargs(
231
- resource: OpenAiDefinition, langfuse: Langfuse, start_time, kwargs
232
- ):
233
- # print("DEBUG: Entering _get_langfuse_data_from_kwargs")
234
- # print("DEBUG: kwargs received:", kwargs)
235
-
236
- name = kwargs.get("name", "OpenAI-generation")
237
- # print("DEBUG: name =", name)
238
- if name is None:
239
- name = "OpenAI-generation"
240
-
241
- if name is not None and not isinstance(name, str):
242
- raise TypeError("name must be a string")
243
-
244
- decorator_context_observation_id = langfuse_context.get_current_observation_id()
245
- decorator_context_trace_id = langfuse_context.get_current_trace_id()
246
- # print("DEBUG: decorator_context_observation_id =", decorator_context_observation_id)
247
- # print("DEBUG: decorator_context_trace_id =", decorator_context_trace_id)
248
-
249
- trace_id = kwargs.get("trace_id", None) or decorator_context_trace_id
250
- # print("DEBUG: trace_id =", trace_id)
251
- if trace_id is not None and not isinstance(trace_id, str):
252
- raise TypeError("trace_id must be a string")
253
-
254
- session_id = kwargs.get("session_id", None)
255
- # print("DEBUG: session_id =", session_id)
256
- if session_id is not None and not isinstance(session_id, str):
257
- raise TypeError("session_id must be a string")
258
-
259
- user_id = kwargs.get("user_id", None)
260
- # print("DEBUG: user_id =", user_id)
261
- if user_id is not None and not isinstance(user_id, str):
262
- raise TypeError("user_id must be a string")
263
-
264
- tags = kwargs.get("tags", None)
265
- # print("DEBUG: tags =", tags)
266
- if tags is not None and (
267
- not isinstance(tags, list) or not all(isinstance(tag, str) for tag in tags)
268
- ):
269
- raise TypeError("tags must be a list of strings")
270
-
271
- if decorator_context_trace_id:
272
- langfuse_context.update_current_trace(session_id=session_id, user_id=user_id, tags=tags)
273
-
274
- parent_observation_id = kwargs.get("parent_observation_id", None) or (
275
- decorator_context_observation_id
276
- if decorator_context_observation_id != decorator_context_trace_id
277
- else None
278
- )
279
- # print("DEBUG: parent_observation_id =", parent_observation_id)
280
- if parent_observation_id is not None and not isinstance(parent_observation_id, str):
281
- raise TypeError("parent_observation_id must be a string")
282
- if parent_observation_id is not None and trace_id is None:
283
- raise ValueError("parent_observation_id requires trace_id to be set")
284
-
285
- metadata = kwargs.get("metadata", {})
286
- # print("DEBUG: metadata =", metadata)
287
- if metadata is not None and not isinstance(metadata, dict):
288
- raise TypeError("metadata must be a dictionary")
289
-
290
- prompt = None
291
- if resource.type == "completion":
292
- prompt = kwargs.get("prompt", None)
293
- elif resource.type == "chat":
294
- prompt = _extract_chat_prompt(kwargs)
295
- # Extract model: first check top-level, then check inside 'inputs'
296
- model = kwargs.get("model", None)
297
- inputs = kwargs.get("inputs", {}) if kwargs.get("inputs", {}) else {}
298
- if isinstance(inputs, dict):
299
- # print("DEBUG: inputs =", inputs)
300
- if "model_name" in inputs:
301
- detailed_model = inputs["model_name"]
302
- print("DEBUG: detailed_model =", detailed_model)
303
- # If a detailed_model exists and is different from the top-level model, use it.
304
- if detailed_model and (not model or model != detailed_model):
305
- print("DEBUG: Upgrading model value from", model, "to", detailed_model)
306
- model = detailed_model
307
- # print("DEBUG: final model =", model)
308
-
309
- # Extract model hyperparameters and add them to the new field 'model_params'
310
- model_params = {
311
- "temperature": kwargs.get("temperature", 1),
312
- "max_tokens": kwargs.get("max_tokens", float("inf")),
313
- "top_p": kwargs.get("top_p", 1),
314
- "frequency_penalty": kwargs.get("frequency_penalty", 0),
315
- "presence_penalty": kwargs.get("presence_penalty", 0),
316
- }
317
- if kwargs.get("seed", None) is not None:
318
- model_params["seed"] = kwargs.get("seed", None)
319
-
320
- is_nested_trace = False
321
- if trace_id:
322
- is_nested_trace = True
323
- langfuse.trace(id=trace_id, session_id=session_id, user_id=user_id, tags=tags)
324
- else:
325
- trace_instance = langfuse.trace(
326
- session_id=session_id,
327
- user_id=user_id,
328
- tags=tags,
329
- name=name,
330
- input=prompt,
331
- metadata=metadata,
332
- )
333
- trace_id = trace_instance.id
334
- # print("DEBUG: Generated new trace_id =", trace_id)
335
-
336
- langfuse_prompt = kwargs.get("langfuse_prompt", None)
337
-
338
- extracted_data = {
339
- "name": name,
340
- "metadata": metadata,
341
- "trace_id": trace_id,
342
- "parent_observation_id": parent_observation_id,
343
- "user_id": user_id,
344
- "start_time": start_time,
345
- "input": prompt,
346
- "model_params": {
347
- "model_name": model or None,
348
- "temperature": kwargs.get("temperature", 1),
349
- "max_tokens": kwargs.get("max_tokens", float("inf")),
350
- "top_p": kwargs.get("top_p", 1),
351
- "frequency_penalty": kwargs.get("frequency_penalty", 0),
352
- "presence_penalty": kwargs.get("presence_penalty", 0),
353
- },
354
- "prompt": langfuse_prompt,
355
- }
356
-
357
- # Add seed to model_params if present
358
- if kwargs.get("seed", None) is not None:
359
- extracted_data["model_params"]["seed"] = kwargs.get("seed", None)
360
-
361
- # print("DEBUG: Exiting _get_langfuse_data_from_kwargs with extracted_data:")
362
- # print(extracted_data)
363
- # print("DEBUG: is_nested_trace =", is_nested_trace)
364
-
365
- return extracted_data, is_nested_trace
366
-
367
-
368
- def _create_langfuse_update(
369
- completion,
370
- generation: StatefulGenerationClient,
371
- completion_start_time,
372
- model=None,
373
- usage=None,
374
- model_params=None,
375
- ):
376
- update = {
377
- "end_time": _get_timestamp(),
378
- "output": completion,
379
- "completion_start_time": completion_start_time,
380
- }
381
-
382
- # Create model_params dictionary
383
- model_params = {
384
- "model_name": model or None,
385
- }
386
-
387
- # Add hyperparameters if provided
388
- if model_params:
389
- model_params.update(model_params)
390
-
391
- # Add model_params to update
392
- update["model_params"] = model_params
393
-
394
- if usage is not None:
395
- update["usage"] = usage
396
-
397
- generation.update(**update)
398
-
399
-
400
- def _extract_streamed_openai_response(resource, chunks):
401
- # logger.debug(f"Extracting streamed response for resource type: {resource.type}")
402
- # logger.debug(f"Number of chunks: {len(chunks)}")
403
- completion = defaultdict(str) if resource.type == "chat" else ""
404
- model = None
405
- usage = None
406
-
407
- for chunk in chunks:
408
- if _is_openai_v1():
409
- chunk = chunk.__dict__
410
- # logger.debug(f"Processing chunk: {chunk}")
411
-
412
- # Extract model name from chunk
413
- model = model or chunk.get("model", None) or None
414
-
415
- # Extract usage information
416
- chunk_usage = chunk.get("usage", None)
417
- if chunk_usage is not None:
418
- if _is_openai_v1():
419
- chunk_usage = chunk_usage.__dict__
420
- usage = chunk_usage
421
-
422
- # Process choices
423
- choices = chunk.get("choices", []) # noqa: F841
424
- # logger.debug(f"Extracted - model: {model}, choices: {choices}")
425
-
426
- # logger.debug(f"Final completion: {completion}")
427
- return model, completion, usage
428
-
429
-
430
- def _get_langfuse_data_from_default_response(resource: OpenAiDefinition, response):
431
- if response is None:
432
- return None, "<NoneType response returned from OpenAI>", None
433
-
434
- # Extract model name from response
435
- model = response.get("model", None) or None
436
-
437
- # Extract completion based on resource type
438
- completion = None
439
- if resource.type == "completion":
440
- choices = response.get("choices", [])
441
- if len(choices) > 0:
442
- choice = choices[-1]
443
- completion = choice.text if _is_openai_v1() else choice.get("text", None)
444
- elif resource.type == "chat":
445
- choices = response.get("choices", [])
446
- if len(choices) > 0:
447
- choice = choices[-1]
448
- completion = (
449
- _extract_chat_response(choice.message.__dict__)
450
- if _is_openai_v1()
451
- else choice.get("message", None)
452
- )
453
-
454
- # Extract usage information
455
- usage = response.get("usage", None)
456
- if _is_openai_v1() and usage is not None:
457
- usage = usage.__dict__
458
-
459
- return model, completion, usage
460
-
461
-
462
- def _is_openai_v1():
463
- return Version(openai.__version__) >= Version("1.0.0")
464
-
465
-
466
- def _is_streaming_response(response):
467
- return (
468
- isinstance(response, types.GeneratorType)
469
- or isinstance(response, types.AsyncGeneratorType)
470
- or (_is_openai_v1() and isinstance(response, openai.Stream))
471
- or (_is_openai_v1() and isinstance(response, openai.AsyncStream))
472
- )
473
-
474
-
475
- @_langfuse_wrapper
476
- def _wrap(open_ai_resource: OpenAiDefinition, initialize, wrapped, args, kwargs):
477
- new_langfuse: Langfuse = initialize()
478
-
479
- start_time = _get_timestamp()
480
- arg_extractor = OpenAiArgsExtractor(*args, **kwargs)
481
-
482
- generation, is_nested_trace = _get_langfuse_data_from_kwargs(
483
- open_ai_resource, new_langfuse, start_time, arg_extractor.get_langfuse_args()
484
- )
485
- generation = new_langfuse.generation(**generation)
486
- try:
487
- openai_args = arg_extractor.get_openai_args()
488
- # Apply context-scoped injection to chat messages if present
489
- if isinstance(openai_args, dict) and "messages" in openai_args:
490
- try:
491
- with use_overrides_for_messages(openai_args["messages"]): # type: ignore[arg-type]
492
- openai_args["messages"] = apply_injection_overrides(openai_args["messages"]) # type: ignore[arg-type]
493
- openai_args = apply_tool_overrides(openai_args)
494
- openai_args = apply_param_overrides(openai_args)
495
- except Exception:
496
- pass
497
- openai_response = wrapped(**openai_args)
498
-
499
- if _is_streaming_response(openai_response):
500
- return LangfuseResponseGeneratorSync(
501
- resource=open_ai_resource,
502
- response=openai_response,
503
- generation=generation,
504
- langfuse=new_langfuse,
505
- is_nested_trace=is_nested_trace,
506
- kwargs=arg_extractor.get_openai_args(),
507
- )
508
-
509
- else:
510
- model, completion, usage = _get_langfuse_data_from_default_response(
511
- open_ai_resource,
512
- (openai_response and openai_response.__dict__)
513
- if _is_openai_v1()
514
- else openai_response,
515
- )
516
- model_params = {
517
- "model_name": model or None,
518
- "temperature": kwargs.get("temperature", 1),
519
- "max_tokens": kwargs.get("max_tokens", float("inf")),
520
- "top_p": kwargs.get("top_p", 1),
521
- "frequency_penalty": kwargs.get("frequency_penalty", 0),
522
- "presence_penalty": kwargs.get("presence_penalty", 0),
523
- }
524
-
525
- # Collect messages
526
- if open_ai_resource.type == "completion":
527
- user_prompt = arg_extractor.get_openai_args().get("prompt", "")
528
- messages = [{"role": "user", "content": user_prompt}]
529
- message_input = MessageInputs(messages=messages)
530
-
531
- # Track user input
532
- synth_tracker_sync.track_lm(
533
- messages=message_input.messages,
534
- model_name=model,
535
- model_params=model_params,
536
- finetune=False,
537
- )
538
-
539
- # Track assistant output separately
540
- assistant_message = [{"role": "assistant", "content": completion}]
541
- synth_tracker_sync.track_lm_output(
542
- messages=assistant_message,
543
- model_name=model,
544
- model_params=model_params,
545
- finetune=False,
546
- )
547
-
548
- elif open_ai_resource.type == "chat":
549
- messages = openai_args.get("messages", [])
550
- message_input = MessageInputs(messages=messages)
551
-
552
- # Track user input
553
- synth_tracker_sync.track_lm(
554
- messages=message_input.messages,
555
- model_name=model,
556
- model_params=model_params,
557
- finetune=False,
558
- )
559
-
560
- # Track assistant output separately
561
- assistant_message = [{"role": "assistant", "content": completion["content"]}]
562
- synth_tracker_sync.track_lm_output(
563
- messages=assistant_message, model_name=model, finetune=False
564
- )
565
-
566
- else:
567
- message_input = MessageInputs(messages=[])
568
-
569
- # Use track_lm
570
- # synth_tracker_sync.track_lm(
571
- # messages=message_input.messages,
572
- # model_name=model,
573
- # model_params=model_params,finetune=False,
574
- # )
575
-
576
- if kwargs.get("seed", None) is not None:
577
- model_params["seed"] = kwargs.get("seed", None)
578
-
579
- generation.update(
580
- model_params=model_params,
581
- output=completion,
582
- end_time=_get_timestamp(),
583
- usage=usage,
584
- )
585
-
586
- # Avoiding the trace-update if trace-id is provided by user.
587
- if not is_nested_trace:
588
- new_langfuse.trace(id=generation.trace_id, output=completion)
589
-
590
- return openai_response
591
- except Exception as ex:
592
- # log.warning(ex)
593
- model = kwargs.get("model", None) or None
594
- model_params = {
595
- "model_name": model or None,
596
- "temperature": kwargs.get("temperature", 1),
597
- "max_tokens": kwargs.get("max_tokens", float("inf")),
598
- "top_p": kwargs.get("top_p", 1),
599
- "frequency_penalty": kwargs.get("frequency_penalty", 0),
600
- "presence_penalty": kwargs.get("presence_penalty", 0),
601
- }
602
- if kwargs.get("seed", None) is not None:
603
- model_params["seed"] = kwargs.get("seed", None)
604
-
605
- generation.update(
606
- end_time=_get_timestamp(),
607
- status_message=str(ex),
608
- level="ERROR",
609
- model_params=model_params,
610
- usage={"input_cost": 0, "output_cost": 0, "total_cost": 0},
611
- )
612
- raise ex
613
-
614
-
615
- @_langfuse_wrapper
616
- async def _wrap_async(open_ai_resource: OpenAiDefinition, initialize, wrapped, args, kwargs):
617
- new_langfuse = initialize()
618
- start_time = _get_timestamp()
619
- arg_extractor = OpenAiArgsExtractor(*args, **kwargs)
620
-
621
- generation, is_nested_trace = _get_langfuse_data_from_kwargs(
622
- open_ai_resource, new_langfuse, start_time, arg_extractor.get_langfuse_args()
623
- )
624
- generation = new_langfuse.generation(**generation)
625
-
626
- try:
627
- openai_args = arg_extractor.get_openai_args()
628
- # Apply context-scoped injection to chat messages if present
629
- if isinstance(openai_args, dict) and "messages" in openai_args:
630
- try:
631
- with use_overrides_for_messages(openai_args["messages"]): # type: ignore[arg-type]
632
- openai_args["messages"] = apply_injection_overrides(openai_args["messages"]) # type: ignore[arg-type]
633
- openai_args = apply_tool_overrides(openai_args)
634
- openai_args = apply_param_overrides(openai_args)
635
- except Exception:
636
- pass
637
- openai_response = await wrapped(**openai_args)
638
-
639
- if _is_streaming_response(openai_response):
640
- return LangfuseResponseGeneratorAsync(
641
- resource=open_ai_resource,
642
- response=openai_response,
643
- generation=generation,
644
- langfuse=new_langfuse,
645
- is_nested_trace=is_nested_trace,
646
- kwargs=arg_extractor.get_openai_args(),
647
- )
648
-
649
- else:
650
- model, completion, usage = _get_langfuse_data_from_default_response(
651
- open_ai_resource,
652
- (openai_response and openai_response.__dict__)
653
- if _is_openai_v1()
654
- else openai_response,
655
- )
656
- model_params = {
657
- "model_name": model or None,
658
- "temperature": kwargs.get("temperature", 1),
659
- "max_tokens": kwargs.get("max_tokens", float("inf")),
660
- "top_p": kwargs.get("top_p", 1),
661
- "frequency_penalty": kwargs.get("frequency_penalty", 0),
662
- "presence_penalty": kwargs.get("presence_penalty", 0),
663
- }
664
-
665
- # Collect messages
666
- if open_ai_resource.type == "completion":
667
- user_prompt = arg_extractor.get_openai_args().get("prompt", "")
668
- messages = [{"role": "user", "content": user_prompt}]
669
- message_input = MessageInputs(messages=messages)
670
-
671
- # Track user input
672
- synth_tracker_async.track_lm(
673
- messages=message_input.messages,
674
- model_name=model,
675
- model_params=model_params,
676
- finetune=False,
677
- )
678
-
679
- # Track assistant output separately
680
- assistant_message = [{"role": "assistant", "content": completion}]
681
- synth_tracker_async.track_lm_output(
682
- messages=assistant_message, model_name=model, finetune=False
683
- )
684
-
685
- elif open_ai_resource.type == "chat":
686
- messages = openai_args.get("messages", [])
687
- message_input = MessageInputs(messages=messages)
688
-
689
- # Track user input
690
- synth_tracker_async.track_lm(
691
- messages=message_input.messages,
692
- model_name=model,
693
- model_params=model_params,
694
- finetune=False,
695
- )
696
-
697
- # Track assistant output separately
698
- assistant_message = [{"role": "assistant", "content": completion["content"]}]
699
- synth_tracker_async.track_lm_output(
700
- messages=assistant_message, model_name=model, finetune=False
701
- )
702
-
703
- else:
704
- message_input = MessageInputs(messages=[])
705
-
706
- # Use track_lm
707
- # synth_tracker_async.track_lm(
708
- # messages=message_input.messages,
709
- # model_name=model,
710
- # model_params=model_params,finetune=False,
711
- # )
712
-
713
- # Create model_params dictionary
714
- model_params = {
715
- "model_name": model or None,
716
- "temperature": kwargs.get("temperature", 1),
717
- "max_tokens": kwargs.get("max_tokens", float("inf")),
718
- "top_p": kwargs.get("top_p", 1),
719
- "frequency_penalty": kwargs.get("frequency_penalty", 0),
720
- "presence_penalty": kwargs.get("presence_penalty", 0),
721
- }
722
- if kwargs.get("seed", None) is not None:
723
- model_params["seed"] = kwargs.get("seed", None)
724
-
725
- generation.update(
726
- model_params=model_params,
727
- output=completion,
728
- end_time=_get_timestamp(),
729
- usage=usage,
730
- )
731
- # Avoiding the trace-update if trace-id is provided by user.
732
- if not is_nested_trace:
733
- new_langfuse.trace(id=generation.trace_id, output=completion)
734
-
735
- return openai_response
736
- except Exception as ex:
737
- model = kwargs.get("model", None) or None
738
- model_params = {
739
- "model_name": model or None,
740
- "temperature": kwargs.get("temperature", 1),
741
- "max_tokens": kwargs.get("max_tokens", float("inf")),
742
- "top_p": kwargs.get("top_p", 1),
743
- "frequency_penalty": kwargs.get("frequency_penalty", 0),
744
- "presence_penalty": kwargs.get("presence_penalty", 0),
745
- }
746
- if kwargs.get("seed", None) is not None:
747
- model_params["seed"] = kwargs.get("seed", None)
748
-
749
- generation.update(
750
- end_time=_get_timestamp(),
751
- status_message=str(ex),
752
- level="ERROR",
753
- model_params=model_params,
754
- usage={"input_cost": 0, "output_cost": 0, "total_cost": 0},
755
- )
756
- raise ex
757
-
758
- async def close(self) -> None:
759
- """Close the response and release the connection.
760
-
761
- Automatically called if the response body is read to completion.
762
- """
763
- await self.response.close()
764
-
765
-
766
- class OpenAILangfuse:
767
- _langfuse: Langfuse | None = None
768
-
769
- def initialize(self):
770
- self._langfuse = LangfuseSingleton().get(
771
- public_key=openai.langfuse_public_key,
772
- secret_key=openai.langfuse_secret_key,
773
- host=openai.langfuse_host,
774
- debug=openai.langfuse_debug,
775
- enabled=openai.langfuse_enabled,
776
- sdk_integration="openai",
777
- sample_rate=openai.langfuse_sample_rate,
778
- )
779
-
780
- return self._langfuse
781
-
782
- def flush(cls):
783
- cls._langfuse.flush()
784
-
785
- def langfuse_auth_check(self):
786
- """Check if the provided Langfuse credentials (public and secret key) are valid.
787
-
788
- Raises:
789
- Exception: If no projects were found for the provided credentials.
790
-
791
- Note:
792
- This method is blocking. It is discouraged to use it in prod code.
793
- """
794
- if self._langfuse is None:
795
- self.initialize()
796
-
797
- return self._langfuse.auth_check()
798
-
799
- def register_tracing(self):
800
- resources = OPENAI_METHODS_V1 if _is_openai_v1() else OPENAI_METHODS_V0
801
-
802
- for resource in resources:
803
- if resource.min_version is not None and Version(openai.__version__) < Version(
804
- resource.min_version
805
- ):
806
- continue
807
-
808
- # Check if the method actually exists before trying to wrap it
809
- try:
810
- module = __import__(resource.module, fromlist=[resource.object])
811
- obj = getattr(module, resource.object, None)
812
- if obj and not hasattr(obj, resource.method):
813
- continue # Skip if method doesn't exist
814
- except (ImportError, AttributeError):
815
- continue # Skip if module or object doesn't exist
816
-
817
- wrap_function_wrapper(
818
- resource.module,
819
- f"{resource.object}.{resource.method}",
820
- _wrap(resource, self.initialize)
821
- if resource.sync
822
- else _wrap_async(resource, self.initialize),
823
- )
824
-
825
- openai.langfuse_public_key = None
826
- openai.langfuse_secret_key = None
827
- openai.langfuse_host = None
828
- openai.langfuse_debug = None
829
- openai.langfuse_enabled = True
830
- openai.langfuse_sample_rate = None
831
- openai.langfuse_mask = None
832
- openai.langfuse_auth_check = self.langfuse_auth_check
833
- openai.flush_langfuse = self.flush
834
-
835
-
836
- modifier = OpenAILangfuse()
837
- modifier.register_tracing()
838
-
839
-
840
- # DEPRECATED: Use `openai.langfuse_auth_check()` instead
841
- def auth_check():
842
- if modifier._langfuse is None:
843
- modifier.initialize()
844
-
845
- return modifier._langfuse.auth_check()
846
-
847
-
848
- def _filter_image_data(messages: list[dict]):
849
- """https://platform.openai.com/docs/guides/vision?lang=python
850
-
851
- The messages array remains the same, but the 'image_url' is removed from the 'content' array.
852
- It should only be removed if the value starts with 'data:image/jpeg;base64,'
853
-
854
- """
855
- output_messages = copy.deepcopy(messages)
856
-
857
- for message in output_messages:
858
- content = (
859
- message.get("content", None)
860
- if isinstance(message, dict)
861
- else getattr(message, "content", None)
862
- )
863
-
864
- if content is not None:
865
- for index, item in enumerate(content):
866
- if isinstance(item, dict) and item.get("image_url", None) is not None:
867
- url = item["image_url"]["url"]
868
- if url.startswith("data:image/"):
869
- del content[index]["image_url"]
870
-
871
- return output_messages
872
-
873
-
874
- class LangfuseResponseGeneratorSync:
875
- def __init__(
876
- self,
877
- *,
878
- resource,
879
- response,
880
- generation,
881
- langfuse,
882
- is_nested_trace,
883
- kwargs,
884
- ):
885
- self.items = []
886
- self.resource = resource
887
- self.response = response
888
- self.generation = generation
889
- self.langfuse = langfuse
890
- self.is_nested_trace = is_nested_trace
891
- self.kwargs = kwargs
892
- self.completion_start_time = None
893
-
894
- def __iter__(self):
895
- try:
896
- for i in self.response:
897
- self.items.append(i)
898
-
899
- if self.completion_start_time is None:
900
- self.completion_start_time = _get_timestamp()
901
-
902
- yield i
903
- finally:
904
- self._finalize()
905
-
906
- def __next__(self):
907
- try:
908
- item = self.response.__next__()
909
- self.items.append(item)
910
-
911
- if self.completion_start_time is None:
912
- self.completion_start_time = _get_timestamp()
913
-
914
- return item
915
-
916
- except StopIteration:
917
- self._finalize()
918
-
919
- raise
920
-
921
- def __enter__(self):
922
- return self.__iter__()
923
-
924
- def __exit__(self, exc_type, exc_value, traceback):
925
- pass
926
-
927
- def _finalize(self):
928
- logger.debug("Entering _finalize() in LangfuseResponseGeneratorSync...")
929
- # First, extract values from the streamed response items
930
- model, completion, usage = _extract_streamed_openai_response(self.resource, self.items)
931
- logger.debug("Extracted model=%s, completion=%s, usage=%s", model, completion, usage)
932
-
933
- # Look through the streamed items for a detailed model in the additional "inputs"
934
- for item in self.items:
935
- if isinstance(item, dict):
936
- inputs = item.get("inputs")
937
- if isinstance(inputs, dict):
938
- detailed = inputs.get("model_name")
939
- if detailed and detailed != model:
940
- logger.debug(
941
- "Upgrading model value from %s to %s based on streamed inputs",
942
- model,
943
- detailed,
944
- )
945
- model = detailed
946
- break
947
- logger.debug("Final model after _finalize check: %s", model)
948
-
949
- # Create model hyperparameters dictionary
950
- model_params = {
951
- "temperature": self.kwargs.get("temperature", 1),
952
- "max_tokens": self.kwargs.get("max_tokens", float("inf")),
953
- "top_p": self.kwargs.get("top_p", 1),
954
- "frequency_penalty": self.kwargs.get("frequency_penalty", 0),
955
- "presence_penalty": self.kwargs.get("presence_penalty", 0),
956
- }
957
- if self.kwargs.get("seed") is not None:
958
- model_params["seed"] = self.kwargs.get("seed")
959
-
960
- if self.resource.type == "completion":
961
- user_prompt = self.kwargs.get("prompt", "")
962
- messages = [
963
- {"role": "user", "content": user_prompt},
964
- {"role": "assistant", "content": completion},
965
- ]
966
- message_input = MessageInputs(messages=messages)
967
- elif self.resource.type == "chat":
968
- messages = self.kwargs.get("messages", [])
969
- logger.debug("Existing 'messages' from kwargs before appending: %s", messages)
970
- if isinstance(completion, dict) and "content" in completion:
971
- messages.append({"role": "assistant", "content": completion["content"]})
972
- message_input = MessageInputs(messages=messages)
973
- logger.debug("Final 'messages': %s", message_input.messages)
974
- else:
975
- message_input = MessageInputs(messages=[])
976
-
977
- logger.debug(
978
- "Calling track_lm (sync) with messages: %s, model: %s",
979
- message_input.messages,
980
- model,
981
- )
982
- synth_tracker_sync.track_lm(
983
- messages=message_input.messages,
984
- model_name=model,
985
- model_params=model_params,
986
- finetune=False,
987
- )
988
-
989
- # Avoid the trace update if a trace-id was provided by the user.
990
- if not self.is_nested_trace:
991
- self.langfuse.trace(id=self.generation.trace_id, output=completion)
992
-
993
- # Pass the updated model and hyperparameters downstream in the update event.
994
- _create_langfuse_update(
995
- completion,
996
- self.generation,
997
- self.completion_start_time,
998
- model=model,
999
- usage=usage,
1000
- model_params=model_params,
1001
- )
1002
-
1003
-
1004
- class LangfuseResponseGeneratorAsync:
1005
- def __init__(
1006
- self,
1007
- *,
1008
- resource,
1009
- response,
1010
- generation,
1011
- langfuse,
1012
- is_nested_trace,
1013
- kwargs,
1014
- ):
1015
- # logger.debug(f"LangfuseResponseGeneratorAsync initialized with kwargs: {kwargs}")
1016
- # logger.debug(f"Resource type: {resource.type}")
1017
- self.items = []
1018
- self.resource = resource
1019
- self.response = response
1020
- self.generation = generation
1021
- self.langfuse = langfuse
1022
- self.is_nested_trace = is_nested_trace
1023
- self.kwargs = kwargs
1024
- self.completion_start_time = None
1025
-
1026
- async def __aiter__(self):
1027
- try:
1028
- async for i in self.response:
1029
- self.items.append(i)
1030
-
1031
- if self.completion_start_time is None:
1032
- self.completion_start_time = _get_timestamp()
1033
-
1034
- yield i
1035
- finally:
1036
- await self._finalize()
1037
-
1038
- async def __anext__(self):
1039
- try:
1040
- item = await self.response.__anext__()
1041
- self.items.append(item)
1042
-
1043
- if self.completion_start_time is None:
1044
- self.completion_start_time = _get_timestamp()
1045
-
1046
- return item
1047
-
1048
- except StopAsyncIteration:
1049
- await self._finalize()
1050
-
1051
- raise
1052
-
1053
- async def __aenter__(self):
1054
- return self.__aiter__()
1055
-
1056
- async def __aexit__(self, exc_type, exc_value, traceback):
1057
- pass
1058
-
1059
- async def _finalize(self):
1060
- logger.debug("Entering _finalize() in LangfuseResponseGeneratorAsync...")
1061
- model, completion, usage = _extract_streamed_openai_response(self.resource, self.items)
1062
- logger.debug("Extracted model=%s, completion=%s, usage=%s", model, completion, usage)
1063
-
1064
- # Look through the streamed items for a detailed model in the additional "inputs"
1065
- for item in self.items:
1066
- if isinstance(item, dict):
1067
- inputs = item.get("inputs")
1068
- if isinstance(inputs, dict):
1069
- detailed = inputs.get("model_name")
1070
- if detailed and detailed != model:
1071
- logger.debug(
1072
- "Upgrading model value from %s to %s based on streamed inputs",
1073
- model,
1074
- detailed,
1075
- )
1076
- model = detailed
1077
- break
1078
- logger.debug("Final model after _finalize check: %s", model)
1079
-
1080
- # Create model hyperparameters dictionary
1081
- model_params = {
1082
- "temperature": self.kwargs.get("temperature", 1),
1083
- "max_tokens": self.kwargs.get("max_tokens", float("inf")),
1084
- "top_p": self.kwargs.get("top_p", 1),
1085
- "frequency_penalty": self.kwargs.get("frequency_penalty", 0),
1086
- "presence_penalty": self.kwargs.get("presence_penalty", 0),
1087
- }
1088
- if self.kwargs.get("seed") is not None:
1089
- model_params["seed"] = self.kwargs.get("seed")
1090
-
1091
- if self.resource.type == "completion":
1092
- user_prompt = self.kwargs.get("prompt", "")
1093
- messages = [
1094
- {"role": "user", "content": user_prompt},
1095
- {"role": "assistant", "content": completion},
1096
- ]
1097
- message_input = MessageInputs(messages=messages)
1098
- elif self.resource.type == "chat":
1099
- messages = self.kwargs.get("messages", [])
1100
- logger.debug("Existing 'messages' from kwargs before appending: %s", messages)
1101
- # If completion is a dict, ensure we extract 'content' safely
1102
- if isinstance(completion, dict) and "content" in completion:
1103
- messages.append({"role": "assistant", "content": completion["content"]})
1104
- message_input = MessageInputs(messages=messages)
1105
- logger.debug("Final 'messages': %s", message_input.messages)
1106
- else:
1107
- message_input = MessageInputs(messages=[])
1108
-
1109
- logger.debug(
1110
- "Calling track_lm (async) with messages: %s, model: %s",
1111
- message_input.messages,
1112
- model,
1113
- )
1114
- synth_tracker_async.track_lm(
1115
- messages=message_input.messages,
1116
- model_name=model,
1117
- model_params=model_params,
1118
- finetune=False,
1119
- )
1120
-
1121
- # Avoiding the trace-update if trace-id is provided by user.
1122
- if not self.is_nested_trace:
1123
- self.langfuse.trace(id=self.generation.trace_id, output=completion)
1124
-
1125
- _create_langfuse_update(
1126
- completion,
1127
- self.generation,
1128
- self.completion_start_time,
1129
- model=model,
1130
- usage=usage,
1131
- model_params=model_params,
1132
- )
1133
-
1134
- async def close(self) -> None:
1135
- """Close the response and release the connection.
1136
-
1137
- Automatically called if the response body is read to completion.
1138
- """
1139
- await self.response.close()