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

# Develop a model on Baseten

> Package, configure, and iterate on a model with Truss at whatever level of control your model needs.

Develop and deploy your own models on dedicated infrastructure. [Truss](https://github.com/basetenlabs/truss) is the model packaging framework. Its `config.yaml` file uses YAML syntax to define the model container, dependencies, and runtime configuration. Use the [Baseten CLI](/reference/cli/baseten/model) to deploy and manage the package on Baseten with autoscaling and observability. To call a hosted model without deploying it, use [Model APIs](/inference/model-apis/overview).

## How you develop a model

Configure your model package, add inference code if needed, and deploy it with the Baseten CLI:

* **Configuration only.** Use `config.yaml` to declare the GPU, dependencies, base image, and weights. Many open-source LLMs require no custom serving code. See [Configuration](/development/model/configuration) and [Dependencies](/development/model/dependencies).
* **Custom Python.** Add `model/model.py` when you need preprocessing, postprocessing, or model logic that configuration cannot express. The Python `Model` class defines `load` and `predict`. See [The Model class](/development/model/model-class).
* **Baseten CLI.** Use `baseten model push --watch` to create a development deployment, `baseten model watch` to sync changes, and `baseten model deployment promote` to ship to production. See [The development loop](/development/model/deploy-and-iterate).

If you already have a server based on vLLM, SGLang, Triton, or another container image, deploy it as a [custom Docker server](/development/model/custom-server).

## Pick a starting point

* **Config-only:** Deploy a model from a single `config.yaml`. Start with [Build your first model](/development/model/build-your-first-model).
* **Custom Python:** Write a `Model` class with `__init__`, `load`, and `predict`. Start with [The Model class](/development/model/model-class).
* **Custom Docker:** Bring your own container. See [Custom Docker servers](/development/model/custom-server).

<Frame>
  <img src="https://mintcdn.com/baseten-preview/QSTsjlPJ_dU4jrB6/images/user-workflow.png?fit=max&auto=format&n=QSTsjlPJ_dU4jrB6&q=85&s=df89988292282d68e9935d114b51aaa0" width="3044" height="724" data-path="images/user-workflow.png" />
</Frame>

## The development cycle

Whichever approach you choose, the development cycle is the same: create a development deployment, sync local changes, then publish an immutable deployment for production traffic.

1. **Push to development.** Run `baseten model push --watch` to create a single-replica development deployment with live reload.
2. **Iterate with live reload.** Run `baseten model watch` to sync local changes without rebuilding the container. Edit a file, save it, and review the result in the deployment logs.
3. **Publish to production.** Run `baseten model push` to create an immutable, production-ready deployment with full autoscaling. Promote it to an [environment](/deployment/environments) for a stable endpoint URL that doesn't change between versions.

Development deployments are limited to one replica and optimized for iteration rather than production traffic. See [The development loop](/development/model/deploy-and-iterate) for the full workflow.

## Build multi-model systems

Use [Chains](/development/chain/overview) when a workflow contains multiple models or steps that need different hardware. For example, a RAG pipeline can run retrieval and generation on separate instances with independent scaling rules.
