0d3cb498a3
Deploy local.promptfoo.app / Deploy to Cloudflare Pages (push) Waiting to run
Test and Publish Multi-arch Docker Image / test (push) Waiting to run
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-amd64 platform:linux/amd64 runner:ubuntu-latest]) (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-arm64 platform:linux/arm64 runner:ubuntu-24.04-arm]) (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / merge-docker-digests (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / Attest Multi-arch Image (push) Blocked by required conditions
Validate Renovate Config / Validate Renovate Configuration (push) Waiting to run
CI / Shell Format Check (push) Has been cancelled
CI / Check Ruby (3.4) (push) Has been cancelled
CI / CI Config (push) Has been cancelled
CI / Test on Node ${{ matrix.node }} and ${{ matrix.os }}${{ matrix.shard && format(' (shard {0}/3)', matrix.shard) || '' }} (push) Has been cancelled
CI / Build on Node ${{ matrix.node }} (push) Has been cancelled
CI / Style Check (push) Has been cancelled
CI / Generate Assets (push) Has been cancelled
CI / Check Python (3.14) (push) Has been cancelled
CI / Check Python (3.9) (push) Has been cancelled
CI / Build Docs (push) Has been cancelled
CI / Code Scan Action (push) Has been cancelled
CI / Site tests (push) Has been cancelled
CI / webui tests (push) Has been cancelled
CI / Run Integration Tests (push) Has been cancelled
CI / Run Smoke Tests (push) Has been cancelled
CI / Go Tests (push) Has been cancelled
CI / Share Test (push) Has been cancelled
CI / Redteam (Production API) (push) Has been cancelled
CI / Redteam (Staging API) (push) Has been cancelled
CI / GitHub Actions Lint (push) Has been cancelled
CI / Check Ruby (3.0) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build (push) Has been cancelled
release-please / publish-npm (push) Has been cancelled
release-please / publish-npm-backfill (push) Has been cancelled
release-please / docker (push) Has been cancelled
release-please / publish-code-scan-action (push) Has been cancelled
release-please / attest-code-scan-action (push) Has been cancelled
429 lines
15 KiB
JSON
429 lines
15 KiB
JSON
{
|
|
"name": "promptfoo",
|
|
"description": "LLM eval & testing toolkit",
|
|
"author": "Ian Webster",
|
|
"version": "0.121.18",
|
|
"license": "MIT",
|
|
"type": "module",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+https://github.com/promptfoo/promptfoo.git"
|
|
},
|
|
"main": "./dist/src/index.js",
|
|
"exports": {
|
|
".": {
|
|
"import": "./dist/src/index.js",
|
|
"require": "./dist/src/index.cjs"
|
|
},
|
|
"./contracts": {
|
|
"import": {
|
|
"types": "./dist/src/contracts.d.ts",
|
|
"default": "./dist/src/contracts.js"
|
|
},
|
|
"require": {
|
|
"types": "./dist/src/contracts.d.cts",
|
|
"default": "./dist/src/contracts.cjs"
|
|
}
|
|
}
|
|
},
|
|
"workspaces": [
|
|
"src/app",
|
|
"site"
|
|
],
|
|
"types": "dist/src/index.d.ts",
|
|
"typings": "dist/src/index.d.ts",
|
|
"typesVersions": {
|
|
"*": {
|
|
"contracts": [
|
|
"dist/src/contracts.d.ts"
|
|
]
|
|
}
|
|
},
|
|
"files": [
|
|
"dist",
|
|
"!dist/test",
|
|
"!dist/src/__mocks__",
|
|
"!dist/**/*.map"
|
|
],
|
|
"engines": {
|
|
"node": "^20.20.0 || >=22.22.0"
|
|
},
|
|
"bin": {
|
|
"promptfoo": "dist/src/entrypoint.js",
|
|
"pf": "dist/src/entrypoint.js"
|
|
},
|
|
"scripts": {
|
|
"audit:fix": "npm audit fix && npm audit fix --prefix src/app && npm audit fix --prefix site",
|
|
"architecture:baseline": "tsx scripts/regenerateEdgeBaseline.ts",
|
|
"architecture:check": "tsx scripts/checkArchitectureBoundaries.ts",
|
|
"bin": "dist/src/entrypoint.js",
|
|
"build:app": "npm run build --prefix src/app",
|
|
"build:clean": "shx rm -rf dist",
|
|
"build:watch": "NODE_OPTIONS='--max-old-space-size=8192' tsdown --watch",
|
|
"build": "concurrently -g --kill-others-on-fail \"npm run tsc\" \"NODE_OPTIONS='--max-old-space-size=8192' tsdown\" \"npm run build:app\"",
|
|
"postbuild": "tsx scripts/postbuild.ts",
|
|
"citation:generate": "tsx scripts/generateCitation.ts",
|
|
"db:generate": "npx drizzle-kit generate",
|
|
"db:migrate": "tsx src/migrate.ts",
|
|
"db:studio": "npx drizzle-kit studio",
|
|
"openapi:generate": "tsx scripts/generateOpenApi.ts",
|
|
"openapi:check": "tsx scripts/generateOpenApi.ts --check",
|
|
"modelAuditSchema:generate": "python3 scripts/generate_modelaudit_schema.py && npx @biomejs/biome format --write site/static/schemas/modelaudit site/static/examples/modelaudit",
|
|
"dev:app": "npm run dev --prefix src/app",
|
|
"storybook": "npm run storybook --prefix src/app",
|
|
"dev:server": "tsx watch src/server/index.ts",
|
|
"dev": "concurrently \"npm run dev:server\" \"npm run dev:app\"",
|
|
"f": "git diff --name-only --diff-filter=ACMRTUXB origin/main | grep -E '\\.(js|jsx|mjs|cjs|ts|tsx|json)$' | xargs npx @biomejs/biome check --write && git diff --name-only --diff-filter=ACMRTUXB origin/main | grep -E '\\.(css|scss|html|md|mdc|mdx|yaml|yml)$' | xargs prettier --write",
|
|
"format:check": "npx @biomejs/biome check && prettier --check '**/*.{css,scss,html,md,mdc,mdx,yaml,yml}'",
|
|
"format:check:prettier": "prettier --check '**/*.{css,scss,html,md,mdc,mdx,yaml,yml}'",
|
|
"format": "npx @biomejs/biome check --write . && prettier --write '**/*.{css,scss,html,md,mdc,mdx,yaml,yml}'",
|
|
"jsonSchema:generate": "npx -y tsx scripts/generateJsonSchema.ts > site/static/config-schema.json && npx @biomejs/biome format --write site/static/config-schema.json",
|
|
"knip": "knip",
|
|
"l": "git diff --name-only --diff-filter=ACMRTUXB origin/main | grep -E '\\.(js|ts|tsx)$' | xargs npx @biomejs/biome lint --write",
|
|
"lint:ci": "npx @biomejs/biome ci .",
|
|
"lint:site": "npx @biomejs/biome lint site",
|
|
"lint:src": "npx @biomejs/biome lint src",
|
|
"lint:tests": "npx @biomejs/biome lint test",
|
|
"lint": "npm run lint:src",
|
|
"local:web": "npm run dev --prefix src/app",
|
|
"local": "tsx src/localEntrypoint.ts",
|
|
"preversion": "command -v gh >/dev/null 2>&1 || (echo \"Error: GitHub CLI required.\" && exit 1) && [ \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" ] || (echo \"Error: Must be on main branch to version\" && exit 1) && git pull origin main && git checkout -b \"chore/bump-version-$(date +%s)\"",
|
|
"changelog:release": "node scripts/update-changelog-version.cjs",
|
|
"postversion": "npm run changelog:release && npm run citation:generate && git add CHANGELOG.md CITATION.cff && git commit --amend --no-edit && gh pr create --repo promptfoo/promptfoo --title \"chore: bump version $npm_package_version\" --body \"\"",
|
|
"prepublishOnly": "node -e \"if (!process.env.PROMPTFOO_POSTHOG_KEY) { console.error('Error: PROMPTFOO_POSTHOG_KEY must be set'); process.exit(1); }\" && npm run build:clean && npm run build",
|
|
"test:app": "npm --prefix src/app run test --",
|
|
"test:app:browser": "npm --prefix src/app run test:browser --",
|
|
"test:package-artifact": "tsx scripts/testPackageArtifact.ts",
|
|
"test:site": "npm run test --prefix site",
|
|
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
"test:vitest": "vitest run",
|
|
"test:vitest:watch": "vitest",
|
|
"test:watch": "vitest",
|
|
"test:redteam:integration": "npm run build && ./test/redteam/integration/test.sh",
|
|
"test:smoke": "vitest run --config vitest.smoke.config.ts",
|
|
"test": "vitest run",
|
|
"test:coverage": "vitest run --coverage && npm run test:coverage --prefix src/app",
|
|
"test:coverage:ratchet": "node --import tsx ./scripts/checkCoverageRatchets.ts",
|
|
"check:typescript-coverage": "tsx scripts/checkTypeScriptCoverage.ts",
|
|
"tsc": "tsc --noEmit",
|
|
"mcp": "node dist/src/entrypoint.js mcp",
|
|
"depcheck": "depcheck --ignores=\"@types/*,@biomejs/biome,prettier,shx,concurrently,madge,knip,vite,typescript,tshy,gcp-metadata,@opencode-ai/sdk,@actions/core,@actions/exec,@actions/github,@octokit/rest,nock,@vitest/coverage-v8,langium,block-no-verify\" --ignore-dirs=\"dist,site,examples\"",
|
|
"deps:ownership": "tsx scripts/reportDependencyOwnership.ts",
|
|
"prepare": "husky || exit 0"
|
|
},
|
|
"overrides": {
|
|
"uri-js": "npm:uri-js-replace",
|
|
"chokidar": "5.0.0",
|
|
"whatwg-url": "16.0.1",
|
|
"esbuild": "0.28.1",
|
|
"jsdom": {
|
|
"@asamuzakjp/css-color": "5.1.11"
|
|
},
|
|
"storybook": {
|
|
"esbuild": "0.28.1"
|
|
},
|
|
"react": "^19.2.4",
|
|
"react-dom": "^19.2.4",
|
|
"react-is": "^19.2.4",
|
|
"*": {
|
|
"whatwg-url": "16.0.1",
|
|
"chokidar": "5.0.0",
|
|
"esbuild": "0.28.1",
|
|
"react": "^19.2.4",
|
|
"react-dom": "^19.2.4"
|
|
},
|
|
"@opentelemetry/exporter-trace-otlp-http": {
|
|
"@opentelemetry/core": "2.8.0"
|
|
},
|
|
"@opentelemetry/otlp-exporter-base": {
|
|
"@opentelemetry/core": "2.8.0"
|
|
},
|
|
"@opentelemetry/otlp-transformer": {
|
|
"@opentelemetry/core": "2.8.0"
|
|
},
|
|
"@opentelemetry/resources": {
|
|
"@opentelemetry/core": "2.8.0"
|
|
},
|
|
"@opentelemetry/sdk-logs": {
|
|
"@opentelemetry/core": "2.8.0"
|
|
},
|
|
"@opentelemetry/sdk-metrics": {
|
|
"@opentelemetry/core": "2.8.0"
|
|
},
|
|
"@opentelemetry/sdk-trace-base": {
|
|
"@opentelemetry/core": "2.8.0"
|
|
},
|
|
"@opentelemetry/sdk-trace-node": {
|
|
"@opentelemetry/core": "2.8.0"
|
|
},
|
|
"serialize-javascript": ">=7.0.5",
|
|
"gaxios": "^7.1.4",
|
|
"https-proxy-agent": "^9.0.0",
|
|
"ip-address": "10.2.0",
|
|
"mongoose": {
|
|
"gcp-metadata": "^8.1.2"
|
|
},
|
|
"webpack-dev-server": {
|
|
"express": "^4.22.2"
|
|
},
|
|
"launch-editor": "2.14.1",
|
|
"engine.io": {
|
|
".": "6.6.9",
|
|
"ws": "$ws"
|
|
},
|
|
"engine.io-client": {
|
|
".": "6.6.6",
|
|
"ws": "$ws"
|
|
},
|
|
"socket.io-adapter": {
|
|
".": "2.5.8",
|
|
"ws": "$ws"
|
|
},
|
|
"qs": ">=6.15.2 <7.0.0",
|
|
"@isaacs/brace-expansion": ">=5.0.1",
|
|
"brace-expansion@5": "^5.0.6",
|
|
"fast-xml-parser": "$fast-xml-parser",
|
|
"minimatch@<=3.1.3": "3.1.5",
|
|
"vite": "^8.0.16",
|
|
"lodash-es": "^4.18.1",
|
|
"langium": {
|
|
".": "4.3.0",
|
|
"@chevrotain/regexp-to-ast": "11.2.0",
|
|
"chevrotain": "11.2.0",
|
|
"chevrotain-allstar": "0.4.1"
|
|
},
|
|
"chevrotain": {
|
|
".": "11.2.0",
|
|
"@chevrotain/cst-dts-gen": "12.0.0",
|
|
"@chevrotain/gast": "11.2.0",
|
|
"@chevrotain/regexp-to-ast": "11.2.0",
|
|
"@chevrotain/types": "11.2.0",
|
|
"@chevrotain/utils": "11.2.0"
|
|
},
|
|
"@chevrotain/cst-dts-gen": {
|
|
".": "12.0.0",
|
|
"@chevrotain/gast": "12.0.0",
|
|
"@chevrotain/types": "12.0.0"
|
|
},
|
|
"chevrotain-allstar": {
|
|
".": "0.4.1",
|
|
"chevrotain": "11.2.0"
|
|
},
|
|
"webpack": "5.108.3",
|
|
"dompurify": "3.4.11",
|
|
"monaco-editor": {
|
|
".": "0.55.1",
|
|
"dompurify": "3.4.11"
|
|
}
|
|
},
|
|
"devDependencies": {
|
|
"@anthropic-ai/claude-agent-sdk": "0.3.197",
|
|
"@asteasolutions/zod-to-openapi": "^8.5.0",
|
|
"@aws-sdk/client-bedrock-agent-runtime": "^3.1045.0",
|
|
"@aws-sdk/client-bedrock-runtime": "^3.1045.0",
|
|
"@aws-sdk/client-s3": "^3.1003.0",
|
|
"@aws-sdk/client-sagemaker-runtime": "^3.1045.0",
|
|
"@aws-sdk/credential-provider-sso": "^3.972.16",
|
|
"@aws-sdk/types": "^3.973.5",
|
|
"@azure/identity": "^4.13.0",
|
|
"@azure/openai-assistants": "^1.0.0-beta.6",
|
|
"@biomejs/biome": "2.5.1",
|
|
"@fal-ai/client": "~1.10.1",
|
|
"@ibm-cloud/watsonx-ai": "^1.7.14",
|
|
"@ibm-generative-ai/node-sdk": "^3.2.4",
|
|
"@smithy/types": "^4.13.0",
|
|
"@types/async": "^3.2.25",
|
|
"@types/cli-progress": "^3.11.6",
|
|
"@types/compression": "^1.8.1",
|
|
"@types/cors": "^2.8.19",
|
|
"@types/express": "^5.0.6",
|
|
"@types/js-yaml": "^4.0.9",
|
|
"@types/jsdom": "^28.0.0",
|
|
"@types/node": "^24.12.0",
|
|
"@types/nunjucks": "^3.2.6",
|
|
"@types/opener": "^1.4.3",
|
|
"@types/pdf-parse": "^1.1.5",
|
|
"@types/pem": "^1.14.4",
|
|
"@types/proxy-from-env": "^1.0.4",
|
|
"@types/semver": "^7.7.1",
|
|
"@types/source-map-support": "^0.5.10",
|
|
"@types/supertest": "^7.0.0",
|
|
"@vitest/coverage-v8": "^4.1.0",
|
|
"block-no-verify": "^1.2.0",
|
|
"concurrently": "^9.2.3",
|
|
"depcheck": "^1.4.7",
|
|
"drizzle-kit": "^0.31.10",
|
|
"husky": "^9.1.7",
|
|
"ibm-cloud-sdk-core": "^5.4.22",
|
|
"knip": "^6.0.0",
|
|
"langfuse": "^3.38.20",
|
|
"langium": "4.3.0",
|
|
"nock": "^14.0.11",
|
|
"node-sql-parser": "^5.4.0",
|
|
"pdf-parse": "^2.4.5",
|
|
"playwright": "^1.60.0",
|
|
"playwright-extra": "^4.3.6",
|
|
"prettier": "^3.8.1",
|
|
"puppeteer-extra-plugin-stealth": "^2.11.2",
|
|
"read-excel-file": "^9.0.0",
|
|
"shx": "^0.4.0",
|
|
"source-map-support": "^0.5.21",
|
|
"supertest": "^7.2.2",
|
|
"ts-dedent": "^2.2.0",
|
|
"tsdown": "0.21.9",
|
|
"typescript": "^6.0.2",
|
|
"vitest": "^4.1.0",
|
|
"winston-transport": "^4.9.0"
|
|
},
|
|
"optionalDependencies": {
|
|
"@anthropic-ai/claude-agent-sdk": "0.3.197",
|
|
"@aws-sdk/client-bedrock-agent-runtime": "^3.1045.0",
|
|
"@aws-sdk/client-bedrock-runtime": "^3.1045.0",
|
|
"@aws-sdk/client-s3": "^3.1003.0",
|
|
"@aws-sdk/client-sagemaker-runtime": "^3.1045.0",
|
|
"@aws-sdk/credential-provider-sso": "^3.972.16",
|
|
"@azure/ai-projects": "^2.1.1",
|
|
"@azure/identity": "^4.13.0",
|
|
"@azure/msal-node": "^5.2.0",
|
|
"@azure/openai-assistants": "^1.0.0-beta.6",
|
|
"@azure/storage-blob": "^12.31.0",
|
|
"@fal-ai/client": "~1.10.1",
|
|
"@googleapis/sheets": "^13.0.1",
|
|
"@huggingface/transformers": "^4.0.0",
|
|
"@ibm-cloud/watsonx-ai": "^1.7.14",
|
|
"@ibm-generative-ai/node-sdk": "^3.2.4",
|
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
"@openai/agents": "^0.11.3",
|
|
"@openai/codex-sdk": "^0.144.0",
|
|
"@opencode-ai/sdk": "^1.14.33",
|
|
"@playwright/browser-chromium": "^1.60.0",
|
|
"@rollup/rollup-linux-x64-gnu": "^4.62.0",
|
|
"@slack/web-api": "^7.15.2",
|
|
"@smithy/node-http-handler": "^4.4.14",
|
|
"@swc/core": "^1.15.41",
|
|
"@swc/core-darwin-arm64": "^1.15.41",
|
|
"@swc/core-darwin-x64": "^1.15.41",
|
|
"@swc/core-linux-x64-gnu": "^1.15.41",
|
|
"@swc/core-linux-x64-musl": "^1.15.41",
|
|
"@swc/core-win32-x64-msvc": "^1.15.41",
|
|
"google-auth-library": "^10.9.0",
|
|
"hono": "^4.12.25",
|
|
"ibm-cloud-sdk-core": "^5.4.22",
|
|
"jks-js": "^1.1.5",
|
|
"langfuse": "^3.38.20",
|
|
"natural": "^8.1.1",
|
|
"node-sql-parser": "^5.4.0",
|
|
"pdf-parse": "^2.4.5",
|
|
"pem": "~1.14.8",
|
|
"playwright": "^1.60.0",
|
|
"playwright-extra": "^4.3.6",
|
|
"read-excel-file": "^9.0.0",
|
|
"sharp": "^0.35.1"
|
|
},
|
|
"dependencies": {
|
|
"@anthropic-ai/sdk": "0.109.0",
|
|
"@apidevtools/json-schema-ref-parser": "^15.3.1",
|
|
"@inquirer/checkbox": "^5.1.0",
|
|
"@inquirer/confirm": "^6.0.8",
|
|
"@inquirer/core": "^11.1.5",
|
|
"@inquirer/editor": "^5.0.8",
|
|
"@inquirer/input": "^5.0.8",
|
|
"@inquirer/search": "^4.1.8",
|
|
"@inquirer/select": "^5.1.0",
|
|
"@libsql/client": "^0.17.3",
|
|
"@opentelemetry/api": "^1.9.0",
|
|
"@opentelemetry/core": "2.8.0",
|
|
"@opentelemetry/exporter-trace-otlp-http": "^0.219.0",
|
|
"@opentelemetry/resources": "^2.6.0",
|
|
"@opentelemetry/sdk-trace-base": "^2.6.0",
|
|
"@opentelemetry/sdk-trace-node": "^2.6.0",
|
|
"@opentelemetry/semantic-conventions": "^1.40.0",
|
|
"@types/ws": "^8.18.1",
|
|
"ai": "^6.0.190",
|
|
"ajv": "^8.18.0",
|
|
"ajv-formats": "^3.0.1",
|
|
"async": "^3.2.6",
|
|
"binary-extensions": "^3.1.0",
|
|
"cache-manager": "^7.2.8",
|
|
"chalk": "^5.6.2",
|
|
"chokidar": "5.0.0",
|
|
"cli-progress": "^3.12.0",
|
|
"cli-table3": "^0.6.5",
|
|
"commander": "^14.0.3",
|
|
"compression": "^1.8.1",
|
|
"cors": "^2.8.6",
|
|
"csv-parse": "^7.0.0",
|
|
"csv-stringify": "^6.7.0",
|
|
"debounce": "^3.0.0",
|
|
"dedent": "^1.7.2",
|
|
"dotenv": "^17.3.1",
|
|
"drizzle-orm": "^0.45.1",
|
|
"execa": "^9.6.1",
|
|
"express": "^5.2.1",
|
|
"exsolve": "^1.0.8",
|
|
"fast-deep-equal": "^3.1.3",
|
|
"fast-safe-stringify": "^2.1.1",
|
|
"fast-xml-parser": "^5.7.1",
|
|
"fastest-levenshtein": "^1.0.16",
|
|
"gcp-metadata": "^8.1.2",
|
|
"glob": "^13.0.6",
|
|
"http-z": "^8.1.1",
|
|
"istextorbinary": "^9.5.0",
|
|
"js-rouge": "^3.2.0",
|
|
"js-yaml": "5.2.0",
|
|
"json5": "^2.2.3",
|
|
"keyv": "^5.6.0",
|
|
"keyv-file": "^5.3.3",
|
|
"lru-cache": "^11.3.0",
|
|
"mathjs": "^15.1.1",
|
|
"minimatch": "^10.2.4",
|
|
"nunjucks": "^3.2.4",
|
|
"openai": "^6.37.0",
|
|
"opener": "^1.5.2",
|
|
"ora": "^9.3.0",
|
|
"parse5": "^8.0.0",
|
|
"posthog-node": "~5.24.10",
|
|
"protobufjs": "^8.0.0",
|
|
"proxy-agent": "^8.0.0",
|
|
"proxy-from-env": "^2.1.0",
|
|
"python-shell": "^5.0.0",
|
|
"rfdc": "^1.4.1",
|
|
"rxjs": "^7.8.2",
|
|
"saxes": "^6.0.0",
|
|
"semver": "^7.7.4",
|
|
"simple-git": "^3.33.0",
|
|
"socket.io": "^4.8.3",
|
|
"socket.io-client": "^4.8.3",
|
|
"text-extensions": "^3.1.0",
|
|
"tsx": "^4.21.0",
|
|
"undici": ">=7.28.0 <8",
|
|
"winston": "^3.19.0",
|
|
"ws": "^8.19.0",
|
|
"zod": "^4.3.6"
|
|
},
|
|
"madge": {
|
|
"detectiveOptions": {
|
|
"ts": {
|
|
"skipAsyncImports": true
|
|
},
|
|
"tsx": {
|
|
"skipAsyncImports": true
|
|
}
|
|
}
|
|
},
|
|
"pnpm": {
|
|
"onlyBuiltDependencies": [
|
|
"@huggingface/transformers",
|
|
"@playwright/browser-chromium",
|
|
"@swc/core",
|
|
"core-js",
|
|
"core-js-pure",
|
|
"esbuild",
|
|
"protobufjs",
|
|
"sharp"
|
|
],
|
|
"ignoredBuiltDependencies": []
|
|
},
|
|
"homepage": "https://promptfoo.dev"
|
|
}
|