StackMap
Subscribe

cocoindex vs fenic

Rust-core incremental indexing engine: declare Target = F(Source) in Python and it keeps vector/graph/relational targets fresh forever, reprocessing only the delta — with per-row lineage. — versus — Semantic DataFrames: PySpark-style select, filter and join alongside AI operators — extract, classify, summarize, embed, semantic join — compiled on an engine built for inference.

The curated verdict

Two declarative takes on AI data transformation in Python. CocoIndex optimizes for incremental freshness — reprocess only the delta, forever; fenic optimizes for expressiveness — semantic joins and extraction as first-class operators over a lazy plan.

cocoindexfenic
Stars11k665
Forks88741
LanguageRustPython
LicenseApache-2.0Apache-2.0
Last activity6 days ago3 days ago
Topicsragdata, orchestration
Curated connections63

cocoindex — the curator's take

The mental model sells it — 'React for data engineering': you declare what the index should contain, and the engine reconciles it against source changes forever, re-running only affected rows (cached by hash of input AND code, so editing your transform also invalidates precisely). That's the honest answer to stale agent context: sub-second freshness at a fraction of the re-embedding bill, with every vector traceable to its source byte. Sources span code, PDFs, Slack, audio; targets span pgvector, LanceDB, Neo4j, Kafka. The flagship application is cocoindex-code, an AST-aware incremental code-index MCP for coding agents. Use it when your corpus changes constantly and batch re-indexing is bleeding you; overkill for a static document pile — any one-shot RAG ingester handles that.

fenic — the curator's take

Use it when an agent's data discovery has to survive the chat: express the work as typed operators and the pipeline is already the artifact — `explain()`-able, rerunnable, row-level lineage, per-query cost and tokens, promotable to a table, view or MCP tool. `semantic.extract(PydanticModel)` replacing regex-plus-one-off-prompt is the whole pitch, and the engine handles batching, rate limits, retries and response caching so you aren't hand-rolling them. Not the tool for streaming or petabyte scale, and not a pandas replacement: it's a lazy query engine you configure models on, so single-row interactive work feels heavy and every operator is a real inference bill.