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,288 @@
1
+ # Try evalkit locally
2
+
3
+ The try-it stack runs evalkit on your machine and walks you through the
4
+ default way to connect an agent: an **SDK run with OpenTelemetry traces**.
5
+ Your Python code calls the agent once per case. The agent's spans go to
6
+ evalkit, evalkit turns them into a trajectory, and your LLM judges the
7
+ answers. The kit includes a small sample agent that calls your LLM, so you
8
+ get a real scorecard before you touch your own agent.
9
+
10
+ It is not a deployment: it uses a demo admin password and keeps everything
11
+ on one machine. For a real deployment, follow the evalkit-deployment skill.
12
+
13
+ ## What you need
14
+
15
+ - `uv` and port 8020 free.
16
+ - An OpenAI-compatible LLM endpoint (OpenAI, a LiteLLM proxy, vLLM, Ollama,
17
+ ...) that supports tool calls and structured output, with its base URL, API
18
+ key and model name. The sample agent and the judge both use it.
19
+ - Either Postgres 15 or newer running on this machine (without Docker), or
20
+ Docker with Compose v2 (with Docker).
21
+
22
+ ## Start the server
23
+
24
+ Pick one way. Both end with the server on http://localhost:8020 and the try
25
+ kit in a folder, and the steps after this section are the same.
26
+
27
+ ### Without Docker
28
+
29
+ evalkit is on PyPI as `evalkit-py`. Install it with the server extra, then
30
+ let `evalkit init-server` set up the rest:
31
+
32
+ ```bash
33
+ uv tool install "evalkit-py[server]" # or: pip install "evalkit-py[server]"
34
+ evalkit init-server
35
+ cd evalkit-try
36
+ evalkit serve
37
+ ```
38
+
39
+ `init-server` asks for the Postgres URL (default
40
+ `postgresql+psycopg://localhost/evalkit`), your LLM's base URL, model and API
41
+ key, and the admin password (default `evalkit-admin`). A question is skipped
42
+ when its flag or environment variable is set (`evalkit init-server --help`
43
+ lists both); `--yes` never asks. It then:
44
+
45
+ - creates the database when it does not exist, and migrates it
46
+ - registers your LLM as the LLM provider `try` and makes it the default judge,
47
+ with its API key stored encrypted in the database
48
+ - copies the try kit into `./evalkit-try`
49
+ - writes `config.yaml` there, with blobs stored under `evalkit-try/data`
50
+ - writes `.env` beside it, with your LLM settings, the admin password and the
51
+ key that encrypts stored API keys; `evalkit serve` reads it. Keep `.env`:
52
+ without that key the server cannot read the stored LLM key
53
+
54
+ Leave `evalkit serve` running and use another terminal for the steps below,
55
+ from the `evalkit-try` folder. The CLI is already installed, so skip the
56
+ install command in step 1.
57
+
58
+ ### With Docker
59
+
60
+ The kit is `skills/evalkit-deployment/try/` in the evalkit repository, and the
61
+ server image holds a copy. The first `--build` takes a few minutes (it builds
62
+ the web UI and installs the server); later starts take seconds.
63
+
64
+ From an evalkit checkout, compose builds the image:
65
+
66
+ ```bash
67
+ cd skills/evalkit-deployment/try
68
+ cp -n .env.example .env # fill in LLM_BASE_URL, LLM_API_KEY, LLM_MODEL
69
+ docker compose up -d --wait --build
70
+ ```
71
+
72
+ With the server image instead, copy the kit out of it first:
73
+
74
+ ```bash
75
+ export EVALKIT_IMAGE=<registry>/evalkit:<tag>
76
+ docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/out" "$EVALKIT_IMAGE" \
77
+ evalkit init-server --kit-only --dir /out/evalkit-try
78
+ cd evalkit-try
79
+ cp -n .env.example .env # fill in LLM_BASE_URL, LLM_API_KEY, LLM_MODEL
80
+ docker compose up -d --wait
81
+ ```
82
+
83
+ Compose starts Postgres and the evalkit server, with your LLM as the judge.
84
+ `--wait` returns once the server is healthy. The server runs migrations on
85
+ every start.
86
+
87
+ ### What's in the kit
88
+
89
+ | File | What it is |
90
+ | -- | -- |
91
+ | `agent.py` | The sample agent. It answers questions about Acme Widgets, a made-up company, by calling your LLM with one tool, `lookup_financials`. It records each model call and tool call as an OpenTelemetry span, using the GenAI semantic conventions. |
92
+ | `run.py` | The SDK run: `tracing.register` sends the spans to evalkit, and `run_experiment` calls the agent once per case and scores the answers. |
93
+ | `mapping.json` | The span mapping: which span attribute holds the model, the messages, the tokens and each tool call. It starts as the connect-traces skill's `gen_ai.json`. |
94
+ | `cases/acme/` | Five cases in two folders (tags), with answer rubrics and a tool check. |
95
+ | `evalkit.yaml`, `.env` | Where the cases are, and the judge's key. |
96
+ | `config.yaml` | The server's config. |
97
+ | `docker-compose.yml`, `.env.example` | With Docker only: the stack, and the template for its `.env`. `init-server` leaves them out. |
98
+
99
+ ## 1. Install the CLI and log in
100
+
101
+ ```bash
102
+ uv tool install --reinstall "evalkit-py=={{version}}" # with Docker only
103
+ evalkit login --url http://localhost:8020 --username admin --password evalkit-admin
104
+ ```
105
+
106
+ `{{version}}` is the server's version; `curl http://localhost:8020/api/cli`
107
+ prints it.
108
+
109
+ `evalkit login` replaces any login you already saved. To keep it, skip
110
+ `evalkit login` and point this shell at the try-it server instead (this needs
111
+ `jq`):
112
+
113
+ ```bash
114
+ export EVALKIT_SERVER_URL=http://localhost:8020
115
+ export EVALKIT_TOKEN=$(curl -fsSL -X POST http://localhost:8020/api/auth/login \
116
+ -H 'content-type: application/json' -d '{"username": "admin", "password": "evalkit-admin"}' | jq -r .token)
117
+ ```
118
+
119
+ `run.py` declares its own dependencies at the top of the file, so
120
+ `uv run run.py` installs what it needs on the first run. The kit pins evalkit
121
+ to the server's version when `evalkit init-server` copies it. In an evalkit
122
+ checkout, run the kit's scripts with the checkout instead:
123
+ `uv run --project ../../.. --extra otel python run.py`.
124
+
125
+ ## 2. Connect the agent's traces
126
+
127
+ Create the agent. Its trajectories come from its spans, read with
128
+ `mapping.json`:
129
+
130
+ ```bash
131
+ evalkit agents create analyst --trajectory-source otel --mapping mapping.json
132
+ ```
133
+
134
+ Run one case without creating an experiment:
135
+
136
+ ```bash
137
+ uv run run.py --dry-run
138
+ ```
139
+
140
+ It prints the answer, the session id with a count of its spans by kind and
141
+ the mapping version, and whether evalkit built a valid trajectory from them. If no spans arrived,
142
+ check that `run.py` calls `tracing.register` before the agent runs.
143
+
144
+ Then see how the mapping read that session:
145
+
146
+ ```bash
147
+ evalkit traces check analyst <session id>
148
+ ```
149
+
150
+ It prints one line per check: the session settled, the root span, the
151
+ mapping version, the model calls and their token totals, the tool calls
152
+ matched to the model's calls, any span attribute the mapping does not read,
153
+ and a summary of the trajectory. Every line should have a ✓.
154
+
155
+ ## 3. First scorecard
156
+
157
+ ```bash
158
+ uv run run.py
159
+ ```
160
+
161
+ `run_experiment` syncs `cases/acme` into your own workspace (`acme@admin`),
162
+ runs the five cases, has your LLM judge each answer against its rubrics,
163
+ checks that the agent called `lookup_financials`, and prints the scorecard
164
+ and the experiment URL. The scores depend on your model. `acme-operating-margin`
165
+ asks for a figure the agent has no data for, so it passes only if the agent
166
+ says so instead of making one up.
167
+
168
+ The `answer_rubric_*` rows by rubric type (`factual_retrieval`,
169
+ `derived_computation`, `analysis_interpretation`) count only the cases that
170
+ have a rubric of that type, so their case counts differ.
171
+
172
+ Open http://localhost:8020, log in as `admin` with the admin password, and open the
173
+ experiment under the `acme` dataset. Each run shows its trajectory, the
174
+ judge's verdict on every rubric and the tool check. The Runs page lists the
175
+ raw sessions.
176
+
177
+ ## 4. Iterate
178
+
179
+ This is the loop you will run on your own agent:
180
+
181
+ - Change the agent, for example the instructions in `agent.py`, and run
182
+ `run.py` again. Compare the two experiments in the UI.
183
+ - Edit or add a case under `cases/acme/` and run again. The run syncs the
184
+ folder first.
185
+ - Run one folder: `run_experiment(..., split="balance-sheet")`.
186
+
187
+ ## 5. Connect your own agent
188
+
189
+ Do the same in your own repository:
190
+
191
+ 1. **Traces.** If your agent already emits OpenTelemetry spans (OpenInference
192
+ or GenAI conventions), keep them. If not, add an instrumentor for your LLM
193
+ library, for example `openinference-instrumentation-openai` for the OpenAI
194
+ client (OpenInference publishes one per popular library), or record GenAI
195
+ spans yourself as this kit's `agent.py` does ([Tracing](tracing.md)). The
196
+ connect-traces skill writes or checks the span mapping
197
+ ([Mappings](mappings.md)).
198
+ 2. **Setup.** Put an `evalkit.yaml` at the root of your repository, with
199
+ `cases:` pointing at your cases directory and the judge's key under
200
+ `credentials.llm_providers`. That map is keyed by the judge's base URL, which must
201
+ match the judge the run uses: the server's default judge
202
+ (`{{origin}}/api/judge-default` shows its `base_url`), or the one you pass to
203
+ `run_experiment(judge=...)`. This kit keys it with `env:LLM_BASE_URL` so the
204
+ URL comes from `.env`. Keep the keys in a `.env` beside `evalkit.yaml`.
205
+ 3. **Script.** Copy `run.py`. Pin evalkit in its header to your evalkit
206
+ server's version (`evalkit-py[otel]==<version>`), call
207
+ `tracing.register(agent="myagent")`, and write a `task` that calls your
208
+ agent with the case input. `uv run run.py` builds an environment from the
209
+ header alone, so add your agent's packages to its `dependencies`. If your
210
+ agent lives in a uv project, you can instead add evalkit to the project
211
+ (see the [Install](install.md) page) and run the script with
212
+ `uv run python run.py`.
213
+ 4. **Cases.** Add a folder under your cases directory, for example
214
+ `mine/`, and run with `dataset="mine"`. The authoring-eval-cases skill
215
+ covers the format. See [Concepts](concepts.md) for the terms.
216
+ 5. **Agent and mapping.** Copy this kit's `mapping.json` into your
217
+ repository, or `openinference.json` from the connect-traces skill if your
218
+ spans follow OpenInference, and create the agent with it:
219
+ `evalkit agents create myagent --trajectory-source otel --mapping
220
+ my-mapping.json`. Do a dry run with your script and `evalkit traces check`
221
+ on its session, as in step 2. For each `!` line, edit your copy, upload it
222
+ as a draft and preview the same session:
223
+
224
+ ```bash
225
+ evalkit traces mapping push myagent my-mapping.json
226
+ evalkit traces check myagent <session id> --mapping draft
227
+ ```
228
+
229
+ When it reads right, activate it: `evalkit traces mapping push myagent
230
+ my-mapping.json --activate`, or use the agent's Mappings tab in the web
231
+ UI. Runs always use the active mapping. The connect-traces skill walks a
232
+ coding agent through the same loop.
233
+
234
+ [SDK runs](sdk-runs.md) covers the rest: agents in another process, Python
235
+ evaluators, and re-scoring. If the evalkit server
236
+ should drive your agent instead of your script (runs started from the UI,
237
+ shared agents), implement the [Harness API](harness-api.md).
238
+
239
+ ## Next: run evalkit for your team
240
+
241
+ The try-it stack is for one machine. For a server your team shares, follow
242
+ the [evalkit-deployment skill](https://github.com/inferedge-ai/evalkit/tree/main/skills/evalkit-deployment):
243
+ it covers the server image, Postgres, blob storage, the judge, migrations
244
+ and the first users and workspaces. A coding agent can walk it with you.
245
+ Once the server runs, your teammates start from its own `/docs` page.
246
+
247
+ ## Stop and clean up
248
+
249
+ Without Docker: stop `evalkit serve` with Ctrl-C. To delete everything, drop
250
+ the database you gave `init-server` (`dropdb evalkit` with the default URL)
251
+ and remove the `evalkit-try` folder.
252
+
253
+ With Docker:
254
+
255
+ ```bash
256
+ docker compose down # stop; data stays in the volumes
257
+ docker compose down -v # stop and delete all data
258
+ ```
259
+
260
+ ## When something fails
261
+
262
+ - `uv run run.py` cannot find `evalkit-py==<version>`: that version is not
263
+ on PyPI yet (a source build, or a build whose publish job has not finished).
264
+ Run it with the wheel you installed instead:
265
+ `uv run --no-project --with "<path to the wheel>[otel]" python run.py`, or
266
+ from an evalkit checkout: `uv run --project <checkout> --extra otel python run.py`.
267
+ Or wait for the publish.
268
+ - `init-server` cannot connect: start Postgres (`brew services start
269
+ postgresql@17`, `sudo systemctl start postgresql`, or Postgres.app), or
270
+ pass `--database-url` with the user and password your Postgres needs, e.g.
271
+ `postgresql+psycopg://me:secret@localhost:5432/evalkit`.
272
+ - `init-server` says `config.yaml` exists: you already set up that folder.
273
+ Run `evalkit serve` there, or pass `--force` to write it again.
274
+ - `evalkit serve` says a variable is not set: check `.env` beside
275
+ `config.yaml`.
276
+ - Compose says a variable is not set: fill in `.env` (copied from
277
+ `.env.example`).
278
+ - Compose cannot find `evalkit:try`: outside a checkout, set `EVALKIT_IMAGE`;
279
+ in a checkout, add `--build`.
280
+ - The server will not start: `docker compose logs server` (and
281
+ check that `.env` is filled in: the server reads the LLM settings at start).
282
+ - The server exits with code 132 and no logs (Apple Silicon): the image is
283
+ older than 0.22.0. Add `OPENSSL_armcap: "0"` to the server's
284
+ `environment:` in `docker-compose.yml`, or use a newer image.
285
+ - The judge fails on every case: your endpoint must support structured
286
+ output (`response_format` with a JSON schema). Try another model.
287
+ - `evalkit` or `run.py` talks to another server: run the `evalkit login` above
288
+ again, or check `EVALKIT_SERVER_URL`.
@@ -0,0 +1,45 @@
1
+ # Where runs happen
2
+
3
+ Every dataset and agent lives in a workspace:
4
+
5
+ - **Personal workspace:** one per user, named after the username. Only the owner writes to it.
6
+ - **Shared workspace:** created by an admin, e.g. `dev` and `prod`. Members with the writer role write to it; reviewers approve its cases.
7
+ - **Who can read:** every logged-in user can read every workspace, including other users' personal workspaces: datasets, cases, experiments, runs, trajectories, spans and sessions, and fixtures. Only the owner writes to a personal workspace; admins and writers write to a shared one. The web UI marks someone else's personal workspace "read-only".
8
+ - **Traces are visible too:** traces you import or export into your personal workspace, such as production traces pulled for case mining, can be read by everyone on the server. No workspace setting keeps them private. If traces hold data some users must not see, scrub it in your agent before export, or run a separate evalkit server for those traces. A mapping's `exclude_spans` does not help here: the server stores spans as received and only skips them when it builds a trajectory.
9
+ - **Promotion:** an admin can link two shared workspaces (`evalkit workspaces promote-to dev prod`). Approving a case in `finance@dev` then adds that version to `finance@prod`, approved, with its overlays. `prod` is fed only by promotion: sync and review decisions there are refused, comments allowed. Create each target dataset once with `evalkit datasets create finance@prod`. One target per source, one source per target.
10
+
11
+ The agent you pick decides who drives the run. The dataset and the agent together decide where the experiment is stored:
12
+
13
+ - **Both shared:** the experiment lives in the dataset's workspace.
14
+ - **Otherwise:** it lives in your personal workspace.
15
+
16
+ Example with workspaces `@alice` (personal), `@dev` and `@prod` (shared).
17
+ `myagent` is alice's personal agent; `ouragent` is the team's deployed agent,
18
+ with one entry per shared workspace.
19
+
20
+ | # | Who / entry | Dataset | Agent | Driver | Agent runs on | Trajectory from | Experiment in | Use case |
21
+ | --- | --------------------------------------------------------------- | ---------------------------- | --------------------------------- | -------------- | ------------------ | ------------------------------------- | ------------- | --------------------------------------------------- |
22
+ | 1 | alice, SDK `run_experiment(dataset="finance", agent="myagent")` | finance@alice | myagent@alice (code-driven) | alice's Python | laptop, in-process | OTel → collector → server builds ATIF | @alice | EDD inner loop (default) |
23
+ | 2 | alice, `evalkit run finance --agent myagent` | finance@alice | myagent@alice (localhost harness) | alice's CLI | laptop | harness ATIF → CLI → server | @alice | a Harness API agent on this machine |
24
+ | 3 | alice, `evalkit run finance@prod --agent myagent` | finance@prod (approved only) | myagent@alice | alice's CLI | laptop | harness ATIF → CLI → server | @alice | does a local change break the released set |
25
+ | 4 | alice, `evalkit run finance --agent ouragent@dev` | finance@alice | ouragent@dev | server | dev cluster | harness ATIF or OTel | @alice | try new cases on the deployed dev agent |
26
+ | 5 | anyone, UI or `run finance@dev --agent ouragent@dev` | finance@dev | ouragent@dev | server | dev cluster | harness ATIF or OTel | @dev | regression after a deploy or merge |
27
+ | 6 | anyone, `run finance@dev --agent ouragent@prod` | finance@dev | ouragent@prod | server | prod cluster | harness ATIF or OTel | @dev | does prod pass cases approved in dev |
28
+ | 7 | anyone, UI or `run finance@prod --agent ouragent@prod` | finance@prod | ouragent@prod | server | prod cluster | harness ATIF or OTel | @prod | release gate |
29
+ | 8 | deployed ouragent with an agent token | none | ouragent@prod | none | prod cluster | OTel → collector, browsed in Runs | none | trajectory debugging of deployed traffic (optional) |
30
+ | ✗ | anyone, server or UI, `--agent myagent@alice` | any | myagent@alice | refused | | | | the server cannot reach a laptop |
31
+ | ✗ | bob, `--agent myagent@alice` | any | myagent@alice | refused | | | | only the owner runs a personal agent |
32
+
33
+ ## Several branches
34
+
35
+ - `evalkit run` syncs the dataset directory first. The dataset in your
36
+ workspace then matches whichever branch ran last, and the dataset page shows
37
+ that sync's branch and sha.
38
+ - An experiment pins its case versions when it starts. A sync from another
39
+ branch never changes a running or finished experiment. Cases removed by that
40
+ sync are soft-removed, and pinned versions remain.
41
+ - Fixture bytes are content-addressed, so two branches never overwrite each
42
+ other's bytes under the same key.
43
+ - `--resume` does not sync, and runs the pinned versions, so it is safe from any
44
+ branch.
45
+ - Agent config is one row per agent, not per branch.