chore: import upstream snapshot with attribution
CI / Shell Format Check (push) Has been cancelled
CI / Check Ruby (3.4) (push) Has been cancelled
CI / CI Config (push) Has been cancelled
CI / Test on Node ${{ matrix.node }} and ${{ matrix.os }}${{ matrix.shard && format(' (shard {0}/3)', matrix.shard) || '' }} (push) Has been cancelled
CI / Build on Node ${{ matrix.node }} (push) Has been cancelled
CI / Style Check (push) Has been cancelled
CI / Generate Assets (push) Has been cancelled
CI / Check Python (3.14) (push) Has been cancelled
CI / Check Python (3.9) (push) Has been cancelled
CI / Build Docs (push) Has been cancelled
CI / Code Scan Action (push) Has been cancelled
CI / Site tests (push) Has been cancelled
CI / webui tests (push) Has been cancelled
CI / Run Integration Tests (push) Has been cancelled
CI / Run Smoke Tests (push) Has been cancelled
CI / Go Tests (push) Has been cancelled
CI / Share Test (push) Has been cancelled
CI / Redteam (Production API) (push) Has been cancelled
CI / Redteam (Staging API) (push) Has been cancelled
CI / GitHub Actions Lint (push) Has been cancelled
CI / Check Ruby (3.0) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build (push) Has been cancelled
release-please / publish-npm (push) Has been cancelled
release-please / publish-npm-backfill (push) Has been cancelled
release-please / docker (push) Has been cancelled
release-please / publish-code-scan-action (push) Has been cancelled
release-please / attest-code-scan-action (push) Has been cancelled
Deploy local.promptfoo.app / Deploy to Cloudflare Pages (push) Has been cancelled
Test and Publish Multi-arch Docker Image / test (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-amd64 platform:linux/amd64 runner:ubuntu-latest]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-arm64 platform:linux/arm64 runner:ubuntu-24.04-arm]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / merge-docker-digests (push) Has been cancelled
Test and Publish Multi-arch Docker Image / Attest Multi-arch Image (push) Has been cancelled
Validate Renovate Config / Validate Renovate Configuration (push) Has been cancelled
CI / Shell Format Check (push) Has been cancelled
CI / Check Ruby (3.4) (push) Has been cancelled
CI / CI Config (push) Has been cancelled
CI / Test on Node ${{ matrix.node }} and ${{ matrix.os }}${{ matrix.shard && format(' (shard {0}/3)', matrix.shard) || '' }} (push) Has been cancelled
CI / Build on Node ${{ matrix.node }} (push) Has been cancelled
CI / Style Check (push) Has been cancelled
CI / Generate Assets (push) Has been cancelled
CI / Check Python (3.14) (push) Has been cancelled
CI / Check Python (3.9) (push) Has been cancelled
CI / Build Docs (push) Has been cancelled
CI / Code Scan Action (push) Has been cancelled
CI / Site tests (push) Has been cancelled
CI / webui tests (push) Has been cancelled
CI / Run Integration Tests (push) Has been cancelled
CI / Run Smoke Tests (push) Has been cancelled
CI / Go Tests (push) Has been cancelled
CI / Share Test (push) Has been cancelled
CI / Redteam (Production API) (push) Has been cancelled
CI / Redteam (Staging API) (push) Has been cancelled
CI / GitHub Actions Lint (push) Has been cancelled
CI / Check Ruby (3.0) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build (push) Has been cancelled
release-please / publish-npm (push) Has been cancelled
release-please / publish-npm-backfill (push) Has been cancelled
release-please / docker (push) Has been cancelled
release-please / publish-code-scan-action (push) Has been cancelled
release-please / attest-code-scan-action (push) Has been cancelled
Deploy local.promptfoo.app / Deploy to Cloudflare Pages (push) Has been cancelled
Test and Publish Multi-arch Docker Image / test (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-amd64 platform:linux/amd64 runner:ubuntu-latest]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-arm64 platform:linux/arm64 runner:ubuntu-24.04-arm]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / merge-docker-digests (push) Has been cancelled
Test and Publish Multi-arch Docker Image / Attest Multi-arch Image (push) Has been cancelled
Validate Renovate Config / Validate Renovate Configuration (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
# integration-jest (Prompt Testing with Jest and Vitest)
|
||||
|
||||
You can run this example with:
|
||||
|
||||
```bash
|
||||
npx promptfoo@latest init --example integration-jest
|
||||
cd integration-jest
|
||||
```
|
||||
|
||||
This folder contains a small example of how to test LLM prompts using Jest, Vitest, and `promptfoo`.
|
||||
|
||||
## Getting Started
|
||||
|
||||
To get started, follow these steps:
|
||||
|
||||
1. **Install the dependencies**:
|
||||
|
||||
```sh
|
||||
npm install
|
||||
```
|
||||
|
||||
2. **Run the tests**:
|
||||
|
||||
To run the tests with Jest:
|
||||
|
||||
```sh
|
||||
npx jest
|
||||
```
|
||||
|
||||
Or, to run the tests with Vitest:
|
||||
|
||||
```sh
|
||||
npx vitest
|
||||
```
|
||||
|
||||
## Additional Information
|
||||
|
||||
For more details on integrating prompt testing with Jest and Vitest, see the [documentation](https://promptfoo.dev/docs/integrations/jest).
|
||||
|
||||

|
||||
@@ -0,0 +1,46 @@
|
||||
import { installJestMatchers } from './matchers';
|
||||
|
||||
import type { GradingConfig } from '../../dist/src/types';
|
||||
|
||||
installJestMatchers();
|
||||
|
||||
describe('toMatchSemanticSimilarity', () => {
|
||||
it('should pass when strings are semantically similar', async () => {
|
||||
await expect('The quick brown fox').toMatchSemanticSimilarity('A fast brown fox');
|
||||
});
|
||||
|
||||
it('should fail when strings are not semantically similar', async () => {
|
||||
await expect('The quick brown fox').not.toMatchSemanticSimilarity('The weather is nice today');
|
||||
});
|
||||
|
||||
it('should pass when strings are semantically similar with custom threshold', async () => {
|
||||
await expect('The quick brown fox').toMatchSemanticSimilarity('A fast brown fox', 0.7);
|
||||
});
|
||||
|
||||
it('should fail when strings are not semantically similar with custom threshold', async () => {
|
||||
await expect('The quick brown fox').not.toMatchSemanticSimilarity(
|
||||
'The weather is nice today',
|
||||
0.9,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
const gradingConfig: GradingConfig = {
|
||||
provider: 'openai:chat:gpt-4.1-mini',
|
||||
};
|
||||
|
||||
describe('toPassLLMRubric', () => {
|
||||
it('should pass when strings meet the LLM Rubric criteria', async () => {
|
||||
await expect('Four score and seven years ago').toPassLLMRubric(
|
||||
'Contains part of a famous speech',
|
||||
gradingConfig,
|
||||
);
|
||||
});
|
||||
|
||||
it('should fail when strings do not meet the LLM Rubric criteria', async () => {
|
||||
await expect('It is time to do laundry').not.toPassLLMRubric(
|
||||
'Contains part of a famous speech',
|
||||
gradingConfig,
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
preset: 'ts-jest',
|
||||
testEnvironment: 'node',
|
||||
};
|
||||
@@ -0,0 +1,57 @@
|
||||
import matchers from '../../dist/src/assertions';
|
||||
|
||||
import type { GradingConfig } from '../../dist/src/types';
|
||||
|
||||
declare global {
|
||||
namespace jest {
|
||||
interface Matchers<R> {
|
||||
toMatchSemanticSimilarity(expected: string, threshold?: number): R;
|
||||
toPassLLMRubric(expected: string, gradingConfig: GradingConfig): R;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function installJestMatchers() {
|
||||
expect.extend({
|
||||
async toMatchSemanticSimilarity(
|
||||
received: string,
|
||||
expected: string,
|
||||
threshold: number = 0.8,
|
||||
): Promise<jest.CustomMatcherResult> {
|
||||
const result = await matchers.matchesSimilarity(received, expected, threshold);
|
||||
const pass = received === expected || result.pass;
|
||||
if (pass) {
|
||||
return {
|
||||
message: () => `expected ${received} not to match semantic similarity with ${expected}`,
|
||||
pass: true,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
message: () =>
|
||||
`expected ${received} to match semantic similarity with ${expected}, but it did not. Reason: ${result.reason}`,
|
||||
pass: false,
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
async toPassLLMRubric(
|
||||
received: string,
|
||||
expected: string,
|
||||
gradingConfig: GradingConfig,
|
||||
): Promise<jest.CustomMatcherResult> {
|
||||
const gradingResult = await matchers.matchesLlmRubric(expected, received, gradingConfig);
|
||||
if (gradingResult.pass) {
|
||||
return {
|
||||
message: () => `expected ${received} not to pass LLM Rubric with ${expected}`,
|
||||
pass: true,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
message: () =>
|
||||
`expected ${received} to pass LLM Rubric with ${expected}, but it did not. Reason: ${gradingResult.reason}`,
|
||||
pass: false,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "promptfoo-jest-vitest-integration-example",
|
||||
"version": "1.0.0",
|
||||
"description": "A small example of testing LLM prompts using Jest, Vitest, and promptfoo.",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "jest",
|
||||
"test:jest": "npx jest",
|
||||
"test:vitest": "npx vitest"
|
||||
},
|
||||
"keywords": [
|
||||
"jest",
|
||||
"vitest",
|
||||
"prompt testing",
|
||||
"LLM",
|
||||
"promptfoo"
|
||||
],
|
||||
"author": "Ian Webster",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@types/jest": "^30.0.0",
|
||||
"jest": "^30.2.0",
|
||||
"ts-jest": "^29.4.6",
|
||||
"typescript": "^5.9.3",
|
||||
"vitest": "^4.0.18"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import { defineConfig } from 'vitest/config';
|
||||
|
||||
export default defineConfig({
|
||||
test: {
|
||||
globals: true,
|
||||
environment: 'node',
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user