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,176 @@
|
|
|
1
|
+
from datetime import UTC, datetime
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
from sqlalchemy import select
|
|
5
|
+
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
|
|
6
|
+
|
|
7
|
+
from evalkit.contracts.settings import JudgeSettings
|
|
8
|
+
from evalkit.db import models
|
|
9
|
+
from evalkit.db.locks import lock_name
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class UnknownLlmProvider(KeyError):
|
|
13
|
+
def __init__(self, name: str):
|
|
14
|
+
super().__init__(
|
|
15
|
+
f"unknown LLM provider: {name} — create it with evalkit llm-providers create"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class LlmProviderExists(ValueError):
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ProviderInUse(ValueError):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class LlmProviderView(BaseModel):
|
|
28
|
+
name: str
|
|
29
|
+
base_url: str
|
|
30
|
+
has_api_key: bool
|
|
31
|
+
archived: bool
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _view(row: models.LlmProvider) -> LlmProviderView:
|
|
35
|
+
return LlmProviderView(
|
|
36
|
+
name=row.name,
|
|
37
|
+
base_url=row.base_url,
|
|
38
|
+
has_api_key=row.api_key_encrypted is not None,
|
|
39
|
+
archived=row.archived_at is not None,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class LlmProviderStore:
|
|
44
|
+
def __init__(self, session_factory: async_sessionmaker[AsyncSession]):
|
|
45
|
+
self._sessions = session_factory
|
|
46
|
+
|
|
47
|
+
async def _row(self, session: AsyncSession, name: str) -> models.LlmProvider:
|
|
48
|
+
row = await session.scalar(
|
|
49
|
+
select(models.LlmProvider).where(models.LlmProvider.name == name)
|
|
50
|
+
)
|
|
51
|
+
if row is None:
|
|
52
|
+
raise UnknownLlmProvider(name)
|
|
53
|
+
return row
|
|
54
|
+
|
|
55
|
+
async def _settings(self, session: AsyncSession) -> models.ServerSettings | None:
|
|
56
|
+
return await session.get(models.ServerSettings, 1)
|
|
57
|
+
|
|
58
|
+
async def _check_free(self, session: AsyncSession, name: str, base_url: str) -> None:
|
|
59
|
+
taken = await session.scalar(
|
|
60
|
+
select(models.LlmProvider.name).where(
|
|
61
|
+
(models.LlmProvider.name == name) | (models.LlmProvider.base_url == base_url)
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
if taken is not None:
|
|
65
|
+
raise LlmProviderExists(f"LLM provider exists with that name or base URL: {taken}")
|
|
66
|
+
|
|
67
|
+
async def create(
|
|
68
|
+
self, name: str, base_url: str, api_key_encrypted: bytes | None
|
|
69
|
+
) -> LlmProviderView:
|
|
70
|
+
async with self._sessions() as session:
|
|
71
|
+
await lock_name(session, "llm-provider", name)
|
|
72
|
+
await self._check_free(session, name, base_url)
|
|
73
|
+
row = models.LlmProvider(
|
|
74
|
+
name=name, base_url=base_url, api_key_encrypted=api_key_encrypted
|
|
75
|
+
)
|
|
76
|
+
session.add(row)
|
|
77
|
+
await session.commit()
|
|
78
|
+
return _view(row)
|
|
79
|
+
|
|
80
|
+
async def edit(
|
|
81
|
+
self,
|
|
82
|
+
name: str,
|
|
83
|
+
*,
|
|
84
|
+
base_url: str | None = None,
|
|
85
|
+
api_key_encrypted: bytes | None = None,
|
|
86
|
+
clear_api_key: bool = False,
|
|
87
|
+
) -> LlmProviderView:
|
|
88
|
+
async with self._sessions() as session:
|
|
89
|
+
row = await self._row(session, name)
|
|
90
|
+
if base_url is not None and base_url != row.base_url:
|
|
91
|
+
settings = await self._settings(session)
|
|
92
|
+
if (
|
|
93
|
+
settings is not None
|
|
94
|
+
and (settings.default_judge or {}).get("base_url") == row.base_url
|
|
95
|
+
):
|
|
96
|
+
raise ProviderInUse(
|
|
97
|
+
f"{name} is the default judge's provider; "
|
|
98
|
+
"set another default judge before changing its base URL"
|
|
99
|
+
)
|
|
100
|
+
row.base_url = base_url
|
|
101
|
+
row.api_key_encrypted = None
|
|
102
|
+
if api_key_encrypted is not None or clear_api_key:
|
|
103
|
+
row.api_key_encrypted = api_key_encrypted
|
|
104
|
+
await session.commit()
|
|
105
|
+
return _view(row)
|
|
106
|
+
|
|
107
|
+
async def archive(self, name: str) -> LlmProviderView:
|
|
108
|
+
async with self._sessions() as session:
|
|
109
|
+
row = await self._row(session, name)
|
|
110
|
+
settings = await self._settings(session)
|
|
111
|
+
if (
|
|
112
|
+
settings is not None
|
|
113
|
+
and (settings.default_judge or {}).get("base_url") == row.base_url
|
|
114
|
+
):
|
|
115
|
+
raise ProviderInUse(
|
|
116
|
+
f"{name} is the default judge's provider; set another default judge first"
|
|
117
|
+
)
|
|
118
|
+
row.archived_at = datetime.now(UTC)
|
|
119
|
+
await session.commit()
|
|
120
|
+
return _view(row)
|
|
121
|
+
|
|
122
|
+
async def restore(self, name: str) -> LlmProviderView:
|
|
123
|
+
async with self._sessions() as session:
|
|
124
|
+
row = await self._row(session, name)
|
|
125
|
+
row.archived_at = None
|
|
126
|
+
await session.commit()
|
|
127
|
+
return _view(row)
|
|
128
|
+
|
|
129
|
+
async def get(self, name: str) -> LlmProviderView:
|
|
130
|
+
async with self._sessions() as session:
|
|
131
|
+
return _view(await self._row(session, name))
|
|
132
|
+
|
|
133
|
+
async def list_providers(self, include_archived: bool = False) -> list[LlmProviderView]:
|
|
134
|
+
query = select(models.LlmProvider).order_by(models.LlmProvider.name)
|
|
135
|
+
if not include_archived:
|
|
136
|
+
query = query.where(models.LlmProvider.archived_at.is_(None))
|
|
137
|
+
async with self._sessions() as session:
|
|
138
|
+
return [_view(row) for row in (await session.scalars(query)).all()]
|
|
139
|
+
|
|
140
|
+
async def active_by_base_url(self, base_url: str) -> LlmProviderView | None:
|
|
141
|
+
async with self._sessions() as session:
|
|
142
|
+
row = await session.scalar(
|
|
143
|
+
select(models.LlmProvider).where(
|
|
144
|
+
models.LlmProvider.base_url == base_url,
|
|
145
|
+
models.LlmProvider.archived_at.is_(None),
|
|
146
|
+
)
|
|
147
|
+
)
|
|
148
|
+
return _view(row) if row is not None else None
|
|
149
|
+
|
|
150
|
+
async def sealed_key(self, base_url: str) -> bytes | None:
|
|
151
|
+
async with self._sessions() as session:
|
|
152
|
+
return await session.scalar(
|
|
153
|
+
select(models.LlmProvider.api_key_encrypted).where(
|
|
154
|
+
models.LlmProvider.base_url == base_url,
|
|
155
|
+
models.LlmProvider.archived_at.is_(None),
|
|
156
|
+
)
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
async def default_judge(self) -> JudgeSettings | None:
|
|
160
|
+
async with self._sessions() as session:
|
|
161
|
+
settings = await self._settings(session)
|
|
162
|
+
if settings is None or settings.default_judge is None:
|
|
163
|
+
return None
|
|
164
|
+
return JudgeSettings.model_validate(settings.default_judge)
|
|
165
|
+
|
|
166
|
+
async def set_default_judge(self, judge: JudgeSettings) -> JudgeSettings:
|
|
167
|
+
if await self.active_by_base_url(judge.base_url) is None:
|
|
168
|
+
raise UnknownLlmProvider(judge.base_url)
|
|
169
|
+
async with self._sessions() as session:
|
|
170
|
+
settings = await self._settings(session)
|
|
171
|
+
if settings is None:
|
|
172
|
+
settings = models.ServerSettings(id=1)
|
|
173
|
+
session.add(settings)
|
|
174
|
+
settings.default_judge = judge.model_dump()
|
|
175
|
+
await session.commit()
|
|
176
|
+
return judge
|
evalkit/db/locks.py
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from sqlalchemy import func, select
|
|
2
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
async def lock_name(session: AsyncSession, namespace: str, name: str = "") -> None:
|
|
6
|
+
await session.execute(select(func.pg_advisory_xact_lock(func.hashtext(f"{namespace}:{name}"))))
|
evalkit/db/mappings.py
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from datetime import UTC, datetime
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel
|
|
7
|
+
from sqlalchemy import Select, func, select
|
|
8
|
+
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
|
|
9
|
+
|
|
10
|
+
from evalkit.contracts.enums import MappingStatus
|
|
11
|
+
from evalkit.db import models
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MappingRecord(BaseModel):
|
|
15
|
+
id: int
|
|
16
|
+
version: int
|
|
17
|
+
status: str
|
|
18
|
+
document: dict[str, Any]
|
|
19
|
+
created_by: str | None
|
|
20
|
+
created_at: datetime
|
|
21
|
+
activated_at: datetime | None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _to_record(row: models.SpanMapping, author: str | None) -> MappingRecord:
|
|
25
|
+
return MappingRecord(
|
|
26
|
+
id=row.id,
|
|
27
|
+
version=row.version,
|
|
28
|
+
status=row.status,
|
|
29
|
+
document=row.mapping,
|
|
30
|
+
created_by=author,
|
|
31
|
+
created_at=row.created_at,
|
|
32
|
+
activated_at=row.activated_at,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _with_author(query: Select) -> Select:
|
|
37
|
+
return query.add_columns(models.User.username).outerjoin(
|
|
38
|
+
models.User, models.User.id == models.SpanMapping.created_by_id
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
async def active_mapping(session: AsyncSession, agent_id: int) -> models.SpanMapping | None:
|
|
43
|
+
return await session.scalar(
|
|
44
|
+
select(models.SpanMapping).where(
|
|
45
|
+
models.SpanMapping.agent_id == agent_id,
|
|
46
|
+
models.SpanMapping.status == MappingStatus.ACTIVE.value,
|
|
47
|
+
)
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async def retire_active(session: AsyncSession, agent_id: int, keep: int | None = None) -> None:
|
|
52
|
+
current = await active_mapping(session, agent_id)
|
|
53
|
+
if current is not None and current.id != keep:
|
|
54
|
+
current.status = MappingStatus.RETIRED.value
|
|
55
|
+
await session.flush()
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
async def next_version(session: AsyncSession, agent_id: int) -> int:
|
|
59
|
+
last = await session.scalar(
|
|
60
|
+
select(func.max(models.SpanMapping.version)).where(models.SpanMapping.agent_id == agent_id)
|
|
61
|
+
)
|
|
62
|
+
return (last or 0) + 1
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
async def activate_document(
|
|
66
|
+
session: AsyncSession, agent_id: int, document: dict[str, Any], created_by_id: int | None
|
|
67
|
+
) -> models.SpanMapping:
|
|
68
|
+
await retire_active(session, agent_id)
|
|
69
|
+
row = models.SpanMapping(
|
|
70
|
+
agent_id=agent_id,
|
|
71
|
+
version=await next_version(session, agent_id),
|
|
72
|
+
status=MappingStatus.ACTIVE.value,
|
|
73
|
+
mapping=document,
|
|
74
|
+
created_by_id=created_by_id,
|
|
75
|
+
activated_at=datetime.now(UTC),
|
|
76
|
+
)
|
|
77
|
+
session.add(row)
|
|
78
|
+
await session.flush()
|
|
79
|
+
return row
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class MappingStore:
|
|
83
|
+
def __init__(self, session_factory: async_sessionmaker[AsyncSession]):
|
|
84
|
+
self._sessions = session_factory
|
|
85
|
+
|
|
86
|
+
async def list(self, agent_id: int) -> list[MappingRecord]:
|
|
87
|
+
async with self._sessions() as session:
|
|
88
|
+
rows = (
|
|
89
|
+
await session.execute(
|
|
90
|
+
_with_author(
|
|
91
|
+
select(models.SpanMapping)
|
|
92
|
+
.where(models.SpanMapping.agent_id == agent_id)
|
|
93
|
+
.order_by(models.SpanMapping.version)
|
|
94
|
+
)
|
|
95
|
+
)
|
|
96
|
+
).all()
|
|
97
|
+
return [_to_record(row, author) for row, author in rows]
|
|
98
|
+
|
|
99
|
+
async def _with_status(self, agent_id: int, status: str) -> MappingRecord | None:
|
|
100
|
+
async with self._sessions() as session:
|
|
101
|
+
found = (
|
|
102
|
+
await session.execute(
|
|
103
|
+
_with_author(
|
|
104
|
+
select(models.SpanMapping).where(
|
|
105
|
+
models.SpanMapping.agent_id == agent_id,
|
|
106
|
+
models.SpanMapping.status == status,
|
|
107
|
+
)
|
|
108
|
+
)
|
|
109
|
+
)
|
|
110
|
+
).one_or_none()
|
|
111
|
+
return _to_record(found[0], found[1]) if found is not None else None
|
|
112
|
+
|
|
113
|
+
async def active(self, agent_id: int) -> MappingRecord | None:
|
|
114
|
+
return await self._with_status(agent_id, "active")
|
|
115
|
+
|
|
116
|
+
async def draft(self, agent_id: int) -> MappingRecord | None:
|
|
117
|
+
return await self._with_status(agent_id, "draft")
|
|
118
|
+
|
|
119
|
+
async def put_draft(
|
|
120
|
+
self, agent_id: int, document: dict[str, Any], created_by: str
|
|
121
|
+
) -> MappingRecord:
|
|
122
|
+
async with self._sessions() as session:
|
|
123
|
+
current = (
|
|
124
|
+
await session.execute(
|
|
125
|
+
select(models.SpanMapping).where(
|
|
126
|
+
models.SpanMapping.agent_id == agent_id,
|
|
127
|
+
models.SpanMapping.status == "draft",
|
|
128
|
+
)
|
|
129
|
+
)
|
|
130
|
+
).scalar_one_or_none()
|
|
131
|
+
if current is not None:
|
|
132
|
+
current.status = "retired"
|
|
133
|
+
await session.flush()
|
|
134
|
+
row = models.SpanMapping(
|
|
135
|
+
agent_id=agent_id,
|
|
136
|
+
version=await next_version(session, agent_id),
|
|
137
|
+
status="draft",
|
|
138
|
+
mapping=document,
|
|
139
|
+
created_by_id=await session.scalar(
|
|
140
|
+
select(models.User.id).where(models.User.username == created_by)
|
|
141
|
+
),
|
|
142
|
+
)
|
|
143
|
+
session.add(row)
|
|
144
|
+
await session.commit()
|
|
145
|
+
await session.refresh(row)
|
|
146
|
+
return _to_record(row, created_by)
|
|
147
|
+
|
|
148
|
+
async def activate(self, agent_id: int, version: int) -> MappingRecord:
|
|
149
|
+
async with self._sessions() as session:
|
|
150
|
+
row = (
|
|
151
|
+
await session.execute(
|
|
152
|
+
select(models.SpanMapping).where(
|
|
153
|
+
models.SpanMapping.agent_id == agent_id,
|
|
154
|
+
models.SpanMapping.version == version,
|
|
155
|
+
)
|
|
156
|
+
)
|
|
157
|
+
).scalar_one_or_none()
|
|
158
|
+
if row is None:
|
|
159
|
+
raise KeyError(f"no mapping version {version}")
|
|
160
|
+
await retire_active(session, agent_id, keep=row.id)
|
|
161
|
+
row.status = "active"
|
|
162
|
+
row.activated_at = datetime.now(UTC)
|
|
163
|
+
await session.commit()
|
|
164
|
+
await session.refresh(row)
|
|
165
|
+
author = await session.scalar(
|
|
166
|
+
select(models.User.username).where(models.User.id == row.created_by_id)
|
|
167
|
+
)
|
|
168
|
+
return _to_record(row, author)
|