Getting started
This guide will walk you through creating a working eval that tests prompts across multiple models and opens a web view for comparing outputs.
After installing promptfoo, you can set up your first config file in a few ways:
Running an example
Set up your first config file with a pre-built example by running this command with npx, npm, or brew:
- npx
- npm
- brew
npx promptfoo@latest init --example getting-started
npm install -g promptfoo
promptfoo init --example getting-started
brew install promptfoo
promptfoo init --example getting-started
This will create a new directory with a basic example that tests translation prompts across different models. The example includes:
- A configuration file
promptfooconfig.yamlwith sample prompts, providers, and test cases. - A
README.mdfile explaining how the example works.
Most providers need authentication. For OpenAI:
export OPENAI_API_KEY=sk-abc123
Then navigate to the example directory, run the eval, and view results:
- npx
- npm
- brew
cd getting-started
npx promptfoo@latest eval
npx promptfoo@latest view
cd getting-started
promptfoo eval
promptfoo view
cd getting-started
promptfoo eval
promptfoo view
Set up via the CLI
To start from scratch, run promptfoo init to create a config through an interactive CLI walkthrough:
- npx
- npm
- brew
npx promptfoo@latest init
promptfoo init
promptfoo init
Set up via the Web UI
If you prefer a visual interface, run promptfoo eval setup to configure your first eval through the web UI:
- npx
- npm
- brew
npx promptfoo@latest eval setup
promptfoo eval setup
promptfoo eval setup
This opens a browser-based setup flow that walks you through creating prompts, choosing providers, and adding test cases.

Configuration
Now that you've created an initial configuration, you can update promptfooconfig.yaml with your own prompts, providers, and test cases:
-
Set up your prompts: Open
promptfooconfig.yamland add prompts that you want to test. Use double curly braces for variable placeholders:{{variable_name}}. For example:prompts:- 'Convert the following English text to {{language}}: {{input}}' -
Add providers: Add
providersto specify AI models you want to test. Promptfoo supports 60+ providers including OpenAI, Anthropic, Google, and many others:providers:- openai:gpt-6-sol- openai:gpt-6-lunaThis example uses your OpenAI API key. You can also configure Anthropic, Google, local models like Ollama, or custom Python and JavaScript code. Each provider has its own setup requirements.
-
Add test inputs: Add some example inputs for your prompts. Optionally, add assertions to set output requirements that are checked automatically.
For example:
tests:- vars:language: Frenchinput: Hello worldassert:- type: containsvalue: 'Bonjour le monde'- vars:language: Spanishinput: Where is the library?assert:- type: icontainsvalue: 'Dónde está la biblioteca'When writing test cases, think of core use cases and potential failures that you want to make sure your prompts handle correctly.
-
Run the evaluation: Make sure you're in the directory containing
promptfooconfig.yaml, then run:- npx
- npm
- brew
npx promptfoo@latest evalpromptfoo evalpromptfoo evalThis tests every prompt, model, and test case.
-
Review outputs: After the evaluation is complete, open the web viewer to review the outputs:
- npx
- npm
- brew
npx promptfoo@latest viewpromptfoo viewpromptfoo view

Asserts
The YAML configuration format runs each prompt through a series of test cases and checks if they meet the specified asserts.
Asserts are optional. Many people get value out of reviewing outputs manually, and the web UI helps facilitate this.
See the Configuration docs for a detailed guide.
Examples
The examples below cover a few common eval patterns: prompt quality, model quality, RAG quality, and agent quality.
Prompt quality
In this example, we evaluate whether adding adjectives to the personality of an assistant bot affects the responses.
You can quickly set up this example by running:
- npx
- npm
- brew
npx promptfoo@latest init --example eval-self-grading
promptfoo init --example eval-self-grading
promptfoo init --example eval-self-grading
Show YAML file for this example
# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json
description: Automatic response evaluation using LLM rubric scoring
prompts:
- file://prompts.txt
providers:
- openai:gpt-6-sol
defaultTest:
assert:
- type: llm-rubric
value: Do not mention that you are an AI or chat assistant
- type: javascript
# Shorter is better
value: Math.max(0, Math.min(1, 1 - (output.length - 100) / 900));
tests:
- vars:
name: Bob
question: Can you help me find a specific product on your website?
- vars:
name: Jane
question: Do you have any promotions or discounts currently available?
From the newly created directory, run npx promptfoo@latest eval to execute this example:

This command will evaluate the prompts, substituting variable values, and output the results in your terminal.
You can also output a spreadsheet, JSON, YAML or HTML.
Model quality
In this next example, we evaluate GPT-6 Luna, Sol, and Astra on 15 riddles, each with an answer check. The full run makes 45 model calls plus grading calls. Cost and latency assertions check completed responses; they do not cap spending or stop slow requests.
You can quickly set up this example by running:
- npx
- npm
- brew
npx promptfoo@latest init --example compare-openai-models
promptfoo init --example compare-openai-models
promptfoo init --example compare-openai-models
Show YAML file for this example
# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json
description: Comparing current OpenAI models on riddles
prompts:
- 'Solve this riddle: {{riddle}}'
providers:
- id: openai:gpt-6-luna
config:
reasoning:
effort: low
max_output_tokens: 2048
- id: openai:gpt-6-sol
config:
reasoning:
effort: low
max_output_tokens: 2048
- id: openai:gpt-6-astra
config:
reasoning:
effort: low
max_output_tokens: 2048
defaultTest:
assert:
# Example per-response cost threshold (USD)
- type: cost
threshold: 0.15
# Example per-response latency threshold (milliseconds)
- type: latency
threshold: 60000
tests:
- vars:
riddle: 'I speak without a mouth and hear without ears. I have no body, but I come alive with wind. What am I?'
assert:
# Make sure the LLM output contains this word
- type: icontains
value: echo
# Use model-graded assertions to enforce free-form instructions
- type: llm-rubric
value: Do not apologize
- vars:
riddle: "You see a boat filled with people. It has not sunk, but when you look again you don't see a single person on the boat. Why?"
assert:
- type: llm-rubric
value: explains that there are no single people (they are all married)
- vars:
riddle: 'The more of this there is, the less you see. What is it?'
assert:
- type: icontains
value: darkness
- vars:
riddle: >-
I have keys but no locks. I have space but no room. You can enter, but
can't go outside. What am I?
assert:
- type: icontains
value: keyboard
- vars:
riddle: >-
I am not alive, but I grow; I don't have lungs, but I need air; I don't
have a mouth, but water kills me. What am I?
assert:
- type: icontains
value: fire
- vars:
riddle: What can travel around the world while staying in a corner?
assert:
- type: icontains
value: stamp
- vars:
riddle: Forward I am heavy, but backward I am not. What am I?
assert:
- type: llm-rubric
value: Identifies the word ton and explains that reversing it spells not.
- vars:
riddle: >-
The person who makes it, sells it. The person who buys it, never uses
it. The person who uses it, doesn't know they're using it. What is it?
assert:
- type: icontains-any
value: [coffin, casket]
- vars:
riddle: I can be cracked, made, told, and played. What am I?
assert:
- type: icontains
value: joke
- vars:
riddle: What has keys but can't open locks?
assert:
- type: llm-rubric
value: Identifies an object with keys that do not open locks, such as a piano or keyboard.
- vars:
riddle: >-
I'm light as a feather, yet the strongest person can't hold me for much
more than a minute. What am I?
assert:
- type: icontains
value: breath
- vars:
riddle: >-
I can fly without wings, I can cry without eyes. Whenever I go, darkness
follows me. What am I?
assert:
- type: icontains
value: cloud
- vars:
riddle