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
evalkit/db/workspaces.py
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
from sqlalchemy import delete, select
|
|
5
|
+
from sqlalchemy.dialects.postgresql import insert
|
|
6
|
+
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
|
|
7
|
+
from sqlalchemy.orm import aliased
|
|
8
|
+
|
|
9
|
+
from evalkit.contracts.enums import WorkspaceRole
|
|
10
|
+
from evalkit.core.access import WorkspaceRef
|
|
11
|
+
from evalkit.db.models import User, Workspace, WorkspaceMember, WorkspacePromotion
|
|
12
|
+
from evalkit.db.users import NameTaken, check_name, lock_names, name_taken, user_id
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class UnknownWorkspace(KeyError):
|
|
16
|
+
def __init__(self, name: str):
|
|
17
|
+
super().__init__(f"unknown workspace: {name}")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SharedOnly(ValueError):
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class PromotionLinkError(ValueError):
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class MemberRow(BaseModel):
|
|
29
|
+
username: str
|
|
30
|
+
role: WorkspaceRole
|
|
31
|
+
granted_by: str
|
|
32
|
+
created_at: datetime
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def to_ref(
|
|
36
|
+
row: Workspace, promotes_to: int | None = None, promoted_from: int | None = None
|
|
37
|
+
) -> WorkspaceRef:
|
|
38
|
+
return WorkspaceRef(
|
|
39
|
+
row.id,
|
|
40
|
+
row.name,
|
|
41
|
+
row.owner_user_id,
|
|
42
|
+
row.archived_at is not None,
|
|
43
|
+
promotes_to=promotes_to,
|
|
44
|
+
promoted_from=promoted_from,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def workspace_row(session: AsyncSession, name: str) -> Workspace:
|
|
49
|
+
row = await session.scalar(select(Workspace).where(Workspace.name == name))
|
|
50
|
+
if row is None:
|
|
51
|
+
raise UnknownWorkspace(name)
|
|
52
|
+
return row
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
async def _links(session: AsyncSession, workspace_id: int) -> tuple[int | None, int | None]:
|
|
56
|
+
rows = (
|
|
57
|
+
await session.execute(
|
|
58
|
+
select(WorkspacePromotion.source_id, WorkspacePromotion.target_id).where(
|
|
59
|
+
(WorkspacePromotion.source_id == workspace_id)
|
|
60
|
+
| (WorkspacePromotion.target_id == workspace_id)
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
).all()
|
|
64
|
+
promotes_to = next((t for s, t in rows if s == workspace_id), None)
|
|
65
|
+
promoted_from = next((s for s, t in rows if t == workspace_id), None)
|
|
66
|
+
return promotes_to, promoted_from
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
async def load_ref(session: AsyncSession, row: Workspace) -> WorkspaceRef:
|
|
70
|
+
promotes_to, promoted_from = await _links(session, row.id)
|
|
71
|
+
return to_ref(row, promotes_to=promotes_to, promoted_from=promoted_from)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _check_link(source: WorkspaceRef, target: WorkspaceRef) -> None:
|
|
75
|
+
if source.id == target.id:
|
|
76
|
+
raise PromotionLinkError(f"{source.name} cannot promote to itself")
|
|
77
|
+
for ws in (source, target):
|
|
78
|
+
if not ws.is_shared:
|
|
79
|
+
raise PromotionLinkError(
|
|
80
|
+
f"{ws.name} is a personal workspace; promotion links shared ones"
|
|
81
|
+
)
|
|
82
|
+
if ws.archived:
|
|
83
|
+
raise PromotionLinkError(f"{ws.name} is archived")
|
|
84
|
+
if source.is_target:
|
|
85
|
+
raise PromotionLinkError(f"{source.name} is a promotion target; chains are not supported")
|
|
86
|
+
if target.promoted_from is not None and target.promoted_from != source.id:
|
|
87
|
+
raise PromotionLinkError(
|
|
88
|
+
f"{target.name} is already the promotion target of another workspace"
|
|
89
|
+
)
|
|
90
|
+
if target.promotes_to is not None:
|
|
91
|
+
raise PromotionLinkError(f"{target.name} is a promotion source; chains are not supported")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class WorkspaceStore:
|
|
95
|
+
def __init__(self, session_factory: async_sessionmaker[AsyncSession]):
|
|
96
|
+
self._sf = session_factory
|
|
97
|
+
|
|
98
|
+
async def get_by_name(self, name: str) -> WorkspaceRef:
|
|
99
|
+
async with self._sf() as s:
|
|
100
|
+
return await load_ref(s, await workspace_row(s, name))
|
|
101
|
+
|
|
102
|
+
async def get_by_id(self, workspace_id: int) -> WorkspaceRef:
|
|
103
|
+
async with self._sf() as s:
|
|
104
|
+
row = await s.get(Workspace, workspace_id)
|
|
105
|
+
if row is None:
|
|
106
|
+
raise UnknownWorkspace(str(workspace_id))
|
|
107
|
+
return await load_ref(s, row)
|
|
108
|
+
|
|
109
|
+
async def set_promotes_to(self, source: str, target: str | None) -> WorkspaceRef:
|
|
110
|
+
async with self._sf() as s:
|
|
111
|
+
await lock_names(s)
|
|
112
|
+
row = await workspace_row(s, source)
|
|
113
|
+
await s.execute(
|
|
114
|
+
delete(WorkspacePromotion).where(WorkspacePromotion.source_id == row.id)
|
|
115
|
+
)
|
|
116
|
+
if target is not None:
|
|
117
|
+
source_ref = to_ref(row, promoted_from=(await _links(s, row.id))[1])
|
|
118
|
+
target_ref = await load_ref(s, await workspace_row(s, target))
|
|
119
|
+
_check_link(source_ref, target_ref)
|
|
120
|
+
s.add(WorkspacePromotion(source_id=row.id, target_id=target_ref.id))
|
|
121
|
+
await s.commit()
|
|
122
|
+
return await load_ref(s, row)
|
|
123
|
+
|
|
124
|
+
async def personal_of(self, username: str) -> WorkspaceRef:
|
|
125
|
+
async with self._sf() as s:
|
|
126
|
+
row = await s.scalar(
|
|
127
|
+
select(Workspace)
|
|
128
|
+
.join(User, User.id == Workspace.owner_user_id)
|
|
129
|
+
.where(User.username == username, Workspace.name == username)
|
|
130
|
+
)
|
|
131
|
+
if row is None:
|
|
132
|
+
raise UnknownWorkspace(username)
|
|
133
|
+
return to_ref(row)
|
|
134
|
+
|
|
135
|
+
async def create_shared(self, name: str, actor_id: int | None) -> WorkspaceRef:
|
|
136
|
+
check_name(name)
|
|
137
|
+
async with self._sf() as s:
|
|
138
|
+
await lock_names(s)
|
|
139
|
+
if await name_taken(s, name):
|
|
140
|
+
raise NameTaken(name)
|
|
141
|
+
row = Workspace(name=name)
|
|
142
|
+
s.add(row)
|
|
143
|
+
await s.commit()
|
|
144
|
+
return to_ref(row)
|
|
145
|
+
|
|
146
|
+
async def rename(self, name: str, new_name: str) -> WorkspaceRef:
|
|
147
|
+
check_name(new_name)
|
|
148
|
+
async with self._sf() as s:
|
|
149
|
+
await lock_names(s)
|
|
150
|
+
row = await workspace_row(s, name)
|
|
151
|
+
if row.owner_user_id is not None:
|
|
152
|
+
raise SharedOnly("personal workspaces keep their owner's name")
|
|
153
|
+
if await name_taken(s, new_name):
|
|
154
|
+
raise NameTaken(new_name)
|
|
155
|
+
row.name = new_name
|
|
156
|
+
await s.commit()
|
|
157
|
+
return to_ref(row)
|
|
158
|
+
|
|
159
|
+
async def set_archived(self, name: str, archived_at: datetime | None) -> WorkspaceRef:
|
|
160
|
+
async with self._sf() as s:
|
|
161
|
+
row = await workspace_row(s, name)
|
|
162
|
+
row.archived_at = archived_at
|
|
163
|
+
await s.commit()
|
|
164
|
+
return to_ref(row)
|
|
165
|
+
|
|
166
|
+
async def add_member(
|
|
167
|
+
self, ws: str, username: str, role: WorkspaceRole, granted_by: int
|
|
168
|
+
) -> None:
|
|
169
|
+
async with self._sf() as s:
|
|
170
|
+
row = await workspace_row(s, ws)
|
|
171
|
+
if row.owner_user_id is not None:
|
|
172
|
+
raise SharedOnly("roles apply to shared workspaces only")
|
|
173
|
+
uid = await user_id(s, username)
|
|
174
|
+
await s.execute(
|
|
175
|
+
insert(WorkspaceMember)
|
|
176
|
+
.values(workspace_id=row.id, user_id=uid, role=role.value, granted_by=granted_by)
|
|
177
|
+
.on_conflict_do_nothing()
|
|
178
|
+
)
|
|
179
|
+
await s.commit()
|
|
180
|
+
|
|
181
|
+
async def remove_member(self, ws: str, username: str, role: WorkspaceRole) -> bool:
|
|
182
|
+
async with self._sf() as s:
|
|
183
|
+
row = await workspace_row(s, ws)
|
|
184
|
+
uid = await user_id(s, username)
|
|
185
|
+
result = await s.execute(
|
|
186
|
+
delete(WorkspaceMember).where(
|
|
187
|
+
WorkspaceMember.workspace_id == row.id,
|
|
188
|
+
WorkspaceMember.user_id == uid,
|
|
189
|
+
WorkspaceMember.role == role.value,
|
|
190
|
+
)
|
|
191
|
+
)
|
|
192
|
+
await s.commit()
|
|
193
|
+
return bool(getattr(result, "rowcount", 0))
|
|
194
|
+
|
|
195
|
+
async def members(self, ws: str, role: WorkspaceRole | None = None) -> list[MemberRow]:
|
|
196
|
+
member, granter = aliased(User), aliased(User)
|
|
197
|
+
async with self._sf() as s:
|
|
198
|
+
row = await workspace_row(s, ws)
|
|
199
|
+
query = (
|
|
200
|
+
select(
|
|
201
|
+
member.username,
|
|
202
|
+
WorkspaceMember.role,
|
|
203
|
+
granter.username,
|
|
204
|
+
WorkspaceMember.created_at,
|
|
205
|
+
)
|
|
206
|
+
.join(member, member.id == WorkspaceMember.user_id)
|
|
207
|
+
.join(granter, granter.id == WorkspaceMember.granted_by)
|
|
208
|
+
.where(WorkspaceMember.workspace_id == row.id)
|
|
209
|
+
.order_by(member.username, WorkspaceMember.role)
|
|
210
|
+
)
|
|
211
|
+
if role is not None:
|
|
212
|
+
query = query.where(WorkspaceMember.role == role.value)
|
|
213
|
+
return [
|
|
214
|
+
MemberRow(username=u, role=WorkspaceRole(r), granted_by=g, created_at=c)
|
|
215
|
+
for u, r, g, c in (await s.execute(query)).all()
|
|
216
|
+
]
|
|
217
|
+
|
|
218
|
+
async def list(self, include_archived: bool = False) -> list[WorkspaceRef]:
|
|
219
|
+
query = select(Workspace).order_by(Workspace.name)
|
|
220
|
+
if not include_archived:
|
|
221
|
+
query = query.where(Workspace.archived_at.is_(None))
|
|
222
|
+
async with self._sf() as s:
|
|
223
|
+
rows = (await s.scalars(query)).all()
|
|
224
|
+
links = (
|
|
225
|
+
await s.execute(select(WorkspacePromotion.source_id, WorkspacePromotion.target_id))
|
|
226
|
+
).all()
|
|
227
|
+
targets = {source: target for source, target in links}
|
|
228
|
+
sources = {target: source for source, target in links}
|
|
229
|
+
return [
|
|
230
|
+
to_ref(row, promotes_to=targets.get(row.id), promoted_from=sources.get(row.id))
|
|
231
|
+
for row in rows
|
|
232
|
+
]
|
evalkit/paths.py
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
_PACKAGE = Path(__file__).resolve().parent
|
|
4
|
+
_REPO = _PACKAGE.parents[1]
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _bundled(name: str) -> Path:
|
|
8
|
+
repo = _REPO / name
|
|
9
|
+
if repo.is_dir():
|
|
10
|
+
return repo
|
|
11
|
+
return _PACKAGE / "bundled" / name
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def skills_root() -> Path:
|
|
15
|
+
return _bundled("skills")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def contracts_root() -> Path:
|
|
19
|
+
return _bundled("contracts")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def docs_root() -> Path:
|
|
23
|
+
repo = _REPO / "docs" / "user"
|
|
24
|
+
if repo.is_dir():
|
|
25
|
+
return repo
|
|
26
|
+
return _PACKAGE / "bundled" / "docs"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def ui_root() -> Path:
|
|
30
|
+
repo = _REPO / "ui" / "dist"
|
|
31
|
+
if repo.is_dir():
|
|
32
|
+
return repo
|
|
33
|
+
return _PACKAGE / "bundled" / "ui"
|
evalkit/sdk/__init__.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from evalkit.contracts.settings import JudgeSettings as Judge
|
|
2
|
+
from evalkit.sdk import tracing
|
|
3
|
+
from evalkit.sdk.binding import Fixture
|
|
4
|
+
from evalkit.sdk.evaluators import evaluator
|
|
5
|
+
from evalkit.sdk.runner import (
|
|
6
|
+
ExperimentResult,
|
|
7
|
+
RunResult,
|
|
8
|
+
RunSummary,
|
|
9
|
+
aevaluate_experiment,
|
|
10
|
+
arun_experiment,
|
|
11
|
+
run_experiment,
|
|
12
|
+
)
|
|
13
|
+
from evalkit.sdk.runner import (
|
|
14
|
+
evaluate_experiment_sync as evaluate_experiment,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"ExperimentResult",
|
|
19
|
+
"Fixture",
|
|
20
|
+
"Judge",
|
|
21
|
+
"RunResult",
|
|
22
|
+
"RunSummary",
|
|
23
|
+
"aevaluate_experiment",
|
|
24
|
+
"arun_experiment",
|
|
25
|
+
"evaluate_experiment",
|
|
26
|
+
"evaluator",
|
|
27
|
+
"run_experiment",
|
|
28
|
+
"tracing",
|
|
29
|
+
]
|
evalkit/sdk/binding.py
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import inspect
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from pydantic import BaseModel
|
|
11
|
+
|
|
12
|
+
ALLOWED = ("input", "files", "model", "metadata")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Fixture(BaseModel):
|
|
16
|
+
"""A case's fixture file, downloaded before the task is called.
|
|
17
|
+
|
|
18
|
+
Attributes:
|
|
19
|
+
name: The fixture key the case names.
|
|
20
|
+
path: Where the file sits on this machine.
|
|
21
|
+
context: The file's description from the fixture registry, or `None`.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
name: str
|
|
25
|
+
path: Path
|
|
26
|
+
context: str | None = None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass(frozen=True)
|
|
30
|
+
class TaskSpec:
|
|
31
|
+
params: tuple[str, ...]
|
|
32
|
+
shortcut: bool
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def inspect_task(task: Callable[..., Any]) -> TaskSpec:
|
|
36
|
+
parameters = inspect.signature(task).parameters
|
|
37
|
+
bindable = (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY)
|
|
38
|
+
names = [p.name for p in parameters.values() if p.kind in bindable]
|
|
39
|
+
if len(parameters) == 1 and names:
|
|
40
|
+
return TaskSpec(params=(names[0],), shortcut=names[0] not in ALLOWED)
|
|
41
|
+
required = [p.name for p in parameters.values() if p.default is p.empty and p.kind in bindable]
|
|
42
|
+
unknown = [name for name in required if name not in ALLOWED]
|
|
43
|
+
if unknown:
|
|
44
|
+
raise TypeError(
|
|
45
|
+
f"task parameter(s) not supported: {', '.join(unknown)}; allowed: {', '.join(ALLOWED)}"
|
|
46
|
+
)
|
|
47
|
+
return TaskSpec(params=tuple(name for name in names if name in ALLOWED), shortcut=False)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def arguments(
|
|
51
|
+
spec: TaskSpec, *, input: dict, files: list[Fixture], model: str | None, metadata: dict
|
|
52
|
+
) -> tuple[list[Any], dict[str, Any]]:
|
|
53
|
+
if spec.shortcut:
|
|
54
|
+
return [input], {}
|
|
55
|
+
values = {"input": input, "files": files, "model": model, "metadata": metadata}
|
|
56
|
+
return [], {name: values[name] for name in spec.params}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
async def call_task(task: Callable[..., Any], args: list[Any], kwargs: dict[str, Any]) -> Any:
|
|
60
|
+
if inspect.iscoroutinefunction(task):
|
|
61
|
+
return await task(*args, **kwargs)
|
|
62
|
+
result = await asyncio.to_thread(task, *args, **kwargs)
|
|
63
|
+
if inspect.isawaitable(result):
|
|
64
|
+
return await result
|
|
65
|
+
return result
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def ignores_model(spec: TaskSpec) -> bool:
|
|
69
|
+
return spec.shortcut or "model" not in spec.params
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import Any, Literal, overload
|
|
5
|
+
|
|
6
|
+
from evalkit.core.python_eval import PythonEvaluator
|
|
7
|
+
|
|
8
|
+
Kind = Literal["evaluator", "gauge"]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@overload
|
|
12
|
+
def evaluator(fn: Callable[..., Any], /) -> PythonEvaluator: ...
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@overload
|
|
16
|
+
def evaluator(
|
|
17
|
+
*, name: str | None = None, kind: Kind = "evaluator", requires_trajectory: bool = False
|
|
18
|
+
) -> Callable[[Callable[..., Any]], PythonEvaluator]: ...
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def evaluator(
|
|
22
|
+
fn: Callable[..., Any] | None = None,
|
|
23
|
+
/,
|
|
24
|
+
*,
|
|
25
|
+
name: str | None = None,
|
|
26
|
+
kind: Kind = "evaluator",
|
|
27
|
+
requires_trajectory: bool = False,
|
|
28
|
+
) -> PythonEvaluator | Callable[[Callable[..., Any]], PythonEvaluator]:
|
|
29
|
+
"""Turn a function into a Python evaluator for `run_experiment`.
|
|
30
|
+
|
|
31
|
+
Use it bare (`@evaluator`) or with options (`@evaluator(name=...)`). The function
|
|
32
|
+
receives the same `EvalCase` and `EvalRun` the Custom Evaluator API sends: the
|
|
33
|
+
case id, input, expected block and this evaluator's config from the case YAML
|
|
34
|
+
(`case.config`); the answer, structured output and ATIF trajectory as a dict.
|
|
35
|
+
It returns a float, a `ScoreItem`, or a list of them.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
fn: The function, when used bare.
|
|
39
|
+
name: The name cases use under `evaluators.custom`. Defaults to the
|
|
40
|
+
function's name.
|
|
41
|
+
kind: `evaluator` for a score, `gauge` for a measurement.
|
|
42
|
+
requires_trajectory: Skip runs that have no trajectory.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
The evaluator, or a decorator that makes one.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def wrap(function: Callable[..., Any]) -> PythonEvaluator:
|
|
49
|
+
return PythonEvaluator(
|
|
50
|
+
name=name or function.__name__,
|
|
51
|
+
kind=kind,
|
|
52
|
+
fn=function,
|
|
53
|
+
requires_trajectory=requires_trajectory,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
return wrap(fn) if fn is not None else wrap
|