synth-ai 0.2.9.dev11__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 (909) hide show
  1. synth_ai/__init__.py +44 -45
  2. synth_ai/__main__.py +30 -3
  3. synth_ai/cli/__init__.py +104 -78
  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 -103
  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/config.py +229 -0
  199. synth_ai/core/tracing_v3/constants.py +21 -0
  200. synth_ai/core/tracing_v3/db_config.py +182 -0
  201. synth_ai/core/tracing_v3/decorators.py +401 -0
  202. synth_ai/core/tracing_v3/examples/basic_usage.py +194 -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/replica_sync.py +262 -0
  206. synth_ai/core/tracing_v3/serialization.py +130 -0
  207. synth_ai/core/tracing_v3/session_tracer.py +542 -0
  208. synth_ai/core/tracing_v3/storage/base.py +211 -0
  209. synth_ai/core/tracing_v3/storage/config.py +109 -0
  210. synth_ai/core/tracing_v3/storage/factory.py +39 -0
  211. synth_ai/core/tracing_v3/storage/utils.py +206 -0
  212. synth_ai/core/tracing_v3/trace_utils.py +326 -0
  213. synth_ai/core/tracing_v3/turso/__init__.py +12 -0
  214. synth_ai/core/tracing_v3/turso/daemon.py +278 -0
  215. synth_ai/core/tracing_v3/turso/models.py +470 -0
  216. synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
  217. synth_ai/core/tracing_v3/utils.py +108 -0
  218. synth_ai/core/urls.py +18 -0
  219. synth_ai/core/user_config.py +137 -0
  220. synth_ai/core/uvicorn.py +222 -0
  221. synth_ai/data/__init__.py +110 -0
  222. synth_ai/data/enums.py +141 -0
  223. synth_ai/data/rewards.py +152 -0
  224. synth_ai/data/specs.py +36 -0
  225. synth_ai/data/traces.py +35 -0
  226. synth_ai/products/__init__.py +6 -0
  227. synth_ai/products/graph_evolve/__init__.py +46 -0
  228. synth_ai/products/graph_evolve/client.py +226 -0
  229. synth_ai/products/graph_evolve/config.py +591 -0
  230. synth_ai/products/graph_evolve/converters/__init__.py +42 -0
  231. synth_ai/products/graph_evolve/converters/openai_sft.py +484 -0
  232. synth_ai/products/graph_evolve/examples/hotpotqa/config.toml +109 -0
  233. synth_ai/products/graph_evolve/run.py +222 -0
  234. synth_ai/sdk/__init__.py +119 -0
  235. synth_ai/sdk/api/__init__.py +1 -0
  236. synth_ai/sdk/api/models/supported.py +514 -0
  237. synth_ai/sdk/api/research_agent/__init__.py +86 -0
  238. synth_ai/sdk/api/research_agent/cli.py +428 -0
  239. synth_ai/sdk/api/research_agent/config.py +357 -0
  240. synth_ai/sdk/api/research_agent/job.py +717 -0
  241. synth_ai/sdk/api/train/__init__.py +85 -0
  242. synth_ai/sdk/api/train/builders.py +895 -0
  243. synth_ai/sdk/api/train/cli.py +2188 -0
  244. synth_ai/sdk/api/train/config_finder.py +267 -0
  245. synth_ai/sdk/api/train/configs/__init__.py +65 -0
  246. synth_ai/sdk/api/train/configs/prompt_learning.py +1706 -0
  247. synth_ai/sdk/api/train/configs/rl.py +188 -0
  248. synth_ai/sdk/api/train/configs/sft.py +99 -0
  249. synth_ai/sdk/api/train/configs/shared.py +81 -0
  250. synth_ai/sdk/api/train/context_learning.py +312 -0
  251. synth_ai/sdk/api/train/env_resolver.py +418 -0
  252. synth_ai/sdk/api/train/graph_validators.py +216 -0
  253. synth_ai/sdk/api/train/graphgen.py +984 -0
  254. synth_ai/sdk/api/train/graphgen_models.py +823 -0
  255. synth_ai/sdk/api/train/graphgen_validators.py +109 -0
  256. synth_ai/sdk/api/train/pollers.py +124 -0
  257. synth_ai/sdk/api/train/progress/__init__.py +97 -0
  258. synth_ai/sdk/api/train/progress/dataclasses.py +569 -0
  259. synth_ai/sdk/api/train/progress/events.py +326 -0
  260. synth_ai/sdk/api/train/progress/results.py +428 -0
  261. synth_ai/sdk/api/train/progress/tracker.py +641 -0
  262. synth_ai/sdk/api/train/prompt_learning.py +470 -0
  263. synth_ai/sdk/api/train/rl.py +442 -0
  264. synth_ai/sdk/api/train/sft.py +396 -0
  265. synth_ai/sdk/api/train/summary.py +522 -0
  266. synth_ai/sdk/api/train/supported_algos.py +147 -0
  267. synth_ai/sdk/api/train/task_app.py +331 -0
  268. synth_ai/sdk/api/train/utils.py +279 -0
  269. synth_ai/sdk/api/train/validators.py +2424 -0
  270. synth_ai/sdk/baseline/__init__.py +25 -0
  271. synth_ai/sdk/baseline/config.py +209 -0
  272. synth_ai/sdk/baseline/discovery.py +216 -0
  273. synth_ai/sdk/baseline/execution.py +154 -0
  274. synth_ai/sdk/graphs/__init__.py +15 -0
  275. synth_ai/sdk/graphs/completions.py +570 -0
  276. synth_ai/sdk/inference/__init__.py +6 -0
  277. synth_ai/sdk/inference/client.py +128 -0
  278. synth_ai/sdk/jobs/__init__.py +16 -0
  279. synth_ai/sdk/jobs/client.py +371 -0
  280. synth_ai/sdk/judging/__init__.py +15 -0
  281. synth_ai/sdk/judging/base.py +24 -0
  282. synth_ai/sdk/judging/client.py +191 -0
  283. synth_ai/sdk/judging/schemas.py +222 -0
  284. synth_ai/sdk/judging/types.py +42 -0
  285. synth_ai/sdk/learning/__init__.py +69 -0
  286. synth_ai/sdk/learning/client.py +240 -0
  287. synth_ai/sdk/learning/ft_client.py +7 -0
  288. synth_ai/sdk/learning/health.py +49 -0
  289. synth_ai/sdk/learning/jobs.py +202 -0
  290. synth_ai/sdk/learning/prompt_extraction.py +334 -0
  291. synth_ai/sdk/learning/prompt_learning_client.py +455 -0
  292. synth_ai/sdk/learning/prompt_learning_types.py +185 -0
  293. synth_ai/sdk/learning/rl/client.py +268 -0
  294. synth_ai/sdk/learning/rl/contracts.py +27 -0
  295. synth_ai/sdk/learning/rl/env_keys.py +166 -0
  296. synth_ai/sdk/learning/rl/secrets.py +13 -0
  297. synth_ai/sdk/learning/sft/client.py +95 -0
  298. synth_ai/sdk/learning/sft/config.py +270 -0
  299. synth_ai/sdk/learning/sft/data.py +698 -0
  300. synth_ai/sdk/learning/validators.py +52 -0
  301. synth_ai/sdk/research_agent/__init__.py +34 -0
  302. synth_ai/sdk/research_agent/container_builder.py +328 -0
  303. synth_ai/sdk/research_agent/container_spec.py +198 -0
  304. synth_ai/sdk/research_agent/defaults.py +34 -0
  305. synth_ai/sdk/research_agent/results_collector.py +69 -0
  306. synth_ai/sdk/specs/__init__.py +46 -0
  307. synth_ai/sdk/specs/dataclasses.py +149 -0
  308. synth_ai/sdk/specs/loader.py +144 -0
  309. synth_ai/sdk/specs/serializer.py +199 -0
  310. synth_ai/sdk/specs/validation.py +250 -0
  311. synth_ai/sdk/streaming/__init__.py +35 -0
  312. synth_ai/sdk/streaming/config.py +94 -0
  313. synth_ai/sdk/streaming/handlers.py +1997 -0
  314. synth_ai/sdk/streaming/streamer.py +704 -0
  315. synth_ai/sdk/streaming/types.py +112 -0
  316. synth_ai/sdk/task/__init__.py +151 -0
  317. synth_ai/sdk/task/apps/__init__.py +133 -0
  318. synth_ai/sdk/task/config.py +261 -0
  319. synth_ai/sdk/task/contracts.py +298 -0
  320. synth_ai/sdk/task/datasets.py +108 -0
  321. synth_ai/sdk/task/in_process.py +1190 -0
  322. synth_ai/sdk/task/in_process_runner.py +309 -0
  323. synth_ai/sdk/task/inference_api.py +299 -0
  324. synth_ai/sdk/task/proxy.py +287 -0
  325. synth_ai/sdk/task/rubrics/__init__.py +55 -0
  326. synth_ai/sdk/task/rubrics/loaders.py +156 -0
  327. synth_ai/sdk/task/rubrics/models.py +57 -0
  328. synth_ai/sdk/task/rubrics/scoring.py +116 -0
  329. synth_ai/sdk/task/rubrics/strict.py +149 -0
  330. synth_ai/sdk/task/server.py +580 -0
  331. synth_ai/sdk/task/trace_correlation_helpers.py +506 -0
  332. synth_ai/sdk/task/tracing_utils.py +95 -0
  333. synth_ai/sdk/task/validators.py +456 -0
  334. synth_ai/sdk/tracing/__init__.py +39 -0
  335. synth_ai/sdk/training/__init__.py +102 -0
  336. synth_ai/sdk/usage/__init__.py +37 -0
  337. synth_ai/sdk/usage/client.py +171 -0
  338. synth_ai/sdk/usage/models.py +261 -0
  339. synth_ai/utils/__init__.py +213 -0
  340. synth_ai-0.4.1.dist-info/METADATA +195 -0
  341. synth_ai-0.4.1.dist-info/RECORD +379 -0
  342. synth_ai-0.4.1.dist-info/entry_points.txt +2 -0
  343. synth_ai-0.4.1.dist-info/top_level.txt +1 -0
  344. examples/__init__.py +0 -16
  345. examples/analyze_semantic_words.sh +0 -17
  346. examples/crafter_debug_render.py +0 -186
  347. examples/qwen_coder/README.md +0 -102
  348. examples/qwen_coder/_shared.py +0 -113
  349. examples/qwen_coder/configs/coder_lora_30b.toml +0 -61
  350. examples/qwen_coder/configs/coder_lora_4b.toml +0 -57
  351. examples/qwen_coder/configs/coder_lora_small.toml +0 -58
  352. examples/qwen_coder/generate_dataset.py +0 -98
  353. examples/qwen_coder/infer_ft_smoke.py +0 -64
  354. examples/qwen_coder/infer_prod_proxy.py +0 -73
  355. examples/qwen_coder/infer_via_synth.py +0 -87
  356. examples/qwen_coder/scripts/infer_coder.sh +0 -18
  357. examples/qwen_coder/scripts/train_coder_30b.sh +0 -21
  358. examples/qwen_coder/sft_full_17b.py +0 -103
  359. examples/qwen_coder/sft_lora_30b.py +0 -110
  360. examples/qwen_coder/subset_jsonl.py +0 -38
  361. examples/qwen_coder/validate_jsonl.py +0 -59
  362. examples/rl/README.md +0 -169
  363. examples/rl/configs/eval_base_qwen.toml +0 -15
  364. examples/rl/configs/eval_rl_qwen.toml +0 -11
  365. examples/rl/configs/rl_from_base_qwen.toml +0 -35
  366. examples/rl/configs/rl_from_base_qwen17.toml +0 -74
  367. examples/rl/configs/rl_from_ft_qwen.toml +0 -35
  368. examples/rl/download_dataset.py +0 -80
  369. examples/rl/run_eval.py +0 -436
  370. examples/rl/run_rl_and_save.py +0 -111
  371. examples/rl/task_app/README.md +0 -22
  372. examples/rl/task_app/math_single_step.py +0 -991
  373. examples/rl/task_app/math_task_app.py +0 -115
  374. examples/run_crafter_demo.sh +0 -10
  375. examples/sft/README.md +0 -139
  376. examples/sft/configs/crafter_fft_qwen0p6b.toml +0 -44
  377. examples/sft/configs/crafter_lora_qwen0p6b.toml +0 -45
  378. examples/sft/evaluate.py +0 -117
  379. examples/sft/export_dataset.py +0 -117
  380. examples/sft/generate_traces.py +0 -162
  381. examples/swe/__init__.py +0 -12
  382. examples/swe/task_app/README.md +0 -105
  383. examples/swe/task_app/__init__.py +0 -2
  384. examples/swe/task_app/grpo_swe_mini.py +0 -571
  385. examples/swe/task_app/grpo_swe_mini_task_app.py +0 -136
  386. examples/swe/task_app/hosted/README.md +0 -173
  387. examples/swe/task_app/hosted/__init__.py +0 -5
  388. examples/swe/task_app/hosted/branching.py +0 -143
  389. examples/swe/task_app/hosted/environment_routes.py +0 -1289
  390. examples/swe/task_app/hosted/envs/__init__.py +0 -1
  391. examples/swe/task_app/hosted/envs/crafter/__init__.py +0 -6
  392. examples/swe/task_app/hosted/envs/crafter/app.py +0 -1
  393. examples/swe/task_app/hosted/envs/crafter/environment.py +0 -522
  394. examples/swe/task_app/hosted/envs/crafter/policy.py +0 -478
  395. examples/swe/task_app/hosted/envs/crafter/react_agent.py +0 -108
  396. examples/swe/task_app/hosted/envs/crafter/shared.py +0 -305
  397. examples/swe/task_app/hosted/envs/crafter/tools.py +0 -47
  398. examples/swe/task_app/hosted/envs/mini_swe/__init__.py +0 -8
  399. examples/swe/task_app/hosted/envs/mini_swe/environment.py +0 -1164
  400. examples/swe/task_app/hosted/envs/mini_swe/policy.py +0 -355
  401. examples/swe/task_app/hosted/envs/mini_swe/shared.py +0 -83
  402. examples/swe/task_app/hosted/envs/mini_swe/tools.py +0 -96
  403. examples/swe/task_app/hosted/hosted_app.py +0 -204
  404. examples/swe/task_app/hosted/inference/__init__.py +0 -5
  405. examples/swe/task_app/hosted/inference/openai_client.py +0 -618
  406. examples/swe/task_app/hosted/main.py +0 -100
  407. examples/swe/task_app/hosted/policy_routes.py +0 -1079
  408. examples/swe/task_app/hosted/registry.py +0 -195
  409. examples/swe/task_app/hosted/rollout.py +0 -1869
  410. examples/swe/task_app/hosted/storage/__init__.py +0 -5
  411. examples/swe/task_app/hosted/storage/volume.py +0 -211
  412. examples/swe/task_app/hosted/test_agents.py +0 -161
  413. examples/swe/task_app/hosted/test_service.py +0 -137
  414. examples/swe/task_app/hosted/utils.py +0 -62
  415. examples/vlm/README.md +0 -68
  416. examples/vlm/configs/crafter_vlm_gpt4o.toml +0 -44
  417. examples/vlm/crafter_image_only_agent.py +0 -207
  418. examples/vlm/crafter_openai_vlm_agent.py +0 -277
  419. examples/vlm/filter_image_rows.py +0 -63
  420. examples/vlm/run_crafter_vlm_benchmark.py +0 -316
  421. examples/warming_up_to_rl/analyze_trace_db.py +0 -422
  422. examples/warming_up_to_rl/configs/crafter_fft.toml +0 -48
  423. examples/warming_up_to_rl/configs/crafter_fft_4b.toml +0 -54
  424. examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml +0 -20
  425. examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml +0 -13
  426. examples/warming_up_to_rl/configs/eval_modal_qwen4b.toml +0 -23
  427. examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +0 -83
  428. examples/warming_up_to_rl/configs/rl_from_ft.toml +0 -56
  429. examples/warming_up_to_rl/export_trace_sft.py +0 -723
  430. examples/warming_up_to_rl/groq_test.py +0 -95
  431. examples/warming_up_to_rl/manage_secrets.py +0 -131
  432. examples/warming_up_to_rl/readme.md +0 -179
  433. examples/warming_up_to_rl/run_eval.py +0 -510
  434. examples/warming_up_to_rl/run_fft_and_save.py +0 -380
  435. examples/warming_up_to_rl/run_local_rollout.py +0 -237
  436. examples/warming_up_to_rl/run_local_rollout_modal.py +0 -246
  437. examples/warming_up_to_rl/run_local_rollout_parallel.py +0 -403
  438. examples/warming_up_to_rl/run_local_rollout_traced.py +0 -475
  439. examples/warming_up_to_rl/run_rl_and_save.py +0 -124
  440. examples/warming_up_to_rl/run_rollout_remote.py +0 -154
  441. examples/warming_up_to_rl/task_app/README.md +0 -42
  442. examples/warming_up_to_rl/task_app/grpo_crafter.py +0 -700
  443. examples/warming_up_to_rl/task_app/grpo_crafter_task_app.py +0 -146
  444. examples/warming_up_to_rl/task_app/synth_envs_hosted/README.md +0 -173
  445. examples/warming_up_to_rl/task_app/synth_envs_hosted/__init__.py +0 -5
  446. examples/warming_up_to_rl/task_app/synth_envs_hosted/branching.py +0 -143
  447. examples/warming_up_to_rl/task_app/synth_envs_hosted/environment_routes.py +0 -1226
  448. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/__init__.py +0 -1
  449. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/__init__.py +0 -6
  450. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/app.py +0 -1
  451. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/environment.py +0 -522
  452. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/policy.py +0 -478
  453. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/react_agent.py +0 -108
  454. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/shared.py +0 -305
  455. examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/tools.py +0 -47
  456. examples/warming_up_to_rl/task_app/synth_envs_hosted/hosted_app.py +0 -204
  457. examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/__init__.py +0 -5
  458. examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py +0 -618
  459. examples/warming_up_to_rl/task_app/synth_envs_hosted/main.py +0 -100
  460. examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py +0 -1083
  461. examples/warming_up_to_rl/task_app/synth_envs_hosted/registry.py +0 -195
  462. examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py +0 -1869
  463. examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/__init__.py +0 -5
  464. examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/volume.py +0 -211
  465. examples/warming_up_to_rl/task_app/synth_envs_hosted/test_agents.py +0 -161
  466. examples/warming_up_to_rl/task_app/synth_envs_hosted/test_service.py +0 -137
  467. examples/warming_up_to_rl/task_app/synth_envs_hosted/utils.py +0 -62
  468. synth/__init__.py +0 -14
  469. synth_ai/api/models/supported.py +0 -376
  470. synth_ai/api/train/__init__.py +0 -5
  471. synth_ai/api/train/builders.py +0 -296
  472. synth_ai/api/train/cli.py +0 -606
  473. synth_ai/api/train/config_finder.py +0 -228
  474. synth_ai/api/train/env_resolver.py +0 -347
  475. synth_ai/api/train/pollers.py +0 -75
  476. synth_ai/api/train/supported_algos.py +0 -139
  477. synth_ai/api/train/task_app.py +0 -195
  478. synth_ai/api/train/utils.py +0 -217
  479. synth_ai/cli/_modal_wrapper.py +0 -28
  480. synth_ai/cli/_typer_patch.py +0 -49
  481. synth_ai/cli/balance.py +0 -203
  482. synth_ai/cli/calc.py +0 -69
  483. synth_ai/cli/demo.py +0 -159
  484. synth_ai/cli/legacy_root_backup.py +0 -470
  485. synth_ai/cli/man.py +0 -106
  486. synth_ai/cli/recent.py +0 -127
  487. synth_ai/cli/rl_demo.py +0 -274
  488. synth_ai/cli/status.py +0 -133
  489. synth_ai/cli/task_apps.py +0 -2782
  490. synth_ai/cli/traces.py +0 -163
  491. synth_ai/cli/watch.py +0 -505
  492. synth_ai/config/base_url.py +0 -107
  493. synth_ai/core/experiment.py +0 -13
  494. synth_ai/core/system.py +0 -15
  495. synth_ai/demo_registry.py +0 -295
  496. synth_ai/demos/core/__init__.py +0 -1
  497. synth_ai/demos/core/cli.py +0 -1756
  498. synth_ai/demos/demo_task_apps/core.py +0 -440
  499. synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +0 -172
  500. synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
  501. synth_ai/demos/demo_task_apps/math/modal_task_app.py +0 -739
  502. synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -37
  503. synth_ai/environments/__init__.py +0 -31
  504. synth_ai/environments/environment/__init__.py +0 -1
  505. synth_ai/environments/environment/artifacts/__init__.py +0 -1
  506. synth_ai/environments/environment/artifacts/base.py +0 -52
  507. synth_ai/environments/environment/core.py +0 -67
  508. synth_ai/environments/environment/db/__init__.py +0 -1
  509. synth_ai/environments/environment/db/sqlite.py +0 -45
  510. synth_ai/environments/environment/registry.py +0 -233
  511. synth_ai/environments/environment/resources/sqlite.py +0 -45
  512. synth_ai/environments/environment/results.py +0 -1
  513. synth_ai/environments/environment/rewards/__init__.py +0 -1
  514. synth_ai/environments/environment/rewards/core.py +0 -29
  515. synth_ai/environments/environment/shared_engine.py +0 -26
  516. synth_ai/environments/environment/tools/__init__.py +0 -200
  517. synth_ai/environments/examples/__init__.py +0 -1
  518. synth_ai/environments/examples/bandit/__init__.py +0 -33
  519. synth_ai/environments/examples/bandit/engine.py +0 -302
  520. synth_ai/environments/examples/bandit/environment.py +0 -194
  521. synth_ai/environments/examples/bandit/taskset.py +0 -200
  522. synth_ai/environments/examples/crafter_classic/__init__.py +0 -8
  523. synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -250
  524. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -59
  525. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -152
  526. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -24
  527. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -1194
  528. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -56
  529. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -32
  530. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -384
  531. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -53
  532. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -178
  533. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -222
  534. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -183
  535. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -210
  536. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -206
  537. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -49
  538. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -64
  539. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -88
  540. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -77
  541. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -324
  542. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -362
  543. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -49
  544. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -332
  545. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -97
  546. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -217
  547. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -87
  548. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -88
  549. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -195
  550. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -400
  551. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -195
  552. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -56
  553. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -858
  554. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -52
  555. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -874
  556. synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -1412
  557. synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -216
  558. synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -296
  559. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -58
  560. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -464
  561. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -152
  562. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -51
  563. synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -1412
  564. synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -112
  565. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -203
  566. synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -305
  567. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -126
  568. synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -94
  569. synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -142
  570. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -26
  571. synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -984
  572. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -724
  573. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -386
  574. synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -205
  575. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -150
  576. synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -283
  577. synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -280
  578. synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -456
  579. synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -166
  580. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -102
  581. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -128
  582. synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -655
  583. synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -202
  584. synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -166
  585. synth_ai/environments/examples/crafter_classic/config_logging.py +0 -111
  586. synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
  587. synth_ai/environments/examples/crafter_classic/engine.py +0 -579
  588. synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -64
  589. synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -6
  590. synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -75
  591. synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -267
  592. synth_ai/environments/examples/crafter_classic/environment.py +0 -479
  593. synth_ai/environments/examples/crafter_classic/taskset.py +0 -233
  594. synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -228
  595. synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -299
  596. synth_ai/environments/examples/crafter_custom/__init__.py +0 -4
  597. synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -1
  598. synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -202
  599. synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -7
  600. synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -182
  601. synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -8
  602. synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -269
  603. synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -262
  604. synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -417
  605. synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -187
  606. synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -118
  607. synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -373
  608. synth_ai/environments/examples/crafter_custom/environment.py +0 -312
  609. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -159
  610. synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -158
  611. synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -71
  612. synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -105
  613. synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -119
  614. synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -52
  615. synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -305
  616. synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -156
  617. synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -281
  618. synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -25
  619. synth_ai/environments/examples/enron/engine.py +0 -295
  620. synth_ai/environments/examples/enron/environment.py +0 -166
  621. synth_ai/environments/examples/enron/taskset.py +0 -112
  622. synth_ai/environments/examples/enron/units/keyword_stats.py +0 -112
  623. synth_ai/environments/examples/minigrid/__init__.py +0 -48
  624. synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -1188
  625. synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -48
  626. synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -562
  627. synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -221
  628. synth_ai/environments/examples/minigrid/engine.py +0 -589
  629. synth_ai/environments/examples/minigrid/environment.py +0 -274
  630. synth_ai/environments/examples/minigrid/environment_mapping.py +0 -242
  631. synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -417
  632. synth_ai/environments/examples/minigrid/taskset.py +0 -583
  633. synth_ai/environments/examples/nethack/__init__.py +0 -7
  634. synth_ai/environments/examples/nethack/achievements.py +0 -337
  635. synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -981
  636. synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -74
  637. synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -831
  638. synth_ai/environments/examples/nethack/engine.py +0 -739
  639. synth_ai/environments/examples/nethack/environment.py +0 -256
  640. synth_ai/environments/examples/nethack/helpers/__init__.py +0 -41
  641. synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -301
  642. synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -402
  643. synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -433
  644. synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -200
  645. synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -269
  646. synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -308
  647. synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -431
  648. synth_ai/environments/examples/nethack/taskset.py +0 -323
  649. synth_ai/environments/examples/red/__init__.py +0 -7
  650. synth_ai/environments/examples/red/agent_demos/__init__.py +0 -1
  651. synth_ai/environments/examples/red/config_logging.py +0 -110
  652. synth_ai/environments/examples/red/engine.py +0 -694
  653. synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -1
  654. synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -28
  655. synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -276
  656. synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -142
  657. synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -57
  658. synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -284
  659. synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -150
  660. synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -138
  661. synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -57
  662. synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -331
  663. synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -121
  664. synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -559
  665. synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -313
  666. synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -148
  667. synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -247
  668. synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -368
  669. synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -140
  670. synth_ai/environments/examples/red/environment.py +0 -238
  671. synth_ai/environments/examples/red/taskset.py +0 -79
  672. synth_ai/environments/examples/red/units/__init__.py +0 -1
  673. synth_ai/environments/examples/sokoban/__init__.py +0 -1
  674. synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -899
  675. synth_ai/environments/examples/sokoban/engine.py +0 -678
  676. synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -1
  677. synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -657
  678. synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -18
  679. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -3
  680. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -131
  681. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -370
  682. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -332
  683. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -306
  684. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -67
  685. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -115
  686. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -123
  687. synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -394
  688. synth_ai/environments/examples/sokoban/environment.py +0 -229
  689. synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -440
  690. synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -312
  691. synth_ai/environments/examples/sokoban/taskset.py +0 -428
  692. synth_ai/environments/examples/tictactoe/__init__.py +0 -1
  693. synth_ai/environments/examples/tictactoe/engine.py +0 -368
  694. synth_ai/environments/examples/tictactoe/environment.py +0 -240
  695. synth_ai/environments/examples/tictactoe/taskset.py +0 -215
  696. synth_ai/environments/examples/verilog/__init__.py +0 -10
  697. synth_ai/environments/examples/verilog/engine.py +0 -329
  698. synth_ai/environments/examples/verilog/environment.py +0 -350
  699. synth_ai/environments/examples/verilog/taskset.py +0 -420
  700. synth_ai/environments/examples/wordle/__init__.py +0 -29
  701. synth_ai/environments/examples/wordle/engine.py +0 -398
  702. synth_ai/environments/examples/wordle/environment.py +0 -159
  703. synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -75
  704. synth_ai/environments/examples/wordle/taskset.py +0 -230
  705. synth_ai/environments/reproducibility/core.py +0 -42
  706. synth_ai/environments/reproducibility/helpers.py +0 -0
  707. synth_ai/environments/reproducibility/tree.py +0 -363
  708. synth_ai/environments/service/app.py +0 -97
  709. synth_ai/environments/service/core_routes.py +0 -1021
  710. synth_ai/environments/service/external_registry.py +0 -56
  711. synth_ai/environments/service/registry.py +0 -9
  712. synth_ai/environments/stateful/__init__.py +0 -1
  713. synth_ai/environments/stateful/core.py +0 -163
  714. synth_ai/environments/stateful/engine.py +0 -21
  715. synth_ai/environments/stateful/state.py +0 -7
  716. synth_ai/environments/tasks/api.py +0 -19
  717. synth_ai/environments/tasks/core.py +0 -81
  718. synth_ai/environments/tasks/filters.py +0 -40
  719. synth_ai/environments/tasks/utils.py +0 -90
  720. synth_ai/environments/v0_observability/history.py +0 -3
  721. synth_ai/environments/v0_observability/log.py +0 -2
  722. synth_ai/evals/base.py +0 -13
  723. synth_ai/handshake.py +0 -109
  724. synth_ai/http.py +0 -26
  725. synth_ai/http_client.py +0 -136
  726. synth_ai/inference/__init__.py +0 -5
  727. synth_ai/inference/client.py +0 -34
  728. synth_ai/jobs/client.py +0 -271
  729. synth_ai/learning/__init__.py +0 -59
  730. synth_ai/learning/client.py +0 -241
  731. synth_ai/learning/ft_client.py +0 -7
  732. synth_ai/learning/health.py +0 -49
  733. synth_ai/learning/jobs.py +0 -201
  734. synth_ai/learning/rl/client.py +0 -267
  735. synth_ai/learning/rl/contracts.py +0 -27
  736. synth_ai/learning/rl/env_keys.py +0 -166
  737. synth_ai/learning/rl/secrets.py +0 -13
  738. synth_ai/learning/sft/client.py +0 -68
  739. synth_ai/learning/sft/config.py +0 -270
  740. synth_ai/learning/sft/data.py +0 -295
  741. synth_ai/learning/validators.py +0 -49
  742. synth_ai/lm/__init__.py +0 -25
  743. synth_ai/main.py +0 -6
  744. synth_ai/task/__init__.py +0 -102
  745. synth_ai/task/apps/__init__.py +0 -128
  746. synth_ai/task/contracts.py +0 -137
  747. synth_ai/task/datasets.py +0 -108
  748. synth_ai/task/proxy.py +0 -259
  749. synth_ai/task/server.py +0 -424
  750. synth_ai/task/tracing_utils.py +0 -84
  751. synth_ai/task/validators.py +0 -11
  752. synth_ai/tracing_v3/__init__.py +0 -97
  753. synth_ai/tracing_v3/config.py +0 -84
  754. synth_ai/tracing_v3/db_config.py +0 -194
  755. synth_ai/tracing_v3/decorators.py +0 -369
  756. synth_ai/tracing_v3/examples/basic_usage.py +0 -189
  757. synth_ai/tracing_v3/llm_call_record_helpers.py +0 -337
  758. synth_ai/tracing_v3/migration_helper.py +0 -120
  759. synth_ai/tracing_v3/replica_sync.py +0 -258
  760. synth_ai/tracing_v3/session_tracer.py +0 -530
  761. synth_ai/tracing_v3/storage/base.py +0 -210
  762. synth_ai/tracing_v3/storage/config.py +0 -75
  763. synth_ai/tracing_v3/storage/factory.py +0 -39
  764. synth_ai/tracing_v3/storage/utils.py +0 -204
  765. synth_ai/tracing_v3/turso/daemon.py +0 -149
  766. synth_ai/tracing_v3/turso/models.py +0 -469
  767. synth_ai/tracing_v3/turso/native_manager.py +0 -1173
  768. synth_ai/tracing_v3/utils.py +0 -108
  769. synth_ai/v0/api/__init__.py +0 -8
  770. synth_ai/v0/api/models/__init__.py +0 -8
  771. synth_ai/v0/api/models/supported.py +0 -8
  772. synth_ai/v0/config/__init__.py +0 -15
  773. synth_ai/v0/config/base_url.py +0 -12
  774. synth_ai/v0/lm/__init__.py +0 -51
  775. synth_ai/v0/lm/caching/constants.py +0 -6
  776. synth_ai/v0/lm/caching/dbs.py +0 -0
  777. synth_ai/v0/lm/caching/ephemeral.py +0 -100
  778. synth_ai/v0/lm/caching/handler.py +0 -137
  779. synth_ai/v0/lm/caching/initialize.py +0 -11
  780. synth_ai/v0/lm/caching/persistent.py +0 -114
  781. synth_ai/v0/lm/config.py +0 -115
  782. synth_ai/v0/lm/constants.py +0 -32
  783. synth_ai/v0/lm/core/__init__.py +0 -8
  784. synth_ai/v0/lm/core/all.py +0 -73
  785. synth_ai/v0/lm/core/exceptions.py +0 -5
  786. synth_ai/v0/lm/core/main.py +0 -331
  787. synth_ai/v0/lm/core/main_v3.py +0 -594
  788. synth_ai/v0/lm/core/synth_models.py +0 -35
  789. synth_ai/v0/lm/core/vendor_clients.py +0 -190
  790. synth_ai/v0/lm/cost/__init__.py +0 -0
  791. synth_ai/v0/lm/cost/monitor.py +0 -1
  792. synth_ai/v0/lm/cost/statefulness.py +0 -1
  793. synth_ai/v0/lm/injection.py +0 -80
  794. synth_ai/v0/lm/overrides.py +0 -206
  795. synth_ai/v0/lm/provider_support/__init__.py +0 -8
  796. synth_ai/v0/lm/provider_support/anthropic.py +0 -972
  797. synth_ai/v0/lm/provider_support/openai.py +0 -1139
  798. synth_ai/v0/lm/provider_support/suppress_logging.py +0 -31
  799. synth_ai/v0/lm/structured_outputs/__init__.py +0 -0
  800. synth_ai/v0/lm/structured_outputs/handler.py +0 -440
  801. synth_ai/v0/lm/structured_outputs/inject.py +0 -297
  802. synth_ai/v0/lm/structured_outputs/rehabilitate.py +0 -185
  803. synth_ai/v0/lm/tools/__init__.py +0 -3
  804. synth_ai/v0/lm/tools/base.py +0 -172
  805. synth_ai/v0/lm/unified_interface.py +0 -202
  806. synth_ai/v0/lm/vendors/__init__.py +0 -0
  807. synth_ai/v0/lm/vendors/base.py +0 -81
  808. synth_ai/v0/lm/vendors/core/__init__.py +0 -0
  809. synth_ai/v0/lm/vendors/core/anthropic_api.py +0 -387
  810. synth_ai/v0/lm/vendors/core/gemini_api.py +0 -292
  811. synth_ai/v0/lm/vendors/core/mistral_api.py +0 -322
  812. synth_ai/v0/lm/vendors/core/openai_api.py +0 -227
  813. synth_ai/v0/lm/vendors/core/synth_dev_api.py +0 -0
  814. synth_ai/v0/lm/vendors/local/__init__.py +0 -0
  815. synth_ai/v0/lm/vendors/local/ollama.py +0 -0
  816. synth_ai/v0/lm/vendors/openai_standard.py +0 -782
  817. synth_ai/v0/lm/vendors/openai_standard_responses.py +0 -259
  818. synth_ai/v0/lm/vendors/retries.py +0 -22
  819. synth_ai/v0/lm/vendors/supported/__init__.py +0 -0
  820. synth_ai/v0/lm/vendors/supported/custom_endpoint.py +0 -415
  821. synth_ai/v0/lm/vendors/supported/deepseek.py +0 -69
  822. synth_ai/v0/lm/vendors/supported/grok.py +0 -75
  823. synth_ai/v0/lm/vendors/supported/groq.py +0 -16
  824. synth_ai/v0/lm/vendors/supported/ollama.py +0 -15
  825. synth_ai/v0/lm/vendors/supported/openrouter.py +0 -74
  826. synth_ai/v0/lm/vendors/supported/together.py +0 -11
  827. synth_ai/v0/lm/vendors/synth_client.py +0 -835
  828. synth_ai/v0/lm/warmup.py +0 -186
  829. synth_ai/v0/tracing/__init__.py +0 -0
  830. synth_ai/v0/tracing/abstractions.py +0 -224
  831. synth_ai/v0/tracing/base_client.py +0 -91
  832. synth_ai/v0/tracing/client_manager.py +0 -131
  833. synth_ai/v0/tracing/config.py +0 -142
  834. synth_ai/v0/tracing/context.py +0 -146
  835. synth_ai/v0/tracing/decorators.py +0 -682
  836. synth_ai/v0/tracing/events/__init__.py +0 -0
  837. synth_ai/v0/tracing/events/manage.py +0 -147
  838. synth_ai/v0/tracing/events/scope.py +0 -86
  839. synth_ai/v0/tracing/events/store.py +0 -228
  840. synth_ai/v0/tracing/immediate_client.py +0 -151
  841. synth_ai/v0/tracing/local.py +0 -18
  842. synth_ai/v0/tracing/log_client_base.py +0 -73
  843. synth_ai/v0/tracing/retry_queue.py +0 -186
  844. synth_ai/v0/tracing/trackers.py +0 -515
  845. synth_ai/v0/tracing/upload.py +0 -409
  846. synth_ai/v0/tracing/utils.py +0 -9
  847. synth_ai/v0/tracing_v1/__init__.py +0 -16
  848. synth_ai/v0/tracing_v1/abstractions.py +0 -224
  849. synth_ai/v0/tracing_v1/base_client.py +0 -91
  850. synth_ai/v0/tracing_v1/client_manager.py +0 -131
  851. synth_ai/v0/tracing_v1/config.py +0 -142
  852. synth_ai/v0/tracing_v1/context.py +0 -146
  853. synth_ai/v0/tracing_v1/decorators.py +0 -703
  854. synth_ai/v0/tracing_v1/events/__init__.py +0 -0
  855. synth_ai/v0/tracing_v1/events/manage.py +0 -147
  856. synth_ai/v0/tracing_v1/events/scope.py +0 -86
  857. synth_ai/v0/tracing_v1/events/store.py +0 -228
  858. synth_ai/v0/tracing_v1/immediate_client.py +0 -151
  859. synth_ai/v0/tracing_v1/local.py +0 -18
  860. synth_ai/v0/tracing_v1/log_client_base.py +0 -73
  861. synth_ai/v0/tracing_v1/retry_queue.py +0 -186
  862. synth_ai/v0/tracing_v1/trackers.py +0 -515
  863. synth_ai/v0/tracing_v1/upload.py +0 -527
  864. synth_ai/v0/tracing_v1/utils.py +0 -9
  865. synth_ai/v0/tracing_v3/__init__.py +0 -10
  866. synth_ai/v0/tracing_v3/abstractions.py +0 -3
  867. synth_ai/v0/tracing_v3/decorators.py +0 -3
  868. synth_ai/v0/tracing_v3/llm_call_record_helpers.py +0 -3
  869. synth_ai/v0/tracing_v3/session_tracer.py +0 -3
  870. synth_ai-0.2.9.dev11.dist-info/METADATA +0 -191
  871. synth_ai-0.2.9.dev11.dist-info/RECORD +0 -571
  872. synth_ai-0.2.9.dev11.dist-info/entry_points.txt +0 -3
  873. synth_ai-0.2.9.dev11.dist-info/top_level.txt +0 -3
  874. /synth_ai/{demos/demo_task_apps → cli/demo_apps}/crafter/__init__.py +0 -0
  875. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/__init__.py +0 -0
  876. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/crafter/configs/crafter_fft_4b.toml +0 -0
  877. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +0 -0
  878. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
  879. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/_common.py +0 -0
  880. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/app.py +0 -0
  881. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/config.toml +0 -0
  882. /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/deploy_modal.py +0 -0
  883. /synth_ai/{v0/lm/caching → core/apps}/__init__.py +0 -0
  884. /synth_ai/{tracing_v3 → core/tracing_v3}/abstractions.py +0 -0
  885. /synth_ai/{tracing_v3 → core/tracing_v3}/hooks.py +0 -0
  886. /synth_ai/{tracing_v3 → core/tracing_v3}/lm_call_record_abstractions.py +0 -0
  887. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/__init__.py +0 -0
  888. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/exceptions.py +0 -0
  889. /synth_ai/{tracing_v3 → core/tracing_v3}/storage/types.py +0 -0
  890. /synth_ai/{compound/cais.py → py.typed} +0 -0
  891. /synth_ai/{learning → sdk/learning}/algorithms.py +0 -0
  892. /synth_ai/{learning → sdk/learning}/config.py +0 -0
  893. /synth_ai/{learning → sdk/learning}/constants.py +0 -0
  894. /synth_ai/{learning → sdk/learning}/core.py +0 -0
  895. /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
  896. /synth_ai/{learning → sdk/learning}/rl/__init__.py +0 -0
  897. /synth_ai/{learning → sdk/learning}/rl/config.py +0 -0
  898. /synth_ai/{learning → sdk/learning}/rl_client.py +0 -0
  899. /synth_ai/{learning → sdk/learning}/sft/__init__.py +0 -0
  900. /synth_ai/{learning → sdk/learning}/sse.py +0 -0
  901. /synth_ai/{task → sdk/task}/auth.py +0 -0
  902. /synth_ai/{task → sdk/task}/client.py +0 -0
  903. /synth_ai/{task → sdk/task}/errors.py +0 -0
  904. /synth_ai/{task → sdk/task}/health.py +0 -0
  905. /synth_ai/{task → sdk/task}/json.py +0 -0
  906. /synth_ai/{task → sdk/task}/rubrics.py +0 -0
  907. /synth_ai/{task → sdk/task}/vendors.py +0 -0
  908. {synth_ai-0.2.9.dev11.dist-info → synth_ai-0.4.1.dist-info}/WHEEL +0 -0
  909. {synth_ai-0.2.9.dev11.dist-info → synth_ai-0.4.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,782 +0,0 @@
1
- import asyncio
2
- import os
3
- import time
4
- from typing import Any
5
-
6
- import backoff
7
- import groq
8
- import openai
9
- import pydantic_core
10
- from pydantic import BaseModel
11
-
12
- from synth_ai.v0.lm.caching.initialize import (
13
- get_cache_handler,
14
- )
15
- from synth_ai.v0.lm.constants import SPECIAL_BASE_TEMPS
16
- from synth_ai.v0.lm.injection import apply_injection
17
- from synth_ai.v0.lm.overrides import (
18
- apply_param_overrides,
19
- apply_tool_overrides,
20
- use_overrides_for_messages,
21
- )
22
- from synth_ai.v0.lm.tools.base import BaseTool
23
- from synth_ai.v0.lm.vendors.base import BaseLMResponse, VendorBase
24
- from synth_ai.v0.lm.vendors.openai_standard_responses import OpenAIResponsesAPIMixin
25
- from synth_ai.v0.lm.vendors.retries import MAX_BACKOFF
26
-
27
- DEFAULT_EXCEPTIONS_TO_RETRY = (
28
- pydantic_core._pydantic_core.ValidationError,
29
- openai.APIConnectionError,
30
- openai.APITimeoutError,
31
- groq.InternalServerError,
32
- groq.APITimeoutError,
33
- groq.APIConnectionError,
34
- )
35
-
36
-
37
- def special_orion_transform(model: str, messages: list[dict[str, Any]]) -> list[dict[str, Any]]:
38
- """
39
- Transform messages for O1 series models which don't support system messages.
40
-
41
- Args:
42
- model: Model name to check
43
- messages: Original messages list
44
-
45
- Returns:
46
- Transformed messages list with system content merged into user message
47
- """
48
- if "o1-" in model:
49
- messages = [
50
- {
51
- "role": "user",
52
- "content": f"<instructions>{messages[0]['content']}</instructions><information>{messages[1]}</information>",
53
- }
54
- ]
55
- return messages
56
-
57
-
58
- def _silent_backoff_handler(_details):
59
- """No-op handler to keep stdout clean while still allowing visibility via logging if desired."""
60
- pass
61
-
62
-
63
- class OpenAIStandard(VendorBase, OpenAIResponsesAPIMixin):
64
- """
65
- Standard OpenAI-compatible vendor implementation.
66
-
67
- This class provides a standard implementation for OpenAI-compatible APIs,
68
- including proper retry logic, caching, and support for various model features.
69
-
70
- Attributes:
71
- used_for_structured_outputs: Whether this client supports structured outputs
72
- exceptions_to_retry: List of exceptions that trigger automatic retries
73
- sync_client: Synchronous API client
74
- async_client: Asynchronous API client
75
- """
76
-
77
- used_for_structured_outputs: bool = True
78
- exceptions_to_retry: list = DEFAULT_EXCEPTIONS_TO_RETRY
79
- sync_client: Any
80
- async_client: Any
81
-
82
- def __init__(
83
- self,
84
- sync_client: Any,
85
- async_client: Any,
86
- exceptions_to_retry: list[Exception] = DEFAULT_EXCEPTIONS_TO_RETRY,
87
- used_for_structured_outputs: bool = False,
88
- ):
89
- self.sync_client = sync_client
90
- self.async_client = async_client
91
- self.used_for_structured_outputs = used_for_structured_outputs
92
- self.exceptions_to_retry = exceptions_to_retry
93
-
94
- # Initialize Harmony support for OSS models
95
- self.harmony_available = False
96
- self.harmony_enc = None
97
- try:
98
- from openai_harmony import HarmonyEncodingName, load_harmony_encoding
99
-
100
- self.harmony_available = True
101
- self.harmony_enc = load_harmony_encoding(HarmonyEncodingName.HARMONY_GPT_OSS)
102
- except ImportError:
103
- pass
104
-
105
- @backoff.on_exception(
106
- backoff.expo,
107
- DEFAULT_EXCEPTIONS_TO_RETRY,
108
- max_time=MAX_BACKOFF,
109
- jitter=backoff.full_jitter,
110
- on_backoff=_silent_backoff_handler,
111
- )
112
- async def _hit_api_async(
113
- self,
114
- model: str,
115
- messages: list[dict[str, Any]],
116
- lm_config: dict[str, Any],
117
- use_ephemeral_cache_only: bool = False,
118
- reasoning_effort: str = "high",
119
- tools: list[BaseTool] | None = None,
120
- ) -> BaseLMResponse:
121
- assert lm_config.get("response_model") is None, (
122
- "response_model is not supported for standard calls"
123
- )
124
-
125
- debug = os.getenv("SYNTH_OPENAI_DEBUG") == "1"
126
- if debug:
127
- print("🔍 OPENAI DEBUG: _hit_api_async called with:")
128
- print(f" Model: {model}")
129
- print(f" Messages: {len(messages)} messages")
130
- print(f" Tools: {len(tools) if tools else 0} tools")
131
- print(f" LM config: {lm_config}")
132
-
133
- messages = special_orion_transform(model, messages)
134
- # Apply context-scoped overrides and prompt injection just before building API params
135
- with use_overrides_for_messages(messages):
136
- messages = apply_injection(messages)
137
- used_cache_handler = get_cache_handler(use_ephemeral_cache_only)
138
- lm_config["reasoning_effort"] = reasoning_effort
139
- cache_result = used_cache_handler.hit_managed_cache(
140
- model, messages, lm_config=lm_config, tools=tools
141
- )
142
- if cache_result and debug:
143
- print("🔍 OPENAI DEBUG: Cache hit! Returning cached result")
144
- print(f" Cache result type: {type(cache_result)}")
145
- print("🔍 OPENAI DEBUG: DISABLING CACHE FOR DEBUGGING - forcing API call")
146
- # return cache_result # Commented out intentionally when debug is on
147
-
148
- if debug:
149
- print("🔍 OPENAI DEBUG: Cache miss, making actual API call")
150
-
151
- # Common API call params
152
- api_params = {
153
- "model": model,
154
- "messages": messages,
155
- }
156
- with use_overrides_for_messages(messages):
157
- api_params = apply_param_overrides(api_params)
158
-
159
- # Add tools if provided
160
- if tools and all(isinstance(tool, BaseTool) for tool in tools):
161
- api_params["tools"] = [tool.to_openai_tool() for tool in tools]
162
- elif tools:
163
- api_params["tools"] = tools
164
-
165
- # Only add temperature for non o1/o3 models, and do not override if already set via overrides
166
- if (
167
- not any(prefix in model for prefix in ["o1-", "o3-"])
168
- and "temperature" not in api_params
169
- ):
170
- api_params["temperature"] = lm_config.get(
171
- "temperature", SPECIAL_BASE_TEMPS.get(model, 0)
172
- )
173
-
174
- # Forward additional sampling / control params if provided
175
- if lm_config.get("max_tokens") is not None:
176
- api_params["max_tokens"] = lm_config["max_tokens"]
177
- if lm_config.get("top_p") is not None:
178
- api_params["top_p"] = lm_config["top_p"]
179
- if lm_config.get("frequency_penalty") is not None:
180
- api_params["frequency_penalty"] = lm_config["frequency_penalty"]
181
- if lm_config.get("presence_penalty") is not None:
182
- api_params["presence_penalty"] = lm_config["presence_penalty"]
183
- if lm_config.get("stop") is not None:
184
- api_params["stop"] = lm_config["stop"]
185
- if lm_config.get("tool_choice") is not None:
186
- api_params["tool_choice"] = lm_config["tool_choice"]
187
- # Forward GPU preference to backend (body + header)
188
- if lm_config.get("gpu_preference") is not None:
189
- api_params["gpu_preference"] = lm_config["gpu_preference"]
190
- # Also set header so proxies that read headers can honor it
191
- hdrs = api_params.get("extra_headers", {})
192
- hdrs["X-GPU-Preference"] = lm_config["gpu_preference"]
193
- api_params["extra_headers"] = hdrs
194
- # Also mirror stop_after_tool_calls into a header for robustness
195
- try:
196
- satc_val = None
197
- if isinstance(lm_config.get("extra_body"), dict):
198
- satc_val = lm_config["extra_body"].get("stop_after_tool_calls")
199
- if satc_val is not None:
200
- hdrs = api_params.get("extra_headers", {})
201
- hdrs["X-Stop-After-Tool-Calls"] = str(satc_val)
202
- api_params["extra_headers"] = hdrs
203
- except Exception:
204
- pass
205
- # Apply overrides (tools and params) from context after building baseline params
206
- with use_overrides_for_messages(messages):
207
- api_params = apply_tool_overrides(api_params)
208
- api_params = apply_param_overrides(api_params)
209
-
210
- # Thinking controls: route via extra_body.chat_template_kwargs for compatibility
211
- thinking_mode_val = lm_config.get("thinking_mode")
212
- thinking_budget_val = lm_config.get("thinking_budget")
213
- if thinking_mode_val is not None or thinking_budget_val is not None:
214
- api_params["extra_body"] = api_params.get("extra_body", {})
215
- ctk = api_params["extra_body"].get("chat_template_kwargs", {})
216
- if thinking_mode_val is not None:
217
- ctk["thinking_mode"] = thinking_mode_val
218
- if thinking_budget_val is not None:
219
- try:
220
- ctk["thinking_budget"] = int(thinking_budget_val)
221
- except Exception:
222
- ctk["thinking_budget"] = thinking_budget_val
223
- api_params["extra_body"]["chat_template_kwargs"] = ctk
224
-
225
- # Backward-compatible: forward legacy enable_thinking only via extra_body for callers still using it
226
- if lm_config.get("enable_thinking") is not None:
227
- api_params["extra_body"] = api_params.get("extra_body", {})
228
- ctk = api_params["extra_body"].get("chat_template_kwargs", {})
229
- ctk["enable_thinking"] = lm_config["enable_thinking"]
230
- api_params["extra_body"]["chat_template_kwargs"] = ctk
231
- # Forward arbitrary extra_body from lm_config if provided (merge)
232
- if lm_config.get("extra_body") is not None:
233
- # Shallow-merge top-level keys; nested keys (like chat_template_kwargs) should be provided whole
234
- api_params["extra_body"] = {
235
- **api_params.get("extra_body", {}),
236
- **(lm_config.get("extra_body") or {}),
237
- }
238
- # Ensure legacy extra_body flag remains merged (do not override top-level fields)
239
- if lm_config.get("enable_thinking") is not None:
240
- api_params["extra_body"] = api_params.get("extra_body", {})
241
- ctk = api_params["extra_body"].get("chat_template_kwargs", {})
242
- ctk["enable_thinking"] = lm_config["enable_thinking"]
243
- api_params["extra_body"]["chat_template_kwargs"] = ctk
244
-
245
- # Add reasoning_effort only for o3-mini
246
- if model in ["o3-mini"]:
247
- print("Reasoning effort:", reasoning_effort)
248
- api_params["reasoning_effort"] = reasoning_effort
249
-
250
- # Filter Synth-only params when calling external OpenAI-compatible providers
251
- # External providers (e.g., OpenAI, Groq) reject unknown fields like
252
- # extra_body.chat_template_kwargs or stop_after_tool_calls.
253
- try:
254
- base_url_obj = getattr(self.async_client, "base_url", None)
255
- base_url_str = str(base_url_obj) if base_url_obj is not None else ""
256
- except Exception:
257
- base_url_str = ""
258
-
259
- is_external_provider = "openai.com" in base_url_str or "api.groq.com" in base_url_str
260
-
261
- if is_external_provider:
262
- # Remove extra_body entirely; this is Synth-specific plumbing
263
- if "extra_body" in api_params:
264
- api_params.pop("extra_body", None)
265
-
266
- # Also ensure we don't pass stray vendor-specific fields if present
267
- # (defensive in case upstream added them at top-level later)
268
- for k in ["chat_template_kwargs", "stop_after_tool_calls"]:
269
- api_params.pop(k, None)
270
-
271
- # GPT-5 models: parameter normalization
272
- if model.startswith("gpt-5"):
273
- # Require max_completion_tokens instead of max_tokens
274
- if "max_tokens" in api_params:
275
- api_params["max_completion_tokens"] = api_params.pop("max_tokens")
276
- # Only default temperature=1 supported; omit custom temperature
277
- if "temperature" in api_params:
278
- api_params.pop("temperature", None)
279
-
280
- # Call API with better auth error reporting
281
- # try:
282
- if debug:
283
- print("🔍 OPENAI DEBUG: Making request with params:")
284
- print(f" Model: {api_params.get('model')}")
285
- print(f" Messages: {len(api_params.get('messages', []))} messages")
286
- print(f" Tools: {len(api_params.get('tools', []))} tools")
287
- print(f" Max tokens: {api_params.get('max_tokens', 'NOT SET')}")
288
- print(f" Temperature: {api_params.get('temperature', 'NOT SET')}")
289
- if "tools" in api_params:
290
- print(f" First tool: {api_params['tools'][0]}")
291
- print(f" FULL API PARAMS: {api_params}")
292
-
293
- # Quiet targeted retry for OpenAI 400 tool_use_failed during tool-calling
294
- try:
295
- max_attempts_for_tool_use = int(os.getenv("SYNTH_TOOL_USE_RETRIES", "5"))
296
- except Exception:
297
- max_attempts_for_tool_use = 5
298
- try:
299
- backoff_seconds = float(os.getenv("SYNTH_TOOL_USE_BACKOFF_INITIAL", "0.5"))
300
- except Exception:
301
- backoff_seconds = 0.5
302
-
303
- attempt_index = 0
304
- while True:
305
- try:
306
- output = await self.async_client.chat.completions.create(**api_params)
307
- break
308
- except openai.BadRequestError as err:
309
- # Detect tool-use failure from various SDK surfaces
310
- should_retry = False
311
- # 1) Body dict
312
- body = getattr(err, "body", None)
313
- if isinstance(body, dict):
314
- try:
315
- err_obj = body.get("error") if isinstance(body.get("error"), dict) else {}
316
- code_val = err_obj.get("code")
317
- msg_val = err_obj.get("message")
318
- if code_val == "tool_use_failed" or (
319
- isinstance(msg_val, str) and "Failed to call a function" in msg_val
320
- ):
321
- should_retry = True
322
- except Exception:
323
- pass
324
- # 2) Response JSON
325
- if not should_retry:
326
- try:
327
- resp = getattr(err, "response", None)
328
- if resp is not None:
329
- j = resp.json()
330
- if isinstance(j, dict):
331
- err_obj = j.get("error") if isinstance(j.get("error"), dict) else {}
332
- code_val = err_obj.get("code")
333
- msg_val = err_obj.get("message")
334
- if code_val == "tool_use_failed" or (
335
- isinstance(msg_val, str)
336
- and "Failed to call a function" in msg_val
337
- ):
338
- should_retry = True
339
- except Exception:
340
- pass
341
- # 3) Fallback to string match
342
- if not should_retry:
343
- err_text = str(err)
344
- if "tool_use_failed" in err_text or "Failed to call a function" in err_text:
345
- should_retry = True
346
- if should_retry and attempt_index + 1 < max_attempts_for_tool_use:
347
- await asyncio.sleep(backoff_seconds)
348
- backoff_seconds = min(backoff_seconds * 2.0, 2.0)
349
- attempt_index += 1
350
- continue
351
- raise
352
-
353
- if debug:
354
- print("🔍 OPENAI DEBUG: Response received:")
355
- print(f" Type: {type(output)}")
356
- print(f" Choices: {len(output.choices) if hasattr(output, 'choices') else 'N/A'}")
357
- if hasattr(output, "choices") and output.choices:
358
- choice = output.choices[0]
359
- print(f" Choice type: {type(choice)}")
360
- if hasattr(choice, "message"):
361
- message = choice.message
362
- print(f" Message type: {type(message)}")
363
- print(f" Has tool_calls: {hasattr(message, 'tool_calls')}")
364
- if hasattr(message, "tool_calls"):
365
- print(f" Tool calls: {message.tool_calls}")
366
- print(
367
- f" Content: {message.content[:200] if hasattr(message, 'content') and message.content else 'None'}..."
368
- )
369
- # Show finish_reason and usage if available
370
- try:
371
- print(f" finish_reason: {getattr(choice, 'finish_reason', None)}")
372
- usage = getattr(output, "usage", None)
373
- if usage:
374
- print(
375
- f" usage: prompt_tokens={getattr(usage, 'prompt_tokens', None)}, completion_tokens={getattr(usage, 'completion_tokens', None)}, total_tokens={getattr(usage, 'total_tokens', None)}"
376
- )
377
- except Exception:
378
- pass
379
-
380
- if debug:
381
- print("🔍 OPENAI DEBUG: FULL RAW RESPONSE:")
382
- if hasattr(output.choices[0].message, "content") and output.choices[0].message.content:
383
- print(f" FULL CONTENT:\n{output.choices[0].message.content}")
384
- print(f" Raw choice: {choice}")
385
- print(f" Raw message: {message}")
386
- # except Exception as e:
387
- # try:
388
- # from openai import AuthenticationError as _OpenAIAuthErr # type: ignore
389
- # except ModuleNotFoundError:
390
- # _OpenAIAuthErr = type(e)
391
- # if isinstance(e, _OpenAIAuthErr):
392
- # key_preview = (os.getenv("OPENAI_API_KEY") or "")[:8]
393
- # # Create a more informative error message but preserve the original exception
394
- # enhanced_msg = f"Invalid API key format. Expected prefix 'sk-' or 'sk_live_'. Provided key begins with '{key_preview}'. Original error: {str(e)}"
395
- # # Re-raise the original exception with enhanced message if possible
396
- # if hasattr(e, 'response') and hasattr(e, 'body'):
397
- # raise _OpenAIAuthErr(enhanced_msg, response=e.response, body=e.body) from None
398
- # else:
399
- # # Fallback: just re-raise the original with a print for debugging
400
- # print(f"🔑 API Key Debug: {enhanced_msg}")
401
- # raise e from None
402
- # raise
403
- message = output.choices[0].message
404
-
405
- # Convert tool calls to dict format, preferring dict-shaped entries first
406
- tool_calls = None
407
- if message.tool_calls:
408
- converted: list[dict] = []
409
- for tc in message.tool_calls:
410
- if isinstance(tc, dict):
411
- fn = tc.get("function") or {}
412
- converted.append(
413
- {
414
- "id": tc.get("id"),
415
- "type": tc.get("type", "function"),
416
- "function": {
417
- "name": fn.get("name") or tc.get("name"),
418
- "arguments": fn.get("arguments") or tc.get("arguments"),
419
- },
420
- }
421
- )
422
- else:
423
- # SDK object path
424
- converted.append(
425
- {
426
- "id": getattr(tc, "id", None),
427
- "type": getattr(tc, "type", "function"),
428
- "function": {
429
- "name": getattr(getattr(tc, "function", None), "name", None),
430
- "arguments": getattr(
431
- getattr(tc, "function", None), "arguments", None
432
- ),
433
- },
434
- }
435
- )
436
- tool_calls = converted or None
437
-
438
- # Attach basic usage if available
439
- usage_dict = None
440
- try:
441
- usage_obj = getattr(output, "usage", None)
442
- if usage_obj is not None:
443
- usage_dict = {
444
- "prompt_tokens": getattr(usage_obj, "prompt_tokens", None),
445
- "completion_tokens": getattr(usage_obj, "completion_tokens", None),
446
- "total_tokens": getattr(usage_obj, "total_tokens", None),
447
- }
448
- except Exception:
449
- usage_dict = None
450
-
451
- lm_response = BaseLMResponse(
452
- raw_response=message.content or "", # Use empty string if no content
453
- structured_output=None,
454
- tool_calls=tool_calls,
455
- usage=usage_dict,
456
- )
457
- lm_config["reasoning_effort"] = reasoning_effort
458
- used_cache_handler.add_to_managed_cache(
459
- model, messages, lm_config=lm_config, output=lm_response, tools=tools
460
- )
461
- return lm_response
462
-
463
- @backoff.on_exception(
464
- backoff.expo,
465
- DEFAULT_EXCEPTIONS_TO_RETRY,
466
- max_time=MAX_BACKOFF,
467
- jitter=backoff.full_jitter,
468
- on_backoff=_silent_backoff_handler,
469
- )
470
- def _hit_api_sync(
471
- self,
472
- model: str,
473
- messages: list[dict[str, Any]],
474
- lm_config: dict[str, Any],
475
- use_ephemeral_cache_only: bool = False,
476
- reasoning_effort: str = "high",
477
- tools: list[BaseTool] | None = None,
478
- ) -> BaseLMResponse:
479
- assert lm_config.get("response_model") is None, (
480
- "response_model is not supported for standard calls"
481
- )
482
- messages = special_orion_transform(model, messages)
483
- with use_overrides_for_messages(messages):
484
- # Apply context-scoped prompt injection just before building API params
485
- messages = apply_injection(messages)
486
- used_cache_handler = get_cache_handler(use_ephemeral_cache_only=use_ephemeral_cache_only)
487
- lm_config["reasoning_effort"] = reasoning_effort
488
- cache_result = used_cache_handler.hit_managed_cache(
489
- model, messages, lm_config=lm_config, tools=tools
490
- )
491
- # During pytest runs, bypass returning cache to allow tests to inspect outgoing params
492
- in_pytest = os.getenv("PYTEST_CURRENT_TEST") is not None
493
- if cache_result and not in_pytest:
494
- return cache_result
495
-
496
- # Common API call params
497
- api_params = {
498
- "model": model,
499
- "messages": messages,
500
- }
501
- with use_overrides_for_messages(messages):
502
- api_params = apply_param_overrides(api_params)
503
-
504
- # Add tools if provided
505
- if tools and all(isinstance(tool, BaseTool) for tool in tools):
506
- api_params["tools"] = [tool.to_openai_tool() for tool in tools]
507
- elif tools:
508
- api_params["tools"] = tools
509
-
510
- # Apply overrides (tools and params) using module-level imports
511
- with use_overrides_for_messages(messages):
512
- api_params = apply_tool_overrides(api_params)
513
- api_params = apply_param_overrides(api_params)
514
-
515
- # Only add temperature for non o1/o3 models, and do not override if already set via overrides
516
- if (
517
- not any(prefix in model for prefix in ["o1-", "o3-"])
518
- and "temperature" not in api_params
519
- ):
520
- api_params["temperature"] = lm_config.get(
521
- "temperature", SPECIAL_BASE_TEMPS.get(model, 0)
522
- )
523
-
524
- # Forward additional sampling / control params if provided
525
- if lm_config.get("max_tokens") is not None:
526
- api_params["max_tokens"] = lm_config["max_tokens"]
527
- if lm_config.get("top_p") is not None:
528
- api_params["top_p"] = lm_config["top_p"]
529
- if lm_config.get("frequency_penalty") is not None:
530
- api_params["frequency_penalty"] = lm_config["frequency_penalty"]
531
- if lm_config.get("presence_penalty") is not None:
532
- api_params["presence_penalty"] = lm_config["presence_penalty"]
533
- if lm_config.get("stop") is not None:
534
- api_params["stop"] = lm_config["stop"]
535
- if lm_config.get("tool_choice") is not None:
536
- api_params["tool_choice"] = lm_config["tool_choice"]
537
-
538
- # Add reasoning_effort only for o3-mini
539
- if model in ["o3-mini"]:
540
- api_params["reasoning_effort"] = reasoning_effort
541
-
542
- # Sync path: apply the same targeted retry
543
- try:
544
- max_attempts_for_tool_use = int(os.getenv("SYNTH_TOOL_USE_RETRIES", "5"))
545
- except Exception:
546
- max_attempts_for_tool_use = 5
547
- try:
548
- backoff_seconds = float(os.getenv("SYNTH_TOOL_USE_BACKOFF_INITIAL", "0.5"))
549
- except Exception:
550
- backoff_seconds = 0.5
551
-
552
- attempt_index = 0
553
- while True:
554
- try:
555
- output = self.sync_client.chat.completions.create(**api_params)
556
- break
557
- except openai.BadRequestError as err:
558
- should_retry = False
559
- body = getattr(err, "body", None)
560
- if isinstance(body, dict):
561
- try:
562
- err_obj = body.get("error") if isinstance(body.get("error"), dict) else {}
563
- code_val = err_obj.get("code")
564
- msg_val = err_obj.get("message")
565
- if code_val == "tool_use_failed" or (
566
- isinstance(msg_val, str) and "Failed to call a function" in msg_val
567
- ):
568
- should_retry = True
569
- except Exception:
570
- pass
571
- if not should_retry:
572
- try:
573
- resp = getattr(err, "response", None)
574
- if resp is not None:
575
- j = resp.json()
576
- if isinstance(j, dict):
577
- err_obj = j.get("error") if isinstance(j.get("error"), dict) else {}
578
- code_val = err_obj.get("code")
579
- msg_val = err_obj.get("message")
580
- if code_val == "tool_use_failed" or (
581
- isinstance(msg_val, str)
582
- and "Failed to call a function" in msg_val
583
- ):
584
- should_retry = True
585
- except Exception:
586
- pass
587
- if not should_retry:
588
- err_text = str(err)
589
- if "tool_use_failed" in err_text or "Failed to call a function" in err_text:
590
- should_retry = True
591
- if should_retry and attempt_index + 1 < max_attempts_for_tool_use:
592
- time.sleep(backoff_seconds)
593
- backoff_seconds = min(backoff_seconds * 2.0, 2.0)
594
- attempt_index += 1
595
- continue
596
- raise
597
- message = output.choices[0].message
598
- debug_sync = os.getenv("SYNTH_OPENAI_DEBUG") == "1"
599
- if debug_sync:
600
- try:
601
- print(
602
- f"🔍 OPENAI DEBUG (sync): finish_reason={getattr(output.choices[0], 'finish_reason', None)}"
603
- )
604
- usage = getattr(output, "usage", None)
605
- if usage:
606
- print(
607
- f"🔍 OPENAI DEBUG (sync): usage prompt_tokens={getattr(usage, 'prompt_tokens', None)}, completion_tokens={getattr(usage, 'completion_tokens', None)}, total_tokens={getattr(usage, 'total_tokens', None)}"
608
- )
609
- except Exception:
610
- pass
611
-
612
- # Convert tool calls to dict format
613
- tool_calls = None
614
- if message.tool_calls:
615
- tool_calls = [
616
- {
617
- "id": tc.id,
618
- "type": tc.type,
619
- "function": {
620
- "name": tc.function.name,
621
- "arguments": tc.function.arguments,
622
- },
623
- }
624
- for tc in message.tool_calls
625
- ]
626
-
627
- # Attach basic usage if available
628
- usage_dict = None
629
- try:
630
- usage_obj = getattr(output, "usage", None)
631
- if usage_obj is not None:
632
- usage_dict = {
633
- "prompt_tokens": getattr(usage_obj, "prompt_tokens", None),
634
- "completion_tokens": getattr(usage_obj, "completion_tokens", None),
635
- "total_tokens": getattr(usage_obj, "total_tokens", None),
636
- }
637
- except Exception:
638
- usage_dict = None
639
-
640
- lm_response = BaseLMResponse(
641
- raw_response=message.content or "", # Use empty string if no content
642
- structured_output=None,
643
- tool_calls=tool_calls,
644
- usage=usage_dict,
645
- )
646
- lm_config["reasoning_effort"] = reasoning_effort
647
- used_cache_handler.add_to_managed_cache(
648
- model, messages, lm_config=lm_config, output=lm_response, tools=tools
649
- )
650
- return lm_response
651
-
652
- async def _hit_api_async_structured_output(
653
- self,
654
- model: str,
655
- messages: list[dict[str, Any]],
656
- response_model: BaseModel,
657
- temperature: float,
658
- use_ephemeral_cache_only: bool = False,
659
- reasoning_effort: str = "high",
660
- tools: list[BaseTool] | None = None,
661
- ) -> BaseLMResponse:
662
- lm_config = {
663
- "temperature": temperature,
664
- "response_model": response_model,
665
- "reasoning_effort": reasoning_effort,
666
- }
667
- used_cache_handler = get_cache_handler(use_ephemeral_cache_only)
668
- cache_result: BaseLMResponse | None = used_cache_handler.hit_managed_cache(
669
- model, messages, lm_config=lm_config, tools=tools
670
- )
671
- if cache_result is not None:
672
- return cache_result
673
-
674
- # Common API call params
675
- api_params = {
676
- "model": model,
677
- "messages": messages,
678
- }
679
-
680
- # Add tools if provided
681
- if tools and all(isinstance(tool, BaseTool) for tool in tools):
682
- api_params["tools"] = [tool.to_openai_tool() for tool in tools]
683
- elif tools:
684
- api_params["tools"] = tools
685
-
686
- # Only add temperature for non o1/o3 models
687
- if not any(prefix in model for prefix in ["o1-", "o3-"]):
688
- api_params["temperature"] = lm_config.get(
689
- "temperature", SPECIAL_BASE_TEMPS.get(model, 0)
690
- )
691
-
692
- # Add reasoning_effort only for o3-mini
693
- if model in ["o3-mini"]:
694
- api_params["reasoning_effort"] = reasoning_effort
695
-
696
- output = await self.async_client.chat.completions.create(**api_params)
697
-
698
- structured_output_api_result = response_model(**output.choices[0].message.content)
699
- tool_calls = output.choices[0].message.tool_calls
700
- lm_response = BaseLMResponse(
701
- raw_response=output.choices[0].message.content,
702
- structured_output=structured_output_api_result,
703
- tool_calls=tool_calls,
704
- )
705
- lm_config["reasoning_effort"] = reasoning_effort
706
- used_cache_handler.add_to_managed_cache(
707
- model, messages, lm_config=lm_config, output=lm_response, tools=tools
708
- )
709
- return lm_response
710
-
711
- def _hit_api_sync_structured_output(
712
- self,
713
- model: str,
714
- messages: list[dict[str, Any]],
715
- response_model: BaseModel,
716
- temperature: float,
717
- use_ephemeral_cache_only: bool = False,
718
- reasoning_effort: str = "high",
719
- tools: list[BaseTool] | None = None,
720
- ) -> BaseLMResponse:
721
- lm_config = {
722
- "temperature": temperature,
723
- "response_model": response_model,
724
- "reasoning_effort": reasoning_effort,
725
- }
726
- used_cache_handler = get_cache_handler(use_ephemeral_cache_only)
727
- cache_result: BaseLMResponse | None = used_cache_handler.hit_managed_cache(
728
- model, messages, lm_config=lm_config, tools=tools
729
- )
730
- if cache_result is not None:
731
- return cache_result
732
-
733
- # Common API call params
734
- api_params = {
735
- "model": model,
736
- "messages": messages,
737
- }
738
-
739
- # Add tools if provided
740
- if tools and all(isinstance(tool, BaseTool) for tool in tools):
741
- api_params["tools"] = [tool.to_openai_tool() for tool in tools]
742
- elif tools:
743
- api_params["tools"] = tools
744
-
745
- # Only add temperature for non o1/o3 models
746
- if not any(prefix in model for prefix in ["o1-", "o3-"]):
747
- api_params["temperature"] = lm_config.get(
748
- "temperature", SPECIAL_BASE_TEMPS.get(model, 0)
749
- )
750
-
751
- # Add reasoning_effort only for o3-mini
752
- if model in ["o3-mini"]:
753
- api_params["reasoning_effort"] = reasoning_effort
754
-
755
- # Normalize for external OpenAI as well in sync path
756
- try:
757
- base_url_obj = getattr(self.sync_client, "base_url", None)
758
- base_url_str_sync = str(base_url_obj) if base_url_obj is not None else ""
759
- except Exception:
760
- base_url_str_sync = ""
761
- if (
762
- "openai.com" in base_url_str_sync or "api.groq.com" in base_url_str_sync
763
- ) and model.startswith("gpt-5"):
764
- if "max_tokens" in api_params:
765
- api_params["max_completion_tokens"] = api_params.pop("max_tokens")
766
- if "temperature" in api_params:
767
- api_params.pop("temperature", None)
768
-
769
- output = self.sync_client.chat.completions.create(**api_params)
770
-
771
- structured_output_api_result = response_model(**output.choices[0].message.content)
772
- tool_calls = output.choices[0].message.tool_calls
773
- lm_response = BaseLMResponse(
774
- raw_response=output.choices[0].message.content,
775
- structured_output=structured_output_api_result,
776
- tool_calls=tool_calls,
777
- )
778
- lm_config["reasoning_effort"] = reasoning_effort
779
- used_cache_handler.add_to_managed_cache(
780
- model, messages, lm_config=lm_config, output=lm_response, tools=tools
781
- )
782
- return lm_response