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,269 @@
1
+ """Pinned, small BEIR candidate pools for compatibility, not full-corpus scores.
2
+
3
+ The operator supplies a source-bound bundle. This adapter never accesses the
4
+ network, guesses URLs, downloads a corpus, or treats a sample as a leaderboard
5
+ run. Reference judgments are evaluator-only; candidate enrichment is explicit.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import hashlib
11
+ import json
12
+ import re
13
+ from collections.abc import Mapping
14
+ from pathlib import Path, PurePosixPath
15
+
16
+ from agentinputlab.backends import Document
17
+ from agentinputlab.contracts import ArtifactError, ValidationError
18
+ from agentinputlab.metrics import evaluation_dependency_versions
19
+
20
+ from .preprocess import PreparedBenchmark
21
+ from .retrieval import PreparedRetrievalBenchmarkAdapter, RetrievalPrediction, _records_by_id
22
+
23
+ _SHA256 = re.compile(r"^[a-f0-9]{64}$")
24
+ _REVISION = re.compile(r"^[a-f0-9]{40}$")
25
+ _SCOPE = "fixed_gold_enriched_compatibility_subset"
26
+ _FORUMS = {
27
+ "android",
28
+ "english",
29
+ "gaming",
30
+ "gis",
31
+ "mathematica",
32
+ "physics",
33
+ "programmers",
34
+ "stats",
35
+ "tex",
36
+ "unix",
37
+ "webmasters",
38
+ "wordpress",
39
+ }
40
+ _MAX_BUNDLE_BYTES = 16 * 1024**2
41
+
42
+
43
+ class BEIRSampleAdapter(PreparedRetrievalBenchmarkAdapter):
44
+ """Load a byte-locked source-side sample and use native IR metric providers.
45
+
46
+ Positive qrels plus fixed background rows form the candidate pool. That
47
+ enrichment tests the protocol and implementation, not retrieval quality on
48
+ the complete corpus. CQADupstack IDs are namespaced per forum and retrieval
49
+ must remain within that forum. No upstream data is distributed by this API.
50
+ """
51
+
52
+ def __init__(self, root: str | Path, *, manifest_sha256: str, license_acknowledged=False):
53
+ if not license_acknowledged:
54
+ raise ValidationError(
55
+ "review upstream sample data terms and set license_acknowledged=True"
56
+ )
57
+ if not isinstance(manifest_sha256, str) or not _SHA256.fullmatch(manifest_sha256):
58
+ raise ValidationError("sample requires a pinned manifest SHA-256")
59
+ supplied = Path(root).expanduser()
60
+ if supplied.is_symlink():
61
+ raise ArtifactError("sample root must not be a symlink")
62
+ self.root = supplied.resolve()
63
+ self._read_bytes = 0
64
+ raw = self._read_file("manifest.json")
65
+ if hashlib.sha256(raw).hexdigest() != manifest_sha256:
66
+ raise ArtifactError("sample manifest checksum differs")
67
+ manifest = json.loads(raw)
68
+ if manifest.get("schema_version") != "agentinputlab.beir.sample.v1":
69
+ raise ArtifactError("unknown BEIR sample schema")
70
+ benchmark = manifest.get("benchmark_id")
71
+ if benchmark not in {"beir.fever", "beir.cqadupstack"}:
72
+ raise ArtifactError("sample benchmark has no reviewed source profile")
73
+ if (
74
+ manifest.get("split") != "test"
75
+ or manifest.get("corpus_scope") != _SCOPE
76
+ or manifest.get("full_dataset_score") is not False
77
+ or manifest.get("full_benchmark_corpus_download") is not False
78
+ ):
79
+ raise ArtifactError("sample must explicitly exclude full-corpus evaluation")
80
+ expected_repos = (
81
+ {"BeIR/fever", "BeIR/fever-qrels"}
82
+ if benchmark == "beir.fever"
83
+ else {"BeIR/cqadupstack", "BeIR/cqadupstack-qrels"}
84
+ )
85
+ revisions = manifest.get("source_revisions")
86
+ if (
87
+ not isinstance(revisions, dict)
88
+ or set(revisions) != expected_repos
89
+ or any(
90
+ not isinstance(value, str) or not _REVISION.fullmatch(value)
91
+ for value in revisions.values()
92
+ )
93
+ ):
94
+ raise ArtifactError("sample source repository/revision identities differ")
95
+ groups = manifest.get("groups")
96
+ if (
97
+ not isinstance(groups, list)
98
+ or not groups
99
+ or any(not isinstance(group, str) for group in groups)
100
+ or len(set(groups)) != len(groups)
101
+ or (groups != [""] if benchmark == "beir.fever" else not set(groups) <= _FORUMS)
102
+ ):
103
+ raise ArtifactError("sample forum identities differ")
104
+ if manifest.get("license_id") != "CC-BY-SA-4.0":
105
+ raise ArtifactError("sample must retain its declared upstream data license")
106
+ files = manifest.get("files")
107
+ if not isinstance(files, dict) or set(files) != {
108
+ "inputs.jsonl",
109
+ "gold.jsonl",
110
+ "corpus.jsonl",
111
+ }:
112
+ raise ArtifactError("sample needs exact input/gold/corpus files")
113
+ for name, lock in files.items():
114
+ self._verified_file(name, lock)
115
+ resources = manifest.get("resources")
116
+ if not isinstance(resources, list) or not resources or len(resources) > 128:
117
+ raise ArtifactError("sample source evidence resources are required and bounded")
118
+ seen = set()
119
+ for resource in resources:
120
+ if not isinstance(resource, dict):
121
+ raise ArtifactError("sample source resource must be an object")
122
+ name = resource.get("path")
123
+ if not isinstance(name, str) or not name.startswith("resources/") or name in seen:
124
+ raise ArtifactError("sample source evidence paths differ")
125
+ seen.add(name)
126
+ self._verified_file(name, resource)
127
+ if resource.get("source_revision") not in revisions.values():
128
+ raise ArtifactError("sample source evidence revision is undeclared")
129
+ if not isinstance(resource.get("url"), str) or not resource["url"].startswith(
130
+ "https://"
131
+ ):
132
+ raise ArtifactError("sample source evidence needs its HTTPS origin")
133
+ corpus = _records_by_id(self.root / "corpus.jsonl", label="sample corpus")
134
+ for did, row in corpus.items():
135
+ group = row.get("forum")
136
+ if group not in groups or (group and not did.startswith(group + "::")):
137
+ raise ArtifactError("sample document forum/ID namespace differs")
138
+ if (
139
+ not isinstance(row.get("title"), str)
140
+ or not isinstance(row.get("text"), str)
141
+ or not row["text"].strip()
142
+ ):
143
+ raise ArtifactError("sample document title/text is invalid")
144
+ counts = manifest.get("counts")
145
+ if (
146
+ not isinstance(counts, dict)
147
+ or set(counts) != {"inputs", "gold", "corpus"}
148
+ or any(type(value) is not int or value < 1 for value in counts.values())
149
+ ):
150
+ raise ArtifactError("sample counts are missing")
151
+ prepared = PreparedBenchmark(
152
+ asset_id=benchmark + ".compatibility-sample",
153
+ processor="beir_source_sample_v1",
154
+ processor_revision="1",
155
+ source_sha256=manifest_sha256,
156
+ root=self.root,
157
+ counts=counts,
158
+ file_sha256={name: lock["sha256"] for name, lock in files.items()},
159
+ cell_id=benchmark,
160
+ source_revision=manifest_sha256,
161
+ split="test",
162
+ )
163
+ super().__init__(prepared, benchmark_id=benchmark, split="test")
164
+ self._ignore_identical_ids = True
165
+ if counts != {
166
+ "inputs": len(self._examples),
167
+ "gold": len(self._examples),
168
+ "corpus": len(corpus),
169
+ }:
170
+ raise ArtifactError("sample counts differ from locked files")
171
+ observed = set()
172
+ for example in self._examples:
173
+ group = example.visible_metadata.get("forum")
174
+ if group not in groups or (group and not example.example_id.startswith(group + "::")):
175
+ raise ArtifactError("sample query forum/ID namespace differs")
176
+ observed.add(group)
177
+ for did in example.evaluator_gold["relevance"]:
178
+ if did not in corpus or corpus[did]["forum"] != group:
179
+ raise ArtifactError("sample qrel document missing or from another forum")
180
+ if observed != set(groups):
181
+ raise ArtifactError("sample claims a forum without query evidence")
182
+ self.manifest_sha256, self.manifest = manifest_sha256, manifest
183
+ self.groups = tuple(groups)
184
+ self._corpus = corpus
185
+
186
+ def _read_file(self, name):
187
+ parts = PurePosixPath(name)
188
+ if parts.is_absolute() or ".." in parts.parts or "\\" in name:
189
+ raise ArtifactError("sample file path is unsafe")
190
+ path = self.root / name
191
+ current = self.root
192
+ for part in parts.parts:
193
+ current = current / part
194
+ if current.is_symlink():
195
+ raise ArtifactError("sample files must not use symlinks")
196
+ if not path.is_file() or path.stat().st_size + self._read_bytes > _MAX_BUNDLE_BYTES:
197
+ raise ArtifactError("sample file absent or bundle exceeds 16 MiB")
198
+ with path.open("rb") as handle:
199
+ raw = handle.read(_MAX_BUNDLE_BYTES - self._read_bytes + 1)
200
+ if len(raw) + self._read_bytes > _MAX_BUNDLE_BYTES:
201
+ raise ArtifactError("sample bundle exceeds 16 MiB")
202
+ self._read_bytes += len(raw)
203
+ return raw
204
+
205
+ def _verified_file(self, name, lock):
206
+ if not isinstance(lock, dict):
207
+ raise ArtifactError("sample file lock must be an object")
208
+ raw = self._read_file(name)
209
+ if len(raw) != lock.get("size_bytes") or hashlib.sha256(raw).hexdigest() != lock.get(
210
+ "sha256"
211
+ ):
212
+ raise ArtifactError("sample file checksum/size differs")
213
+
214
+ def iter_documents(self, *, forum=None):
215
+ if forum is not None and forum not in self.groups:
216
+ raise ValidationError("unknown sample forum")
217
+ for did in sorted(self._corpus):
218
+ row = self._corpus[did]
219
+ if forum is None or forum == row["forum"]:
220
+ yield Document(
221
+ doc_id=did,
222
+ title=row["title"],
223
+ text=row["text"],
224
+ corpus_revision=self.manifest_sha256,
225
+ metadata={"forum": row["forum"]},
226
+ )
227
+
228
+ def score(self, example, prediction):
229
+ if isinstance(prediction, RetrievalPrediction):
230
+ normalized = prediction
231
+ elif isinstance(prediction, Mapping):
232
+ normalized = RetrievalPrediction(prediction)
233
+ else:
234
+ normalized = RetrievalPrediction.from_ranked_ids(prediction)
235
+ group = example.visible_metadata.get("forum")
236
+ if any(
237
+ did not in self._corpus or self._corpus[did]["forum"] != group
238
+ for did in normalized.scores
239
+ ):
240
+ raise ValidationError(
241
+ "sample prediction must contain only same-forum candidate documents"
242
+ )
243
+ return super().score(example, normalized)
244
+
245
+ def fingerprint(self):
246
+ return {
247
+ "benchmark_id": self.benchmark_id,
248
+ "sample_manifest_sha256": self.manifest_sha256,
249
+ "source_revisions": dict(self.manifest["source_revisions"]),
250
+ "groups": list(self.groups),
251
+ "split": "test",
252
+ "test_queries": len(self._examples),
253
+ "corpus_documents": len(self._corpus),
254
+ "corpus_scope": _SCOPE,
255
+ "metrics_scope": "sampled_candidate_pool_only",
256
+ "query_selection": self.manifest.get("query_selection"),
257
+ "background_selection": self.manifest.get("background_selection"),
258
+ "full_dataset_score": False,
259
+ "full_benchmark_corpus_download": False,
260
+ "downloaded_source_scope": self.manifest.get(
261
+ "downloaded_source_scope", "source_side_rows"
262
+ ),
263
+ "scorer": "ir_measures:nDCG@10,R@100",
264
+ "ignore_identical_ids": True,
265
+ "evaluation_dependencies": dict(evaluation_dependency_versions()),
266
+ }
267
+
268
+
269
+ __all__ = ["BEIRSampleAdapter"]
@@ -0,0 +1,245 @@
1
+ """Source-verified BFCL v1.3 Python AST scoring for local FC transports.
2
+
3
+ The original checker, tool-schema converter and OpenAI FC decoder are loaded
4
+ from the checksum-pinned archive, not reimplemented or vendored. Only their
5
+ required Python definitions execute. Commercial API handlers, model inference,
6
+ Java/JS parsers and the unsafe prompting decoder are not loaded. This is a
7
+ case-level Python AST evaluation, not the aggregate BFCL leaderboard workflow.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import ast
13
+ import builtins
14
+ import copy
15
+ import hashlib
16
+ import json
17
+ import re
18
+ import tarfile
19
+ from collections.abc import Mapping
20
+ from dataclasses import dataclass, field
21
+ from pathlib import Path
22
+ from types import ModuleType, SimpleNamespace
23
+ from typing import Any
24
+
25
+ from agentinputlab.contracts import ArtifactError, ValidationError
26
+ from agentinputlab.contracts.serialization import to_jsonable
27
+
28
+ from .bfcl_v3 import (
29
+ BFCL_V3_AST_CHECKER_REVISION,
30
+ BFCL_V3_OFFICIAL_SOURCE_REVISION,
31
+ BFCL_V3_SOURCE_ARCHIVE_SHA256,
32
+ BFCLV3EvaluationResult,
33
+ )
34
+
35
+ BFCL_NATIVE_SCOPE = "source_verified_python_ast_openai_fc"
36
+ BFCL_NATIVE_SCORER_ID = "bfcl_eval.eval_checker.ast_eval.ast_checker:ast_checker"
37
+ _PREFIX = "gorilla-1.3/berkeley-function-call-leaderboard/"
38
+ _SOURCES = {
39
+ "bfcl_eval.eval_checker.ast_eval.ast_checker": BFCL_V3_AST_CHECKER_REVISION,
40
+ "bfcl_eval.constants.type_mappings": "1702fb67afbe2c492608e58e2b7d02e46381f50166b47f3c952f76e34c7cd3bd",
41
+ "bfcl_eval.constants.model_config": "26bff7e39e1ea018c5fd5a55882a0020a98f63f76068ece29e68f4ff6e8c4cb1",
42
+ "bfcl_eval.utils": "255e6dad9a6533c8e52b4c8b2bfc78c0744b915605e09c04808df6c023f4a43f",
43
+ "bfcl_eval.model_handler.model_style": "0244f6108e85b40379d7ddd80d4f7b699a270972c4d8cf37966a4aa677f8ba57",
44
+ "bfcl_eval.model_handler.utils": "153bb33a9515ea2d6ee6a1387faaa464c7be4fe9c6a9f88cc17ad23a1cc306d2",
45
+ "bfcl_eval.model_handler.api_inference.openai_completion": "b84c67a86190e1b8dbc38e72cb5f175ad106b1017cf14f19655318f3379ba00a",
46
+ "bfcl_eval.eval_checker.ast_eval.type_convertor.java_type_converter": "2fd4f4b0443b3dd974a1723bb4e45c086d7b352631062da7807ad1ad40706604",
47
+ "bfcl_eval.eval_checker.ast_eval.type_convertor.js_type_converter": "a114e9ff75c025cb52787ac33d6c2fbaa390905c6125a2b3c6afebab232bb5e4",
48
+ }
49
+
50
+
51
+ @dataclass(frozen=True, slots=True)
52
+ class SourceVerifiedBFCLV3Result(BFCLV3EvaluationResult):
53
+ provenance_status: str = field(init=False, default="source_verified")
54
+ evaluation_scope: str = field(init=False, default=BFCL_NATIVE_SCOPE)
55
+ # The full official CLI/aggregate workflow is intentionally not asserted.
56
+ official_runtime_verified: bool = field(init=False, default=False)
57
+ diagnostic: Mapping[str, Any] = field(default_factory=dict)
58
+
59
+
60
+ class _PinnedPythonDefinitions:
61
+ """Isolated source namespace; no upstream package is installed globally."""
62
+
63
+ def __init__(self, archive, model_id):
64
+ self.archive = archive
65
+ self.model_id = model_id
66
+ self.modules = {}
67
+ self.hashes = {}
68
+
69
+ def source(self, name):
70
+ path = _PREFIX + name.replace(".", "/") + ".py"
71
+ member = self.archive.getmember(path)
72
+ if not member.isfile() or member.size > 2 * 1024 * 1024:
73
+ raise ArtifactError("BFCL source member is not a bounded regular file")
74
+ raw = self.archive.extractfile(member).read()
75
+ observed = hashlib.sha256(raw).hexdigest()
76
+ expected = _SOURCES.get(name)
77
+ if expected is not None and observed != expected:
78
+ raise ArtifactError("BFCL source definition checksum differs")
79
+ self.hashes[name] = observed
80
+ return raw.decode()
81
+
82
+ def imported(self, name, globals=None, locals=None, fromlist=(), level=0):
83
+ if name.startswith("bfcl_eval."):
84
+ return self.module(name)
85
+ return builtins.__import__(name, globals, locals, fromlist, level)
86
+
87
+ def module(self, name):
88
+ if name in self.modules:
89
+ return self.modules[name]
90
+ if name not in _SOURCES:
91
+ raise ArtifactError("BFCL scorer requested an unapproved source module")
92
+ module = ModuleType("_agentinputlab_native_" + name)
93
+ self.modules[name] = module
94
+ namespace = module.__dict__
95
+ namespace["__builtins__"] = {**vars(builtins), "__import__": self.imported}
96
+ source = self.source(name)
97
+ if name == "bfcl_eval.constants.model_config":
98
+ # The native checker only needs the transport's name-normalization
99
+ # flag. Register the ACTUAL operator model ID for the standard FC
100
+ # protocol; do not label it as an upstream leaderboard model.
101
+ namespace["MODEL_CONFIG_MAPPING"] = {
102
+ self.model_id.replace("_", "/"): SimpleNamespace(underscore_to_dot=True)
103
+ }
104
+ elif name == "bfcl_eval.model_handler.utils":
105
+ tree = ast.parse(source)
106
+ selected = [
107
+ n
108
+ for n in tree.body
109
+ if isinstance(n, ast.FunctionDef)
110
+ and n.name in {"_cast_to_openai_type", "convert_to_tool"}
111
+ ]
112
+ if len(selected) != 2:
113
+ raise ArtifactError("BFCL native tool converter definitions differ")
114
+ namespace.update(
115
+ copy=copy,
116
+ re=re,
117
+ json=json,
118
+ ModelStyle=self.module("bfcl_eval.model_handler.model_style").ModelStyle,
119
+ GORILLA_TO_OPENAPI=self.module(
120
+ "bfcl_eval.constants.type_mappings"
121
+ ).GORILLA_TO_OPENAPI,
122
+ )
123
+ exec(compile(ast.Module(body=selected, type_ignores=[]), name, "exec"), namespace)
124
+ elif name == "bfcl_eval.model_handler.api_inference.openai_completion":
125
+ tree = ast.parse(source)
126
+ parent = next(
127
+ n
128
+ for n in tree.body
129
+ if isinstance(n, ast.ClassDef) and n.name == "OpenAICompletionsHandler"
130
+ )
131
+ decode = next(
132
+ n for n in parent.body if isinstance(n, ast.FunctionDef) and n.name == "decode_ast"
133
+ )
134
+ # Keep the exact upstream FC branch; no API constructor or unsafe
135
+ # eval-based prompting decoder is reachable on this bound object.
136
+ namespace["json"] = json
137
+ exec(compile(ast.Module(body=[decode], type_ignores=[]), name, "exec"), namespace)
138
+ elif name == "bfcl_eval.utils":
139
+ tree = ast.parse(source)
140
+ validate = next(
141
+ n
142
+ for n in tree.body
143
+ if isinstance(n, ast.FunctionDef) and n.name == "is_function_calling_format_output"
144
+ )
145
+ exec(compile(ast.Module(body=[validate], type_ignores=[]), name, "exec"), namespace)
146
+ else:
147
+ exec(compile(source, name, "exec"), namespace)
148
+ return module
149
+
150
+
151
+ class SourceVerifiedBFCLV3ASTBridge:
152
+ bfcl_bridge_contract = "bfcl_v3_scorer_bridge_v1"
153
+ benchmark_id = "bfcl.v3.simple_python"
154
+ source_revision = BFCL_V3_OFFICIAL_SOURCE_REVISION
155
+ scorer_id = BFCL_NATIVE_SCORER_ID
156
+ scorer_revision = BFCL_V3_AST_CHECKER_REVISION
157
+ ast_checker_revision = BFCL_V3_AST_CHECKER_REVISION
158
+ model_handler_id = "bfcl_eval.model_handler.api_inference.openai_completion:OpenAICompletionsHandler.decode_ast.FC"
159
+ model_handler_revision = _SOURCES["bfcl_eval.model_handler.api_inference.openai_completion"]
160
+ bridge_id = "agentinputlab.bfcl.source_verified_python_fc.v1"
161
+ bridge_revision = hashlib.sha256(
162
+ b"BFCL-v1.3-pinned-Python-AST+native-FC-decoder+native-schema-converter-v1"
163
+ ).hexdigest()
164
+ test_category = "simple"
165
+ language = "Python"
166
+ provenance_status = "source_verified"
167
+ evaluation_scope = BFCL_NATIVE_SCOPE
168
+ official_runtime_verified = False
169
+
170
+ def __init__(self, *, source_archive: str | Path, model_id: str):
171
+ if not isinstance(model_id, str) or not model_id.strip():
172
+ raise ValidationError("BFCL scorer requires the actual model ID")
173
+ archive = Path(source_archive)
174
+ if hashlib.sha256(archive.read_bytes()).hexdigest() != BFCL_V3_SOURCE_ARCHIVE_SHA256:
175
+ raise ArtifactError("BFCL official source archive checksum differs")
176
+ with tarfile.open(archive, "r:gz") as tar:
177
+ loader = _PinnedPythonDefinitions(tar, model_id)
178
+ self._checker = loader.module("bfcl_eval.eval_checker.ast_eval.ast_checker").ast_checker
179
+ self._decoder = loader.module(
180
+ "bfcl_eval.model_handler.api_inference.openai_completion"
181
+ ).decode_ast
182
+ self._format_valid = loader.module("bfcl_eval.utils").is_function_calling_format_output
183
+ self._utilities = loader.module("bfcl_eval.model_handler.utils")
184
+ self.source_hashes = dict(loader.hashes)
185
+ self.model_id = model_id
186
+ self._handler = SimpleNamespace(model_name=model_id, is_fc_model=True)
187
+ self._verified_source_sha256 = BFCL_V3_SOURCE_ARCHIVE_SHA256
188
+
189
+ def tools(self, function: Mapping[str, Any]) -> tuple[Mapping[str, Any], ...]:
190
+ tools = self._utilities.convert_to_tool(
191
+ [to_jsonable(function)],
192
+ self._utilities.GORILLA_TO_OPENAPI,
193
+ self._utilities.ModelStyle.OpenAI_Completions,
194
+ )
195
+ return tuple(tools)
196
+
197
+ def evaluate(
198
+ self, evaluator_payload: Mapping[str, Any], prediction: Any
199
+ ) -> SourceVerifiedBFCLV3Result:
200
+ if (
201
+ evaluator_payload.get("language") != "Python"
202
+ or evaluator_payload.get("test_category") != "simple"
203
+ ):
204
+ raise ValidationError("native BFCL bridge supports Python simple only")
205
+ try:
206
+ if not isinstance(prediction, (list, tuple)):
207
+ raise ValueError("FC result must be a function-call sequence")
208
+ decoded = self._decoder(self._handler, to_jsonable(prediction), language="Python")
209
+ except (KeyError, TypeError, ValueError, IndexError) as exc:
210
+ return SourceVerifiedBFCLV3Result(
211
+ 0.0,
212
+ diagnostic={
213
+ "error_type": "ast_decoder:decoder_failed",
214
+ "decoder_error": type(exc).__name__,
215
+ },
216
+ )
217
+ if not self._format_valid(decoded):
218
+ return SourceVerifiedBFCLV3Result(
219
+ 0.0, diagnostic={"error_type": "ast_decoder:decoder_wrong_output_format"}
220
+ )
221
+ result = self._checker(
222
+ [to_jsonable(evaluator_payload["function"])],
223
+ decoded,
224
+ to_jsonable(evaluator_payload["ground_truth"]),
225
+ "Python",
226
+ "simple",
227
+ self.model_id,
228
+ )
229
+ return SourceVerifiedBFCLV3Result(
230
+ float(bool(result["valid"])), diagnostic=to_jsonable(result)
231
+ )
232
+
233
+ def fingerprint(self):
234
+ return {
235
+ "source_archive_sha256": self._verified_source_sha256,
236
+ "source_revision": self.source_revision,
237
+ "model_id": self.model_id,
238
+ "transport": "openai_compatible_function_calling",
239
+ "name_normalization": "native_dots_to_underscores",
240
+ "source_hashes": dict(self.source_hashes),
241
+ "source_code_verified": True,
242
+ "official_runtime_verified": False,
243
+ "scope": self.evaluation_scope,
244
+ "aggregate_leaderboard_claimed": False,
245
+ }