How HazelJS stacks up against NestJS, Express, Hono, Fastify, LangChain, Vercel AI SDK, and LlamaIndex — and why its unified architecture makes it a compelling choice for AI-native applications.
Table of Contents
- Introduction
- The Landscape Today
- HazelJS: The Unified Approach
- Framework Comparison
- AI Runtime Platform Comparison
- The Power of HazelJS
- When to Choose HazelJS
- Getting Started
Introduction
The Node.js and AI ecosystems have exploded with options. On one side, you have web frameworks like NestJS, Express, Hono, and Fastify. On the other, AI-specific platforms like LangChain, Vercel AI SDK, and LlamaIndex. Each excels in its domain — but building a production AI application often means stitching together multiple tools, managing disparate patterns, and wrestling with integration complexity.
HazelJS takes a different path: a single, cohesive framework that combines enterprise-grade web architecture with first-class AI capabilities. In this post, we compare HazelJS against the hottest frameworks and AI runtimes of 2024–2025 and explain why its unified design is a significant advantage.
The Landscape Today
Web Frameworks
| Framework | Philosophy | Strengths | Typical Use Case |
|---|---|---|---|
| Express | Minimal, unopinionated | Huge ecosystem, simple | APIs, prototypes, legacy apps |
| Fastify | Performance-first | Speed, schema validation | High-throughput APIs, microservices |
| Hono | Lightweight, edge/serverless | Tiny footprint, multi-runtime | Edge, serverless, quick iteration |
| NestJS | Enterprise, Angular-inspired | DI, modules, structure | Large, maintainable applications |
| Elysia | TypeScript-first, Bun-native | End-to-end type safety | Modern Bun/TypeScript stacks |
AI Runtime Platforms
| Platform | Focus | Strengths | Typical Use Case |
|---|---|---|---|
| LangChain | Agent framework | Swappable components, integrations | Research, custom agents, RAG |
| Vercel AI SDK | Streamlined deployment | Performance, Vercel integration | Frontend AI, chat UIs |
| LlamaIndex | Data framework | Document indexing, retrieval | RAG, knowledge bases |
| LangGraph | Agent runtime | Stateful workflows, durable execution | Production agents, complex flows |
HazelJS covers both agent orchestration (AgentGraph, SupervisorAgent) and durable workflows (@hazeljs/flow) in one stack.
Most teams end up combining: NestJS + LangChain, Fastify + Vercel AI SDK, Express + custom AI glue. This works, but it introduces:
- Multiple paradigms — Different DI, config, and error-handling patterns
- Integration overhead — Wiring AI into your HTTP layer, auth, and observability
- Scattered concerns — AI logic, business logic, and infrastructure spread across packages
HazelJS: The Unified Approach
HazelJS is a modern, TypeScript-first Node.js framework that provides:
- Enterprise web architecture — DI, decorators, routing, middleware, validation
- Built-in AI — @hazeljs/ai for LLMs (OpenAI, Anthropic, Gemini, Cohere, Ollama) with streaming, caching, and type-safe outputs
-
Agent runtime — @hazeljs/agent for stateful, tool-using agents with
@Delegate,AgentGraph, andSupervisorAgent - RAG — @hazeljs/rag for vector search, GraphRAG, 11 document loaders, and a Memory System (conversation, entity, fact storage)
- Durable workflows — @hazeljs/flow and @hazeljs/flow-runtime for stateful execution, WAIT/resume, idempotency, and optional Prisma persistence
- Microservices — @hazeljs/discovery, @hazeljs/gateway, @hazeljs/resilience
Everything shares the same module system, DI container, and configuration. No glue code.
Framework Comparison
HazelJS vs. NestJS
| Aspect | NestJS | HazelJS |
|---|---|---|
| Bundle size | Heavier (Express/Fastify adapter) | Lighter, no external HTTP dependency |
| AI integration | Via third-party (e.g., LangChain) | Native @hazeljs/ai, @hazeljs/agent |
| Learning curve | Steeper (Angular-style) | Simpler, decorator-based |
| ORM | TypeORM, Prisma (community) | First-class @hazeljs/prisma with repository pattern |
| Serverless | Manual adapter setup | @hazeljs/serverless for Lambda & Cloud Functions |
HazelJS advantages: Built-in AI, lighter footprint, native Prisma, simpler mental model. See the main README for the full comparison.
HazelJS vs. Express
| Aspect | Express | HazelJS |
|---|---|---|
| API style | Callback/middleware | Decorators, controllers |
| DI | None | Full DI with multiple scopes |
| Validation | Manual (e.g., Joi, Zod) | Built-in with class-validator |
| Type safety | Limited | Full TypeScript from the ground up |
| Testing | Manual setup | Testing utilities built-in |
| AI | DIY | Native AI, agent, RAG modules |
HazelJS advantages: Structure, type safety, validation, and AI without bolting on libraries.
HazelJS vs. Hono
| Aspect | Hono | HazelJS |
|---|---|---|
| Target | Edge, serverless, multi-runtime | Node.js (server + serverless adapters) |
| Architecture | Minimal, functional | Modular, DI, enterprise patterns |
| AI | Integrate externally | Native AI stack |
| Use case | Quick, lightweight APIs | Full-stack apps, AI agents, microservices |
HazelJS advantages: When you need DI, modules, agents, RAG, and microservices — Hono stays minimal by design.
HazelJS vs. Fastify
| Aspect | Fastify | HazelJS |
|---|---|---|
| Focus | Raw performance | Architecture + AI + resilience |
| Schema validation | JSON Schema | class-validator |
| DI / modules | None | Full module system |
| AI | Integrate externally | Native AI, agent, RAG |
| Resilience | Manual | @hazeljs/resilience (circuit breaker, retry, bulkhead) |
HazelJS advantages: Enterprise patterns, AI-native design, and resilience out of the box.
AI Runtime Platform Comparison
HazelJS vs. LangChain
| Aspect | LangChain | HazelJS |
|---|---|---|
| Scope | AI/agent framework | Full-stack framework + AI |
| Integration | Standalone, plug into any backend | Native HTTP, DI, auth, caching |
| Agent runtime | LangGraph (separate) | @hazeljs/agent with AgentGraph, @Delegate, SupervisorAgent |
| Durable workflows | LangGraph | @hazeljs/flow — WAIT/resume, idempotency, Prisma persistence |
| RAG | Built-in | @hazeljs/rag with GraphRAG, 11 loaders, Memory System, 5 vector stores |
| API style | Chain-based, imperative | Decorators (@AITask, @Agent, @Tool) |
| Deployment | You wire it | Same app serves HTTP + AI, serverless adapters |
HazelJS advantages: One codebase for API and AI, shared auth/cache/config, no framework glue.
HazelJS vs. Vercel AI SDK
| Aspect | Vercel AI SDK | HazelJS |
|---|---|---|
| Focus | Frontend AI, streaming, Vercel | Backend-first, full application |
| Backend | Route handlers, serverless | Controllers, DI, modules |
| Agent support | Limited | Full agent runtime with tools, memory, approval, AgentGraph, SupervisorAgent |
| RAG | Integrate separately | @hazeljs/rag with GraphRAG, Memory System, Agentic RAG |
| Deployment | Vercel-optimized | Any Node.js host, Lambda, Cloud Functions |
HazelJS advantages: Backend architecture, agents, RAG, and deployment flexibility beyond Vercel.
HazelJS vs. LlamaIndex
| Aspect | LlamaIndex | HazelJS |
|---|---|---|
| Focus | Data/indexing for LLMs | Full framework + RAG |
| RAG | Core strength | @hazeljs/rag with GraphRAG, 11 loaders, Memory System, 5 vector stores |
| Web framework | None | Full HTTP, DI, routing |
| Agents | Via integrations | Native @hazeljs/agent with RAG integration |
| Use case | Data pipelines, retrieval | End-to-end AI applications |
HazelJS advantages: RAG plus a complete application layer — no separate framework needed.
HazelJS vs. LangGraph
| Aspect | LangGraph | HazelJS |
|---|---|---|
| Focus | Agent workflows, state machines | Full framework + agents + workflows |
| Agent orchestration | Core strength | @hazeljs/agent — AgentGraph, SupervisorAgent, @Delegate |
| Durable execution | Checkpointing, persistence | @hazeljs/flow — WAIT/resume, idempotency, Prisma storage |
| HTTP/REST | You wire it | Native controllers, @hazeljs/flow-runtime for flow API |
| RAG | Via LangChain | @hazeljs/rag with GraphRAG, Memory System |
HazelJS advantages: One stack for agents and durable workflows; no separate LangChain/LangGraph integration. Use AgentGraph for agent DAGs and @hazeljs/flow for business workflows (orders, approvals, etc.).
The Power of HazelJS
1. Unified Architecture
One framework, one module system, one DI container. Your AI services, HTTP controllers, and infrastructure (cache, auth, discovery) all use the same patterns. No "AI layer" bolted onto a different framework.
2. AI-Native Design
-
@hazeljs/ai —
@AITaskdecorator, multi-provider (OpenAI, Anthropic, Gemini, Cohere, Ollama), streaming, response caching, retry with backoff, output type validation, function calling, token tracking -
@hazeljs/agent — Stateful agents, tools with approval workflows,
@Delegatefor peer-to-peer calls,AgentGraphfor DAG pipelines (sequential, conditional, parallel),SupervisorAgentfor LLM-driven routing, memory, RAG integration, streaming execution - @hazeljs/rag — Vector search, GraphRAG (local/global/hybrid), 11 document loaders (PDF, DOCX, web, YouTube, GitHub, etc.), Memory System (conversation, entity, fact, working memory), Agentic RAG, 5 vector stores (Pinecone, Qdrant, Weaviate, Chroma, Memory)
3. Production-Ready Infrastructure
- @hazeljs/gateway — Canary deployments, version routing, circuit breaker, traffic mirroring
- @hazeljs/resilience — Circuit breaker, retry, timeout, bulkhead, rate limiter
- @hazeljs/discovery — Service registry, load balancing (6 strategies), health checks
- @hazeljs/cache — Memory, Redis, CDN tiers
- @hazeljs/serverless — AWS Lambda, Google Cloud Functions
- @hazeljs/flow — Durable execution graph engine with WAIT/resume, idempotency, retry, audit timeline; in-memory or Prisma persistence
-
@hazeljs/flow-runtime — REST API for flows (start, tick, resume, timeline); programmatic
runFlowRuntime()or standalone process; recovery on startup
4. Decorator-First DX
@Controller({ path: '/chat' })
class ChatController {
constructor(private aiService: AIService) {}
@AITask({ provider: 'openai', model: 'gpt-4' })
@Post()
async chat(@Body() body: { message: string }) {
return body.message;
}
}
AI, validation, and routing declared in one place. See the Quick Start for more.
5. Agents & Agentic RAG: Decorator-Powered Intelligence
HazelJS makes agents and intelligent retrieval first-class with declarative decorators — no imperative chains or manual orchestration.
Agents with @Agent, @Tool, and human-in-the-loop:
import { Agent, Tool } from '@hazeljs/agent';
@Agent({
name: 'support-agent',
description: 'Customer support agent',
systemPrompt: 'You are a helpful customer support agent.',
enableMemory: true,
enableRAG: true,
})
export class SupportAgent {
@Tool({
description: 'Look up order by ID',
parameters: [{ name: 'orderId', type: 'string', required: true }],
})
async lookupOrder(input: { orderId: string }) {
return { status: 'shipped', trackingNumber: 'TRACK123' };
}
@Tool({
description: 'Process a refund',
requiresApproval: true, // human-in-the-loop before execution
parameters: [{ name: 'orderId', type: 'string' }, { name: 'amount', type: 'number' }],
})
async processRefund(input: { orderId: string; amount: number }) {
return { success: true, refundId: 'REF123' };
}
}
Multi-agent orchestration with @Delegate — the LLM sees delegation as a tool; at runtime it calls another agent:
import { Agent, Delegate } from '@hazeljs/agent';
@Agent({ name: 'OrchestratorAgent', systemPrompt: 'Plan and delegate tasks.' })
export class OrchestratorAgent {
@Delegate({ agent: 'ResearchAgent', description: 'Research a topic', inputField: 'query' })
async researchTopic(query: string): Promise<string> {
return ''; // body replaced at runtime — calls ResearchAgent
}
@Delegate({ agent: 'WriterAgent', description: 'Write from research notes', inputField: 'content' })
async writeArticle(content: string): Promise<string> {
return ''; // body replaced at runtime — calls WriterAgent
}
}
Agentic RAG — self-improving retrieval with decorators. No manual query planning or reflection loops:
import { AgenticRAGService } from '@hazeljs/rag/agentic';
import { MemoryVectorStore, OpenAIEmbeddings } from '@hazeljs/rag';
const agenticRAG = new AgenticRAGService({
vectorStore: new MemoryVectorStore(new OpenAIEmbeddings()),
});
// Query planning, self-reflection, adaptive strategy — all built-in
const results = await agenticRAG.retrieve(
'What are the main architectural layers and how do they relate?'
);
Or use decorators for fine-grained control: @QueryPlanner (decompose complex queries), @SelfReflective (evaluate and improve results), @AdaptiveRetrieval (auto-select similarity/hybrid/MMR), @MultiHop (chain retrieval steps), @HyDE (hypothetical document embeddings). Declare behavior; the runtime handles the rest.
6. Modular Monorepo
Install only what you need:
npm install @hazeljs/core
npm install @hazeljs/ai @hazeljs/agent @hazeljs/rag
npm install @hazeljs/flow @hazeljs/flow-runtime # durable workflows
npm install @hazeljs/gateway @hazeljs/discovery @hazeljs/resilience
Full package list in the main README.
When to Choose HazelJS
Choose HazelJS when you:
- Build AI-powered backends (chatbots, agents, RAG) and want one framework
- Need multi-agent orchestration (AgentGraph, SupervisorAgent, @Delegate) or durable workflows (@hazeljs/flow)
- Need microservices with discovery, gateway, and resilience
- Prefer decorators and DI over manual wiring
- Want production patterns (circuit breaker, canary, serverless, idempotent workflows) without assembling them yourself
- Use TypeScript and value type safety end-to-end
Consider alternatives when:
- You need edge-first or multi-runtime (Hono, Vercel AI SDK)
- You only need frontend AI (Vercel AI SDK)
- You want maximum raw throughput with minimal features (Fastify)
- You're deeply invested in LangChain/LangGraph and don't need a full web framework (though HazelJS offers AgentGraph + @hazeljs/flow as alternatives)
Getting Started
Install
npm install @hazeljs/core @hazeljs/ai @hazeljs/agent @hazeljs/rag
Quick Example
import { HazelApp, HazelModule, Controller, Get, Post } from '@hazeljs/core';
import { AIService, AITask } from '@hazeljs/ai';
@Controller({ path: '/hello' })
class HelloController {
@Get()
hello() {
return { message: 'Hello, World!' };
}
}
@Controller({ path: '/chat' })
class ChatController {
constructor(private aiService: AIService) {}
@AITask({ provider: 'openai', model: 'gpt-4' })
@Post()
async chat(message: string) {
return message;
}
}
@HazelModule({
controllers: [HelloController, ChatController],
})
class AppModule {}
async function bootstrap() {
const app = new HazelApp(AppModule);
await app.listen(3000);
}
bootstrap();
Resources
- hazeljs.ai — Official site
- GitHub — Source, issues, discussions
- Quick Start — 5-minute setup
- Package Docs — AI, Agent, RAG, Flow, Flow Runtime, Gateway, Resilience, Discovery
- Gateway Blog — Deep dive on @hazeljs/gateway
-
npm — All
@hazeljs/*packages
Summary
| Dimension | HazelJS Position |
|---|---|
| vs. NestJS | Lighter, built-in AI, native Prisma |
| vs. Express/Fastify/Hono | Full architecture + AI, not just HTTP |
| vs. LangChain | Integrated with web framework, no glue |
| vs. LangGraph | AgentGraph + @hazeljs/flow for agents and durable workflows in one stack |
| vs. Vercel AI SDK | Backend + agents + RAG, deployment-agnostic |
| vs. LlamaIndex | RAG + GraphRAG + Memory System + full application stack |
HazelJS is built for teams that want one cohesive stack for web APIs, AI agents, RAG, and microservices. If that matches your needs, it's worth a close look.
Built with ❤️ for the Node.js and AI community. HazelJS | GitHub | npm
Top comments (0)