/promptfoo-provider-setup
Configure promptfoo providers or redteam targets for hosted models, live HTTP APIs, Python/JavaScript 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
$ npx -y skills add promptfoo/promptfoo --skill promptfoo-provider-setup --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/promptfoo-provider-setup
Context preview
The summary Claude sees to decide when to auto-load this skill.
Configure promptfoo providers or redteam targets for hosted models, live HTTP APIs, Python/JavaScript 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
SKILL.md
promptfoo-provider-setup.SKILL.mdname: promptfoo-provider-setup
description: >
Configure promptfoo providers or redteam targets for hosted models, live HTTP
APIs, Python/JavaScript 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.
Promptfoo Provider Setup
Connect Promptfoo to the system under test with the smallest reliable provider or target configuration. Prefer a working smoke test over a clever abstraction.
Read `references/provider-patterns.md` when you need concrete YAML or provider wrapper examples. For OpenAPI specs, you can run the bundled `scripts/openapi-operation-to-config.mjs` to draft a one-operation HTTP smoke config, then inspect and edit the result before probing. The script ships in this skill's `scripts/` directory; when the skill is installed as a plugin it lives in the plugin cache, not your project, so run it by its absolute path (or copy it in) rather than a bare `scripts/...` path. With `--token-env`, it infers Bearer/OAuth2/OpenID and header/query/cookie API-key auth; use `--auth-header`/`--auth-prefix` to override.
Inputs
Infer from the repo or user prompt when possible:
- Target surface: hosted model, live HTTP endpoint, local function/script, agent
harness, MCP/tool agent, or redteam target.
- Invocation shape: method, URL/path, headers, request body, input vars, auth,
streaming/statefulness, and expected response field.
- Safety boundary: whether it is okay to call the live endpoint and which sample
payload is safe.
- Output goal: eval provider block, redteam `targets` block, local provider
wrapper, or a minimal smoke-test suite.
If the contract is unclear, create a conservative TODO-marked starter and state exactly what must be verified before using it against production.
Workflow
1. Pick discovery mode
Use one of these modes, or combine them:
- **Live HTTP endpoint**: probe an already-running endpoint with safe requests.
- **Static code discovery**: inspect route handlers, OpenAPI specs, tests, SDK
clients, or existing fetch/axios calls.
- **Hybrid**: compare static contract assumptions with a live probe.
- **Wrapper mode**: write `provider.js` or `provider.py` when built-in providers
cannot express auth, signing, streaming, multi-step calls, or custom parsing.
Do not send secrets to unknown endpoints. Use `{{env.VAR}}` placeholders in configs and local environment variables only in shell commands.
2. Discover the contract
For live HTTP endpoints:
1. Start with non-mutating checks: docs URL, OpenAPI URL, health endpoint, `OPTIONS`, or a safe `GET`. 2. Make at most one safe representative call before writing config. 3. Capture the response shape and status/error behavior. 4. Prefer explicit JSON paths in `transformResponse`, such as `json.output`. 5. Use `queryParams` for query-string fields on any HTTP method, and use the `text` variable in `transformResponse` for plain-text responses. 6. Set `stateful: false` for stateless endpoints; otherwise `validate target` will run a session-memory check. For stateful apps, include `{{sessionId}}` in the request or configure server-side session parsing.
For static code discovery:
1. Search for route definitions, tests, and clients with `rg`. 2. Identify method, path, required headers, request schema, response schema, and authentication source. 3. If the app constructs prompts dynamically, wrap the real code instead of duplicating business logic in YAML. 4. For agents/tools, identify whether Promptfoo should send one string input or a structured object with named fields.
3. Choose the provider pattern
- Use `id: https` for straightforward JSON HTTP APIs.
- Use `file://provider.js` or `file://provider.py` for custom auth, request
signing, streaming, retries, multi-step setup, local code, Python agent SDKs, or complex parsing.
- Use native model providers for direct model comparisons.
- Use `targets` with `inputs` for redteam multi-input systems. Do not invent a
single `prompt` field when the real app accepts named inputs.
4. Implement the minimal smoke test
Add or update a config with:
- `# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json`
- A short `description`
- Provider or `targets` config with `{{env.VAR}}` for secrets
- One or two smoke tests that verify the request reaches the target and the
response transform extracts the right field
- `--no-cache` run commands
When writing a local wrapper, return `{ output }` and include structured errors when the target response is malformed. JavaScript providers receive config in constructor `options.config` and expose `callApi(prompt, context)`; read named inputs from `context.vars`. Python providers use `file://provider.py` or `file://provider.py:function_name`; the function takes `(prompt, options, context)` and reads named inputs from `context.get("vars", {})`. Set `config.workers: 1` for non-thread-safe SDKs, `config.timeout` for slow calls, and `config.pythonExecutable`/`PROMPTFOO_PYTHON` for venvs. Add harmless defaults because `validate target` may call providers without test-case vars.
5. Validate and run
From the promptfoo repo, use the local build:
npm run local -- validate config -c path/to/promptfooconfig.yaml
npm run local -- validate target -c path/to/promptfooconfig.yaml
npm run local -- eval -c path/to/promptfooconfig.yaml -o output.json --no-cache --no-share
Outside the promptfoo repo, use:
npx promptfoo@latest validate config -c path/to/promptfooconfig.yaml
npx promptfoo@latest validate target -c path/to/promptfooconfig.yaml
npx promptfoo@latest eval -c path/to/promptfooconfig.yaml -o output.json --no-cache --no-share
Inspect the output file for `result
Read more
name: promptfoo-provider-setup description: > Configure promptfoo providers or redteam targets for hosted models, live HTTP APIs, Python/JavaScript 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.
Promptfoo Provider Setup
Connect Promptfoo to the system under test with the smallest reliable provider or target configuration. Prefer a working smoke test over a clever abstraction.
Read `references/provider-patterns.md` when you need concrete YAML or provider wrapper examples. For OpenAPI specs, you can run the bundled `scripts/openapi-operation-to-config.mjs` to draft a one-operation HTTP smoke config, then inspect and edit the result before probing. The script ships in this skill's `scripts/` directory; when the skill is installed as a plugin it lives in the plugin cache, not your project, so run it by its absolute path (or copy it in) rather than a bare `scripts/...` path. With `--token-env`, it infers Bearer/OAuth2/OpenID and header/query/cookie API-key auth; use `--auth-header`/`--auth-prefix` to override.
Inputs
Infer from the repo or user prompt when possible:
- Target surface: hosted model, live HTTP endpoint, local function/script, agent
harness, MCP/tool agent, or redteam target.
- Invocation shape: method, URL/path, headers, request body, input vars, auth,
streaming/statefulness, and expected response field.
- Safety boundary: whether it is okay to call the live endpoint and which sample
payload is safe.
- Output goal: eval provider block, redteam `targets` block, local provider
wrapper, or a minimal smoke-test suite.
If the contract is unclear, create a conservative TODO-marked starter and state exactly what must be verified before using it against production.
Workflow
1. Pick discovery mode
Use one of these modes, or combine them:
- **Live HTTP endpoint**: probe an already-running endpoint with safe requests.
- **Static code discovery**: inspect route handlers, OpenAPI specs, tests, SDK
clients, or existing fetch/axios calls.
- **Hybrid**: compare static contract assumptions with a live probe.
- **Wrapper mode**: write `provider.js` or `provider.py` when built-in providers
cannot express auth, signing, streaming, multi-step calls, or custom parsing.
Do not send secrets to unknown endpoints. Use `{{env.VAR}}` placeholders in configs and local environment variables only in shell commands.
2. Discover the contract
For live HTTP endpoints:
1. Start with non-mutating checks: docs URL, OpenAPI URL, health endpoint, `OPTIONS`, or a safe `GET`. 2. Make at most one safe representative call before writing config. 3. Capture the response shape and status/error behavior. 4. Prefer explicit JSON paths in `transformResponse`, such as `json.output`. 5. Use `queryParams` for query-string fields on any HTTP method, and use the `text` variable in `transformResponse` for plain-text responses. 6. Set `stateful: false` for stateless endpoints; otherwise `validate target` will run a session-memory check. For stateful apps, include `{{sessionId}}` in the request or configure server-side session parsing.
For static code discovery:
1. Search for route definitions, tests, and clients with `rg`. 2. Identify method, path, required headers, request schema, response schema, and authentication source. 3. If the app constructs prompts dynamically, wrap the real code instead of duplicating business logic in YAML. 4. For agents/tools, identify whether Promptfoo should send one string input or a structured object with named fields.
3. Choose the provider pattern
- Use `id: https` for straightforward JSON HTTP APIs.
- Use `file://provider.js` or `file://provider.py` for custom auth, request
signing, streaming, retries, multi-step setup, local code, Python agent SDKs, or complex parsing.
- Use native model providers for direct model comparisons.
- Use `targets` with `inputs` for redteam multi-input systems. Do not invent a
single `prompt` field when the real app accepts named inputs.
4. Implement the minimal smoke test
Add or update a config with:
- `# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json`
- A short `description`
- Provider or `targets` config with `{{env.VAR}}` for secrets
- One or two smoke tests that verify the request reaches the target and the
response transform extracts the right field
- `--no-cache` run commands
When writing a local wrapper, return `{ output }` and include structured errors when the target response is malformed. JavaScript providers receive config in constructor `options.config` and expose `callApi(prompt, context)`; read named inputs from `context.vars`. Python providers use `file://provider.py` or `file://provider.py:function_name`; the function takes `(prompt, options, context)` and reads named inputs from `context.get("vars", {})`. Set `config.workers: 1` for non-thread-safe SDKs, `config.timeout` for slow calls, and `config.pythonExecutable`/`PROMPTFOO_PYTHON` for venvs. Add harmless defaults because `validate target` may call providers without test-case vars.
5. Validate and run
From the promptfoo repo, use the local build:
npm run local -- validate config -c path/to/promptfooconfig.yaml npm run local -- validate target -c path/to/promptfooconfig.yaml npm run local -- eval -c path/to/promptfooconfig.yaml -o output.json --no-cache --no-share
Outside the promptfoo repo, use:
npx promptfoo@latest validate config -c path/to/promptfooconfig.yaml npx promptfoo@latest validate target -c path/to/promptfooconfig.yaml npx promptfoo@latest eval -c path/to/promptfooconfig.yaml -o output.json --no-cache --no-share
Inspect the output file for `result
promptfoo is a CLI and library for evaluating and red-teaming LLM apps. Stop the trial-and-error approach - start shipping secure, reliable AI apps. Website · Getting Started · Red Teaming · Documentation · Discord Promptfoo is now part of OpenAI.
Repo: promptfoo/promptfoo
Other skills on promptfoo.
- /promptfoo-evals
Write, refine, run, and QA promptfoo evaluation suites: promptfooconfig.yaml, prompts, providers, vars, tests, assertions, model-graded rubrics, transforms, datasets, exports, and CI gates. Use for non-redteam eval coverage, regression tests, or new eval matrices. Do not use for
Open skill - /redteam-plugin-development
Standards for creating redteam plugins and graders. Use when creating new plugins, writing graders, or modifying attack templates.
Open skill - /search-params
URL search param and hash state management. Use when adding or modifying URL search params, working with useSearchParams, setSearchParams, useSearchParamState, or navigate() with query strings or hash fragments, or fixing browser back/forward button issues.
Open skill - /promptfoo-evals
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.
Open skill - /promptfoo-redteam-run
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,
Open skill - /promptfoo-redteam-setup
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/threat mapping. Use when preparing a red team scan plan from live probes, code
Open skill

