@ax-llm/ax
v25.4.5
Published
The best library to work with LLMs
Readme
Ax: Build Reliable AI Apps in TypeScript
Stop wrestling with prompts. Start shipping AI features.
Ax brings DSPy's revolutionary approach to TypeScript – just describe what you want, and let the framework handle the rest. Production-ready, type-safe, and works with all major LLMs.
Transform Your AI Development in 30 Seconds
import { ai, ax } from "@ax-llm/ax";
// 1. Pick any LLM
const llm = ai({ name: "openai", apiKey: process.env.OPENAI_APIKEY! });
// 2. Say what you want
const classifier = ax(
'review:string -> sentiment:class "positive, negative, neutral"',
);
// 3. Get type-safe results
const result = await classifier.forward(llm, {
review: "This product is amazing!",
});
console.log(result.sentiment); // "positive" ✨That's it. No prompt engineering. No trial and error. It works with GPT-4, Claude, Gemini, or any LLM.
Decision Evidence and Reranking
Use Jev or OpenAI Decisions through normal Ax signatures and AxGen. Add
(evidence) or fluent .withEvidence() to boolean/class fields, and declare
ordered rubric scores with score. Native probabilities, selected values,
continuous scores, and optional confidence stay in the result; Ax attaches
provider/model provenance. Generative models use the same signature with
estimates marked elicited, without native confidence. Shared result shapes
do not imply comparable confidence calibration across models.
const judge = ax(
'query:string, document:string -> relevant:boolean(evidence, threshold 0.7), relevance:score "Irrelevant, Related, Partial answer, Direct answer"(evidence)',
);
const decisions = ai({ name: 'openai-decisions', apiKey: process.env.OPENAI_APIKEY! });
const result = await judge.forward(decisions, {
query: 'How do I request a refund?',
document: 'Request a refund through your account billing page.',
});
console.log(result.relevance.value, result.relevant.probability);For reranking, keep candidate IDs in application code and sort results by
relevance.value. See signatures and decision evidence
for thresholds, result shapes, and refusal handling.
Why Thousands of Developers Choose Ax
🎯 Define Once, Run Anywhere
Write your logic once. Switch between OpenAI, Anthropic, Google, or 15+ providers with one line. No rewrites needed.
⚡ Ship 10x Faster
Stop tweaking prompts. Define inputs → outputs. The framework generates optimal prompts automatically.
⚡ Provider-Native Speed
Ax stays in the same latency class as direct provider calls while adding typed outputs, validation, retries, tracing, and tools. Streaming is the default so Ax can parse fields as they arrive, fail early on streaming assertions, cancel bad outputs, and start correction without wasting tokens on completions that are already invalid.
Benchmark the current code against your own providers:
AX_STREAM_BENCH_PROVIDER=anthropic AX_STREAM_BENCH_MODEL=claude-sonnet-4-5-20250929 AX_STREAM_BENCH_RUNS=2 AX_STREAM_BENCH_WARMUP_RUNS=0 npm run tsx src/examples/streaming-latency.ts
AX_STREAM_BENCH_PROVIDER=google-gemini AX_STREAM_BENCH_MODEL=gemini-3.5-flash AX_STREAM_BENCH_RUNS=2 AX_STREAM_BENCH_WARMUP_RUNS=0 npm run tsx src/examples/streaming-latency.ts🛡️ Production-Ready from Day One
Built-in streaming, validation, error handling, observability. Used by startups in production handling millions of requests.
🚀 Gets Smarter Over Time
Train your programs with examples. Watch accuracy improve automatically. No ML expertise needed.
Real Apps, Real Simple
Extract Structured Data from Customer Emails
const extractor = ax(`
customerEmail:string, currentDate:datetime ->
priority:class "high, normal, low",
sentiment:class "positive, negative, neutral",
ticketNumber?:number,
nextSteps:string[],
estimatedResponseTime:string
`);
const result = await extractor.forward(ai, {
customerEmail: "Order #12345 hasn't arrived. Need this resolved immediately!",
currentDate: new Date(),
});
// Automatically extracts all fields with proper types and validationBuild Agents That Use Tools (ReAct Pattern)
const assistant = ax(
"question:string -> answer:string",
{
functions: [
{ name: "getCurrentWeather", func: weatherAPI },
{ name: "searchNews", func: newsAPI },
],
},
);
const result = await assistant.forward(ai, {
question: "What's the weather in Tokyo and any news about it?",
});
// AI automatically calls both functions and combines resultsMulti-Modal Analysis with Images
const analyzer = ax(`
image:image, question:string ->
description:string,
mainColors:string[],
category:class "electronics, clothing, food, other",
estimatedPrice:string
`);
// Process images and text together seamlesslyQuick Start
Install
npm install @ax-llm/axOutside CI, installation sets up one Claude Code skill, ax-llm, with a compact
index and bundled guides your agent reads as needed. To disable future automatic
setup, run npx @ax-llm/ax skills-auto-install off from your project root. This
saves ax.skills.autoInstall: false in your project's package.json; commit
that setting to share it with your team. Use skills-auto-install on to re-enable
automatic setup on future installs. Set AX_SKIP_SKILL_INSTALL=1 to skip setup
for a single installation; CI and this environment variable take precedence over
the saved setting.
You can also set the preference before installing Ax for the first time:
{
"ax": {
"skills": {
"autoInstall": false
}
}
}Merge this field into your existing package.json. Manual
npx @ax-llm/ax setup-claude works even when automatic setup is disabled;
add --all to register every specialist or --skill ax-ai to install only one.
Changing the preference leaves installed skills in place, and manual setup or
removal preserves the saved preference.
Existing specialists remain installed; use remove-claude followed by
setup-claude to switch an older full installation to the compact bundle.
Your First AI Feature (2 minutes)
import { ai, ax } from "@ax-llm/ax";
const llm = ai({ name: "openai", apiKey: process.env.OPENAI_APIKEY! });
const translator = ax(`
text:string,
language:string ->
translation:string
`);
const result = await translator.forward(llm, {
text: "Hello world",
language: "Spanish",
});
console.log(result.translation); // "Hola mundo"Powerful Features, Zero Complexity
- ✅ Model-Lab Providers - OpenAI, Anthropic, Google, Mistral, DeepSeek, Grok/xAI, and more
- ✅ Type-Safe Everything - Full TypeScript support with auto-completion
- ✅ Streaming First - Real-time responses with validation
- ✅ Multi-Modal - Images, audio, text in the same signature
- ✅ Smart Optimization - Automatic prompt tuning with GEPA and bootstrap demos
- ✅ Production Observability - OpenTelemetry tracing built-in
- ✅ Advanced Workflows - Compose complex pipelines with AxFlow
- ✅ Agent Framework - Agents that can use tools and call other agents
- ✅ Zero Dependencies - Lightweight, fast, reliable
Learn More
🚀 Quick Wins
- Getting Started Guide - Set up in 5 minutes
- Examples Guide - Comprehensive examples with explanations
- DSPy Concepts - Understand the revolutionary approach
📚 Deep Dives
- AxFlow Workflows - Build complex AI systems
- Optimization Guide - Make your programs smarter
- Advanced RAG - Production search & retrieval
- API Reference - Complete documentation
Examples
Run any example:
OPENAI_APIKEY=your-key npm run tsx ./src/examples/[example-name].tsCore Examples
- extract.ts - Extract structured data from text
- react.ts - ReAct pattern with function calling
- agent.ts - Multi-agent collaboration
- streaming1.ts - Real-time streaming responses
- multi-modal.ts - Image + text processing
Production Patterns
- customer-support.ts - Complete support system
- food-search.ts - Restaurant recommendations with tools
- optimize.ts - Automatic optimization
- axagent-gepa-optimization.ts - Agent optimization with GEPA
- ax-flow-enhanced-demo.ts - Complex workflows
📚 View Full Examples Guide →
View All 70+ Examples →
Join the Community
- 🐦 Follow on Twitter - Latest updates
- 💬 Discord Community - Get help, share ideas
- ⭐ Star on GitHub - Support the project
- 📖 Ask DeepWiki - AI-powered docs
Production Ready
- ✅ Battle-tested - Used by startups in production
- ✅ No breaking changes - Stable minor versions
- ✅ Comprehensive tests - Large test coverage
- ✅ OpenTelemetry - Built-in observability
- ✅ TypeScript first - Type-safe by design
License
Apache 2 - Use it anywhere, build anything.
Ready to build the future? Stop fighting with prompts. Start shipping with signatures.
npm install @ax-llm/axBuilt with ❤️ by developers, for developers.
