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,524 @@
1
+ """Held-out native inference from a verified fitted SmartSearch training chain.
2
+
3
+ This is not the immutable released-3B profile or a training sampler. References
4
+ are never accepted here; an evaluator scores the returned prediction afterwards.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ import urllib.parse
11
+ import urllib.request
12
+ from dataclasses import dataclass
13
+ from pathlib import Path
14
+ from types import SimpleNamespace
15
+
16
+ from agentinputlab.contracts import BudgetExceededError, ExternalDependencyError, ValidationError
17
+ from agentinputlab.contracts.serialization import content_hash, to_jsonable
18
+ from workers.smartsearch.driver import (
19
+ MAX_RESPONSE_BYTES,
20
+ MAX_TEXT_CHARS,
21
+ BudgetGate,
22
+ DriverError,
23
+ LocalSnapshotOpenAIModel,
24
+ ModelTurn,
25
+ SearchRecorder,
26
+ SmartSearchDriver,
27
+ _completion_stop,
28
+ _nonnegative,
29
+ _NoRedirect,
30
+ )
31
+
32
+ from .qrag import _sha
33
+ from .smartsearch import SMARTSEARCH_TOOL_SCHEMA
34
+ from .smartsearch_curriculum import SmartSearchTrainingCase, _question_hash
35
+ from .smartsearch_grpo_tools import _new_output, _save
36
+ from .smartsearch_sampling import SmartSearchSamplingControls, verify_smartsearch_sampling_source
37
+ from .smartsearch_training import SmartSearchTrainingChainArtifact
38
+
39
+ TRAINED_INFERENCE_PROTOCOL = "agentinputlab.smartsearch.trained_native_inference.v1"
40
+
41
+
42
+ @dataclass(frozen=True, slots=True)
43
+ class SmartSearchInferenceControls(SmartSearchSamplingControls):
44
+ """Native 8192-token/ten-turn caps; separately metered, not a512/4096 claim."""
45
+
46
+
47
+ class _TrainedSnapshotTransport(LocalSnapshotOpenAIModel):
48
+ """Honor explicit API authentication on inventory checks as well as POSTs."""
49
+
50
+ def _verify_served_root(self):
51
+ if self.http.api_key and urllib.parse.urlsplit(self.base_url).scheme != "https":
52
+ raise DriverError("ENDPOINT_INVALID", "API keys may only be sent over HTTPS")
53
+ if urllib.parse.urlsplit(self.base_url).hostname in {"localhost", "127.0.0.1", "::1"}:
54
+ # Local inference must not leak loopback requests/API credentials
55
+ # into an inherited outbound proxy. This changes this client only.
56
+ self.http.opener = urllib.request.build_opener(
57
+ urllib.request.ProxyHandler({}), _NoRedirect()
58
+ )
59
+ headers = {"Accept": "application/json"}
60
+ if self.http.api_key:
61
+ headers["Authorization"] = "Bearer " + self.http.api_key
62
+ request = urllib.request.Request(self.base_url + "/v1/models", headers=headers)
63
+ try:
64
+ with self.http.opener.open(request, timeout=self.http.timeout) as response:
65
+ raw = response.read(MAX_RESPONSE_BYTES + 1)
66
+ if len(raw) > MAX_RESPONSE_BYTES:
67
+ raise ValueError("model inventory exceeds bound")
68
+ value = json.loads(raw)
69
+ rows = value.get("data") if isinstance(value, dict) else None
70
+ if not isinstance(rows, list):
71
+ raise ValueError("model inventory has no rows")
72
+ matches = [row for row in rows if isinstance(row, dict) and row.get("id") == self.model]
73
+ if len(matches) != 1 or not isinstance(matches[0].get("root"), str):
74
+ raise ValueError("served alias/root is ambiguous")
75
+ if Path(matches[0]["root"]).expanduser().resolve() != self.model_root:
76
+ raise DriverError("MODEL_IDENTITY_MISMATCH", "served model root differs")
77
+ except DriverError:
78
+ raise
79
+ except Exception as exc:
80
+ raise DriverError(
81
+ "MODEL_IDENTITY_MISMATCH", "trained model inventory handshake failed"
82
+ ) from exc
83
+
84
+
85
+ class SmartSearchTrainedLocalModel:
86
+ """Concrete OpenAI-completions transport for the verified learned export.
87
+
88
+ The caller starts its own model service with the fitted exported-policy
89
+ root. The served alias/root handshake and manifest closure are checked;
90
+ the secret API key is neither part of fingerprints nor written to journals.
91
+ """
92
+
93
+ def __init__(
94
+ self, *, training_chain_root, base_url, served_model_name, timeout_seconds=300, api_key=""
95
+ ):
96
+ chain = SmartSearchTrainingChainArtifact.load(training_chain_root)
97
+ record = json.loads((chain.root / "artifact.json").read_text())
98
+ identity = record.pop("artifact_id", None)
99
+ if identity != chain.artifact_id or content_hash(record) != identity:
100
+ raise ValidationError("SmartSearch fitted service training-chain receipt changed")
101
+ grpo = Path(record["references"]["grpo_root"]).resolve()
102
+ manifest_path = grpo / "model-manifest.json"
103
+ manifest_sha256 = record["chain"]["learned_grpo_manifest_sha256"]
104
+ if _sha(manifest_path) != manifest_sha256:
105
+ raise ValidationError("SmartSearch fitted service model manifest changed")
106
+ manifest = json.loads(manifest_path.read_text())
107
+ plan = grpo / "fit-plan.json"
108
+ if _sha(plan) != record["chain"]["receipt_files"]["grpo"]["plan_sha256"]:
109
+ raise ValidationError("SmartSearch fitted service training plan changed")
110
+ self.seed = json.loads(plan.read_text())["controls"]["seed"]
111
+ self.identity = dict(
112
+ training_chain_artifact_id=chain.artifact_id,
113
+ trained_policy_artifact_id=record["chain"]["artifacts"]["grpo"],
114
+ model_manifest_sha256=manifest_sha256,
115
+ model_root=str(grpo / "exported-policy"),
116
+ )
117
+ self.inner = _TrainedSnapshotTransport(
118
+ dict(
119
+ model_transport="openai_completions_local_snapshot",
120
+ model_base_url=base_url,
121
+ tokenizer_base_url=base_url,
122
+ served_model_name=served_model_name,
123
+ local_model_root=self.identity["model_root"],
124
+ model_timeout_seconds=timeout_seconds,
125
+ checkpoint_repository="agentinputlab-local-trained-smartsearch-policy",
126
+ checkpoint_revision=manifest["revision"],
127
+ tokenizer_revision=manifest["revision"],
128
+ model_snapshot_tree_sha256=content_hash(manifest["files"]),
129
+ context_admission_fingerprint_sha256=content_hash(
130
+ dict(model_manifest_sha256=manifest_sha256, native_tokenize_endpoint=True)
131
+ ),
132
+ ),
133
+ api_key=api_key,
134
+ )
135
+
136
+ def fingerprint(self):
137
+ self.inner._verify_served_root()
138
+ return {**self.identity, "transport": self.inner.fingerprint(), "seed": self.seed}
139
+
140
+ def count_prompt_tokens(self, prompt):
141
+ return self.inner.count_prompt_tokens(prompt)
142
+
143
+ def generate(self, prompt, *, temperature, max_new_tokens, stop, seed):
144
+ if (
145
+ type(temperature) not in (int, float)
146
+ or temperature != 0.0
147
+ or type(max_new_tokens) is not int
148
+ or max_new_tokens != 8192
149
+ or (not isinstance(stop, (tuple, list)) or tuple(stop) != ("</search>", "</answer>"))
150
+ or (type(seed) is not int or seed != self.seed)
151
+ ):
152
+ raise ValidationError(
153
+ "SmartSearch fitted transport requires its native cap/stops and fitted seed"
154
+ )
155
+ result = self.inner.http.post(
156
+ self.inner.base_url + "/v1/completions",
157
+ dict(
158
+ model=self.inner.model,
159
+ prompt=prompt,
160
+ temperature=temperature,
161
+ max_tokens=max_new_tokens,
162
+ stop=list(stop),
163
+ seed=seed,
164
+ ),
165
+ )
166
+ if (
167
+ not isinstance(result, dict)
168
+ or not isinstance(result.get("usage"), dict)
169
+ or (
170
+ not isinstance(result.get("choices"), list)
171
+ or not result["choices"]
172
+ or not isinstance(result["choices"][0], dict)
173
+ )
174
+ ):
175
+ raise DriverError(
176
+ "MODEL_RESPONSE_INVALID", "trained completion lacks measured usage", consumed=True
177
+ )
178
+ choice, usage = result["choices"][0], result["usage"]
179
+ text = choice.get("text")
180
+ if not isinstance(text, str) or len(text) > MAX_TEXT_CHARS:
181
+ raise DriverError(
182
+ "MODEL_RESPONSE_INVALID", "trained completion text is invalid", consumed=True
183
+ )
184
+ text, matched = _completion_stop(text, choice)
185
+ return ModelTurn(
186
+ text,
187
+ str(choice.get("finish_reason", "")),
188
+ matched,
189
+ _nonnegative(usage.get("prompt_tokens"), "prompt_tokens"),
190
+ _nonnegative(usage.get("completion_tokens"), "completion_tokens"),
191
+ )
192
+
193
+
194
+ def _surface(source, binding):
195
+ loader = SimpleNamespace(checkout=source, manifest_sha256=content_hash(binding))
196
+ recall, parser = SmartSearchDriver._load_upstream_surface(loader)
197
+ return recall, parser, loader._upstream_module
198
+
199
+
200
+ class SmartSearchTrainedPolicyInference:
201
+ """Run a fitted native policy on declared, disjoint test inputs once.
202
+
203
+ Model seam: fingerprint(), count_prompt_tokens(prompt), and
204
+ generate(prompt, temperature=..., max_new_tokens=..., stop=..., seed=...)
205
+ returning ModelTurn with measured usage. Its fingerprint must bind the
206
+ verified chain ID, trained GRPO artifact, exported model root and manifest.
207
+ A caller-owned fingerprint is an identity contract, not remote attestation.
208
+ """
209
+
210
+ def __init__(self, *, training_chain_root, model, retriever, controls=None):
211
+ self.controls = controls if controls is not None else SmartSearchInferenceControls()
212
+ if not isinstance(self.controls, SmartSearchInferenceControls):
213
+ raise ValidationError("SmartSearch fitted inference requires typed inference controls")
214
+ self.chain = SmartSearchTrainingChainArtifact.load(training_chain_root)
215
+ self.chain_record_path = self.chain.root / "artifact.json"
216
+ self.chain_record_sha256 = _sha(self.chain_record_path)
217
+ chain = json.loads(self.chain_record_path.read_text())
218
+ identity = chain.pop("artifact_id", None)
219
+ if (
220
+ identity != self.chain.artifact_id
221
+ or content_hash(chain) != identity
222
+ or (_sha(self.chain_record_path) != self.chain_record_sha256)
223
+ ):
224
+ raise ValidationError("SmartSearch training-chain receipt changed during binding")
225
+ self.references, self.chain_summary = chain["references"], chain["chain"]
226
+ self.grpo_root = Path(self.references["grpo_root"]).resolve()
227
+ self.model_manifest = self.grpo_root / "model-manifest.json"
228
+ self.model_manifest_sha256 = self.chain_summary["learned_grpo_manifest_sha256"]
229
+ if _sha(self.model_manifest) != self.model_manifest_sha256:
230
+ raise ValidationError(
231
+ "SmartSearch trained policy manifest changed after chain verification"
232
+ )
233
+ self.fit_plan = self.grpo_root / "fit-plan.json"
234
+ self.fit_plan_sha256 = self.chain_summary["receipt_files"]["grpo"]["plan_sha256"]
235
+ if _sha(self.fit_plan) != self.fit_plan_sha256:
236
+ raise ValidationError("SmartSearch trained fit plan changed after chain verification")
237
+ plan = json.loads(self.fit_plan.read_text())
238
+ if self.controls.seed != plan["controls"]["seed"]:
239
+ raise ValidationError(
240
+ "SmartSearch trained inference seed differs from its fitted chain"
241
+ )
242
+ for value, methods in (
243
+ (model, ("fingerprint", "count_prompt_tokens", "generate")),
244
+ (retriever, ("fingerprint", "search")),
245
+ ):
246
+ if any(not callable(getattr(value, name, None)) for name in methods):
247
+ raise ValidationError(
248
+ "SmartSearch trained inference needs explicit model/retrieval seams"
249
+ )
250
+ self.model, self.retriever = model, retriever
251
+ self.model_identity = to_jsonable(model.fingerprint())
252
+ required = dict(
253
+ training_chain_artifact_id=self.chain.artifact_id,
254
+ trained_policy_artifact_id=self.chain_summary["artifacts"]["grpo"],
255
+ model_manifest_sha256=self.model_manifest_sha256,
256
+ model_root=str(self.grpo_root / "exported-policy"),
257
+ )
258
+ if not isinstance(self.model_identity, dict) or any(
259
+ self.model_identity.get(k) != v for k, v in required.items()
260
+ ):
261
+ raise ValidationError(
262
+ "SmartSearch inference provider is not bound to the verified trained policy"
263
+ )
264
+ self.retrieval_identity = to_jsonable(retriever.fingerprint())
265
+ for name in ("corpus_sha256", "index_sha256"):
266
+ digest = (
267
+ self.retrieval_identity.get(name)
268
+ if isinstance(self.retrieval_identity, dict)
269
+ else None
270
+ )
271
+ if (
272
+ not isinstance(digest, str)
273
+ or len(digest) != 64
274
+ or set(digest) - set("0123456789abcdef")
275
+ ):
276
+ raise ValidationError(
277
+ "SmartSearch inference requires frozen test corpus/index identities"
278
+ )
279
+ split = self.chain_summary["split_identity"]
280
+ self.fit_ids = set(split["train"]) | set(split["validation"])
281
+ self.fit_questions = set(split["train"].values()) | set(split["validation"].values())
282
+
283
+ def _unchanged(self):
284
+ if _sha(self.chain_record_path) != self.chain_record_sha256 or (
285
+ _sha(self.model_manifest) != self.model_manifest_sha256
286
+ or _sha(self.fit_plan) != self.fit_plan_sha256
287
+ or to_jsonable(self.model.fingerprint()) != self.model_identity
288
+ or to_jsonable(self.retriever.fingerprint()) != self.retrieval_identity
289
+ ):
290
+ raise ExternalDependencyError(
291
+ "SmartSearch trained inference source/model/retrieval binding changed"
292
+ )
293
+
294
+ def predict(self, *, case: SmartSearchTrainingCase, output_root):
295
+ if not isinstance(case, SmartSearchTrainingCase) or case.split != "test":
296
+ raise ValidationError(
297
+ "SmartSearch trained inference accepts explicitly declared test cases"
298
+ )
299
+ if case.case_id in self.fit_ids or _question_hash(case.question) in self.fit_questions:
300
+ raise ValidationError(
301
+ "SmartSearch held-out test overlaps fitted training/development inputs"
302
+ )
303
+ self._unchanged()
304
+ source, binding = verify_smartsearch_sampling_source(self.references["checkout"])
305
+ recall, parser, module = _surface(source, binding)
306
+ output = Path(output_root).resolve(strict=False)
307
+ protected = [source, self.chain.root, self.grpo_root]
308
+ for item in self.references.values():
309
+ if isinstance(item, dict):
310
+ protected.extend(
311
+ Path(value).resolve()
312
+ for key, value in item.items()
313
+ if key != "model_manifest_sha256"
314
+ )
315
+ else:
316
+ protected.append(Path(item).resolve())
317
+ if any(output.is_relative_to(path) or path.is_relative_to(output) for path in protected):
318
+ raise ValidationError(
319
+ "SmartSearch prediction output overlaps protected training/source inputs"
320
+ )
321
+ root = _new_output(output_root)
322
+ _save(
323
+ root,
324
+ "claim.json",
325
+ dict(
326
+ protocol=TRAINED_INFERENCE_PROTOCOL,
327
+ case=case,
328
+ training_chain_artifact_id=self.chain.artifact_id,
329
+ source=binding,
330
+ model=self.model_identity,
331
+ retrieval=self.retrieval_identity,
332
+ controls=self.controls,
333
+ references_accepted=False,
334
+ training_sampler_used=False,
335
+ no_automatic_retry=True,
336
+ ),
337
+ )
338
+ gate = BudgetGate(
339
+ dict(
340
+ model_calls=self.controls.max_model_calls,
341
+ output_tokens=self.controls.max_output_tokens,
342
+ retrieval_calls=self.controls.max_retrieval_calls,
343
+ context_tokens=self.controls.max_input_tokens,
344
+ )
345
+ )
346
+ recorder = SearchRecorder(self.retriever, gate, self.retrieval_identity)
347
+ responses = 0
348
+ owner = self
349
+
350
+ class ModelSeam:
351
+ def post(self, url, json):
352
+ nonlocal responses
353
+ sampling = dict(
354
+ temperature=0.0, max_new_tokens=8192, stop=["</search>", "</answer>"]
355
+ )
356
+ if (
357
+ url != "agentinputlab://model/generate"
358
+ or set(json) != {"text", "sampling_params"}
359
+ or json["sampling_params"] != sampling
360
+ ):
361
+ raise ExternalDependencyError(
362
+ "SmartSearch native held-out generation contract changed"
363
+ )
364
+ owner._unchanged()
365
+ prompt = json["text"]
366
+ if not isinstance(prompt, str) or len(prompt) > MAX_TEXT_CHARS:
367
+ raise ValidationError("SmartSearch held-out prompt must be bounded text")
368
+ admitted = owner.model.count_prompt_tokens(prompt)
369
+ if type(admitted) is not int or admitted < 1:
370
+ raise ValidationError(
371
+ "SmartSearch held-out inference needs exact token admission"
372
+ )
373
+ owner._unchanged()
374
+ gate.before_model(admitted)
375
+ number = gate.usage.model_calls
376
+ _save(
377
+ root,
378
+ f"call-{number:04d}-request.json",
379
+ dict(prompt=prompt, **sampling, seed=owner.controls.seed),
380
+ )
381
+ turn = owner.model.generate(
382
+ prompt,
383
+ temperature=0.0,
384
+ max_new_tokens=8192,
385
+ stop=tuple(sampling["stop"]),
386
+ seed=owner.controls.seed,
387
+ )
388
+ if (
389
+ not isinstance(turn, ModelTurn)
390
+ or any(
391
+ type(n) is not int or n < 0 for n in (turn.input_tokens, turn.output_tokens)
392
+ )
393
+ or (
394
+ any(
395
+ not isinstance(value, str)
396
+ for value in (turn.text, turn.finish_reason, turn.matched)
397
+ )
398
+ )
399
+ ):
400
+ raise ExternalDependencyError(
401
+ "SmartSearch inference provider lacks typed measured usage"
402
+ )
403
+ if len(turn.text) > MAX_TEXT_CHARS:
404
+ _save(
405
+ root,
406
+ f"call-{number:04d}-response.json",
407
+ dict(
408
+ text_sha256=content_hash(turn.text),
409
+ oversized_text_not_truncated_for_scoring=True,
410
+ input_tokens=turn.input_tokens,
411
+ output_tokens=turn.output_tokens,
412
+ ),
413
+ )
414
+ else:
415
+ _save(root, f"call-{number:04d}-response.json", turn)
416
+ responses += 1
417
+ gate.after_model(
418
+ turn.input_tokens, turn.output_tokens, admitted_input_tokens=admitted
419
+ )
420
+ if len(turn.text) > MAX_TEXT_CHARS:
421
+ raise ExternalDependencyError(
422
+ "SmartSearch inference response exceeded text bound"
423
+ )
424
+ if turn.output_tokens > 8192:
425
+ raise BudgetExceededError(
426
+ "SmartSearch inference provider exceeded native per-call token cap"
427
+ )
428
+ text, matched = _completion_stop(
429
+ turn.text, dict(finish_reason=turn.finish_reason, stop_reason=turn.matched)
430
+ )
431
+ owner._unchanged()
432
+ return SimpleNamespace(
433
+ json=lambda: dict(
434
+ text=text,
435
+ meta_info=dict(
436
+ finish_reason=dict(type=turn.finish_reason, matched=matched)
437
+ ),
438
+ )
439
+ )
440
+
441
+ class FixedReCall(recall):
442
+ def execute_tool_calls(self, env, calls):
443
+ if env != "agentinputlab:no-exec":
444
+ raise ValidationError(
445
+ "SmartSearch inference only exposes fixed Wikipedia retrieval"
446
+ )
447
+ owner._unchanged()
448
+ result = recorder.execute(calls)
449
+ owner._unchanged()
450
+ return result
451
+
452
+ try:
453
+ module.requests = ModelSeam()
454
+ agent = FixedReCall("agentinputlab://model", "agentinputlab://disabled-executor")
455
+ transcript = recall.run.__wrapped__(
456
+ agent,
457
+ "agentinputlab:no-exec",
458
+ json.dumps(to_jsonable(SMARTSEARCH_TOOL_SCHEMA)),
459
+ case.question,
460
+ )
461
+ prediction = parser(transcript)
462
+ if not isinstance(prediction, str):
463
+ raise ExternalDependencyError(
464
+ "SmartSearch native answer parser did not return text"
465
+ )
466
+ owner._unchanged()
467
+ _, after = verify_smartsearch_sampling_source(self.references["checkout"])
468
+ if after != binding:
469
+ raise ExternalDependencyError(
470
+ "SmartSearch held-out native source changed during inference"
471
+ )
472
+ _save(
473
+ root,
474
+ "transcript.json",
475
+ dict(raw_transcript=transcript, native_prediction=prediction),
476
+ )
477
+ result = dict(
478
+ protocol=TRAINED_INFERENCE_PROTOCOL,
479
+ case_id=case.case_id,
480
+ split="test",
481
+ training_chain_artifact_id=self.chain.artifact_id,
482
+ model=self.model_identity,
483
+ source=binding,
484
+ retrieval=self.retrieval_identity,
485
+ prediction=prediction,
486
+ native_answer_present=bool(prediction.strip()),
487
+ scored=False,
488
+ benchmark_score=None,
489
+ usage=gate.usage.as_mapping(),
490
+ model_responses=responses,
491
+ unknown_output_token_reservations=0,
492
+ trajectory=recorder.trajectory,
493
+ evidence=recorder.evidence,
494
+ seed_adapter=self.controls.seed,
495
+ transcript_sha256=_sha(root / "transcript.json"),
496
+ native_loop_and_parser_called=True,
497
+ training_sampler_used=False,
498
+ test_reference_or_reward_used=False,
499
+ optimizer_steps=0,
500
+ empty_prediction_is_retained_not_success=True,
501
+ no_automatic_retry=True,
502
+ )
503
+ _save(root, "manifest.json", result)
504
+ return result
505
+ except Exception as exc:
506
+ _save(
507
+ root,
508
+ "failed.json",
509
+ dict(
510
+ protocol=TRAINED_INFERENCE_PROTOCOL,
511
+ error_type=type(exc).__name__,
512
+ error=str(exc),
513
+ usage=gate.usage.as_mapping(),
514
+ model_responses=responses,
515
+ unknown_output_token_reservations=max(0, gate.usage.model_calls - responses)
516
+ * 8192,
517
+ trajectory=recorder.trajectory,
518
+ evidence=recorder.evidence,
519
+ no_automatic_retry=True,
520
+ optimizer_steps=0,
521
+ scored=False,
522
+ ),
523
+ )
524
+ raise