provekit 0.1.0__tar.gz → 0.5.0__tar.gz
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.
- provekit-0.5.0/PKG-INFO +117 -0
- provekit-0.5.0/README.md +49 -0
- provekit-0.5.0/provekit/__init__.py +18 -0
- provekit-0.5.0/provekit/auto.py +11 -0
- provekit-0.5.0/provekit/config.py +68 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit/database.py +0 -26
- provekit-0.5.0/provekit/eval.py +74 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit/main.py +14 -28
- provekit-0.5.0/provekit/mcp.py +83 -0
- provekit-0.5.0/provekit/migrations/versions/9d2c06bfa4e6_baseline.py +121 -0
- provekit-0.5.0/provekit/migrations/versions/a1b2c3d4e5f6_feedback_sessions.py +49 -0
- provekit-0.5.0/provekit/migrations/versions/b2c3d4e5f6a7_datasets.py +54 -0
- provekit-0.5.0/provekit/migrations/versions/c3d4e5f6a7b8_experiments.py +59 -0
- provekit-0.5.0/provekit/migrations/versions/d4e5f6a7b8c9_alerts.py +40 -0
- provekit-0.5.0/provekit/migrations/versions/e5f6a7b8c9d0_admin.py +30 -0
- provekit-0.5.0/provekit/models.py +188 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit/observability.py +2 -2
- provekit-0.5.0/provekit/routers/admin.py +82 -0
- provekit-0.5.0/provekit/routers/alerts.py +124 -0
- provekit-0.5.0/provekit/routers/apikeys.py +57 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit/routers/auth.py +3 -1
- provekit-0.5.0/provekit/routers/datasets.py +151 -0
- provekit-0.5.0/provekit/routers/experiments.py +141 -0
- provekit-0.5.0/provekit/routers/metrics.py +143 -0
- provekit-0.5.0/provekit/routers/projects.py +140 -0
- provekit-0.5.0/provekit/routers/traces.py +275 -0
- provekit-0.5.0/provekit/scorers.py +63 -0
- provekit-0.5.0/provekit/services/apikey.py +38 -0
- provekit-0.5.0/provekit/services/deploy.py +20 -0
- provekit-0.5.0/provekit/services/limits.py +73 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit/services/otel.py +53 -16
- provekit-0.5.0/provekit/services/redact.py +48 -0
- provekit-0.5.0/provekit/services/sealing.py +49 -0
- provekit-0.5.0/provekit/services/share.py +54 -0
- provekit-0.5.0/provekit/services/workspace.py +61 -0
- provekit-0.5.0/provekit/trace.py +356 -0
- provekit-0.5.0/provekit.egg-info/PKG-INFO +117 -0
- provekit-0.5.0/provekit.egg-info/SOURCES.txt +75 -0
- provekit-0.5.0/provekit.egg-info/entry_points.txt +2 -0
- provekit-0.5.0/provekit.egg-info/requires.txt +52 -0
- provekit-0.5.0/pyproject.toml +149 -0
- provekit-0.5.0/tests/test_admin.py +72 -0
- provekit-0.5.0/tests/test_alerts.py +55 -0
- provekit-0.5.0/tests/test_apikeys.py +59 -0
- {provekit-0.1.0 → provekit-0.5.0}/tests/test_auth.py +4 -2
- provekit-0.5.0/tests/test_autoinstrument.py +64 -0
- {provekit-0.1.0 → provekit-0.5.0}/tests/test_cov_limits_auth.py +13 -30
- provekit-0.5.0/tests/test_coverage_extra.py +295 -0
- provekit-0.5.0/tests/test_datasets.py +65 -0
- provekit-0.5.0/tests/test_eval.py +73 -0
- provekit-0.5.0/tests/test_experiments.py +51 -0
- provekit-0.5.0/tests/test_feedback.py +65 -0
- provekit-0.5.0/tests/test_hardening.py +49 -0
- provekit-0.5.0/tests/test_key_read_api.py +81 -0
- provekit-0.5.0/tests/test_mcp.py +61 -0
- provekit-0.5.0/tests/test_metrics.py +74 -0
- provekit-0.5.0/tests/test_netguard.py +34 -0
- {provekit-0.1.0 → provekit-0.5.0}/tests/test_otel.py +20 -5
- provekit-0.5.0/tests/test_projects.py +79 -0
- provekit-0.5.0/tests/test_redact.py +56 -0
- provekit-0.5.0/tests/test_scorers.py +32 -0
- provekit-0.5.0/tests/test_share.py +58 -0
- provekit-0.5.0/tests/test_trace_sdk.py +254 -0
- provekit-0.5.0/tests/test_traces_tree.py +40 -0
- provekit-0.1.0/PKG-INFO +0 -86
- provekit-0.1.0/README.md +0 -47
- provekit-0.1.0/provekit/cli.py +0 -256
- provekit-0.1.0/provekit/config.py +0 -77
- provekit-0.1.0/provekit/migrations/versions/323eb73d463c_user_email_verified.py +0 -32
- provekit-0.1.0/provekit/migrations/versions/49e8ab812556_baseline_schema.py +0 -241
- provekit-0.1.0/provekit/migrations/versions/819ed5ff183e_workspace_ingest_key.py +0 -35
- provekit-0.1.0/provekit/migrations/versions/a1b2c3d4e5f6_user_token_version.py +0 -27
- provekit-0.1.0/provekit/models.py +0 -191
- provekit-0.1.0/provekit/routers/connections.py +0 -270
- provekit-0.1.0/provekit/routers/deployments.py +0 -161
- provekit-0.1.0/provekit/routers/flows.py +0 -188
- provekit-0.1.0/provekit/routers/library.py +0 -265
- provekit-0.1.0/provekit/routers/prompts.py +0 -72
- provekit-0.1.0/provekit/routers/run.py +0 -203
- provekit-0.1.0/provekit/routers/runtime.py +0 -103
- provekit-0.1.0/provekit/routers/traces.py +0 -65
- provekit-0.1.0/provekit/routers/usage.py +0 -42
- provekit-0.1.0/provekit/services/__init__.py +0 -0
- provekit-0.1.0/provekit/services/assertions.py +0 -135
- provekit-0.1.0/provekit/services/deploy.py +0 -63
- provekit-0.1.0/provekit/services/dispatch.py +0 -313
- provekit-0.1.0/provekit/services/flow.py +0 -299
- provekit-0.1.0/provekit/services/limits.py +0 -109
- provekit-0.1.0/provekit/services/masking.py +0 -45
- provekit-0.1.0/provekit/services/promptfoo.py +0 -92
- provekit-0.1.0/provekit/services/providers/__init__.py +0 -0
- provekit-0.1.0/provekit/services/providers/a2a_client.py +0 -110
- provekit-0.1.0/provekit/services/providers/agent_http.py +0 -55
- provekit-0.1.0/provekit/services/providers/llm.py +0 -364
- provekit-0.1.0/provekit/services/providers/mcp_client.py +0 -289
- provekit-0.1.0/provekit/services/runstore.py +0 -93
- provekit-0.1.0/provekit/services/sealing.py +0 -106
- provekit-0.1.0/provekit/services/templates.py +0 -69
- provekit-0.1.0/provekit/services/testfile.py +0 -122
- provekit-0.1.0/provekit/services/tooling.py +0 -194
- provekit-0.1.0/provekit/services/workspace.py +0 -91
- provekit-0.1.0/provekit/templates/flows/_manifest.json +0 -2594
- provekit-0.1.0/provekit/templates/flows/banking-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/banking-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/banking-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/banking-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/banking-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/banking-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/banking-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/banking-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/banking-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/banking-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/banking-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/banking-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/banking-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/banking-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/banking-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/banking-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/banking-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/banking-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/community-forum-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/community-forum-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/community-forum-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/community-forum-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/community-forum-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/community-forum-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/community-forum-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/community-forum-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/community-forum-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/community-forum-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/community-forum-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/community-forum-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/community-forum-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/community-forum-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/community-forum-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/community-forum-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/community-forum-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/community-forum-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/content-moderation-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/content-moderation-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/content-moderation-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/content-moderation-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/content-moderation-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/content-moderation-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/content-moderation-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/content-moderation-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/content-moderation-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/content-moderation-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/content-moderation-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/content-moderation-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/content-moderation-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/content-moderation-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/content-moderation-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/content-moderation-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/content-moderation-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/content-moderation-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/customer-support-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/customer-support-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/customer-support-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/customer-support-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/customer-support-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/customer-support-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/customer-support-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/customer-support-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/customer-support-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/customer-support-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/customer-support-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/customer-support-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/customer-support-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/customer-support-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/customer-support-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/customer-support-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/customer-support-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/customer-support-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/developer-tooling-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/developer-tooling-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/developer-tooling-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/developer-tooling-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/developer-tooling-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/developer-tooling-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/developer-tooling-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/developer-tooling-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/developer-tooling-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/developer-tooling-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/developer-tooling-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/developer-tooling-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/developer-tooling-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/developer-tooling-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/developer-tooling-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/developer-tooling-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/developer-tooling-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/developer-tooling-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/devrel-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/devrel-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/devrel-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/devrel-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/devrel-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/devrel-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/devrel-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/devrel-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/devrel-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/devrel-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/devrel-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/devrel-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/devrel-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/devrel-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/devrel-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/devrel-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/devrel-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/devrel-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/e-commerce-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/e-commerce-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/e-commerce-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/e-commerce-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/e-commerce-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/e-commerce-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/e-commerce-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/e-commerce-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/e-commerce-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/e-commerce-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/e-commerce-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/e-commerce-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/e-commerce-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/e-commerce-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/e-commerce-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/e-commerce-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/e-commerce-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/e-commerce-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/education-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/education-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/education-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/education-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/education-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/education-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/education-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/education-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/education-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/education-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/education-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/education-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/education-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/education-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/education-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/education-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/education-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/education-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/finance-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/finance-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/finance-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/finance-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/finance-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/finance-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/finance-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/finance-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/finance-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/finance-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/finance-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/finance-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/finance-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/finance-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/finance-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/finance-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/finance-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/finance-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/food-delivery-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/food-delivery-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/food-delivery-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/food-delivery-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/food-delivery-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/food-delivery-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/food-delivery-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/food-delivery-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/food-delivery-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/food-delivery-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/food-delivery-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/food-delivery-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/food-delivery-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/food-delivery-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/food-delivery-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/food-delivery-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/food-delivery-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/food-delivery-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/gaming-support-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/gaming-support-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/gaming-support-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/gaming-support-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/gaming-support-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/gaming-support-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/gaming-support-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/gaming-support-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/gaming-support-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/gaming-support-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/gaming-support-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/gaming-support-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/gaming-support-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/gaming-support-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/gaming-support-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/gaming-support-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/gaming-support-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/gaming-support-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/healthcare-intake-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/hr-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/hr-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/hr-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/hr-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/hr-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/hr-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/hr-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/hr-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/hr-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/hr-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/hr-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/hr-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/hr-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/hr-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/hr-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/hr-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/hr-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/hr-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/insurance-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/insurance-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/insurance-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/insurance-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/insurance-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/insurance-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/insurance-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/insurance-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/insurance-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/insurance-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/insurance-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/insurance-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/insurance-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/insurance-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/insurance-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/insurance-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/insurance-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/insurance-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/it-helpdesk-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/legal-intake-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/legal-intake-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/legal-intake-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/legal-intake-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/legal-intake-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/legal-intake-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/legal-intake-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/legal-intake-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/legal-intake-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/legal-intake-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/legal-intake-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/legal-intake-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/legal-intake-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/legal-intake-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/legal-intake-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/legal-intake-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/legal-intake-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/legal-intake-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/logistics-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/logistics-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/logistics-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/logistics-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/logistics-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/logistics-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/logistics-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/logistics-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/logistics-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/logistics-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/logistics-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/logistics-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/logistics-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/logistics-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/logistics-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/logistics-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/logistics-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/logistics-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/marketing-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/marketing-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/marketing-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/marketing-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/marketing-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/marketing-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/marketing-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/marketing-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/marketing-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/marketing-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/marketing-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/marketing-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/marketing-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/marketing-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/marketing-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/marketing-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/marketing-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/marketing-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/nonprofit-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/nonprofit-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/nonprofit-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/nonprofit-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/nonprofit-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/nonprofit-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/nonprofit-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/nonprofit-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/nonprofit-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/nonprofit-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/nonprofit-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/nonprofit-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/nonprofit-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/nonprofit-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/nonprofit-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/nonprofit-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/nonprofit-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/nonprofit-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/real-estate-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/real-estate-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/real-estate-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/real-estate-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/real-estate-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/real-estate-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/real-estate-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/real-estate-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/real-estate-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/real-estate-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/real-estate-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/real-estate-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/real-estate-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/real-estate-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/real-estate-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/real-estate-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/real-estate-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/real-estate-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/recruiting-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/recruiting-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/recruiting-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/recruiting-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/recruiting-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/recruiting-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/recruiting-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/recruiting-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/recruiting-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/recruiting-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/recruiting-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/recruiting-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/recruiting-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/recruiting-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/recruiting-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/recruiting-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/recruiting-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/recruiting-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/research-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/research-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/research-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/research-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/research-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/research-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/research-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/research-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/research-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/research-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/research-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/research-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/research-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/research-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/research-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/research-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/research-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/research-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/sales-lead-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/sales-lead-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/sales-lead-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/sales-lead-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/sales-lead-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/sales-lead-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/sales-lead-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/sales-lead-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/sales-lead-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/sales-lead-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/sales-lead-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/sales-lead-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/sales-lead-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/sales-lead-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/sales-lead-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/sales-lead-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/sales-lead-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/sales-lead-triage-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/travel-action-items.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/travel-answer.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/travel-classify-intent.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/travel-draft-critique-revise.yaml +0 -75
- provekit-0.1.0/provekit/templates/flows/travel-extract-to-json.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/travel-faq-match-answer.yaml +0 -60
- provekit-0.1.0/provekit/templates/flows/travel-keyword-extract.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/travel-language-route.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/travel-moderation-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/travel-redact-summarize.yaml +0 -59
- provekit-0.1.0/provekit/templates/flows/travel-score-gate.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/travel-sentiment-route.yaml +0 -73
- provekit-0.1.0/provekit/templates/flows/travel-severity-tiers.yaml +0 -103
- provekit-0.1.0/provekit/templates/flows/travel-summarize-then-decide.yaml +0 -88
- provekit-0.1.0/provekit/templates/flows/travel-tag-enrich.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/travel-tone-rewrite.yaml +0 -43
- provekit-0.1.0/provekit/templates/flows/travel-translate-reply.yaml +0 -58
- provekit-0.1.0/provekit/templates/flows/travel-triage-route.yaml +0 -73
- provekit-0.1.0/provekit.egg-info/PKG-INFO +0 -86
- provekit-0.1.0/provekit.egg-info/SOURCES.txt +0 -516
- provekit-0.1.0/provekit.egg-info/entry_points.txt +0 -2
- provekit-0.1.0/provekit.egg-info/requires.txt +0 -18
- provekit-0.1.0/pyproject.toml +0 -89
- provekit-0.1.0/tests/test_a2a.py +0 -81
- provekit-0.1.0/tests/test_cli.py +0 -142
- provekit-0.1.0/tests/test_connection_secrets.py +0 -108
- provekit-0.1.0/tests/test_cov_assertions.py +0 -554
- provekit-0.1.0/tests/test_cov_dispatch.py +0 -573
- provekit-0.1.0/tests/test_cov_flow.py +0 -606
- provekit-0.1.0/tests/test_cov_infra.py +0 -1164
- provekit-0.1.0/tests/test_cov_library_run.py +0 -477
- provekit-0.1.0/tests/test_cov_llm_mcp.py +0 -660
- provekit-0.1.0/tests/test_cov_routers.py +0 -887
- provekit-0.1.0/tests/test_deployments.py +0 -156
- provekit-0.1.0/tests/test_hardening_extra.py +0 -70
- provekit-0.1.0/tests/test_import_export.py +0 -68
- provekit-0.1.0/tests/test_limits.py +0 -78
- provekit-0.1.0/tests/test_llm_providers.py +0 -174
- provekit-0.1.0/tests/test_mcp_client.py +0 -141
- provekit-0.1.0/tests/test_runstore.py +0 -64
- provekit-0.1.0/tests/test_templates.py +0 -66
- provekit-0.1.0/tests/test_tenancy.py +0 -65
- provekit-0.1.0/tests/test_testfile.py +0 -68
- provekit-0.1.0/tests/test_tooling.py +0 -520
- provekit-0.1.0/tests/test_usage.py +0 -27
- {provekit-0.1.0 → provekit-0.5.0}/provekit/migrations/env.py +0 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit/migrations/script.py.mako +0 -0
- {provekit-0.1.0/provekit → provekit-0.5.0/provekit/routers}/__init__.py +0 -0
- {provekit-0.1.0/provekit/routers → provekit-0.5.0/provekit/services}/__init__.py +0 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit/services/auth.py +0 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit/services/email.py +0 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit/services/netguard.py +0 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit.egg-info/dependency_links.txt +0 -0
- {provekit-0.1.0 → provekit-0.5.0}/provekit.egg-info/top_level.txt +0 -0
- {provekit-0.1.0 → provekit-0.5.0}/setup.cfg +0 -0
- {provekit-0.1.0 → provekit-0.5.0}/tests/test_account_recovery.py +0 -0
- {provekit-0.1.0 → provekit-0.5.0}/tests/test_auth_hardening.py +0 -0
- {provekit-0.1.0 → provekit-0.5.0}/tests/test_observability.py +0 -0
provekit-0.5.0/PKG-INFO
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: provekit
|
|
3
|
+
Version: 0.5.0
|
|
4
|
+
Summary: Drop-in agent tracing — add one decorator, get a project key, review every run your agent makes.
|
|
5
|
+
Author: ProveKit contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/MobirizerServices/ProveKit
|
|
8
|
+
Project-URL: Repository, https://github.com/MobirizerServices/ProveKit
|
|
9
|
+
Project-URL: Issues, https://github.com/MobirizerServices/ProveKit/issues
|
|
10
|
+
Keywords: agent,llm,tracing,observability,opentelemetry,openai,anthropic,otel
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: System :: Monitoring
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
Requires-Dist: httpx<1,>=0.28
|
|
23
|
+
Provides-Extra: server
|
|
24
|
+
Requires-Dist: fastapi<1,>=0.115; extra == "server"
|
|
25
|
+
Requires-Dist: uvicorn[standard]<1,>=0.34; extra == "server"
|
|
26
|
+
Requires-Dist: sqlalchemy<3,>=2.0; extra == "server"
|
|
27
|
+
Requires-Dist: pydantic<3,>=2.10; extra == "server"
|
|
28
|
+
Requires-Dist: pydantic-settings<3,>=2.7; extra == "server"
|
|
29
|
+
Requires-Dist: cryptography<50,>=42; extra == "server"
|
|
30
|
+
Requires-Dist: anyio<5,>=4; extra == "server"
|
|
31
|
+
Requires-Dist: alembic<2,>=1.18; extra == "server"
|
|
32
|
+
Requires-Dist: psycopg[binary]<4,>=3.3; extra == "server"
|
|
33
|
+
Requires-Dist: email-validator<3,>=2.2; extra == "server"
|
|
34
|
+
Requires-Dist: redis<6,>=5.2; extra == "server"
|
|
35
|
+
Requires-Dist: sentry-sdk[fastapi]<3,>=2.20; extra == "server"
|
|
36
|
+
Provides-Extra: trace
|
|
37
|
+
Requires-Dist: opentelemetry-api<2,>=1.20; extra == "trace"
|
|
38
|
+
Requires-Dist: opentelemetry-sdk<2,>=1.20; extra == "trace"
|
|
39
|
+
Requires-Dist: openinference-instrumentation-openai>=0.1; extra == "trace"
|
|
40
|
+
Requires-Dist: openinference-instrumentation-anthropic>=0.1; extra == "trace"
|
|
41
|
+
Provides-Extra: http
|
|
42
|
+
Requires-Dist: opentelemetry-instrumentation-httpx>=0.40b0; extra == "http"
|
|
43
|
+
Requires-Dist: opentelemetry-instrumentation-requests>=0.40b0; extra == "http"
|
|
44
|
+
Requires-Dist: opentelemetry-instrumentation-urllib>=0.40b0; extra == "http"
|
|
45
|
+
Provides-Extra: trace-all
|
|
46
|
+
Requires-Dist: opentelemetry-api<2,>=1.20; extra == "trace-all"
|
|
47
|
+
Requires-Dist: opentelemetry-sdk<2,>=1.20; extra == "trace-all"
|
|
48
|
+
Requires-Dist: openinference-instrumentation-openai>=0.1; extra == "trace-all"
|
|
49
|
+
Requires-Dist: openinference-instrumentation-anthropic>=0.1; extra == "trace-all"
|
|
50
|
+
Requires-Dist: openinference-instrumentation-langchain>=0.1; extra == "trace-all"
|
|
51
|
+
Requires-Dist: openinference-instrumentation-llama-index>=0.1; extra == "trace-all"
|
|
52
|
+
Requires-Dist: openinference-instrumentation-crewai>=0.1; extra == "trace-all"
|
|
53
|
+
Requires-Dist: openinference-instrumentation-bedrock>=0.1; extra == "trace-all"
|
|
54
|
+
Requires-Dist: openinference-instrumentation-litellm>=0.1; extra == "trace-all"
|
|
55
|
+
Requires-Dist: openinference-instrumentation-groq>=0.1; extra == "trace-all"
|
|
56
|
+
Requires-Dist: openinference-instrumentation-mistralai>=0.1; extra == "trace-all"
|
|
57
|
+
Requires-Dist: openinference-instrumentation-dspy>=0.1; extra == "trace-all"
|
|
58
|
+
Requires-Dist: openinference-instrumentation-haystack>=0.1; extra == "trace-all"
|
|
59
|
+
Requires-Dist: opentelemetry-instrumentation-httpx>=0.40b0; extra == "trace-all"
|
|
60
|
+
Requires-Dist: opentelemetry-instrumentation-requests>=0.40b0; extra == "trace-all"
|
|
61
|
+
Requires-Dist: opentelemetry-instrumentation-urllib>=0.40b0; extra == "trace-all"
|
|
62
|
+
Provides-Extra: mcp
|
|
63
|
+
Requires-Dist: mcp>=1.2; extra == "mcp"
|
|
64
|
+
Provides-Extra: dev
|
|
65
|
+
Requires-Dist: pytest==9.1.1; extra == "dev"
|
|
66
|
+
Requires-Dist: pytest-cov==6.0.0; extra == "dev"
|
|
67
|
+
Requires-Dist: ruff==0.9.2; extra == "dev"
|
|
68
|
+
|
|
69
|
+
# ProveKit
|
|
70
|
+
|
|
71
|
+
**One decorator. The whole agent flow.** Add one `@pk.trace` at your agent's entrypoint and
|
|
72
|
+
review every run — the model calls, tools, and steps — as a nested flow in your ProveKit
|
|
73
|
+
portal. OpenAI/Anthropic calls capture themselves. Open source, self-hostable, no framework
|
|
74
|
+
lock-in.
|
|
75
|
+
|
|
76
|
+
## Install
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pip install "provekit[trace]"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Use
|
|
83
|
+
|
|
84
|
+
```python
|
|
85
|
+
import provekit.trace as pk
|
|
86
|
+
|
|
87
|
+
# .env
|
|
88
|
+
# PROVEKIT_API_KEY=pk_... (create a project + key in the portal)
|
|
89
|
+
# PROVEKIT_ENDPOINT=https://your-provekit-host
|
|
90
|
+
|
|
91
|
+
@pk.trace(name="support-agent")
|
|
92
|
+
def run_agent(question: str) -> str:
|
|
93
|
+
docs = retrieve(question) # wrap sub-steps with `with pk.span("retrieve"):`
|
|
94
|
+
return chat(question, docs) # the OpenAI/Anthropic call captures itself
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Run your agent, open **Traces** in the portal, and every run shows up as a nested waterfall
|
|
98
|
+
with per-span input, output, and token usage.
|
|
99
|
+
|
|
100
|
+
It's OpenTelemetry under the hood, so your data is portable and nothing is locked in — but
|
|
101
|
+
you never have to touch OTel. Fail-open by design: if the key/endpoint are unset or the
|
|
102
|
+
portal is unreachable, your app runs completely unaffected.
|
|
103
|
+
|
|
104
|
+
## Run the portal (self-host)
|
|
105
|
+
|
|
106
|
+
The web app + ingest server ship in the same package:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
pip install "provekit[server]"
|
|
110
|
+
uvicorn provekit.main:app --port 8100
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
See the [repo](https://github.com/MobirizerServices/ProveKit) for Docker/compose and the
|
|
114
|
+
full [tracing guide](https://github.com/MobirizerServices/ProveKit/blob/main/docs/TRACING.md).
|
|
115
|
+
|
|
116
|
+
- Repository: https://github.com/MobirizerServices/ProveKit
|
|
117
|
+
- License: MIT
|
provekit-0.5.0/README.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# ProveKit
|
|
2
|
+
|
|
3
|
+
**One decorator. The whole agent flow.** Add one `@pk.trace` at your agent's entrypoint and
|
|
4
|
+
review every run — the model calls, tools, and steps — as a nested flow in your ProveKit
|
|
5
|
+
portal. OpenAI/Anthropic calls capture themselves. Open source, self-hostable, no framework
|
|
6
|
+
lock-in.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
pip install "provekit[trace]"
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Use
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
import provekit.trace as pk
|
|
18
|
+
|
|
19
|
+
# .env
|
|
20
|
+
# PROVEKIT_API_KEY=pk_... (create a project + key in the portal)
|
|
21
|
+
# PROVEKIT_ENDPOINT=https://your-provekit-host
|
|
22
|
+
|
|
23
|
+
@pk.trace(name="support-agent")
|
|
24
|
+
def run_agent(question: str) -> str:
|
|
25
|
+
docs = retrieve(question) # wrap sub-steps with `with pk.span("retrieve"):`
|
|
26
|
+
return chat(question, docs) # the OpenAI/Anthropic call captures itself
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Run your agent, open **Traces** in the portal, and every run shows up as a nested waterfall
|
|
30
|
+
with per-span input, output, and token usage.
|
|
31
|
+
|
|
32
|
+
It's OpenTelemetry under the hood, so your data is portable and nothing is locked in — but
|
|
33
|
+
you never have to touch OTel. Fail-open by design: if the key/endpoint are unset or the
|
|
34
|
+
portal is unreachable, your app runs completely unaffected.
|
|
35
|
+
|
|
36
|
+
## Run the portal (self-host)
|
|
37
|
+
|
|
38
|
+
The web app + ingest server ship in the same package:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pip install "provekit[server]"
|
|
42
|
+
uvicorn provekit.main:app --port 8100
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
See the [repo](https://github.com/MobirizerServices/ProveKit) for Docker/compose and the
|
|
46
|
+
full [tracing guide](https://github.com/MobirizerServices/ProveKit/blob/main/docs/TRACING.md).
|
|
47
|
+
|
|
48
|
+
- Repository: https://github.com/MobirizerServices/ProveKit
|
|
49
|
+
- License: MIT
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""ProveKit — drop-in agent tracing. One SDK on the client captures the whole flow.
|
|
2
|
+
|
|
3
|
+
import provekit.trace as pk # the canonical import
|
|
4
|
+
pk.init() # or, zero-code: import provekit.auto
|
|
5
|
+
|
|
6
|
+
@pk.trace(name="my-agent") # optional: group one run under a named root
|
|
7
|
+
def run(q): ...
|
|
8
|
+
|
|
9
|
+
Everything beneath your code — LLM providers, agent frameworks, outbound HTTP — is
|
|
10
|
+
captured automatically. `init`, `configure`, and `span` are also re-exported here for
|
|
11
|
+
`import provekit as pk` convenience; the `trace` decorator lives on the `provekit.trace`
|
|
12
|
+
submodule (a same-named top-level export would shadow that module).
|
|
13
|
+
"""
|
|
14
|
+
from provekit import scorers
|
|
15
|
+
from provekit.eval import evaluate
|
|
16
|
+
from provekit.trace import configure, init, span
|
|
17
|
+
|
|
18
|
+
__all__ = ["init", "configure", "span", "evaluate", "scorers"]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Zero-code activation: `import provekit.auto` turns tracing on with no other calls.
|
|
2
|
+
|
|
3
|
+
import provekit.auto # reads PROVEKIT_API_KEY / PROVEKIT_ENDPOINT and instruments
|
|
4
|
+
|
|
5
|
+
Put this once at your program's entrypoint (before the libraries you want traced do their
|
|
6
|
+
work). Everything instrumented below it is then captured automatically. Fail-open: if the
|
|
7
|
+
env vars are unset or OpenTelemetry isn't installed, this is a silent no-op.
|
|
8
|
+
"""
|
|
9
|
+
from provekit.trace import init
|
|
10
|
+
|
|
11
|
+
init()
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""ProveKit configuration."""
|
|
2
|
+
from functools import lru_cache
|
|
3
|
+
|
|
4
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Settings(BaseSettings):
|
|
8
|
+
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
|
|
9
|
+
|
|
10
|
+
database_url: str = "sqlite:///./provekit.db"
|
|
11
|
+
cors_origins: str = "http://localhost:3001,http://localhost:3000"
|
|
12
|
+
|
|
13
|
+
# Hosted mode: a login wall, secure cookies, and stricter outbound-URL guarding.
|
|
14
|
+
hosted: bool = False
|
|
15
|
+
|
|
16
|
+
# Signs session/reset/verify tokens (any string → a Fernet key). Optional for local
|
|
17
|
+
# SQLite (a key file is auto-generated); required for any other database.
|
|
18
|
+
secret_key: str = ""
|
|
19
|
+
|
|
20
|
+
# Optional OTLP/HTTP collector to mirror captured runs to another backend.
|
|
21
|
+
otel_export_url: str = ""
|
|
22
|
+
|
|
23
|
+
# Optional Sentry DSN for error reporting (off when unset).
|
|
24
|
+
sentry_dsn: str = ""
|
|
25
|
+
|
|
26
|
+
# Web app base URL (for links in emails).
|
|
27
|
+
web_base_url: str = "http://localhost:3001"
|
|
28
|
+
|
|
29
|
+
# Email (account recovery / verification). No SMTP host → links are logged, not sent.
|
|
30
|
+
smtp_host: str = ""
|
|
31
|
+
smtp_port: int = 587
|
|
32
|
+
smtp_user: str = ""
|
|
33
|
+
smtp_password: str = ""
|
|
34
|
+
smtp_from: str = ""
|
|
35
|
+
smtp_starttls: bool = True
|
|
36
|
+
require_email_verification: bool = False
|
|
37
|
+
|
|
38
|
+
# Optional Redis (shared rate-limit windows across workers). Unset → in-memory.
|
|
39
|
+
redis_url: str = ""
|
|
40
|
+
|
|
41
|
+
thread_pool_size: int = 200
|
|
42
|
+
|
|
43
|
+
# Mask PII (emails, cards, SSNs, phones, common secret keys) in captured span
|
|
44
|
+
# input/output/error before it's stored. Off by default; a safety net for hosted use.
|
|
45
|
+
redact_pii: bool = False
|
|
46
|
+
|
|
47
|
+
# Bootstrap platform operators: any account whose email is in this comma-list is treated
|
|
48
|
+
# as a superuser (admin console), even before the DB flag is set. e.g. "you@co.com".
|
|
49
|
+
superuser_emails: str = ""
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def superuser_email_list(self) -> list[str]:
|
|
53
|
+
return [e.strip().lower() for e in self.superuser_emails.split(",") if e.strip()]
|
|
54
|
+
|
|
55
|
+
# Quotas (protect shared infra). 0 disables a given limit.
|
|
56
|
+
ingest_rate_per_min: int = 600 # trace-ingest requests per project per minute
|
|
57
|
+
login_attempts_per_min: int = 10 # login attempts per email+IP per minute
|
|
58
|
+
runs_retention: int = 10000 # keep last N spans per project (older ones pruned)
|
|
59
|
+
max_body_bytes: int = 2_000_000 # reject request bodies larger than this
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def cors_origin_list(self) -> list[str]:
|
|
63
|
+
return [o.strip() for o in self.cors_origins.split(",") if o.strip()]
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@lru_cache
|
|
67
|
+
def get_settings() -> Settings:
|
|
68
|
+
return Settings()
|
|
@@ -62,16 +62,6 @@ def init_db() -> None:
|
|
|
62
62
|
_run_migrations()
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
# Revision that first introduced each column, newest first — used to adopt a pre-migration
|
|
66
|
-
# database (built by the old create_all path) at the revision matching its actual columns.
|
|
67
|
-
_ADOPT_BY_COLUMN = [
|
|
68
|
-
("users", "token_version", "a1b2c3d4e5f6"),
|
|
69
|
-
("users", "email_verified", "323eb73d463c"),
|
|
70
|
-
("workspaces", "ingest_key_hash", "819ed5ff183e"),
|
|
71
|
-
]
|
|
72
|
-
_BASELINE_REVISION = "49e8ab812556"
|
|
73
|
-
|
|
74
|
-
|
|
75
65
|
# Postgres advisory-lock key ("AGMN") used to serialize migrations across uvicorn workers.
|
|
76
66
|
_MIGRATION_LOCK_ID = 0x4147_4D4E
|
|
77
67
|
|
|
@@ -113,20 +103,4 @@ def _run_migrations() -> None:
|
|
|
113
103
|
|
|
114
104
|
def _migrate_to_head(cfg) -> None:
|
|
115
105
|
from alembic import command
|
|
116
|
-
from alembic.runtime.migration import MigrationContext
|
|
117
|
-
from sqlalchemy import inspect
|
|
118
|
-
|
|
119
|
-
insp = inspect(engine)
|
|
120
|
-
with engine.connect() as conn:
|
|
121
|
-
current = MigrationContext.configure(conn).get_current_revision()
|
|
122
|
-
if current is None and insp.has_table("users"):
|
|
123
|
-
# A database created by create_all before migrations existed has the tables but no
|
|
124
|
-
# alembic version. Stamp it at the revision matching its columns so `upgrade` applies
|
|
125
|
-
# only what's genuinely missing instead of trying to re-create existing tables.
|
|
126
|
-
stamp_at = _BASELINE_REVISION
|
|
127
|
-
for table, column, revision in _ADOPT_BY_COLUMN:
|
|
128
|
-
if any(c["name"] == column for c in insp.get_columns(table)):
|
|
129
|
-
stamp_at = revision
|
|
130
|
-
break
|
|
131
|
-
command.stamp(cfg, stamp_at)
|
|
132
106
|
command.upgrade(cfg, "head")
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Offline evaluation from the client: run a target over a dataset, score each output, and
|
|
2
|
+
record it as an experiment in your portal — the basis of a CI regression gate.
|
|
3
|
+
|
|
4
|
+
import provekit as pk
|
|
5
|
+
|
|
6
|
+
def target(question: str) -> str:
|
|
7
|
+
return my_agent(question)
|
|
8
|
+
|
|
9
|
+
summary = pk.evaluate("qa-golden", target, scorers=["exact_match", "contains"])
|
|
10
|
+
assert summary["mean_score"] >= 0.8 # fail the build on a regression
|
|
11
|
+
|
|
12
|
+
`scorers` are names from provekit.scorers (exact_match/contains/regex_match/json_valid) or
|
|
13
|
+
your own `fn(output, expected) -> float`. The dataset is a name or id from your portal.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import json
|
|
18
|
+
|
|
19
|
+
import httpx
|
|
20
|
+
|
|
21
|
+
from . import scorers as _scorers
|
|
22
|
+
from . import trace as _trace
|
|
23
|
+
|
|
24
|
+
_TIMEOUT = 60
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _get(endpoint, headers, path):
|
|
28
|
+
r = httpx.get(f"{endpoint}{path}", headers=headers, timeout=_TIMEOUT, follow_redirects=False)
|
|
29
|
+
r.raise_for_status()
|
|
30
|
+
return r.json()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _post(endpoint, headers, path, body):
|
|
34
|
+
r = httpx.post(f"{endpoint}{path}", headers=headers, json=body, timeout=_TIMEOUT, follow_redirects=False)
|
|
35
|
+
r.raise_for_status()
|
|
36
|
+
return r.json()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _resolve_dataset_id(endpoint, headers, dataset) -> int:
|
|
40
|
+
if isinstance(dataset, int):
|
|
41
|
+
return dataset
|
|
42
|
+
for d in _get(endpoint, headers, "/v1/datasets"):
|
|
43
|
+
if d.get("name") == dataset:
|
|
44
|
+
return d["id"]
|
|
45
|
+
raise ValueError(f"dataset {dataset!r} not found")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def evaluate(dataset, target, scorers, *, name: str = "experiment") -> dict:
|
|
49
|
+
"""Run `target(input)` over every item in `dataset`, score each output with `scorers`,
|
|
50
|
+
post the results as a new experiment, and return its summary (id, result_count,
|
|
51
|
+
scorer_means, mean_score). Raises if ProveKit isn't configured."""
|
|
52
|
+
if not _trace.configure():
|
|
53
|
+
raise RuntimeError("ProveKit not configured: set PROVEKIT_API_KEY and PROVEKIT_ENDPOINT")
|
|
54
|
+
endpoint, headers = _trace._endpoint, {"Authorization": f"Bearer {_trace._api_key}"}
|
|
55
|
+
|
|
56
|
+
dsid = _resolve_dataset_id(endpoint, headers, dataset)
|
|
57
|
+
items = _get(endpoint, headers, f"/v1/datasets/{dsid}/items")
|
|
58
|
+
exp = _post(endpoint, headers, "/v1/experiments", {"name": name, "dataset_id": dsid})
|
|
59
|
+
eid = exp["id"]
|
|
60
|
+
|
|
61
|
+
for it in items:
|
|
62
|
+
try:
|
|
63
|
+
output = target(it["input"])
|
|
64
|
+
except Exception as exc: # a target failure is a data point, not a crash
|
|
65
|
+
output = f"ERROR: {exc}"
|
|
66
|
+
if not isinstance(output, str):
|
|
67
|
+
output = json.dumps(output, default=str)
|
|
68
|
+
expected = it.get("expected", "")
|
|
69
|
+
scores = _scorers.run_scorers(scorers, output, expected)
|
|
70
|
+
_post(endpoint, headers, f"/v1/experiments/{eid}/results",
|
|
71
|
+
{"item_id": it.get("id"), "input": it["input"], "output": output,
|
|
72
|
+
"expected": expected, "scores": scores})
|
|
73
|
+
|
|
74
|
+
return _get(endpoint, headers, f"/v1/experiments/{eid}")
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"""ProveKit —
|
|
2
|
-
|
|
1
|
+
"""ProveKit — drop-in agent tracing. Add one decorator, get a project key, and review
|
|
2
|
+
every run your agent makes. No connections to configure, no SDK to swap."""
|
|
3
3
|
import logging
|
|
4
4
|
from contextlib import asynccontextmanager
|
|
5
5
|
|
|
@@ -7,8 +7,7 @@ from fastapi import FastAPI
|
|
|
7
7
|
from fastapi.middleware.cors import CORSMiddleware
|
|
8
8
|
|
|
9
9
|
from .config import get_settings
|
|
10
|
-
from .database import
|
|
11
|
-
from .models import Connection
|
|
10
|
+
from .database import init_db
|
|
12
11
|
from .observability import (
|
|
13
12
|
BodySizeLimitMiddleware,
|
|
14
13
|
RequestIDMiddleware,
|
|
@@ -17,7 +16,7 @@ from .observability import (
|
|
|
17
16
|
init_sentry,
|
|
18
17
|
setup_logging,
|
|
19
18
|
)
|
|
20
|
-
from .routers import
|
|
19
|
+
from .routers import admin, alerts, apikeys, auth, datasets, experiments, metrics, projects, traces
|
|
21
20
|
|
|
22
21
|
logging.basicConfig(level=logging.INFO)
|
|
23
22
|
settings = get_settings()
|
|
@@ -25,16 +24,6 @@ setup_logging()
|
|
|
25
24
|
init_sentry()
|
|
26
25
|
|
|
27
26
|
|
|
28
|
-
def _reseal_connections(db) -> None:
|
|
29
|
-
"""Upgrade plaintext secrets from older databases to encrypted-at-rest: force each
|
|
30
|
-
config back through SealedJSON's bind processor (flag_modified beats SQLAlchemy's
|
|
31
|
-
equal-value change suppression). Idempotent — already-sealed values stay sealed."""
|
|
32
|
-
from sqlalchemy.orm.attributes import flag_modified
|
|
33
|
-
for c in db.query(Connection).all():
|
|
34
|
-
flag_modified(c, "config")
|
|
35
|
-
db.commit()
|
|
36
|
-
|
|
37
|
-
|
|
38
27
|
_WEAK_KEYS = {"", "dev-only-change-me", "change-me", "changeme", "secret"}
|
|
39
28
|
|
|
40
29
|
|
|
@@ -67,11 +56,6 @@ async def lifespan(app: FastAPI):
|
|
|
67
56
|
except Exception:
|
|
68
57
|
pass
|
|
69
58
|
init_db()
|
|
70
|
-
db = SessionLocal()
|
|
71
|
-
try:
|
|
72
|
-
_reseal_connections(db) # per-workspace seeding happens on first workspace access
|
|
73
|
-
finally:
|
|
74
|
-
db.close()
|
|
75
59
|
yield
|
|
76
60
|
|
|
77
61
|
|
|
@@ -93,16 +77,18 @@ app.add_middleware(
|
|
|
93
77
|
)
|
|
94
78
|
|
|
95
79
|
app.include_router(auth.router)
|
|
96
|
-
app.include_router(
|
|
97
|
-
app.include_router(library.router)
|
|
98
|
-
app.include_router(prompts.router)
|
|
99
|
-
app.include_router(flows.router)
|
|
100
|
-
app.include_router(run.router)
|
|
80
|
+
app.include_router(apikeys.router)
|
|
101
81
|
app.include_router(traces.router)
|
|
102
82
|
app.include_router(traces.ws_router)
|
|
103
|
-
app.include_router(
|
|
104
|
-
app.include_router(
|
|
105
|
-
app.include_router(
|
|
83
|
+
app.include_router(traces.runs_router)
|
|
84
|
+
app.include_router(datasets.router)
|
|
85
|
+
app.include_router(datasets.key_router)
|
|
86
|
+
app.include_router(experiments.router)
|
|
87
|
+
app.include_router(experiments.key_router)
|
|
88
|
+
app.include_router(metrics.router)
|
|
89
|
+
app.include_router(alerts.router)
|
|
90
|
+
app.include_router(projects.router)
|
|
91
|
+
app.include_router(admin.router)
|
|
106
92
|
|
|
107
93
|
|
|
108
94
|
@app.get("/")
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""ProveKit MCP server — debug your traces from any MCP client (Claude Desktop, Cursor, …).
|
|
2
|
+
|
|
3
|
+
This is a *debug channel*, not a second client SDK: your agent still installs only the one
|
|
4
|
+
`provekit` tracing SDK. This server runs wherever you like (your laptop, CI) and reads the
|
|
5
|
+
already-captured traces from your portal over HTTP, authenticated by the same project key.
|
|
6
|
+
|
|
7
|
+
pip install "provekit[mcp]"
|
|
8
|
+
export PROVEKIT_API_KEY=pk_... # your project key
|
|
9
|
+
export PROVEKIT_ENDPOINT=https://provekit.your-co.com
|
|
10
|
+
provekit-mcp # speaks MCP over stdio
|
|
11
|
+
|
|
12
|
+
Then point an MCP client at the `provekit-mcp` command. It exposes tools to list recent
|
|
13
|
+
traces, surface failures, and pull a full span tree — so the assistant can reason over an
|
|
14
|
+
agent run and tell you what broke, with no code added to the traced app.
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import os
|
|
19
|
+
|
|
20
|
+
import httpx
|
|
21
|
+
|
|
22
|
+
_TIMEOUT = 15
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _base() -> tuple[str, dict]:
|
|
26
|
+
"""Resolve the portal URL + auth header from the environment, or raise a clear error."""
|
|
27
|
+
key = os.environ.get("PROVEKIT_API_KEY")
|
|
28
|
+
endpoint = os.environ.get("PROVEKIT_ENDPOINT")
|
|
29
|
+
if not key or not endpoint:
|
|
30
|
+
raise RuntimeError(
|
|
31
|
+
"Set PROVEKIT_API_KEY (your pk_ project key) and PROVEKIT_ENDPOINT "
|
|
32
|
+
"(your portal URL) before starting the ProveKit MCP server."
|
|
33
|
+
)
|
|
34
|
+
return endpoint.rstrip("/"), {"Authorization": f"Bearer {key}"}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _get(path: str, **params):
|
|
38
|
+
url, headers = _base()
|
|
39
|
+
r = httpx.get(f"{url}/v1{path}", headers=headers, params=params, timeout=_TIMEOUT,
|
|
40
|
+
follow_redirects=False)
|
|
41
|
+
r.raise_for_status()
|
|
42
|
+
return r.json()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# ---- the callable data layer (import-safe; used by the MCP tools and by tests) ----
|
|
46
|
+
def list_traces(limit: int = 20, status: str | None = None) -> list[dict]:
|
|
47
|
+
"""Recent traces, newest first. Pass status='failed' to see only failed runs."""
|
|
48
|
+
return _get("/traces", limit=limit, **({"status": status} if status else {}))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def list_failures(limit: int = 20) -> list[dict]:
|
|
52
|
+
"""Just the traces that ended in a failure — the ones worth debugging first."""
|
|
53
|
+
return list_traces(limit=limit, status="failed")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def get_trace(trace_id: str) -> list[dict]:
|
|
57
|
+
"""Every span of one trace (the full nested flow), in start order."""
|
|
58
|
+
return _get(f"/traces/{trace_id}")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def build_server(): # pragma: no cover - needs the optional `mcp` dep; glue over the tested data layer
|
|
62
|
+
"""Construct the FastMCP server with the trace tools registered. Imported lazily so the
|
|
63
|
+
module stays importable (and testable) without the optional `mcp` dependency. The three
|
|
64
|
+
data-layer functions above are registered directly as MCP tools."""
|
|
65
|
+
from mcp.server.fastmcp import FastMCP
|
|
66
|
+
|
|
67
|
+
server = FastMCP("provekit")
|
|
68
|
+
server.add_tool(list_traces, name="provekit_list_traces",
|
|
69
|
+
description="List recent ProveKit traces (agent runs). status='failed' filters to failures.")
|
|
70
|
+
server.add_tool(list_failures, name="provekit_list_failures",
|
|
71
|
+
description="List recent traces that ended in a failure — start debugging here.")
|
|
72
|
+
server.add_tool(get_trace, name="provekit_get_trace",
|
|
73
|
+
description="Fetch the full span tree of one trace by trace_id to inspect what happened.")
|
|
74
|
+
return server
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def main() -> None: # pragma: no cover - blocks serving MCP over stdio; exercised by hand
|
|
78
|
+
"""Console-script entrypoint: `provekit-mcp`. Speaks MCP over stdio."""
|
|
79
|
+
build_server().run()
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
if __name__ == "__main__": # pragma: no cover
|
|
83
|
+
main()
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"""baseline
|
|
2
|
+
|
|
3
|
+
Revision ID: 9d2c06bfa4e6
|
|
4
|
+
Revises:
|
|
5
|
+
Create Date: 2026-07-18 22:58:47.035691
|
|
6
|
+
"""
|
|
7
|
+
from alembic import op
|
|
8
|
+
import sqlalchemy as sa
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
revision = '9d2c06bfa4e6'
|
|
12
|
+
down_revision = None
|
|
13
|
+
branch_labels = None
|
|
14
|
+
depends_on = None
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def upgrade() -> None:
|
|
18
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
19
|
+
op.create_table('users',
|
|
20
|
+
sa.Column('id', sa.Integer(), nullable=False),
|
|
21
|
+
sa.Column('email', sa.String(length=255), nullable=False),
|
|
22
|
+
sa.Column('name', sa.String(length=160), nullable=False),
|
|
23
|
+
sa.Column('password_hash', sa.String(length=255), nullable=False),
|
|
24
|
+
sa.Column('auth_provider', sa.String(length=32), nullable=False),
|
|
25
|
+
sa.Column('email_verified', sa.Boolean(), nullable=False),
|
|
26
|
+
sa.Column('token_version', sa.Integer(), nullable=False),
|
|
27
|
+
sa.Column('created_at', sa.DateTime(), nullable=False),
|
|
28
|
+
sa.PrimaryKeyConstraint('id', name=op.f('pk_users')),
|
|
29
|
+
sa.UniqueConstraint('email', name=op.f('uq_users_email'))
|
|
30
|
+
)
|
|
31
|
+
op.create_table('workspaces',
|
|
32
|
+
sa.Column('id', sa.Integer(), nullable=False),
|
|
33
|
+
sa.Column('name', sa.String(length=160), nullable=False),
|
|
34
|
+
sa.Column('owner_user_id', sa.Integer(), nullable=False),
|
|
35
|
+
sa.Column('ingest_key_hash', sa.String(length=128), nullable=False),
|
|
36
|
+
sa.Column('created_at', sa.DateTime(), nullable=False),
|
|
37
|
+
sa.ForeignKeyConstraint(['owner_user_id'], ['users.id'], name=op.f('fk_workspaces_owner_user_id_users')),
|
|
38
|
+
sa.PrimaryKeyConstraint('id', name=op.f('pk_workspaces'))
|
|
39
|
+
)
|
|
40
|
+
with op.batch_alter_table('workspaces', schema=None) as batch_op:
|
|
41
|
+
batch_op.create_index(batch_op.f('ix_workspaces_ingest_key_hash'), ['ingest_key_hash'], unique=False)
|
|
42
|
+
batch_op.create_index(batch_op.f('ix_workspaces_owner_user_id'), ['owner_user_id'], unique=False)
|
|
43
|
+
|
|
44
|
+
op.create_table('api_keys',
|
|
45
|
+
sa.Column('id', sa.Integer(), nullable=False),
|
|
46
|
+
sa.Column('workspace_id', sa.Integer(), nullable=True),
|
|
47
|
+
sa.Column('name', sa.String(length=120), nullable=False),
|
|
48
|
+
sa.Column('prefix', sa.String(length=16), nullable=False),
|
|
49
|
+
sa.Column('key_hash', sa.String(length=128), nullable=False),
|
|
50
|
+
sa.Column('last_used_at', sa.DateTime(), nullable=True),
|
|
51
|
+
sa.Column('revoked', sa.Boolean(), nullable=False),
|
|
52
|
+
sa.Column('created_at', sa.DateTime(), nullable=False),
|
|
53
|
+
sa.ForeignKeyConstraint(['workspace_id'], ['workspaces.id'], name=op.f('fk_api_keys_workspace_id_workspaces')),
|
|
54
|
+
sa.PrimaryKeyConstraint('id', name=op.f('pk_api_keys'))
|
|
55
|
+
)
|
|
56
|
+
with op.batch_alter_table('api_keys', schema=None) as batch_op:
|
|
57
|
+
batch_op.create_index(batch_op.f('ix_api_keys_key_hash'), ['key_hash'], unique=False)
|
|
58
|
+
batch_op.create_index(batch_op.f('ix_api_keys_workspace_id'), ['workspace_id'], unique=False)
|
|
59
|
+
|
|
60
|
+
op.create_table('runs',
|
|
61
|
+
sa.Column('id', sa.Integer(), nullable=False),
|
|
62
|
+
sa.Column('workspace_id', sa.Integer(), nullable=True),
|
|
63
|
+
sa.Column('type', sa.String(length=16), nullable=False),
|
|
64
|
+
sa.Column('label', sa.String(length=200), nullable=False),
|
|
65
|
+
sa.Column('request', sa.JSON(), nullable=False),
|
|
66
|
+
sa.Column('result', sa.JSON(), nullable=False),
|
|
67
|
+
sa.Column('status', sa.String(length=16), nullable=False),
|
|
68
|
+
sa.Column('duration_ms', sa.Integer(), nullable=False),
|
|
69
|
+
sa.Column('error', sa.Text(), nullable=False),
|
|
70
|
+
sa.Column('trace_id', sa.String(length=32), nullable=False),
|
|
71
|
+
sa.Column('span_id', sa.String(length=16), nullable=False),
|
|
72
|
+
sa.Column('parent_span_id', sa.String(length=16), nullable=False),
|
|
73
|
+
sa.Column('created_at', sa.DateTime(), nullable=False),
|
|
74
|
+
sa.ForeignKeyConstraint(['workspace_id'], ['workspaces.id'], name=op.f('fk_runs_workspace_id_workspaces')),
|
|
75
|
+
sa.PrimaryKeyConstraint('id', name=op.f('pk_runs'))
|
|
76
|
+
)
|
|
77
|
+
with op.batch_alter_table('runs', schema=None) as batch_op:
|
|
78
|
+
batch_op.create_index(batch_op.f('ix_runs_trace_id'), ['trace_id'], unique=False)
|
|
79
|
+
batch_op.create_index(batch_op.f('ix_runs_workspace_id'), ['workspace_id'], unique=False)
|
|
80
|
+
|
|
81
|
+
op.create_table('workspace_members',
|
|
82
|
+
sa.Column('id', sa.Integer(), nullable=False),
|
|
83
|
+
sa.Column('workspace_id', sa.Integer(), nullable=False),
|
|
84
|
+
sa.Column('user_id', sa.Integer(), nullable=False),
|
|
85
|
+
sa.Column('role', sa.String(length=16), nullable=False),
|
|
86
|
+
sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_workspace_members_user_id_users')),
|
|
87
|
+
sa.ForeignKeyConstraint(['workspace_id'], ['workspaces.id'], name=op.f('fk_workspace_members_workspace_id_workspaces')),
|
|
88
|
+
sa.PrimaryKeyConstraint('id', name=op.f('pk_workspace_members')),
|
|
89
|
+
sa.UniqueConstraint('workspace_id', 'user_id', name='uq_member')
|
|
90
|
+
)
|
|
91
|
+
with op.batch_alter_table('workspace_members', schema=None) as batch_op:
|
|
92
|
+
batch_op.create_index(batch_op.f('ix_workspace_members_user_id'), ['user_id'], unique=False)
|
|
93
|
+
batch_op.create_index(batch_op.f('ix_workspace_members_workspace_id'), ['workspace_id'], unique=False)
|
|
94
|
+
|
|
95
|
+
# ### end Alembic commands ###
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def downgrade() -> None:
|
|
99
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
100
|
+
with op.batch_alter_table('workspace_members', schema=None) as batch_op:
|
|
101
|
+
batch_op.drop_index(batch_op.f('ix_workspace_members_workspace_id'))
|
|
102
|
+
batch_op.drop_index(batch_op.f('ix_workspace_members_user_id'))
|
|
103
|
+
|
|
104
|
+
op.drop_table('workspace_members')
|
|
105
|
+
with op.batch_alter_table('runs', schema=None) as batch_op:
|
|
106
|
+
batch_op.drop_index(batch_op.f('ix_runs_workspace_id'))
|
|
107
|
+
batch_op.drop_index(batch_op.f('ix_runs_trace_id'))
|
|
108
|
+
|
|
109
|
+
op.drop_table('runs')
|
|
110
|
+
with op.batch_alter_table('api_keys', schema=None) as batch_op:
|
|
111
|
+
batch_op.drop_index(batch_op.f('ix_api_keys_workspace_id'))
|
|
112
|
+
batch_op.drop_index(batch_op.f('ix_api_keys_key_hash'))
|
|
113
|
+
|
|
114
|
+
op.drop_table('api_keys')
|
|
115
|
+
with op.batch_alter_table('workspaces', schema=None) as batch_op:
|
|
116
|
+
batch_op.drop_index(batch_op.f('ix_workspaces_owner_user_id'))
|
|
117
|
+
batch_op.drop_index(batch_op.f('ix_workspaces_ingest_key_hash'))
|
|
118
|
+
|
|
119
|
+
op.drop_table('workspaces')
|
|
120
|
+
op.drop_table('users')
|
|
121
|
+
# ### end Alembic commands ###
|