Dead-simple prompt versioning and A/B testing for Anthropic and OpenAI.
npm install @stewrd/sdk
# or
pnpm add @stewrd/sdk
# or
yarn add @stewrd/sdkimport { PromptSDK } from '@stewrd/sdk';
const sdk = new PromptSDK({ apiKey: 'your-stewrd-api-key' });
// Simple usage - version tracking
const response = await sdk.run('user-onboarding-v2', {
model: 'claude-sonnet-4-5',
input: 'Hello! I need help getting started.',
});
console.log(response.content);Split traffic between prompt variants and measure real performance:
const response = await sdk.run('user-onboarding', {
model: 'claude-sonnet-4-5',
input: userMessage,
variants: {
'control': {
weight: 50,
systemMessage: 'You are a friendly onboarding assistant.',
},
'experiment': {
weight: 50,
systemMessage: 'You are a concise onboarding expert.',
},
},
});
console.log(`Used variant: ${response.variant}`);
console.log(response.content);- Prompt Versioning - Track every prompt change, roll back when needed
- A/B Testing - Split traffic between variants, measure real performance
- Multi-Provider - Works with Anthropic (Claude) and OpenAI (GPT)
- Usage Analytics - Token usage, latency, cost tracking per variant
- TypeScript First - Fully typed with great DX
- Retry Logic - Built-in exponential backoff for reliability
- Lightweight - Minimal dependencies, fast startup
const sdk = new PromptSDK({
apiKey: 'sk_...', // Required: Your stewrd API key
baseUrl: 'https://api.stewrd.dev', // Optional: API endpoint
debug: false, // Optional: Enable debug logging
timeout: 30000, // Optional: Request timeout in ms
retry: {
maxRetries: 3, // Optional: Max retry attempts
baseDelay: 1000, // Optional: Initial retry delay
maxDelay: 10000, // Optional: Max retry delay
exponentialBackoff: true, // Optional: Use exponential backoff
},
});Execute a prompt with optional versioning and A/B testing.
Parameters:
| Option | Type | Required | Description |
|---|---|---|---|
model |
string | Yes | Model identifier (e.g., 'claude-sonnet-4-5', 'gpt-4o') |
input |
string | Yes | User message/input |
systemMessage |
string | No | System prompt |
variants |
object | No | A/B testing configuration |
parameters |
object | No | Model parameters (temperature, max_tokens, etc.) |
metadata |
object | No | Custom metadata to attach |
Response:
interface PromptResponse {
content: string; // Generated response text
variant?: string; // Selected variant (if A/B testing)
provider: 'anthropic' | 'openai'; // Provider used
model: string; // Model that was used
usage?: {
inputTokens: number;
outputTokens: number;
totalTokens: number;
};
latencyMs: number; // Response time in milliseconds
runId?: string; // Unique run identifier
}Fetch analytics for a prompt.
const analytics = await sdk.getAnalytics('user-onboarding', {
startDate: new Date('2024-01-01'),
endDate: new Date(),
variant: 'experiment', // Optional: filter by variant
});Anthropic:
claude-opus-4-5/claude-opus-4-5-20251101claude-sonnet-4-5/claude-sonnet-4-5-20251101claude-3-5-sonnet/claude-3-5-sonnet-20241022claude-3-5-haiku/claude-3-5-haiku-20241022
OpenAI:
gpt-4o/gpt-4o-2024-08-06gpt-4o-minigpt-4-turbogpt-3.5-turbo
For local development, set your provider API keys:
ANTHROPIC_API_KEY=your-anthropic-key
OPENAI_API_KEY=your-openai-keyFully typed with TypeScript. Import types as needed:
import type {
PromptSDK,
PromptSDKConfig,
PromptResponse,
RunOptions,
PromptVariant,
RetryConfig,
} from '@stewrd/sdk';MIT - see LICENSE for details.