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,725 @@
1
+ """Prepared-source and external checkpoint/evaluation bridge for tau3 Banking.
2
+
3
+ The official static task files are simulator/evaluator specifications, not
4
+ user-visible prompts. This module deliberately refuses to synthesize a query
5
+ from those hidden scripts. Callers must capture a replayable pre-action
6
+ checkpoint from the official runtime and bind it to opaque runtime identities.
7
+ This module does not yet capture, clone, continue, or evaluate that runtime by
8
+ itself; those operations remain the responsibility of the supplied bridge.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import json
14
+ import math
15
+ import re
16
+ from collections.abc import Callable, Iterable, Mapping
17
+ from dataclasses import dataclass, field
18
+ from pathlib import Path
19
+ from types import MappingProxyType
20
+ from typing import Any, Protocol, runtime_checkable
21
+
22
+ from agentinputlab.artifacts import sha256_file
23
+ from agentinputlab.contracts.enums import SemanticFamily
24
+ from agentinputlab.contracts.errors import ArtifactError, ValidationError
25
+ from agentinputlab.contracts.serialization import canonical_json, freeze_mapping
26
+ from agentinputlab.contracts.state import ContextBlock, Message
27
+
28
+ from .base import BenchmarkExample, opaque_checkpoint_state_id
29
+ from .preprocess import PreparedBenchmark
30
+
31
+ _BENCHMARK_ID = "tau3.banking_knowledge"
32
+ _PROCESSOR = "tau3_banking_tar_v1"
33
+ _SPLIT = "base"
34
+ TAU3_OFFICIAL_SOURCE_REVISION = "cf71a8070269883e38a365ffa85f78f46844c1f4"
35
+ _SHA256 = re.compile(r"^[0-9a-f]{64}$")
36
+ _STRUCTURAL_CAPABILITY_NAMES = frozenset(
37
+ {
38
+ "clarification_roundtrip_available",
39
+ "state_restore_available",
40
+ }
41
+ )
42
+ _CALLER_ASSERTED = "caller_asserted"
43
+ _STRUCTURAL_CANDIDATE = "structural_candidate"
44
+ _EXTERNAL_BRIDGE = "external_bridge"
45
+ _RETRIEVAL_TOOL_NAMES = frozenset(
46
+ {"KB_search", "KB_search_bm25", "KB_search_dense", "grep", "shell"}
47
+ )
48
+ _INTERVENTION_FAMILIES = (
49
+ SemanticFamily.REFORMULATE,
50
+ SemanticFamily.DECOMPOSE,
51
+ SemanticFamily.ACQUIRE,
52
+ SemanticFamily.CLARIFY,
53
+ SemanticFamily.CURATE,
54
+ )
55
+
56
+
57
+ @dataclass(frozen=True, slots=True)
58
+ class Tau3FamilyEligibility:
59
+ """Visible-only family support for one captured checkpoint."""
60
+
61
+ checkpoint_id: str
62
+ eligibility: Mapping[str, bool]
63
+ reasons: Mapping[str, str]
64
+ provenance_status: str = _CALLER_ASSERTED
65
+ support_status: str = _STRUCTURAL_CANDIDATE
66
+
67
+ def __post_init__(self) -> None:
68
+ expected = {family.value for family in _INTERVENTION_FAMILIES}
69
+ if set(self.eligibility) != expected or set(self.reasons) != expected:
70
+ raise ValidationError("tau3 family eligibility must cover the five core families")
71
+ if any(not isinstance(value, bool) for value in self.eligibility.values()):
72
+ raise ValidationError("tau3 family eligibility values must be boolean")
73
+ if any(not isinstance(value, str) or not value for value in self.reasons.values()):
74
+ raise ValidationError("tau3 family eligibility reasons must be non-empty strings")
75
+ if self.provenance_status != _CALLER_ASSERTED:
76
+ raise ValidationError("tau3 eligibility provenance must remain caller_asserted")
77
+ if self.support_status != _STRUCTURAL_CANDIDATE:
78
+ raise ValidationError("tau3 eligibility status must remain structural_candidate")
79
+ object.__setattr__(self, "eligibility", MappingProxyType(dict(self.eligibility)))
80
+ object.__setattr__(self, "reasons", MappingProxyType(dict(self.reasons)))
81
+
82
+ @property
83
+ def eligible_families(self) -> tuple[SemanticFamily, ...]:
84
+ return tuple(family for family in _INTERVENTION_FAMILIES if self.eligibility[family.value])
85
+
86
+ @property
87
+ def supports_full_block(self) -> bool:
88
+ return all(self.eligibility.values())
89
+
90
+
91
+ @dataclass(frozen=True, slots=True)
92
+ class Tau3BankingCheckpoint:
93
+ """A captured optimizer-visible state with opaque official-runtime bindings.
94
+
95
+ The four SHA-256 identities bind the checkpoint to a cloned runtime state,
96
+ retrieval implementation, prepared corpus, and deterministic replay. They
97
+ intentionally carry no database rows, tool results, simulator instructions,
98
+ evaluator criteria, or required-document labels.
99
+ """
100
+
101
+ checkpoint_id: str
102
+ task_id: str
103
+ query: str
104
+ instruction: str
105
+ visible_messages: tuple[Message, ...]
106
+ tool_names: tuple[str, ...]
107
+ runtime_snapshot_id: str
108
+ retrieval_revision: str
109
+ corpus_revision: str
110
+ replay_identity: str
111
+ retrieval_config_id: str
112
+ visible_context: tuple[ContextBlock, ...] = ()
113
+ structural_capabilities: Mapping[str, bool] = field(default_factory=dict)
114
+
115
+ def __post_init__(self) -> None:
116
+ for label in ("checkpoint_id", "task_id", "query", "instruction", "retrieval_config_id"):
117
+ value = getattr(self, label)
118
+ if not isinstance(value, str) or not value.strip() or value != value.strip():
119
+ raise ValidationError(f"tau3 checkpoint {label} must be a trimmed non-empty string")
120
+ for label in (
121
+ "runtime_snapshot_id",
122
+ "retrieval_revision",
123
+ "corpus_revision",
124
+ "replay_identity",
125
+ ):
126
+ value = getattr(self, label)
127
+ if not isinstance(value, str) or _SHA256.fullmatch(value) is None:
128
+ raise ValidationError(f"tau3 checkpoint {label} must be a lowercase SHA-256")
129
+
130
+ messages = tuple(self.visible_messages)
131
+ context = tuple(self.visible_context)
132
+ tool_names = tuple(self.tool_names)
133
+ if not messages or not all(isinstance(message, Message) for message in messages):
134
+ raise ValidationError("tau3 checkpoint requires captured visible Message instances")
135
+ if not all(isinstance(block, ContextBlock) for block in context):
136
+ raise ValidationError("tau3 checkpoint context must contain ContextBlock instances")
137
+ if not tool_names or not all(
138
+ isinstance(name, str) and name.strip() and name == name.strip() for name in tool_names
139
+ ):
140
+ raise ValidationError("tau3 checkpoint requires trimmed visible tool names")
141
+ if len(tool_names) != len(set(tool_names)):
142
+ raise ValidationError("tau3 checkpoint visible tool names must be unique")
143
+ user_messages = [message for message in messages if message.role == "user"]
144
+ if not user_messages:
145
+ raise ValidationError("tau3 checkpoint requires at least one visible user message")
146
+ if user_messages[-1].content != self.query:
147
+ raise ValidationError(
148
+ "tau3 checkpoint query must equal the latest visible user message"
149
+ )
150
+
151
+ capabilities = dict(self.structural_capabilities)
152
+ if not set(capabilities) <= _STRUCTURAL_CAPABILITY_NAMES:
153
+ raise ValidationError(
154
+ "tau3 checkpoint contains an unknown structural capability; "
155
+ "defect labels are not eligibility inputs"
156
+ )
157
+ if any(not isinstance(value, bool) for value in capabilities.values()):
158
+ raise ValidationError("tau3 checkpoint structural capabilities must be boolean")
159
+ object.__setattr__(self, "visible_messages", messages)
160
+ object.__setattr__(self, "visible_context", context)
161
+ object.__setattr__(self, "tool_names", tool_names)
162
+ object.__setattr__(
163
+ self,
164
+ "structural_capabilities",
165
+ MappingProxyType(capabilities),
166
+ )
167
+
168
+ @property
169
+ def family_eligibility(self) -> Tau3FamilyEligibility:
170
+ retrieval_available = bool(set(self.tool_names) & _RETRIEVAL_TOOL_NAMES)
171
+ curation_material = len(self.visible_messages) >= 3 or len(self.visible_context) >= 2
172
+ clarification = self.structural_capabilities.get(
173
+ "clarification_roundtrip_available",
174
+ False,
175
+ )
176
+ eligibility = {
177
+ SemanticFamily.REFORMULATE.value: True,
178
+ SemanticFamily.DECOMPOSE.value: True,
179
+ SemanticFamily.ACQUIRE.value: retrieval_available,
180
+ SemanticFamily.CLARIFY.value: clarification,
181
+ SemanticFamily.CURATE.value: curation_material,
182
+ }
183
+ reasons = {
184
+ SemanticFamily.REFORMULATE.value: "captured checkpoint has an explicit visible query",
185
+ SemanticFamily.DECOMPOSE.value: (
186
+ "captured checkpoint has an explicit visible query that can be decomposed"
187
+ ),
188
+ SemanticFamily.ACQUIRE.value: (
189
+ "an official visible retrieval channel is present"
190
+ if retrieval_available
191
+ else "requires KB_search, KB_search_bm25, KB_search_dense, grep, or shell"
192
+ ),
193
+ SemanticFamily.CLARIFY.value: (
194
+ "captured runtime exposes a replayable clarification round trip"
195
+ if clarification
196
+ else "requires clarification_roundtrip_available=true"
197
+ ),
198
+ SemanticFamily.CURATE.value: (
199
+ "captured state contains enough visible history or context to curate"
200
+ if curation_material
201
+ else "requires at least three visible messages or two visible context blocks"
202
+ ),
203
+ }
204
+ return Tau3FamilyEligibility(self.checkpoint_id, eligibility, reasons)
205
+
206
+
207
+ @dataclass(frozen=True, slots=True)
208
+ class Tau3EvaluationResult:
209
+ """Typed single-arm values returned by an external evaluation bridge."""
210
+
211
+ official_reward: float
212
+ cost: float
213
+ provenance_status: str = field(init=False, default=_CALLER_ASSERTED)
214
+ evaluation_scope: str = field(init=False, default=_EXTERNAL_BRIDGE)
215
+ official_runtime_verified: bool = field(init=False, default=False)
216
+
217
+ def __post_init__(self) -> None:
218
+ metrics = _validated_bridge_metrics(
219
+ {"cost": self.cost, "official_reward": self.official_reward}
220
+ )
221
+ object.__setattr__(self, "official_reward", metrics["official_reward"])
222
+ object.__setattr__(self, "cost", metrics["cost"])
223
+
224
+ @property
225
+ def metrics(self) -> Mapping[str, float]:
226
+ return MappingProxyType({"cost": self.cost, "official_reward": self.official_reward})
227
+
228
+
229
+ @runtime_checkable
230
+ class Tau3EvaluationBridge(Protocol):
231
+ """Typed caller-asserted bridge; this is not an official-runtime attestation."""
232
+
233
+ tau3_bridge_contract: str
234
+ benchmark_id: str
235
+ source_revision: str
236
+ bridge_id: str
237
+ bridge_revision: str
238
+ cost_basis: str
239
+ supports_state_restore: bool
240
+ supports_user_simulator_replay: bool
241
+ provenance_status: str
242
+ evaluation_scope: str
243
+ official_runtime_verified: bool
244
+
245
+ def evaluate(
246
+ self,
247
+ evaluator_payload: Mapping[str, Any],
248
+ checkpoint: Tau3BankingCheckpoint,
249
+ prediction: Any,
250
+ ) -> Tau3EvaluationResult: ...
251
+
252
+
253
+ @dataclass(frozen=True, slots=True)
254
+ class CallerAssertedTau3EvaluationBridge:
255
+ """Explicit wrapper for an unverified external tau3 evaluation callback."""
256
+
257
+ bridge_id: str
258
+ bridge_revision: str
259
+ cost_basis: str
260
+ callback: Callable[
261
+ [Mapping[str, Any], Tau3BankingCheckpoint, Any],
262
+ Tau3EvaluationResult,
263
+ ] = field(repr=False)
264
+ supports_state_restore: bool
265
+ supports_user_simulator_replay: bool
266
+ tau3_bridge_contract: str = field(init=False, default="tau3_evaluation_bridge_v1")
267
+ benchmark_id: str = field(init=False, default=_BENCHMARK_ID)
268
+ source_revision: str = field(init=False, default=TAU3_OFFICIAL_SOURCE_REVISION)
269
+ provenance_status: str = field(init=False, default=_CALLER_ASSERTED)
270
+ evaluation_scope: str = field(init=False, default=_EXTERNAL_BRIDGE)
271
+ official_runtime_verified: bool = field(init=False, default=False)
272
+
273
+ def __post_init__(self) -> None:
274
+ for label in ("bridge_id", "cost_basis"):
275
+ value = getattr(self, label)
276
+ if not isinstance(value, str) or not value.strip() or value != value.strip():
277
+ raise ValidationError(f"tau3 evaluation bridge {label} must be non-empty")
278
+ if (
279
+ not isinstance(self.bridge_revision, str)
280
+ or _SHA256.fullmatch(self.bridge_revision) is None
281
+ ):
282
+ raise ValidationError("tau3 evaluation bridge revision must be a lowercase SHA-256")
283
+ if not callable(self.callback):
284
+ raise TypeError("tau3 evaluation bridge callback must be callable")
285
+ for label in ("supports_state_restore", "supports_user_simulator_replay"):
286
+ if not isinstance(getattr(self, label), bool):
287
+ raise ValidationError(f"tau3 evaluation bridge {label} must be boolean")
288
+
289
+ def evaluate(
290
+ self,
291
+ evaluator_payload: Mapping[str, Any],
292
+ checkpoint: Tau3BankingCheckpoint,
293
+ prediction: Any,
294
+ ) -> Tau3EvaluationResult:
295
+ result = self.callback(evaluator_payload, checkpoint, prediction)
296
+ if not isinstance(result, Tau3EvaluationResult):
297
+ raise ValidationError(
298
+ "tau3 evaluation callback must return Tau3EvaluationResult; "
299
+ "bare metric mappings are not accepted"
300
+ )
301
+ if (
302
+ result.provenance_status != self.provenance_status
303
+ or result.evaluation_scope != self.evaluation_scope
304
+ or result.official_runtime_verified is not False
305
+ ):
306
+ raise ValidationError(
307
+ "tau3 evaluation result provenance differs from its caller-asserted bridge"
308
+ )
309
+ return result
310
+
311
+
312
+ class PreparedTau3BankingBundle:
313
+ """Verified task/corpus bundle with evaluator-only source state."""
314
+
315
+ def __init__(self, prepared: PreparedBenchmark) -> None:
316
+ if not isinstance(prepared, PreparedBenchmark):
317
+ raise TypeError("prepared must be a PreparedBenchmark")
318
+ if (
319
+ prepared.cell_id != _BENCHMARK_ID
320
+ or prepared.processor != _PROCESSOR
321
+ or prepared.split != _SPLIT
322
+ ):
323
+ raise ArtifactError("prepared tau3 Banking Knowledge identity does not match")
324
+ if prepared.source_revision != TAU3_OFFICIAL_SOURCE_REVISION:
325
+ raise ArtifactError(
326
+ "prepared tau3 Banking Knowledge source revision does not match "
327
+ "the audited upstream commit"
328
+ )
329
+ if prepared.corpus_path is None or prepared.audit_path is None:
330
+ raise ArtifactError("prepared tau3 Banking Knowledge requires corpus and audit files")
331
+ if set(prepared.file_sha256) != {
332
+ "audit.jsonl",
333
+ "corpus.jsonl",
334
+ "gold.jsonl",
335
+ "inputs.jsonl",
336
+ }:
337
+ raise ArtifactError("prepared tau3 Banking Knowledge file set is incomplete")
338
+ corpus_revision = prepared.file_sha256["corpus.jsonl"]
339
+ if _SHA256.fullmatch(corpus_revision) is None:
340
+ raise ArtifactError("prepared tau3 Banking Knowledge corpus hash is invalid")
341
+ _verify_prepared_file_hashes(prepared)
342
+
343
+ input_rows = _records_by_id(prepared.inputs_path, label="tau3 task inventory")
344
+ gold_rows = _records_by_id(prepared.gold_path, label="tau3 evaluator gold")
345
+ corpus_rows = _records_by_id(prepared.corpus_path, label="tau3 corpus")
346
+ audit_rows = _read_jsonl(prepared.audit_path, label="tau3 source audit")
347
+ if set(input_rows) != set(gold_rows):
348
+ raise ArtifactError("tau3 task inventory and evaluator gold IDs do not match")
349
+ if len(audit_rows) != 1:
350
+ raise ArtifactError("tau3 source audit must contain exactly one record")
351
+
352
+ task_specs: dict[str, Mapping[str, Any]] = {}
353
+ for task_id in sorted(input_rows):
354
+ visible = input_rows[task_id]
355
+ if set(visible) != {"checkpoint_required", "id", "visible_metadata"}:
356
+ raise ArtifactError("tau3 static input schema differs from the production lock")
357
+ if visible["checkpoint_required"] is not True:
358
+ raise ArtifactError("tau3 static tasks must require an explicit checkpoint")
359
+ metadata = visible["visible_metadata"]
360
+ if not isinstance(metadata, Mapping) or dict(metadata) != {
361
+ "benchmark_cell": _BENCHMARK_ID,
362
+ "source_split": _SPLIT,
363
+ "source_task_id": task_id,
364
+ }:
365
+ raise ArtifactError("tau3 task inventory visible metadata differs from the lock")
366
+ gold = gold_rows[task_id]
367
+ if set(gold) != {"id", "task_spec"} or not isinstance(gold["task_spec"], Mapping):
368
+ raise ArtifactError("tau3 evaluator gold schema differs from the production lock")
369
+ task_spec = gold["task_spec"]
370
+ if task_spec.get("id") != task_id:
371
+ raise ArtifactError("tau3 evaluator task ID does not match its inventory ID")
372
+ task_specs[task_id] = _frozen_mapping(task_spec, label="tau3 task specification")
373
+
374
+ for document_id, document in corpus_rows.items():
375
+ if set(document) != {"id", "text", "title"}:
376
+ raise ArtifactError("tau3 corpus schema differs from the production lock")
377
+ for key in ("text", "title"):
378
+ value = document[key]
379
+ if not isinstance(value, str) or not value.strip():
380
+ raise ArtifactError(f"tau3 corpus field {key!r} must be non-empty")
381
+ if document["id"] != document_id: # pragma: no cover - index invariant
382
+ raise ArtifactError("tau3 corpus document ID mismatch")
383
+
384
+ audit = audit_rows[0]
385
+ if audit.get("id") != "tau3-banking-knowledge-source-audit":
386
+ raise ArtifactError("tau3 source audit identity differs from the production lock")
387
+ if not isinstance(audit.get("database"), Mapping):
388
+ raise ArtifactError("tau3 source audit is missing evaluator-only database state")
389
+ if audit.get("source_revision") != prepared.source_revision:
390
+ raise ArtifactError("tau3 source audit revision differs from prepared metadata")
391
+
392
+ expected_counts = {
393
+ "inputs": len(input_rows),
394
+ "gold": len(gold_rows),
395
+ "corpus": len(corpus_rows),
396
+ "tasks": len(input_rows),
397
+ "documents": len(corpus_rows),
398
+ "audit": 1,
399
+ }
400
+ for key, value in expected_counts.items():
401
+ if prepared.counts.get(key) != value:
402
+ raise ArtifactError(f"prepared tau3 count mismatch for {key}")
403
+
404
+ self.benchmark_id = _BENCHMARK_ID
405
+ self.split = _SPLIT
406
+ self.prepared = prepared
407
+ self.corpus_path = prepared.corpus_path
408
+ self.corpus_revision = corpus_revision
409
+ self.task_ids = tuple(sorted(task_specs))
410
+ self.document_count = len(corpus_rows)
411
+ self._task_specs = MappingProxyType(task_specs)
412
+ self._source_audit = _frozen_mapping(audit, label="tau3 source audit")
413
+ self._expected_file_sha256 = MappingProxyType(dict(prepared.file_sha256))
414
+ _verify_prepared_file_hashes(prepared)
415
+
416
+ def verify_integrity(self) -> None:
417
+ """Re-hash every prepared file before runtime use."""
418
+
419
+ if dict(self.prepared.file_sha256) != dict(self._expected_file_sha256):
420
+ raise ArtifactError("prepared tau3 declared file hashes changed after bundle creation")
421
+ _verify_prepared_file_hashes(self.prepared)
422
+
423
+ def _evaluator_payload(self, task_id: str) -> Mapping[str, Any]:
424
+ self.verify_integrity()
425
+ return MappingProxyType(
426
+ {
427
+ "task_spec": self._task_specs[task_id],
428
+ "source_audit": self._source_audit,
429
+ }
430
+ )
431
+
432
+
433
+ class Tau3BankingCheckpointAdapter:
434
+ """Adapter over externally captured checkpoints; fails closed otherwise.
435
+
436
+ The adapter validates prepared source data, visible checkpoint contracts,
437
+ and evaluation-bridge outputs. It is not an official-runtime capture,
438
+ clone, continuation, or evaluator implementation.
439
+ """
440
+
441
+ benchmark_id = _BENCHMARK_ID
442
+ adapter_metric_names = ("official_reward", "cost")
443
+ split = _SPLIT
444
+ pairing_mode = "unsupported_external_replay"
445
+
446
+ def __init__(
447
+ self,
448
+ bundle: PreparedTau3BankingBundle,
449
+ *,
450
+ checkpoints: Iterable[Tau3BankingCheckpoint],
451
+ evaluation_bridge: Tau3EvaluationBridge,
452
+ ) -> None:
453
+ if not isinstance(bundle, PreparedTau3BankingBundle):
454
+ raise TypeError("bundle must be a PreparedTau3BankingBundle")
455
+ if not isinstance(evaluation_bridge, Tau3EvaluationBridge):
456
+ raise TypeError(
457
+ "evaluation_bridge must implement Tau3EvaluationBridge; wrap external "
458
+ "callbacks with CallerAssertedTau3EvaluationBridge"
459
+ )
460
+ _validate_evaluation_bridge(evaluation_bridge)
461
+ bundle.verify_integrity()
462
+ normalized = tuple(checkpoints)
463
+ if not normalized:
464
+ raise ValidationError(
465
+ "tau3 Banking Knowledge requires at least one captured visible checkpoint"
466
+ )
467
+ if not all(isinstance(item, Tau3BankingCheckpoint) for item in normalized):
468
+ raise TypeError("tau3 checkpoints must be Tau3BankingCheckpoint instances")
469
+ checkpoint_ids = [item.checkpoint_id for item in normalized]
470
+ if len(checkpoint_ids) != len(set(checkpoint_ids)):
471
+ raise ValidationError("tau3 checkpoint IDs must be unique")
472
+ experimental_units = [
473
+ (
474
+ item.task_id,
475
+ item.runtime_snapshot_id,
476
+ item.retrieval_revision,
477
+ item.corpus_revision,
478
+ item.replay_identity,
479
+ item.retrieval_config_id,
480
+ )
481
+ for item in normalized
482
+ ]
483
+ if len(experimental_units) != len(set(experimental_units)):
484
+ raise ValidationError("tau3 protected experimental units must be unique")
485
+
486
+ examples: list[BenchmarkExample] = []
487
+ checkpoints_by_id: dict[str, Tau3BankingCheckpoint] = {}
488
+ task_ids = set(bundle.task_ids)
489
+ for checkpoint in sorted(normalized, key=lambda item: item.checkpoint_id):
490
+ if checkpoint.task_id not in task_ids:
491
+ raise ValidationError(
492
+ f"tau3 checkpoint references unknown official task {checkpoint.task_id!r}"
493
+ )
494
+ if checkpoint.corpus_revision != bundle.corpus_revision:
495
+ raise ValidationError("tau3 checkpoint corpus revision differs from the bundle")
496
+ support = checkpoint.family_eligibility
497
+ clarification = support.eligibility[SemanticFamily.CLARIFY.value]
498
+ state_restore = checkpoint.structural_capabilities.get(
499
+ "state_restore_available",
500
+ False,
501
+ )
502
+ if clarification and not evaluation_bridge.supports_user_simulator_replay:
503
+ raise ValidationError(
504
+ "tau3 clarification checkpoint requires a bridge with "
505
+ "user-simulator replay support"
506
+ )
507
+ if state_restore and not evaluation_bridge.supports_state_restore:
508
+ raise ValidationError(
509
+ "tau3 checkpoint advertises state restoration but its bridge does not"
510
+ )
511
+ visible_metadata = _frozen_mapping(
512
+ {
513
+ "benchmark_cell": self.benchmark_id,
514
+ "family_eligibility": dict(support.eligibility),
515
+ "family_eligibility_provenance": support.provenance_status,
516
+ "family_eligibility_reasons": dict(support.reasons),
517
+ "family_support_status": support.support_status,
518
+ "source_split": self.split,
519
+ },
520
+ label="tau3 visible checkpoint metadata",
521
+ )
522
+ evaluator_gold = _frozen_mapping(
523
+ {"task_spec": bundle._task_specs[checkpoint.task_id]},
524
+ label="tau3 evaluator gold",
525
+ )
526
+ examples.append(
527
+ BenchmarkExample(
528
+ example_id=checkpoint.checkpoint_id,
529
+ query=checkpoint.query,
530
+ instruction=checkpoint.instruction,
531
+ visible_context=checkpoint.visible_context,
532
+ visible_messages=checkpoint.visible_messages,
533
+ visible_tool_names=checkpoint.tool_names,
534
+ visible_metadata=visible_metadata,
535
+ evaluator_gold=evaluator_gold,
536
+ optimizer_visible_id=opaque_checkpoint_state_id(
537
+ self.benchmark_id,
538
+ checkpoint.checkpoint_id,
539
+ checkpoint.replay_identity,
540
+ ),
541
+ )
542
+ )
543
+ checkpoints_by_id[checkpoint.checkpoint_id] = checkpoint
544
+
545
+ self.bundle = bundle
546
+ self._evaluation_bridge = evaluation_bridge
547
+ self._examples = tuple(examples)
548
+ self._examples_by_id = {example.example_id: example for example in examples}
549
+ self._checkpoints = MappingProxyType(checkpoints_by_id)
550
+
551
+ def examples(self, split: str) -> tuple[BenchmarkExample, ...]:
552
+ if split != self.split:
553
+ raise ValidationError(
554
+ f"tau3 Banking Knowledge adapter exposes split {self.split!r}, not {split!r}"
555
+ )
556
+ self.bundle.verify_integrity()
557
+ return self._examples
558
+
559
+ def family_eligibility(self, checkpoint_id: str) -> Tau3FamilyEligibility:
560
+ return self._checkpoint(checkpoint_id).family_eligibility
561
+
562
+ def eligible_families(self, checkpoint_id: str) -> tuple[SemanticFamily, ...]:
563
+ return self.family_eligibility(checkpoint_id).eligible_families
564
+
565
+ def supports_full_block(self, checkpoint_id: str) -> bool:
566
+ return self.family_eligibility(checkpoint_id).supports_full_block
567
+
568
+ def score(self, example: BenchmarkExample, prediction: Any) -> Mapping[str, float]:
569
+ if not isinstance(example, BenchmarkExample):
570
+ raise TypeError("example must be a BenchmarkExample")
571
+ if self._examples_by_id.get(example.example_id) is not example:
572
+ raise ValidationError("benchmark example does not belong to this tau3 adapter")
573
+ checkpoint = self._checkpoints[example.example_id]
574
+ result = self._evaluation_bridge.evaluate(
575
+ self.bundle._evaluator_payload(checkpoint.task_id),
576
+ checkpoint,
577
+ prediction,
578
+ )
579
+ if not isinstance(result, Tau3EvaluationResult):
580
+ raise ValidationError("tau3 evaluation bridge returned an invalid result type")
581
+ return result.metrics
582
+
583
+ @property
584
+ def evaluation_provenance(self) -> Mapping[str, Any]:
585
+ """Return explicit non-official provenance for result manifests."""
586
+
587
+ return _frozen_mapping(
588
+ {
589
+ "bridge_id": self._evaluation_bridge.bridge_id,
590
+ "bridge_revision": self._evaluation_bridge.bridge_revision,
591
+ "benchmark_id": self._evaluation_bridge.benchmark_id,
592
+ "cost_basis": self._evaluation_bridge.cost_basis,
593
+ "evaluation_scope": self._evaluation_bridge.evaluation_scope,
594
+ "official_runtime_verified": self._evaluation_bridge.official_runtime_verified,
595
+ "provenance_status": self._evaluation_bridge.provenance_status,
596
+ "source_revision": self._evaluation_bridge.source_revision,
597
+ "supports_state_restore": self._evaluation_bridge.supports_state_restore,
598
+ "supports_user_simulator_replay": (
599
+ self._evaluation_bridge.supports_user_simulator_replay
600
+ ),
601
+ },
602
+ label="tau3 evaluation provenance",
603
+ )
604
+
605
+ def _checkpoint(self, checkpoint_id: str) -> Tau3BankingCheckpoint:
606
+ try:
607
+ return self._checkpoints[checkpoint_id]
608
+ except KeyError as exc:
609
+ raise ValidationError(f"unknown tau3 checkpoint {checkpoint_id!r}") from exc
610
+
611
+
612
+ def _validated_bridge_metrics(value: Mapping[str, float]) -> Mapping[str, float]:
613
+ if not isinstance(value, Mapping):
614
+ raise ValidationError("tau3 evaluation bridge metrics must be a mapping")
615
+ expected = {"cost", "official_reward"}
616
+ if set(value) != expected:
617
+ raise ValidationError("tau3 evaluation bridge must return exactly official_reward and cost")
618
+ metrics: dict[str, float] = {}
619
+ for key in sorted(expected):
620
+ item = value[key]
621
+ if isinstance(item, bool) or not isinstance(item, (int, float)):
622
+ raise ValidationError(f"tau3 evaluation bridge metric {key!r} must be numeric")
623
+ numeric = float(item)
624
+ if not math.isfinite(numeric):
625
+ raise ValidationError(f"tau3 evaluation bridge metric {key!r} must be finite")
626
+ metrics[key] = numeric
627
+ if not 0.0 <= metrics["official_reward"] <= 1.0:
628
+ raise ValidationError("tau3 official_reward must be in [0, 1]")
629
+ if metrics["cost"] < 0.0:
630
+ raise ValidationError("tau3 cost must be non-negative")
631
+ return MappingProxyType(metrics)
632
+
633
+
634
+ def _validate_evaluation_bridge(bridge: Tau3EvaluationBridge) -> None:
635
+ if bridge.tau3_bridge_contract != "tau3_evaluation_bridge_v1":
636
+ raise ValidationError("tau3 bridge contract identity does not match")
637
+ if bridge.benchmark_id != _BENCHMARK_ID:
638
+ raise ValidationError("tau3 bridge benchmark identity does not match")
639
+ if bridge.source_revision != TAU3_OFFICIAL_SOURCE_REVISION:
640
+ raise ValidationError("tau3 bridge source revision does not match the audited commit")
641
+ if bridge.provenance_status != _CALLER_ASSERTED:
642
+ raise ValidationError("tau3 bridge provenance must remain caller_asserted")
643
+ if bridge.evaluation_scope != _EXTERNAL_BRIDGE:
644
+ raise ValidationError("tau3 bridge evaluation scope must remain external_bridge")
645
+ if bridge.official_runtime_verified is not False:
646
+ raise ValidationError("current tau3 bridge cannot claim official runtime verification")
647
+ for label in ("supports_state_restore", "supports_user_simulator_replay"):
648
+ if not isinstance(getattr(bridge, label), bool):
649
+ raise ValidationError(f"tau3 evaluation bridge {label} must be boolean")
650
+ for label in ("bridge_id", "cost_basis"):
651
+ value = getattr(bridge, label)
652
+ if not isinstance(value, str) or not value.strip() or value != value.strip():
653
+ raise ValidationError(f"tau3 evaluation bridge {label} must be non-empty")
654
+ if (
655
+ not isinstance(bridge.bridge_revision, str)
656
+ or _SHA256.fullmatch(bridge.bridge_revision) is None
657
+ ):
658
+ raise ValidationError("tau3 evaluation bridge revision must be a lowercase SHA-256")
659
+
660
+
661
+ def _verify_prepared_file_hashes(prepared: PreparedBenchmark) -> None:
662
+ for name, expected in sorted(prepared.file_sha256.items()):
663
+ if not isinstance(expected, str) or _SHA256.fullmatch(expected) is None:
664
+ raise ArtifactError(f"prepared tau3 hash is invalid for {name}")
665
+ path = prepared.root / name
666
+ try:
667
+ actual = sha256_file(path)
668
+ except OSError as exc:
669
+ raise ArtifactError(f"prepared tau3 file cannot be verified: {name}") from exc
670
+ if actual != expected:
671
+ raise ArtifactError(f"prepared tau3 file hash mismatch: {name}")
672
+
673
+
674
+ def _records_by_id(path: Path, *, label: str) -> dict[str, dict[str, Any]]:
675
+ rows = _read_jsonl(path, label=label)
676
+ indexed: dict[str, dict[str, Any]] = {}
677
+ for row in rows:
678
+ row_id = row.get("id")
679
+ if not isinstance(row_id, str) or not row_id.strip():
680
+ raise ArtifactError(f"{label} IDs must be non-empty strings")
681
+ if row_id in indexed:
682
+ raise ArtifactError(f"{label} contains duplicate IDs")
683
+ indexed[row_id] = row
684
+ return indexed
685
+
686
+
687
+ def _read_jsonl(path: Path, *, label: str) -> list[dict[str, Any]]:
688
+ try:
689
+ lines = path.read_text(encoding="utf-8").splitlines()
690
+ except OSError as exc:
691
+ raise ArtifactError(f"{label} cannot be read") from exc
692
+ rows: list[dict[str, Any]] = []
693
+ for line_number, line in enumerate(lines, start=1):
694
+ if not line.strip():
695
+ continue
696
+ try:
697
+ row = json.loads(line)
698
+ except json.JSONDecodeError as exc:
699
+ raise ArtifactError(f"{label} contains invalid JSON at line {line_number}") from exc
700
+ if not isinstance(row, dict):
701
+ raise ArtifactError(f"{label} rows must be objects")
702
+ rows.append(row)
703
+ if not rows:
704
+ raise ArtifactError(f"{label} must not be empty")
705
+ return rows
706
+
707
+
708
+ def _frozen_mapping(value: Mapping[str, Any], *, label: str) -> Mapping[str, Any]:
709
+ try:
710
+ detached = json.loads(canonical_json(value))
711
+ return freeze_mapping(detached)
712
+ except (TypeError, ValueError) as exc:
713
+ raise ArtifactError(f"{label} must be canonically serializable") from exc
714
+
715
+
716
+ __all__ = [
717
+ "TAU3_OFFICIAL_SOURCE_REVISION",
718
+ "CallerAssertedTau3EvaluationBridge",
719
+ "PreparedTau3BankingBundle",
720
+ "Tau3BankingCheckpoint",
721
+ "Tau3BankingCheckpointAdapter",
722
+ "Tau3EvaluationBridge",
723
+ "Tau3EvaluationResult",
724
+ "Tau3FamilyEligibility",
725
+ ]