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,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.
|