{
  "name": "promptfoo",
  "description": "LLM eval & testing toolkit",
  "author": "Ian Webster",
  "version": "0.124.1",
  "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",
    "!dist/**/*.tsbuildinfo"
  ],
  "engines": {
    "node": ">=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": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
    "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 \"\"",
    "package:pack": "tsx scripts/packPackageArtifact.ts",
    "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",
    "deps:ownership": "tsx scripts/reportDependencyOwnership.ts",
    "prepare": "husky || exit 0"
  },
  "overrides": {
    "nunjucks": {
      "chokidar": "$chokidar"
    },
    "uri-js": "npm:uri-js-replace",
    "whatwg-url": "16.0.1",
    "esbuild": "0.28.2",
    "jsdom": {
      "@asamuzakjp/css-color": "6.0.7"
    },
    "react": "^19.3.0",
    "react-dom": "^19.3.0",
    "react-is": "^19.3.0",
    "react-router-config": {
      "react-router": "^5.3.4"
    },
    "@ai-sdk/provider-utils": {
      "undici": "$undici"
    },
    "@opentelemetry/exporter-trace-otlp-http": {
      "@opentelemetry/core": "2.11.0"
    },
    "@opentelemetry/otlp-exporter-base": {
      "@opentelemetry/core": "2.11.0"
    },
    "@opentelemetry/otlp-transformer": {
      "@opentelemetry/core": "2.11.0"
    },
    "@opentelemetry/resources": {
      "@opentelemetry/core": "2.11.0"
    },
    "@opentelemetry/sdk-logs": {
      "@opentelemetry/core": "2.11.0"
    },
    "@opentelemetry/sdk-metrics": {
      "@opentelemetry/core": "2.11.0"
    },
    "@opentelemetry/sdk-trace-base": {
      "@opentelemetry/core": "2.11.0"
    },
    "@opentelemetry/sdk-trace-node": {
      "@opentelemetry/core": "2.11.0"
    },
    "serialize-javascript": ">=7.1.2",
    "gaxios": "^8.0.0",
    "ip-address": "10.7.2",
    "mongoose": {
      "gcp-metadata": "^9.0.2"
    },
    "webpack-dev-server": {
      "express": "^4.22.2"
    },
    "launch-editor": "2.14.1",
    "engine.io": {
      ".": "6.6.11",
      "ws": "$ws"
    },
    "engine.io-client": {
      ".": "6.6.7",
      "ws": "$ws"
    },
    "socket.io-adapter": {
      ".": "2.5.8",
      "ws": "$ws"
    },
    "socket.io-parser": ">=4.2.7 <5",
    "qs": ">=6.15.2 <7.0.0",
    "@cacheable/utils": ">=2.5.0 <2.5.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",
    "webpack": "5.111.1",
    "dompurify": "3.4.16",
    "monaco-editor": {
      ".": "0.57.0",
      "dompurify": "3.4.16"
    }
  },
  "devDependencies": {
    "@anthropic-ai/claude-agent-sdk": "0.3.283",
    "@asteasolutions/zod-to-openapi": "^9.1.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/bedrock-token-generator": "^1.1.0",
    "@azure/identity": "^4.13.3",
    "@biomejs/biome": "2.5.14",
    "@fal-ai/client": "~1.10.1",
    "@ibm-cloud/watsonx-ai": "^1.7.16",
    "@langfuse/client": "^5.11.1",
    "@openai/agents": "^0.14.1",
    "@openai/codex-security": "^0.2.0",
    "@slack/web-api": "^8.1.1",
    "@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/jsdom": "^30.0.0",
    "@types/node": "^24.13.6",
    "@types/nunjucks": "^3.2.6",
    "@types/opener": "^1.4.3",
    "@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",
    "@types/ws": "^8.18.1",
    "@vitest/coverage-v8": "^5.0.2",
    "block-no-verify": "^1.2.0",
    "concurrently": "^9.2.3",
    "drizzle-kit": "^0.31.11",
    "husky": "^9.1.7",
    "ibm-cloud-sdk-core": "^5.6.2",
    "knip": "~6.27.0",
    "node-sql-parser": "^5.4.0",
    "oxc-parser": "^0.151.0",
    "pdf-parse": "^2.4.5",
    "playwright": "^1.63.0",
    "playwright-extra": "^4.3.6",
    "prettier": "^3.8.1",
    "puppeteer-extra-plugin-stealth": "^2.11.2",
    "read-excel-file": "^9.3.9",
    "source-map-support": "^0.5.21",
    "supertest": "^7.3.0",
    "tsdown": "0.23.0",
    "typescript": "^7.0.0",
    "vitest": "^5.0.2",
    "yaml": "^2.9.0"
  },
  "optionalDependencies": {
    "@anthropic-ai/claude-agent-sdk": "0.3.283",
    "@aws/bedrock-token-generator": "^1.1.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",
    "@azure/ai-projects": "^2.1.1",
    "@azure/identity": "^4.13.3",
    "@azure/msal-node": "^7.0.0",
    "@azure/storage-blob": "^12.31.0",
    "@fal-ai/client": "~1.10.1",
    "@googleapis/sheets": "^18.0.1",
    "@modelcontextprotocol/sdk": "^1.32.0",
    "@modelcontextprotocol/server-filesystem": "2026.8.31",
    "@openai/codex-sdk": "^0.156.1",
    "@opencode-ai/sdk": "^1.18.32",
    "@smithy/node-http-handler": "^4.4.14",
    "google-auth-library": "^11.1.0",
    "hono": "^4.13.9",
    "jks-js": "^1.1.5",
    "natural": "^8.1.1",
    "node-sql-parser": "^5.4.0",
    "pdf-parse": "^2.4.5",
    "pem": "~1.14.8",
    "read-excel-file": "^9.3.9",
    "sharp": "^0.35.5"
  },
  "dependencies": {
    "@anthropic-ai/sdk": "0.128.0",
    "@apidevtools/json-schema-ref-parser": "^16.0.3",
    "@hono/node-server": "2.1.1",
    "@inquirer/checkbox": "^5.1.0",
    "@inquirer/confirm": "^6.0.8",
    "@inquirer/core": "^12.0.0",
    "@inquirer/editor": "^5.0.8",
    "@inquirer/input": "^5.0.8",
    "@inquirer/search": "^4.1.8",
    "@inquirer/select": "^5.1.0",
    "@libsql/client": "^0.18.0",
    "@opentelemetry/api": "^1.9.0",
    "@opentelemetry/core": "2.11.0",
    "@opentelemetry/exporter-trace-otlp-http": "^0.222.0",
    "@opentelemetry/resources": "^2.6.0",
    "@opentelemetry/sdk-trace-node": "^2.6.0",
    "@opentelemetry/semantic-conventions": "^1.40.0",
    "acorn": "^8.18.0",
    "ai": "^6.0.286",
    "ajv": "^8.18.0",
    "ajv-formats": "^3.0.1",
    "async": "^3.2.6",
    "binary-extensions": "^3.2.0",
    "cache-manager": ">=7.2.8 <7.2.10",
    "chalk": "^6.0.0",
    "chokidar": "5.0.0",
    "cli-progress": "^3.12.0",
    "cli-table3": "^0.6.5",
    "commander": "^15.0.0",
    "compression": "^1.8.2",
    "cors": "^2.8.6",
    "csv-parse": "^7.0.3",
    "csv-stringify": "^6.9.0",
    "dedent": "^1.7.2",
    "drizzle-orm": "^0.45.3",
    "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": "^9.0.2",
    "glob": "^13.0.6",
    "http-z": "^8.1.1",
    "istextorbinary": "^9.5.0",
    "js-rouge": "^3.2.0",
    "js-yaml": "5.4.2",
    "json5": "^2.2.3",
    "keyv": "^5.6.0",
    "keyv-file": "^5.3.3",
    "lru-cache": "^11.5.3",
    "mathjs": "^15.1.1",
    "minimatch": "^10.2.4",
    "nunjucks": "^3.2.4",
    "openai": "^7.20.0",
    "opener": "^1.5.2",
    "ora": "^9.3.0",
    "parse5": "^8.0.0",
    "posthog-node": "~5.24.10",
    "protobufjs": "^8.7.2",
    "proxy-agent": "^8.0.0",
    "proxy-from-env": "^2.1.0",
    "python-shell": "^5.0.0",
    "rfdc": "^1.4.1",
    "saxes": "^6.0.0",
    "semver": "^7.7.4",
    "signal-exit": "4.1.0",
    "simple-git": "^4.0.2",
    "socket.io": "^4.8.4",
    "socket.io-client": "^4.8.4",
    "text-extensions": "^3.1.0",
    "tsx": "^4.23.11",
    "undici": ">=7.29.1 <8",
    "winston": "^3.19.0",
    "ws": "^8.21.3",
    "zod": "^4.3.6"
  },
  "madge": {
    "detectiveOptions": {
      "ts": {
        "skipAsyncImports": true
      },
      "tsx": {
        "skipAsyncImports": true
      }
    }
  },
  "pnpm": {
    "onlyBuiltDependencies": [
      "@huggingface/transformers",
      "core-js",
      "core-js-pure",
      "esbuild",
      "protobufjs",
      "sharp"
    ],
    "ignoredBuiltDependencies": []
  },
  "homepage": "https://promptfoo.dev",
  "peerDependencies": {
    "@huggingface/transformers": "*",
    "@ibm-cloud/watsonx-ai": "*",
    "@langfuse/client": "*",
    "@openai/agents": "*",
    "@openai/codex-security": "^0.2.0",
    "@slack/web-api": "*",
    "ibm-cloud-sdk-core": "*",
    "playwright": "*",
    "playwright-extra": "*",
    "puppeteer-extra-plugin-stealth": "*"
  },
  "peerDependenciesMeta": {
    "@huggingface/transformers": {
      "optional": true
    },
    "@ibm-cloud/watsonx-ai": {
      "optional": true
    },
    "@langfuse/client": {
      "optional": true
    },
    "@openai/agents": {
      "optional": true
    },
    "@openai/codex-security": {
      "optional": true
    },
    "@slack/web-api": {
      "optional": true
    },
    "ibm-cloud-sdk-core": {
      "optional": true
    },
    "playwright": {
      "optional": true
    },
    "playwright-extra": {
      "optional": true
    },
    "puppeteer-extra-plugin-stealth": {
      "optional": true
    }
  }
}
