npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

crewai-ts

v0.2.0

Published

TypeScript port of crewAI for agent-based workflows

Readme

CrewAI TypeScript

A modern TypeScript port of crewAI, optimized for ESM and modern Node.js environments.

Features

  • 🚀 Pure ESM: Built as an ESM-first package for modern JavaScript environments
  • 🧰 TypeScript: Full type safety with well-defined interfaces
  • Bun-ready: Optimized for performance with Bun
  • 🧩 Modular Architecture: Import only what you need
  • 🔄 API Compatibility: Familiar API for crewAI users
  • 🧠 Knowledge Management: Efficient vector storage with similarity search
  • 💾 Flexible Storage: In-memory by default with optional persistent storage

Installation

bun add crewai-ts

Basic Usage

import { Agent, Crew, Task } from 'crewai-ts';

// Create agents
const researcher = new Agent({
  role: 'Researcher',
  goal: 'Research and provide accurate information',
  backstory: 'You are an expert researcher with vast knowledge'
});

const writer = new Agent({
  role: 'Writer',
  goal: 'Create engaging content based on research',
  backstory: 'You are a skilled writer who can explain complex topics'
});

// Create tasks
const researchTask = new Task({
  description: 'Research the latest advancements in AI',
  agent: researcher
});

const writeTask = new Task({
  description: 'Write an article about AI advancements',
  agent: writer
});

// Create a crew
const crew = new Crew({
  agents: [researcher, writer],
  tasks: [researchTask, writeTask],
  process: 'sequential'
});

// Execute the crew workflow
const result = await crew.kickoff();
console.log(result);

Knowledge Management

CrewAI-TS includes a powerful knowledge management system that enables agents to work with external information sources.

Using Knowledge Storage

The Knowledge Storage system allows you to store, retrieve, and search through knowledge chunks based on semantic similarity.

import { Knowledge, KnowledgeStorage } from 'crewai-ts';

// Initialize storage
const storage = new KnowledgeStorage({
  // Optional: custom collection name
  collectionName: 'my-knowledge',
  
  // Optional: embedding configuration
  embedder: {
    model: 'all-MiniLM-L6-v2',  // Default embedder model
    dimensions: 384,            // Embedding dimensions
    normalize: true             // Whether to normalize vectors
  }
});

// Add knowledge chunks
await storage.addChunks([
  {
    content: 'TypeScript is a strongly typed programming language that builds on JavaScript.',
    metadata: { source: 'docs', category: 'programming' }
  },
  {
    content: 'JavaScript is a high-level, interpreted programming language.',
    metadata: { source: 'docs', category: 'programming' }
  }
]);

// Search for relevant information
const results = await storage.search(
  ['TypeScript programming'], // queries
  5,                          // limit
  { category: 'programming' } // optional filter
);

console.log(results);
// Will return matched chunks sorted by similarity

Storage Backends

Important: ChromaDB or persistent storage is NOT required to use the project. The default implementation uses an efficient in-memory storage that works without any external dependencies.

In-Memory Storage (Default)

By default, KnowledgeStorage uses an in-memory implementation that:

  • Works out of the box with no configuration
  • Offers fast performance for small to medium datasets
  • Doesn't persist between application restarts
  • Optimized for vector operations with modern JavaScript engines

Options for Persistent Storage

If you need persistent storage, you have several options:

  1. Local File Storage: Save/load the knowledge data manually:
import { KnowledgeStorage } from 'crewai-ts';
import fs from 'fs/promises';

// Save knowledge to file
async function saveKnowledge(storage) {
  const chunks = await storage.getAllChunks();
  await fs.writeFile('knowledge.json', JSON.stringify(chunks), 'utf8');
}

// Load knowledge from file
async function loadKnowledge(storage) {
  try {
    const data = await fs.readFile('knowledge.json', 'utf8');
    const chunks = JSON.parse(data);
    await storage.addChunks(chunks);
  } catch (error) {
    console.error('Failed to load knowledge:', error);
  }
}
  1. ChromaDB Integration: While not required, you can integrate with ChromaDB for production:
    • Install a ChromaDB JS client
    • Extend the KnowledgeStorage class to use ChromaDB for persistence

Knowledge with Agents

Combine knowledge management with agents for more powerful workflows:

import { Agent, Crew, Task, Knowledge } from 'crewai-ts';

// Create knowledge source
const knowledge = new Knowledge();
await knowledge.addTexts([
  'TypeScript adds static typing to JavaScript.',
  'JavaScript is a dynamic language used for web development.'
]);

// Create an agent with knowledge
const researcher = new Agent({
  role: 'Technical Researcher',
  goal: 'Provide accurate technical information',
  backstory: 'You are a technical expert',
  knowledge: knowledge  // Attach knowledge to the agent
});

// Agent can now use knowledge in its responses
const researchTask = new Task({
  description: 'Explain the difference between TypeScript and JavaScript',
  agent: researcher
});

const crew = new Crew({
  agents: [researcher],
  tasks: [researchTask]
});

const result = await crew.kickoff();
console.log(result);

Flow System

CrewAI-TS includes a powerful Flow system that allows you to create complex, event-driven workflows with optimal performance. The Flow system is designed for extensibility, type safety, and efficient execution.

Basic Flow Usage

import { Flow, FlowState } from 'crewai-ts/flow';
import { start, listen, router } from 'crewai-ts/flow/decorators';
import { CONTINUE, STOP } from 'crewai-ts/flow/types';

// Create a custom state for your flow
class MyFlowState extends FlowState {
  data: any = {};
  results: string[] = [];
}

// Define your flow with decorated methods
class DataProcessingFlow extends Flow<MyFlowState> {
  constructor() {
    super({ initialState: new MyFlowState() });
  }
  
  @start()
  async fetchData() {
    this.state.data = await fetchSomeExternalData();
    return CONTINUE;
  }
  
  @listen('fetchData')
  async processData() {
    // Process the data
    const processedData = transformData(this.state.data);
    this.state.results.push(processedData);
    
    // Return value determines next steps
    return { quality: processedData.quality };
  }
  
  @listen('processData')
  @router((result) => result?.quality === 'high')
  async handleHighQuality() {
    this.state.results.push('High quality handling');
    return CONTINUE;
  }
  
  @listen('processData')
  @router((result) => result?.quality === 'low')
  async handleLowQuality() {
    this.state.results.push('Low quality handling');
    return CONTINUE;
  }
  
  @listen(or_('handleHighQuality', 'handleLowQuality'))
  async complete() {
    return { success: true, results: this.state.results };
  }
}

// Execute the flow
const flow = new DataProcessingFlow();
const result = await flow.execute();
console.log(result);

Flow Visualization

You can visualize your flows to understand complex execution paths:

import { plotFlow } from 'crewai-ts/flow/visualization';

// Create a visualization of your flow
const flow = new DataProcessingFlow();
const htmlPath = await plotFlow(flow, 'data-processing-flow');
console.log(`Flow visualization saved to: ${htmlPath}`);

CLI Commands

CrewAI-TS provides command-line tools for working with flows:

# Create a new flow
npx crewai create-flow MyCustomFlow --description "A flow for custom processing"

# Run a flow
npx crewai run-flow ./src/flows/MyCustomFlow.flow.ts --input '{"key":"value"}'

# Generate a flow visualization
npx crewai plot-flow ./src/flows/MyCustomFlow.flow.ts --output my-flow-viz

Advanced Flow Features

  • Complex Conditions: Use and_() and or_() decorators for complex triggering conditions
  • Custom Routing Logic: Implement sophisticated routing with the router decorator
  • Error Handling: Built-in error propagation with * wildcard listener for centralized error handling
  • Performance Optimizations:
    • Method result caching for expensive operations
    • Parallel execution of independent methods
    • Efficient event propagation with minimal overhead
    • Memoized position calculations for visualizations

Differences from Python crewAI

  • Native TypeScript types and interfaces
  • ESM-only package structure
  • Enhanced error handling with TypeScript discriminated unions
  • Modern async patterns using top-level await and async iterators
  • Performance optimizations for vector operations
  • In-memory knowledge storage that works without external dependencies

Roadmap

The following features are planned for future releases:

  • ContextualMemory Component: Intelligent orchestration layer that combines different memory types (short-term, long-term, entity, user) to build comprehensive context for agent tasks
  • UserMemory Component: Store and retrieve memory specifically associated with end-users, enabling personalized agent interactions based on user history and preferences
  • Additional Embedding Providers: Support for more embedding models and providers
  • Enhanced Memory Persistence: Improved options for storing and retrieving memory across sessions
  • Performance Optimizations: Further optimizations for large-scale memory operations

License

MIT