Skip to content

Composable layers

The generator treats architecture as a set of roles with compatibility rules. This avoids the combinatorial maintenance cost of keeping a separate template for every framework/provider/database/deploy permutation.

Layer Responsibility Cardinality
Workload Primary shape and entry point exactly one
Framework Runtime or AI orchestration framework zero or one
Interface API, web, notebook, or terminal front end zero or more
Model provider Generative model access zero or one
Embedding provider Embedding model access zero or one, independent
Data roles SQL, document, vector, graph, cache zero or one per role
SQL abstraction SQLModel or SQLAlchemy zero or one for eligible SQL stores
Auth Request authentication zero or one
Training extensions Data, acceleration, tuning, optimization zero or more
Serving Model or gateway runtime zero or one
MLOps and quality Orchestration, evaluation, telemetry zero or more
Deploy Runtime destination zero or one
IaC Cloud resource definition none, Pulumi, or Terraform

Compatibility is resolved before rendering

Copier validators reject combinations that cannot form a meaningful project. Examples include using an agent framework for a plain library preset, adding a SQL abstraction without a compatible SQL engine, or selecting IaC for a target without a generated infrastructure contract.

Python compatibility is also visible in the catalog. The general baseline is Python 3.12 or newer; components whose upstream support is narrower constrain the available versions.

Data roles stay explicit

A single engine can fill several roles when it supports them. Beaver, for example, can cover document, vector, graph, and cache in a local-first stack. That does not collapse the roles: each answer remains explicit, so a project can later move only vector retrieval to a hosted engine without changing its graph store.

Portable deployment remains the base

Selecting a deploy target creates its native configuration and keeps a Docker path. Cloud-specific Pulumi or Terraform is additive. Application code does not become dependent on the IaC choice.