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.
Files changed (574) hide show
  1. provekit-0.5.0/PKG-INFO +117 -0
  2. provekit-0.5.0/README.md +49 -0
  3. provekit-0.5.0/provekit/__init__.py +18 -0
  4. provekit-0.5.0/provekit/auto.py +11 -0
  5. provekit-0.5.0/provekit/config.py +68 -0
  6. {provekit-0.1.0 → provekit-0.5.0}/provekit/database.py +0 -26
  7. provekit-0.5.0/provekit/eval.py +74 -0
  8. {provekit-0.1.0 → provekit-0.5.0}/provekit/main.py +14 -28
  9. provekit-0.5.0/provekit/mcp.py +83 -0
  10. provekit-0.5.0/provekit/migrations/versions/9d2c06bfa4e6_baseline.py +121 -0
  11. provekit-0.5.0/provekit/migrations/versions/a1b2c3d4e5f6_feedback_sessions.py +49 -0
  12. provekit-0.5.0/provekit/migrations/versions/b2c3d4e5f6a7_datasets.py +54 -0
  13. provekit-0.5.0/provekit/migrations/versions/c3d4e5f6a7b8_experiments.py +59 -0
  14. provekit-0.5.0/provekit/migrations/versions/d4e5f6a7b8c9_alerts.py +40 -0
  15. provekit-0.5.0/provekit/migrations/versions/e5f6a7b8c9d0_admin.py +30 -0
  16. provekit-0.5.0/provekit/models.py +188 -0
  17. {provekit-0.1.0 → provekit-0.5.0}/provekit/observability.py +2 -2
  18. provekit-0.5.0/provekit/routers/admin.py +82 -0
  19. provekit-0.5.0/provekit/routers/alerts.py +124 -0
  20. provekit-0.5.0/provekit/routers/apikeys.py +57 -0
  21. {provekit-0.1.0 → provekit-0.5.0}/provekit/routers/auth.py +3 -1
  22. provekit-0.5.0/provekit/routers/datasets.py +151 -0
  23. provekit-0.5.0/provekit/routers/experiments.py +141 -0
  24. provekit-0.5.0/provekit/routers/metrics.py +143 -0
  25. provekit-0.5.0/provekit/routers/projects.py +140 -0
  26. provekit-0.5.0/provekit/routers/traces.py +275 -0
  27. provekit-0.5.0/provekit/scorers.py +63 -0
  28. provekit-0.5.0/provekit/services/apikey.py +38 -0
  29. provekit-0.5.0/provekit/services/deploy.py +20 -0
  30. provekit-0.5.0/provekit/services/limits.py +73 -0
  31. {provekit-0.1.0 → provekit-0.5.0}/provekit/services/otel.py +53 -16
  32. provekit-0.5.0/provekit/services/redact.py +48 -0
  33. provekit-0.5.0/provekit/services/sealing.py +49 -0
  34. provekit-0.5.0/provekit/services/share.py +54 -0
  35. provekit-0.5.0/provekit/services/workspace.py +61 -0
  36. provekit-0.5.0/provekit/trace.py +356 -0
  37. provekit-0.5.0/provekit.egg-info/PKG-INFO +117 -0
  38. provekit-0.5.0/provekit.egg-info/SOURCES.txt +75 -0
  39. provekit-0.5.0/provekit.egg-info/entry_points.txt +2 -0
  40. provekit-0.5.0/provekit.egg-info/requires.txt +52 -0
  41. provekit-0.5.0/pyproject.toml +149 -0
  42. provekit-0.5.0/tests/test_admin.py +72 -0
  43. provekit-0.5.0/tests/test_alerts.py +55 -0
  44. provekit-0.5.0/tests/test_apikeys.py +59 -0
  45. {provekit-0.1.0 → provekit-0.5.0}/tests/test_auth.py +4 -2
  46. provekit-0.5.0/tests/test_autoinstrument.py +64 -0
  47. {provekit-0.1.0 → provekit-0.5.0}/tests/test_cov_limits_auth.py +13 -30
  48. provekit-0.5.0/tests/test_coverage_extra.py +295 -0
  49. provekit-0.5.0/tests/test_datasets.py +65 -0
  50. provekit-0.5.0/tests/test_eval.py +73 -0
  51. provekit-0.5.0/tests/test_experiments.py +51 -0
  52. provekit-0.5.0/tests/test_feedback.py +65 -0
  53. provekit-0.5.0/tests/test_hardening.py +49 -0
  54. provekit-0.5.0/tests/test_key_read_api.py +81 -0
  55. provekit-0.5.0/tests/test_mcp.py +61 -0
  56. provekit-0.5.0/tests/test_metrics.py +74 -0
  57. provekit-0.5.0/tests/test_netguard.py +34 -0
  58. {provekit-0.1.0 → provekit-0.5.0}/tests/test_otel.py +20 -5
  59. provekit-0.5.0/tests/test_projects.py +79 -0
  60. provekit-0.5.0/tests/test_redact.py +56 -0
  61. provekit-0.5.0/tests/test_scorers.py +32 -0
  62. provekit-0.5.0/tests/test_share.py +58 -0
  63. provekit-0.5.0/tests/test_trace_sdk.py +254 -0
  64. provekit-0.5.0/tests/test_traces_tree.py +40 -0
  65. provekit-0.1.0/PKG-INFO +0 -86
  66. provekit-0.1.0/README.md +0 -47
  67. provekit-0.1.0/provekit/cli.py +0 -256
  68. provekit-0.1.0/provekit/config.py +0 -77
  69. provekit-0.1.0/provekit/migrations/versions/323eb73d463c_user_email_verified.py +0 -32
  70. provekit-0.1.0/provekit/migrations/versions/49e8ab812556_baseline_schema.py +0 -241
  71. provekit-0.1.0/provekit/migrations/versions/819ed5ff183e_workspace_ingest_key.py +0 -35
  72. provekit-0.1.0/provekit/migrations/versions/a1b2c3d4e5f6_user_token_version.py +0 -27
  73. provekit-0.1.0/provekit/models.py +0 -191
  74. provekit-0.1.0/provekit/routers/connections.py +0 -270
  75. provekit-0.1.0/provekit/routers/deployments.py +0 -161
  76. provekit-0.1.0/provekit/routers/flows.py +0 -188
  77. provekit-0.1.0/provekit/routers/library.py +0 -265
  78. provekit-0.1.0/provekit/routers/prompts.py +0 -72
  79. provekit-0.1.0/provekit/routers/run.py +0 -203
  80. provekit-0.1.0/provekit/routers/runtime.py +0 -103
  81. provekit-0.1.0/provekit/routers/traces.py +0 -65
  82. provekit-0.1.0/provekit/routers/usage.py +0 -42
  83. provekit-0.1.0/provekit/services/__init__.py +0 -0
  84. provekit-0.1.0/provekit/services/assertions.py +0 -135
  85. provekit-0.1.0/provekit/services/deploy.py +0 -63
  86. provekit-0.1.0/provekit/services/dispatch.py +0 -313
  87. provekit-0.1.0/provekit/services/flow.py +0 -299
  88. provekit-0.1.0/provekit/services/limits.py +0 -109
  89. provekit-0.1.0/provekit/services/masking.py +0 -45
  90. provekit-0.1.0/provekit/services/promptfoo.py +0 -92
  91. provekit-0.1.0/provekit/services/providers/__init__.py +0 -0
  92. provekit-0.1.0/provekit/services/providers/a2a_client.py +0 -110
  93. provekit-0.1.0/provekit/services/providers/agent_http.py +0 -55
  94. provekit-0.1.0/provekit/services/providers/llm.py +0 -364
  95. provekit-0.1.0/provekit/services/providers/mcp_client.py +0 -289
  96. provekit-0.1.0/provekit/services/runstore.py +0 -93
  97. provekit-0.1.0/provekit/services/sealing.py +0 -106
  98. provekit-0.1.0/provekit/services/templates.py +0 -69
  99. provekit-0.1.0/provekit/services/testfile.py +0 -122
  100. provekit-0.1.0/provekit/services/tooling.py +0 -194
  101. provekit-0.1.0/provekit/services/workspace.py +0 -91
  102. provekit-0.1.0/provekit/templates/flows/_manifest.json +0 -2594
  103. provekit-0.1.0/provekit/templates/flows/banking-action-items.yaml +0 -43
  104. provekit-0.1.0/provekit/templates/flows/banking-answer.yaml +0 -43
  105. provekit-0.1.0/provekit/templates/flows/banking-classify-intent.yaml +0 -43
  106. provekit-0.1.0/provekit/templates/flows/banking-draft-critique-revise.yaml +0 -75
  107. provekit-0.1.0/provekit/templates/flows/banking-extract-to-json.yaml +0 -43
  108. provekit-0.1.0/provekit/templates/flows/banking-faq-match-answer.yaml +0 -60
  109. provekit-0.1.0/provekit/templates/flows/banking-keyword-extract.yaml +0 -43
  110. provekit-0.1.0/provekit/templates/flows/banking-language-route.yaml +0 -103
  111. provekit-0.1.0/provekit/templates/flows/banking-moderation-gate.yaml +0 -73
  112. provekit-0.1.0/provekit/templates/flows/banking-redact-summarize.yaml +0 -59
  113. provekit-0.1.0/provekit/templates/flows/banking-score-gate.yaml +0 -73
  114. provekit-0.1.0/provekit/templates/flows/banking-sentiment-route.yaml +0 -73
  115. provekit-0.1.0/provekit/templates/flows/banking-severity-tiers.yaml +0 -103
  116. provekit-0.1.0/provekit/templates/flows/banking-summarize-then-decide.yaml +0 -88
  117. provekit-0.1.0/provekit/templates/flows/banking-tag-enrich.yaml +0 -43
  118. provekit-0.1.0/provekit/templates/flows/banking-tone-rewrite.yaml +0 -43
  119. provekit-0.1.0/provekit/templates/flows/banking-translate-reply.yaml +0 -58
  120. provekit-0.1.0/provekit/templates/flows/banking-triage-route.yaml +0 -73
  121. provekit-0.1.0/provekit/templates/flows/community-forum-action-items.yaml +0 -43
  122. provekit-0.1.0/provekit/templates/flows/community-forum-answer.yaml +0 -43
  123. provekit-0.1.0/provekit/templates/flows/community-forum-classify-intent.yaml +0 -43
  124. provekit-0.1.0/provekit/templates/flows/community-forum-draft-critique-revise.yaml +0 -75
  125. provekit-0.1.0/provekit/templates/flows/community-forum-extract-to-json.yaml +0 -43
  126. provekit-0.1.0/provekit/templates/flows/community-forum-faq-match-answer.yaml +0 -60
  127. provekit-0.1.0/provekit/templates/flows/community-forum-keyword-extract.yaml +0 -43
  128. provekit-0.1.0/provekit/templates/flows/community-forum-language-route.yaml +0 -103
  129. provekit-0.1.0/provekit/templates/flows/community-forum-moderation-gate.yaml +0 -73
  130. provekit-0.1.0/provekit/templates/flows/community-forum-redact-summarize.yaml +0 -59
  131. provekit-0.1.0/provekit/templates/flows/community-forum-score-gate.yaml +0 -73
  132. provekit-0.1.0/provekit/templates/flows/community-forum-sentiment-route.yaml +0 -73
  133. provekit-0.1.0/provekit/templates/flows/community-forum-severity-tiers.yaml +0 -103
  134. provekit-0.1.0/provekit/templates/flows/community-forum-summarize-then-decide.yaml +0 -88
  135. provekit-0.1.0/provekit/templates/flows/community-forum-tag-enrich.yaml +0 -43
  136. provekit-0.1.0/provekit/templates/flows/community-forum-tone-rewrite.yaml +0 -43
  137. provekit-0.1.0/provekit/templates/flows/community-forum-translate-reply.yaml +0 -58
  138. provekit-0.1.0/provekit/templates/flows/community-forum-triage-route.yaml +0 -73
  139. provekit-0.1.0/provekit/templates/flows/content-moderation-action-items.yaml +0 -43
  140. provekit-0.1.0/provekit/templates/flows/content-moderation-answer.yaml +0 -43
  141. provekit-0.1.0/provekit/templates/flows/content-moderation-classify-intent.yaml +0 -43
  142. provekit-0.1.0/provekit/templates/flows/content-moderation-draft-critique-revise.yaml +0 -75
  143. provekit-0.1.0/provekit/templates/flows/content-moderation-extract-to-json.yaml +0 -43
  144. provekit-0.1.0/provekit/templates/flows/content-moderation-faq-match-answer.yaml +0 -60
  145. provekit-0.1.0/provekit/templates/flows/content-moderation-keyword-extract.yaml +0 -43
  146. provekit-0.1.0/provekit/templates/flows/content-moderation-language-route.yaml +0 -103
  147. provekit-0.1.0/provekit/templates/flows/content-moderation-moderation-gate.yaml +0 -73
  148. provekit-0.1.0/provekit/templates/flows/content-moderation-redact-summarize.yaml +0 -59
  149. provekit-0.1.0/provekit/templates/flows/content-moderation-score-gate.yaml +0 -73
  150. provekit-0.1.0/provekit/templates/flows/content-moderation-sentiment-route.yaml +0 -73
  151. provekit-0.1.0/provekit/templates/flows/content-moderation-severity-tiers.yaml +0 -103
  152. provekit-0.1.0/provekit/templates/flows/content-moderation-summarize-then-decide.yaml +0 -88
  153. provekit-0.1.0/provekit/templates/flows/content-moderation-tag-enrich.yaml +0 -43
  154. provekit-0.1.0/provekit/templates/flows/content-moderation-tone-rewrite.yaml +0 -43
  155. provekit-0.1.0/provekit/templates/flows/content-moderation-translate-reply.yaml +0 -58
  156. provekit-0.1.0/provekit/templates/flows/content-moderation-triage-route.yaml +0 -73
  157. provekit-0.1.0/provekit/templates/flows/customer-support-action-items.yaml +0 -43
  158. provekit-0.1.0/provekit/templates/flows/customer-support-answer.yaml +0 -43
  159. provekit-0.1.0/provekit/templates/flows/customer-support-classify-intent.yaml +0 -43
  160. provekit-0.1.0/provekit/templates/flows/customer-support-draft-critique-revise.yaml +0 -75
  161. provekit-0.1.0/provekit/templates/flows/customer-support-extract-to-json.yaml +0 -43
  162. provekit-0.1.0/provekit/templates/flows/customer-support-faq-match-answer.yaml +0 -60
  163. provekit-0.1.0/provekit/templates/flows/customer-support-keyword-extract.yaml +0 -43
  164. provekit-0.1.0/provekit/templates/flows/customer-support-language-route.yaml +0 -103
  165. provekit-0.1.0/provekit/templates/flows/customer-support-moderation-gate.yaml +0 -73
  166. provekit-0.1.0/provekit/templates/flows/customer-support-redact-summarize.yaml +0 -59
  167. provekit-0.1.0/provekit/templates/flows/customer-support-score-gate.yaml +0 -73
  168. provekit-0.1.0/provekit/templates/flows/customer-support-sentiment-route.yaml +0 -73
  169. provekit-0.1.0/provekit/templates/flows/customer-support-severity-tiers.yaml +0 -103
  170. provekit-0.1.0/provekit/templates/flows/customer-support-summarize-then-decide.yaml +0 -88
  171. provekit-0.1.0/provekit/templates/flows/customer-support-tag-enrich.yaml +0 -43
  172. provekit-0.1.0/provekit/templates/flows/customer-support-tone-rewrite.yaml +0 -43
  173. provekit-0.1.0/provekit/templates/flows/customer-support-translate-reply.yaml +0 -58
  174. provekit-0.1.0/provekit/templates/flows/customer-support-triage-route.yaml +0 -73
  175. provekit-0.1.0/provekit/templates/flows/developer-tooling-action-items.yaml +0 -43
  176. provekit-0.1.0/provekit/templates/flows/developer-tooling-answer.yaml +0 -43
  177. provekit-0.1.0/provekit/templates/flows/developer-tooling-classify-intent.yaml +0 -43
  178. provekit-0.1.0/provekit/templates/flows/developer-tooling-draft-critique-revise.yaml +0 -75
  179. provekit-0.1.0/provekit/templates/flows/developer-tooling-extract-to-json.yaml +0 -43
  180. provekit-0.1.0/provekit/templates/flows/developer-tooling-faq-match-answer.yaml +0 -60
  181. provekit-0.1.0/provekit/templates/flows/developer-tooling-keyword-extract.yaml +0 -43
  182. provekit-0.1.0/provekit/templates/flows/developer-tooling-language-route.yaml +0 -103
  183. provekit-0.1.0/provekit/templates/flows/developer-tooling-moderation-gate.yaml +0 -73
  184. provekit-0.1.0/provekit/templates/flows/developer-tooling-redact-summarize.yaml +0 -59
  185. provekit-0.1.0/provekit/templates/flows/developer-tooling-score-gate.yaml +0 -73
  186. provekit-0.1.0/provekit/templates/flows/developer-tooling-sentiment-route.yaml +0 -73
  187. provekit-0.1.0/provekit/templates/flows/developer-tooling-severity-tiers.yaml +0 -103
  188. provekit-0.1.0/provekit/templates/flows/developer-tooling-summarize-then-decide.yaml +0 -88
  189. provekit-0.1.0/provekit/templates/flows/developer-tooling-tag-enrich.yaml +0 -43
  190. provekit-0.1.0/provekit/templates/flows/developer-tooling-tone-rewrite.yaml +0 -43
  191. provekit-0.1.0/provekit/templates/flows/developer-tooling-translate-reply.yaml +0 -58
  192. provekit-0.1.0/provekit/templates/flows/developer-tooling-triage-route.yaml +0 -73
  193. provekit-0.1.0/provekit/templates/flows/devrel-action-items.yaml +0 -43
  194. provekit-0.1.0/provekit/templates/flows/devrel-answer.yaml +0 -43
  195. provekit-0.1.0/provekit/templates/flows/devrel-classify-intent.yaml +0 -43
  196. provekit-0.1.0/provekit/templates/flows/devrel-draft-critique-revise.yaml +0 -75
  197. provekit-0.1.0/provekit/templates/flows/devrel-extract-to-json.yaml +0 -43
  198. provekit-0.1.0/provekit/templates/flows/devrel-faq-match-answer.yaml +0 -60
  199. provekit-0.1.0/provekit/templates/flows/devrel-keyword-extract.yaml +0 -43
  200. provekit-0.1.0/provekit/templates/flows/devrel-language-route.yaml +0 -103
  201. provekit-0.1.0/provekit/templates/flows/devrel-moderation-gate.yaml +0 -73
  202. provekit-0.1.0/provekit/templates/flows/devrel-redact-summarize.yaml +0 -59
  203. provekit-0.1.0/provekit/templates/flows/devrel-score-gate.yaml +0 -73
  204. provekit-0.1.0/provekit/templates/flows/devrel-sentiment-route.yaml +0 -73
  205. provekit-0.1.0/provekit/templates/flows/devrel-severity-tiers.yaml +0 -103
  206. provekit-0.1.0/provekit/templates/flows/devrel-summarize-then-decide.yaml +0 -88
  207. provekit-0.1.0/provekit/templates/flows/devrel-tag-enrich.yaml +0 -43
  208. provekit-0.1.0/provekit/templates/flows/devrel-tone-rewrite.yaml +0 -43
  209. provekit-0.1.0/provekit/templates/flows/devrel-translate-reply.yaml +0 -58
  210. provekit-0.1.0/provekit/templates/flows/devrel-triage-route.yaml +0 -73
  211. provekit-0.1.0/provekit/templates/flows/e-commerce-action-items.yaml +0 -43
  212. provekit-0.1.0/provekit/templates/flows/e-commerce-answer.yaml +0 -43
  213. provekit-0.1.0/provekit/templates/flows/e-commerce-classify-intent.yaml +0 -43
  214. provekit-0.1.0/provekit/templates/flows/e-commerce-draft-critique-revise.yaml +0 -75
  215. provekit-0.1.0/provekit/templates/flows/e-commerce-extract-to-json.yaml +0 -43
  216. provekit-0.1.0/provekit/templates/flows/e-commerce-faq-match-answer.yaml +0 -60
  217. provekit-0.1.0/provekit/templates/flows/e-commerce-keyword-extract.yaml +0 -43
  218. provekit-0.1.0/provekit/templates/flows/e-commerce-language-route.yaml +0 -103
  219. provekit-0.1.0/provekit/templates/flows/e-commerce-moderation-gate.yaml +0 -73
  220. provekit-0.1.0/provekit/templates/flows/e-commerce-redact-summarize.yaml +0 -59
  221. provekit-0.1.0/provekit/templates/flows/e-commerce-score-gate.yaml +0 -73
  222. provekit-0.1.0/provekit/templates/flows/e-commerce-sentiment-route.yaml +0 -73
  223. provekit-0.1.0/provekit/templates/flows/e-commerce-severity-tiers.yaml +0 -103
  224. provekit-0.1.0/provekit/templates/flows/e-commerce-summarize-then-decide.yaml +0 -88
  225. provekit-0.1.0/provekit/templates/flows/e-commerce-tag-enrich.yaml +0 -43
  226. provekit-0.1.0/provekit/templates/flows/e-commerce-tone-rewrite.yaml +0 -43
  227. provekit-0.1.0/provekit/templates/flows/e-commerce-translate-reply.yaml +0 -58
  228. provekit-0.1.0/provekit/templates/flows/e-commerce-triage-route.yaml +0 -73
  229. provekit-0.1.0/provekit/templates/flows/education-action-items.yaml +0 -43
  230. provekit-0.1.0/provekit/templates/flows/education-answer.yaml +0 -43
  231. provekit-0.1.0/provekit/templates/flows/education-classify-intent.yaml +0 -43
  232. provekit-0.1.0/provekit/templates/flows/education-draft-critique-revise.yaml +0 -75
  233. provekit-0.1.0/provekit/templates/flows/education-extract-to-json.yaml +0 -43
  234. provekit-0.1.0/provekit/templates/flows/education-faq-match-answer.yaml +0 -60
  235. provekit-0.1.0/provekit/templates/flows/education-keyword-extract.yaml +0 -43
  236. provekit-0.1.0/provekit/templates/flows/education-language-route.yaml +0 -103
  237. provekit-0.1.0/provekit/templates/flows/education-moderation-gate.yaml +0 -73
  238. provekit-0.1.0/provekit/templates/flows/education-redact-summarize.yaml +0 -59
  239. provekit-0.1.0/provekit/templates/flows/education-score-gate.yaml +0 -73
  240. provekit-0.1.0/provekit/templates/flows/education-sentiment-route.yaml +0 -73
  241. provekit-0.1.0/provekit/templates/flows/education-severity-tiers.yaml +0 -103
  242. provekit-0.1.0/provekit/templates/flows/education-summarize-then-decide.yaml +0 -88
  243. provekit-0.1.0/provekit/templates/flows/education-tag-enrich.yaml +0 -43
  244. provekit-0.1.0/provekit/templates/flows/education-tone-rewrite.yaml +0 -43
  245. provekit-0.1.0/provekit/templates/flows/education-translate-reply.yaml +0 -58
  246. provekit-0.1.0/provekit/templates/flows/education-triage-route.yaml +0 -73
  247. provekit-0.1.0/provekit/templates/flows/finance-action-items.yaml +0 -43
  248. provekit-0.1.0/provekit/templates/flows/finance-answer.yaml +0 -43
  249. provekit-0.1.0/provekit/templates/flows/finance-classify-intent.yaml +0 -43
  250. provekit-0.1.0/provekit/templates/flows/finance-draft-critique-revise.yaml +0 -75
  251. provekit-0.1.0/provekit/templates/flows/finance-extract-to-json.yaml +0 -43
  252. provekit-0.1.0/provekit/templates/flows/finance-faq-match-answer.yaml +0 -60
  253. provekit-0.1.0/provekit/templates/flows/finance-keyword-extract.yaml +0 -43
  254. provekit-0.1.0/provekit/templates/flows/finance-language-route.yaml +0 -103
  255. provekit-0.1.0/provekit/templates/flows/finance-moderation-gate.yaml +0 -73
  256. provekit-0.1.0/provekit/templates/flows/finance-redact-summarize.yaml +0 -59
  257. provekit-0.1.0/provekit/templates/flows/finance-score-gate.yaml +0 -73
  258. provekit-0.1.0/provekit/templates/flows/finance-sentiment-route.yaml +0 -73
  259. provekit-0.1.0/provekit/templates/flows/finance-severity-tiers.yaml +0 -103
  260. provekit-0.1.0/provekit/templates/flows/finance-summarize-then-decide.yaml +0 -88
  261. provekit-0.1.0/provekit/templates/flows/finance-tag-enrich.yaml +0 -43
  262. provekit-0.1.0/provekit/templates/flows/finance-tone-rewrite.yaml +0 -43
  263. provekit-0.1.0/provekit/templates/flows/finance-translate-reply.yaml +0 -58
  264. provekit-0.1.0/provekit/templates/flows/finance-triage-route.yaml +0 -73
  265. provekit-0.1.0/provekit/templates/flows/food-delivery-action-items.yaml +0 -43
  266. provekit-0.1.0/provekit/templates/flows/food-delivery-answer.yaml +0 -43
  267. provekit-0.1.0/provekit/templates/flows/food-delivery-classify-intent.yaml +0 -43
  268. provekit-0.1.0/provekit/templates/flows/food-delivery-draft-critique-revise.yaml +0 -75
  269. provekit-0.1.0/provekit/templates/flows/food-delivery-extract-to-json.yaml +0 -43
  270. provekit-0.1.0/provekit/templates/flows/food-delivery-faq-match-answer.yaml +0 -60
  271. provekit-0.1.0/provekit/templates/flows/food-delivery-keyword-extract.yaml +0 -43
  272. provekit-0.1.0/provekit/templates/flows/food-delivery-language-route.yaml +0 -103
  273. provekit-0.1.0/provekit/templates/flows/food-delivery-moderation-gate.yaml +0 -73
  274. provekit-0.1.0/provekit/templates/flows/food-delivery-redact-summarize.yaml +0 -59
  275. provekit-0.1.0/provekit/templates/flows/food-delivery-score-gate.yaml +0 -73
  276. provekit-0.1.0/provekit/templates/flows/food-delivery-sentiment-route.yaml +0 -73
  277. provekit-0.1.0/provekit/templates/flows/food-delivery-severity-tiers.yaml +0 -103
  278. provekit-0.1.0/provekit/templates/flows/food-delivery-summarize-then-decide.yaml +0 -88
  279. provekit-0.1.0/provekit/templates/flows/food-delivery-tag-enrich.yaml +0 -43
  280. provekit-0.1.0/provekit/templates/flows/food-delivery-tone-rewrite.yaml +0 -43
  281. provekit-0.1.0/provekit/templates/flows/food-delivery-translate-reply.yaml +0 -58
  282. provekit-0.1.0/provekit/templates/flows/food-delivery-triage-route.yaml +0 -73
  283. provekit-0.1.0/provekit/templates/flows/gaming-support-action-items.yaml +0 -43
  284. provekit-0.1.0/provekit/templates/flows/gaming-support-answer.yaml +0 -43
  285. provekit-0.1.0/provekit/templates/flows/gaming-support-classify-intent.yaml +0 -43
  286. provekit-0.1.0/provekit/templates/flows/gaming-support-draft-critique-revise.yaml +0 -75
  287. provekit-0.1.0/provekit/templates/flows/gaming-support-extract-to-json.yaml +0 -43
  288. provekit-0.1.0/provekit/templates/flows/gaming-support-faq-match-answer.yaml +0 -60
  289. provekit-0.1.0/provekit/templates/flows/gaming-support-keyword-extract.yaml +0 -43
  290. provekit-0.1.0/provekit/templates/flows/gaming-support-language-route.yaml +0 -103
  291. provekit-0.1.0/provekit/templates/flows/gaming-support-moderation-gate.yaml +0 -73
  292. provekit-0.1.0/provekit/templates/flows/gaming-support-redact-summarize.yaml +0 -59
  293. provekit-0.1.0/provekit/templates/flows/gaming-support-score-gate.yaml +0 -73
  294. provekit-0.1.0/provekit/templates/flows/gaming-support-sentiment-route.yaml +0 -73
  295. provekit-0.1.0/provekit/templates/flows/gaming-support-severity-tiers.yaml +0 -103
  296. provekit-0.1.0/provekit/templates/flows/gaming-support-summarize-then-decide.yaml +0 -88
  297. provekit-0.1.0/provekit/templates/flows/gaming-support-tag-enrich.yaml +0 -43
  298. provekit-0.1.0/provekit/templates/flows/gaming-support-tone-rewrite.yaml +0 -43
  299. provekit-0.1.0/provekit/templates/flows/gaming-support-translate-reply.yaml +0 -58
  300. provekit-0.1.0/provekit/templates/flows/gaming-support-triage-route.yaml +0 -73
  301. provekit-0.1.0/provekit/templates/flows/healthcare-intake-action-items.yaml +0 -43
  302. provekit-0.1.0/provekit/templates/flows/healthcare-intake-answer.yaml +0 -43
  303. provekit-0.1.0/provekit/templates/flows/healthcare-intake-classify-intent.yaml +0 -43
  304. provekit-0.1.0/provekit/templates/flows/healthcare-intake-draft-critique-revise.yaml +0 -75
  305. provekit-0.1.0/provekit/templates/flows/healthcare-intake-extract-to-json.yaml +0 -43
  306. provekit-0.1.0/provekit/templates/flows/healthcare-intake-faq-match-answer.yaml +0 -60
  307. provekit-0.1.0/provekit/templates/flows/healthcare-intake-keyword-extract.yaml +0 -43
  308. provekit-0.1.0/provekit/templates/flows/healthcare-intake-language-route.yaml +0 -103
  309. provekit-0.1.0/provekit/templates/flows/healthcare-intake-moderation-gate.yaml +0 -73
  310. provekit-0.1.0/provekit/templates/flows/healthcare-intake-redact-summarize.yaml +0 -59
  311. provekit-0.1.0/provekit/templates/flows/healthcare-intake-score-gate.yaml +0 -73
  312. provekit-0.1.0/provekit/templates/flows/healthcare-intake-sentiment-route.yaml +0 -73
  313. provekit-0.1.0/provekit/templates/flows/healthcare-intake-severity-tiers.yaml +0 -103
  314. provekit-0.1.0/provekit/templates/flows/healthcare-intake-summarize-then-decide.yaml +0 -88
  315. provekit-0.1.0/provekit/templates/flows/healthcare-intake-tag-enrich.yaml +0 -43
  316. provekit-0.1.0/provekit/templates/flows/healthcare-intake-tone-rewrite.yaml +0 -43
  317. provekit-0.1.0/provekit/templates/flows/healthcare-intake-translate-reply.yaml +0 -58
  318. provekit-0.1.0/provekit/templates/flows/healthcare-intake-triage-route.yaml +0 -73
  319. provekit-0.1.0/provekit/templates/flows/hr-action-items.yaml +0 -43
  320. provekit-0.1.0/provekit/templates/flows/hr-answer.yaml +0 -43
  321. provekit-0.1.0/provekit/templates/flows/hr-classify-intent.yaml +0 -43
  322. provekit-0.1.0/provekit/templates/flows/hr-draft-critique-revise.yaml +0 -75
  323. provekit-0.1.0/provekit/templates/flows/hr-extract-to-json.yaml +0 -43
  324. provekit-0.1.0/provekit/templates/flows/hr-faq-match-answer.yaml +0 -60
  325. provekit-0.1.0/provekit/templates/flows/hr-keyword-extract.yaml +0 -43
  326. provekit-0.1.0/provekit/templates/flows/hr-language-route.yaml +0 -103
  327. provekit-0.1.0/provekit/templates/flows/hr-moderation-gate.yaml +0 -73
  328. provekit-0.1.0/provekit/templates/flows/hr-redact-summarize.yaml +0 -59
  329. provekit-0.1.0/provekit/templates/flows/hr-score-gate.yaml +0 -73
  330. provekit-0.1.0/provekit/templates/flows/hr-sentiment-route.yaml +0 -73
  331. provekit-0.1.0/provekit/templates/flows/hr-severity-tiers.yaml +0 -103
  332. provekit-0.1.0/provekit/templates/flows/hr-summarize-then-decide.yaml +0 -88
  333. provekit-0.1.0/provekit/templates/flows/hr-tag-enrich.yaml +0 -43
  334. provekit-0.1.0/provekit/templates/flows/hr-tone-rewrite.yaml +0 -43
  335. provekit-0.1.0/provekit/templates/flows/hr-translate-reply.yaml +0 -58
  336. provekit-0.1.0/provekit/templates/flows/hr-triage-route.yaml +0 -73
  337. provekit-0.1.0/provekit/templates/flows/insurance-action-items.yaml +0 -43
  338. provekit-0.1.0/provekit/templates/flows/insurance-answer.yaml +0 -43
  339. provekit-0.1.0/provekit/templates/flows/insurance-classify-intent.yaml +0 -43
  340. provekit-0.1.0/provekit/templates/flows/insurance-draft-critique-revise.yaml +0 -75
  341. provekit-0.1.0/provekit/templates/flows/insurance-extract-to-json.yaml +0 -43
  342. provekit-0.1.0/provekit/templates/flows/insurance-faq-match-answer.yaml +0 -60
  343. provekit-0.1.0/provekit/templates/flows/insurance-keyword-extract.yaml +0 -43
  344. provekit-0.1.0/provekit/templates/flows/insurance-language-route.yaml +0 -103
  345. provekit-0.1.0/provekit/templates/flows/insurance-moderation-gate.yaml +0 -73
  346. provekit-0.1.0/provekit/templates/flows/insurance-redact-summarize.yaml +0 -59
  347. provekit-0.1.0/provekit/templates/flows/insurance-score-gate.yaml +0 -73
  348. provekit-0.1.0/provekit/templates/flows/insurance-sentiment-route.yaml +0 -73
  349. provekit-0.1.0/provekit/templates/flows/insurance-severity-tiers.yaml +0 -103
  350. provekit-0.1.0/provekit/templates/flows/insurance-summarize-then-decide.yaml +0 -88
  351. provekit-0.1.0/provekit/templates/flows/insurance-tag-enrich.yaml +0 -43
  352. provekit-0.1.0/provekit/templates/flows/insurance-tone-rewrite.yaml +0 -43
  353. provekit-0.1.0/provekit/templates/flows/insurance-translate-reply.yaml +0 -58
  354. provekit-0.1.0/provekit/templates/flows/insurance-triage-route.yaml +0 -73
  355. provekit-0.1.0/provekit/templates/flows/it-helpdesk-action-items.yaml +0 -43
  356. provekit-0.1.0/provekit/templates/flows/it-helpdesk-answer.yaml +0 -43
  357. provekit-0.1.0/provekit/templates/flows/it-helpdesk-classify-intent.yaml +0 -43
  358. provekit-0.1.0/provekit/templates/flows/it-helpdesk-draft-critique-revise.yaml +0 -75
  359. provekit-0.1.0/provekit/templates/flows/it-helpdesk-extract-to-json.yaml +0 -43
  360. provekit-0.1.0/provekit/templates/flows/it-helpdesk-faq-match-answer.yaml +0 -60
  361. provekit-0.1.0/provekit/templates/flows/it-helpdesk-keyword-extract.yaml +0 -43
  362. provekit-0.1.0/provekit/templates/flows/it-helpdesk-language-route.yaml +0 -103
  363. provekit-0.1.0/provekit/templates/flows/it-helpdesk-moderation-gate.yaml +0 -73
  364. provekit-0.1.0/provekit/templates/flows/it-helpdesk-redact-summarize.yaml +0 -59
  365. provekit-0.1.0/provekit/templates/flows/it-helpdesk-score-gate.yaml +0 -73
  366. provekit-0.1.0/provekit/templates/flows/it-helpdesk-sentiment-route.yaml +0 -73
  367. provekit-0.1.0/provekit/templates/flows/it-helpdesk-severity-tiers.yaml +0 -103
  368. provekit-0.1.0/provekit/templates/flows/it-helpdesk-summarize-then-decide.yaml +0 -88
  369. provekit-0.1.0/provekit/templates/flows/it-helpdesk-tag-enrich.yaml +0 -43
  370. provekit-0.1.0/provekit/templates/flows/it-helpdesk-tone-rewrite.yaml +0 -43
  371. provekit-0.1.0/provekit/templates/flows/it-helpdesk-translate-reply.yaml +0 -58
  372. provekit-0.1.0/provekit/templates/flows/it-helpdesk-triage-route.yaml +0 -73
  373. provekit-0.1.0/provekit/templates/flows/legal-intake-action-items.yaml +0 -43
  374. provekit-0.1.0/provekit/templates/flows/legal-intake-answer.yaml +0 -43
  375. provekit-0.1.0/provekit/templates/flows/legal-intake-classify-intent.yaml +0 -43
  376. provekit-0.1.0/provekit/templates/flows/legal-intake-draft-critique-revise.yaml +0 -75
  377. provekit-0.1.0/provekit/templates/flows/legal-intake-extract-to-json.yaml +0 -43
  378. provekit-0.1.0/provekit/templates/flows/legal-intake-faq-match-answer.yaml +0 -60
  379. provekit-0.1.0/provekit/templates/flows/legal-intake-keyword-extract.yaml +0 -43
  380. provekit-0.1.0/provekit/templates/flows/legal-intake-language-route.yaml +0 -103
  381. provekit-0.1.0/provekit/templates/flows/legal-intake-moderation-gate.yaml +0 -73
  382. provekit-0.1.0/provekit/templates/flows/legal-intake-redact-summarize.yaml +0 -59
  383. provekit-0.1.0/provekit/templates/flows/legal-intake-score-gate.yaml +0 -73
  384. provekit-0.1.0/provekit/templates/flows/legal-intake-sentiment-route.yaml +0 -73
  385. provekit-0.1.0/provekit/templates/flows/legal-intake-severity-tiers.yaml +0 -103
  386. provekit-0.1.0/provekit/templates/flows/legal-intake-summarize-then-decide.yaml +0 -88
  387. provekit-0.1.0/provekit/templates/flows/legal-intake-tag-enrich.yaml +0 -43
  388. provekit-0.1.0/provekit/templates/flows/legal-intake-tone-rewrite.yaml +0 -43
  389. provekit-0.1.0/provekit/templates/flows/legal-intake-translate-reply.yaml +0 -58
  390. provekit-0.1.0/provekit/templates/flows/legal-intake-triage-route.yaml +0 -73
  391. provekit-0.1.0/provekit/templates/flows/logistics-action-items.yaml +0 -43
  392. provekit-0.1.0/provekit/templates/flows/logistics-answer.yaml +0 -43
  393. provekit-0.1.0/provekit/templates/flows/logistics-classify-intent.yaml +0 -43
  394. provekit-0.1.0/provekit/templates/flows/logistics-draft-critique-revise.yaml +0 -75
  395. provekit-0.1.0/provekit/templates/flows/logistics-extract-to-json.yaml +0 -43
  396. provekit-0.1.0/provekit/templates/flows/logistics-faq-match-answer.yaml +0 -60
  397. provekit-0.1.0/provekit/templates/flows/logistics-keyword-extract.yaml +0 -43
  398. provekit-0.1.0/provekit/templates/flows/logistics-language-route.yaml +0 -103
  399. provekit-0.1.0/provekit/templates/flows/logistics-moderation-gate.yaml +0 -73
  400. provekit-0.1.0/provekit/templates/flows/logistics-redact-summarize.yaml +0 -59
  401. provekit-0.1.0/provekit/templates/flows/logistics-score-gate.yaml +0 -73
  402. provekit-0.1.0/provekit/templates/flows/logistics-sentiment-route.yaml +0 -73
  403. provekit-0.1.0/provekit/templates/flows/logistics-severity-tiers.yaml +0 -103
  404. provekit-0.1.0/provekit/templates/flows/logistics-summarize-then-decide.yaml +0 -88
  405. provekit-0.1.0/provekit/templates/flows/logistics-tag-enrich.yaml +0 -43
  406. provekit-0.1.0/provekit/templates/flows/logistics-tone-rewrite.yaml +0 -43
  407. provekit-0.1.0/provekit/templates/flows/logistics-translate-reply.yaml +0 -58
  408. provekit-0.1.0/provekit/templates/flows/logistics-triage-route.yaml +0 -73
  409. provekit-0.1.0/provekit/templates/flows/marketing-action-items.yaml +0 -43
  410. provekit-0.1.0/provekit/templates/flows/marketing-answer.yaml +0 -43
  411. provekit-0.1.0/provekit/templates/flows/marketing-classify-intent.yaml +0 -43
  412. provekit-0.1.0/provekit/templates/flows/marketing-draft-critique-revise.yaml +0 -75
  413. provekit-0.1.0/provekit/templates/flows/marketing-extract-to-json.yaml +0 -43
  414. provekit-0.1.0/provekit/templates/flows/marketing-faq-match-answer.yaml +0 -60
  415. provekit-0.1.0/provekit/templates/flows/marketing-keyword-extract.yaml +0 -43
  416. provekit-0.1.0/provekit/templates/flows/marketing-language-route.yaml +0 -103
  417. provekit-0.1.0/provekit/templates/flows/marketing-moderation-gate.yaml +0 -73
  418. provekit-0.1.0/provekit/templates/flows/marketing-redact-summarize.yaml +0 -59
  419. provekit-0.1.0/provekit/templates/flows/marketing-score-gate.yaml +0 -73
  420. provekit-0.1.0/provekit/templates/flows/marketing-sentiment-route.yaml +0 -73
  421. provekit-0.1.0/provekit/templates/flows/marketing-severity-tiers.yaml +0 -103
  422. provekit-0.1.0/provekit/templates/flows/marketing-summarize-then-decide.yaml +0 -88
  423. provekit-0.1.0/provekit/templates/flows/marketing-tag-enrich.yaml +0 -43
  424. provekit-0.1.0/provekit/templates/flows/marketing-tone-rewrite.yaml +0 -43
  425. provekit-0.1.0/provekit/templates/flows/marketing-translate-reply.yaml +0 -58
  426. provekit-0.1.0/provekit/templates/flows/marketing-triage-route.yaml +0 -73
  427. provekit-0.1.0/provekit/templates/flows/nonprofit-action-items.yaml +0 -43
  428. provekit-0.1.0/provekit/templates/flows/nonprofit-answer.yaml +0 -43
  429. provekit-0.1.0/provekit/templates/flows/nonprofit-classify-intent.yaml +0 -43
  430. provekit-0.1.0/provekit/templates/flows/nonprofit-draft-critique-revise.yaml +0 -75
  431. provekit-0.1.0/provekit/templates/flows/nonprofit-extract-to-json.yaml +0 -43
  432. provekit-0.1.0/provekit/templates/flows/nonprofit-faq-match-answer.yaml +0 -60
  433. provekit-0.1.0/provekit/templates/flows/nonprofit-keyword-extract.yaml +0 -43
  434. provekit-0.1.0/provekit/templates/flows/nonprofit-language-route.yaml +0 -103
  435. provekit-0.1.0/provekit/templates/flows/nonprofit-moderation-gate.yaml +0 -73
  436. provekit-0.1.0/provekit/templates/flows/nonprofit-redact-summarize.yaml +0 -59
  437. provekit-0.1.0/provekit/templates/flows/nonprofit-score-gate.yaml +0 -73
  438. provekit-0.1.0/provekit/templates/flows/nonprofit-sentiment-route.yaml +0 -73
  439. provekit-0.1.0/provekit/templates/flows/nonprofit-severity-tiers.yaml +0 -103
  440. provekit-0.1.0/provekit/templates/flows/nonprofit-summarize-then-decide.yaml +0 -88
  441. provekit-0.1.0/provekit/templates/flows/nonprofit-tag-enrich.yaml +0 -43
  442. provekit-0.1.0/provekit/templates/flows/nonprofit-tone-rewrite.yaml +0 -43
  443. provekit-0.1.0/provekit/templates/flows/nonprofit-translate-reply.yaml +0 -58
  444. provekit-0.1.0/provekit/templates/flows/nonprofit-triage-route.yaml +0 -73
  445. provekit-0.1.0/provekit/templates/flows/real-estate-action-items.yaml +0 -43
  446. provekit-0.1.0/provekit/templates/flows/real-estate-answer.yaml +0 -43
  447. provekit-0.1.0/provekit/templates/flows/real-estate-classify-intent.yaml +0 -43
  448. provekit-0.1.0/provekit/templates/flows/real-estate-draft-critique-revise.yaml +0 -75
  449. provekit-0.1.0/provekit/templates/flows/real-estate-extract-to-json.yaml +0 -43
  450. provekit-0.1.0/provekit/templates/flows/real-estate-faq-match-answer.yaml +0 -60
  451. provekit-0.1.0/provekit/templates/flows/real-estate-keyword-extract.yaml +0 -43
  452. provekit-0.1.0/provekit/templates/flows/real-estate-language-route.yaml +0 -103
  453. provekit-0.1.0/provekit/templates/flows/real-estate-moderation-gate.yaml +0 -73
  454. provekit-0.1.0/provekit/templates/flows/real-estate-redact-summarize.yaml +0 -59
  455. provekit-0.1.0/provekit/templates/flows/real-estate-score-gate.yaml +0 -73
  456. provekit-0.1.0/provekit/templates/flows/real-estate-sentiment-route.yaml +0 -73
  457. provekit-0.1.0/provekit/templates/flows/real-estate-severity-tiers.yaml +0 -103
  458. provekit-0.1.0/provekit/templates/flows/real-estate-summarize-then-decide.yaml +0 -88
  459. provekit-0.1.0/provekit/templates/flows/real-estate-tag-enrich.yaml +0 -43
  460. provekit-0.1.0/provekit/templates/flows/real-estate-tone-rewrite.yaml +0 -43
  461. provekit-0.1.0/provekit/templates/flows/real-estate-translate-reply.yaml +0 -58
  462. provekit-0.1.0/provekit/templates/flows/real-estate-triage-route.yaml +0 -73
  463. provekit-0.1.0/provekit/templates/flows/recruiting-action-items.yaml +0 -43
  464. provekit-0.1.0/provekit/templates/flows/recruiting-answer.yaml +0 -43
  465. provekit-0.1.0/provekit/templates/flows/recruiting-classify-intent.yaml +0 -43
  466. provekit-0.1.0/provekit/templates/flows/recruiting-draft-critique-revise.yaml +0 -75
  467. provekit-0.1.0/provekit/templates/flows/recruiting-extract-to-json.yaml +0 -43
  468. provekit-0.1.0/provekit/templates/flows/recruiting-faq-match-answer.yaml +0 -60
  469. provekit-0.1.0/provekit/templates/flows/recruiting-keyword-extract.yaml +0 -43
  470. provekit-0.1.0/provekit/templates/flows/recruiting-language-route.yaml +0 -103
  471. provekit-0.1.0/provekit/templates/flows/recruiting-moderation-gate.yaml +0 -73
  472. provekit-0.1.0/provekit/templates/flows/recruiting-redact-summarize.yaml +0 -59
  473. provekit-0.1.0/provekit/templates/flows/recruiting-score-gate.yaml +0 -73
  474. provekit-0.1.0/provekit/templates/flows/recruiting-sentiment-route.yaml +0 -73
  475. provekit-0.1.0/provekit/templates/flows/recruiting-severity-tiers.yaml +0 -103
  476. provekit-0.1.0/provekit/templates/flows/recruiting-summarize-then-decide.yaml +0 -88
  477. provekit-0.1.0/provekit/templates/flows/recruiting-tag-enrich.yaml +0 -43
  478. provekit-0.1.0/provekit/templates/flows/recruiting-tone-rewrite.yaml +0 -43
  479. provekit-0.1.0/provekit/templates/flows/recruiting-translate-reply.yaml +0 -58
  480. provekit-0.1.0/provekit/templates/flows/recruiting-triage-route.yaml +0 -73
  481. provekit-0.1.0/provekit/templates/flows/research-action-items.yaml +0 -43
  482. provekit-0.1.0/provekit/templates/flows/research-answer.yaml +0 -43
  483. provekit-0.1.0/provekit/templates/flows/research-classify-intent.yaml +0 -43
  484. provekit-0.1.0/provekit/templates/flows/research-draft-critique-revise.yaml +0 -75
  485. provekit-0.1.0/provekit/templates/flows/research-extract-to-json.yaml +0 -43
  486. provekit-0.1.0/provekit/templates/flows/research-faq-match-answer.yaml +0 -60
  487. provekit-0.1.0/provekit/templates/flows/research-keyword-extract.yaml +0 -43
  488. provekit-0.1.0/provekit/templates/flows/research-language-route.yaml +0 -103
  489. provekit-0.1.0/provekit/templates/flows/research-moderation-gate.yaml +0 -73
  490. provekit-0.1.0/provekit/templates/flows/research-redact-summarize.yaml +0 -59
  491. provekit-0.1.0/provekit/templates/flows/research-score-gate.yaml +0 -73
  492. provekit-0.1.0/provekit/templates/flows/research-sentiment-route.yaml +0 -73
  493. provekit-0.1.0/provekit/templates/flows/research-severity-tiers.yaml +0 -103
  494. provekit-0.1.0/provekit/templates/flows/research-summarize-then-decide.yaml +0 -88
  495. provekit-0.1.0/provekit/templates/flows/research-tag-enrich.yaml +0 -43
  496. provekit-0.1.0/provekit/templates/flows/research-tone-rewrite.yaml +0 -43
  497. provekit-0.1.0/provekit/templates/flows/research-translate-reply.yaml +0 -58
  498. provekit-0.1.0/provekit/templates/flows/research-triage-route.yaml +0 -73
  499. provekit-0.1.0/provekit/templates/flows/sales-lead-action-items.yaml +0 -43
  500. provekit-0.1.0/provekit/templates/flows/sales-lead-answer.yaml +0 -43
  501. provekit-0.1.0/provekit/templates/flows/sales-lead-classify-intent.yaml +0 -43
  502. provekit-0.1.0/provekit/templates/flows/sales-lead-draft-critique-revise.yaml +0 -75
  503. provekit-0.1.0/provekit/templates/flows/sales-lead-extract-to-json.yaml +0 -43
  504. provekit-0.1.0/provekit/templates/flows/sales-lead-faq-match-answer.yaml +0 -60
  505. provekit-0.1.0/provekit/templates/flows/sales-lead-keyword-extract.yaml +0 -43
  506. provekit-0.1.0/provekit/templates/flows/sales-lead-language-route.yaml +0 -103
  507. provekit-0.1.0/provekit/templates/flows/sales-lead-moderation-gate.yaml +0 -73
  508. provekit-0.1.0/provekit/templates/flows/sales-lead-redact-summarize.yaml +0 -59
  509. provekit-0.1.0/provekit/templates/flows/sales-lead-score-gate.yaml +0 -73
  510. provekit-0.1.0/provekit/templates/flows/sales-lead-sentiment-route.yaml +0 -73
  511. provekit-0.1.0/provekit/templates/flows/sales-lead-severity-tiers.yaml +0 -103
  512. provekit-0.1.0/provekit/templates/flows/sales-lead-summarize-then-decide.yaml +0 -88
  513. provekit-0.1.0/provekit/templates/flows/sales-lead-tag-enrich.yaml +0 -43
  514. provekit-0.1.0/provekit/templates/flows/sales-lead-tone-rewrite.yaml +0 -43
  515. provekit-0.1.0/provekit/templates/flows/sales-lead-translate-reply.yaml +0 -58
  516. provekit-0.1.0/provekit/templates/flows/sales-lead-triage-route.yaml +0 -73
  517. provekit-0.1.0/provekit/templates/flows/travel-action-items.yaml +0 -43
  518. provekit-0.1.0/provekit/templates/flows/travel-answer.yaml +0 -43
  519. provekit-0.1.0/provekit/templates/flows/travel-classify-intent.yaml +0 -43
  520. provekit-0.1.0/provekit/templates/flows/travel-draft-critique-revise.yaml +0 -75
  521. provekit-0.1.0/provekit/templates/flows/travel-extract-to-json.yaml +0 -43
  522. provekit-0.1.0/provekit/templates/flows/travel-faq-match-answer.yaml +0 -60
  523. provekit-0.1.0/provekit/templates/flows/travel-keyword-extract.yaml +0 -43
  524. provekit-0.1.0/provekit/templates/flows/travel-language-route.yaml +0 -103
  525. provekit-0.1.0/provekit/templates/flows/travel-moderation-gate.yaml +0 -73
  526. provekit-0.1.0/provekit/templates/flows/travel-redact-summarize.yaml +0 -59
  527. provekit-0.1.0/provekit/templates/flows/travel-score-gate.yaml +0 -73
  528. provekit-0.1.0/provekit/templates/flows/travel-sentiment-route.yaml +0 -73
  529. provekit-0.1.0/provekit/templates/flows/travel-severity-tiers.yaml +0 -103
  530. provekit-0.1.0/provekit/templates/flows/travel-summarize-then-decide.yaml +0 -88
  531. provekit-0.1.0/provekit/templates/flows/travel-tag-enrich.yaml +0 -43
  532. provekit-0.1.0/provekit/templates/flows/travel-tone-rewrite.yaml +0 -43
  533. provekit-0.1.0/provekit/templates/flows/travel-translate-reply.yaml +0 -58
  534. provekit-0.1.0/provekit/templates/flows/travel-triage-route.yaml +0 -73
  535. provekit-0.1.0/provekit.egg-info/PKG-INFO +0 -86
  536. provekit-0.1.0/provekit.egg-info/SOURCES.txt +0 -516
  537. provekit-0.1.0/provekit.egg-info/entry_points.txt +0 -2
  538. provekit-0.1.0/provekit.egg-info/requires.txt +0 -18
  539. provekit-0.1.0/pyproject.toml +0 -89
  540. provekit-0.1.0/tests/test_a2a.py +0 -81
  541. provekit-0.1.0/tests/test_cli.py +0 -142
  542. provekit-0.1.0/tests/test_connection_secrets.py +0 -108
  543. provekit-0.1.0/tests/test_cov_assertions.py +0 -554
  544. provekit-0.1.0/tests/test_cov_dispatch.py +0 -573
  545. provekit-0.1.0/tests/test_cov_flow.py +0 -606
  546. provekit-0.1.0/tests/test_cov_infra.py +0 -1164
  547. provekit-0.1.0/tests/test_cov_library_run.py +0 -477
  548. provekit-0.1.0/tests/test_cov_llm_mcp.py +0 -660
  549. provekit-0.1.0/tests/test_cov_routers.py +0 -887
  550. provekit-0.1.0/tests/test_deployments.py +0 -156
  551. provekit-0.1.0/tests/test_hardening_extra.py +0 -70
  552. provekit-0.1.0/tests/test_import_export.py +0 -68
  553. provekit-0.1.0/tests/test_limits.py +0 -78
  554. provekit-0.1.0/tests/test_llm_providers.py +0 -174
  555. provekit-0.1.0/tests/test_mcp_client.py +0 -141
  556. provekit-0.1.0/tests/test_runstore.py +0 -64
  557. provekit-0.1.0/tests/test_templates.py +0 -66
  558. provekit-0.1.0/tests/test_tenancy.py +0 -65
  559. provekit-0.1.0/tests/test_testfile.py +0 -68
  560. provekit-0.1.0/tests/test_tooling.py +0 -520
  561. provekit-0.1.0/tests/test_usage.py +0 -27
  562. {provekit-0.1.0 → provekit-0.5.0}/provekit/migrations/env.py +0 -0
  563. {provekit-0.1.0 → provekit-0.5.0}/provekit/migrations/script.py.mako +0 -0
  564. {provekit-0.1.0/provekit → provekit-0.5.0/provekit/routers}/__init__.py +0 -0
  565. {provekit-0.1.0/provekit/routers → provekit-0.5.0/provekit/services}/__init__.py +0 -0
  566. {provekit-0.1.0 → provekit-0.5.0}/provekit/services/auth.py +0 -0
  567. {provekit-0.1.0 → provekit-0.5.0}/provekit/services/email.py +0 -0
  568. {provekit-0.1.0 → provekit-0.5.0}/provekit/services/netguard.py +0 -0
  569. {provekit-0.1.0 → provekit-0.5.0}/provekit.egg-info/dependency_links.txt +0 -0
  570. {provekit-0.1.0 → provekit-0.5.0}/provekit.egg-info/top_level.txt +0 -0
  571. {provekit-0.1.0 → provekit-0.5.0}/setup.cfg +0 -0
  572. {provekit-0.1.0 → provekit-0.5.0}/tests/test_account_recovery.py +0 -0
  573. {provekit-0.1.0 → provekit-0.5.0}/tests/test_auth_hardening.py +0 -0
  574. {provekit-0.1.0 → provekit-0.5.0}/tests/test_observability.py +0 -0
@@ -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
@@ -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 — a generic "Postman for agents": create, run, and debug prompts, MCP tools,
2
- and agent endpoints across any provider."""
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 SessionLocal, init_db
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 auth, connections, deployments, flows, library, prompts, run, runtime, traces, usage
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(connections.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(deployments.router)
104
- app.include_router(runtime.router)
105
- app.include_router(usage.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 ###