[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-promptfoo-promptfoo-redteam-setup":3,"mdc--86320e-key":51,"related-org-promptfoo-promptfoo-redteam-setup":1495,"related-repo-promptfoo-promptfoo-redteam-setup":1543},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":10,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":46,"sourceUrl":49,"mdContent":50},"promptfoo-redteam-setup","configure promptfoo redteam security setups","Create or refine promptfoo redteam setup configs: purpose, targets, plugins, strategies, frameworks, multi-input target inputs, policy text, grader guidance, contexts, and static-code-derived target\u002Fthreat mapping. Use when preparing a red team scan plan from live probes, code evidence, or provider configs, or when generating adversarial test cases for QA. Do not use for basic provider wiring alone or for running\u002Fevaluating an already-generated redteam scan.\n",{"slug":8,"name":8,"logoUrl":9,"githubOrg":8},"promptfoo","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fpromptfoo.png",[11,15,16,19],{"name":12,"slug":13,"type":14},"Security","security","tag",{"name":8,"slug":8,"type":14},{"name":17,"slug":18,"type":14},"Configuration","configuration",{"name":20,"slug":21,"type":14},"Evals","evals",23182,"https:\u002F\u002Fgithub.com\u002Fpromptfoo\u002Fpromptfoo","2026-07-18T05:48:36.82567",null,2079,[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"ci","ci-cd","cicd","evaluation","evaluation-framework","llm","llm-eval","llm-evaluation","llm-evaluation-framework","llmops","pentesting","prompt-engineering","prompt-testing","prompts","rag","red-teaming","testing","vulnerability-scanners",{"repoUrl":23,"stars":22,"forks":26,"topics":47,"description":48},[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"Test your prompts, agents, and RAGs. Red teaming\u002Fpentesting\u002Fvulnerability scanning for AI. Compare performance of GPT, Claude, Gemini, DeepSeek, and more. Simple declarative configs with command line and CI\u002FCD integration.  Used by OpenAI and Anthropic.","https:\u002F\u002Fgithub.com\u002Fpromptfoo\u002Fpromptfoo\u002Ftree\u002FHEAD\u002Fplugins\u002Fpromptfoo\u002Fskills\u002Fpromptfoo-redteam-setup","---\nname: promptfoo-redteam-setup\ndescription: >\n  Create or refine promptfoo redteam setup configs: purpose, targets, plugins,\n  strategies, frameworks, multi-input target inputs, policy text, grader\n  guidance, contexts, and static-code-derived target\u002Fthreat mapping. Use when\n  preparing a red team scan plan from live probes, code evidence, or provider\n  configs, or when generating adversarial test cases for QA. Do not use for\n  basic provider wiring alone or for running\u002Fevaluating an already-generated\n  redteam scan.\n---\n\n# Promptfoo Redteam Setup\n\nBuild a small, explicit redteam config that matches the real app threat model.\nStart with a narrow scan that can be generated and inspected, then expand.\n\nRead `references\u002Fredteam-setup-patterns.md` when you need concrete YAML\npatterns.\nFor OpenAPI specs, you can run the bundled\n`scripts\u002Fopenapi-operation-to-redteam-config.mjs` to draft a one-operation\nredteam setup config, then inspect the inferred inputs, policy, and plugins. The\nscript ships in this skill's `scripts\u002F` directory; when the skill is installed as\na plugin it lives in the plugin cache, not your project, so run it by its absolute\npath (or copy it in) rather than a bare `scripts\u002F...` path.\nWith `--token-env`, it infers Bearer\u002FOAuth2\u002FOpenID and header\u002Fquery\u002Fcookie API-key auth; use\n`--auth-header`\u002F`--auth-prefix` to override.\nFor live connectivity QA, add `--smoke-test true` to include one deterministic\n`tests` row that can be run with `npm run local -- eval -c ... --no-cache`\nbefore redteam generation.\n\n## Inputs\n\nInfer these from the repo, docs, or user prompt:\n\n- Target shape: HTTP\u002FAPI, model provider, custom provider, agent, RAG, MCP\u002Ftool\n  system, or multi-input app.\n- Purpose: who uses the system, what it may access or do, and what it must\n  refuse or protect.\n- Trust boundaries: identities, object IDs, documents, tools, secrets,\n  permissions, and external content.\n- Discovery evidence: live probe trace, route\u002Fcontroller files, OpenAPI specs,\n  existing tests, SDK clients, or provider wrappers.\n- First-pass scope: risk categories the user cares about most.\n\nIf target wiring is missing, use `promptfoo-provider-setup` first or create a\nTODO-marked target block and validate it before generation.\n\n## Workflow\n\n### 1. Derive target facts from live or static evidence\n\n- For live endpoints, use only safe probes and keep the request\u002Fresponse trace\n  that proves method, path, auth, body\u002Fquery fields, and response path.\n- For static code, search route handlers, API clients, tests, and auth\u002Fobject\n  checks with `rg`; capture file paths and line numbers for the setup notes.\n- Preserve identity, tenant, role, object, document, and tool\u002Faction fields as\n  target `inputs`; these are the attack surface for authorization plugins.\n- Convert evidence into risks: object IDs imply `bola`, role\u002Fpermission checks\n  imply `rbac`\u002F`bfla`, free-form instructions imply prompt-boundary plugins,\n  tool URLs or shell\u002Fdatabase calls imply SSRF\u002Finjection\u002Ftool plugins.\n- Use a JavaScript or Python local wrapper when static code is easier and safer\n  to exercise than the deployed endpoint; otherwise map the live HTTP contract\n  directly.\n\n### 2. Write the target and purpose\n\n- Prefer `targets` for redteam configs.\n- Add stable `label`; reports and generated files use it for continuity.\n- For single-input targets, include a prompt template or set `redteam.injectVar`\n  so generation lands in the variable the target actually uses.\n- For multi-input targets, define `inputs` on the target. Do not set\n  `redteam.injectVar` or invent a synthetic `prompt` field.\n- Write `redteam.purpose` as security-relevant behavior: allowed users\u002Factions,\n  forbidden data\u002Factions, and domain-specific constraints.\n\n### 3. Choose a small plugin set\n\nAvoid `plugins: default` for an initial scan unless the user explicitly wants a\nbroad run.\n\nPick 2-5 plugins from the app's real risks:\n\n- Policy\u002Fbusiness rules: `policy`\n- Authorization and object access: `bola`, `bfla`, `rbac`\n- Prompt boundaries: `hijacking`, `prompt-extraction`, `system-prompt-override`\n- RAG\u002Fdocument workflows: `indirect-prompt-injection`,\n  `rag-document-exfiltration`, `rag-poisoning`, `rag-source-attribution`\n- Tool\u002Fagent systems: `excessive-agency`, `tool-discovery`, `debug-access`,\n  `shell-injection`, `sql-injection`, `ssrf`\n- Privacy: `pii:direct`, `pii:session`, `pii:social`\n- Domain packs: use finance, medical, insurance, ecommerce, real estate,\n  telecom, teen-safety, or pharmacy plugins only when that domain is real.\n\nFor `policy`, include inline policy text unless the user intentionally references\na resolved Promptfoo Cloud policy object.\n\n### 4. Choose strategies conservatively\n\n- Use `jailbreak:meta` for the default first setup\u002Fgeneration pass.\n- Use `jailbreak:hydra` instead when the target is stateful, supports\n  multi-turn conversations, and sessions are configured.\n- Add broader follow-up strategies such as `jailbreak:composite` only after the\n  first generated cases look sane.\n\n### 5. Configure generation and grading\n\n- Use Promptfoo's default redteam generation unless a specific generator or\n  model is needed for reproducibility, cost, or fixture QA.\n- When using `redteam.provider: file:\u002F\u002F...`, make the path valid from the\n  command working directory; JavaScript providers expose `callApi`, while Python\n  providers expose `call_api` or the function named in a `file:\u002F\u002Fx.py:name`\n  suffix. Run commands from the repo root unless the project convention says\n  otherwise.\n- For deterministic QA, use a small local file provider that returns Promptfoo's\n  expected prompt format.\n- Use high-value plugins such as `bola` and `bfla` whenever target evidence\n  shows object IDs, ownership checks, or authorization boundaries.\n- Use `redteam.maxConcurrency: 1` for fragile local providers or rate-limited\n  targets.\n- Add plugin-level `graderGuidance` and `graderExamples` only when default\n  grading would misunderstand domain-specific allowed behavior.\n\n### 6. Validate and generate\n\nFrom the promptfoo repo:\n\n```bash\nnpm run local -- validate config -c path\u002Fto\u002Fpromptfooconfig.yaml\nnpm run local -- validate target -c path\u002Fto\u002Fpromptfooconfig.yaml\nnpm run local -- redteam generate -c path\u002Fto\u002Fpromptfooconfig.yaml -o \u002Ftmp\u002Fredteam.yaml --no-cache --force --no-progress-bar --strict\n```\n\nOutside the repo (installed plugin or your own project), use the published CLI:\n\n```bash\nnpx promptfoo@latest validate config -c path\u002Fto\u002Fpromptfooconfig.yaml\nnpx promptfoo@latest redteam generate -c path\u002Fto\u002Fpromptfooconfig.yaml -o \u002Ftmp\u002Fredteam.yaml --no-cache --force --no-progress-bar --strict\n```\n\nUse a non-precreated output path or keep `--force`; `redteam generate` reads an\nexisting output file to compare metadata and an empty temp file can fail before\ngeneration. Inspect generated YAML for `tests`, `assert`,\nper-test `metadata.pluginId`, `defaultTest.metadata.purpose`, and preserved\nmulti-input vars. Do not proceed to `redteam run` until generated cases are\nplausible.\n\nIf the target uses config-relative `file:\u002F\u002F.\u002Ftarget.js` or `file:\u002F\u002F.\u002Ftarget.py`,\nwrite generated YAML next to the source config or switch the target to a stable\nabsolute\u002Frepo-root path before validating; `\u002Ftmp\u002Fredteam.yaml` makes relative\nfile targets resolve under `\u002Ftmp`.\n\n## Common Mistakes\n\n```yaml\n# WRONG: too broad for a first pass\nredteam:\n  plugins:\n    - default\n\n# BETTER: risk-led starter\nredteam:\n  plugins:\n    - id: policy\n      config:\n        policy: The assistant must not disclose another user's records.\n    - bola\n    - rbac\n```\n\n```yaml\n# WRONG: multi-input mode configured under redteam\nredteam:\n  injectVar: message\n\n# BETTER: define real input variables on the target\ntargets:\n  - id: https\n    inputs:\n      user_id: Signed-in user identifier.\n      record_id: Record being requested.\n      message: User message.\n```\n\n## Output Contract\n\nWhen done, state:\n\n- Target mode and whether `promptfoo-provider-setup` was needed\n- Purpose summary and selected plugin\u002Fstrategy rationale\n- Files created or changed\n- Validation\u002Fgeneration commands run and generated test count\n- Risks intentionally deferred to a later scan\n",{"data":52,"body":53},{"name":4,"description":6},{"type":54,"children":55},"root",[56,64,70,156,163,168,198,211,217,224,290,296,378,384,397,402,573,585,591,632,638,739,745,750,915,920,1007,1065,1102,1108,1290,1443,1449,1454,1489],{"type":57,"tag":58,"props":59,"children":60},"element","h1",{"id":4},[61],{"type":62,"value":63},"text","Promptfoo Redteam Setup",{"type":57,"tag":65,"props":66,"children":67},"p",{},[68],{"type":62,"value":69},"Build a small, explicit redteam config that matches the real app threat model.\nStart with a narrow scan that can be generated and inspected, then expand.",{"type":57,"tag":65,"props":71,"children":72},{},[73,75,82,84,90,92,98,100,106,108,114,116,122,124,130,132,138,140,146,148,154],{"type":62,"value":74},"Read ",{"type":57,"tag":76,"props":77,"children":79},"code",{"className":78},[],[80],{"type":62,"value":81},"references\u002Fredteam-setup-patterns.md",{"type":62,"value":83}," when you need concrete YAML\npatterns.\nFor OpenAPI specs, you can run the bundled\n",{"type":57,"tag":76,"props":85,"children":87},{"className":86},[],[88],{"type":62,"value":89},"scripts\u002Fopenapi-operation-to-redteam-config.mjs",{"type":62,"value":91}," to draft a one-operation\nredteam setup config, then inspect the inferred inputs, policy, and plugins. The\nscript ships in this skill's ",{"type":57,"tag":76,"props":93,"children":95},{"className":94},[],[96],{"type":62,"value":97},"scripts\u002F",{"type":62,"value":99}," directory; when the skill is installed as\na plugin it lives in the plugin cache, not your project, so run it by its absolute\npath (or copy it in) rather than a bare ",{"type":57,"tag":76,"props":101,"children":103},{"className":102},[],[104],{"type":62,"value":105},"scripts\u002F...",{"type":62,"value":107}," path.\nWith ",{"type":57,"tag":76,"props":109,"children":111},{"className":110},[],[112],{"type":62,"value":113},"--token-env",{"type":62,"value":115},", it infers Bearer\u002FOAuth2\u002FOpenID and header\u002Fquery\u002Fcookie API-key auth; use\n",{"type":57,"tag":76,"props":117,"children":119},{"className":118},[],[120],{"type":62,"value":121},"--auth-header",{"type":62,"value":123},"\u002F",{"type":57,"tag":76,"props":125,"children":127},{"className":126},[],[128],{"type":62,"value":129},"--auth-prefix",{"type":62,"value":131}," to override.\nFor live connectivity QA, add ",{"type":57,"tag":76,"props":133,"children":135},{"className":134},[],[136],{"type":62,"value":137},"--smoke-test true",{"type":62,"value":139}," to include one deterministic\n",{"type":57,"tag":76,"props":141,"children":143},{"className":142},[],[144],{"type":62,"value":145},"tests",{"type":62,"value":147}," row that can be run with ",{"type":57,"tag":76,"props":149,"children":151},{"className":150},[],[152],{"type":62,"value":153},"npm run local -- eval -c ... --no-cache",{"type":62,"value":155},"\nbefore redteam generation.",{"type":57,"tag":157,"props":158,"children":160},"h2",{"id":159},"inputs",[161],{"type":62,"value":162},"Inputs",{"type":57,"tag":65,"props":164,"children":165},{},[166],{"type":62,"value":167},"Infer these from the repo, docs, or user prompt:",{"type":57,"tag":169,"props":170,"children":171},"ul",{},[172,178,183,188,193],{"type":57,"tag":173,"props":174,"children":175},"li",{},[176],{"type":62,"value":177},"Target shape: HTTP\u002FAPI, model provider, custom provider, agent, RAG, MCP\u002Ftool\nsystem, or multi-input app.",{"type":57,"tag":173,"props":179,"children":180},{},[181],{"type":62,"value":182},"Purpose: who uses the system, what it may access or do, and what it must\nrefuse or protect.",{"type":57,"tag":173,"props":184,"children":185},{},[186],{"type":62,"value":187},"Trust boundaries: identities, object IDs, documents, tools, secrets,\npermissions, and external content.",{"type":57,"tag":173,"props":189,"children":190},{},[191],{"type":62,"value":192},"Discovery evidence: live probe trace, route\u002Fcontroller files, OpenAPI specs,\nexisting tests, SDK clients, or provider wrappers.",{"type":57,"tag":173,"props":194,"children":195},{},[196],{"type":62,"value":197},"First-pass scope: risk categories the user cares about most.",{"type":57,"tag":65,"props":199,"children":200},{},[201,203,209],{"type":62,"value":202},"If target wiring is missing, use ",{"type":57,"tag":76,"props":204,"children":206},{"className":205},[],[207],{"type":62,"value":208},"promptfoo-provider-setup",{"type":62,"value":210}," first or create a\nTODO-marked target block and validate it before generation.",{"type":57,"tag":157,"props":212,"children":214},{"id":213},"workflow",[215],{"type":62,"value":216},"Workflow",{"type":57,"tag":218,"props":219,"children":221},"h3",{"id":220},"_1-derive-target-facts-from-live-or-static-evidence",[222],{"type":62,"value":223},"1. Derive target facts from live or static evidence",{"type":57,"tag":169,"props":225,"children":226},{},[227,232,245,257,285],{"type":57,"tag":173,"props":228,"children":229},{},[230],{"type":62,"value":231},"For live endpoints, use only safe probes and keep the request\u002Fresponse trace\nthat proves method, path, auth, body\u002Fquery fields, and response path.",{"type":57,"tag":173,"props":233,"children":234},{},[235,237,243],{"type":62,"value":236},"For static code, search route handlers, API clients, tests, and auth\u002Fobject\nchecks with ",{"type":57,"tag":76,"props":238,"children":240},{"className":239},[],[241],{"type":62,"value":242},"rg",{"type":62,"value":244},"; capture file paths and line numbers for the setup notes.",{"type":57,"tag":173,"props":246,"children":247},{},[248,250,255],{"type":62,"value":249},"Preserve identity, tenant, role, object, document, and tool\u002Faction fields as\ntarget ",{"type":57,"tag":76,"props":251,"children":253},{"className":252},[],[254],{"type":62,"value":159},{"type":62,"value":256},"; these are the attack surface for authorization plugins.",{"type":57,"tag":173,"props":258,"children":259},{},[260,262,268,270,276,277,283],{"type":62,"value":261},"Convert evidence into risks: object IDs imply ",{"type":57,"tag":76,"props":263,"children":265},{"className":264},[],[266],{"type":62,"value":267},"bola",{"type":62,"value":269},", role\u002Fpermission checks\nimply ",{"type":57,"tag":76,"props":271,"children":273},{"className":272},[],[274],{"type":62,"value":275},"rbac",{"type":62,"value":123},{"type":57,"tag":76,"props":278,"children":280},{"className":279},[],[281],{"type":62,"value":282},"bfla",{"type":62,"value":284},", free-form instructions imply prompt-boundary plugins,\ntool URLs or shell\u002Fdatabase calls imply SSRF\u002Finjection\u002Ftool plugins.",{"type":57,"tag":173,"props":286,"children":287},{},[288],{"type":62,"value":289},"Use a JavaScript or Python local wrapper when static code is easier and safer\nto exercise than the deployed endpoint; otherwise map the live HTTP contract\ndirectly.",{"type":57,"tag":218,"props":291,"children":293},{"id":292},"_2-write-the-target-and-purpose",[294],{"type":62,"value":295},"2. Write the target and purpose",{"type":57,"tag":169,"props":297,"children":298},{},[299,312,325,338,365],{"type":57,"tag":173,"props":300,"children":301},{},[302,304,310],{"type":62,"value":303},"Prefer ",{"type":57,"tag":76,"props":305,"children":307},{"className":306},[],[308],{"type":62,"value":309},"targets",{"type":62,"value":311}," for redteam configs.",{"type":57,"tag":173,"props":313,"children":314},{},[315,317,323],{"type":62,"value":316},"Add stable ",{"type":57,"tag":76,"props":318,"children":320},{"className":319},[],[321],{"type":62,"value":322},"label",{"type":62,"value":324},"; reports and generated files use it for continuity.",{"type":57,"tag":173,"props":326,"children":327},{},[328,330,336],{"type":62,"value":329},"For single-input targets, include a prompt template or set ",{"type":57,"tag":76,"props":331,"children":333},{"className":332},[],[334],{"type":62,"value":335},"redteam.injectVar",{"type":62,"value":337},"\nso generation lands in the variable the target actually uses.",{"type":57,"tag":173,"props":339,"children":340},{},[341,343,348,350,355,357,363],{"type":62,"value":342},"For multi-input targets, define ",{"type":57,"tag":76,"props":344,"children":346},{"className":345},[],[347],{"type":62,"value":159},{"type":62,"value":349}," on the target. Do not set\n",{"type":57,"tag":76,"props":351,"children":353},{"className":352},[],[354],{"type":62,"value":335},{"type":62,"value":356}," or invent a synthetic ",{"type":57,"tag":76,"props":358,"children":360},{"className":359},[],[361],{"type":62,"value":362},"prompt",{"type":62,"value":364}," field.",{"type":57,"tag":173,"props":366,"children":367},{},[368,370,376],{"type":62,"value":369},"Write ",{"type":57,"tag":76,"props":371,"children":373},{"className":372},[],[374],{"type":62,"value":375},"redteam.purpose",{"type":62,"value":377}," as security-relevant behavior: allowed users\u002Factions,\nforbidden data\u002Factions, and domain-specific constraints.",{"type":57,"tag":218,"props":379,"children":381},{"id":380},"_3-choose-a-small-plugin-set",[382],{"type":62,"value":383},"3. Choose a small plugin set",{"type":57,"tag":65,"props":385,"children":386},{},[387,389,395],{"type":62,"value":388},"Avoid ",{"type":57,"tag":76,"props":390,"children":392},{"className":391},[],[393],{"type":62,"value":394},"plugins: default",{"type":62,"value":396}," for an initial scan unless the user explicitly wants a\nbroad run.",{"type":57,"tag":65,"props":398,"children":399},{},[400],{"type":62,"value":401},"Pick 2-5 plugins from the app's real risks:",{"type":57,"tag":169,"props":403,"children":404},{},[405,416,439,464,497,543,568],{"type":57,"tag":173,"props":406,"children":407},{},[408,410],{"type":62,"value":409},"Policy\u002Fbusiness rules: ",{"type":57,"tag":76,"props":411,"children":413},{"className":412},[],[414],{"type":62,"value":415},"policy",{"type":57,"tag":173,"props":417,"children":418},{},[419,421,426,428,433,434],{"type":62,"value":420},"Authorization and object access: ",{"type":57,"tag":76,"props":422,"children":424},{"className":423},[],[425],{"type":62,"value":267},{"type":62,"value":427},", ",{"type":57,"tag":76,"props":429,"children":431},{"className":430},[],[432],{"type":62,"value":282},{"type":62,"value":427},{"type":57,"tag":76,"props":435,"children":437},{"className":436},[],[438],{"type":62,"value":275},{"type":57,"tag":173,"props":440,"children":441},{},[442,444,450,451,457,458],{"type":62,"value":443},"Prompt boundaries: ",{"type":57,"tag":76,"props":445,"children":447},{"className":446},[],[448],{"type":62,"value":449},"hijacking",{"type":62,"value":427},{"type":57,"tag":76,"props":452,"children":454},{"className":453},[],[455],{"type":62,"value":456},"prompt-extraction",{"type":62,"value":427},{"type":57,"tag":76,"props":459,"children":461},{"className":460},[],[462],{"type":62,"value":463},"system-prompt-override",{"type":57,"tag":173,"props":465,"children":466},{},[467,469,475,477,483,484,490,491],{"type":62,"value":468},"RAG\u002Fdocument workflows: ",{"type":57,"tag":76,"props":470,"children":472},{"className":471},[],[473],{"type":62,"value":474},"indirect-prompt-injection",{"type":62,"value":476},",\n",{"type":57,"tag":76,"props":478,"children":480},{"className":479},[],[481],{"type":62,"value":482},"rag-document-exfiltration",{"type":62,"value":427},{"type":57,"tag":76,"props":485,"children":487},{"className":486},[],[488],{"type":62,"value":489},"rag-poisoning",{"type":62,"value":427},{"type":57,"tag":76,"props":492,"children":494},{"className":493},[],[495],{"type":62,"value":496},"rag-source-attribution",{"type":57,"tag":173,"props":498,"children":499},{},[500,502,508,509,515,516,522,523,529,530,536,537],{"type":62,"value":501},"Tool\u002Fagent systems: ",{"type":57,"tag":76,"props":503,"children":505},{"className":504},[],[506],{"type":62,"value":507},"excessive-agency",{"type":62,"value":427},{"type":57,"tag":76,"props":510,"children":512},{"className":511},[],[513],{"type":62,"value":514},"tool-discovery",{"type":62,"value":427},{"type":57,"tag":76,"props":517,"children":519},{"className":518},[],[520],{"type":62,"value":521},"debug-access",{"type":62,"value":476},{"type":57,"tag":76,"props":524,"children":526},{"className":525},[],[527],{"type":62,"value":528},"shell-injection",{"type":62,"value":427},{"type":57,"tag":76,"props":531,"children":533},{"className":532},[],[534],{"type":62,"value":535},"sql-injection",{"type":62,"value":427},{"type":57,"tag":76,"props":538,"children":540},{"className":539},[],[541],{"type":62,"value":542},"ssrf",{"type":57,"tag":173,"props":544,"children":545},{},[546,548,554,555,561,562],{"type":62,"value":547},"Privacy: ",{"type":57,"tag":76,"props":549,"children":551},{"className":550},[],[552],{"type":62,"value":553},"pii:direct",{"type":62,"value":427},{"type":57,"tag":76,"props":556,"children":558},{"className":557},[],[559],{"type":62,"value":560},"pii:session",{"type":62,"value":427},{"type":57,"tag":76,"props":563,"children":565},{"className":564},[],[566],{"type":62,"value":567},"pii:social",{"type":57,"tag":173,"props":569,"children":570},{},[571],{"type":62,"value":572},"Domain packs: use finance, medical, insurance, ecommerce, real estate,\ntelecom, teen-safety, or pharmacy plugins only when that domain is real.",{"type":57,"tag":65,"props":574,"children":575},{},[576,578,583],{"type":62,"value":577},"For ",{"type":57,"tag":76,"props":579,"children":581},{"className":580},[],[582],{"type":62,"value":415},{"type":62,"value":584},", include inline policy text unless the user intentionally references\na resolved Promptfoo Cloud policy object.",{"type":57,"tag":218,"props":586,"children":588},{"id":587},"_4-choose-strategies-conservatively",[589],{"type":62,"value":590},"4. Choose strategies conservatively",{"type":57,"tag":169,"props":592,"children":593},{},[594,607,619],{"type":57,"tag":173,"props":595,"children":596},{},[597,599,605],{"type":62,"value":598},"Use ",{"type":57,"tag":76,"props":600,"children":602},{"className":601},[],[603],{"type":62,"value":604},"jailbreak:meta",{"type":62,"value":606}," for the default first setup\u002Fgeneration pass.",{"type":57,"tag":173,"props":608,"children":609},{},[610,611,617],{"type":62,"value":598},{"type":57,"tag":76,"props":612,"children":614},{"className":613},[],[615],{"type":62,"value":616},"jailbreak:hydra",{"type":62,"value":618}," instead when the target is stateful, supports\nmulti-turn conversations, and sessions are configured.",{"type":57,"tag":173,"props":620,"children":621},{},[622,624,630],{"type":62,"value":623},"Add broader follow-up strategies such as ",{"type":57,"tag":76,"props":625,"children":627},{"className":626},[],[628],{"type":62,"value":629},"jailbreak:composite",{"type":62,"value":631}," only after the\nfirst generated cases look sane.",{"type":57,"tag":218,"props":633,"children":635},{"id":634},"_5-configure-generation-and-grading",[636],{"type":62,"value":637},"5. Configure generation and grading",{"type":57,"tag":169,"props":639,"children":640},{},[641,646,683,688,707,719],{"type":57,"tag":173,"props":642,"children":643},{},[644],{"type":62,"value":645},"Use Promptfoo's default redteam generation unless a specific generator or\nmodel is needed for reproducibility, cost, or fixture QA.",{"type":57,"tag":173,"props":647,"children":648},{},[649,651,657,659,665,667,673,675,681],{"type":62,"value":650},"When using ",{"type":57,"tag":76,"props":652,"children":654},{"className":653},[],[655],{"type":62,"value":656},"redteam.provider: file:\u002F\u002F...",{"type":62,"value":658},", make the path valid from the\ncommand working directory; JavaScript providers expose ",{"type":57,"tag":76,"props":660,"children":662},{"className":661},[],[663],{"type":62,"value":664},"callApi",{"type":62,"value":666},", while Python\nproviders expose ",{"type":57,"tag":76,"props":668,"children":670},{"className":669},[],[671],{"type":62,"value":672},"call_api",{"type":62,"value":674}," or the function named in a ",{"type":57,"tag":76,"props":676,"children":678},{"className":677},[],[679],{"type":62,"value":680},"file:\u002F\u002Fx.py:name",{"type":62,"value":682},"\nsuffix. Run commands from the repo root unless the project convention says\notherwise.",{"type":57,"tag":173,"props":684,"children":685},{},[686],{"type":62,"value":687},"For deterministic QA, use a small local file provider that returns Promptfoo's\nexpected prompt format.",{"type":57,"tag":173,"props":689,"children":690},{},[691,693,698,700,705],{"type":62,"value":692},"Use high-value plugins such as ",{"type":57,"tag":76,"props":694,"children":696},{"className":695},[],[697],{"type":62,"value":267},{"type":62,"value":699}," and ",{"type":57,"tag":76,"props":701,"children":703},{"className":702},[],[704],{"type":62,"value":282},{"type":62,"value":706}," whenever target evidence\nshows object IDs, ownership checks, or authorization boundaries.",{"type":57,"tag":173,"props":708,"children":709},{},[710,711,717],{"type":62,"value":598},{"type":57,"tag":76,"props":712,"children":714},{"className":713},[],[715],{"type":62,"value":716},"redteam.maxConcurrency: 1",{"type":62,"value":718}," for fragile local providers or rate-limited\ntargets.",{"type":57,"tag":173,"props":720,"children":721},{},[722,724,730,731,737],{"type":62,"value":723},"Add plugin-level ",{"type":57,"tag":76,"props":725,"children":727},{"className":726},[],[728],{"type":62,"value":729},"graderGuidance",{"type":62,"value":699},{"type":57,"tag":76,"props":732,"children":734},{"className":733},[],[735],{"type":62,"value":736},"graderExamples",{"type":62,"value":738}," only when default\ngrading would misunderstand domain-specific allowed behavior.",{"type":57,"tag":218,"props":740,"children":742},{"id":741},"_6-validate-and-generate",[743],{"type":62,"value":744},"6. Validate and generate",{"type":57,"tag":65,"props":746,"children":747},{},[748],{"type":62,"value":749},"From the promptfoo repo:",{"type":57,"tag":751,"props":752,"children":757},"pre",{"className":753,"code":754,"language":755,"meta":756,"style":756},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm run local -- validate config -c path\u002Fto\u002Fpromptfooconfig.yaml\nnpm run local -- validate target -c path\u002Fto\u002Fpromptfooconfig.yaml\nnpm run local -- redteam generate -c path\u002Fto\u002Fpromptfooconfig.yaml -o \u002Ftmp\u002Fredteam.yaml --no-cache --force --no-progress-bar --strict\n","bash","",[758],{"type":57,"tag":76,"props":759,"children":760},{"__ignoreMap":756},[761,809,846],{"type":57,"tag":762,"props":763,"children":766},"span",{"class":764,"line":765},"line",1,[767,773,779,784,789,794,799,804],{"type":57,"tag":762,"props":768,"children":770},{"style":769},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[771],{"type":62,"value":772},"npm",{"type":57,"tag":762,"props":774,"children":776},{"style":775},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[777],{"type":62,"value":778}," run",{"type":57,"tag":762,"props":780,"children":781},{"style":775},[782],{"type":62,"value":783}," local",{"type":57,"tag":762,"props":785,"children":786},{"style":775},[787],{"type":62,"value":788}," --",{"type":57,"tag":762,"props":790,"children":791},{"style":775},[792],{"type":62,"value":793}," validate",{"type":57,"tag":762,"props":795,"children":796},{"style":775},[797],{"type":62,"value":798}," config",{"type":57,"tag":762,"props":800,"children":801},{"style":775},[802],{"type":62,"value":803}," -c",{"type":57,"tag":762,"props":805,"children":806},{"style":775},[807],{"type":62,"value":808}," path\u002Fto\u002Fpromptfooconfig.yaml\n",{"type":57,"tag":762,"props":810,"children":812},{"class":764,"line":811},2,[813,817,821,825,829,833,838,842],{"type":57,"tag":762,"props":814,"children":815},{"style":769},[816],{"type":62,"value":772},{"type":57,"tag":762,"props":818,"children":819},{"style":775},[820],{"type":62,"value":778},{"type":57,"tag":762,"props":822,"children":823},{"style":775},[824],{"type":62,"value":783},{"type":57,"tag":762,"props":826,"children":827},{"style":775},[828],{"type":62,"value":788},{"type":57,"tag":762,"props":830,"children":831},{"style":775},[832],{"type":62,"value":793},{"type":57,"tag":762,"props":834,"children":835},{"style":775},[836],{"type":62,"value":837}," target",{"type":57,"tag":762,"props":839,"children":840},{"style":775},[841],{"type":62,"value":803},{"type":57,"tag":762,"props":843,"children":844},{"style":775},[845],{"type":62,"value":808},{"type":57,"tag":762,"props":847,"children":849},{"class":764,"line":848},3,[850,854,858,862,866,871,876,880,885,890,895,900,905,910],{"type":57,"tag":762,"props":851,"children":852},{"style":769},[853],{"type":62,"value":772},{"type":57,"tag":762,"props":855,"children":856},{"style":775},[857],{"type":62,"value":778},{"type":57,"tag":762,"props":859,"children":860},{"style":775},[861],{"type":62,"value":783},{"type":57,"tag":762,"props":863,"children":864},{"style":775},[865],{"type":62,"value":788},{"type":57,"tag":762,"props":867,"children":868},{"style":775},[869],{"type":62,"value":870}," redteam",{"type":57,"tag":762,"props":872,"children":873},{"style":775},[874],{"type":62,"value":875}," generate",{"type":57,"tag":762,"props":877,"children":878},{"style":775},[879],{"type":62,"value":803},{"type":57,"tag":762,"props":881,"children":882},{"style":775},[883],{"type":62,"value":884}," path\u002Fto\u002Fpromptfooconfig.yaml",{"type":57,"tag":762,"props":886,"children":887},{"style":775},[888],{"type":62,"value":889}," -o",{"type":57,"tag":762,"props":891,"children":892},{"style":775},[893],{"type":62,"value":894}," \u002Ftmp\u002Fredteam.yaml",{"type":57,"tag":762,"props":896,"children":897},{"style":775},[898],{"type":62,"value":899}," --no-cache",{"type":57,"tag":762,"props":901,"children":902},{"style":775},[903],{"type":62,"value":904}," --force",{"type":57,"tag":762,"props":906,"children":907},{"style":775},[908],{"type":62,"value":909}," --no-progress-bar",{"type":57,"tag":762,"props":911,"children":912},{"style":775},[913],{"type":62,"value":914}," --strict\n",{"type":57,"tag":65,"props":916,"children":917},{},[918],{"type":62,"value":919},"Outside the repo (installed plugin or your own project), use the published CLI:",{"type":57,"tag":751,"props":921,"children":923},{"className":753,"code":922,"language":755,"meta":756,"style":756},"npx promptfoo@latest validate config -c path\u002Fto\u002Fpromptfooconfig.yaml\nnpx promptfoo@latest redteam generate -c path\u002Fto\u002Fpromptfooconfig.yaml -o \u002Ftmp\u002Fredteam.yaml --no-cache --force --no-progress-bar --strict\n",[924],{"type":57,"tag":76,"props":925,"children":926},{"__ignoreMap":756},[927,956],{"type":57,"tag":762,"props":928,"children":929},{"class":764,"line":765},[930,935,940,944,948,952],{"type":57,"tag":762,"props":931,"children":932},{"style":769},[933],{"type":62,"value":934},"npx",{"type":57,"tag":762,"props":936,"children":937},{"style":775},[938],{"type":62,"value":939}," promptfoo@latest",{"type":57,"tag":762,"props":941,"children":942},{"style":775},[943],{"type":62,"value":793},{"type":57,"tag":762,"props":945,"children":946},{"style":775},[947],{"type":62,"value":798},{"type":57,"tag":762,"props":949,"children":950},{"style":775},[951],{"type":62,"value":803},{"type":57,"tag":762,"props":953,"children":954},{"style":775},[955],{"type":62,"value":808},{"type":57,"tag":762,"props":957,"children":958},{"class":764,"line":811},[959,963,967,971,975,979,983,987,991,995,999,1003],{"type":57,"tag":762,"props":960,"children":961},{"style":769},[962],{"type":62,"value":934},{"type":57,"tag":762,"props":964,"children":965},{"style":775},[966],{"type":62,"value":939},{"type":57,"tag":762,"props":968,"children":969},{"style":775},[970],{"type":62,"value":870},{"type":57,"tag":762,"props":972,"children":973},{"style":775},[974],{"type":62,"value":875},{"type":57,"tag":762,"props":976,"children":977},{"style":775},[978],{"type":62,"value":803},{"type":57,"tag":762,"props":980,"children":981},{"style":775},[982],{"type":62,"value":884},{"type":57,"tag":762,"props":984,"children":985},{"style":775},[986],{"type":62,"value":889},{"type":57,"tag":762,"props":988,"children":989},{"style":775},[990],{"type":62,"value":894},{"type":57,"tag":762,"props":992,"children":993},{"style":775},[994],{"type":62,"value":899},{"type":57,"tag":762,"props":996,"children":997},{"style":775},[998],{"type":62,"value":904},{"type":57,"tag":762,"props":1000,"children":1001},{"style":775},[1002],{"type":62,"value":909},{"type":57,"tag":762,"props":1004,"children":1005},{"style":775},[1006],{"type":62,"value":914},{"type":57,"tag":65,"props":1008,"children":1009},{},[1010,1012,1018,1020,1026,1028,1033,1034,1040,1042,1048,1049,1055,1057,1063],{"type":62,"value":1011},"Use a non-precreated output path or keep ",{"type":57,"tag":76,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":62,"value":1017},"--force",{"type":62,"value":1019},"; ",{"type":57,"tag":76,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":62,"value":1025},"redteam generate",{"type":62,"value":1027}," reads an\nexisting output file to compare metadata and an empty temp file can fail before\ngeneration. Inspect generated YAML for ",{"type":57,"tag":76,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":62,"value":145},{"type":62,"value":427},{"type":57,"tag":76,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":62,"value":1039},"assert",{"type":62,"value":1041},",\nper-test ",{"type":57,"tag":76,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":62,"value":1047},"metadata.pluginId",{"type":62,"value":427},{"type":57,"tag":76,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":62,"value":1054},"defaultTest.metadata.purpose",{"type":62,"value":1056},", and preserved\nmulti-input vars. Do not proceed to ",{"type":57,"tag":76,"props":1058,"children":1060},{"className":1059},[],[1061],{"type":62,"value":1062},"redteam run",{"type":62,"value":1064}," until generated cases are\nplausible.",{"type":57,"tag":65,"props":1066,"children":1067},{},[1068,1070,1076,1078,1084,1086,1092,1094,1100],{"type":62,"value":1069},"If the target uses config-relative ",{"type":57,"tag":76,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":62,"value":1075},"file:\u002F\u002F.\u002Ftarget.js",{"type":62,"value":1077}," or ",{"type":57,"tag":76,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":62,"value":1083},"file:\u002F\u002F.\u002Ftarget.py",{"type":62,"value":1085},",\nwrite generated YAML next to the source config or switch the target to a stable\nabsolute\u002Frepo-root path before validating; ",{"type":57,"tag":76,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":62,"value":1091},"\u002Ftmp\u002Fredteam.yaml",{"type":62,"value":1093}," makes relative\nfile targets resolve under ",{"type":57,"tag":76,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":62,"value":1099},"\u002Ftmp",{"type":62,"value":1101},".",{"type":57,"tag":157,"props":1103,"children":1105},{"id":1104},"common-mistakes",[1106],{"type":62,"value":1107},"Common Mistakes",{"type":57,"tag":751,"props":1109,"children":1113},{"className":1110,"code":1111,"language":1112,"meta":756,"style":756},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# WRONG: too broad for a first pass\nredteam:\n  plugins:\n    - default\n\n# BETTER: risk-led starter\nredteam:\n  plugins:\n    - id: policy\n      config:\n        policy: The assistant must not disclose another user's records.\n    - bola\n    - rbac\n","yaml",[1114],{"type":57,"tag":76,"props":1115,"children":1116},{"__ignoreMap":756},[1117,1126,1141,1153,1167,1177,1186,1198,1210,1233,1246,1264,1277],{"type":57,"tag":762,"props":1118,"children":1119},{"class":764,"line":765},[1120],{"type":57,"tag":762,"props":1121,"children":1123},{"style":1122},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1124],{"type":62,"value":1125},"# WRONG: too broad for a first pass\n",{"type":57,"tag":762,"props":1127,"children":1128},{"class":764,"line":811},[1129,1135],{"type":57,"tag":762,"props":1130,"children":1132},{"style":1131},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[1133],{"type":62,"value":1134},"redteam",{"type":57,"tag":762,"props":1136,"children":1138},{"style":1137},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1139],{"type":62,"value":1140},":\n",{"type":57,"tag":762,"props":1142,"children":1143},{"class":764,"line":848},[1144,1149],{"type":57,"tag":762,"props":1145,"children":1146},{"style":1131},[1147],{"type":62,"value":1148},"  plugins",{"type":57,"tag":762,"props":1150,"children":1151},{"style":1137},[1152],{"type":62,"value":1140},{"type":57,"tag":762,"props":1154,"children":1156},{"class":764,"line":1155},4,[1157,1162],{"type":57,"tag":762,"props":1158,"children":1159},{"style":1137},[1160],{"type":62,"value":1161},"    -",{"type":57,"tag":762,"props":1163,"children":1164},{"style":775},[1165],{"type":62,"value":1166}," default\n",{"type":57,"tag":762,"props":1168,"children":1170},{"class":764,"line":1169},5,[1171],{"type":57,"tag":762,"props":1172,"children":1174},{"emptyLinePlaceholder":1173},true,[1175],{"type":62,"value":1176},"\n",{"type":57,"tag":762,"props":1178,"children":1180},{"class":764,"line":1179},6,[1181],{"type":57,"tag":762,"props":1182,"children":1183},{"style":1122},[1184],{"type":62,"value":1185},"# BETTER: risk-led starter\n",{"type":57,"tag":762,"props":1187,"children":1189},{"class":764,"line":1188},7,[1190,1194],{"type":57,"tag":762,"props":1191,"children":1192},{"style":1131},[1193],{"type":62,"value":1134},{"type":57,"tag":762,"props":1195,"children":1196},{"style":1137},[1197],{"type":62,"value":1140},{"type":57,"tag":762,"props":1199,"children":1201},{"class":764,"line":1200},8,[1202,1206],{"type":57,"tag":762,"props":1203,"children":1204},{"style":1131},[1205],{"type":62,"value":1148},{"type":57,"tag":762,"props":1207,"children":1208},{"style":1137},[1209],{"type":62,"value":1140},{"type":57,"tag":762,"props":1211,"children":1213},{"class":764,"line":1212},9,[1214,1218,1223,1228],{"type":57,"tag":762,"props":1215,"children":1216},{"style":1137},[1217],{"type":62,"value":1161},{"type":57,"tag":762,"props":1219,"children":1220},{"style":1131},[1221],{"type":62,"value":1222}," id",{"type":57,"tag":762,"props":1224,"children":1225},{"style":1137},[1226],{"type":62,"value":1227},":",{"type":57,"tag":762,"props":1229,"children":1230},{"style":775},[1231],{"type":62,"value":1232}," policy\n",{"type":57,"tag":762,"props":1234,"children":1236},{"class":764,"line":1235},10,[1237,1242],{"type":57,"tag":762,"props":1238,"children":1239},{"style":1131},[1240],{"type":62,"value":1241},"      config",{"type":57,"tag":762,"props":1243,"children":1244},{"style":1137},[1245],{"type":62,"value":1140},{"type":57,"tag":762,"props":1247,"children":1249},{"class":764,"line":1248},11,[1250,1255,1259],{"type":57,"tag":762,"props":1251,"children":1252},{"style":1131},[1253],{"type":62,"value":1254},"        policy",{"type":57,"tag":762,"props":1256,"children":1257},{"style":1137},[1258],{"type":62,"value":1227},{"type":57,"tag":762,"props":1260,"children":1261},{"style":775},[1262],{"type":62,"value":1263}," The assistant must not disclose another user's records.\n",{"type":57,"tag":762,"props":1265,"children":1267},{"class":764,"line":1266},12,[1268,1272],{"type":57,"tag":762,"props":1269,"children":1270},{"style":1137},[1271],{"type":62,"value":1161},{"type":57,"tag":762,"props":1273,"children":1274},{"style":775},[1275],{"type":62,"value":1276}," bola\n",{"type":57,"tag":762,"props":1278,"children":1280},{"class":764,"line":1279},13,[1281,1285],{"type":57,"tag":762,"props":1282,"children":1283},{"style":1137},[1284],{"type":62,"value":1161},{"type":57,"tag":762,"props":1286,"children":1287},{"style":775},[1288],{"type":62,"value":1289}," rbac\n",{"type":57,"tag":751,"props":1291,"children":1293},{"className":1110,"code":1292,"language":1112,"meta":756,"style":756},"# WRONG: multi-input mode configured under redteam\nredteam:\n  injectVar: message\n\n# BETTER: define real input variables on the target\ntargets:\n  - id: https\n    inputs:\n      user_id: Signed-in user identifier.\n      record_id: Record being requested.\n      message: User message.\n",[1294],{"type":57,"tag":76,"props":1295,"children":1296},{"__ignoreMap":756},[1297,1305,1316,1333,1340,1348,1359,1380,1392,1409,1426],{"type":57,"tag":762,"props":1298,"children":1299},{"class":764,"line":765},[1300],{"type":57,"tag":762,"props":1301,"children":1302},{"style":1122},[1303],{"type":62,"value":1304},"# WRONG: multi-input mode configured under redteam\n",{"type":57,"tag":762,"props":1306,"children":1307},{"class":764,"line":811},[1308,1312],{"type":57,"tag":762,"props":1309,"children":1310},{"style":1131},[1311],{"type":62,"value":1134},{"type":57,"tag":762,"props":1313,"children":1314},{"style":1137},[1315],{"type":62,"value":1140},{"type":57,"tag":762,"props":1317,"children":1318},{"class":764,"line":848},[1319,1324,1328],{"type":57,"tag":762,"props":1320,"children":1321},{"style":1131},[1322],{"type":62,"value":1323},"  injectVar",{"type":57,"tag":762,"props":1325,"children":1326},{"style":1137},[1327],{"type":62,"value":1227},{"type":57,"tag":762,"props":1329,"children":1330},{"style":775},[1331],{"type":62,"value":1332}," message\n",{"type":57,"tag":762,"props":1334,"children":1335},{"class":764,"line":1155},[1336],{"type":57,"tag":762,"props":1337,"children":1338},{"emptyLinePlaceholder":1173},[1339],{"type":62,"value":1176},{"type":57,"tag":762,"props":1341,"children":1342},{"class":764,"line":1169},[1343],{"type":57,"tag":762,"props":1344,"children":1345},{"style":1122},[1346],{"type":62,"value":1347},"# BETTER: define real input variables on the target\n",{"type":57,"tag":762,"props":1349,"children":1350},{"class":764,"line":1179},[1351,1355],{"type":57,"tag":762,"props":1352,"children":1353},{"style":1131},[1354],{"type":62,"value":309},{"type":57,"tag":762,"props":1356,"children":1357},{"style":1137},[1358],{"type":62,"value":1140},{"type":57,"tag":762,"props":1360,"children":1361},{"class":764,"line":1188},[1362,1367,1371,1375],{"type":57,"tag":762,"props":1363,"children":1364},{"style":1137},[1365],{"type":62,"value":1366},"  -",{"type":57,"tag":762,"props":1368,"children":1369},{"style":1131},[1370],{"type":62,"value":1222},{"type":57,"tag":762,"props":1372,"children":1373},{"style":1137},[1374],{"type":62,"value":1227},{"type":57,"tag":762,"props":1376,"children":1377},{"style":775},[1378],{"type":62,"value":1379}," https\n",{"type":57,"tag":762,"props":1381,"children":1382},{"class":764,"line":1200},[1383,1388],{"type":57,"tag":762,"props":1384,"children":1385},{"style":1131},[1386],{"type":62,"value":1387},"    inputs",{"type":57,"tag":762,"props":1389,"children":1390},{"style":1137},[1391],{"type":62,"value":1140},{"type":57,"tag":762,"props":1393,"children":1394},{"class":764,"line":1212},[1395,1400,1404],{"type":57,"tag":762,"props":1396,"children":1397},{"style":1131},[1398],{"type":62,"value":1399},"      user_id",{"type":57,"tag":762,"props":1401,"children":1402},{"style":1137},[1403],{"type":62,"value":1227},{"type":57,"tag":762,"props":1405,"children":1406},{"style":775},[1407],{"type":62,"value":1408}," Signed-in user identifier.\n",{"type":57,"tag":762,"props":1410,"children":1411},{"class":764,"line":1235},[1412,1417,1421],{"type":57,"tag":762,"props":1413,"children":1414},{"style":1131},[1415],{"type":62,"value":1416},"      record_id",{"type":57,"tag":762,"props":1418,"children":1419},{"style":1137},[1420],{"type":62,"value":1227},{"type":57,"tag":762,"props":1422,"children":1423},{"style":775},[1424],{"type":62,"value":1425}," Record being requested.\n",{"type":57,"tag":762,"props":1427,"children":1428},{"class":764,"line":1248},[1429,1434,1438],{"type":57,"tag":762,"props":1430,"children":1431},{"style":1131},[1432],{"type":62,"value":1433},"      message",{"type":57,"tag":762,"props":1435,"children":1436},{"style":1137},[1437],{"type":62,"value":1227},{"type":57,"tag":762,"props":1439,"children":1440},{"style":775},[1441],{"type":62,"value":1442}," User message.\n",{"type":57,"tag":157,"props":1444,"children":1446},{"id":1445},"output-contract",[1447],{"type":62,"value":1448},"Output Contract",{"type":57,"tag":65,"props":1450,"children":1451},{},[1452],{"type":62,"value":1453},"When done, state:",{"type":57,"tag":169,"props":1455,"children":1456},{},[1457,1469,1474,1479,1484],{"type":57,"tag":173,"props":1458,"children":1459},{},[1460,1462,1467],{"type":62,"value":1461},"Target mode and whether ",{"type":57,"tag":76,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":62,"value":208},{"type":62,"value":1468}," was needed",{"type":57,"tag":173,"props":1470,"children":1471},{},[1472],{"type":62,"value":1473},"Purpose summary and selected plugin\u002Fstrategy rationale",{"type":57,"tag":173,"props":1475,"children":1476},{},[1477],{"type":62,"value":1478},"Files created or changed",{"type":57,"tag":173,"props":1480,"children":1481},{},[1482],{"type":62,"value":1483},"Validation\u002Fgeneration commands run and generated test count",{"type":57,"tag":173,"props":1485,"children":1486},{},[1487],{"type":62,"value":1488},"Risks intentionally deferred to a later scan",{"type":57,"tag":1490,"props":1491,"children":1492},"style",{},[1493],{"type":62,"value":1494},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1496,"total":1155},[1497,1510,1522,1536],{"slug":1498,"name":1498,"fn":1499,"description":1500,"org":1501,"tags":1502,"stars":22,"repoUrl":23,"updatedAt":1509},"promptfoo-evals","run and refine promptfoo evaluation suites","Write, refine, run, and QA non-redteam promptfoo eval suites after the target or provider already works: prompts, vars, test cases, assertions, model-graded rubrics, transforms, datasets, output exports, filters, and CI gates. Use for regression tests and eval-suite authoring. Do not use for connecting a new target\u002Fprovider, mapping HTTP requests or auth, smoke-testing an endpoint, or redteam plugin\u002Fstrategy setup; use `promptfoo-provider-setup` for connection work instead.\n",{"slug":8,"name":8,"logoUrl":9,"githubOrg":8},[1503,1504,1506,1507],{"name":20,"slug":21,"type":14},{"name":1505,"slug":33,"type":14},"LLM",{"name":8,"slug":8,"type":14},{"name":1508,"slug":44,"type":14},"Testing","2026-07-18T05:48:36.3451",{"slug":208,"name":208,"fn":1511,"description":1512,"org":1513,"tags":1514,"stars":22,"repoUrl":23,"updatedAt":1521},"configure promptfoo providers and targets","Configure promptfoo providers or redteam targets for hosted models, live HTTP APIs, Python\u002FJavaScript local scripts, agent SDKs, or multi-input systems. Use when connecting promptfoo to the system under test, mapping vars, auth env vars, request bodies, response transforms, or static-code-derived provider wrappers. Do not use for choosing eval assertions or red team plugins unless a smoke test is needed to verify the connection.\n",{"slug":8,"name":8,"logoUrl":9,"githubOrg":8},[1515,1518,1519,1520],{"name":1516,"slug":1517,"type":14},"API Development","api-development",{"name":20,"slug":21,"type":14},{"name":1505,"slug":33,"type":14},{"name":1508,"slug":44,"type":14},"2026-07-18T05:47:13.657873",{"slug":1523,"name":1523,"fn":1524,"description":1525,"org":1526,"tags":1527,"stars":22,"repoUrl":23,"updatedAt":1535},"promptfoo-redteam-run","run promptfoo redteam security scans","Run, rerun, inspect, and QA promptfoo redteam scans from generated redteam YAML or an existing redteam setup config. Use when executing `promptfoo redteam eval` or `promptfoo redteam run`, exporting results, triaging attack success rate, grader failures, target errors, filter\u002Frerun commands, reports, or CI gates. Do not use for initial provider wiring or for choosing plugins and strategies before generation.\n",{"slug":8,"name":8,"logoUrl":9,"githubOrg":8},[1528,1531,1532,1533,1534],{"name":1529,"slug":1530,"type":14},"Code Analysis","code-analysis",{"name":20,"slug":21,"type":14},{"name":8,"slug":8,"type":14},{"name":12,"slug":13,"type":14},{"name":1508,"slug":44,"type":14},"2026-07-18T05:48:03.576002",{"slug":4,"name":4,"fn":5,"description":6,"org":1537,"tags":1538,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":8,"logoUrl":9,"githubOrg":8},[1539,1540,1541,1542],{"name":17,"slug":18,"type":14},{"name":20,"slug":21,"type":14},{"name":8,"slug":8,"type":14},{"name":12,"slug":13,"type":14},{"items":1544,"total":1155},[1545,1552,1559,1567],{"slug":1498,"name":1498,"fn":1499,"description":1500,"org":1546,"tags":1547,"stars":22,"repoUrl":23,"updatedAt":1509},{"slug":8,"name":8,"logoUrl":9,"githubOrg":8},[1548,1549,1550,1551],{"name":20,"slug":21,"type":14},{"name":1505,"slug":33,"type":14},{"name":8,"slug":8,"type":14},{"name":1508,"slug":44,"type":14},{"slug":208,"name":208,"fn":1511,"description":1512,"org":1553,"tags":1554,"stars":22,"repoUrl":23,"updatedAt":1521},{"slug":8,"name":8,"logoUrl":9,"githubOrg":8},[1555,1556,1557,1558],{"name":1516,"slug":1517,"type":14},{"name":20,"slug":21,"type":14},{"name":1505,"slug":33,"type":14},{"name":1508,"slug":44,"type":14},{"slug":1523,"name":1523,"fn":1524,"description":1525,"org":1560,"tags":1561,"stars":22,"repoUrl":23,"updatedAt":1535},{"slug":8,"name":8,"logoUrl":9,"githubOrg":8},[1562,1563,1564,1565,1566],{"name":1529,"slug":1530,"type":14},{"name":20,"slug":21,"type":14},{"name":8,"slug":8,"type":14},{"name":12,"slug":13,"type":14},{"name":1508,"slug":44,"type":14},{"slug":4,"name":4,"fn":5,"description":6,"org":1568,"tags":1569,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":8,"logoUrl":9,"githubOrg":8},[1570,1571,1572,1573],{"name":17,"slug":18,"type":14},{"name":20,"slug":21,"type":14},{"name":8,"slug":8,"type":14},{"name":12,"slug":13,"type":14}]