[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/mozilla-ai/encoderfile/main/docs/python/building-with-python.md [Back]  [Original]

# Building with Python

The `encoderfile` Python package lets you build encoderfile binaries programmatically  no separate CLI installation required. It is a thin wrapper around the same Rust build pipeline used by the CLI tool.

## Installation

```bash
pip install encoderfile
```

```bash
# or with uv
uv add encoderfile
```

## Prerequisites

You need an ONNX-exported model directory containing:

- `model.onnx`  ONNX model weights
- `tokenizer.json`  tokenizer vocabulary and configuration
- `config.json`  model architecture metadata

Export any HuggingFace model with [Optimum](https://huggingface.co/docs/optimum):

```bash
pip install 'optimum[onnx]'
optimum-cli export onnx \
  --model distilbert-base-uncased-finetuned-sst-2-english \
  --task text-classification \
  ./sentiment-model
```

## Quick Start

The simplest build uses `EncoderfileBuilder` directly:

```python
from encoderfile import EncoderfileBuilder, ModelType

builder = EncoderfileBuilder(
    name="sentiment-analyzer",
    model_type=ModelType.SequenceClassification,
    path="./sentiment-model",  # path to your ONNX-exported model directory
)
builder.build()
# writes ./sentiment-analyzer.encoderfile
```

## Three Ways to Build

### 1. `EncoderfileBuilder` (full control)

Best when you need fine-grained control over tokenizer settings, transforms, or cross-compilation targets.

```python
from encoderfile import EncoderfileBuilder, ModelType, TokenizerBuildConfig, Fixed

builder = EncoderfileBuilder(
    name="my-ner-model",
    model_type=ModelType.TokenClassification,
    path="./ner-model",
    output_path="./build/my-ner-model.encoderfile",
    version="1.2.0",
    tokenizer=TokenizerBuildConfig(
        pad_strategy=Fixed(n=512),
        max_length=512,
    ),
)
builder.build()
```

### 2. `build()` convenience function (flat arguments)

Best for scripts where you want to avoid importing supporting classes.

```python
from encoderfile import build, ModelType

build(
    name="my-embedder",
    model_type=ModelType.Embedding,
    path="./embedding-model",
    output_path="./my-embedder.encoderfile",
    tokenizer_pad_to="batch_longest",
    tokenizer_max_length=256,
)
```

### 3. `build_from_config()` (YAML config file)

Best when your build configuration lives in a file alongside your model.

```python
from encoderfile import build_from_config

build_from_config("sentiment-config.yml")
```

Where `sentiment-config.yml` contains:

```yaml
encoderfile:
  name: sentiment-analyzer
  path: ./sentiment-model
  model_type: sequence_classification
  output_path: ./build/sentiment-analyzer.encoderfile
```

## Model Types

See the [Building Guide](../reference/building.md#model-types) for a full description of each model type, including supported HuggingFace `AutoModel` classes and inference output shapes.

`ModelType` values are plain strings (`StrEnum`), so you can pass the string directly instead of importing the enum:

```python
builder = EncoderfileBuilder(
    name="my-model",
    model_type="sequence_classification",
    path="./my-model",
)
```

## Tokenizer Configuration

Override tokenizer padding and truncation settings at build time with `TokenizerBuildConfig`. These settings are baked into the binary and applied at every inference call.

```python
from encoderfile import EncoderfileBuilder, ModelType, TokenizerBuildConfig, BatchLongest, Fixed

# Dynamic padding  each batch is padded to its longest sequence
tokenizer = TokenizerBuildConfig(pad_strategy=BatchLongest())

# Fixed-length padding  every sequence padded/truncated to exactly 512 tokens
tokenizer = TokenizerBuildConfig(
    pad_strategy=Fixed(n=512),
    max_length=512,
    truncation_side="right",
    truncation_strategy="longest_first",
)

builder = EncoderfileBuilder(
    name="my-model",
    model_type=ModelType.Embedding,
    path="./my-model",
    tokenizer=tokenizer,
)
builder.build()
```

When using the `build()` convenience function, use flat `tokenizer_*` arguments instead:

```python
from encoderfile import build, ModelType

build(
    name="my-model",
    model_type=ModelType.Embedding,
    path="./my-model",
    tokenizer_pad_to=512,          # int  Fixed(n=512), or "batch_longest"
    tokenizer_max_length=512,
    tokenizer_truncation_side="right",
)
```

## Lua Transforms

Embed a Lua post-processing script to transform model logits before they are returned. See the [Transforms guide](../transforms/index.md) for the full scripting API.

```python
from encoderfile import EncoderfileBuilder, ModelType

# Inline Lua string
builder = EncoderfileBuilder(
    name="normalized-embedder",
    model_type=ModelType.Embedding,
    path="./embedding-model",
    transform="function Postprocess(logits) return logits:lp_normalize(2.0, 2.0) end",
)
builder.build()
```

```python
# From a file  use the build() convenience function
from encoderfile import build, ModelType

build(
    name="normalized-embedder",
    model_type=ModelType.Embedding,
    path="./embedding-model",
    transform_path="./normalize.lua",
)
```

## Cross-compilation

Build a binary targeting a different platform by passing a `target` triple:

```python
from encoderfile import EncoderfileBuilder, ModelType

builder = EncoderfileBuilder(
    name="my-model",
    model_type=ModelType.Embedding,
    path="./my-model",
    target="x86_64-unknown-linux-gnu",  # build for Linux on a Mac
)
builder.build()
```

You can also use a `TargetSpec` object:

```python
from encoderfile import EncoderfileBuilder, ModelType, TargetSpec

spec = TargetSpec("aarch64-apple-darwin")
print(spec.arch, spec.os, spec.abi)  # "aarch64", "apple", "darwin"

builder = EncoderfileBuilder(
    name="my-model",
    model_type=ModelType.Embedding,
    path="./my-model",
    target=spec,
)
builder.build()
```

## Inspecting a Binary

Use `read_metadata()` to read the metadata embedded in an existing encoderfile binary without running inference:

```python
from encoderfile import read_metadata

info = read_metadata("./sentiment-analyzer.encoderfile")

print(info.encoderfile_config.name)        # "sentiment-analyzer"
print(info.encoderfile_config.model_type)  # "sequence_classification"
print(info.encoderfile_config.version)     # "1.0.0"
print(info.model_config.id2label)          # {0: "NEGATIVE", 1: "POSITIVE"}
```

## Next Steps

- **[Python API Reference](api-reference.md)**  full documentation for every class and function
- **[Transforms Guide](../transforms/index.md)**  custom post-processing with Lua scripts
- **[CLI Reference](../reference/cli.md)**  `build`, `serve`, and `infer` commands for the compiled binary

Web Proxy Viewer  |  New URL  |  Original Page