agentinputlab 0.1.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. agentinputlab/__init__.py +28 -0
  2. agentinputlab/algorithms/__init__.py +6 -0
  3. agentinputlab/algorithms/acquire/__init__.py +145 -0
  4. agentinputlab/algorithms/acquire/adaptive_rag/__init__.py +43 -0
  5. agentinputlab/algorithms/acquire/adaptive_rag/replay.py +367 -0
  6. agentinputlab/algorithms/acquire/adaptive_rag/runtime.py +1202 -0
  7. agentinputlab/algorithms/acquire/adaptive_rag_common_support.py +542 -0
  8. agentinputlab/algorithms/acquire/hyde.py +296 -0
  9. agentinputlab/algorithms/acquire/hyde_controlled.py +200 -0
  10. agentinputlab/algorithms/acquire/hyde_external.py +148 -0
  11. agentinputlab/algorithms/acquire/ircot.py +28 -0
  12. agentinputlab/algorithms/acquire/ircot_common_support.py +478 -0
  13. agentinputlab/algorithms/acquire/ircot_native.py +355 -0
  14. agentinputlab/algorithms/acquire/ircot_replay.py +327 -0
  15. agentinputlab/algorithms/acquire/qrag/__init__.py +79 -0
  16. agentinputlab/algorithms/acquire/qrag/bridge.py +828 -0
  17. agentinputlab/algorithms/acquire/qrag/common_support.py +891 -0
  18. agentinputlab/algorithms/acquire/qrag/native_axis.py +71 -0
  19. agentinputlab/algorithms/acquire/qrag/reader_adapter.py +139 -0
  20. agentinputlab/algorithms/acquire/r2ag/__init__.py +57 -0
  21. agentinputlab/algorithms/acquire/r2ag/bridge.py +1312 -0
  22. agentinputlab/algorithms/acquire/r2ag/common_support.py +1029 -0
  23. agentinputlab/algorithms/acquire/r2ag/socket_runtime.py +255 -0
  24. agentinputlab/algorithms/clarify/__init__.py +61 -0
  25. agentinputlab/algorithms/clarify/_structured.py +64 -0
  26. agentinputlab/algorithms/clarify/active_task_disambiguation.py +371 -0
  27. agentinputlab/algorithms/clarify/ask_or_assume/__init__.py +17 -0
  28. agentinputlab/algorithms/clarify/ask_or_assume/monitor.py +410 -0
  29. agentinputlab/algorithms/clarify/future_turns.py +379 -0
  30. agentinputlab/algorithms/clarify/udcs.py +255 -0
  31. agentinputlab/algorithms/clarify/udcs_deterministic.py +196 -0
  32. agentinputlab/algorithms/curate/__init__.py +65 -0
  33. agentinputlab/algorithms/curate/acon/__init__.py +27 -0
  34. agentinputlab/algorithms/curate/acon/common.py +284 -0
  35. agentinputlab/algorithms/curate/acon/common_support.py +136 -0
  36. agentinputlab/algorithms/curate/acon/history_bridge.py +309 -0
  37. agentinputlab/algorithms/curate/acon/observation_bridge.py +290 -0
  38. agentinputlab/algorithms/curate/llmlingua/__init__.py +30 -0
  39. agentinputlab/algorithms/curate/llmlingua/adapters.py +537 -0
  40. agentinputlab/algorithms/curate/llmlingua/budget.py +48 -0
  41. agentinputlab/algorithms/curate/llmlingua/controlled.py +175 -0
  42. agentinputlab/algorithms/curate/llmlingua/multilingual.py +105 -0
  43. agentinputlab/algorithms/curate/llmlingua/span_map.py +167 -0
  44. agentinputlab/algorithms/curate/recomp/__init__.py +47 -0
  45. agentinputlab/algorithms/curate/recomp/external.py +1129 -0
  46. agentinputlab/algorithms/curate/recomp/selective.py +304 -0
  47. agentinputlab/algorithms/decompose/__init__.py +107 -0
  48. agentinputlab/algorithms/decompose/decomp/__init__.py +53 -0
  49. agentinputlab/algorithms/decompose/decomp/common_support.py +478 -0
  50. agentinputlab/algorithms/decompose/decomp/planner_component.py +199 -0
  51. agentinputlab/algorithms/decompose/decomp/worker_bridge.py +416 -0
  52. agentinputlab/algorithms/decompose/llm_compiler/__init__.py +35 -0
  53. agentinputlab/algorithms/decompose/llm_compiler/bridge.py +520 -0
  54. agentinputlab/algorithms/decompose/llm_compiler/common_support.py +504 -0
  55. agentinputlab/algorithms/decompose/plan_and_budget/__init__.py +43 -0
  56. agentinputlab/algorithms/decompose/plan_and_budget/cached_soft_budget.py +362 -0
  57. agentinputlab/algorithms/decompose/plan_and_budget/decomposer_component.py +107 -0
  58. agentinputlab/algorithms/decompose/plan_and_budget/full.py +205 -0
  59. agentinputlab/algorithms/decompose/plan_and_budget/hard_cap.py +246 -0
  60. agentinputlab/algorithms/decompose/plan_and_budget/regenerated_soft_budget.py +448 -0
  61. agentinputlab/algorithms/decompose/plan_and_solve/__init__.py +33 -0
  62. agentinputlab/algorithms/decompose/plan_and_solve/plan_component.py +192 -0
  63. agentinputlab/algorithms/decompose/plan_and_solve/ps_prompt.py +127 -0
  64. agentinputlab/algorithms/decompose/self_ask/__init__.py +27 -0
  65. agentinputlab/algorithms/decompose/self_ask/loop.py +362 -0
  66. agentinputlab/algorithms/decompose/self_ask/planner_component.py +117 -0
  67. agentinputlab/algorithms/reformulate/__init__.py +85 -0
  68. agentinputlab/algorithms/reformulate/infocqr/__init__.py +40 -0
  69. agentinputlab/algorithms/reformulate/infocqr/cache_replay.py +362 -0
  70. agentinputlab/algorithms/reformulate/infocqr/external.py +675 -0
  71. agentinputlab/algorithms/reformulate/infocqr/student.py +189 -0
  72. agentinputlab/algorithms/reformulate/query2doc/__init__.py +42 -0
  73. agentinputlab/algorithms/reformulate/query2doc/controlled_live.py +190 -0
  74. agentinputlab/algorithms/reformulate/query2doc/models.py +95 -0
  75. agentinputlab/algorithms/reformulate/query2doc/official_cached.py +335 -0
  76. agentinputlab/algorithms/reformulate/query2doc/querygym_bridge.py +223 -0
  77. agentinputlab/algorithms/reformulate/query2doc/querygym_runtime.py +326 -0
  78. agentinputlab/algorithms/reformulate/reformer/__init__.py +23 -0
  79. agentinputlab/algorithms/reformulate/reformer/external.py +417 -0
  80. agentinputlab/algorithms/reformulate/rrr.py +696 -0
  81. agentinputlab/annotation/__init__.py +5 -0
  82. agentinputlab/annotation/independent.py +428 -0
  83. agentinputlab/annotation/server.py +233 -0
  84. agentinputlab/annotation/static/app.js +121 -0
  85. agentinputlab/annotation/static/index.html +60 -0
  86. agentinputlab/annotation/static/review.css +2 -0
  87. agentinputlab/annotation/static/review.html +10 -0
  88. agentinputlab/annotation/static/review.js +11 -0
  89. agentinputlab/annotation/static/styles.css +55 -0
  90. agentinputlab/annotation/store.py +444 -0
  91. agentinputlab/api.py +368 -0
  92. agentinputlab/artifacts/__init__.py +15 -0
  93. agentinputlab/artifacts/json_file.py +104 -0
  94. agentinputlab/artifacts/manifest.py +98 -0
  95. agentinputlab/artifacts/store.py +157 -0
  96. agentinputlab/backends/__init__.py +98 -0
  97. agentinputlab/backends/embedding/__init__.py +25 -0
  98. agentinputlab/backends/embedding/base.py +145 -0
  99. agentinputlab/backends/embedding/callable.py +75 -0
  100. agentinputlab/backends/embedding/replay.py +129 -0
  101. agentinputlab/backends/llm/__init__.py +31 -0
  102. agentinputlab/backends/llm/base.py +149 -0
  103. agentinputlab/backends/llm/callable.py +108 -0
  104. agentinputlab/backends/llm/decomp_completion.py +88 -0
  105. agentinputlab/backends/llm/final_content_stop.py +72 -0
  106. agentinputlab/backends/llm/gpt_oss_final_channel.py +84 -0
  107. agentinputlab/backends/llm/openai_compatible.py +332 -0
  108. agentinputlab/backends/llm/transformers.py +171 -0
  109. agentinputlab/backends/retrieval/__init__.py +35 -0
  110. agentinputlab/backends/retrieval/base.py +50 -0
  111. agentinputlab/backends/retrieval/dense.py +777 -0
  112. agentinputlab/backends/retrieval/memory.py +119 -0
  113. agentinputlab/backends/retrieval/sqlite_fts.py +155 -0
  114. agentinputlab/backends/user/__init__.py +15 -0
  115. agentinputlab/backends/user/base.py +66 -0
  116. agentinputlab/backends/user/callable.py +54 -0
  117. agentinputlab/backends/user/replay.py +89 -0
  118. agentinputlab/backends/vector.py +38 -0
  119. agentinputlab/benchmarks/__init__.py +246 -0
  120. agentinputlab/benchmarks/acquisition.py +106 -0
  121. agentinputlab/benchmarks/ale.py +540 -0
  122. agentinputlab/benchmarks/appworld_ul.py +669 -0
  123. agentinputlab/benchmarks/assets.py +226 -0
  124. agentinputlab/benchmarks/base.py +68 -0
  125. agentinputlab/benchmarks/beir_archive.py +235 -0
  126. agentinputlab/benchmarks/beir_sample.py +269 -0
  127. agentinputlab/benchmarks/bfcl_native.py +245 -0
  128. agentinputlab/benchmarks/bfcl_v3.py +607 -0
  129. agentinputlab/benchmarks/cache.py +218 -0
  130. agentinputlab/benchmarks/clariq.py +203 -0
  131. agentinputlab/benchmarks/data/registry.json +321 -0
  132. agentinputlab/benchmarks/data/smoke_assets.json +511 -0
  133. agentinputlab/benchmarks/data/statebench_v0_8_1_task_ids.json +475 -0
  134. agentinputlab/benchmarks/data/toolsandbox_165848b_scenario_names.json +1 -0
  135. agentinputlab/benchmarks/execution.py +1111 -0
  136. agentinputlab/benchmarks/interactive.py +257 -0
  137. agentinputlab/benchmarks/ir_query.py +204 -0
  138. agentinputlab/benchmarks/longbench.py +203 -0
  139. agentinputlab/benchmarks/paired_replay.py +479 -0
  140. agentinputlab/benchmarks/preprocess.py +2313 -0
  141. agentinputlab/benchmarks/production.py +236 -0
  142. agentinputlab/benchmarks/qa.py +963 -0
  143. agentinputlab/benchmarks/registry.py +110 -0
  144. agentinputlab/benchmarks/retrieval.py +459 -0
  145. agentinputlab/benchmarks/runtime.py +509 -0
  146. agentinputlab/benchmarks/statebench.py +938 -0
  147. agentinputlab/benchmarks/tau3.py +725 -0
  148. agentinputlab/benchmarks/toolsandbox.py +626 -0
  149. agentinputlab/benchmarks/trec_dl_sample.py +263 -0
  150. agentinputlab/campaign.py +654 -0
  151. agentinputlab/campaign_runner.py +953 -0
  152. agentinputlab/cli/__init__.py +6 -0
  153. agentinputlab/cli/main.py +933 -0
  154. agentinputlab/connectors/__init__.py +46 -0
  155. agentinputlab/connectors/knowledge/__init__.py +4 -0
  156. agentinputlab/connectors/tools/__init__.py +30 -0
  157. agentinputlab/connectors/tools/base.py +57 -0
  158. agentinputlab/connectors/tools/mcp.py +222 -0
  159. agentinputlab/connectors/tools/memory.py +41 -0
  160. agentinputlab/connectors/tools/openapi.py +695 -0
  161. agentinputlab/connectors/tools/schema.py +102 -0
  162. agentinputlab/contracts/__init__.py +91 -0
  163. agentinputlab/contracts/availability.py +24 -0
  164. agentinputlab/contracts/dependency.py +58 -0
  165. agentinputlab/contracts/enums.py +82 -0
  166. agentinputlab/contracts/errors.py +63 -0
  167. agentinputlab/contracts/evidence.py +43 -0
  168. agentinputlab/contracts/intent.py +110 -0
  169. agentinputlab/contracts/lifecycle.py +164 -0
  170. agentinputlab/contracts/patch.py +167 -0
  171. agentinputlab/contracts/serialization.py +93 -0
  172. agentinputlab/contracts/state.py +127 -0
  173. agentinputlab/contracts/trace.py +59 -0
  174. agentinputlab/contracts/worker.py +42 -0
  175. agentinputlab/core/__init__.py +7 -0
  176. agentinputlab/data/__init__.py +32 -0
  177. agentinputlab/data/checksums.py +9 -0
  178. agentinputlab/data/downloader.py +235 -0
  179. agentinputlab/data/http.py +171 -0
  180. agentinputlab/data/index.py +21 -0
  181. agentinputlab/data/overlap.py +28 -0
  182. agentinputlab/data/preprocess.py +32 -0
  183. agentinputlab/data/storage.py +57 -0
  184. agentinputlab/data/trec_sample.py +427 -0
  185. agentinputlab/evaluation/__init__.py +5 -0
  186. agentinputlab/evaluation/outcomes.py +32 -0
  187. agentinputlab/experiments/__init__.py +278 -0
  188. agentinputlab/experiments/analysis.py +981 -0
  189. agentinputlab/experiments/artifacts.py +687 -0
  190. agentinputlab/experiments/automatic_measurement.py +678 -0
  191. agentinputlab/experiments/auxiliary_matrix.py +203 -0
  192. agentinputlab/experiments/bindings.py +430 -0
  193. agentinputlab/experiments/blueprints.py +147 -0
  194. agentinputlab/experiments/builders/__init__.py +45 -0
  195. agentinputlab/experiments/builders/executable_external_payload.py +423 -0
  196. agentinputlab/experiments/builders/external_process_arena.py +1018 -0
  197. agentinputlab/experiments/builders/registry_intervention.py +463 -0
  198. agentinputlab/experiments/cli.py +158 -0
  199. agentinputlab/experiments/controls.py +340 -0
  200. agentinputlab/experiments/driver_guard.py +205 -0
  201. agentinputlab/experiments/drivers/__init__.py +89 -0
  202. agentinputlab/experiments/drivers/external_arena.py +2908 -0
  203. agentinputlab/experiments/drivers/method_process.py +662 -0
  204. agentinputlab/experiments/drivers/parity_process.py +1484 -0
  205. agentinputlab/experiments/drivers/static_production.py +1574 -0
  206. agentinputlab/experiments/executor.py +448 -0
  207. agentinputlab/experiments/loader.py +605 -0
  208. agentinputlab/experiments/measurement.py +675 -0
  209. agentinputlab/experiments/paper_analysis.py +1818 -0
  210. agentinputlab/experiments/parity_identity.py +605 -0
  211. agentinputlab/experiments/plan.py +277 -0
  212. agentinputlab/experiments/production_builders.py +3739 -0
  213. agentinputlab/experiments/readiness.py +432 -0
  214. agentinputlab/experiments/schema.py +514 -0
  215. agentinputlab/experiments/secrets.py +177 -0
  216. agentinputlab/experiments/stateful_analysis.py +1738 -0
  217. agentinputlab/experiments/transfer_analysis.py +1316 -0
  218. agentinputlab/experiments/unseen_analysis.py +1025 -0
  219. agentinputlab/integrations/__init__.py +1 -0
  220. agentinputlab/integrations/action_space/__init__.py +1 -0
  221. agentinputlab/integrations/external_workers/__init__.py +76 -0
  222. agentinputlab/integrations/external_workers/ace.py +431 -0
  223. agentinputlab/integrations/external_workers/base.py +181 -0
  224. agentinputlab/integrations/external_workers/decomp_live.py +249 -0
  225. agentinputlab/integrations/external_workers/decomp_planner.py +30 -0
  226. agentinputlab/integrations/external_workers/infocqr_student.py +280 -0
  227. agentinputlab/integrations/external_workers/ircot.py +576 -0
  228. agentinputlab/integrations/external_workers/llmcompiler_live.py +360 -0
  229. agentinputlab/integrations/external_workers/longllmlingua.py +162 -0
  230. agentinputlab/integrations/external_workers/method.py +314 -0
  231. agentinputlab/integrations/external_workers/process.py +678 -0
  232. agentinputlab/integrations/external_workers/supervisor.py +1071 -0
  233. agentinputlab/integrations/full_architecture/__init__.py +1 -0
  234. agentinputlab/integrations/full_architecture/hyde.py +212 -0
  235. agentinputlab/integrations/full_architecture/plan_and_budget.py +188 -0
  236. agentinputlab/integrations/live_history.py +222 -0
  237. agentinputlab/integrations/prompt_optimization/__init__.py +1 -0
  238. agentinputlab/integrations/training/__init__.py +1 -0
  239. agentinputlab/metrics/__init__.py +50 -0
  240. agentinputlab/metrics/catalog.py +313 -0
  241. agentinputlab/metrics/harm.py +95 -0
  242. agentinputlab/metrics/paired.py +40 -0
  243. agentinputlab/metrics/qa.py +76 -0
  244. agentinputlab/metrics/text.py +33 -0
  245. agentinputlab/metrics/third_party.py +161 -0
  246. agentinputlab/models/__init__.py +4 -0
  247. agentinputlab/observability/__init__.py +56 -0
  248. agentinputlab/observability/budget.py +316 -0
  249. agentinputlab/observability/instrumentation.py +754 -0
  250. agentinputlab/observability/models.py +403 -0
  251. agentinputlab/observability/monitor.py +380 -0
  252. agentinputlab/optimizers/__init__.py +1 -0
  253. agentinputlab/optimizers/clarify/__init__.py +12 -0
  254. agentinputlab/optimizers/context/__init__.py +22 -0
  255. agentinputlab/optimizers/decompose/__init__.py +64 -0
  256. agentinputlab/optimizers/evidence/__init__.py +22 -0
  257. agentinputlab/optimizers/rewrite/__init__.py +30 -0
  258. agentinputlab/parity/__init__.py +5 -0
  259. agentinputlab/parity/base.py +206 -0
  260. agentinputlab/production_campaign.py +763 -0
  261. agentinputlab/py.typed +1 -0
  262. agentinputlab/recipes/__init__.py +333 -0
  263. agentinputlab/recipes/ace.py +418 -0
  264. agentinputlab/recipes/ace_bfcl.py +273 -0
  265. agentinputlab/recipes/ace_common_support.py +169 -0
  266. agentinputlab/recipes/ace_native_plan.py +322 -0
  267. agentinputlab/recipes/ace_online.py +711 -0
  268. agentinputlab/recipes/ace_retrieval.py +330 -0
  269. agentinputlab/recipes/ace_statebench.py +382 -0
  270. agentinputlab/recipes/ace_tau.py +463 -0
  271. agentinputlab/recipes/ace_toolsandbox.py +432 -0
  272. agentinputlab/recipes/acon_guideline.py +22 -0
  273. agentinputlab/recipes/adaptive_rag.py +822 -0
  274. agentinputlab/recipes/llmlingua2_inference.py +146 -0
  275. agentinputlab/recipes/llmlingua2_training.py +796 -0
  276. agentinputlab/recipes/mce.py +1486 -0
  277. agentinputlab/recipes/mce_final.py +335 -0
  278. agentinputlab/recipes/mce_text_fit.py +499 -0
  279. agentinputlab/recipes/mce_text_only.py +298 -0
  280. agentinputlab/recipes/qrag.py +729 -0
  281. agentinputlab/recipes/qrag_inference.py +364 -0
  282. agentinputlab/recipes/r2ag_features.py +236 -0
  283. agentinputlab/recipes/r2ag_inference.py +503 -0
  284. agentinputlab/recipes/r2ag_training.py +948 -0
  285. agentinputlab/recipes/recomp_abstractive.py +592 -0
  286. agentinputlab/recipes/recomp_extractive.py +525 -0
  287. agentinputlab/recipes/reformer.py +17 -0
  288. agentinputlab/recipes/rqrag.py +1516 -0
  289. agentinputlab/recipes/rqrag_common_support.py +193 -0
  290. agentinputlab/recipes/rqrag_completion.py +147 -0
  291. agentinputlab/recipes/skillopt.py +462 -0
  292. agentinputlab/recipes/skillopt_common_support.py +154 -0
  293. agentinputlab/recipes/skillopt_environment.py +165 -0
  294. agentinputlab/recipes/skillopt_environment_cli.py +5 -0
  295. agentinputlab/recipes/skillopt_retrieval.py +188 -0
  296. agentinputlab/recipes/smartsearch.py +897 -0
  297. agentinputlab/recipes/smartsearch_curriculum.py +283 -0
  298. agentinputlab/recipes/smartsearch_grpo_contracts.py +58 -0
  299. agentinputlab/recipes/smartsearch_grpo_data.py +314 -0
  300. agentinputlab/recipes/smartsearch_grpo_meter.py +324 -0
  301. agentinputlab/recipes/smartsearch_grpo_prefix.py +144 -0
  302. agentinputlab/recipes/smartsearch_grpo_rollout.py +119 -0
  303. agentinputlab/recipes/smartsearch_grpo_tools.py +364 -0
  304. agentinputlab/recipes/smartsearch_grpo_training.py +305 -0
  305. agentinputlab/recipes/smartsearch_grpo_transport.py +248 -0
  306. agentinputlab/recipes/smartsearch_grpo_worker.py +364 -0
  307. agentinputlab/recipes/smartsearch_inference.py +524 -0
  308. agentinputlab/recipes/smartsearch_native_data.py +172 -0
  309. agentinputlab/recipes/smartsearch_policy.py +616 -0
  310. agentinputlab/recipes/smartsearch_policy_worker.py +9 -0
  311. agentinputlab/recipes/smartsearch_sampling.py +232 -0
  312. agentinputlab/recipes/smartsearch_teacher.py +203 -0
  313. agentinputlab/recipes/smartsearch_training.py +265 -0
  314. agentinputlab/registry/__init__.py +46 -0
  315. agentinputlab/registry/beta.py +727 -0
  316. agentinputlab/registry/data/algorithms.json +1959 -0
  317. agentinputlab/registry/data/auxiliary_method_profiles.json +34 -0
  318. agentinputlab/registry/loader.py +100 -0
  319. agentinputlab/registry/result_manifest.py +184 -0
  320. agentinputlab/registry/runtime.py +195 -0
  321. agentinputlab/registry/schema.py +449 -0
  322. agentinputlab/runner/__init__.py +30 -0
  323. agentinputlab/runner/balance.py +248 -0
  324. agentinputlab/runner/cache.py +135 -0
  325. agentinputlab/runner/composite.py +130 -0
  326. agentinputlab/runner/engine.py +285 -0
  327. agentinputlab/runner/runtime_guard.py +268 -0
  328. agentinputlab/runner/worker.py +80 -0
  329. agentinputlab/runtime_bootstrap.py +288 -0
  330. agentinputlab/selectors/__init__.py +196 -0
  331. agentinputlab/selectors/advanced.py +1514 -0
  332. agentinputlab/selectors/artifacts.py +1087 -0
  333. agentinputlab/selectors/base.py +112 -0
  334. agentinputlab/selectors/campaigns.py +1893 -0
  335. agentinputlab/selectors/catalog.py +86 -0
  336. agentinputlab/selectors/discovery.py +1860 -0
  337. agentinputlab/selectors/evaluation.py +1348 -0
  338. agentinputlab/selectors/features.py +383 -0
  339. agentinputlab/selectors/learned.py +502 -0
  340. agentinputlab/selectors/no_op.py +28 -0
  341. agentinputlab/selectors/outcome_table.py +475 -0
  342. agentinputlab/selectors/producer.py +853 -0
  343. agentinputlab/selectors/rules.py +109 -0
  344. agentinputlab/selectors/runtime.py +420 -0
  345. agentinputlab/studies/__init__.py +16 -0
  346. agentinputlab/studies/design.py +165 -0
  347. agentinputlab/studies/paired.py +322 -0
  348. agentinputlab/studio/__init__.py +6 -0
  349. agentinputlab/studio/campaigns.py +819 -0
  350. agentinputlab/studio/engine.py +1408 -0
  351. agentinputlab/studio/model_backends.py +425 -0
  352. agentinputlab/studio/prepared.py +410 -0
  353. agentinputlab/studio/server.py +613 -0
  354. agentinputlab/studio/static/app.js +397 -0
  355. agentinputlab/studio/static/campaigns.html +175 -0
  356. agentinputlab/studio/static/campaigns.js +426 -0
  357. agentinputlab/studio/static/index.html +192 -0
  358. agentinputlab/studio/static/result.html +103 -0
  359. agentinputlab/studio/static/result.js +273 -0
  360. agentinputlab/studio/static/styles.css +467 -0
  361. agentinputlab-0.1.0a1.data/data/share/agentinputlab/CITATION.cff +22 -0
  362. agentinputlab-0.1.0a1.dist-info/METADATA +392 -0
  363. agentinputlab-0.1.0a1.dist-info/RECORD +469 -0
  364. agentinputlab-0.1.0a1.dist-info/WHEEL +5 -0
  365. agentinputlab-0.1.0a1.dist-info/entry_points.txt +6 -0
  366. agentinputlab-0.1.0a1.dist-info/licenses/LICENSE +21 -0
  367. agentinputlab-0.1.0a1.dist-info/licenses/NOTICE +31 -0
  368. agentinputlab-0.1.0a1.dist-info/licenses/THIRD_PARTY_NOTICES.md +94 -0
  369. agentinputlab-0.1.0a1.dist-info/top_level.txt +2 -0
  370. workers/README.md +94 -0
  371. workers/ace/README.md +261 -0
  372. workers/ace/__init__.py +1 -0
  373. workers/ace/compatibility_manifest.json +39 -0
  374. workers/ace/driver.py +1682 -0
  375. workers/acon/README.md +215 -0
  376. workers/acon/__init__.py +5 -0
  377. workers/acon/compatibility_manifest.json +93 -0
  378. workers/acon/driver.py +1859 -0
  379. workers/acon/fitted.py +395 -0
  380. workers/acon/guideline.py +470 -0
  381. workers/acon/guideline_source_manifest.json +20 -0
  382. workers/adaptive_rag/README.md +96 -0
  383. workers/adaptive_rag/__init__.py +15 -0
  384. workers/adaptive_rag/compatibility_manifest.json +61 -0
  385. workers/adaptive_rag/driver.py +1470 -0
  386. workers/adaptive_rag/fixture_runtime.py +163 -0
  387. workers/adaptive_rag/runtime.py +252 -0
  388. workers/ask_or_assume/README.md +124 -0
  389. workers/ask_or_assume/__init__.py +1 -0
  390. workers/ask_or_assume/compatibility_manifest.json +36 -0
  391. workers/ask_or_assume/driver.py +1227 -0
  392. workers/decomp/README.md +133 -0
  393. workers/decomp/UPSTREAM_LICENSE.Apache-2.0.txt +201 -0
  394. workers/decomp/__init__.py +5 -0
  395. workers/decomp/compatibility_manifest.json +205 -0
  396. workers/decomp/driver.py +1015 -0
  397. workers/decomp/live.py +137 -0
  398. workers/decomp/runtime.py +231 -0
  399. workers/infocqr/README.md +106 -0
  400. workers/infocqr/__init__.py +1 -0
  401. workers/infocqr/compatibility_manifest.json +84 -0
  402. workers/infocqr/driver.py +1766 -0
  403. workers/ircot/README.md +167 -0
  404. workers/ircot/__init__.py +7 -0
  405. workers/ircot/compatibility_manifest.json +121 -0
  406. workers/ircot/controlled.py +457 -0
  407. workers/ircot/driver.py +1373 -0
  408. workers/ircot/fixture_bindings.json +39 -0
  409. workers/ircot/fixture_config.json +48 -0
  410. workers/ircot/fixture_prompt.txt +2 -0
  411. workers/ircot/native_qa.py +398 -0
  412. workers/ircot/qa_compatibility_manifest.json +57 -0
  413. workers/ircot/runtime.py +97 -0
  414. workers/llmcompiler/README.md +160 -0
  415. workers/llmcompiler/__init__.py +1 -0
  416. workers/llmcompiler/compatibility_manifest.json +45 -0
  417. workers/llmcompiler/driver.py +1514 -0
  418. workers/llmcompiler/export_prompts.py +74 -0
  419. workers/llmcompiler/live.py +174 -0
  420. workers/llmcompiler/patch_manifest.json +147 -0
  421. workers/mce/README.md +198 -0
  422. workers/mce/__init__.py +29 -0
  423. workers/mce/compatibility_manifest.json +115 -0
  424. workers/mce/driver.py +2585 -0
  425. workers/mce/final_eval.py +173 -0
  426. workers/official_arenas/README.md +25 -0
  427. workers/official_arenas/__init__.py +1 -0
  428. workers/official_arenas/capture_records.py +110 -0
  429. workers/official_arenas/driver.py +619 -0
  430. workers/official_arenas/protocol.py +334 -0
  431. workers/official_arenas/providers/__init__.py +1 -0
  432. workers/official_arenas/providers/_live_history.py +228 -0
  433. workers/official_arenas/providers/_message_compat.py +77 -0
  434. workers/official_arenas/providers/appworld_ul.py +196 -0
  435. workers/official_arenas/providers/fixture.py +112 -0
  436. workers/official_arenas/providers/statebench.py +960 -0
  437. workers/official_arenas/providers/tau3.py +1672 -0
  438. workers/official_arenas/providers/tau_retail.py +586 -0
  439. workers/official_arenas/providers/toolsandbox.py +1321 -0
  440. workers/official_arenas/providers/tooltalk.py +699 -0
  441. workers/official_arenas/retail_capture.py +188 -0
  442. workers/official_arenas/retail_driver.py +275 -0
  443. workers/qrag/README.md +172 -0
  444. workers/qrag/__init__.py +1 -0
  445. workers/qrag/compatibility_manifest.json +64 -0
  446. workers/qrag/driver.py +673 -0
  447. workers/r2ag/README.md +154 -0
  448. workers/r2ag/__init__.py +5 -0
  449. workers/r2ag/compatibility_manifest.json +55 -0
  450. workers/r2ag/driver.py +1287 -0
  451. workers/r2ag/feature_schema.json +8 -0
  452. workers/r2ag/runtime.py +589 -0
  453. workers/recomp/README.md +120 -0
  454. workers/recomp/__init__.py +1 -0
  455. workers/recomp/compatibility_manifest.json +43 -0
  456. workers/recomp/driver.py +1653 -0
  457. workers/reformer/README.md +125 -0
  458. workers/reformer/__init__.py +1 -0
  459. workers/reformer/compatibility_manifest.json +68 -0
  460. workers/reformer/driver.py +1459 -0
  461. workers/reformer/induction.py +457 -0
  462. workers/rrr/README.md +126 -0
  463. workers/rrr/__init__.py +1 -0
  464. workers/rrr/compatibility_manifest.json +57 -0
  465. workers/rrr/driver.py +1133 -0
  466. workers/smartsearch/README.md +331 -0
  467. workers/smartsearch/__init__.py +1 -0
  468. workers/smartsearch/compatibility_manifest.json +41 -0
  469. workers/smartsearch/driver.py +1643 -0
@@ -0,0 +1,364 @@
1
+ """Fixed retrieval and fail-closed native reward seams for SmartSearch GRPO.
2
+
3
+ This is not an arbitrary-code sandbox and does not implement a new reward.
4
+ The original pinned GRPO scorer owns all reward arithmetic. Only its helper
5
+ transport is replaced; failed requests cannot become empty positive rewards.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import ast
10
+ import hashlib
11
+ import hmac
12
+ import json
13
+ import math
14
+ import re
15
+ import string
16
+ import threading
17
+ from collections import Counter
18
+ from collections.abc import Mapping
19
+ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
20
+ from pathlib import Path
21
+ from typing import Union
22
+
23
+ from agentinputlab.contracts import BudgetExceededError, ExternalDependencyError, ValidationError
24
+ from agentinputlab.contracts.serialization import content_hash, to_jsonable
25
+ from workers.smartsearch.driver import BudgetGate, SearchRecorder
26
+
27
+ from .smartsearch_sampling import verify_smartsearch_sampling_source
28
+ from .smartsearch_teacher import SmartSearchTeacherCompletion, SmartSearchTeacherControls
29
+
30
+ SMARTSEARCH_GRPO_ENVIRONMENT = "agentinputlab:smartsearch-fixed-wikipedia-v1"
31
+ _REWARD_PATH = "src/verl/utils/reward_score/re_call.py"
32
+ _REWARD_SHA = "2697ffa7479a0c9c4e6baf843164b7055b80350c627e01413584ecf4f76476bc"
33
+
34
+
35
+ def _save(root, name, value):
36
+ # Encode before opening so serialization failures do not leave fake JSON.
37
+ encoded = json.dumps(to_jsonable(value), ensure_ascii=False, sort_keys=True, allow_nan=False)
38
+ with (root / name).open("x", encoding="utf-8") as stream:
39
+ stream.write(encoded)
40
+
41
+
42
+ def _new_output(output_root):
43
+ root = Path(output_root)
44
+ if root.is_symlink() or root.exists():
45
+ raise ValidationError("SmartSearch GRPO seam output must be create-only")
46
+ root = root.resolve(strict=False)
47
+ root.mkdir(parents=True, exist_ok=False)
48
+ return root
49
+
50
+
51
+ class SmartSearchGRPORetrievalService:
52
+ """Native /execute payload, but only one literal Wikipedia search is allowed.
53
+
54
+ The environment is a fixed identifier, never Python. Native rollout code
55
+ still formats its call; an AST allowlist parses it without exec/eval.
56
+ Each request, including repeated queries, counts separately. Any service
57
+ failure latches unhealthy: an executor must call assert_healthy before
58
+ accepting a trained checkpoint. HTTP errors are never successful retrieval.
59
+ """
60
+
61
+ def __init__(self, retriever, *, output_root, max_retrieval_calls: int):
62
+ if type(max_retrieval_calls) is not int or max_retrieval_calls < 1:
63
+ raise ValidationError("SmartSearch GRPO retrieval requires a positive request quota")
64
+ if any(not callable(getattr(retriever, name, None)) for name in ("search", "fingerprint")):
65
+ raise ValidationError("SmartSearch GRPO retrieval requires a frozen retrieval provider")
66
+ identity = to_jsonable(retriever.fingerprint())
67
+ for key in ("corpus_sha256", "index_sha256"):
68
+ digest = identity.get(key)
69
+ if not isinstance(digest, str) or not re.fullmatch("[0-9a-f]{64}", digest):
70
+ raise ValidationError("SmartSearch GRPO retrieval requires corpus/index hashes")
71
+ self.root = _new_output(output_root)
72
+ self.retriever, self.identity, self.limit = retriever, identity, max_retrieval_calls
73
+ self._lock = threading.Lock()
74
+ self.attempts = self.responses = 0
75
+ self.failed = False
76
+ _save(self.root, "claim.json", {"retrieval": identity, "max_retrieval_calls": self.limit,
77
+ "environment": SMARTSEARCH_GRPO_ENVIRONMENT, "arbitrary_code_execution": False})
78
+
79
+ @staticmethod
80
+ def _query(body):
81
+ if not isinstance(body, dict) or set(body) != {"env", "call"} or (
82
+ body["env"] != SMARTSEARCH_GRPO_ENVIRONMENT
83
+ ) or not isinstance(body["call"], str) or len(body["call"].encode()) > 8192:
84
+ raise ValidationError("SmartSearch GRPO requires its fixed environment and one bounded search call")
85
+ try:
86
+ call = ast.parse(body["call"], mode="eval").body
87
+ except (SyntaxError, ValueError, RecursionError) as exc:
88
+ raise ValidationError("SmartSearch GRPO search call is not a literal expression") from exc
89
+ if not isinstance(call, ast.Call) or not isinstance(call.func, ast.Name) or (
90
+ call.func.id != "wikipedia_search" or call.args or len(call.keywords) != 2
91
+ ) or {kw.arg for kw in call.keywords} != {"query", "top_n"} or any(
92
+ not isinstance(kw.value, ast.Constant) for kw in call.keywords
93
+ ):
94
+ raise ValidationError("Only wikipedia_search(query=<string>, top_n=5) is supported")
95
+ values = {kw.arg: kw.value.value for kw in call.keywords}
96
+ query = values["query"]
97
+ if not isinstance(query, str) or not query.strip() or len(query.encode()) > 4096 or (
98
+ type(values["top_n"]) is not int or values["top_n"] != 5
99
+ ):
100
+ raise ValidationError("SmartSearch GRPO search requires a nonempty bounded query and top_n=5")
101
+ return query
102
+
103
+ def execute(self, body):
104
+ try:
105
+ query = self._query(body) # Rejected syntax does not consume a retrieval.
106
+ except ValidationError:
107
+ self.reject_transport("invalid_native_request")
108
+ raise
109
+ with self._lock:
110
+ if self.failed:
111
+ raise ExternalDependencyError("SmartSearch GRPO retrieval has a retained failure; no automatic retry")
112
+ if self.attempts >= self.limit:
113
+ self.failed = True
114
+ raise BudgetExceededError("SmartSearch GRPO retrieval request quota exhausted")
115
+ if to_jsonable(self.retriever.fingerprint()) != self.identity:
116
+ self.failed = True
117
+ raise ExternalDependencyError("SmartSearch GRPO retrieval identity changed")
118
+ self.attempts += 1
119
+ number = self.attempts
120
+ _save(self.root, f"request-{number:06d}.json", body)
121
+ try:
122
+ recorder = SearchRecorder(self.retriever, BudgetGate({"retrieval_calls": 1}), self.identity)
123
+ recorder.execute([query])
124
+ if to_jsonable(self.retriever.fingerprint()) != self.identity:
125
+ raise ExternalDependencyError("SmartSearch GRPO retrieval identity changed during search")
126
+ result = {"result": "\n\n".join(row["text"] for row in recorder.evidence),
127
+ "output": "", "error": ""}
128
+ _save(self.root, f"response-{number:06d}.json", {
129
+ "native_response": result, "trajectory": recorder.trajectory, "evidence": recorder.evidence})
130
+ self.responses += 1
131
+ return result
132
+ except Exception as exc:
133
+ self.failed = True
134
+ _save(self.root, f"failed-{number:06d}.json", {"error_type": type(exc).__name__,
135
+ "error": str(exc), "attempt_consumed": True, "no_automatic_retry": True})
136
+ raise
137
+
138
+ def reject_transport(self, code):
139
+ """An authenticated failed native request invalidates this training run."""
140
+ with self._lock:
141
+ if not self.failed:
142
+ self.failed = True
143
+ _save(self.root, "transport-rejected.json", {
144
+ "code": code, "retrieval_attempt_consumed": False,
145
+ "no_automatic_retry": True, "accept_checkpoint": False})
146
+
147
+ def assert_healthy(self):
148
+ with self._lock:
149
+ if self.failed or self.responses != self.attempts:
150
+ raise ExternalDependencyError("SmartSearch GRPO retrieval has an unresolved/failed request")
151
+ return {"retrieval_attempts": self.attempts, "retrieval_responses": self.responses,
152
+ "retrieval_identity_sha256": content_hash(self.identity)}
153
+
154
+
155
+ def make_smartsearch_grpo_retrieval_server(service, *, capability: str, port: int = 0):
156
+ """Loopback-only, ephemeral-port service compatible with native /execute.
157
+
158
+ Set native sandbox_url to http://127.0.0.1:<port>/<capability>. The random
159
+ operator capability belongs in private run config, not a published log.
160
+ No bearer-header modification to upstream is necessary. Route/error/body
161
+ limits apply before retrieval; server.close does not cancel scientific work.
162
+ """
163
+ if not isinstance(service, SmartSearchGRPORetrievalService) or not isinstance(capability, str) or (
164
+ not re.fullmatch(r"[A-Za-z0-9_-]{32,128}", capability)
165
+ ):
166
+ raise ValidationError("SmartSearch GRPO server requires a fixed service and random ASCII capability")
167
+ if type(port) is not int or not 0 <= port <= 65535:
168
+ raise ValidationError("SmartSearch GRPO server port is invalid")
169
+ capacity = threading.BoundedSemaphore(8)
170
+
171
+ class Handler(BaseHTTPRequestHandler):
172
+ def setup(self):
173
+ super().setup()
174
+ self.connection.settimeout(10)
175
+
176
+ def log_message(self, *_args):
177
+ pass
178
+
179
+ def send_json(self, status, body):
180
+ data = json.dumps(body, allow_nan=False).encode()
181
+ self.send_response(status)
182
+ self.send_header("Content-Type", "application/json")
183
+ self.send_header("Content-Length", str(len(data)))
184
+ self.send_header("Cache-Control", "no-store")
185
+ self.send_header("X-Content-Type-Options", "nosniff")
186
+ self.end_headers()
187
+ self.wfile.write(data)
188
+
189
+ def error(self, status, code):
190
+ if getattr(self, "authenticated", False):
191
+ service.reject_transport("http_" + code)
192
+ self.send_json(status, {"error": {"code": code, "message": "Training tool request rejected"}})
193
+
194
+ def do_POST(self):
195
+ parts = self.path.split("/")
196
+ if len(parts) != 3 or not hmac.compare_digest(parts[1].encode(), capability.encode()):
197
+ self.error(401, "unauthorized")
198
+ return
199
+ self.authenticated = True
200
+ if parts[2] != "execute":
201
+ self.error(404, "not_found")
202
+ return
203
+ lengths = self.headers.get_all("Content-Length", [])
204
+ if self.headers.get("Transfer-Encoding") or len(lengths) != 1 or not lengths[0].isdigit():
205
+ self.error(400, "invalid_body")
206
+ return
207
+ length = int(lengths[0])
208
+ if not 0 < length <= 16384:
209
+ self.error(413, "body_size")
210
+ return
211
+ if self.headers.get_content_type() != "application/json":
212
+ self.error(415, "content_type")
213
+ return
214
+ if not capacity.acquire(blocking=False):
215
+ self.error(429, "busy")
216
+ return
217
+ try:
218
+ def unique(pairs):
219
+ value = {}
220
+ for key, item in pairs:
221
+ if key in value:
222
+ raise ValueError("Duplicate JSON key")
223
+ value[key] = item
224
+ return value
225
+
226
+ body = json.loads(self.rfile.read(length), object_pairs_hook=unique,
227
+ parse_constant=lambda _: (_ for _ in ()).throw(ValueError()))
228
+ result = service.execute(body)
229
+ self.send_json(200, result)
230
+ except (ValueError, UnicodeDecodeError, RecursionError):
231
+ self.error(400, "invalid_request")
232
+ except BudgetExceededError:
233
+ self.error(429, "quota_exhausted")
234
+ except Exception:
235
+ self.error(502, "retrieval_failed")
236
+ finally:
237
+ capacity.release()
238
+
239
+ return ThreadingHTTPServer(("127.0.0.1", port), Handler)
240
+
241
+
242
+ class SmartSearchNativeGRPOReward:
243
+ """Call the original reward math with a metered, non-retrying helper.
244
+
245
+ References are explicit TRAIN-only inputs to this instance, never rollout
246
+ prompts. Validation requires a separate scoring instance with its own
247
+ development references/cost ledger; neither instance accepts arbitrary
248
+ test references. The native scorer receives unchanged solution/ground truth.
249
+ Quotas are per instance/process; an execution coordinator must account for
250
+ every rank/helper, not multiply an instance's allowance implicitly.
251
+ """
252
+
253
+ def __init__(self, generate, *, checkout, references: Mapping,
254
+ model_fingerprint_sha256: str, controls: SmartSearchTeacherControls,
255
+ output_root, reference_split: str = "train"):
256
+ if reference_split not in {"train", "validation"} or not callable(generate) or (
257
+ not isinstance(controls, SmartSearchTeacherControls)
258
+ ) or not isinstance(references, Mapping) or not references:
259
+ raise ValidationError("SmartSearch GRPO reward requires explicit training/development reference controls")
260
+ clean = {}
261
+ for question, answers in references.items():
262
+ if not isinstance(question, str) or not question.strip() or not isinstance(answers, (list, tuple)) or (
263
+ not answers or any(not isinstance(a, str) or not a.strip() for a in answers)
264
+ ):
265
+ raise ValidationError("SmartSearch GRPO reference question/answer collection is invalid")
266
+ # The pinned scorer extracts the user's question with .strip().
267
+ # Match that reference key only; do not rewrite rollout/data text.
268
+ key = question.strip()
269
+ if key in clean:
270
+ raise ValidationError("SmartSearch GRPO reference questions collide after native whitespace extraction")
271
+ clean[key] = tuple(answers)
272
+ SmartSearchTeacherCompletion("", 0, 0, model_fingerprint_sha256)
273
+ source, binding = verify_smartsearch_sampling_source(checkout)
274
+ path = source / _REWARD_PATH
275
+ raw = path.read_bytes()
276
+ if hashlib.sha256(raw).hexdigest() != _REWARD_SHA:
277
+ raise ExternalDependencyError("SmartSearch native GRPO reward source changed")
278
+ self.source_path, self.source_sha = path, _REWARD_SHA
279
+ output = Path(output_root).resolve(strict=False)
280
+ if output.is_relative_to(source) or source.is_relative_to(output):
281
+ raise ValidationError("SmartSearch GRPO reward output must not overlap native source")
282
+ self.root = _new_output(output_root)
283
+ self.generate, self.controls = generate, controls
284
+ self.references, self.split = clean, reference_split
285
+ self.fingerprint = model_fingerprint_sha256
286
+ self._lock = threading.Lock()
287
+ self.failed = False
288
+ self.usage = {"score_attempts": 0, "score_responses": 0, "model_attempts": 0,
289
+ "model_responses": 0, "input_tokens": 0, "output_tokens": 0,
290
+ "unknown_output_token_reservations": 0}
291
+ tree = ast.parse(raw)
292
+ functions = [node for node in tree.body if isinstance(node, ast.FunctionDef) and node.name != "generate_response"]
293
+ namespace = {"re": re, "string": string, "Counter": Counter, "Union": Union, "List": list,
294
+ "generate_response": self._complete}
295
+ exec(compile(ast.Module(body=functions, type_ignores=[]), str(path), "exec"), namespace)
296
+ self._score = namespace["compute_score_with_format"]
297
+ _save(self.root, "claim.json", {"source": binding, "native_reward_sha256": _REWARD_SHA,
298
+ "reference_split": reference_split, "references_sha256": content_hash(clean),
299
+ "model_fingerprint_sha256": self.fingerprint, "controls": controls,
300
+ "native_reward_math_changed": False, "failed_http_empty_fallback_disabled": True,
301
+ "neural_optimizer_started": False})
302
+
303
+ def _complete(self, prompt):
304
+ usage, controls, cap = self.usage, self.controls, 2048
305
+ if usage["model_attempts"] >= controls.max_model_calls or (
306
+ usage["output_tokens"] + usage["unknown_output_token_reservations"] + cap > controls.max_total_output_tokens
307
+ ):
308
+ raise BudgetExceededError("SmartSearch GRPO helper cannot admit its native2048-token cap")
309
+ usage["model_attempts"] += 1
310
+ usage["unknown_output_token_reservations"] += cap
311
+ number = usage["model_attempts"]
312
+ _save(self.root, f"helper-{number:06d}-request.json", {"prompt": prompt, "temperature": .6,
313
+ "max_new_tokens": cap, "stop": ["</answer>"], "seed": controls.seed,
314
+ "reference_split": self.split})
315
+ result = self.generate(prompt, temperature=.6, max_new_tokens=cap, stop=("</answer>",), seed=controls.seed)
316
+ if not isinstance(result, SmartSearchTeacherCompletion):
317
+ raise ExternalDependencyError("SmartSearch GRPO helper requires typed measured usage")
318
+ usage["model_responses"] += 1
319
+ usage["input_tokens"] += result.input_tokens
320
+ usage["output_tokens"] += result.output_tokens
321
+ usage["unknown_output_token_reservations"] -= cap
322
+ _save(self.root, f"helper-{number:06d}-response.json", result)
323
+ if result.model_fingerprint_sha256 != self.fingerprint:
324
+ raise ExternalDependencyError("SmartSearch GRPO helper model identity changed")
325
+ if result.output_tokens > cap:
326
+ raise BudgetExceededError("SmartSearch GRPO helper exceeded the original per-call cap")
327
+ if not result.text.strip():
328
+ raise ExternalDependencyError("SmartSearch GRPO helper returned empty text; no positive reward fabricated")
329
+ return result.text + "</answer>" # Exact native GRPO helper append, unlike SFT process teacher.
330
+
331
+ def __call__(self, tokenizer, solution_str, ground_truth):
332
+ if not isinstance(solution_str, str) or len(solution_str.encode()) > self.controls.max_input_bytes:
333
+ raise ValidationError("SmartSearch GRPO reward solution exceeds its explicit input bound")
334
+ match = re.search(r'<\|im_start\|>user\n(.*?)<\|im_end\|>', solution_str, re.DOTALL)
335
+ answers = (ground_truth,) if isinstance(ground_truth, str) else tuple(ground_truth) if isinstance(ground_truth, (list, tuple)) else ()
336
+ if match is None or self.references.get(match.group(1).strip()) != answers:
337
+ raise ValidationError("SmartSearch GRPO reward references differ from the declared split")
338
+ ground_truth = to_jsonable(ground_truth)
339
+ with self._lock:
340
+ if self.failed:
341
+ raise ExternalDependencyError("SmartSearch GRPO reward has a retained failure; no retry")
342
+ if self.usage["score_attempts"] >= self.controls.max_rollout_rows:
343
+ raise BudgetExceededError("SmartSearch GRPO reward score quota exhausted")
344
+ self.usage["score_attempts"] += 1
345
+ number = self.usage["score_attempts"]
346
+ _save(self.root, f"score-{number:06d}-request.json", {
347
+ "solution_str": solution_str, "ground_truth": ground_truth, "reference_split": self.split})
348
+ try:
349
+ if hashlib.sha256(self.source_path.read_bytes()).hexdigest() != self.source_sha:
350
+ raise ExternalDependencyError("SmartSearch GRPO native reward source changed")
351
+ score = self._score(tokenizer, solution_str, ground_truth)
352
+ if hashlib.sha256(self.source_path.read_bytes()).hexdigest() != self.source_sha:
353
+ raise ExternalDependencyError("SmartSearch GRPO native reward source changed during scoring")
354
+ if isinstance(score, bool) or not isinstance(score, (float, int)) or not math.isfinite(score):
355
+ raise ExternalDependencyError("SmartSearch GRPO native scorer returned a nonfinite reward")
356
+ self.usage["score_responses"] += 1
357
+ _save(self.root, f"score-{number:06d}-response.json", {"reward": score, "usage": self.usage})
358
+ return score
359
+ except Exception as exc:
360
+ self.failed = True
361
+ _save(self.root, f"score-{number:06d}-failed.json", {
362
+ "error_type": type(exc).__name__, "error": str(exc), "usage": self.usage,
363
+ "no_automatic_retry": True, "native_reward_math_changed": False})
364
+ raise