> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cognee.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Language Bindings

> Python, C, and JavaScript SDKs for cognee-rust, built on a shared bindings-common core.

cognee-rust ships three language bindings on top of the Rust core. All share the
same SDK-tier implementation via [`cognee-bindings-common`](https://github.com/topoteretes/cognee-rs/blob/main/crates/bindings-common/)
(portable op bodies + stable error codes), so their surfaces line up 1:1. Each
exposes the same flow: `warm()` → `add()` → `cognify()` → `search()`.

| Binding                  | README                                                                                  | Entry type                                              | Async model                                           |
| ------------------------ | --------------------------------------------------------------------------------------- | ------------------------------------------------------- | ----------------------------------------------------- |
| **Python** (PyO3)        | [python/README.md](https://github.com/topoteretes/cognee-rs/blob/main/python/README.md) | `Cognee` (`from cognee_py import Cognee`)               | native `async`                                        |
| **C** (FFI)              | [capi/README.md](https://github.com/topoteretes/cognee-rs/blob/main/capi/README.md)     | `cg_sdk_*` over an opaque handle                        | callback-based (+ optional `CgSdkWaiter` sync bridge) |
| **JavaScript/TS** (Neon) | [ts/README.md](https://github.com/topoteretes/cognee-rs/blob/main/ts/README.md)         | `Cognee` (`import { Cognee } from '@cognee/cognee-ts'`) | Promise-based                                         |

Module-level helpers exist in each binding for logging/telemetry setup. The
`serve()` / `disconnect()` cloud helpers live in the closed companion packages,
not in the OSS bindings. The full per-language method list lives in each
binding's README and its generated docs.

## Configuration

All three delegate to the same `ConfigManager` in `cognee-bindings-common`; the
difference is purely ergonomic (design decision A3.1, intentional for 0.1.0):

| Binding    | Setter surface                                                                                                                                                                                              |
| ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **JS**     | \~40 granular typed setters (`setLlmModel`, `setEmbeddingProvider`, …) **+** 4 bulk setters (`setLlmConfig`, `setEmbeddingConfig`, `setVectorDbConfig`, `setGraphDbConfig`) **+** generic `set(key, value)` |
| **C**      | `cg_sdk_config_set` / `cg_sdk_config_set_str`, the 4 bulk setters, `cg_sdk_config_get`                                                                                                                      |
| **Python** | `set`, `set_str`, the 4 bulk setters, `get`                                                                                                                                                                 |

The generic `set("llm_model", value)` already reaches every key, so C and Python
deliberately ship only the generic + bulk setters; JS adds the granular setters
as thin (infallible) sugar over the same underlying fields. Type errors surface
with the stable `CONFIG_TYPE_MISMATCH` code (C: `CG_ERR_CONFIG_TYPE_MISMATCH`) at
the call site. The full set of settable keys is the canonical `Settings` field
names — see [Configuration](/rust/configuration) and
[`crates/lib/src/config.rs`](https://github.com/topoteretes/cognee-rs/blob/main/crates/lib/src/config.rs). Field names are
camelCase in JS, snake\_case in Python/C (matching the struct).

### Unification path (post-0.1.0)

If full parity is required, mirror the JS macro-driven approach: add
`set_llm_model(value)` / `cg_sdk_config_set_llm_model(handle, value)` etc. as thin
`set_str("llm_model", value)` wrappers in each binding's idiomatic case
(\~0.5 d/binding, mechanical).
