evalkit-py 0.2.0.dev12__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 (371) hide show
  1. evalkit/__init__.py +0 -0
  2. evalkit/api/__init__.py +0 -0
  3. evalkit/api/access.py +74 -0
  4. evalkit/api/agents.py +159 -0
  5. evalkit/api/app.py +360 -0
  6. evalkit/api/auth.py +225 -0
  7. evalkit/api/cli_dist.py +10 -0
  8. evalkit/api/datasets.py +169 -0
  9. evalkit/api/deps.py +79 -0
  10. evalkit/api/download.py +15 -0
  11. evalkit/api/evaluators.py +121 -0
  12. evalkit/api/experiments.py +616 -0
  13. evalkit/api/fixtures.py +95 -0
  14. evalkit/api/harness_check.py +48 -0
  15. evalkit/api/imports.py +180 -0
  16. evalkit/api/limits.py +84 -0
  17. evalkit/api/llm_providers.py +120 -0
  18. evalkit/api/mcp/__init__.py +0 -0
  19. evalkit/api/mcp/auth.py +100 -0
  20. evalkit/api/mcp/descriptions.py +336 -0
  21. evalkit/api/mcp/models.py +259 -0
  22. evalkit/api/mcp/server.py +101 -0
  23. evalkit/api/mcp/tools.py +844 -0
  24. evalkit/api/meta.py +19 -0
  25. evalkit/api/otel.py +350 -0
  26. evalkit/api/pull.py +197 -0
  27. evalkit/api/review.py +271 -0
  28. evalkit/api/runs.py +555 -0
  29. evalkit/api/server_keys.py +44 -0
  30. evalkit/api/tokens.py +51 -0
  31. evalkit/api/trace_imports.py +173 -0
  32. evalkit/api/trace_sources.py +49 -0
  33. evalkit/api/traces.py +196 -0
  34. evalkit/api/users.py +72 -0
  35. evalkit/api/workspaces.py +131 -0
  36. evalkit/bundled/contracts/atif-accepted.json +5 -0
  37. evalkit/bundled/contracts/custom-evaluator-api-v1.json +243 -0
  38. evalkit/bundled/contracts/harness-api-v1.json +938 -0
  39. evalkit/bundled/contracts/span-mapping-v1.json +314 -0
  40. evalkit/bundled/docs/concepts.md +26 -0
  41. evalkit/bundled/docs/config.md +38 -0
  42. evalkit/bundled/docs/harness-api.md +44 -0
  43. evalkit/bundled/docs/install.md +60 -0
  44. evalkit/bundled/docs/login.md +36 -0
  45. evalkit/bundled/docs/mappings.md +136 -0
  46. evalkit/bundled/docs/mcp.md +44 -0
  47. evalkit/bundled/docs/quickstart.md +142 -0
  48. evalkit/bundled/docs/sdk-runs.md +171 -0
  49. evalkit/bundled/docs/tracing.md +171 -0
  50. evalkit/bundled/docs/try-locally.md +288 -0
  51. evalkit/bundled/docs/workspaces.md +45 -0
  52. evalkit/bundled/skills/authoring-eval-cases/SKILL.md +387 -0
  53. evalkit/bundled/skills/authoring-eval-cases/references/overlays.md +83 -0
  54. evalkit/bundled/skills/authoring-eval-cases/references/tool-checks.md +71 -0
  55. evalkit/bundled/skills/connect-traces/SKILL.md +296 -0
  56. evalkit/bundled/skills/connect-traces/references/gen_ai.json +42 -0
  57. evalkit/bundled/skills/connect-traces/references/openinference.json +35 -0
  58. evalkit/bundled/skills/connect-traces/references/span-mapping-schema.md +88 -0
  59. evalkit/bundled/skills/eval-driven-development/SKILL.md +458 -0
  60. evalkit/bundled/skills/eval-driven-development/references/analyze-run.md +97 -0
  61. evalkit/bundled/skills/eval-driven-development/references/diagnose.md +130 -0
  62. evalkit/bundled/skills/eval-driven-development/references/synthesize-cases.md +87 -0
  63. evalkit/bundled/skills/eval-driven-development/references/synthesize.md +165 -0
  64. evalkit/bundled/skills/evalkit-deployment/SKILL.md +332 -0
  65. evalkit/bundled/skills/evalkit-deployment/config.example.yaml +49 -0
  66. evalkit/bundled/skills/evalkit-deployment/docker-compose.yml +51 -0
  67. evalkit/bundled/skills/evalkit-deployment/references/config-and-deploy.md +333 -0
  68. evalkit/bundled/skills/evalkit-deployment/references/harness-api.md +139 -0
  69. evalkit/bundled/skills/evalkit-deployment/try/.env.example +11 -0
  70. evalkit/bundled/skills/evalkit-deployment/try/agent.py +131 -0
  71. evalkit/bundled/skills/evalkit-deployment/try/cases/acme/balance-sheet/cases.yaml +25 -0
  72. evalkit/bundled/skills/evalkit-deployment/try/cases/acme/income-statement/cases.yaml +43 -0
  73. evalkit/bundled/skills/evalkit-deployment/try/config.yaml +17 -0
  74. evalkit/bundled/skills/evalkit-deployment/try/docker-compose.yml +82 -0
  75. evalkit/bundled/skills/evalkit-deployment/try/evalkit.yaml +4 -0
  76. evalkit/bundled/skills/evalkit-deployment/try/mapping.json +42 -0
  77. evalkit/bundled/skills/evalkit-deployment/try/run.py +33 -0
  78. evalkit/bundled/skills/evalkit-usage/SKILL.md +509 -0
  79. evalkit/bundled/skills/evalkit-usage/references/suite-fixtures.md +42 -0
  80. evalkit/bundled/ui/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  81. evalkit/bundled/ui/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  82. evalkit/bundled/ui/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  83. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  84. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  85. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  86. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  87. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  88. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  89. evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  90. evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  91. evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  92. evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  93. evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  94. evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  95. evalkit/bundled/ui/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  96. evalkit/bundled/ui/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  97. evalkit/bundled/ui/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  98. evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  99. evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  100. evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  101. evalkit/bundled/ui/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  102. evalkit/bundled/ui/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  103. evalkit/bundled/ui/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  104. evalkit/bundled/ui/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  105. evalkit/bundled/ui/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  106. evalkit/bundled/ui/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  107. evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  108. evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  109. evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  110. evalkit/bundled/ui/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  111. evalkit/bundled/ui/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  112. evalkit/bundled/ui/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  113. evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  114. evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  115. evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  116. evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  117. evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  118. evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  119. evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  120. evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  121. evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  122. evalkit/bundled/ui/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  123. evalkit/bundled/ui/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  124. evalkit/bundled/ui/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  125. evalkit/bundled/ui/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  126. evalkit/bundled/ui/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  127. evalkit/bundled/ui/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  128. evalkit/bundled/ui/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  129. evalkit/bundled/ui/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  130. evalkit/bundled/ui/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  131. evalkit/bundled/ui/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  132. evalkit/bundled/ui/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  133. evalkit/bundled/ui/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  134. evalkit/bundled/ui/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  135. evalkit/bundled/ui/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  136. evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  137. evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  138. evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  139. evalkit/bundled/ui/assets/abap-08VXUWAP.js +1 -0
  140. evalkit/bundled/ui/assets/apex-BWPQTe0t.js +1 -0
  141. evalkit/bundled/ui/assets/azcli-Bc_sGQ0U.js +1 -0
  142. evalkit/bundled/ui/assets/bat-i0X4ZdIN.js +1 -0
  143. evalkit/bundled/ui/assets/bicep-B5-_aFwp.js +2 -0
  144. evalkit/bundled/ui/assets/cameligo-DMUM7wLl.js +1 -0
  145. evalkit/bundled/ui/assets/clojure-Cm7r79vr.js +1 -0
  146. evalkit/bundled/ui/assets/codicon-DF1abBS2.ttf +0 -0
  147. evalkit/bundled/ui/assets/coffee-Ba7i2nA0.js +1 -0
  148. evalkit/bundled/ui/assets/cpp-C7h46wYY.js +1 -0
  149. evalkit/bundled/ui/assets/csharp-BKxtCVv1.js +1 -0
  150. evalkit/bundled/ui/assets/csp-bTuwJoIa.js +1 -0
  151. evalkit/bundled/ui/assets/css-DIMkf-bt.js +3 -0
  152. evalkit/bundled/ui/assets/css.worker-DwfUZ3fB.js +96 -0
  153. evalkit/bundled/ui/assets/cssMode-C97l1pbB.js +1 -0
  154. evalkit/bundled/ui/assets/cypher-CVaqCwHa.js +1 -0
  155. evalkit/bundled/ui/assets/dart-onAF5SnQ.js +1 -0
  156. evalkit/bundled/ui/assets/dockerfile-DZFCIeNp.js +1 -0
  157. evalkit/bundled/ui/assets/ecl-94qehhXe.js +1 -0
  158. evalkit/bundled/ui/assets/editor-DjpsE8to.css +1 -0
  159. evalkit/bundled/ui/assets/editor.api-NTesIxw5.js +908 -0
  160. evalkit/bundled/ui/assets/editor.worker-CRz__AKW.js +33 -0
  161. evalkit/bundled/ui/assets/elixir-6RTg0lbw.js +1 -0
  162. evalkit/bundled/ui/assets/flow9-C5_-GSwl.js +1 -0
  163. evalkit/bundled/ui/assets/freemarker2-BWqEFagp.js +3 -0
  164. evalkit/bundled/ui/assets/fsharp-C8Ef5oNN.js +1 -0
  165. evalkit/bundled/ui/assets/go-C-y9NEjX.js +1 -0
  166. evalkit/bundled/ui/assets/graphql-fmXr3nnJ.js +1 -0
  167. evalkit/bundled/ui/assets/handlebars-DkIF-whN.js +1 -0
  168. evalkit/bundled/ui/assets/hcl-CpzslTdj.js +1 -0
  169. evalkit/bundled/ui/assets/html-C_rpeQXJ.js +1 -0
  170. evalkit/bundled/ui/assets/html.worker-D9ugpX4y.js +509 -0
  171. evalkit/bundled/ui/assets/htmlMode-B0YIq3DF.js +1 -0
  172. evalkit/bundled/ui/assets/index-Cw-jBH6M.js +736 -0
  173. evalkit/bundled/ui/assets/index-DKtoQZtm.css +1 -0
  174. evalkit/bundled/ui/assets/ini-sBoK_t0W.js +1 -0
  175. evalkit/bundled/ui/assets/java-BEtHBSE6.js +1 -0
  176. evalkit/bundled/ui/assets/javascript-D4EGhYA6.js +1 -0
  177. evalkit/bundled/ui/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  178. evalkit/bundled/ui/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  179. evalkit/bundled/ui/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  180. evalkit/bundled/ui/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  181. evalkit/bundled/ui/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  182. evalkit/bundled/ui/assets/json.worker-CV9fqkUp.js +65 -0
  183. evalkit/bundled/ui/assets/jsonMode-pQjSfIH6.js +7 -0
  184. evalkit/bundled/ui/assets/julia-Bri6UV-V.js +1 -0
  185. evalkit/bundled/ui/assets/kotlin-BOotOW0E.js +1 -0
  186. evalkit/bundled/ui/assets/less-B9JPFI3C.js +2 -0
  187. evalkit/bundled/ui/assets/lexon-CfSJPG6W.js +1 -0
  188. evalkit/bundled/ui/assets/liquid-DbrvoYjD.js +1 -0
  189. evalkit/bundled/ui/assets/lspLanguageFeatures-D0B7cH6y.js +4 -0
  190. evalkit/bundled/ui/assets/lua-CsQS60Ue.js +1 -0
  191. evalkit/bundled/ui/assets/m3-D-oSqn_W.js +1 -0
  192. evalkit/bundled/ui/assets/markdown-Cimd5fb3.js +1 -0
  193. evalkit/bundled/ui/assets/mdx-B0HrujLR.js +1 -0
  194. evalkit/bundled/ui/assets/mips-CIPQ_RoX.js +1 -0
  195. evalkit/bundled/ui/assets/monacoEditor-DsoPncxW.js +68 -0
  196. evalkit/bundled/ui/assets/monacoEditor-n7clI0si.css +1 -0
  197. evalkit/bundled/ui/assets/msdax-DauUninz.js +1 -0
  198. evalkit/bundled/ui/assets/mysql-SOo6toE5.js +1 -0
  199. evalkit/bundled/ui/assets/objective-c-FvmIjYaQ.js +1 -0
  200. evalkit/bundled/ui/assets/pascal-DrH0SRf2.js +1 -0
  201. evalkit/bundled/ui/assets/pascaligo-D-ptJ9y-.js +1 -0
  202. evalkit/bundled/ui/assets/perl-oz_6vUea.js +1 -0
  203. evalkit/bundled/ui/assets/pgsql-DTj74zXo.js +1 -0
  204. evalkit/bundled/ui/assets/php-nr791fC2.js +1 -0
  205. evalkit/bundled/ui/assets/pla-CopQ2nXW.js +1 -0
  206. evalkit/bundled/ui/assets/postiats-43DmfD33.js +1 -0
  207. evalkit/bundled/ui/assets/powerquery-D3hlyOfw.js +1 -0
  208. evalkit/bundled/ui/assets/powershell-DmHpPYUd.js +1 -0
  209. evalkit/bundled/ui/assets/protobuf-C531GsRP.js +2 -0
  210. evalkit/bundled/ui/assets/pug-Z5eAx3Zn.js +1 -0
  211. evalkit/bundled/ui/assets/python-CieHVM9n.js +1 -0
  212. evalkit/bundled/ui/assets/qsharp-DkqhCAOL.js +1 -0
  213. evalkit/bundled/ui/assets/r-BwWrilGY.js +1 -0
  214. evalkit/bundled/ui/assets/razor-sLewSMyp.js +1 -0
  215. evalkit/bundled/ui/assets/redis-ClamHrr6.js +1 -0
  216. evalkit/bundled/ui/assets/redshift-DT7zqm-g.js +1 -0
  217. evalkit/bundled/ui/assets/restructuredtext-BYgofb2h.js +1 -0
  218. evalkit/bundled/ui/assets/ruby-DezsRK8O.js +1 -0
  219. evalkit/bundled/ui/assets/rust-DdL9SqIa.js +1 -0
  220. evalkit/bundled/ui/assets/sb-CcwsVR0C.js +1 -0
  221. evalkit/bundled/ui/assets/scala-DHpiXF5c.js +1 -0
  222. evalkit/bundled/ui/assets/scheme-BeGwcela.js +1 -0
  223. evalkit/bundled/ui/assets/scss-gp-XZpBa.js +3 -0
  224. evalkit/bundled/ui/assets/shell-CC2rA5mh.js +1 -0
  225. evalkit/bundled/ui/assets/solidity-BEEn4gHE.js +1 -0
  226. evalkit/bundled/ui/assets/sophia-CRfGWb83.js +1 -0
  227. evalkit/bundled/ui/assets/sparql-D_Lu-MrJ.js +1 -0
  228. evalkit/bundled/ui/assets/sql-NEE52Syq.js +1 -0
  229. evalkit/bundled/ui/assets/st-DbInun42.js +1 -0
  230. evalkit/bundled/ui/assets/swift-Bxkupp3x.js +1 -0
  231. evalkit/bundled/ui/assets/systemverilog-Bz4Y3fRF.js +1 -0
  232. evalkit/bundled/ui/assets/tcl-DISqw1ZD.js +1 -0
  233. evalkit/bundled/ui/assets/ts.worker-DIAQkoB3.js +67741 -0
  234. evalkit/bundled/ui/assets/tsMode-BcVQ1nu0.js +11 -0
  235. evalkit/bundled/ui/assets/twig-De2hgUGE.js +1 -0
  236. evalkit/bundled/ui/assets/typescript-CUvNWd9p.js +1 -0
  237. evalkit/bundled/ui/assets/typespec-B8J7ngcE.js +1 -0
  238. evalkit/bundled/ui/assets/vb-DV3o63ZY.js +1 -0
  239. evalkit/bundled/ui/assets/wgsl-DpFanUEy.js +298 -0
  240. evalkit/bundled/ui/assets/workers-CwpYQtzp.js +1 -0
  241. evalkit/bundled/ui/assets/xml-C1HnXMdF.js +1 -0
  242. evalkit/bundled/ui/assets/yaml-D7Ey3HQu.js +1 -0
  243. evalkit/bundled/ui/favicon.svg +6 -0
  244. evalkit/bundled/ui/index.html +14 -0
  245. evalkit/cli/__init__.py +0 -0
  246. evalkit/cli/admin_commands.py +590 -0
  247. evalkit/cli/client.py +67 -0
  248. evalkit/cli/init_server.py +165 -0
  249. evalkit/cli/local_run.py +195 -0
  250. evalkit/cli/main.py +1365 -0
  251. evalkit/cli/runs_commands.py +539 -0
  252. evalkit/cli/server_commands.py +130 -0
  253. evalkit/cli/skill_targets.py +43 -0
  254. evalkit/cli/tokens_commands.py +52 -0
  255. evalkit/cli/traces_commands.py +332 -0
  256. evalkit/cli/update.py +85 -0
  257. evalkit/client/__init__.py +0 -0
  258. evalkit/client/agents.py +25 -0
  259. evalkit/client/api.py +193 -0
  260. evalkit/client/blob.py +104 -0
  261. evalkit/client/connection.py +88 -0
  262. evalkit/client/evaluators.py +11 -0
  263. evalkit/client/sessions.py +17 -0
  264. evalkit/client/store.py +139 -0
  265. evalkit/client/summary.py +46 -0
  266. evalkit/client/sync.py +198 -0
  267. evalkit/config.py +227 -0
  268. evalkit/contracts/__init__.py +0 -0
  269. evalkit/contracts/atif.py +115 -0
  270. evalkit/contracts/cases.py +456 -0
  271. evalkit/contracts/custom_evaluator.py +58 -0
  272. evalkit/contracts/enums.py +86 -0
  273. evalkit/contracts/esf.py +120 -0
  274. evalkit/contracts/harness.py +281 -0
  275. evalkit/contracts/notes.json +4 -0
  276. evalkit/contracts/notes.py +7 -0
  277. evalkit/contracts/settings.py +41 -0
  278. evalkit/core/__init__.py +0 -0
  279. evalkit/core/access.py +75 -0
  280. evalkit/core/agents.py +65 -0
  281. evalkit/core/blob.py +46 -0
  282. evalkit/core/capabilities.py +36 -0
  283. evalkit/core/costmap.py +90 -0
  284. evalkit/core/custom_eval.py +50 -0
  285. evalkit/core/data/cost_map.json +81546 -0
  286. evalkit/core/endpoints.py +31 -0
  287. evalkit/core/evaluators/__init__.py +29 -0
  288. evalkit/core/evaluators/base.py +121 -0
  289. evalkit/core/evaluators/gauges.py +84 -0
  290. evalkit/core/evaluators/presentation.py +166 -0
  291. evalkit/core/evaluators/response_time.py +21 -0
  292. evalkit/core/evaluators/rubrics.py +494 -0
  293. evalkit/core/evaluators/tool_trajectory.py +187 -0
  294. evalkit/core/evaluators/trajectory_rubrics.py +198 -0
  295. evalkit/core/fixtures.py +57 -0
  296. evalkit/core/harness.py +227 -0
  297. evalkit/core/harness_check.py +191 -0
  298. evalkit/core/importer.py +257 -0
  299. evalkit/core/judge.py +78 -0
  300. evalkit/core/lint.py +265 -0
  301. evalkit/core/overlays.py +76 -0
  302. evalkit/core/paths.py +25 -0
  303. evalkit/core/promotion.py +94 -0
  304. evalkit/core/pull.py +198 -0
  305. evalkit/core/python_eval.py +59 -0
  306. evalkit/core/remote_evaluators.py +32 -0
  307. evalkit/core/review.py +220 -0
  308. evalkit/core/run_digest.py +421 -0
  309. evalkit/core/runner.py +995 -0
  310. evalkit/core/scorecard.py +255 -0
  311. evalkit/core/traces/__init__.py +0 -0
  312. evalkit/core/traces/convert.py +336 -0
  313. evalkit/core/traces/importer.py +113 -0
  314. evalkit/core/traces/mapping.py +385 -0
  315. evalkit/core/traces/poll.py +38 -0
  316. evalkit/core/traces/raw.py +21 -0
  317. evalkit/core/traces/sessions.py +172 -0
  318. evalkit/core/traces/settle.py +14 -0
  319. evalkit/core/traces/sources/__init__.py +19 -0
  320. evalkit/core/traces/sources/base.py +25 -0
  321. evalkit/core/traces/sources/phoenix.py +121 -0
  322. evalkit/core/trajectory.py +248 -0
  323. evalkit/core/workspace.py +30 -0
  324. evalkit/credentials.py +119 -0
  325. evalkit/db/__init__.py +0 -0
  326. evalkit/db/agents.py +289 -0
  327. evalkit/db/alembic/env.py +90 -0
  328. evalkit/db/alembic/script.py.mako +28 -0
  329. evalkit/db/alembic/versions/0011_baseline.py +1002 -0
  330. evalkit/db/alembic/versions/0012_ticket_token_kind.py +27 -0
  331. evalkit/db/alembic/versions/0013_keys_and_llm_providers.py +67 -0
  332. evalkit/db/cases.py +608 -0
  333. evalkit/db/crypto.py +12 -0
  334. evalkit/db/evaluators.py +156 -0
  335. evalkit/db/experiments.py +363 -0
  336. evalkit/db/fixture_blobs.py +91 -0
  337. evalkit/db/keys.py +78 -0
  338. evalkit/db/llm_providers.py +176 -0
  339. evalkit/db/locks.py +6 -0
  340. evalkit/db/mappings.py +168 -0
  341. evalkit/db/models.py +567 -0
  342. evalkit/db/promotion.py +271 -0
  343. evalkit/db/rekey.py +46 -0
  344. evalkit/db/review.py +250 -0
  345. evalkit/db/review_state.py +50 -0
  346. evalkit/db/runs.py +533 -0
  347. evalkit/db/scorecard.py +300 -0
  348. evalkit/db/session.py +71 -0
  349. evalkit/db/sessions.py +90 -0
  350. evalkit/db/spans.py +360 -0
  351. evalkit/db/store.py +209 -0
  352. evalkit/db/tokens.py +100 -0
  353. evalkit/db/trace_imports.py +308 -0
  354. evalkit/db/trace_sources.py +131 -0
  355. evalkit/db/users.py +186 -0
  356. evalkit/db/workspaces.py +232 -0
  357. evalkit/paths.py +33 -0
  358. evalkit/sdk/__init__.py +29 -0
  359. evalkit/sdk/binding.py +69 -0
  360. evalkit/sdk/evaluators.py +56 -0
  361. evalkit/sdk/runner.py +957 -0
  362. evalkit/sdk/tracing.py +166 -0
  363. evalkit/store/__init__.py +0 -0
  364. evalkit/store/base.py +354 -0
  365. evalkit/store/blob.py +69 -0
  366. evalkit/version.py +44 -0
  367. evalkit_py-0.2.0.dev12.dist-info/METADATA +205 -0
  368. evalkit_py-0.2.0.dev12.dist-info/RECORD +371 -0
  369. evalkit_py-0.2.0.dev12.dist-info/WHEEL +4 -0
  370. evalkit_py-0.2.0.dev12.dist-info/entry_points.txt +2 -0
  371. evalkit_py-0.2.0.dev12.dist-info/licenses/LICENSE +661 -0
@@ -0,0 +1,232 @@
1
+ from datetime import datetime
2
+
3
+ from pydantic import BaseModel
4
+ from sqlalchemy import delete, select
5
+ from sqlalchemy.dialects.postgresql import insert
6
+ from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
7
+ from sqlalchemy.orm import aliased
8
+
9
+ from evalkit.contracts.enums import WorkspaceRole
10
+ from evalkit.core.access import WorkspaceRef
11
+ from evalkit.db.models import User, Workspace, WorkspaceMember, WorkspacePromotion
12
+ from evalkit.db.users import NameTaken, check_name, lock_names, name_taken, user_id
13
+
14
+
15
+ class UnknownWorkspace(KeyError):
16
+ def __init__(self, name: str):
17
+ super().__init__(f"unknown workspace: {name}")
18
+
19
+
20
+ class SharedOnly(ValueError):
21
+ pass
22
+
23
+
24
+ class PromotionLinkError(ValueError):
25
+ pass
26
+
27
+
28
+ class MemberRow(BaseModel):
29
+ username: str
30
+ role: WorkspaceRole
31
+ granted_by: str
32
+ created_at: datetime
33
+
34
+
35
+ def to_ref(
36
+ row: Workspace, promotes_to: int | None = None, promoted_from: int | None = None
37
+ ) -> WorkspaceRef:
38
+ return WorkspaceRef(
39
+ row.id,
40
+ row.name,
41
+ row.owner_user_id,
42
+ row.archived_at is not None,
43
+ promotes_to=promotes_to,
44
+ promoted_from=promoted_from,
45
+ )
46
+
47
+
48
+ async def workspace_row(session: AsyncSession, name: str) -> Workspace:
49
+ row = await session.scalar(select(Workspace).where(Workspace.name == name))
50
+ if row is None:
51
+ raise UnknownWorkspace(name)
52
+ return row
53
+
54
+
55
+ async def _links(session: AsyncSession, workspace_id: int) -> tuple[int | None, int | None]:
56
+ rows = (
57
+ await session.execute(
58
+ select(WorkspacePromotion.source_id, WorkspacePromotion.target_id).where(
59
+ (WorkspacePromotion.source_id == workspace_id)
60
+ | (WorkspacePromotion.target_id == workspace_id)
61
+ )
62
+ )
63
+ ).all()
64
+ promotes_to = next((t for s, t in rows if s == workspace_id), None)
65
+ promoted_from = next((s for s, t in rows if t == workspace_id), None)
66
+ return promotes_to, promoted_from
67
+
68
+
69
+ async def load_ref(session: AsyncSession, row: Workspace) -> WorkspaceRef:
70
+ promotes_to, promoted_from = await _links(session, row.id)
71
+ return to_ref(row, promotes_to=promotes_to, promoted_from=promoted_from)
72
+
73
+
74
+ def _check_link(source: WorkspaceRef, target: WorkspaceRef) -> None:
75
+ if source.id == target.id:
76
+ raise PromotionLinkError(f"{source.name} cannot promote to itself")
77
+ for ws in (source, target):
78
+ if not ws.is_shared:
79
+ raise PromotionLinkError(
80
+ f"{ws.name} is a personal workspace; promotion links shared ones"
81
+ )
82
+ if ws.archived:
83
+ raise PromotionLinkError(f"{ws.name} is archived")
84
+ if source.is_target:
85
+ raise PromotionLinkError(f"{source.name} is a promotion target; chains are not supported")
86
+ if target.promoted_from is not None and target.promoted_from != source.id:
87
+ raise PromotionLinkError(
88
+ f"{target.name} is already the promotion target of another workspace"
89
+ )
90
+ if target.promotes_to is not None:
91
+ raise PromotionLinkError(f"{target.name} is a promotion source; chains are not supported")
92
+
93
+
94
+ class WorkspaceStore:
95
+ def __init__(self, session_factory: async_sessionmaker[AsyncSession]):
96
+ self._sf = session_factory
97
+
98
+ async def get_by_name(self, name: str) -> WorkspaceRef:
99
+ async with self._sf() as s:
100
+ return await load_ref(s, await workspace_row(s, name))
101
+
102
+ async def get_by_id(self, workspace_id: int) -> WorkspaceRef:
103
+ async with self._sf() as s:
104
+ row = await s.get(Workspace, workspace_id)
105
+ if row is None:
106
+ raise UnknownWorkspace(str(workspace_id))
107
+ return await load_ref(s, row)
108
+
109
+ async def set_promotes_to(self, source: str, target: str | None) -> WorkspaceRef:
110
+ async with self._sf() as s:
111
+ await lock_names(s)
112
+ row = await workspace_row(s, source)
113
+ await s.execute(
114
+ delete(WorkspacePromotion).where(WorkspacePromotion.source_id == row.id)
115
+ )
116
+ if target is not None:
117
+ source_ref = to_ref(row, promoted_from=(await _links(s, row.id))[1])
118
+ target_ref = await load_ref(s, await workspace_row(s, target))
119
+ _check_link(source_ref, target_ref)
120
+ s.add(WorkspacePromotion(source_id=row.id, target_id=target_ref.id))
121
+ await s.commit()
122
+ return await load_ref(s, row)
123
+
124
+ async def personal_of(self, username: str) -> WorkspaceRef:
125
+ async with self._sf() as s:
126
+ row = await s.scalar(
127
+ select(Workspace)
128
+ .join(User, User.id == Workspace.owner_user_id)
129
+ .where(User.username == username, Workspace.name == username)
130
+ )
131
+ if row is None:
132
+ raise UnknownWorkspace(username)
133
+ return to_ref(row)
134
+
135
+ async def create_shared(self, name: str, actor_id: int | None) -> WorkspaceRef:
136
+ check_name(name)
137
+ async with self._sf() as s:
138
+ await lock_names(s)
139
+ if await name_taken(s, name):
140
+ raise NameTaken(name)
141
+ row = Workspace(name=name)
142
+ s.add(row)
143
+ await s.commit()
144
+ return to_ref(row)
145
+
146
+ async def rename(self, name: str, new_name: str) -> WorkspaceRef:
147
+ check_name(new_name)
148
+ async with self._sf() as s:
149
+ await lock_names(s)
150
+ row = await workspace_row(s, name)
151
+ if row.owner_user_id is not None:
152
+ raise SharedOnly("personal workspaces keep their owner's name")
153
+ if await name_taken(s, new_name):
154
+ raise NameTaken(new_name)
155
+ row.name = new_name
156
+ await s.commit()
157
+ return to_ref(row)
158
+
159
+ async def set_archived(self, name: str, archived_at: datetime | None) -> WorkspaceRef:
160
+ async with self._sf() as s:
161
+ row = await workspace_row(s, name)
162
+ row.archived_at = archived_at
163
+ await s.commit()
164
+ return to_ref(row)
165
+
166
+ async def add_member(
167
+ self, ws: str, username: str, role: WorkspaceRole, granted_by: int
168
+ ) -> None:
169
+ async with self._sf() as s:
170
+ row = await workspace_row(s, ws)
171
+ if row.owner_user_id is not None:
172
+ raise SharedOnly("roles apply to shared workspaces only")
173
+ uid = await user_id(s, username)
174
+ await s.execute(
175
+ insert(WorkspaceMember)
176
+ .values(workspace_id=row.id, user_id=uid, role=role.value, granted_by=granted_by)
177
+ .on_conflict_do_nothing()
178
+ )
179
+ await s.commit()
180
+
181
+ async def remove_member(self, ws: str, username: str, role: WorkspaceRole) -> bool:
182
+ async with self._sf() as s:
183
+ row = await workspace_row(s, ws)
184
+ uid = await user_id(s, username)
185
+ result = await s.execute(
186
+ delete(WorkspaceMember).where(
187
+ WorkspaceMember.workspace_id == row.id,
188
+ WorkspaceMember.user_id == uid,
189
+ WorkspaceMember.role == role.value,
190
+ )
191
+ )
192
+ await s.commit()
193
+ return bool(getattr(result, "rowcount", 0))
194
+
195
+ async def members(self, ws: str, role: WorkspaceRole | None = None) -> list[MemberRow]:
196
+ member, granter = aliased(User), aliased(User)
197
+ async with self._sf() as s:
198
+ row = await workspace_row(s, ws)
199
+ query = (
200
+ select(
201
+ member.username,
202
+ WorkspaceMember.role,
203
+ granter.username,
204
+ WorkspaceMember.created_at,
205
+ )
206
+ .join(member, member.id == WorkspaceMember.user_id)
207
+ .join(granter, granter.id == WorkspaceMember.granted_by)
208
+ .where(WorkspaceMember.workspace_id == row.id)
209
+ .order_by(member.username, WorkspaceMember.role)
210
+ )
211
+ if role is not None:
212
+ query = query.where(WorkspaceMember.role == role.value)
213
+ return [
214
+ MemberRow(username=u, role=WorkspaceRole(r), granted_by=g, created_at=c)
215
+ for u, r, g, c in (await s.execute(query)).all()
216
+ ]
217
+
218
+ async def list(self, include_archived: bool = False) -> list[WorkspaceRef]:
219
+ query = select(Workspace).order_by(Workspace.name)
220
+ if not include_archived:
221
+ query = query.where(Workspace.archived_at.is_(None))
222
+ async with self._sf() as s:
223
+ rows = (await s.scalars(query)).all()
224
+ links = (
225
+ await s.execute(select(WorkspacePromotion.source_id, WorkspacePromotion.target_id))
226
+ ).all()
227
+ targets = {source: target for source, target in links}
228
+ sources = {target: source for source, target in links}
229
+ return [
230
+ to_ref(row, promotes_to=targets.get(row.id), promoted_from=sources.get(row.id))
231
+ for row in rows
232
+ ]
evalkit/paths.py ADDED
@@ -0,0 +1,33 @@
1
+ from pathlib import Path
2
+
3
+ _PACKAGE = Path(__file__).resolve().parent
4
+ _REPO = _PACKAGE.parents[1]
5
+
6
+
7
+ def _bundled(name: str) -> Path:
8
+ repo = _REPO / name
9
+ if repo.is_dir():
10
+ return repo
11
+ return _PACKAGE / "bundled" / name
12
+
13
+
14
+ def skills_root() -> Path:
15
+ return _bundled("skills")
16
+
17
+
18
+ def contracts_root() -> Path:
19
+ return _bundled("contracts")
20
+
21
+
22
+ def docs_root() -> Path:
23
+ repo = _REPO / "docs" / "user"
24
+ if repo.is_dir():
25
+ return repo
26
+ return _PACKAGE / "bundled" / "docs"
27
+
28
+
29
+ def ui_root() -> Path:
30
+ repo = _REPO / "ui" / "dist"
31
+ if repo.is_dir():
32
+ return repo
33
+ return _PACKAGE / "bundled" / "ui"
@@ -0,0 +1,29 @@
1
+ from evalkit.contracts.settings import JudgeSettings as Judge
2
+ from evalkit.sdk import tracing
3
+ from evalkit.sdk.binding import Fixture
4
+ from evalkit.sdk.evaluators import evaluator
5
+ from evalkit.sdk.runner import (
6
+ ExperimentResult,
7
+ RunResult,
8
+ RunSummary,
9
+ aevaluate_experiment,
10
+ arun_experiment,
11
+ run_experiment,
12
+ )
13
+ from evalkit.sdk.runner import (
14
+ evaluate_experiment_sync as evaluate_experiment,
15
+ )
16
+
17
+ __all__ = [
18
+ "ExperimentResult",
19
+ "Fixture",
20
+ "Judge",
21
+ "RunResult",
22
+ "RunSummary",
23
+ "aevaluate_experiment",
24
+ "arun_experiment",
25
+ "evaluate_experiment",
26
+ "evaluator",
27
+ "run_experiment",
28
+ "tracing",
29
+ ]
evalkit/sdk/binding.py ADDED
@@ -0,0 +1,69 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import inspect
5
+ from collections.abc import Callable
6
+ from dataclasses import dataclass
7
+ from pathlib import Path
8
+ from typing import Any
9
+
10
+ from pydantic import BaseModel
11
+
12
+ ALLOWED = ("input", "files", "model", "metadata")
13
+
14
+
15
+ class Fixture(BaseModel):
16
+ """A case's fixture file, downloaded before the task is called.
17
+
18
+ Attributes:
19
+ name: The fixture key the case names.
20
+ path: Where the file sits on this machine.
21
+ context: The file's description from the fixture registry, or `None`.
22
+ """
23
+
24
+ name: str
25
+ path: Path
26
+ context: str | None = None
27
+
28
+
29
+ @dataclass(frozen=True)
30
+ class TaskSpec:
31
+ params: tuple[str, ...]
32
+ shortcut: bool
33
+
34
+
35
+ def inspect_task(task: Callable[..., Any]) -> TaskSpec:
36
+ parameters = inspect.signature(task).parameters
37
+ bindable = (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY)
38
+ names = [p.name for p in parameters.values() if p.kind in bindable]
39
+ if len(parameters) == 1 and names:
40
+ return TaskSpec(params=(names[0],), shortcut=names[0] not in ALLOWED)
41
+ required = [p.name for p in parameters.values() if p.default is p.empty and p.kind in bindable]
42
+ unknown = [name for name in required if name not in ALLOWED]
43
+ if unknown:
44
+ raise TypeError(
45
+ f"task parameter(s) not supported: {', '.join(unknown)}; allowed: {', '.join(ALLOWED)}"
46
+ )
47
+ return TaskSpec(params=tuple(name for name in names if name in ALLOWED), shortcut=False)
48
+
49
+
50
+ def arguments(
51
+ spec: TaskSpec, *, input: dict, files: list[Fixture], model: str | None, metadata: dict
52
+ ) -> tuple[list[Any], dict[str, Any]]:
53
+ if spec.shortcut:
54
+ return [input], {}
55
+ values = {"input": input, "files": files, "model": model, "metadata": metadata}
56
+ return [], {name: values[name] for name in spec.params}
57
+
58
+
59
+ async def call_task(task: Callable[..., Any], args: list[Any], kwargs: dict[str, Any]) -> Any:
60
+ if inspect.iscoroutinefunction(task):
61
+ return await task(*args, **kwargs)
62
+ result = await asyncio.to_thread(task, *args, **kwargs)
63
+ if inspect.isawaitable(result):
64
+ return await result
65
+ return result
66
+
67
+
68
+ def ignores_model(spec: TaskSpec) -> bool:
69
+ return spec.shortcut or "model" not in spec.params
@@ -0,0 +1,56 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Callable
4
+ from typing import Any, Literal, overload
5
+
6
+ from evalkit.core.python_eval import PythonEvaluator
7
+
8
+ Kind = Literal["evaluator", "gauge"]
9
+
10
+
11
+ @overload
12
+ def evaluator(fn: Callable[..., Any], /) -> PythonEvaluator: ...
13
+
14
+
15
+ @overload
16
+ def evaluator(
17
+ *, name: str | None = None, kind: Kind = "evaluator", requires_trajectory: bool = False
18
+ ) -> Callable[[Callable[..., Any]], PythonEvaluator]: ...
19
+
20
+
21
+ def evaluator(
22
+ fn: Callable[..., Any] | None = None,
23
+ /,
24
+ *,
25
+ name: str | None = None,
26
+ kind: Kind = "evaluator",
27
+ requires_trajectory: bool = False,
28
+ ) -> PythonEvaluator | Callable[[Callable[..., Any]], PythonEvaluator]:
29
+ """Turn a function into a Python evaluator for `run_experiment`.
30
+
31
+ Use it bare (`@evaluator`) or with options (`@evaluator(name=...)`). The function
32
+ receives the same `EvalCase` and `EvalRun` the Custom Evaluator API sends: the
33
+ case id, input, expected block and this evaluator's config from the case YAML
34
+ (`case.config`); the answer, structured output and ATIF trajectory as a dict.
35
+ It returns a float, a `ScoreItem`, or a list of them.
36
+
37
+ Args:
38
+ fn: The function, when used bare.
39
+ name: The name cases use under `evaluators.custom`. Defaults to the
40
+ function's name.
41
+ kind: `evaluator` for a score, `gauge` for a measurement.
42
+ requires_trajectory: Skip runs that have no trajectory.
43
+
44
+ Returns:
45
+ The evaluator, or a decorator that makes one.
46
+ """
47
+
48
+ def wrap(function: Callable[..., Any]) -> PythonEvaluator:
49
+ return PythonEvaluator(
50
+ name=name or function.__name__,
51
+ kind=kind,
52
+ fn=function,
53
+ requires_trajectory=requires_trajectory,
54
+ )
55
+
56
+ return wrap(fn) if fn is not None else wrap