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,232 @@
1
+ """Pinned native SmartSearch policy sampling for curriculum training data.
2
+
3
+ ReCall.run/run_prefix, raw prompts and answer/F1 parsers stay upstream-owned.
4
+ Only model transport and the fixed Wikipedia-search seam are supplied by the
5
+ operator. No arbitrary Python sandbox or whole-trajectory retry is exposed.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import ast
10
+ import json
11
+ import re
12
+ import string
13
+ from collections import Counter
14
+ from collections.abc import Mapping, Sequence
15
+ from dataclasses import dataclass
16
+ from pathlib import Path
17
+ from types import SimpleNamespace
18
+
19
+ from agentinputlab.contracts import BudgetExceededError, ExternalDependencyError, ValidationError
20
+ from agentinputlab.contracts.serialization import content_hash, to_jsonable
21
+ from workers.smartsearch.driver import (
22
+ BudgetGate,
23
+ ModelTurn,
24
+ SearchRecorder,
25
+ SmartSearchDriver,
26
+ _completion_stop,
27
+ )
28
+
29
+ from .qrag import _file, _sha
30
+ from .smartsearch import SMARTSEARCH_TOOL_SCHEMA
31
+ from .smartsearch_curriculum import SmartSearchTrainingCase, verify_smartsearch_preparation_source
32
+
33
+ _SOURCE = {
34
+ "src/re_call/inference/re_call.py": "7d3c680cfa0186397c2970d1073d75ab2e587330ce107fdf632827b7857572ec",
35
+ "src/flashrag/pipeline/active_pipeline.py": "20394e3418b6e30b43057ca96b97a423b4e4d37a3a04901e0a0a0dbc3af221fa",
36
+ "src/verl/utils/reward_score/re_call.py": "2697ffa7479a0c9c4e6baf843164b7055b80350c627e01413584ecf4f76476bc",
37
+ "src/flashrag/evaluator/metrics.py": "2fe5c0a592effb9d89e2704387e2b146d45c70e0ce9484d6e67bbb08664db098",
38
+ "src/flashrag/evaluator/utils.py": "d7939725bf0dc4d7d0d425fabb4334ea31c469798ca1b2b794a3504788f27033",
39
+ }
40
+
41
+
42
+ @dataclass(frozen=True, slots=True)
43
+ class SmartSearchSamplingControls:
44
+ seed: int = 17
45
+ max_model_calls: int = 10
46
+ max_output_tokens: int = 81920
47
+ max_input_tokens: int = 262144
48
+ max_retrieval_calls: int = 10
49
+
50
+ def __post_init__(self):
51
+ for name in ("seed", "max_model_calls", "max_output_tokens", "max_input_tokens", "max_retrieval_calls"):
52
+ value = getattr(self, name)
53
+ if type(value) is not int or value < (0 if name == "seed" else 1):
54
+ raise ValidationError("SmartSearch sampling controls require positive integer bounds")
55
+ if self.max_model_calls > 10 or self.max_retrieval_calls > 10:
56
+ raise ValidationError("SmartSearch native policy loop is at most ten model/search turns")
57
+
58
+
59
+ def verify_smartsearch_sampling_source(checkout):
60
+ binding = dict(verify_smartsearch_preparation_source(checkout))
61
+ root = Path(binding["root"])
62
+ for relative, expected in _SOURCE.items():
63
+ path = _file(root / relative, "SmartSearch native sampling source")
64
+ if not path.is_relative_to(root) or _sha(path) != expected:
65
+ raise ExternalDependencyError("SmartSearch native sampling/parser source changed")
66
+ binding["sampling_source"] = dict(_SOURCE)
67
+ return root, binding
68
+
69
+
70
+ def _native_surface(root, binding):
71
+ # Reuse the existing verified-source loader, NOT the frozen-3B profile or
72
+ # its immutable model identity. No inference manifest is weakened.
73
+ loader = SimpleNamespace(checkout=root, manifest_sha256=content_hash(binding))
74
+ recall, parse_answer = SmartSearchDriver._load_upstream_surface(loader)
75
+ try:
76
+ import jieba
77
+ import langid
78
+ except ImportError as exc:
79
+ raise ExternalDependencyError("Install agentinputlab[smartsearch-sample] for the native multilingual F1 parser") from exc
80
+ namespace = {"re": re, "string": string, "Counter": Counter, "langid": langid, "jieba": jieba}
81
+ utils = ast.parse((root / "src/flashrag/evaluator/utils.py").read_text())
82
+ normalize = next(n for n in utils.body if isinstance(n, ast.FunctionDef) and n.name == "normalize_answer")
83
+ metrics = ast.parse((root / "src/flashrag/evaluator/metrics.py").read_text())
84
+ owner = next(n for n in metrics.body if isinstance(n, ast.ClassDef) and n.name == "F1_Score")
85
+ score = next(n for n in owner.body if isinstance(n, ast.FunctionDef) and n.name == "token_level_scores")
86
+ tree = ast.Module(body=[normalize, score], type_ignores=[])
87
+ exec(compile(tree, str(root / "src/flashrag/evaluator/metrics.py"), "exec"), namespace)
88
+ return recall, parse_answer, loader._upstream_module, namespace["token_level_scores"]
89
+
90
+
91
+ class SmartSearchPolicySampler:
92
+ """Generate new native trajectories, then score against training references.
93
+
94
+ Model: fingerprint(), count_prompt_tokens(prompt), generate(prompt,
95
+ temperature=..., max_new_tokens=..., stop=tuple(...), seed=...) -> ModelTurn.
96
+ Retriever: fingerprint(), search(query, top_n=5) -> native id/contents/score
97
+ records. Its corpus_sha256/index_sha256 must identify a frozen real closure.
98
+ Source native8192/turn and ten-turn limits are separately metered TRAINING
99
+ costs, not a successful512/4096 test-budget claim. References reach only
100
+ the scorer after generation, never the provider, tool or raw prompt.
101
+ """
102
+
103
+ def __init__(self, model, retriever, *, controls=None):
104
+ self.controls = SmartSearchSamplingControls(**controls) if isinstance(controls, Mapping) else controls or SmartSearchSamplingControls()
105
+ if not isinstance(self.controls, SmartSearchSamplingControls):
106
+ raise ValidationError("SmartSearch policy sampler requires typed controls")
107
+ for value, methods in ((model, ("fingerprint", "count_prompt_tokens", "generate")),
108
+ (retriever, ("fingerprint", "search"))):
109
+ if any(not callable(getattr(value, name, None)) for name in methods):
110
+ raise ValidationError("SmartSearch sampling runtime lacks an explicit native transport seam")
111
+ self.model, self.retriever = model, retriever
112
+
113
+ def sample(
114
+ self, *, checkout, case: SmartSearchTrainingCase, golden_answers: Sequence[str],
115
+ output_root, prefix: str | None = None, prefix_provenance: Mapping | None = None,
116
+ ):
117
+ if not isinstance(case, SmartSearchTrainingCase) or case.split not in {"train", "validation"}:
118
+ raise ValidationError("SmartSearch policy construction samples only declared train/development cases")
119
+ if not isinstance(golden_answers, (tuple, list)) or not golden_answers or any(
120
+ not isinstance(a, str) or not a.strip() for a in golden_answers
121
+ ):
122
+ raise ValidationError("SmartSearch native post-generation scoring requires real reference answers")
123
+ if prefix is not None and (not isinstance(prefix, str) or not prefix.strip() or not prefix_provenance):
124
+ raise ValidationError("SmartSearch prefix regeneration requires a nonempty native prefix and provenance")
125
+ source, binding = verify_smartsearch_sampling_source(checkout)
126
+ recall, parser, module, scorer = _native_surface(source, binding)
127
+ model_identity = to_jsonable(self.model.fingerprint())
128
+ retrieval_identity = to_jsonable(self.retriever.fingerprint())
129
+ for key in ("corpus_sha256", "index_sha256"):
130
+ digest = retrieval_identity.get(key)
131
+ if not isinstance(digest, str) or len(digest) != 64 or set(digest) - set("0123456789abcdef"):
132
+ raise ValidationError("SmartSearch training retrieval requires frozen corpus/index hashes")
133
+ root = Path(output_root)
134
+ if root.exists() or root.is_symlink():
135
+ raise ValidationError("SmartSearch sampling output must be create-only; no automatic retry")
136
+ root = root.resolve(strict=False)
137
+ if root.is_relative_to(source) or source.is_relative_to(root):
138
+ raise ValidationError("SmartSearch sampling output must not overlap native source")
139
+ root.mkdir(parents=True, exist_ok=False)
140
+
141
+ def save(name, value):
142
+ with (root / name).open("x", encoding="utf-8") as stream:
143
+ json.dump(to_jsonable(value), stream, ensure_ascii=False, sort_keys=True, allow_nan=False)
144
+
145
+ save("claim.json", {"case": case, "source": binding, "controls": self.controls,
146
+ "model": model_identity, "retrieval": retrieval_identity,
147
+ "golden_answers_sha256": content_hash(golden_answers),
148
+ "prefix_sha256": content_hash(prefix), "prefix_provenance": prefix_provenance,
149
+ "training_only": True, "no_automatic_retry": True})
150
+ gate = BudgetGate({"model_calls": self.controls.max_model_calls,
151
+ "output_tokens": self.controls.max_output_tokens,
152
+ "retrieval_calls": self.controls.max_retrieval_calls,
153
+ "context_tokens": self.controls.max_input_tokens})
154
+ recorder = SearchRecorder(self.retriever, gate, retrieval_identity)
155
+ responses = 0
156
+
157
+ class ModelSeam:
158
+ def post(seam, url, json):
159
+ nonlocal responses
160
+ sampling = json.get("sampling_params")
161
+ stops = ["</search>"] if prefix is not None else ["</search>", "</answer>"]
162
+ if url != "agentinputlab://model/generate" or sampling != {
163
+ "temperature": 0.0, "max_new_tokens": 8192, "stop": stops,
164
+ } or set(json) != {"text", "sampling_params"}:
165
+ raise ExternalDependencyError("SmartSearch native sampling transport contract changed")
166
+ if to_jsonable(self.model.fingerprint()) != model_identity:
167
+ raise ExternalDependencyError("SmartSearch sampled model identity changed")
168
+ prompt = json["text"]
169
+ admitted = self.model.count_prompt_tokens(prompt)
170
+ if type(admitted) is not int or admitted < 1:
171
+ raise ValidationError("SmartSearch sampling needs exact tokenizer admission")
172
+ if gate.usage.output_tokens + 8192 > self.controls.max_output_tokens:
173
+ raise BudgetExceededError("SmartSearch sampling cannot admit the original8192 token cap")
174
+ gate.before_model(admitted)
175
+ number = gate.usage.model_calls
176
+ save(f"call-{number:04d}-request.json", {"prompt": prompt, **sampling, "seed": self.controls.seed})
177
+ turn = self.model.generate(prompt, temperature=0.0, max_new_tokens=8192,
178
+ stop=tuple(stops), seed=self.controls.seed)
179
+ if not isinstance(turn, ModelTurn) or any(type(n) is not int or n < 0 for n in (turn.input_tokens, turn.output_tokens)):
180
+ raise ExternalDependencyError("SmartSearch sampled completion lacks typed measured usage")
181
+ save(f"call-{number:04d}-response.json", turn)
182
+ responses += 1
183
+ gate.after_model(turn.input_tokens, turn.output_tokens, admitted_input_tokens=admitted)
184
+ if turn.output_tokens > 8192:
185
+ raise BudgetExceededError("SmartSearch sampler model exceeded native per-call cap")
186
+ if to_jsonable(self.model.fingerprint()) != model_identity:
187
+ raise ExternalDependencyError("SmartSearch sampled model identity changed during generation")
188
+ text, matched = _completion_stop(turn.text, {"finish_reason": turn.finish_reason, "stop_reason": turn.matched})
189
+ return SimpleNamespace(json=lambda: {"text": text,
190
+ "meta_info": {"finish_reason": {"type": turn.finish_reason, "matched": matched}}})
191
+
192
+ class FixedToolReCall(recall):
193
+ def execute_tool_calls(agent, env, tool_calls):
194
+ if env != "agentinputlab:no-exec" or to_jsonable(self.retriever.fingerprint()) != retrieval_identity:
195
+ raise ExternalDependencyError("SmartSearch training fixed retrieval identity changed")
196
+ result = recorder.execute(tool_calls)
197
+ if to_jsonable(self.retriever.fingerprint()) != retrieval_identity:
198
+ raise ExternalDependencyError("SmartSearch training retrieval identity changed during search")
199
+ return result
200
+
201
+ try:
202
+ module.requests = ModelSeam()
203
+ agent = FixedToolReCall("agentinputlab://model", "agentinputlab://disabled-executor")
204
+ arguments = (agent, "agentinputlab:no-exec", json.dumps(to_jsonable(SMARTSEARCH_TOOL_SCHEMA)), case.question)
205
+ transcript = recall.run.__wrapped__(*arguments) if prefix is None else recall.run_prefix.__wrapped__(*arguments, prefix)
206
+ prediction = parser(transcript)
207
+ metrics = scorer(None, prediction, list(golden_answers))
208
+ for relative, expected in _SOURCE.items():
209
+ if _sha(_file(source / relative, "sampling source")) != expected:
210
+ raise ExternalDependencyError("SmartSearch sampling source changed during execution")
211
+ row = {"question": case.question, "golden_answers": list(golden_answers),
212
+ "output": {"final_response": transcript, "pred": prediction, "metric_score": metrics}}
213
+ save("rollout.json", row)
214
+ manifest = {"case_id": case.case_id, "split": case.split, "source": binding,
215
+ "model": model_identity, "retrieval": retrieval_identity,
216
+ "usage": gate.usage.as_mapping(), "model_responses": responses,
217
+ "unknown_output_token_reservations": 0,
218
+ "rollout_sha256": _sha(root / "rollout.json"),
219
+ "trajectory": recorder.trajectory, "evidence": recorder.evidence,
220
+ "prefix_provenance": prefix_provenance, "seed_adapter": self.controls.seed,
221
+ "native_loop_prompt_parser_scorer_called": True,
222
+ "unsafe_sandbox_used": False, "neural_training_performed": False,
223
+ "scored_is_not_correctness_or_full_curriculum_success": True}
224
+ save("manifest.json", manifest)
225
+ return manifest
226
+ except Exception as exc:
227
+ save("failed.json", {"error_type": type(exc).__name__, "error": str(exc),
228
+ "usage": gate.usage.as_mapping(), "model_responses": responses,
229
+ "unknown_output_token_reservations": (gate.usage.model_calls - responses) * 8192,
230
+ "trajectory": recorder.trajectory, "evidence": recorder.evidence,
231
+ "no_automatic_retry": True})
232
+ raise
@@ -0,0 +1,203 @@
1
+ """Native SmartSearch training-only process rewards and query refinement.
2
+
3
+ The pinned upstream prompts, fourth-think selection, parser and redundancy
4
+ rules run unchanged. Only the HTTP method is replaced by an operator-supplied,
5
+ metered completion provider. No generated code or upstream sandbox is run.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import contextlib
10
+ import hashlib
11
+ import io
12
+ import json
13
+ import math
14
+ from collections.abc import Callable, Mapping, Sequence
15
+ from dataclasses import dataclass
16
+ from pathlib import Path
17
+ from typing import Any
18
+
19
+ from agentinputlab.contracts import BudgetExceededError, ExternalDependencyError, ValidationError
20
+ from agentinputlab.contracts.serialization import content_hash, freeze_mapping, to_jsonable
21
+
22
+ from .smartsearch_curriculum import (
23
+ SmartSearchTrainingCase,
24
+ _native_converter,
25
+ validate_smartsearch_training_splits,
26
+ verify_smartsearch_preparation_source,
27
+ )
28
+
29
+
30
+ @dataclass(frozen=True, slots=True)
31
+ class SmartSearchTeacherCompletion:
32
+ text: str
33
+ input_tokens: int
34
+ output_tokens: int
35
+ model_fingerprint_sha256: str
36
+
37
+ def __post_init__(self) -> None:
38
+ if not isinstance(self.text, str) or any(
39
+ type(n) is not int or n < 0 for n in (self.input_tokens, self.output_tokens)
40
+ ):
41
+ raise ValidationError("SmartSearch teacher completion requires measured token counts")
42
+ digest = self.model_fingerprint_sha256
43
+ if not isinstance(digest, str) or len(digest) != 64 or set(digest) - set("0123456789abcdef"):
44
+ raise ValidationError("SmartSearch teacher model identity must be a SHA-256 digest")
45
+
46
+
47
+ @dataclass(frozen=True, slots=True)
48
+ class SmartSearchTeacherControls:
49
+ max_model_calls: int = 8
50
+ max_total_output_tokens: int = 4096
51
+ max_rollout_rows: int = 1000
52
+ max_input_bytes: int = 16 * 1024 * 1024
53
+ seed: int = 17
54
+
55
+ def __post_init__(self) -> None:
56
+ if any(type(n) is not int or n < 1 for n in (
57
+ self.max_model_calls, self.max_total_output_tokens, self.max_rollout_rows,
58
+ self.max_input_bytes,
59
+ )) or type(self.seed) is not int or self.seed < 0:
60
+ raise ValidationError("SmartSearch teacher controls must be positive integer limits")
61
+
62
+
63
+ class SmartSearchProcessTeacher:
64
+ """Annotate real training rollouts before native SFT/DPO conversion.
65
+
66
+ ``generate`` receives the exact native raw prompt, temperature0.6,
67
+ max_new_tokens2048 and native stop list, plus the explicit operator seed.
68
+ This is a separately metered TRAINING helper, not a 512-token test call.
69
+ Budget shortage fails before a call rather than silently shrinking2048.
70
+ Provider exceptions consume an unknown-usage reservation and stop the stage;
71
+ neither the upstream empty-string fallback nor an automatic retry is used.
72
+ """
73
+
74
+ def __init__(
75
+ self, generate: Callable[..., SmartSearchTeacherCompletion], *,
76
+ model_fingerprint_sha256: str,
77
+ controls: SmartSearchTeacherControls | None = None,
78
+ ) -> None:
79
+ if not callable(generate):
80
+ raise ValidationError("SmartSearch teacher requires a completion provider")
81
+ SmartSearchTeacherCompletion("", 0, 0, model_fingerprint_sha256)
82
+ self.generate = generate
83
+ self.model_fingerprint_sha256 = model_fingerprint_sha256
84
+ self.controls = controls or SmartSearchTeacherControls()
85
+
86
+ def annotate(
87
+ self, *, checkout: str | Path, output_root: str | Path,
88
+ train: Sequence[SmartSearchTrainingCase], validation: Sequence[SmartSearchTrainingCase],
89
+ sampled_rollouts: Sequence[Mapping[str, Any]],
90
+ rollout_provenance: Mapping[str, Any],
91
+ test: Sequence[SmartSearchTrainingCase] = (), refine: bool = True,
92
+ ) -> Mapping[str, Any]:
93
+ audit = validate_smartsearch_training_splits(train, validation, test)
94
+ if type(refine) is not bool or not isinstance(rollout_provenance, Mapping) or not rollout_provenance:
95
+ raise ValidationError("SmartSearch teacher needs explicit rollout provenance/refinement choice")
96
+ if not isinstance(sampled_rollouts, (list, tuple)) or not sampled_rollouts or (
97
+ len(sampled_rollouts) > self.controls.max_rollout_rows
98
+ ):
99
+ raise ValidationError("SmartSearch teacher rollout count exceeds its bound")
100
+ allowed = {case.question for case in train}
101
+ for row in sampled_rollouts:
102
+ if not isinstance(row, Mapping) or row.get("question") not in allowed:
103
+ raise ValidationError("SmartSearch teacher may only label training questions")
104
+ answers, output = row.get("golden_answers"), row.get("output")
105
+ if not isinstance(answers, (list, tuple)) or not answers or any(
106
+ not isinstance(a, str) or not a.strip() for a in answers
107
+ ) or not isinstance(output, Mapping) or not isinstance(output.get("final_response"), str):
108
+ raise ValidationError("SmartSearch teacher needs native sampled rollout fields")
109
+ metric = output.get("metric_score")
110
+ score = metric.get("f1") if isinstance(metric, Mapping) else None
111
+ if isinstance(score, bool) or not isinstance(score, (int, float)) or not math.isfinite(score) or not 0 <= score <= 1:
112
+ raise ValidationError("SmartSearch teacher requires a measured native outcome F1")
113
+ if "pred" not in output:
114
+ raise ValidationError("SmartSearch teacher needs the recorded native prediction")
115
+ inputs = {"rollouts": to_jsonable(sampled_rollouts),
116
+ "producer_provenance": to_jsonable(rollout_provenance)}
117
+ encoded = json.dumps(inputs, allow_nan=False, ensure_ascii=False).encode()
118
+ if len(encoded) > self.controls.max_input_bytes:
119
+ raise ValidationError("SmartSearch teacher input exceeds its byte bound")
120
+ rows = json.loads(encoded)["rollouts"]
121
+ source = verify_smartsearch_preparation_source(checkout, include_teacher=True)
122
+ source_root = Path(source["root"])
123
+ root = Path(output_root)
124
+ if root.is_symlink() or root.exists():
125
+ raise ValidationError("SmartSearch teacher output must be create-only")
126
+ root = root.resolve(strict=False)
127
+ if root.is_relative_to(source_root) or source_root.is_relative_to(root):
128
+ raise ValidationError("SmartSearch teacher output must not overlap native source")
129
+ root.mkdir(parents=True, exist_ok=False)
130
+
131
+ def save(name: str, value: Any) -> None:
132
+ with (root / name).open("x", encoding="utf-8") as stream:
133
+ json.dump(to_jsonable(value), stream, ensure_ascii=False, sort_keys=True, allow_nan=False)
134
+
135
+ usage = {"model_attempts": 0, "model_responses": 0, "input_tokens": 0,
136
+ "output_tokens": 0, "unknown_output_token_reservations": 0}
137
+ save("claim.json", {"source": source, "split_audit": audit,
138
+ "input_sha256": content_hash(inputs), "controls": self.controls,
139
+ "model_fingerprint_sha256": self.model_fingerprint_sha256,
140
+ "native_helper_max_new_tokens": 2048, "native_temperature": 0.6,
141
+ "seed_adapter": self.controls.seed, "training_only": True})
142
+
143
+ def complete(prompt: str, *, refinement: bool) -> str:
144
+ cap = 2048
145
+ if usage["model_attempts"] >= self.controls.max_model_calls or (
146
+ usage["output_tokens"] + usage["unknown_output_token_reservations"] + cap
147
+ > self.controls.max_total_output_tokens
148
+ ):
149
+ raise BudgetExceededError("SmartSearch teacher budget cannot admit the native2048-token cap")
150
+ usage["model_attempts"] += 1
151
+ usage["unknown_output_token_reservations"] += cap
152
+ number = usage["model_attempts"]
153
+ request = {"prompt": prompt, "temperature": 0.6, "max_new_tokens": cap,
154
+ "stop": ["</search>"] if refinement else [], "seed": self.controls.seed,
155
+ "training_only": True, "operation": "refinement" if refinement else "process_reward"}
156
+ save(f"call-{number:04d}-request.json", request)
157
+ response = self.generate(prompt, temperature=0.6, max_new_tokens=cap,
158
+ stop=tuple(request["stop"]), seed=self.controls.seed)
159
+ if not isinstance(response, SmartSearchTeacherCompletion):
160
+ raise ExternalDependencyError("SmartSearch teacher provider omitted typed measured usage")
161
+ usage["model_responses"] += 1
162
+ usage["input_tokens"] += response.input_tokens
163
+ usage["output_tokens"] += response.output_tokens
164
+ usage["unknown_output_token_reservations"] -= cap
165
+ save(f"call-{number:04d}-response.json", response)
166
+ if response.model_fingerprint_sha256 != self.model_fingerprint_sha256:
167
+ raise ExternalDependencyError("SmartSearch teacher model identity changed")
168
+ if response.output_tokens > cap:
169
+ raise BudgetExceededError("SmartSearch teacher provider exceeded its requested token cap")
170
+ # Preserve upstream's exact append behavior, including malformed text;
171
+ # no parser cleanup, replacement reward or second attempt is made.
172
+ return response.text + ("</search>" if refinement else "")
173
+
174
+ try:
175
+ reward = _native_converter(source_root, "reward", source)
176
+ reward.generate_response = lambda prompt: complete(prompt, refinement=False)
177
+ with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()):
178
+ scored = reward.evaluate_search(rows)
179
+ scored = _native_converter(source_root, "redundancy", source).detect_redundancy(scored)
180
+ if refine:
181
+ rewriter = _native_converter(source_root, "refinement", source)
182
+ rewriter.generate_response = lambda prompt: complete(prompt, refinement=True)
183
+ scored = rewriter.rewrite_search(scored)
184
+ for relative, digest in source["files"].items():
185
+ if hashlib.sha256((source_root / relative).read_bytes()).hexdigest() != digest:
186
+ raise ExternalDependencyError("SmartSearch teacher source changed during execution")
187
+ save("scored-rollouts.json", scored)
188
+ result = {"schema": "agentinputlab.smartsearch.native-process-teacher.v1",
189
+ "source": source, "split_audit": audit, "controls": self.controls,
190
+ "rollout_provenance": rollout_provenance, "usage": usage,
191
+ "input_rollouts": len(rows), "native_selected_rollouts": len(scored),
192
+ "refinement_enabled": refine, "training_only": True,
193
+ "neural_training_performed": False, "native_prompts_parsers_selection_unchanged": True,
194
+ "transport_adapter": "operator_provider_with_seed_and_usage_no_http_fallback",
195
+ "model_fingerprint_sha256": self.model_fingerprint_sha256,
196
+ "scored_rollouts_sha256": hashlib.sha256((root / "scored-rollouts.json").read_bytes()).hexdigest()}
197
+ save("manifest.json", result)
198
+ return freeze_mapping({**result, "root": str(root)})
199
+ except Exception as exc:
200
+ save("failed.json", {"error_type": type(exc).__name__, "error": str(exc),
201
+ "usage": usage, "no_automatic_retry": True,
202
+ "neural_training_performed": False})
203
+ raise