{ "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" }