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,332 @@
1
+ ---
2
+ name: evalkit-deployment
3
+ description: Deploys evalkit for a client and integrates their agent — deploy the server image, run migrations, implement the Harness API (with ATIF trajectory conversion) and any Custom Evaluator API endpoints, write config.yaml, sync a first suite, wire lint/sync into CI, verify with a live harness check. Use when trying evalkit on one machine with the try-it stack, standing up evalkit for the first time, upgrading a deployment, or adding a new agent or custom evaluator. Not for everyday CLI use — see evalkit-usage.
4
+ ---
5
+
6
+ # evalkit deployment
7
+
8
+ One-time work done by the developer who stands evalkit up inside the client's
9
+ infrastructure. Walk it from zero to a passing `evalkit harness check`. Work
10
+ through the steps in order; each is verifiable before the next. Command syntax
11
+ is documented by the CLI itself — run `evalkit --help` (and `--help` on any
12
+ subcommand) instead of guessing flags.
13
+
14
+ Everyday use of the deployed server — installing the CLI, logging in, syncing
15
+ cases, running experiments, reviewing cases — is the **evalkit-usage** skill.
16
+ Every developer on the client's team needs that one; only the deployer needs
17
+ this one. You need no CLI before the server is up: the image contains one
18
+ (`docker compose run --rm server evalkit …`). Once the server runs, install
19
+ it on your machine from PyPI at the server's version, like everyone after you:
20
+ `uv tool install --reinstall "evalkit-py==<version>"`, where
21
+ `curl <server url>/api/cli` prints the version (see evalkit-usage).
22
+
23
+ `evalkit skills install` puts the evalkit user docs in `evalkit-docs/`
24
+ beside this skill; links to `../evalkit-docs/` point there. In the evalkit
25
+ repository the same pages are in `docs/user/`, and every evalkit server shows
26
+ them under `/docs`. In the docs, `{{origin}}` means your evalkit server's URL.
27
+
28
+ Just trying evalkit out? Start with the try-it stack in [`try/`](try/),
29
+ following [Try locally](../evalkit-docs/try-locally.md): `evalkit init-server`
30
+ (no Docker, a local Postgres) or one `docker compose up` runs the server on
31
+ this machine with your LLM as the judge, and a sample
32
+ agent shows the default path (3a, an SDK run with traces) end to end. Come
33
+ back here for a real deployment.
34
+
35
+ ## Copy this checklist and track progress
36
+
37
+ ```
38
+ Deployment:
39
+ - [ ] 1. Deploy the server (docker compose up)
40
+ - [ ] 2. evalkit db upgrade + admin bootstrap + evalkit login + create teammate users
41
+ - [ ] 2b. Create the shared workspaces (dev, prod) and add writers and reviewers
42
+ - [ ] 3. Choose the integration path with the client: 3a SDK + traces (default), 3b Harness API for everything, 3c Harness API for invocation + traces for trajectories
43
+ - [ ] 3a. (default) no harness: the client runs experiments with `run_experiment`; traces give the trajectories
44
+ - [ ] 3b. Implement the full Harness API in the client's harness (references/harness-api.md), trajectory endpoint included, and `evalkit agents create` it in each shared workspace
45
+ - [ ] 3c. Implement the Harness API without its trajectory endpoint; create the agent with `--trajectory-source otel --mapping`, mint an agent token, point the exporter at the collector
46
+ - [ ] 4. Implement Custom Evaluator API endpoints, if the client wants whitebox checks, and `evalkit evaluators create` each one
47
+ - [ ] 5. Write config.yaml (references/config-and-deploy.md), including `encryption_key`, restart the server, then create an LLM provider and set the default judge
48
+ - [ ] 6. evalkit sync a suite of your cases
49
+ - [ ] 7. Wire `evalkit lint` / `evalkit sync` into the client's CI
50
+ - [ ] 8. (3b/3c) evalkit harness check <name>@dev — all declared capabilities pass
51
+ - [ ] 9. first experiment completes: (3a) `run_experiment(...)` from the client's script, (3b/3c) evalkit run finance@dev --agent <name>@dev
52
+ - [ ] 10. Hand off: server URL, usernames, and the evalkit-usage skill to the team
53
+ ```
54
+
55
+ ## 1–2. Server up, authenticated
56
+
57
+ Deployment shape, config keys, and the compose file are in
58
+ [`references/config-and-deploy.md`](references/config-and-deploy.md). The
59
+ server needs: Postgres (it holds everything: users, workspaces, agents,
60
+ cases, experiments, scores — bundled in compose or external), a blob URL,
61
+ and an OpenAI-compatible judge endpoint. The first start needs
62
+ `EVALKIT_ADMIN_PASSWORD`: it creates the `admin` user. It must be at least 8
63
+ characters and at most 72 bytes. Without it, a server with no admin refuses
64
+ to start and says so. Then `evalkit login` as admin
65
+ and `evalkit users add <name>` for each teammate (admin only). Each new user
66
+ gets a personal workspace named after them.
67
+ Which outbound calls the server makes, and how to restrict them, is under
68
+ "Outbound URLs and network egress" in the same reference.
69
+
70
+ ## 2b. Workspaces
71
+
72
+ A workspace holds datasets, agents, remote evaluators and experiments.
73
+ There are two types:
74
+
75
+ - **Personal:** one per user, named after them. Only the owner writes to it.
76
+ Nobody reviews cases there.
77
+ - **Shared:** created by an admin. Admins and its writers write to it. Its
78
+ reviewers approve cases. Review never filters a run: `evalkit run` on its
79
+ datasets runs every case.
80
+
81
+ Every user can read every workspace, including other users' personal
82
+ workspaces: datasets, cases, experiments, runs, trajectories, spans and
83
+ fixtures. Only the owner writes to a personal workspace. So traces a user
84
+ imports or exports into their personal workspace, such as production traces
85
+ pulled for case mining, can be read by everyone on the server. This is by
86
+ design. References are `name@workspace`; a
87
+ bare `name` in the CLI means your personal workspace.
88
+
89
+ Recommended setup: one shared workspace per deployed environment of the
90
+ client's agent, usually `dev` and `prod`. Cases move personal → `@dev` →
91
+ `@prod`: a developer drafts in their own workspace, CI syncs merged cases
92
+ into `@dev` where reviewers approve them, and `@prod` holds the released set.
93
+
94
+ ```bash
95
+ evalkit workspaces create dev # admin only
96
+ evalkit workspaces create prod
97
+ evalkit workspaces members add dev alice --role writer # may sync and run in @dev
98
+ evalkit workspaces members add dev bob --role reviewer # may approve cases in @dev
99
+ evalkit workspaces members list dev
100
+ ```
101
+
102
+ Who drives a run depends on the agent, not on a flag: your code drives a
103
+ code-driven agent (an SDK run), the CLI drives a personal Harness API agent,
104
+ and the server drives a shared one. The full table, with examples for `dev`
105
+ and `prod`, is on the [Workspaces](../evalkit-docs/workspaces.md) page.
106
+
107
+ An experiment lives in the dataset's workspace only when both the dataset
108
+ and the agent are shared; otherwise it lives in the runner's personal
109
+ workspace.
110
+
111
+ ## 3. Choose the integration path
112
+
113
+ Make this an explicit decision with the client before writing any
114
+ integration code; record the choice in the checklist. Two things are being
115
+ decided: who invokes the agent, and where trajectories come from.
116
+
117
+ | Path | Invocation, status, results | Trajectories | Pick when |
118
+ | -- | -- | -- | -- |
119
+ | **3a. SDK + traces** (default) | the client's own code, through `run_experiment` | OpenTelemetry spans exported to the collector | always, unless one of the two below applies |
120
+ | **3b. Harness API for everything** | evalkit's server, through the Harness API | the harness's own `GET /runs/{id}/trajectory` (ATIF) | the client's developers are willing to write and host the ATIF converter, or the agent's record holds more than its spans (the Claude Agent SDK is the usual example) |
121
+ | **3c. Harness API + traces** | evalkit's server, through the Harness API minus the trajectory endpoint | OpenTelemetry spans exported to the collector | runs must be started by the server (UI, schedules) rather than by client code |
122
+
123
+ Traces work for any instrumentation. Every OTel agent needs a span
124
+ mapping: the **connect-traces** skill ships starting points for
125
+ OpenInference and GenAI semantic conventions and writes one for anything
126
+ else. Pass it with `--mapping` when you create the agent.
127
+
128
+ ## 3a. SDK + traces
129
+
130
+ No harness to deploy. The client installs the SDK into the agent's project,
131
+ creates a code-driven agent (`evalkit agents create <name>
132
+ --trajectory-source otel --mapping mapping.json`, no `--harness-url`),
133
+ registers the exporter and runs experiments with `run_experiment`; local runs
134
+ use the developer's own login for the API and the collector. That whole path is the
135
+ **evalkit-usage** skill (its "SDK runs" section) and the **connect-traces**
136
+ skill for the mapping. Your part as deployer: the server is up (steps 1–2)
137
+ and, when the agent also runs as a deployed service that should export
138
+ traces outside a developer's session, an agent token (3c below).
139
+
140
+ ## 3b. Harness API for everything
141
+
142
+ The client's agent harness must expose the endpoints in
143
+ [`references/harness-api.md`](references/harness-api.md): capabilities, run
144
+ start/poll/stop, an ATIF trajectory endpoint, and optionally run listing and
145
+ workspace files. The generated OpenAPI schemas ship inside the evalkit CLI —
146
+ run `evalkit contracts export --target <dir>` to write `harness-api-v1.json`
147
+ and `atif-accepted.json` locally, and point the client's implementation at
148
+ those, not at prose. For the trajectory itself the ATIF RFC (pinned in the
149
+ reference) is the source of truth; the reference lists the RFC rules evalkit's
150
+ metrics depend on and the table of evalkit's `extra` conventions, which is the
151
+ only place they are defined.
152
+
153
+ An admin or a writer of the workspace registers the deployed harness once per
154
+ shared workspace it serves, with its API key. `--api-key-env` reads the key from
155
+ that env var on your machine; the server stores it encrypted:
156
+
157
+ ```bash
158
+ evalkit agents create ouragent --workspace dev --harness-url https://agent-dev.internal/evalkit/v1 --api-key-env OURAGENT_DEV_KEY
159
+ evalkit agents create ouragent --workspace prod --harness-url https://agent.internal/evalkit/v1 --api-key-env OURAGENT_PROD_KEY
160
+ ```
161
+
162
+ Changing the harness URL later clears the stored key unless the same `agents
163
+ edit` sets a new one.
164
+
165
+ Run settings (`--max-concurrent-runs`, `--run-timeout`, `--poll-interval`,
166
+ `--stop-grace`, `--trajectory-wait`) are flags on `agents create` and
167
+ `agents edit`; see `evalkit agents create --help`. Two more rules:
168
+
169
+ - **Capabilities honesty.** Declare only what actually works; evalkit
170
+ neutral-skips evaluators whose inputs a harness doesn't provide, which is
171
+ correct behaviour, whereas a false `true` produces failing scores blamed on
172
+ the agent.
173
+ - **Implement stop.** evalkit calls `POST /runs/{id}/stop` on timeout when
174
+ `accepts.stop` is true. A harness without stop leaks its own resources every
175
+ time a run times out. After a stop, report a terminal status once
176
+ `GET /runs/{id}/trajectory` returns the run's full trajectory: evalkit
177
+ polls for up to `stop_grace_seconds`, then fetches the trajectory once and
178
+ stores what it gets.
179
+
180
+ ## 3c. Harness API + traces
181
+
182
+ Implement the Harness API as in 3b but without the trajectory endpoint.
183
+ Create the agent with `--trajectory-source otel --mapping mapping.json`
184
+ (the mapping's `answer` and `exclude_spans` say where the answer comes from
185
+ and which spans to leave out), have the harness declare
186
+ `provides.trajectory: false`, put the run id it returns on its spans in the
187
+ attribute your mapping's `session_id` rule names (`session.id` in the
188
+ OpenInference mapping, `gen_ai.conversation.id` in the GenAI one), and point its OTLP exporter at
189
+ `<server>/api/otel/v1/traces` with an agent token:
190
+
191
+ ```bash
192
+ evalkit tokens create --agent <name>@dev # admin or a writer of @dev; shown once
193
+ ```
194
+
195
+ Set the token as `EVALKIT_OTEL_TOKEN` (and `EVALKIT_SERVER_URL`) on the
196
+ deployed agent; the evalkit SDK's `tracing.register` picks both up, and any
197
+ other exporter takes it in `OTEL_EXPORTER_OTLP_HEADERS`.
198
+
199
+ A deployed agent usually already exports to a tracing backend (SigNoz,
200
+ Datadog, Honeycomb). The standard OTLP environment variables name one
201
+ endpoint, so sending the same spans to evalkit too needs one of:
202
+
203
+ - **An OpenTelemetry Collector that fans out (recommended in production).**
204
+ The agent keeps exporting to the Collector it already uses; add a second
205
+ `otlphttp` exporter to its traces pipeline:
206
+
207
+ ```yaml
208
+ exporters:
209
+ otlphttp/evalkit:
210
+ traces_endpoint: https://<server>/api/otel/v1/traces
211
+ headers:
212
+ Authorization: Bearer ${env:EVALKIT_OTEL_TOKEN}
213
+ X-Evalkit-Agent: <name>@dev
214
+ service:
215
+ pipelines:
216
+ traces:
217
+ exporters: [otlp/existing, otlphttp/evalkit]
218
+ ```
219
+
220
+ No agent code changes, and an evalkit outage never blocks the agent.
221
+ - **A second exporter in code.** In Python, `tracing.register` already does
222
+ this: it adds evalkit's exporter to the existing provider. In other
223
+ languages add a second batch span processor with an OTLP/HTTP exporter
224
+ pointed at the collector.
225
+
226
+ Two collector facts that matter for proxies and Collectors in between:
227
+
228
+ - The collector speaks **OTLP over HTTP only** (protobuf or JSON, gzip or
229
+ not). An exporter configured for gRPC gets nothing through; use
230
+ `otlphttp`, not `otlp`, in a Collector.
231
+ - The JavaScript exporter sends chunked bodies with no `Content-Length`.
232
+ evalkit accepts them; a proxy in front of it must not require
233
+ `Content-Length`.
234
+
235
+ The server-side
236
+ knobs (`otel.settle_seconds`, `otel.max_batch_bytes`, `otel.max_session_bytes`)
237
+ and how the size limits relate to the server's memory limit are in
238
+ [`references/config-and-deploy.md`](references/config-and-deploy.md). The
239
+ **connect-traces** skill writes the span mapping; later versions are drafted
240
+ and activated in the UI.
241
+
242
+ ## 4. Custom Evaluator API (optional, whitebox)
243
+
244
+ Any check that knows the client's internals — required tool calls, trajectory
245
+ shape against real tool names — lives on the client's side behind the Custom
246
+ Evaluator API (`custom-evaluator-api-v1.json` from `evalkit contracts
247
+ export`): one synchronous POST
248
+ endpoint per named evaluator, receiving the case config verbatim plus the run's
249
+ answer and ATIF trajectory plus its structured `output` (parsed, or null),
250
+ returning one or more named scores (`score: null` = no reading). When the
251
+ harness sent only `output`, `run.answer` is that output as canonical JSON;
252
+ read `run.output` rather than re-parsing it. Errors and timeouts are recorded, never fatal. Register each
253
+ endpoint in the workspace of the agents it scores, with its API key:
254
+
255
+ ```bash
256
+ evalkit evaluators create required_tool_calls --workspace dev --endpoint https://evals.internal/required --kind score --api-key-env EVALS_KEY
257
+ ```
258
+
259
+ A run is scored with the remote evaluators in its agent's workspace.
260
+
261
+ ## 5–6. Config and your first suite
262
+
263
+ Copy this skill's [`config.example.yaml`](config.example.yaml) to `config.yaml`,
264
+ fill it per [`references/config-and-deploy.md`](references/config-and-deploy.md),
265
+ and restart. Then, as admin, register the judge's LLM and make it the default
266
+ judge:
267
+
268
+ ```bash
269
+ evalkit llm-providers create openai --base-url https://api.openai.com/v1 --api-key-env OPENAI_API_KEY
270
+ evalkit judge-default set --provider openai --model gpt-5
271
+ ```
272
+
273
+ Then sync a suite of your cases:
274
+
275
+ 1. If the cases use fixtures, set `fixtures:` in the developer's
276
+ `evalkit.yaml`. `evalkit sync` uploads any fixture bytes the server
277
+ doesn't hold yet.
278
+ 2. `evalkit sync <cases-dir>/<suite> --workspace dev` (an admin or a writer
279
+ of `@dev`).
280
+
281
+ Repeat step 2 whenever the cases change.
282
+
283
+ If an admin has linked workspaces with `evalkit workspaces promote-to <source>
284
+ <target>`, sync only into the source: the target is fed by approvals and
285
+ refuses `evalkit sync`. Create each target dataset once with `evalkit datasets
286
+ create <name>@<target>` before the first approval.
287
+
288
+ ## 7. CI wiring
289
+
290
+ The client owns sync cadence. Recommended: a CI job on their eval-cases
291
+ directory that runs `evalkit lint <dir> --dataset <their-slug>` on every PR
292
+ (fail on errors) and `evalkit sync <dir> --workspace dev` on merge to
293
+ their default branch (the dataset name is the directory name). Both commands
294
+ are thin HTTP calls. Each job installs the CLI from the server first with the
295
+ CI install command in the evalkit-usage skill, so CI always runs the server's
296
+ build. Both jobs log in first: every server call needs a token, lint included
297
+ (only `evalkit lint --offline` runs without one, and it skips the checks that
298
+ need server state). Use admin for both. Each job runs `evalkit login
299
+ --url <server> --username admin --password
300
+ "$EVALKIT_ADMIN_PASSWORD"` with the admin password from CI secrets (the same
301
+ value the server was started with) — tokens expire after
302
+ `auth.token_ttl_hours`, so do not store a token as a secret. Pass
303
+ `--actor <merge author>` on sync (for example the head commit's author email)
304
+ so the case changelog records who synced instead of `admin`. `--dataset` on
305
+ lint is what makes the server check case ids and overlay targets against
306
+ every other dataset; without it those two checks only run at sync.
307
+
308
+ ## 8–9. Verify live
309
+
310
+ On the Harness API paths (3b, 3c), `evalkit harness check <name>@dev` runs a trivial agent call (with one
311
+ input file attached by url when `accepts.file_urls`, or uploaded when only
312
+ `accepts.files`) and exercises every declared
313
+ capability, printing a per-capability pass/fail table — fix fails before
314
+ moving on. Then run the first real experiment:
315
+ `evalkit run finance@dev --agent <name>@dev` (start with
316
+ `--case-id` for one case if agent runs are expensive). On the SDK path (3a)
317
+ the first experiment is
318
+ `run_experiment(dataset="finance@dev", ...)` from the
319
+ client's script, with `dry_run=True` first; `evalkit traces check` on the
320
+ printed session id is the equivalent of the harness check.
321
+
322
+ ## 10. Hand off
323
+
324
+ Give the team the server URL, their usernames, and the evalkit-usage skill
325
+ (`evalkit skills install` vendors it, along with authoring-eval-cases and
326
+ eval-driven-development, into a repo's agent-skills directory). They
327
+ install the CLI from `<server url>/cli`. Upgrades of the deployment itself
328
+ follow the "Upgrades" section of
329
+ [`references/config-and-deploy.md`](references/config-and-deploy.md); after
330
+ one, every CLI prints an update nudge until its owner runs `evalkit update`.
331
+
332
+ For bugs, feature requests and feedback on evalkit, open an issue at https://github.com/inferedge-ai/evalkit/issues; questions go to https://github.com/inferedge-ai/evalkit/discussions.
@@ -0,0 +1,49 @@
1
+ server:
2
+ base_url: https://evalkit.internal # used in links the CLI prints
3
+
4
+ db:
5
+ url: env:EVALKIT_DATABASE_URL # Postgres: users, workspaces, agents, cases, experiments, scores
6
+ # migrate_on_start: true # run `evalkit db upgrade` at startup (default false); see references/config-and-deploy.md
7
+
8
+ blob:
9
+ url: s3://client-bucket/evalkit # or file:///data/evalkit
10
+
11
+ cost_map:
12
+ source: bundled # or a path/URL override
13
+
14
+ auth:
15
+ token_ttl_hours: 720
16
+
17
+ # mcp: # optional; /mcp takes evalkit login tokens without it
18
+ # oauth: # also accept an OAuth identity provider's JWTs carrying `scope`
19
+ # issuer: https://id.example.com
20
+ # jwks_uri: https://id.example.com/.well-known/jwks.json
21
+ # scope: evalkit:read # the provider's name for read access (default)
22
+
23
+ otel: # optional block; the OTLP collector at /api/otel/v1/traces
24
+ settle_seconds: 10 # a session is settled when its newest span arrived longer ago than this
25
+ max_batch_bytes: 16777216 # one export request; 413 beyond it
26
+ max_session_bytes: 402653184 # span attributes one session read loads; 413 beyond it (size with the server's memory)
27
+ import_page_traces: 25 # traces per request to a trace source during an import (size with the server's memory)
28
+
29
+ limits: # optional block; request body caps, 413 beyond them
30
+ fixture_upload_bytes: 524288000 # one fixture file uploaded by evalkit sync (500 MB)
31
+ experiment_blob_bytes: 524288000 # one trajectory or artifact written by a local run (500 MB)
32
+ case_upload_bytes: 52428800 # the case YAML files of one evalkit sync or lint (50 MB)
33
+ request_bytes: 10485760 # any other request body (10 MB); the collector uses otel.max_batch_bytes
34
+
35
+ # sentry: # optional; report server errors to Sentry
36
+ # dsn: env:SENTRY_DSN
37
+ # environment: production
38
+ # traces_sample_rate: 0.0 # share of requests traced for performance (0.0-1.0)
39
+ # max_request_body_size: never # request bodies attached to events: never, small (1 KB), medium (10 KB), always; bodies can hold client case data
40
+
41
+ encryption_key: env:EVALKIT_ENCRYPTION_KEY # Fernet key; encrypts the API keys of agents, remote evaluators, LLM providers and trace sources; the server refuses to start without it once any exist
42
+
43
+ # allow_private_endpoints: true # let agents, evaluators and LLM providers point at loopback, private or link-local addresses (default false); set it when they run in the same cluster or on host.docker.internal
44
+
45
+ # LLM providers, the default judge and the API keys of shared agents and remote evaluators
46
+ # live in the database. Set them after the first start:
47
+ # evalkit llm-providers create openai --base-url https://api.openai.com/v1 --api-key-env OPENAI_API_KEY
48
+ # evalkit judge-default set --provider openai --model gpt-5
49
+ # evalkit agents edit ouragent@dev --api-key-env OURAGENT_DEV_KEY
@@ -0,0 +1,51 @@
1
+ # evalkit self-hosted deployment: server + Postgres.
2
+ #
3
+ # The server image is prebuilt and pulled from your registry — set
4
+ # EVALKIT_IMAGE to the image you were given, e.g.
5
+ # EVALKIT_IMAGE=<registry>/evalkit:<tag>
6
+ # (registries differ per client, so there is no default).
7
+ #
8
+ # The server verifies the schema and exits when it is missing or outdated.
9
+ # With `db.migrate_on_start: true` in config.yaml it migrates first, so
10
+ # `docker compose up -d` is the whole start. Without it, bring up postgres,
11
+ # run `evalkit db upgrade`, then start the server
12
+ # (see references/config-and-deploy.md).
13
+ #
14
+ # Using an existing Postgres instead? Remove the `postgres` service and the
15
+ # `depends_on`, and set `db.url` in config.yaml to your instance
16
+ # (postgresql+psycopg://user:pass@host/dbname).
17
+
18
+ services:
19
+ server:
20
+ image: ${EVALKIT_IMAGE:?set EVALKIT_IMAGE to the evalkit server image, e.g. <registry>/evalkit:<tag>}
21
+ ports:
22
+ - "8020:8020"
23
+ volumes:
24
+ - ./config.yaml:/etc/evalkit/config.yaml:ro
25
+ # For a file:// blob URL, mount a volume at the configured path:
26
+ - blob-data:/data/evalkit
27
+ environment:
28
+ EVALKIT_DATABASE_URL: postgresql+psycopg://evalkit:${POSTGRES_PASSWORD:?set in .env}@postgres/evalkit
29
+ EVALKIT_ADMIN_PASSWORD: ${EVALKIT_ADMIN_PASSWORD:-}
30
+ EVALKIT_ENCRYPTION_KEY: ${EVALKIT_ENCRYPTION_KEY:?set in .env}
31
+ depends_on:
32
+ postgres:
33
+ condition: service_healthy
34
+
35
+ postgres:
36
+ image: postgres:17
37
+ environment:
38
+ POSTGRES_USER: evalkit
39
+ POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set in .env}
40
+ POSTGRES_DB: evalkit
41
+ volumes:
42
+ - auth-db:/var/lib/postgresql/data
43
+ healthcheck:
44
+ test: ["CMD-SHELL", "pg_isready -U evalkit -d evalkit"]
45
+ interval: 5s
46
+ timeout: 3s
47
+ retries: 10
48
+
49
+ volumes:
50
+ auth-db:
51
+ blob-data: