@sanity/ailf 0.1.0
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.
- package/README.md +89 -0
- package/bin/ailf.js +64 -0
- package/canonical/grader-references/README.md +88 -0
- package/canonical/grader-references/groq.yaml +234 -0
- package/canonical/grader-references/studio-setup.yaml +275 -0
- package/canonical/reference-solutions/.gitkeep +1 -0
- package/canonical/reference-solutions/frameworks/nuxt.ts +119 -0
- package/canonical/reference-solutions/frameworks/remix.tsx +100 -0
- package/canonical/reference-solutions/functions/publish-webhook.ts +60 -0
- package/canonical/reference-solutions/groq/advanced-filtering.ts +379 -0
- package/canonical/reference-solutions/groq/blog-queries.ts +137 -0
- package/canonical/reference-solutions/groq/joins-references.ts +300 -0
- package/canonical/reference-solutions/nextjs/app-router-integration.tsx +128 -0
- package/canonical/reference-solutions/studio-setup/blog-schema.ts +143 -0
- package/canonical/reference-solutions/studio-setup/custom-tool.tsx +78 -0
- package/canonical/reference-solutions/visual-editing/live-preview.tsx +137 -0
- package/canonical/reference-solutions/visual-editing/presentation-nextjs.tsx +130 -0
- package/config/airbyte/ai_literacy_framework.connector.yaml +639 -0
- package/config/bigquery/README.md +74 -0
- package/config/bigquery/views/area_scores.sql +87 -0
- package/config/bigquery/views/reports.sql +49 -0
- package/config/features.yaml +116 -0
- package/config/models.yaml +115 -0
- package/config/prompts.yaml +75 -0
- package/config/rubrics.yaml +62 -0
- package/config/schedules.yaml +43 -0
- package/config/sinks.yaml +54 -0
- package/config/sources.yaml +51 -0
- package/config/thresholds.yaml +49 -0
- package/dist/_vendor/ailf-core/examples/index.d.ts +190 -0
- package/dist/_vendor/ailf-core/examples/index.js +285 -0
- package/dist/_vendor/ailf-core/index.d.ts +17 -0
- package/dist/_vendor/ailf-core/index.js +17 -0
- package/dist/_vendor/ailf-core/ports/cache-store.d.ts +72 -0
- package/dist/_vendor/ailf-core/ports/cache-store.js +17 -0
- package/dist/_vendor/ailf-core/ports/config-source.d.ts +33 -0
- package/dist/_vendor/ailf-core/ports/config-source.js +15 -0
- package/dist/_vendor/ailf-core/ports/context.d.ts +172 -0
- package/dist/_vendor/ailf-core/ports/context.js +14 -0
- package/dist/_vendor/ailf-core/ports/doc-fetcher.d.ts +131 -0
- package/dist/_vendor/ailf-core/ports/doc-fetcher.js +12 -0
- package/dist/_vendor/ailf-core/ports/eval-runner.d.ts +24 -0
- package/dist/_vendor/ailf-core/ports/eval-runner.js +8 -0
- package/dist/_vendor/ailf-core/ports/index.d.ts +15 -0
- package/dist/_vendor/ailf-core/ports/index.js +7 -0
- package/dist/_vendor/ailf-core/ports/logger.d.ts +36 -0
- package/dist/_vendor/ailf-core/ports/logger.js +11 -0
- package/dist/_vendor/ailf-core/ports/pipeline-step.d.ts +46 -0
- package/dist/_vendor/ailf-core/ports/pipeline-step.js +8 -0
- package/dist/_vendor/ailf-core/ports/task-source.d.ts +159 -0
- package/dist/_vendor/ailf-core/ports/task-source.js +72 -0
- package/dist/_vendor/ailf-core/schemas/callback-payload.d.ts +24 -0
- package/dist/_vendor/ailf-core/schemas/callback-payload.js +29 -0
- package/dist/_vendor/ailf-core/schemas/eval-config.d.ts +55 -0
- package/dist/_vendor/ailf-core/schemas/eval-config.js +78 -0
- package/dist/_vendor/ailf-core/schemas/index.d.ts +16 -0
- package/dist/_vendor/ailf-core/schemas/index.js +16 -0
- package/dist/_vendor/ailf-core/schemas/pipeline-request.d.ts +125 -0
- package/dist/_vendor/ailf-core/schemas/pipeline-request.js +67 -0
- package/dist/_vendor/ailf-core/schemas/pipeline.d.ts +531 -0
- package/dist/_vendor/ailf-core/schemas/pipeline.js +318 -0
- package/dist/_vendor/ailf-core/schemas/schedules.d.ts +68 -0
- package/dist/_vendor/ailf-core/schemas/schedules.js +74 -0
- package/dist/_vendor/ailf-core/schemas/sinks.d.ts +207 -0
- package/dist/_vendor/ailf-core/schemas/sinks.js +108 -0
- package/dist/_vendor/ailf-core/services/comparison-formatters.d.ts +18 -0
- package/dist/_vendor/ailf-core/services/comparison-formatters.js +189 -0
- package/dist/_vendor/ailf-core/services/config-helpers.d.ts +41 -0
- package/dist/_vendor/ailf-core/services/config-helpers.js +86 -0
- package/dist/_vendor/ailf-core/services/index.d.ts +12 -0
- package/dist/_vendor/ailf-core/services/index.js +12 -0
- package/dist/_vendor/ailf-core/services/scoring.d.ts +49 -0
- package/dist/_vendor/ailf-core/services/scoring.js +222 -0
- package/dist/_vendor/ailf-core/types/index.d.ts +1082 -0
- package/dist/_vendor/ailf-core/types/index.js +21 -0
- package/dist/_vendor/ailf-core/types/scoring-input.d.ts +54 -0
- package/dist/_vendor/ailf-core/types/scoring-input.js +9 -0
- package/dist/_vendor/ailf-shared/dimension-names.d.ts +21 -0
- package/dist/_vendor/ailf-shared/dimension-names.js +27 -0
- package/dist/_vendor/ailf-shared/document-ref.d.ts +29 -0
- package/dist/_vendor/ailf-shared/document-ref.js +1 -0
- package/dist/_vendor/ailf-shared/eval-modes.d.ts +12 -0
- package/dist/_vendor/ailf-shared/eval-modes.js +8 -0
- package/dist/_vendor/ailf-shared/index.d.ts +16 -0
- package/dist/_vendor/ailf-shared/index.js +16 -0
- package/dist/_vendor/ailf-shared/noise-threshold.d.ts +9 -0
- package/dist/_vendor/ailf-shared/noise-threshold.js +9 -0
- package/dist/_vendor/ailf-shared/score-grades.d.ts +17 -0
- package/dist/_vendor/ailf-shared/score-grades.js +23 -0
- package/dist/adapters/cache/content-lake-cache.d.ts +24 -0
- package/dist/adapters/cache/content-lake-cache.js +59 -0
- package/dist/adapters/cache/filesystem-cache.d.ts +18 -0
- package/dist/adapters/cache/filesystem-cache.js +54 -0
- package/dist/adapters/cache/index.d.ts +2 -0
- package/dist/adapters/cache/index.js +2 -0
- package/dist/adapters/config-sources/cli-config-adapter.d.ts +17 -0
- package/dist/adapters/config-sources/cli-config-adapter.js +23 -0
- package/dist/adapters/config-sources/file-config-adapter.d.ts +26 -0
- package/dist/adapters/config-sources/file-config-adapter.js +96 -0
- package/dist/adapters/config-sources/index.d.ts +2 -0
- package/dist/adapters/config-sources/index.js +2 -0
- package/dist/adapters/doc-fetchers/index.d.ts +1 -0
- package/dist/adapters/doc-fetchers/index.js +1 -0
- package/dist/adapters/doc-fetchers/sanity-doc-fetcher.d.ts +76 -0
- package/dist/adapters/doc-fetchers/sanity-doc-fetcher.js +620 -0
- package/dist/adapters/eval-runners/index.d.ts +1 -0
- package/dist/adapters/eval-runners/index.js +1 -0
- package/dist/adapters/eval-runners/promptfoo-eval-adapter.d.ts +14 -0
- package/dist/adapters/eval-runners/promptfoo-eval-adapter.js +63 -0
- package/dist/adapters/index.d.ts +12 -0
- package/dist/adapters/index.js +12 -0
- package/dist/adapters/loggers/console-logger.d.ts +22 -0
- package/dist/adapters/loggers/console-logger.js +54 -0
- package/dist/adapters/loggers/index.d.ts +9 -0
- package/dist/adapters/loggers/index.js +9 -0
- package/dist/adapters/loggers/json-logger.d.ts +18 -0
- package/dist/adapters/loggers/json-logger.js +33 -0
- package/dist/adapters/loggers/quiet-logger.d.ts +16 -0
- package/dist/adapters/loggers/quiet-logger.js +30 -0
- package/dist/adapters/task-sources/composite-task-source.d.ts +20 -0
- package/dist/adapters/task-sources/composite-task-source.js +59 -0
- package/dist/adapters/task-sources/content-lake-task-source.d.ts +20 -0
- package/dist/adapters/task-sources/content-lake-task-source.js +219 -0
- package/dist/adapters/task-sources/index.d.ts +7 -0
- package/dist/adapters/task-sources/index.js +7 -0
- package/dist/adapters/task-sources/repo-schemas.d.ts +245 -0
- package/dist/adapters/task-sources/repo-schemas.js +234 -0
- package/dist/adapters/task-sources/repo-task-source.d.ts +22 -0
- package/dist/adapters/task-sources/repo-task-source.js +104 -0
- package/dist/adapters/task-sources/repo-trigger.d.ts +52 -0
- package/dist/adapters/task-sources/repo-trigger.js +153 -0
- package/dist/adapters/task-sources/repo-validation.d.ts +49 -0
- package/dist/adapters/task-sources/repo-validation.js +164 -0
- package/dist/adapters/task-sources/yaml-task-source.d.ts +18 -0
- package/dist/adapters/task-sources/yaml-task-source.js +136 -0
- package/dist/agent-observer/agentic-provider.d.ts +132 -0
- package/dist/agent-observer/agentic-provider.js +983 -0
- package/dist/agent-observer/classifier.d.ts +62 -0
- package/dist/agent-observer/classifier.js +269 -0
- package/dist/agent-observer/index.d.ts +7 -0
- package/dist/agent-observer/index.js +4 -0
- package/dist/agent-observer/pricing.d.ts +35 -0
- package/dist/agent-observer/pricing.js +82 -0
- package/dist/agent-observer/provider.d.ts +77 -0
- package/dist/agent-observer/provider.js +151 -0
- package/dist/agent-observer/proxy.d.ts +91 -0
- package/dist/agent-observer/proxy.js +321 -0
- package/dist/agent-observer/test-imports.d.ts +7 -0
- package/dist/agent-observer/test-imports.js +185 -0
- package/dist/agent-observer/types.d.ts +137 -0
- package/dist/agent-observer/types.js +16 -0
- package/dist/assertions/source-isolation.d.ts +72 -0
- package/dist/assertions/source-isolation.js +117 -0
- package/dist/cli.d.ts +24 -0
- package/dist/cli.js +199 -0
- package/dist/commands/agent-report.d.ts +5 -0
- package/dist/commands/agent-report.js +69 -0
- package/dist/commands/baseline.d.ts +9 -0
- package/dist/commands/baseline.js +141 -0
- package/dist/commands/cache.d.ts +13 -0
- package/dist/commands/cache.js +135 -0
- package/dist/commands/calculate-scores.d.ts +8 -0
- package/dist/commands/calculate-scores.js +48 -0
- package/dist/commands/compare.d.ts +8 -0
- package/dist/commands/compare.js +120 -0
- package/dist/commands/completion.d.ts +18 -0
- package/dist/commands/completion.js +260 -0
- package/dist/commands/coverage-audit.d.ts +7 -0
- package/dist/commands/coverage-audit.js +40 -0
- package/dist/commands/discovery-report.d.ts +10 -0
- package/dist/commands/discovery-report.js +44 -0
- package/dist/commands/eval.d.ts +9 -0
- package/dist/commands/eval.js +35 -0
- package/dist/commands/explain-handler.d.ts +34 -0
- package/dist/commands/explain-handler.js +719 -0
- package/dist/commands/fetch-docs.d.ts +8 -0
- package/dist/commands/fetch-docs.js +128 -0
- package/dist/commands/generate-configs.d.ts +8 -0
- package/dist/commands/generate-configs.js +46 -0
- package/dist/commands/grader/index.d.ts +11 -0
- package/dist/commands/grader/index.js +118 -0
- package/dist/commands/init.d.ts +19 -0
- package/dist/commands/init.js +150 -0
- package/dist/commands/interactive.d.ts +12 -0
- package/dist/commands/interactive.js +238 -0
- package/dist/commands/lookup-doc.d.ts +15 -0
- package/dist/commands/lookup-doc.js +84 -0
- package/dist/commands/measure-retrieval.d.ts +5 -0
- package/dist/commands/measure-retrieval.js +65 -0
- package/dist/commands/pipeline-action.d.ts +71 -0
- package/dist/commands/pipeline-action.js +305 -0
- package/dist/commands/pipeline.d.ts +62 -0
- package/dist/commands/pipeline.js +53 -0
- package/dist/commands/pr-comment.d.ts +8 -0
- package/dist/commands/pr-comment.js +47 -0
- package/dist/commands/publish.d.ts +26 -0
- package/dist/commands/publish.js +253 -0
- package/dist/commands/readiness-report.d.ts +10 -0
- package/dist/commands/readiness-report.js +104 -0
- package/dist/commands/shared/options.d.ts +29 -0
- package/dist/commands/shared/options.js +57 -0
- package/dist/commands/update-quality-scores.d.ts +5 -0
- package/dist/commands/update-quality-scores.js +20 -0
- package/dist/commands/validate-tasks.d.ts +16 -0
- package/dist/commands/validate-tasks.js +93 -0
- package/dist/commands/validate.d.ts +9 -0
- package/dist/commands/validate.js +73 -0
- package/dist/commands/webhook-server.d.ts +5 -0
- package/dist/commands/webhook-server.js +30 -0
- package/dist/commands/weekly-digest.d.ts +10 -0
- package/dist/commands/weekly-digest.js +104 -0
- package/dist/composition-root.d.ts +26 -0
- package/dist/composition-root.js +107 -0
- package/dist/interpolate.d.ts +26 -0
- package/dist/interpolate.js +70 -0
- package/dist/job-store.d.ts +104 -0
- package/dist/job-store.js +188 -0
- package/dist/lib/agent-behavior-report.d.ts +8 -0
- package/dist/lib/agent-behavior-report.js +185 -0
- package/dist/lib/baseline.d.ts +19 -0
- package/dist/lib/baseline.js +153 -0
- package/dist/lib/calculate-scores.d.ts +23 -0
- package/dist/lib/calculate-scores.js +42 -0
- package/dist/lib/compare.d.ts +18 -0
- package/dist/lib/compare.js +170 -0
- package/dist/lib/coverage-audit.d.ts +4 -0
- package/dist/lib/coverage-audit.js +42 -0
- package/dist/lib/discovery-report.d.ts +13 -0
- package/dist/lib/discovery-report.js +57 -0
- package/dist/lib/fetch-docs.d.ts +30 -0
- package/dist/lib/fetch-docs.js +171 -0
- package/dist/lib/generate-configs.d.ts +25 -0
- package/dist/lib/generate-configs.js +42 -0
- package/dist/lib/grader-api.d.ts +21 -0
- package/dist/lib/grader-api.js +34 -0
- package/dist/lib/grader-compare.d.ts +19 -0
- package/dist/lib/grader-compare.js +91 -0
- package/dist/lib/grader-consistency.d.ts +27 -0
- package/dist/lib/grader-consistency.js +79 -0
- package/dist/lib/grader-sensitivity.d.ts +19 -0
- package/dist/lib/grader-sensitivity.js +75 -0
- package/dist/lib/grader-validate.d.ts +19 -0
- package/dist/lib/grader-validate.js +78 -0
- package/dist/lib/measure-retrieval.d.ts +14 -0
- package/dist/lib/measure-retrieval.js +71 -0
- package/dist/lib/pr-comment.d.ts +16 -0
- package/dist/lib/pr-comment.js +28 -0
- package/dist/lib/readiness-report.d.ts +13 -0
- package/dist/lib/readiness-report.js +108 -0
- package/dist/lib/webhook-server.d.ts +11 -0
- package/dist/lib/webhook-server.js +24 -0
- package/dist/lib/weekly-digest.d.ts +24 -0
- package/dist/lib/weekly-digest.js +148 -0
- package/dist/orchestration/build-app-context.d.ts +27 -0
- package/dist/orchestration/build-app-context.js +81 -0
- package/dist/orchestration/build-step-sequence.d.ts +15 -0
- package/dist/orchestration/build-step-sequence.js +84 -0
- package/dist/orchestration/config-to-source-overrides.d.ts +9 -0
- package/dist/orchestration/config-to-source-overrides.js +28 -0
- package/dist/orchestration/env-bridge.d.ts +21 -0
- package/dist/orchestration/env-bridge.js +66 -0
- package/dist/orchestration/index.d.ts +11 -0
- package/dist/orchestration/index.js +11 -0
- package/dist/orchestration/pipeline-orchestrator.d.ts +24 -0
- package/dist/orchestration/pipeline-orchestrator.js +153 -0
- package/dist/orchestration/step-runner.d.ts +20 -0
- package/dist/orchestration/step-runner.js +88 -0
- package/dist/orchestration/steps/calculate-scores-step.d.ts +13 -0
- package/dist/orchestration/steps/calculate-scores-step.js +95 -0
- package/dist/orchestration/steps/callback-step.d.ts +24 -0
- package/dist/orchestration/steps/callback-step.js +76 -0
- package/dist/orchestration/steps/compare-step.d.ts +14 -0
- package/dist/orchestration/steps/compare-step.js +92 -0
- package/dist/orchestration/steps/discovery-report-step.d.ts +13 -0
- package/dist/orchestration/steps/discovery-report-step.js +55 -0
- package/dist/orchestration/steps/fetch-docs-shell.d.ts +17 -0
- package/dist/orchestration/steps/fetch-docs-shell.js +30 -0
- package/dist/orchestration/steps/fetch-docs-step.d.ts +14 -0
- package/dist/orchestration/steps/fetch-docs-step.js +135 -0
- package/dist/orchestration/steps/gap-analysis-step.d.ts +16 -0
- package/dist/orchestration/steps/gap-analysis-step.js +136 -0
- package/dist/orchestration/steps/generate-configs-step.d.ts +14 -0
- package/dist/orchestration/steps/generate-configs-step.js +85 -0
- package/dist/orchestration/steps/grader-consistency-step.d.ts +13 -0
- package/dist/orchestration/steps/grader-consistency-step.js +64 -0
- package/dist/orchestration/steps/index.d.ts +19 -0
- package/dist/orchestration/steps/index.js +19 -0
- package/dist/orchestration/steps/mirror-repo-tasks-step.d.ts +21 -0
- package/dist/orchestration/steps/mirror-repo-tasks-step.js +94 -0
- package/dist/orchestration/steps/publish-report-step.d.ts +26 -0
- package/dist/orchestration/steps/publish-report-step.js +216 -0
- package/dist/orchestration/steps/readiness-step.d.ts +13 -0
- package/dist/orchestration/steps/readiness-step.js +91 -0
- package/dist/orchestration/steps/report-step.d.ts +12 -0
- package/dist/orchestration/steps/report-step.js +49 -0
- package/dist/orchestration/steps/run-eval-step.d.ts +17 -0
- package/dist/orchestration/steps/run-eval-step.js +195 -0
- package/dist/orchestration/steps/validate-step.d.ts +12 -0
- package/dist/orchestration/steps/validate-step.js +41 -0
- package/dist/pipeline/agent-behavior-report.d.ts +53 -0
- package/dist/pipeline/agent-behavior-report.js +132 -0
- package/dist/pipeline/attribution.d.ts +47 -0
- package/dist/pipeline/attribution.js +226 -0
- package/dist/pipeline/baseline.d.ts +37 -0
- package/dist/pipeline/baseline.js +141 -0
- package/dist/pipeline/cache.d.ts +101 -0
- package/dist/pipeline/cache.js +283 -0
- package/dist/pipeline/calculate-scores.d.ts +102 -0
- package/dist/pipeline/calculate-scores.js +1128 -0
- package/dist/pipeline/callback-delivery.d.ts +50 -0
- package/dist/pipeline/callback-delivery.js +89 -0
- package/dist/pipeline/checks.d.ts +39 -0
- package/dist/pipeline/checks.js +280 -0
- package/dist/pipeline/classify-url.d.ts +61 -0
- package/dist/pipeline/classify-url.js +93 -0
- package/dist/pipeline/compare.d.ts +31 -0
- package/dist/pipeline/compare.js +208 -0
- package/dist/pipeline/coverage-audit.d.ts +39 -0
- package/dist/pipeline/coverage-audit.js +165 -0
- package/dist/pipeline/degradations.d.ts +85 -0
- package/dist/pipeline/degradations.js +242 -0
- package/dist/pipeline/discovery-report.d.ts +55 -0
- package/dist/pipeline/discovery-report.js +178 -0
- package/dist/pipeline/eval-constants.d.ts +68 -0
- package/dist/pipeline/eval-constants.js +111 -0
- package/dist/pipeline/eval-fingerprint.d.ts +66 -0
- package/dist/pipeline/eval-fingerprint.js +175 -0
- package/dist/pipeline/expand-tasks.d.ts +220 -0
- package/dist/pipeline/expand-tasks.js +421 -0
- package/dist/pipeline/failure-modes.d.ts +46 -0
- package/dist/pipeline/failure-modes.js +348 -0
- package/dist/pipeline/fetch-url-content.d.ts +44 -0
- package/dist/pipeline/fetch-url-content.js +93 -0
- package/dist/pipeline/gap-analysis.d.ts +48 -0
- package/dist/pipeline/gap-analysis.js +231 -0
- package/dist/pipeline/generate-configs.d.ts +72 -0
- package/dist/pipeline/generate-configs.js +395 -0
- package/dist/pipeline/grader-api.d.ts +49 -0
- package/dist/pipeline/grader-api.js +200 -0
- package/dist/pipeline/grader-compare-runner.d.ts +44 -0
- package/dist/pipeline/grader-compare-runner.js +301 -0
- package/dist/pipeline/grader-comparison.d.ts +111 -0
- package/dist/pipeline/grader-comparison.js +161 -0
- package/dist/pipeline/grader-consistency-runner.d.ts +60 -0
- package/dist/pipeline/grader-consistency-runner.js +270 -0
- package/dist/pipeline/grader-consistency.d.ts +103 -0
- package/dist/pipeline/grader-consistency.js +146 -0
- package/dist/pipeline/grader-sensitivity-runner.d.ts +40 -0
- package/dist/pipeline/grader-sensitivity-runner.js +282 -0
- package/dist/pipeline/grader-sensitivity.d.ts +94 -0
- package/dist/pipeline/grader-sensitivity.js +144 -0
- package/dist/pipeline/grader-validate-runner.d.ts +38 -0
- package/dist/pipeline/grader-validate-runner.js +229 -0
- package/dist/pipeline/grader-validation.d.ts +107 -0
- package/dist/pipeline/grader-validation.js +169 -0
- package/dist/pipeline/map-request-to-config.d.ts +19 -0
- package/dist/pipeline/map-request-to-config.js +80 -0
- package/dist/pipeline/measure-retrieval.d.ts +59 -0
- package/dist/pipeline/measure-retrieval.js +111 -0
- package/dist/pipeline/mirror-repo-tasks.d.ts +86 -0
- package/dist/pipeline/mirror-repo-tasks.js +350 -0
- package/dist/pipeline/plan-format.d.ts +33 -0
- package/dist/pipeline/plan-format.js +202 -0
- package/dist/pipeline/plan.d.ts +169 -0
- package/dist/pipeline/plan.js +708 -0
- package/dist/pipeline/pr-comment.d.ts +19 -0
- package/dist/pipeline/pr-comment.js +502 -0
- package/dist/pipeline/probe.d.ts +52 -0
- package/dist/pipeline/probe.js +390 -0
- package/dist/pipeline/provenance.d.ts +47 -0
- package/dist/pipeline/provenance.js +146 -0
- package/dist/pipeline/readiness-report.d.ts +87 -0
- package/dist/pipeline/readiness-report.js +205 -0
- package/dist/pipeline/release-classification.d.ts +54 -0
- package/dist/pipeline/release-classification.js +238 -0
- package/dist/pipeline/release-report.d.ts +37 -0
- package/dist/pipeline/release-report.js +222 -0
- package/dist/pipeline/repo-eval-comment.d.ts +37 -0
- package/dist/pipeline/repo-eval-comment.js +165 -0
- package/dist/pipeline/repo-threshold-evaluator.d.ts +89 -0
- package/dist/pipeline/repo-threshold-evaluator.js +162 -0
- package/dist/pipeline/resolve-mappings.d.ts +35 -0
- package/dist/pipeline/resolve-mappings.js +72 -0
- package/dist/pipeline/retrieval-metrics.d.ts +39 -0
- package/dist/pipeline/retrieval-metrics.js +136 -0
- package/dist/pipeline/reverse-mapping.d.ts +67 -0
- package/dist/pipeline/reverse-mapping.js +88 -0
- package/dist/pipeline/schemas.d.ts +9 -0
- package/dist/pipeline/schemas.js +9 -0
- package/dist/pipeline/steps/calculate-scores-step.d.ts +11 -0
- package/dist/pipeline/steps/calculate-scores-step.js +89 -0
- package/dist/pipeline/steps/compare-step.d.ts +18 -0
- package/dist/pipeline/steps/compare-step.js +90 -0
- package/dist/pipeline/steps/eval-step.d.ts +53 -0
- package/dist/pipeline/steps/eval-step.js +347 -0
- package/dist/pipeline/steps/fetch-docs-step.d.ts +11 -0
- package/dist/pipeline/steps/fetch-docs-step.js +84 -0
- package/dist/pipeline/steps/generate-configs-step.d.ts +11 -0
- package/dist/pipeline/steps/generate-configs-step.js +98 -0
- package/dist/pipeline/steps/grader-consistency-step.d.ts +21 -0
- package/dist/pipeline/steps/grader-consistency-step.js +74 -0
- package/dist/pipeline/steps/publish-report-step.d.ts +57 -0
- package/dist/pipeline/steps/publish-report-step.js +243 -0
- package/dist/pipeline/steps/report-step.d.ts +13 -0
- package/dist/pipeline/steps/report-step.js +56 -0
- package/dist/pipeline/steps/update-scores-step.d.ts +11 -0
- package/dist/pipeline/steps/update-scores-step.js +42 -0
- package/dist/pipeline/targeted-loo.d.ts +88 -0
- package/dist/pipeline/targeted-loo.js +203 -0
- package/dist/pipeline/thresholds.d.ts +27 -0
- package/dist/pipeline/thresholds.js +245 -0
- package/dist/pipeline/types.d.ts +10 -0
- package/dist/pipeline/types.js +10 -0
- package/dist/pipeline/validate.d.ts +67 -0
- package/dist/pipeline/validate.js +406 -0
- package/dist/pipeline/webhook-server.d.ts +37 -0
- package/dist/pipeline/webhook-server.js +133 -0
- package/dist/report-store.d.ts +84 -0
- package/dist/report-store.js +208 -0
- package/dist/sanity/client.d.ts +38 -0
- package/dist/sanity/client.js +86 -0
- package/dist/sanity/portable-text.d.ts +11 -0
- package/dist/sanity/portable-text.js +211 -0
- package/dist/sanity/queries.d.ts +133 -0
- package/dist/sanity/queries.js +300 -0
- package/dist/schedules/digest.d.ts +116 -0
- package/dist/schedules/digest.js +156 -0
- package/dist/schedules/index.d.ts +12 -0
- package/dist/schedules/index.js +10 -0
- package/dist/schedules/loader.d.ts +31 -0
- package/dist/schedules/loader.js +73 -0
- package/dist/schedules/schema.d.ts +9 -0
- package/dist/schedules/schema.js +9 -0
- package/dist/scripts/agent-behavior-report.d.ts +19 -0
- package/dist/scripts/agent-behavior-report.js +315 -0
- package/dist/scripts/baseline.d.ts +43 -0
- package/dist/scripts/baseline.js +267 -0
- package/dist/scripts/calculate-scores.d.ts +166 -0
- package/dist/scripts/calculate-scores.js +1296 -0
- package/dist/scripts/compare.d.ts +22 -0
- package/dist/scripts/compare.js +334 -0
- package/dist/scripts/coverage-audit.d.ts +44 -0
- package/dist/scripts/coverage-audit.js +209 -0
- package/dist/scripts/debug-eval.d.ts +19 -0
- package/dist/scripts/debug-eval.js +73 -0
- package/dist/scripts/discovery-report.d.ts +58 -0
- package/dist/scripts/discovery-report.js +250 -0
- package/dist/scripts/fetch-docs.d.ts +35 -0
- package/dist/scripts/fetch-docs.js +472 -0
- package/dist/scripts/generate-configs.d.ts +66 -0
- package/dist/scripts/generate-configs.js +459 -0
- package/dist/scripts/grader-api.d.ts +27 -0
- package/dist/scripts/grader-api.js +206 -0
- package/dist/scripts/grader-compare.d.ts +22 -0
- package/dist/scripts/grader-compare.js +368 -0
- package/dist/scripts/grader-consistency.d.ts +20 -0
- package/dist/scripts/grader-consistency.js +313 -0
- package/dist/scripts/grader-sensitivity.d.ts +22 -0
- package/dist/scripts/grader-sensitivity.js +354 -0
- package/dist/scripts/grader-validate.d.ts +19 -0
- package/dist/scripts/grader-validate.js +267 -0
- package/dist/scripts/measure-retrieval.d.ts +10 -0
- package/dist/scripts/measure-retrieval.js +145 -0
- package/dist/scripts/migrate-tasks-to-content-lake.d.ts +24 -0
- package/dist/scripts/migrate-tasks-to-content-lake.js +327 -0
- package/dist/scripts/pipeline.d.ts +76 -0
- package/dist/scripts/pipeline.js +1031 -0
- package/dist/scripts/pr-comment.d.ts +10 -0
- package/dist/scripts/pr-comment.js +510 -0
- package/dist/scripts/readiness-report.d.ts +88 -0
- package/dist/scripts/readiness-report.js +342 -0
- package/dist/scripts/update-quality-scores.d.ts +15 -0
- package/dist/scripts/update-quality-scores.js +184 -0
- package/dist/scripts/validate-task-sources.d.ts +21 -0
- package/dist/scripts/validate-task-sources.js +210 -0
- package/dist/scripts/validate.d.ts +13 -0
- package/dist/scripts/validate.js +79 -0
- package/dist/scripts/webhook-server.d.ts +26 -0
- package/dist/scripts/webhook-server.js +147 -0
- package/dist/scripts/weekly-digest.d.ts +24 -0
- package/dist/scripts/weekly-digest.js +144 -0
- package/dist/sinks/bigquery/index.d.ts +131 -0
- package/dist/sinks/bigquery/index.js +222 -0
- package/dist/sinks/format-slack.d.ts +64 -0
- package/dist/sinks/format-slack.js +306 -0
- package/dist/sinks/index.d.ts +23 -0
- package/dist/sinks/index.js +18 -0
- package/dist/sinks/loader.d.ts +18 -0
- package/dist/sinks/loader.js +82 -0
- package/dist/sinks/retry.d.ts +24 -0
- package/dist/sinks/retry.js +52 -0
- package/dist/sinks/schema.d.ts +9 -0
- package/dist/sinks/schema.js +9 -0
- package/dist/sinks/slack/format.d.ts +65 -0
- package/dist/sinks/slack/format.js +327 -0
- package/dist/sinks/slack/index.d.ts +27 -0
- package/dist/sinks/slack/index.js +78 -0
- package/dist/sinks/slack-sink.d.ts +27 -0
- package/dist/sinks/slack-sink.js +78 -0
- package/dist/sinks/types.d.ts +59 -0
- package/dist/sinks/types.js +44 -0
- package/dist/sinks/webhook/index.d.ts +19 -0
- package/dist/sinks/webhook/index.js +50 -0
- package/dist/sinks/webhook-sink.d.ts +19 -0
- package/dist/sinks/webhook-sink.js +50 -0
- package/dist/sources.d.ts +104 -0
- package/dist/sources.js +292 -0
- package/dist/webhook/budget.d.ts +42 -0
- package/dist/webhook/budget.js +60 -0
- package/dist/webhook/debounce.d.ts +67 -0
- package/dist/webhook/debounce.js +76 -0
- package/dist/webhook/dispatch.d.ts +45 -0
- package/dist/webhook/dispatch.js +84 -0
- package/dist/webhook/eval-request-handler.d.ts +87 -0
- package/dist/webhook/eval-request-handler.js +181 -0
- package/dist/webhook/handler.d.ts +88 -0
- package/dist/webhook/handler.js +203 -0
- package/dist/webhook/index.d.ts +17 -0
- package/dist/webhook/index.js +12 -0
- package/dist/webhook/types.d.ts +109 -0
- package/dist/webhook/types.js +10 -0
- package/package.json +72 -0
- package/tasks/.expanded.agentic.yaml +51 -0
- package/tasks/.expanded.yaml +66 -0
- package/tasks/frameworks.yaml +98 -0
- package/tasks/functions.yaml +51 -0
- package/tasks/groq.yaml +216 -0
- package/tasks/nextjs-live.yaml +62 -0
- package/tasks/studio-setup.yaml +111 -0
- package/tasks/visual-editing.yaml +120 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* classifier.ts
|
|
3
|
+
*
|
|
4
|
+
* Classifies raw ObservedRequest records into meaningful categories:
|
|
5
|
+
* - Doc page visits (sanity.io/docs/*)
|
|
6
|
+
* - Search queries (search endpoints, query params)
|
|
7
|
+
* - Sanity API calls (api.sanity.io, apicdn.sanity.io)
|
|
8
|
+
* - External requests (everything else)
|
|
9
|
+
*
|
|
10
|
+
* Also extracts metadata like doc slugs, search query text, and page titles.
|
|
11
|
+
*/
|
|
12
|
+
import type { ObservedRequest, DocPageVisit, SearchQuery, ApiCall, ExternalRequest } from "./types.js";
|
|
13
|
+
export interface ClassifiedRequests {
|
|
14
|
+
apiCalls: ApiCall[];
|
|
15
|
+
docPageVisits: DocPageVisit[];
|
|
16
|
+
externalRequests: ExternalRequest[];
|
|
17
|
+
searchQueries: SearchQuery[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Classifies an array of raw observed requests into categorized buckets.
|
|
21
|
+
*/
|
|
22
|
+
export declare function classifyRequests(requests: ObservedRequest[]): ClassifiedRequests;
|
|
23
|
+
/**
|
|
24
|
+
* Extracts the API endpoint path from a Sanity API URL.
|
|
25
|
+
*
|
|
26
|
+
* Example:
|
|
27
|
+
* https://api.sanity.io/v2021-03-25/data/query/production → "/data/query/production"
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractApiEndpoint(url: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Extracts the doc slug from a sanity.io/docs URL.
|
|
32
|
+
*
|
|
33
|
+
* Examples:
|
|
34
|
+
* https://www.sanity.io/docs/groq-introduction → "groq-introduction"
|
|
35
|
+
* https://www.sanity.io/docs/getting-started/create-a-schema → "getting-started/create-a-schema"
|
|
36
|
+
* https://www.sanity.io/docs → "" (root docs page)
|
|
37
|
+
*/
|
|
38
|
+
export declare function extractDocSlug(url: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Extracts the domain from a URL.
|
|
41
|
+
*/
|
|
42
|
+
export declare function extractDomain(url: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Attempts to extract a page title from an HTML response preview.
|
|
45
|
+
*/
|
|
46
|
+
export declare function extractPageTitle(responsePreview?: string): string | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Extracts a search query string from a URL or request body.
|
|
49
|
+
*/
|
|
50
|
+
export declare function extractSearchQuery(req: ObservedRequest): string;
|
|
51
|
+
/**
|
|
52
|
+
* Determines if a request is to a Sanity documentation page.
|
|
53
|
+
*/
|
|
54
|
+
export declare function isDocPageRequest(req: ObservedRequest): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Determines if a request is to the Sanity API (not docs).
|
|
57
|
+
*/
|
|
58
|
+
export declare function isSanityApiRequest(req: ObservedRequest): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Determines if a request is a search operation.
|
|
61
|
+
*/
|
|
62
|
+
export declare function isSearchRequest(req: ObservedRequest): boolean;
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* classifier.ts
|
|
3
|
+
*
|
|
4
|
+
* Classifies raw ObservedRequest records into meaningful categories:
|
|
5
|
+
* - Doc page visits (sanity.io/docs/*)
|
|
6
|
+
* - Search queries (search endpoints, query params)
|
|
7
|
+
* - Sanity API calls (api.sanity.io, apicdn.sanity.io)
|
|
8
|
+
* - External requests (everything else)
|
|
9
|
+
*
|
|
10
|
+
* Also extracts metadata like doc slugs, search query text, and page titles.
|
|
11
|
+
*/
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Zod schemas for parsed JSON bodies (search request payloads)
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Single search request item (e.g., Algolia multi-index entry) */
|
|
17
|
+
const SearchRequestItemSchema = z.object({
|
|
18
|
+
params: z.string().optional(),
|
|
19
|
+
query: z.string().optional(),
|
|
20
|
+
});
|
|
21
|
+
/** Search body payload — covers Algolia single-query, params-based, and multi-index formats */
|
|
22
|
+
const SearchBodySchema = z.object({
|
|
23
|
+
params: z.string().optional(),
|
|
24
|
+
query: z.string().optional(),
|
|
25
|
+
requests: z.array(SearchRequestItemSchema).optional(),
|
|
26
|
+
});
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// URL pattern matchers
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
/** Matches sanity.io documentation pages */
|
|
31
|
+
const SANITY_DOCS_PATTERN = /^https?:\/\/(r\.jina\.ai\/https?:\/\/)?(www\.)?sanity\.io\/docs(\/[^?#]*)?/;
|
|
32
|
+
/** Matches Sanity API endpoints */
|
|
33
|
+
const SANITY_API_PATTERN = /^https?:\/\/(api|apicdn|cdn)\.sanity\.io/;
|
|
34
|
+
/** Matches sanity.io non-docs pages (blog, plugins, etc.) — including via proxies */
|
|
35
|
+
const SANITY_SITE_PATTERN = /^https?:\/\/(r\.jina\.ai\/https?:\/\/)?(www\.)?sanity\.io/;
|
|
36
|
+
/** Common search endpoint patterns */
|
|
37
|
+
const SEARCH_PATTERNS = [
|
|
38
|
+
// Sanity docs search (Algolia, custom, etc.)
|
|
39
|
+
/sanity\.io\/docs.*[?&](q|query|search)=/i,
|
|
40
|
+
/sanity\.io\/api\/search/i,
|
|
41
|
+
/sanity\.io\/search/i,
|
|
42
|
+
// Algolia search (used by many doc sites)
|
|
43
|
+
/algolia(net)?\.com.*\/quer(y|ies)/i,
|
|
44
|
+
/algolia(net)?\.com.*\/search/i,
|
|
45
|
+
// Google / Bing / DuckDuckGo
|
|
46
|
+
/google\.com\/search/i,
|
|
47
|
+
/bing\.com\/search/i,
|
|
48
|
+
/duckduckgo\.com/i,
|
|
49
|
+
// Jina Reader proxied search URLs
|
|
50
|
+
/r\.jina\.ai\/https?:\/\/(www\.)?duckduckgo\.com/i,
|
|
51
|
+
/r\.jina\.ai\/https?:\/\/(www\.)?google\.com\/search/i,
|
|
52
|
+
/r\.jina\.ai\/https?:\/\/(www\.)?bing\.com\/search/i,
|
|
53
|
+
];
|
|
54
|
+
/**
|
|
55
|
+
* Classifies an array of raw observed requests into categorized buckets.
|
|
56
|
+
*/
|
|
57
|
+
export function classifyRequests(requests) {
|
|
58
|
+
const result = {
|
|
59
|
+
apiCalls: [],
|
|
60
|
+
docPageVisits: [],
|
|
61
|
+
externalRequests: [],
|
|
62
|
+
searchQueries: [],
|
|
63
|
+
};
|
|
64
|
+
for (const req of requests) {
|
|
65
|
+
// Skip failed requests (no response)
|
|
66
|
+
if (req.statusCode === 0)
|
|
67
|
+
continue;
|
|
68
|
+
// Order matters: API calls first (they may have ?query= params that look like searches),
|
|
69
|
+
// then searches, then doc pages, then external
|
|
70
|
+
if (isSanityApiRequest(req)) {
|
|
71
|
+
result.apiCalls.push({
|
|
72
|
+
endpoint: extractApiEndpoint(req.url),
|
|
73
|
+
method: req.method,
|
|
74
|
+
timestamp: req.timestamp,
|
|
75
|
+
url: req.url,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else if (isSearchRequest(req)) {
|
|
79
|
+
result.searchQueries.push({
|
|
80
|
+
query: extractSearchQuery(req),
|
|
81
|
+
timestamp: req.timestamp,
|
|
82
|
+
url: req.url,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
else if (isDocPageRequest(req)) {
|
|
86
|
+
const slug = extractDocSlug(req.url);
|
|
87
|
+
result.docPageVisits.push({
|
|
88
|
+
contentSize: req.responseSize,
|
|
89
|
+
slug,
|
|
90
|
+
timestamp: req.timestamp,
|
|
91
|
+
title: extractPageTitle(req.responsePreview),
|
|
92
|
+
url: req.url,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else if (!SANITY_SITE_PATTERN.test(req.url)) {
|
|
96
|
+
// External request (not on sanity.io at all)
|
|
97
|
+
result.externalRequests.push({
|
|
98
|
+
domain: extractDomain(req.url),
|
|
99
|
+
method: req.method,
|
|
100
|
+
timestamp: req.timestamp,
|
|
101
|
+
url: req.url,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
// else: sanity.io non-docs page — we track it in raw requests but don't classify it
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Extracts the API endpoint path from a Sanity API URL.
|
|
110
|
+
*
|
|
111
|
+
* Example:
|
|
112
|
+
* https://api.sanity.io/v2021-03-25/data/query/production → "/data/query/production"
|
|
113
|
+
*/
|
|
114
|
+
export function extractApiEndpoint(url) {
|
|
115
|
+
const match = url.match(/sanity\.io\/(v[\d-]+)?(.*)/);
|
|
116
|
+
if (!match)
|
|
117
|
+
return new URL(url).pathname;
|
|
118
|
+
return match[2] || "/";
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Extracts the doc slug from a sanity.io/docs URL.
|
|
122
|
+
*
|
|
123
|
+
* Examples:
|
|
124
|
+
* https://www.sanity.io/docs/groq-introduction → "groq-introduction"
|
|
125
|
+
* https://www.sanity.io/docs/getting-started/create-a-schema → "getting-started/create-a-schema"
|
|
126
|
+
* https://www.sanity.io/docs → "" (root docs page)
|
|
127
|
+
*/
|
|
128
|
+
export function extractDocSlug(url) {
|
|
129
|
+
const match = url.match(/sanity\.io\/docs\/([^?#]+)/);
|
|
130
|
+
if (!match)
|
|
131
|
+
return "";
|
|
132
|
+
// Remove trailing slash and .md extension
|
|
133
|
+
return match[1].replace(/\/$/, "").replace(/\.md$/, "");
|
|
134
|
+
}
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
// Metadata extractors
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
/**
|
|
139
|
+
* Extracts the domain from a URL.
|
|
140
|
+
*/
|
|
141
|
+
export function extractDomain(url) {
|
|
142
|
+
try {
|
|
143
|
+
return new URL(url).hostname;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
const match = url.match(/https?:\/\/([^/?#]+)/);
|
|
147
|
+
return match ? match[1] : "unknown";
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Attempts to extract a page title from an HTML response preview.
|
|
152
|
+
*/
|
|
153
|
+
export function extractPageTitle(responsePreview) {
|
|
154
|
+
if (!responsePreview)
|
|
155
|
+
return undefined;
|
|
156
|
+
const match = responsePreview.match(/<title[^>]*>([^<]+)<\/title>/i);
|
|
157
|
+
return match ? match[1].trim() : undefined;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Extracts a search query string from a URL or request body.
|
|
161
|
+
*/
|
|
162
|
+
export function extractSearchQuery(req) {
|
|
163
|
+
// Handle Jina-proxied URLs by extracting the inner URL's query params
|
|
164
|
+
// e.g., https://r.jina.ai/https://duckduckgo.com/?q=sanity+schema
|
|
165
|
+
let searchUrl = req.url;
|
|
166
|
+
const jinaMatch = req.url.match(/r\.jina\.ai\/(https?:\/\/.+)/);
|
|
167
|
+
if (jinaMatch) {
|
|
168
|
+
searchUrl = jinaMatch[1];
|
|
169
|
+
}
|
|
170
|
+
// Try URL query parameters first
|
|
171
|
+
try {
|
|
172
|
+
const urlObj = new URL(searchUrl);
|
|
173
|
+
for (const param of ["q", "query", "search", "s"]) {
|
|
174
|
+
const value = urlObj.searchParams.get(param);
|
|
175
|
+
if (value)
|
|
176
|
+
return value;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Invalid URL — try regex fallback
|
|
181
|
+
const match = req.url.match(/[?&](q|query|search|s)=([^&]+)/);
|
|
182
|
+
if (match)
|
|
183
|
+
return decodeURIComponent(match[2]);
|
|
184
|
+
}
|
|
185
|
+
// Try request body (for POST search requests like Algolia)
|
|
186
|
+
if (req.body) {
|
|
187
|
+
try {
|
|
188
|
+
const bodyObj = SearchBodySchema.parse(JSON.parse(req.body));
|
|
189
|
+
// Algolia format
|
|
190
|
+
if (bodyObj.query)
|
|
191
|
+
return bodyObj.query;
|
|
192
|
+
if (bodyObj.params) {
|
|
193
|
+
const params = new URLSearchParams(bodyObj.params);
|
|
194
|
+
const q = params.get("query");
|
|
195
|
+
if (q)
|
|
196
|
+
return q;
|
|
197
|
+
}
|
|
198
|
+
// Array of requests (Algolia multi-index)
|
|
199
|
+
if (bodyObj.requests) {
|
|
200
|
+
const queries = bodyObj.requests
|
|
201
|
+
.map((r) => {
|
|
202
|
+
if (r.query)
|
|
203
|
+
return r.query;
|
|
204
|
+
if (r.params) {
|
|
205
|
+
const p = new URLSearchParams(r.params);
|
|
206
|
+
return p.get("query");
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
})
|
|
210
|
+
.filter(Boolean);
|
|
211
|
+
if (queries.length > 0)
|
|
212
|
+
return queries.join("; ");
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// Not JSON — ignore
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return "";
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Determines if a request is to a Sanity documentation page.
|
|
223
|
+
*/
|
|
224
|
+
export function isDocPageRequest(req) {
|
|
225
|
+
return (SANITY_DOCS_PATTERN.test(req.url) &&
|
|
226
|
+
!isSearchRequest(req) &&
|
|
227
|
+
req.method === "GET" &&
|
|
228
|
+
// Filter out static assets
|
|
229
|
+
!isStaticAsset(req.url));
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Determines if a request is to the Sanity API (not docs).
|
|
233
|
+
*/
|
|
234
|
+
export function isSanityApiRequest(req) {
|
|
235
|
+
return SANITY_API_PATTERN.test(req.url);
|
|
236
|
+
}
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// Full classification pipeline
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
/**
|
|
241
|
+
* Determines if a request is a search operation.
|
|
242
|
+
*/
|
|
243
|
+
export function isSearchRequest(req) {
|
|
244
|
+
// Exclude Sanity API calls — they may have ?query= params (GROQ)
|
|
245
|
+
if (SANITY_API_PATTERN.test(req.url))
|
|
246
|
+
return false;
|
|
247
|
+
// Check URL against search patterns
|
|
248
|
+
if (SEARCH_PATTERNS.some((p) => p.test(req.url)))
|
|
249
|
+
return true;
|
|
250
|
+
// Check POST body for search-like payloads (Algolia, etc.)
|
|
251
|
+
if (req.method === "POST" && req.body) {
|
|
252
|
+
try {
|
|
253
|
+
const bodyObj = SearchBodySchema.safeParse(JSON.parse(req.body));
|
|
254
|
+
if (bodyObj.success && (bodyObj.data.query || bodyObj.data.requests))
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
/* not JSON */
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Determines if a URL points to a static asset (JS, CSS, images, fonts).
|
|
265
|
+
*/
|
|
266
|
+
function isStaticAsset(url) {
|
|
267
|
+
const assetExtensions = /\.(js|css|png|jpg|jpeg|gif|svg|ico|woff2?|ttf|eot|map)(\?|$)/i;
|
|
268
|
+
return assetExtensions.test(url);
|
|
269
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { classifyRequests, extractDocSlug, extractSearchQuery, extractApiEndpoint, extractDomain, extractPageTitle, isDocPageRequest, isSearchRequest, isSanityApiRequest, } from "./classifier.js";
|
|
2
|
+
export type { ClassifiedRequests } from "./classifier.js";
|
|
3
|
+
export { calculateCost, formatCost, lookupPricing } from "./pricing.js";
|
|
4
|
+
export { default as InstrumentedProvider } from "./provider.js";
|
|
5
|
+
export { RequestRecorder } from "./proxy.js";
|
|
6
|
+
export type { RecorderOptions } from "./proxy.js";
|
|
7
|
+
export type { ObservedRequest, DocPageVisit, SearchQuery, ApiCall, ExternalRequest, AgentBehaviorLog, AgentBehaviorSummary, } from "./types.js";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { classifyRequests, extractDocSlug, extractSearchQuery, extractApiEndpoint, extractDomain, extractPageTitle, isDocPageRequest, isSearchRequest, isSanityApiRequest, } from "./classifier.js";
|
|
2
|
+
export { calculateCost, formatCost, lookupPricing } from "./pricing.js";
|
|
3
|
+
export { default as InstrumentedProvider } from "./provider.js";
|
|
4
|
+
export { RequestRecorder } from "./proxy.js";
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pricing.ts
|
|
3
|
+
*
|
|
4
|
+
* Model pricing lookup and cost calculation for OpenAI and Anthropic models.
|
|
5
|
+
* Used by custom providers (agentic, instrumented) to calculate
|
|
6
|
+
* per-request cost from token counts.
|
|
7
|
+
*
|
|
8
|
+
* Prices are per-token (not per-million) for simpler arithmetic.
|
|
9
|
+
* Source: https://openai.com/api/pricing/ and https://docs.anthropic.com/en/docs/about-claude/models
|
|
10
|
+
*/
|
|
11
|
+
interface ModelPricing {
|
|
12
|
+
/** Cost per input/prompt token */
|
|
13
|
+
input: number;
|
|
14
|
+
/** Cost per output/completion token */
|
|
15
|
+
output: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Calculate the cost in USD for a given model and token usage.
|
|
19
|
+
* Returns 0 if the model is not in the pricing table.
|
|
20
|
+
*/
|
|
21
|
+
export declare function calculateCost(model: string, promptTokens: number, completionTokens: number): number;
|
|
22
|
+
/**
|
|
23
|
+
* Format a cost value as a human-readable USD string.
|
|
24
|
+
* - Under $0.01: shows 4 decimal places (e.g., "$0.0023")
|
|
25
|
+
* - Under $1: shows 2 decimal places (e.g., "$0.45")
|
|
26
|
+
* - $1+: shows 2 decimal places (e.g., "$12.50")
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatCost(cost: number): string;
|
|
29
|
+
/**
|
|
30
|
+
* Look up pricing for a model. Supports exact matches and prefix
|
|
31
|
+
* matching (e.g., "gpt-4o-2024-08-06" matches "gpt-4o").
|
|
32
|
+
* Returns undefined if no pricing is found.
|
|
33
|
+
*/
|
|
34
|
+
export declare function lookupPricing(model: string): ModelPricing | undefined;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pricing.ts
|
|
3
|
+
*
|
|
4
|
+
* Model pricing lookup and cost calculation for OpenAI and Anthropic models.
|
|
5
|
+
* Used by custom providers (agentic, instrumented) to calculate
|
|
6
|
+
* per-request cost from token counts.
|
|
7
|
+
*
|
|
8
|
+
* Prices are per-token (not per-million) for simpler arithmetic.
|
|
9
|
+
* Source: https://openai.com/api/pricing/ and https://docs.anthropic.com/en/docs/about-claude/models
|
|
10
|
+
*/
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Pricing table
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
/**
|
|
15
|
+
* Per-token pricing for supported models.
|
|
16
|
+
* Prices are in USD. Update when providers change pricing or new models
|
|
17
|
+
* are added to models.yaml.
|
|
18
|
+
*/
|
|
19
|
+
// Source: https://openai.com/api/pricing/ and https://docs.anthropic.com/en/docs/about-claude/models
|
|
20
|
+
const MODEL_PRICING = {
|
|
21
|
+
// Anthropic models
|
|
22
|
+
"claude-3.5-sonnet-20241022": {
|
|
23
|
+
input: 3 / 1_000_000,
|
|
24
|
+
output: 15 / 1_000_000,
|
|
25
|
+
},
|
|
26
|
+
"claude-opus-4-5-20251101": { input: 15 / 1_000_000, output: 75 / 1_000_000 },
|
|
27
|
+
"claude-opus-4-6": { input: 15 / 1_000_000, output: 75 / 1_000_000 },
|
|
28
|
+
"claude-sonnet-4-20250514": { input: 3 / 1_000_000, output: 15 / 1_000_000 },
|
|
29
|
+
// OpenAI models
|
|
30
|
+
"gpt-4-turbo": { input: 10 / 1_000_000, output: 30 / 1_000_000 },
|
|
31
|
+
"gpt-4.1": { input: 2 / 1_000_000, output: 8 / 1_000_000 },
|
|
32
|
+
"gpt-4.1-mini": { input: 0.4 / 1_000_000, output: 1.6 / 1_000_000 },
|
|
33
|
+
"gpt-4.1-nano": { input: 0.1 / 1_000_000, output: 0.4 / 1_000_000 },
|
|
34
|
+
"gpt-4o": { input: 2.5 / 1_000_000, output: 10 / 1_000_000 },
|
|
35
|
+
"gpt-4o-mini": { input: 0.15 / 1_000_000, output: 0.6 / 1_000_000 },
|
|
36
|
+
"gpt-5-2025-08-07": { input: 10 / 1_000_000, output: 30 / 1_000_000 },
|
|
37
|
+
"gpt-5.2": { input: 2 / 1_000_000, output: 8 / 1_000_000 },
|
|
38
|
+
"gpt-5.4": { input: 2 / 1_000_000, output: 8 / 1_000_000 },
|
|
39
|
+
"o3-mini": { input: 1.1 / 1_000_000, output: 4.4 / 1_000_000 },
|
|
40
|
+
};
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Public API
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
/**
|
|
45
|
+
* Calculate the cost in USD for a given model and token usage.
|
|
46
|
+
* Returns 0 if the model is not in the pricing table.
|
|
47
|
+
*/
|
|
48
|
+
export function calculateCost(model, promptTokens, completionTokens) {
|
|
49
|
+
const pricing = lookupPricing(model);
|
|
50
|
+
if (!pricing)
|
|
51
|
+
return 0;
|
|
52
|
+
return pricing.input * promptTokens + pricing.output * completionTokens;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Format a cost value as a human-readable USD string.
|
|
56
|
+
* - Under $0.01: shows 4 decimal places (e.g., "$0.0023")
|
|
57
|
+
* - Under $1: shows 2 decimal places (e.g., "$0.45")
|
|
58
|
+
* - $1+: shows 2 decimal places (e.g., "$12.50")
|
|
59
|
+
*/
|
|
60
|
+
export function formatCost(cost) {
|
|
61
|
+
if (cost === 0)
|
|
62
|
+
return "$0.00";
|
|
63
|
+
if (cost < 0.01)
|
|
64
|
+
return `$${cost.toFixed(4)}`;
|
|
65
|
+
return `$${cost.toFixed(2)}`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Look up pricing for a model. Supports exact matches and prefix
|
|
69
|
+
* matching (e.g., "gpt-4o-2024-08-06" matches "gpt-4o").
|
|
70
|
+
* Returns undefined if no pricing is found.
|
|
71
|
+
*/
|
|
72
|
+
export function lookupPricing(model) {
|
|
73
|
+
// Exact match first
|
|
74
|
+
if (MODEL_PRICING[model])
|
|
75
|
+
return MODEL_PRICING[model];
|
|
76
|
+
// Prefix match: "gpt-4o-2024-08-06" → "gpt-4o"
|
|
77
|
+
for (const [key, pricing] of Object.entries(MODEL_PRICING)) {
|
|
78
|
+
if (model.startsWith(key))
|
|
79
|
+
return pricing;
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* provider.ts
|
|
3
|
+
*
|
|
4
|
+
* Instrumented Promptfoo custom provider that wraps any underlying LLM
|
|
5
|
+
* provider and records all HTTP activity the agent performs during a task.
|
|
6
|
+
*
|
|
7
|
+
* This is the integration point between the observation infrastructure
|
|
8
|
+
* (RequestRecorder) and Promptfoo's evaluation pipeline. It:
|
|
9
|
+
*
|
|
10
|
+
* 1. Starts a recording session before the LLM call
|
|
11
|
+
* 2. Delegates to the real provider (calls OpenAI directly)
|
|
12
|
+
* 3. Stops recording and attaches the AgentBehaviorLog to
|
|
13
|
+
* ProviderResponse.metadata so it flows through scoring
|
|
14
|
+
*
|
|
15
|
+
* Promptfoo config usage:
|
|
16
|
+
*
|
|
17
|
+
* providers:
|
|
18
|
+
* - id: file://src/agent-observer/provider.ts
|
|
19
|
+
* label: "gpt-4o (observed)"
|
|
20
|
+
* config:
|
|
21
|
+
* model: gpt-4o
|
|
22
|
+
* temperature: 0
|
|
23
|
+
* max_tokens: 4096
|
|
24
|
+
* observe: true
|
|
25
|
+
* observerOptions:
|
|
26
|
+
* maxPreviewBytes: 2048
|
|
27
|
+
* captureResponsePreview: true
|
|
28
|
+
*
|
|
29
|
+
* Promptfoo loads this file and instantiates the default export class.
|
|
30
|
+
*/
|
|
31
|
+
import { RequestRecorder } from "./proxy.js";
|
|
32
|
+
interface CallApiContextParams {
|
|
33
|
+
prompt?: {
|
|
34
|
+
raw: string;
|
|
35
|
+
label?: string;
|
|
36
|
+
};
|
|
37
|
+
vars?: Record<string, object | string>;
|
|
38
|
+
}
|
|
39
|
+
interface ProviderOptions {
|
|
40
|
+
config?: Record<string, unknown>;
|
|
41
|
+
id?: string;
|
|
42
|
+
}
|
|
43
|
+
interface ProviderResponse {
|
|
44
|
+
cached?: boolean;
|
|
45
|
+
cost?: number;
|
|
46
|
+
error?: string;
|
|
47
|
+
metadata?: Record<string, unknown>;
|
|
48
|
+
output?: object | string;
|
|
49
|
+
tokenUsage?: {
|
|
50
|
+
total?: number;
|
|
51
|
+
prompt?: number;
|
|
52
|
+
completion?: number;
|
|
53
|
+
cached?: number;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export default class InstrumentedProvider {
|
|
57
|
+
config: Record<string, unknown>;
|
|
58
|
+
protected providerId: string;
|
|
59
|
+
private recorder;
|
|
60
|
+
constructor(options: ProviderOptions);
|
|
61
|
+
/**
|
|
62
|
+
* Main Promptfoo provider entry point. Called for each test case.
|
|
63
|
+
*/
|
|
64
|
+
callApi(prompt: string, context?: CallApiContextParams): Promise<ProviderResponse>;
|
|
65
|
+
/**
|
|
66
|
+
* Exposes the recorder for external integrations (e.g., agents that
|
|
67
|
+
* make their own HTTP requests outside the provider call).
|
|
68
|
+
*/
|
|
69
|
+
getRecorder(): RequestRecorder;
|
|
70
|
+
id(): string;
|
|
71
|
+
/**
|
|
72
|
+
* Calls OpenAI Chat Completions API directly. Uses the recorder's
|
|
73
|
+
* fetch wrapper so the LLM call itself is captured in the observation log.
|
|
74
|
+
*/
|
|
75
|
+
private callOpenAI;
|
|
76
|
+
}
|
|
77
|
+
export {};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* provider.ts
|
|
3
|
+
*
|
|
4
|
+
* Instrumented Promptfoo custom provider that wraps any underlying LLM
|
|
5
|
+
* provider and records all HTTP activity the agent performs during a task.
|
|
6
|
+
*
|
|
7
|
+
* This is the integration point between the observation infrastructure
|
|
8
|
+
* (RequestRecorder) and Promptfoo's evaluation pipeline. It:
|
|
9
|
+
*
|
|
10
|
+
* 1. Starts a recording session before the LLM call
|
|
11
|
+
* 2. Delegates to the real provider (calls OpenAI directly)
|
|
12
|
+
* 3. Stops recording and attaches the AgentBehaviorLog to
|
|
13
|
+
* ProviderResponse.metadata so it flows through scoring
|
|
14
|
+
*
|
|
15
|
+
* Promptfoo config usage:
|
|
16
|
+
*
|
|
17
|
+
* providers:
|
|
18
|
+
* - id: file://src/agent-observer/provider.ts
|
|
19
|
+
* label: "gpt-4o (observed)"
|
|
20
|
+
* config:
|
|
21
|
+
* model: gpt-4o
|
|
22
|
+
* temperature: 0
|
|
23
|
+
* max_tokens: 4096
|
|
24
|
+
* observe: true
|
|
25
|
+
* observerOptions:
|
|
26
|
+
* maxPreviewBytes: 2048
|
|
27
|
+
* captureResponsePreview: true
|
|
28
|
+
*
|
|
29
|
+
* Promptfoo loads this file and instantiates the default export class.
|
|
30
|
+
*/
|
|
31
|
+
import { config as loadDotenv } from "dotenv";
|
|
32
|
+
import { randomUUID } from "crypto";
|
|
33
|
+
import { RequestRecorder } from "./proxy.js";
|
|
34
|
+
import { calculateCost } from "./pricing.js";
|
|
35
|
+
loadDotenv({
|
|
36
|
+
override: true,
|
|
37
|
+
path: new URL("../../.env", import.meta.url).pathname,
|
|
38
|
+
});
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Provider implementation
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
export default class InstrumentedProvider {
|
|
43
|
+
config;
|
|
44
|
+
providerId;
|
|
45
|
+
recorder;
|
|
46
|
+
constructor(options) {
|
|
47
|
+
this.providerId = options.id ?? "instrumented-observer";
|
|
48
|
+
this.config = options.config ?? {};
|
|
49
|
+
this.recorder = new RequestRecorder(this.config.observerOptions ?? {});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Main Promptfoo provider entry point. Called for each test case.
|
|
53
|
+
*/
|
|
54
|
+
async callApi(prompt, context) {
|
|
55
|
+
const sessionId = randomUUID();
|
|
56
|
+
const taskDescription = context?.vars?.task ||
|
|
57
|
+
context?.prompt?.label ||
|
|
58
|
+
"unknown-task";
|
|
59
|
+
const observe = this.config.observe !== false;
|
|
60
|
+
// Start observation
|
|
61
|
+
if (observe) {
|
|
62
|
+
this.recorder.start(sessionId, this.id(), taskDescription);
|
|
63
|
+
}
|
|
64
|
+
let result;
|
|
65
|
+
try {
|
|
66
|
+
result = await this.callOpenAI(prompt);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
const error = err;
|
|
70
|
+
result = {
|
|
71
|
+
error: error.message,
|
|
72
|
+
output: undefined,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Stop observation and attach behavior log
|
|
76
|
+
if (observe) {
|
|
77
|
+
const behaviorLog = this.recorder.stop();
|
|
78
|
+
result.metadata = {
|
|
79
|
+
...(result.metadata ?? {}),
|
|
80
|
+
agentBehavior: behaviorLog,
|
|
81
|
+
agentBehaviorSummary: behaviorLog.summary,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Exposes the recorder for external integrations (e.g., agents that
|
|
88
|
+
* make their own HTTP requests outside the provider call).
|
|
89
|
+
*/
|
|
90
|
+
getRecorder() {
|
|
91
|
+
return this.recorder;
|
|
92
|
+
}
|
|
93
|
+
id() {
|
|
94
|
+
return `instrumented:${this.providerId}`;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Calls OpenAI Chat Completions API directly. Uses the recorder's
|
|
98
|
+
* fetch wrapper so the LLM call itself is captured in the observation log.
|
|
99
|
+
*/
|
|
100
|
+
async callOpenAI(prompt) {
|
|
101
|
+
const model = this.config.model || "gpt-4o";
|
|
102
|
+
const temperature = this.config.temperature ?? 0;
|
|
103
|
+
const maxTokens = this.config.max_tokens || 4096;
|
|
104
|
+
const apiKey = this.config.apiKey || process.env.OPENAI_API_KEY;
|
|
105
|
+
if (!apiKey) {
|
|
106
|
+
return {
|
|
107
|
+
error: "OPENAI_API_KEY not set. Configure it in env or provider config.",
|
|
108
|
+
output: undefined,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Use the recorder's fetch wrapper so the API call is recorded
|
|
112
|
+
const fetchFn = this.recorder.isRunning()
|
|
113
|
+
? this.recorder.fetch.bind(this.recorder)
|
|
114
|
+
: globalThis.fetch;
|
|
115
|
+
const startTime = Date.now();
|
|
116
|
+
const response = await fetchFn("https://api.openai.com/v1/chat/completions", {
|
|
117
|
+
body: JSON.stringify({
|
|
118
|
+
max_tokens: maxTokens,
|
|
119
|
+
messages: [{ content: prompt, role: "user" }],
|
|
120
|
+
model,
|
|
121
|
+
temperature,
|
|
122
|
+
}),
|
|
123
|
+
headers: {
|
|
124
|
+
Authorization: `Bearer ${apiKey}`,
|
|
125
|
+
"Content-Type": "application/json",
|
|
126
|
+
},
|
|
127
|
+
method: "POST",
|
|
128
|
+
});
|
|
129
|
+
const data = (await response.json());
|
|
130
|
+
if (data.error) {
|
|
131
|
+
return {
|
|
132
|
+
error: data.error.message ?? "Unknown OpenAI error",
|
|
133
|
+
output: undefined,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const output = data.choices?.[0]?.message?.content ?? "";
|
|
137
|
+
return {
|
|
138
|
+
cost: calculateCost(model, data.usage?.prompt_tokens ?? 0, data.usage?.completion_tokens ?? 0),
|
|
139
|
+
metadata: {
|
|
140
|
+
latencyMs: Date.now() - startTime,
|
|
141
|
+
model,
|
|
142
|
+
},
|
|
143
|
+
output,
|
|
144
|
+
tokenUsage: {
|
|
145
|
+
completion: data.usage?.completion_tokens,
|
|
146
|
+
prompt: data.usage?.prompt_tokens,
|
|
147
|
+
total: data.usage?.total_tokens,
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|