Skip to content

tensorlakeai/indexify

Repository files navigation

Indexify

Compute Engine for Building Data Platforms

Release License Slack Documentation


Indexify is a compute engine for building data platforms in Python. Create large-scale data processing workflows and agentic applications with durable execution—functions automatically retry on failure, and workflows seamlessly scale across machines. Upon deployment, each application gets a unique URL that can be called from any system.

Note: Indexify is the open-source core that powers Tensorlake Cloud—a serverless platform for document processing, media pipelines, and agentic applications.

✨ Features

Feature Description
🐍 Python Native Define workflows as Python functions with type hints—no DSLs, YAML, or config files
🔄 Durable Execution Functions automatically retry on failure with persistent state across restarts
📊 Distributed Map/Reduce Parallelize functions over sequences across machines with automatic data shuffling
⚡ Request Queuing Automatically queue and batch invocations to maximize GPU utilization
🌐 Multi-Cloud Run across multiple clouds, datacenters, or regions with minimal configuration
📈 Autoscaling Server automatically redistributes work when machines come and go

🚀 What Can You Build?

Large-Scale Data Processing Workflows

Build production-grade data pipelines entirely in Python with automatic parallelization, fault tolerance, and distributed execution:

  • Document Processing — Extract tables, images, and text from PDFs at scale; build knowledge graphs; implement RAG pipelines
  • Media Pipelines — Transcribe and summarize video/audio content; detect and describe objects in images
  • ETL & Data Transformation — Process millions of records with distributed map/reduce operations

Agentic Applications

Build durable AI agents that reliably execute multi-step workflows:

  • Tool-Calling Agents — Orchestrate LLM tool calls with automatic state management and retry logic
  • Multi-Agent Systems — Coordinate multiple agents with durable message passing

📖 Explore the Cookbooks → for complete examples and tutorials.

📦 Installation

Using pip:

pip install indexify tensorlake

🎯 Quick Start

Define Your Application

Create applications using @application() and @function() decorators. Each function runs in its own isolated sandbox with durable execution—if a function crashes, it automatically restarts from where it left off.

from typing import List
from pydantic import BaseModel
from tensorlake.applications import application, function, Image, run_local_application

# Define container image with dependencies
embedding_image = Image(base_image="python:3.11-slim", name="embedding_image").run(
    "pip install sentence-transformers langchain-text-splitters chromadb"
)


class TextChunk(BaseModel):
    chunk: str
    page_number: int


class ChunkEmbedding(BaseModel):
    text: str
    embedding: List[float]


@function(image=embedding_image)
def chunk_text(text: str) -> List[TextChunk]:
    """Split text into chunks for embedding."""
    from langchain_text_splitters import RecursiveCharacterTextSplitter

    splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=20)
    texts = splitter.create_documents([text])
    return [
        TextChunk(chunk=chunk.page_content, page_number=i)
        for i, chunk in enumerate(texts)
    ]


@function(image=embedding_image)
def embed_chunks(chunks: List[TextChunk]) -> List[ChunkEmbedding]:
    """Embed text chunks using sentence transformers."""
    from sentence_transformers import SentenceTransformer
    
    model = SentenceTransformer("all-MiniLM-L6-v2")
    return [
        ChunkEmbedding(text=chunk.chunk, embedding=model.encode(chunk.chunk).tolist())
        for chunk in chunks
    ]


@function(image=embedding_image)
def write_to_vectordb(embeddings: List[ChunkEmbedding]) -> str:
    """Write embeddings to ChromaDB."""
    import chromadb
    import uuid
    
    client = chromadb.PersistentClient("./chromadb_data")
    collection = client.get_or_create_collection("documents")
    
    for emb in embeddings:
        collection.upsert(
            ids=[str(uuid.uuid4())],
            embeddings=[emb.embedding],
            documents=[emb.text],
        )
    return f"Indexed {len(embeddings)} chunks"


@application()
@function(description="Text embedding pipeline")
def text_embedder(text: str) -> str:
    """Main application: chunks text, embeds it, and stores in vector DB."""
    chunks = chunk_text(text)
    embeddings = embed_chunks(chunks)
    result = write_to_vectordb(embeddings)
    return result

Deploy to Tensorlake Cloud (Fastest Way to Get Started)

Tensorlake Cloud is the fastest way to test and deploy your applications—no infrastructure setup required. Get an API key and deploy in seconds:

# Set your API key
export TENSORLAKE_API_KEY="your-api-key"

# Deploy the application
tensorlake deploy workflow.py
# => Deployed! URL: https://api.tensorlake.ai/namespaces/default/applications/text_embedder

Invoke your application using the SDK or call the URL directly:

from tensorlake.applications import run_remote_application

request = run_remote_application(text_embedder, "Your document text here...")
result = request.output()
print(result)

Self-Host with Indexify

If you prefer to self-host or need on-premise deployment, you can run the Indexify server locally:

# Terminal 1: Start the server
docker run -p 8900:8900 tensorlake/indexify-server

# Terminal 2: Start an executor (repeat for more parallelism)
indexify-cli executor

Set the API URL and deploy:

export TENSORLAKE_API_URL=http://localhost:8900
tensorlake deploy workflow.py
# => Deployed! URL: http://localhost:8900/namespaces/default/applications/text_embedder

Run your application:

from tensorlake.applications import run_remote_application

request = run_remote_application(text_embedder, "Your document text here...")
result = request.output()
print(result)

Test Locally (No Server Required)

For quick iteration during development, run applications locally without any infrastructure:

if __name__ == "__main__":
    request = run_local_application(text_embedder, "Your document text here...")
    result = request.output()
    print(result)

🏗️ Production Self-Hosted Deployment

For production self-hosted deployments, see operations/k8s for Kubernetes deployment manifests and Helm charts.

☁️ Tensorlake Cloud vs Self-Hosted Indexify

Start with Tensorlake Cloud to build and test your applications without infrastructure overhead. When you're ready for self-hosting or need on-premise deployment, Indexify provides the same runtime you can run anywhere.

Feature Tensorlake Cloud Indexify (Self-Hosted)
Setup Time Instant—just get an API key Deploy server + executors
Image Building Automatic image builds when you deploy Build and manage container images yourself
Auto-Scaling Dynamic container scaling with scale-to-zero Manual executor management
Security Secure sandboxes (gVisor, Linux containers, virtualization) Standard container isolation
Secrets Built-in secret management for applications Manage secrets externally
Observability Logging, tracing, and observability built-in Bring your own logging/tracing
Testing Interactive playground to invoke applications Local development only

Get started with Tensorlake Cloud →

🤝 Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.

📄 License

Indexify is licensed under the Apache 2.0 License.


WebsiteDocsSlackTwitter