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.
- evalkit/__init__.py +0 -0
- evalkit/api/__init__.py +0 -0
- evalkit/api/access.py +74 -0
- evalkit/api/agents.py +159 -0
- evalkit/api/app.py +360 -0
- evalkit/api/auth.py +225 -0
- evalkit/api/cli_dist.py +10 -0
- evalkit/api/datasets.py +169 -0
- evalkit/api/deps.py +79 -0
- evalkit/api/download.py +15 -0
- evalkit/api/evaluators.py +121 -0
- evalkit/api/experiments.py +616 -0
- evalkit/api/fixtures.py +95 -0
- evalkit/api/harness_check.py +48 -0
- evalkit/api/imports.py +180 -0
- evalkit/api/limits.py +84 -0
- evalkit/api/llm_providers.py +120 -0
- evalkit/api/mcp/__init__.py +0 -0
- evalkit/api/mcp/auth.py +100 -0
- evalkit/api/mcp/descriptions.py +336 -0
- evalkit/api/mcp/models.py +259 -0
- evalkit/api/mcp/server.py +101 -0
- evalkit/api/mcp/tools.py +844 -0
- evalkit/api/meta.py +19 -0
- evalkit/api/otel.py +350 -0
- evalkit/api/pull.py +197 -0
- evalkit/api/review.py +271 -0
- evalkit/api/runs.py +555 -0
- evalkit/api/server_keys.py +44 -0
- evalkit/api/tokens.py +51 -0
- evalkit/api/trace_imports.py +173 -0
- evalkit/api/trace_sources.py +49 -0
- evalkit/api/traces.py +196 -0
- evalkit/api/users.py +72 -0
- evalkit/api/workspaces.py +131 -0
- evalkit/bundled/contracts/atif-accepted.json +5 -0
- evalkit/bundled/contracts/custom-evaluator-api-v1.json +243 -0
- evalkit/bundled/contracts/harness-api-v1.json +938 -0
- evalkit/bundled/contracts/span-mapping-v1.json +314 -0
- evalkit/bundled/docs/concepts.md +26 -0
- evalkit/bundled/docs/config.md +38 -0
- evalkit/bundled/docs/harness-api.md +44 -0
- evalkit/bundled/docs/install.md +60 -0
- evalkit/bundled/docs/login.md +36 -0
- evalkit/bundled/docs/mappings.md +136 -0
- evalkit/bundled/docs/mcp.md +44 -0
- evalkit/bundled/docs/quickstart.md +142 -0
- evalkit/bundled/docs/sdk-runs.md +171 -0
- evalkit/bundled/docs/tracing.md +171 -0
- evalkit/bundled/docs/try-locally.md +288 -0
- evalkit/bundled/docs/workspaces.md +45 -0
- evalkit/bundled/skills/authoring-eval-cases/SKILL.md +387 -0
- evalkit/bundled/skills/authoring-eval-cases/references/overlays.md +83 -0
- evalkit/bundled/skills/authoring-eval-cases/references/tool-checks.md +71 -0
- evalkit/bundled/skills/connect-traces/SKILL.md +296 -0
- evalkit/bundled/skills/connect-traces/references/gen_ai.json +42 -0
- evalkit/bundled/skills/connect-traces/references/openinference.json +35 -0
- evalkit/bundled/skills/connect-traces/references/span-mapping-schema.md +88 -0
- evalkit/bundled/skills/eval-driven-development/SKILL.md +458 -0
- evalkit/bundled/skills/eval-driven-development/references/analyze-run.md +97 -0
- evalkit/bundled/skills/eval-driven-development/references/diagnose.md +130 -0
- evalkit/bundled/skills/eval-driven-development/references/synthesize-cases.md +87 -0
- evalkit/bundled/skills/eval-driven-development/references/synthesize.md +165 -0
- evalkit/bundled/skills/evalkit-deployment/SKILL.md +332 -0
- evalkit/bundled/skills/evalkit-deployment/config.example.yaml +49 -0
- evalkit/bundled/skills/evalkit-deployment/docker-compose.yml +51 -0
- evalkit/bundled/skills/evalkit-deployment/references/config-and-deploy.md +333 -0
- evalkit/bundled/skills/evalkit-deployment/references/harness-api.md +139 -0
- evalkit/bundled/skills/evalkit-deployment/try/.env.example +11 -0
- evalkit/bundled/skills/evalkit-deployment/try/agent.py +131 -0
- evalkit/bundled/skills/evalkit-deployment/try/cases/acme/balance-sheet/cases.yaml +25 -0
- evalkit/bundled/skills/evalkit-deployment/try/cases/acme/income-statement/cases.yaml +43 -0
- evalkit/bundled/skills/evalkit-deployment/try/config.yaml +17 -0
- evalkit/bundled/skills/evalkit-deployment/try/docker-compose.yml +82 -0
- evalkit/bundled/skills/evalkit-deployment/try/evalkit.yaml +4 -0
- evalkit/bundled/skills/evalkit-deployment/try/mapping.json +42 -0
- evalkit/bundled/skills/evalkit-deployment/try/run.py +33 -0
- evalkit/bundled/skills/evalkit-usage/SKILL.md +509 -0
- evalkit/bundled/skills/evalkit-usage/references/suite-fixtures.md +42 -0
- evalkit/bundled/ui/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- evalkit/bundled/ui/assets/abap-08VXUWAP.js +1 -0
- evalkit/bundled/ui/assets/apex-BWPQTe0t.js +1 -0
- evalkit/bundled/ui/assets/azcli-Bc_sGQ0U.js +1 -0
- evalkit/bundled/ui/assets/bat-i0X4ZdIN.js +1 -0
- evalkit/bundled/ui/assets/bicep-B5-_aFwp.js +2 -0
- evalkit/bundled/ui/assets/cameligo-DMUM7wLl.js +1 -0
- evalkit/bundled/ui/assets/clojure-Cm7r79vr.js +1 -0
- evalkit/bundled/ui/assets/codicon-DF1abBS2.ttf +0 -0
- evalkit/bundled/ui/assets/coffee-Ba7i2nA0.js +1 -0
- evalkit/bundled/ui/assets/cpp-C7h46wYY.js +1 -0
- evalkit/bundled/ui/assets/csharp-BKxtCVv1.js +1 -0
- evalkit/bundled/ui/assets/csp-bTuwJoIa.js +1 -0
- evalkit/bundled/ui/assets/css-DIMkf-bt.js +3 -0
- evalkit/bundled/ui/assets/css.worker-DwfUZ3fB.js +96 -0
- evalkit/bundled/ui/assets/cssMode-C97l1pbB.js +1 -0
- evalkit/bundled/ui/assets/cypher-CVaqCwHa.js +1 -0
- evalkit/bundled/ui/assets/dart-onAF5SnQ.js +1 -0
- evalkit/bundled/ui/assets/dockerfile-DZFCIeNp.js +1 -0
- evalkit/bundled/ui/assets/ecl-94qehhXe.js +1 -0
- evalkit/bundled/ui/assets/editor-DjpsE8to.css +1 -0
- evalkit/bundled/ui/assets/editor.api-NTesIxw5.js +908 -0
- evalkit/bundled/ui/assets/editor.worker-CRz__AKW.js +33 -0
- evalkit/bundled/ui/assets/elixir-6RTg0lbw.js +1 -0
- evalkit/bundled/ui/assets/flow9-C5_-GSwl.js +1 -0
- evalkit/bundled/ui/assets/freemarker2-BWqEFagp.js +3 -0
- evalkit/bundled/ui/assets/fsharp-C8Ef5oNN.js +1 -0
- evalkit/bundled/ui/assets/go-C-y9NEjX.js +1 -0
- evalkit/bundled/ui/assets/graphql-fmXr3nnJ.js +1 -0
- evalkit/bundled/ui/assets/handlebars-DkIF-whN.js +1 -0
- evalkit/bundled/ui/assets/hcl-CpzslTdj.js +1 -0
- evalkit/bundled/ui/assets/html-C_rpeQXJ.js +1 -0
- evalkit/bundled/ui/assets/html.worker-D9ugpX4y.js +509 -0
- evalkit/bundled/ui/assets/htmlMode-B0YIq3DF.js +1 -0
- evalkit/bundled/ui/assets/index-Cw-jBH6M.js +736 -0
- evalkit/bundled/ui/assets/index-DKtoQZtm.css +1 -0
- evalkit/bundled/ui/assets/ini-sBoK_t0W.js +1 -0
- evalkit/bundled/ui/assets/java-BEtHBSE6.js +1 -0
- evalkit/bundled/ui/assets/javascript-D4EGhYA6.js +1 -0
- evalkit/bundled/ui/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- evalkit/bundled/ui/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- evalkit/bundled/ui/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- evalkit/bundled/ui/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- evalkit/bundled/ui/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- evalkit/bundled/ui/assets/json.worker-CV9fqkUp.js +65 -0
- evalkit/bundled/ui/assets/jsonMode-pQjSfIH6.js +7 -0
- evalkit/bundled/ui/assets/julia-Bri6UV-V.js +1 -0
- evalkit/bundled/ui/assets/kotlin-BOotOW0E.js +1 -0
- evalkit/bundled/ui/assets/less-B9JPFI3C.js +2 -0
- evalkit/bundled/ui/assets/lexon-CfSJPG6W.js +1 -0
- evalkit/bundled/ui/assets/liquid-DbrvoYjD.js +1 -0
- evalkit/bundled/ui/assets/lspLanguageFeatures-D0B7cH6y.js +4 -0
- evalkit/bundled/ui/assets/lua-CsQS60Ue.js +1 -0
- evalkit/bundled/ui/assets/m3-D-oSqn_W.js +1 -0
- evalkit/bundled/ui/assets/markdown-Cimd5fb3.js +1 -0
- evalkit/bundled/ui/assets/mdx-B0HrujLR.js +1 -0
- evalkit/bundled/ui/assets/mips-CIPQ_RoX.js +1 -0
- evalkit/bundled/ui/assets/monacoEditor-DsoPncxW.js +68 -0
- evalkit/bundled/ui/assets/monacoEditor-n7clI0si.css +1 -0
- evalkit/bundled/ui/assets/msdax-DauUninz.js +1 -0
- evalkit/bundled/ui/assets/mysql-SOo6toE5.js +1 -0
- evalkit/bundled/ui/assets/objective-c-FvmIjYaQ.js +1 -0
- evalkit/bundled/ui/assets/pascal-DrH0SRf2.js +1 -0
- evalkit/bundled/ui/assets/pascaligo-D-ptJ9y-.js +1 -0
- evalkit/bundled/ui/assets/perl-oz_6vUea.js +1 -0
- evalkit/bundled/ui/assets/pgsql-DTj74zXo.js +1 -0
- evalkit/bundled/ui/assets/php-nr791fC2.js +1 -0
- evalkit/bundled/ui/assets/pla-CopQ2nXW.js +1 -0
- evalkit/bundled/ui/assets/postiats-43DmfD33.js +1 -0
- evalkit/bundled/ui/assets/powerquery-D3hlyOfw.js +1 -0
- evalkit/bundled/ui/assets/powershell-DmHpPYUd.js +1 -0
- evalkit/bundled/ui/assets/protobuf-C531GsRP.js +2 -0
- evalkit/bundled/ui/assets/pug-Z5eAx3Zn.js +1 -0
- evalkit/bundled/ui/assets/python-CieHVM9n.js +1 -0
- evalkit/bundled/ui/assets/qsharp-DkqhCAOL.js +1 -0
- evalkit/bundled/ui/assets/r-BwWrilGY.js +1 -0
- evalkit/bundled/ui/assets/razor-sLewSMyp.js +1 -0
- evalkit/bundled/ui/assets/redis-ClamHrr6.js +1 -0
- evalkit/bundled/ui/assets/redshift-DT7zqm-g.js +1 -0
- evalkit/bundled/ui/assets/restructuredtext-BYgofb2h.js +1 -0
- evalkit/bundled/ui/assets/ruby-DezsRK8O.js +1 -0
- evalkit/bundled/ui/assets/rust-DdL9SqIa.js +1 -0
- evalkit/bundled/ui/assets/sb-CcwsVR0C.js +1 -0
- evalkit/bundled/ui/assets/scala-DHpiXF5c.js +1 -0
- evalkit/bundled/ui/assets/scheme-BeGwcela.js +1 -0
- evalkit/bundled/ui/assets/scss-gp-XZpBa.js +3 -0
- evalkit/bundled/ui/assets/shell-CC2rA5mh.js +1 -0
- evalkit/bundled/ui/assets/solidity-BEEn4gHE.js +1 -0
- evalkit/bundled/ui/assets/sophia-CRfGWb83.js +1 -0
- evalkit/bundled/ui/assets/sparql-D_Lu-MrJ.js +1 -0
- evalkit/bundled/ui/assets/sql-NEE52Syq.js +1 -0
- evalkit/bundled/ui/assets/st-DbInun42.js +1 -0
- evalkit/bundled/ui/assets/swift-Bxkupp3x.js +1 -0
- evalkit/bundled/ui/assets/systemverilog-Bz4Y3fRF.js +1 -0
- evalkit/bundled/ui/assets/tcl-DISqw1ZD.js +1 -0
- evalkit/bundled/ui/assets/ts.worker-DIAQkoB3.js +67741 -0
- evalkit/bundled/ui/assets/tsMode-BcVQ1nu0.js +11 -0
- evalkit/bundled/ui/assets/twig-De2hgUGE.js +1 -0
- evalkit/bundled/ui/assets/typescript-CUvNWd9p.js +1 -0
- evalkit/bundled/ui/assets/typespec-B8J7ngcE.js +1 -0
- evalkit/bundled/ui/assets/vb-DV3o63ZY.js +1 -0
- evalkit/bundled/ui/assets/wgsl-DpFanUEy.js +298 -0
- evalkit/bundled/ui/assets/workers-CwpYQtzp.js +1 -0
- evalkit/bundled/ui/assets/xml-C1HnXMdF.js +1 -0
- evalkit/bundled/ui/assets/yaml-D7Ey3HQu.js +1 -0
- evalkit/bundled/ui/favicon.svg +6 -0
- evalkit/bundled/ui/index.html +14 -0
- evalkit/cli/__init__.py +0 -0
- evalkit/cli/admin_commands.py +590 -0
- evalkit/cli/client.py +67 -0
- evalkit/cli/init_server.py +165 -0
- evalkit/cli/local_run.py +195 -0
- evalkit/cli/main.py +1365 -0
- evalkit/cli/runs_commands.py +539 -0
- evalkit/cli/server_commands.py +130 -0
- evalkit/cli/skill_targets.py +43 -0
- evalkit/cli/tokens_commands.py +52 -0
- evalkit/cli/traces_commands.py +332 -0
- evalkit/cli/update.py +85 -0
- evalkit/client/__init__.py +0 -0
- evalkit/client/agents.py +25 -0
- evalkit/client/api.py +193 -0
- evalkit/client/blob.py +104 -0
- evalkit/client/connection.py +88 -0
- evalkit/client/evaluators.py +11 -0
- evalkit/client/sessions.py +17 -0
- evalkit/client/store.py +139 -0
- evalkit/client/summary.py +46 -0
- evalkit/client/sync.py +198 -0
- evalkit/config.py +227 -0
- evalkit/contracts/__init__.py +0 -0
- evalkit/contracts/atif.py +115 -0
- evalkit/contracts/cases.py +456 -0
- evalkit/contracts/custom_evaluator.py +58 -0
- evalkit/contracts/enums.py +86 -0
- evalkit/contracts/esf.py +120 -0
- evalkit/contracts/harness.py +281 -0
- evalkit/contracts/notes.json +4 -0
- evalkit/contracts/notes.py +7 -0
- evalkit/contracts/settings.py +41 -0
- evalkit/core/__init__.py +0 -0
- evalkit/core/access.py +75 -0
- evalkit/core/agents.py +65 -0
- evalkit/core/blob.py +46 -0
- evalkit/core/capabilities.py +36 -0
- evalkit/core/costmap.py +90 -0
- evalkit/core/custom_eval.py +50 -0
- evalkit/core/data/cost_map.json +81546 -0
- evalkit/core/endpoints.py +31 -0
- evalkit/core/evaluators/__init__.py +29 -0
- evalkit/core/evaluators/base.py +121 -0
- evalkit/core/evaluators/gauges.py +84 -0
- evalkit/core/evaluators/presentation.py +166 -0
- evalkit/core/evaluators/response_time.py +21 -0
- evalkit/core/evaluators/rubrics.py +494 -0
- evalkit/core/evaluators/tool_trajectory.py +187 -0
- evalkit/core/evaluators/trajectory_rubrics.py +198 -0
- evalkit/core/fixtures.py +57 -0
- evalkit/core/harness.py +227 -0
- evalkit/core/harness_check.py +191 -0
- evalkit/core/importer.py +257 -0
- evalkit/core/judge.py +78 -0
- evalkit/core/lint.py +265 -0
- evalkit/core/overlays.py +76 -0
- evalkit/core/paths.py +25 -0
- evalkit/core/promotion.py +94 -0
- evalkit/core/pull.py +198 -0
- evalkit/core/python_eval.py +59 -0
- evalkit/core/remote_evaluators.py +32 -0
- evalkit/core/review.py +220 -0
- evalkit/core/run_digest.py +421 -0
- evalkit/core/runner.py +995 -0
- evalkit/core/scorecard.py +255 -0
- evalkit/core/traces/__init__.py +0 -0
- evalkit/core/traces/convert.py +336 -0
- evalkit/core/traces/importer.py +113 -0
- evalkit/core/traces/mapping.py +385 -0
- evalkit/core/traces/poll.py +38 -0
- evalkit/core/traces/raw.py +21 -0
- evalkit/core/traces/sessions.py +172 -0
- evalkit/core/traces/settle.py +14 -0
- evalkit/core/traces/sources/__init__.py +19 -0
- evalkit/core/traces/sources/base.py +25 -0
- evalkit/core/traces/sources/phoenix.py +121 -0
- evalkit/core/trajectory.py +248 -0
- evalkit/core/workspace.py +30 -0
- evalkit/credentials.py +119 -0
- evalkit/db/__init__.py +0 -0
- evalkit/db/agents.py +289 -0
- evalkit/db/alembic/env.py +90 -0
- evalkit/db/alembic/script.py.mako +28 -0
- evalkit/db/alembic/versions/0011_baseline.py +1002 -0
- evalkit/db/alembic/versions/0012_ticket_token_kind.py +27 -0
- evalkit/db/alembic/versions/0013_keys_and_llm_providers.py +67 -0
- evalkit/db/cases.py +608 -0
- evalkit/db/crypto.py +12 -0
- evalkit/db/evaluators.py +156 -0
- evalkit/db/experiments.py +363 -0
- evalkit/db/fixture_blobs.py +91 -0
- evalkit/db/keys.py +78 -0
- evalkit/db/llm_providers.py +176 -0
- evalkit/db/locks.py +6 -0
- evalkit/db/mappings.py +168 -0
- evalkit/db/models.py +567 -0
- evalkit/db/promotion.py +271 -0
- evalkit/db/rekey.py +46 -0
- evalkit/db/review.py +250 -0
- evalkit/db/review_state.py +50 -0
- evalkit/db/runs.py +533 -0
- evalkit/db/scorecard.py +300 -0
- evalkit/db/session.py +71 -0
- evalkit/db/sessions.py +90 -0
- evalkit/db/spans.py +360 -0
- evalkit/db/store.py +209 -0
- evalkit/db/tokens.py +100 -0
- evalkit/db/trace_imports.py +308 -0
- evalkit/db/trace_sources.py +131 -0
- evalkit/db/users.py +186 -0
- evalkit/db/workspaces.py +232 -0
- evalkit/paths.py +33 -0
- evalkit/sdk/__init__.py +29 -0
- evalkit/sdk/binding.py +69 -0
- evalkit/sdk/evaluators.py +56 -0
- evalkit/sdk/runner.py +957 -0
- evalkit/sdk/tracing.py +166 -0
- evalkit/store/__init__.py +0 -0
- evalkit/store/base.py +354 -0
- evalkit/store/blob.py +69 -0
- evalkit/version.py +44 -0
- evalkit_py-0.2.0.dev12.dist-info/METADATA +205 -0
- evalkit_py-0.2.0.dev12.dist-info/RECORD +371 -0
- evalkit_py-0.2.0.dev12.dist-info/WHEEL +4 -0
- evalkit_py-0.2.0.dev12.dist-info/entry_points.txt +2 -0
- 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:
|