Features
| Feature | Use case |
|---|---|
| Synchronous preview | Small-batch seed expansion for low-latency debugging. |
| Asynchronous batch task | Larger expansion jobs with task status tracking and optional callbacks. |
| Dataset risk mapping | Map upstream dataset categories into Promptbeat risk types. |
| Plugin and strategy passthrough | Let callers select Promptfoo plugins, strategies, transforms, and framing styles. |
| Trace metadata | Return source seed IDs, mapping decisions, strategy choices, and generation metadata. |
| Container startup | Run the Go API and Python Promptbeat core together in the service image. |
Endpoints
POST /api/v1/attack/preview
Usepreview for small-batch seed expansion where you need a low-latency response. The endpoint runs generation synchronously and returns results in the same HTTP response — ideal for iterating on seed quality or debugging a new scenario.
List of seed objects to expand. Each seed must include at minimum a
text field containing the raw attack template.Number of probes to generate per seed. Keep this small (1–5) when using
preview to avoid long synchronous wait times.Hard cap on total generated outputs across all seeds in this request.
Provider string for the generator LLM, e.g.
openai:openai/gpt-5.5. Overrides the service-level default set via environment variable.List of Promptfoo plugin IDs to apply during generation.
List of strategy names to use when expanding seeds.
POST /api/v1/attack/task/create
Usetask/create when your seed count, expansionRatio, or maxOutputs is large enough that generation should run asynchronously. The endpoint immediately returns a taskId you can poll. This prevents HTTP timeouts on large expansion jobs and lets you integrate Promptbeat generation into async pipelines.
List of seed objects to expand. Accepts the same structure as
preview.Number of probes to generate per seed. No practical upper limit when running asynchronously.
Hard cap on total generated outputs across all seeds in this task.
Provider string for the generator LLM. Falls back to
PROMPTBEAT_GENERATOR_PROVIDER if not supplied.Optional webhook URL. The service POSTs results to this URL when the task completes.
GET /api/v1/attack/task/{taskId}
Poll this endpoint to check task status and retrieve results once the task completes. The response includes astatus field (queued, running, done, or failed) and, when done, the full expansion results.
Running the service locally
The API service ships as a Docker image. Use the twomake targets to build and start it:
api/.env.docker before running make docker-run.
Environment variables
| Variable | Description |
|---|---|
OPENAI_API_KEY | API key for the OpenAI-compatible generator LLM. |
PROMPTBEAT_GENERATOR_PROVIDER | Default generator provider string, e.g. openai:openai/gpt-5.5. |
PROMPTBEAT_DATABASE_URL | Connection string for the task persistence database. |
PROMPTBEAT_REDIS_URL | Redis URL for the async task worker queue. |
PROMPTBEAT_DISABLE_TASK_WORKER | Set to true to disable the background worker and run in sync-only mode. |
Smoke test
Run the bundled smoke test against a local container to verify the service is healthy:BASE_URL to smoke-test a deployed service:
The API service and CLI share the same core Promptbeat engine. A generation job submitted via the API produces identical output to the same job run with
./bin/promptbeat generate.