---
title: "Solutions: Ten primitives, any multimodal workflow"
description: "For developers who process media and serve model pipelines: the backend is one schema you keep, not a stack you assemble."
url: "https://pixeltable.com/solutions"
---

# Solutions: ten primitives, any multimodal workflow

For developers who process media and serve model pipelines: the backend is one schema you keep, not a stack you assemble.

Who this is for: [The Unified Multimodal Backend Agents Build With](https://pixeltable.com/blog/unified-multimodal-backend-agents-build-with).

## Store

Create tables with native multimodal types. Every annotation becomes a stored column.

```python
TableModel = pxt.model_base()

class Media(TableModel, name='media'):
    video: pxt.Video
    image: pxt.Image
    audio: pxt.Audio
    document: pxt.Document
    metadata: pxt.Json
```

- [Tables & Data](https://docs.pixeltable.com/tutorials/tables-and-data-operations)
- [Type System](https://docs.pixeltable.com/platform/type-system)

## Orchestrate

Assignments are computed columns: API calls, local models, and vision run on insert.

```python
class Media(TableModel, name='media'):
    text: pxt.String
    image: pxt.Image
    summary = openai.chat_completions(
        messages=[{'role': 'user', 'content': 'Summarize: ' + text}],
    )
    objects = yolox(image, model_id='yolox_s')
```

- [Computed Columns](https://docs.pixeltable.com/tutorials/computed-columns)
- [AI Integrations](https://docs.pixeltable.com/integrations/frameworks)

## Iterate

A view is a class with base= and iterator=. One row per frame, chunk, or segment: no copy of the source.

```python
class Frames(TableModel, name='frames', base=Videos,
             iterator=frame_iterator(Videos.video, fps=1)):
    ...

class Chunks(TableModel, name='chunks', base=Docs,
             iterator=document_splitter(Docs.document)):
    ...
```

- [Views](https://docs.pixeltable.com/platform/views)
- [Iterators](https://docs.pixeltable.com/platform/iterators)

## Index

Declare the embedding index next to the column. It stays in sync as rows change.

```python
class Docs(TableModel, name='docs'):
    text: pxt.String
    __indexes__ = [
        pxt.EmbeddingIndex(text, string_embed=embed),
    ]
```

- [Embedding Indexes](https://docs.pixeltable.com/platform/embedding-indexes)

## Extend

Custom Python stays custom Python. @pxt.udf and @pxt.query are the two hooks.

```python
@pxt.udf
def extract_entities(text: str) -> list[str]:
    return entities

@pxt.query
def search_by_topic(topic: str):
    return Docs.where(Docs.category == topic).select(
        Docs.title, Docs.summary,
    )
```

- [UDFs & Queries](https://docs.pixeltable.com/platform/udfs-in-pixeltable)

## Agents & Tools

Tool calls and the answer are computed columns, not a loop you keep in memory.

```python
class Turns(TableModel, name='turns'):
    question: pxt.String
    response = openai.chat_completions(
        messages=[{'role': 'user', 'content': question}],
        tools=tools,
    )
    result = openai.invoke_tools(tools, response)
```

- [Tool Calling](https://docs.pixeltable.com/howto/cookbooks/agents/llm-tool-calling)
- [Agentic workflows](https://docs.pixeltable.com/use-cases/agentic-workflows)

## Serve

Declare FastAPIRouter in app.py, then pxt service update. Same file locally or against pxt://. pxt service run is local only.

```bash
pxt schema update app.py my_app
pxt service update app.py my_app
pxt service list
```

- [HTTP Serving](https://docs.pixeltable.com/howto/deployment/serving)

## Query & Experiment

SQL-like queries on the table. Sample a transform before you commit it to every row.

```python
Docs.where(Docs.score > 0.8).order_by(Docs.ts).limit(10).collect()

Docs.select(Docs.text, summary=summarize(Docs.text)).head(3)
```

- [Queries & Expressions](https://docs.pixeltable.com/tutorials/queries-and-expressions)
- [Test before commit](https://docs.pixeltable.com/howto/deployment/operations#testing-transformations-before-deployment)

## Version

Every insert, update, and schema change is a version. Revert is a plan you review.

```bash
pxt history
pxt revert --steps 1
```

- [Version Control](https://docs.pixeltable.com/platform/version-control)

## Import/Export

Load from a file, URL, or Hugging Face dataset. Export to CSV, Parquet, or PyTorch.

```python
Media.insert([{'video': 's3://bucket/clip.mp4'}])
pxt.io.export_parquet(Media, 'output.parquet')
```

- [Data Import](https://docs.pixeltable.com/howto/cookbooks/data/data-import-csv)
- [Data Export](https://docs.pixeltable.com/howto/cookbooks/data/data-export-pytorch)