Templates API
The Templates API exposes the catalog of ready-made deployment templates (the same ones shown in the Nosana Deploy dashboard). Each template ships a job definition you can use as a starting point for your own deployments, and can have multiple variants (for example different model sizes).
Usage
ts
import { function createNosanaClient(network: NosanaNetwork | undefined, customConfig: PartialClientConfig & {
connect: ConnectFactoryConfig & {
clientSecret: string;
};
}): NosanaClient & {
connect: ServerConnect;
} (+3 overloads)
createNosanaClient, type NosanaNetwork = "mainnet" | "devnet" | "localnet"
const NosanaNetwork: {
readonly MAINNET: "mainnet";
readonly DEVNET: "devnet";
readonly LOCALNET: "localnet";
}
NosanaNetwork } from '@nosana/kit';
const const client: NosanaClientclient = function createNosanaClient(network?: NosanaNetwork, customConfig?: PartialClientConfig): NosanaClient (+3 overloads)createNosanaClient(const NosanaNetwork: {
readonly MAINNET: "mainnet";
readonly DEVNET: "devnet";
readonly LOCALNET: "localnet";
}
NosanaNetwork.type MAINNET: "mainnet"MAINNET, {
PartialClientConfig.api?: Partial<APIConfig> | undefinedapi: { apiKey?: string | undefinedapiKey: const process: {
env: Record<string, string>;
}
process.env: Record<string, string>env.stringNOSANA_API_KEY },
});
// List all templates
const const templates: {
id: string;
name: string;
jobDefinition: unknown;
icon: (string | null) | null;
readme: (string | null) | null;
category: (string | null) | null;
vram_requirement: (number | null) | null;
cuda_requirement: (number[] | null) | null;
is_variant_template: (boolean | null) | null;
parent_template_id: (string | null) | null;
variants: unknown;
}[]
templates = await const client: NosanaClientclient.NosanaClient.api: NosanaApiClientapi.templates: NosanaTemplatesApitemplates.NosanaTemplatesApi.list: () => Promise<Template[]>list();
// Or grouped by category
const const grouped: Record<string, unknown>grouped = await const client: NosanaClientclient.NosanaClient.api: NosanaApiClientapi.templates: NosanaTemplatesApitemplates.NosanaTemplatesApi.getAllGrouped: () => Promise<Record<string, unknown>>getAllGrouped();
// Get one template, or a specific variant of it
const const template: {
id: string;
name: string;
jobDefinition: unknown;
icon: (string | null) | null;
readme: (string | null) | null;
category: (string | null) | null;
vram_requirement: (number | null) | null;
cuda_requirement: (number[] | null) | null;
is_variant_template: (boolean | null) | null;
parent_template_id: (string | null) | null;
variants: unknown;
}
template = await const client: NosanaClientclient.NosanaClient.api: NosanaApiClientapi.templates: NosanaTemplatesApitemplates.NosanaTemplatesApi.get: (id: string) => Promise<Template>get('template-id');
const const variant: {
id: string;
name: string;
jobDefinition: unknown;
icon: (string | null) | null;
readme: (string | null) | null;
category: (string | null) | null;
vram_requirement: (number | null) | null;
cuda_requirement: (number[] | null) | null;
is_variant_template: (boolean | null) | null;
parent_template_id: (string | null) | null;
variants: unknown;
}
variant = await const client: NosanaClientclient.NosanaClient.api: NosanaApiClientapi.templates: NosanaTemplatesApitemplates.NosanaTemplatesApi.getVariant: (id: string, variantId: string) => Promise<Template>getVariant('template-id', 'variant-id');Methods
| Method | HTTP | Path | Description |
|---|---|---|---|
templates.list() | GET | /templates/ | List all templates |
templates.getAllGrouped() | GET | /templates/grouped | Templates grouped by category |
templates.get(id) | GET | /templates/{id} | Get a template by ID |
templates.getVariant(id, variantId) | GET | /templates/{id}/{variantId} | Get a template variant |
Using a template in a deployment
A template's job definition can be passed straight into a deployment:
ts
import type { type JobDefinition = {
version: string;
type?: string;
logistics?: Logistics;
deployment_id?: DeploymentId;
ssh?: SSH;
meta?: Meta;
global?: Global;
ops: Ops;
}
JobDefinition } from '@nosana/kit';
const const template: {
id: string;
name: string;
jobDefinition: unknown;
icon: (string | null) | null;
readme: (string | null) | null;
category: (string | null) | null;
vram_requirement: (number | null) | null;
cuda_requirement: (number[] | null) | null;
is_variant_template: (boolean | null) | null;
parent_template_id: (string | null) | null;
variants: unknown;
}
template = await const client: NosanaClientclient.NosanaClient.api: NosanaApiClientapi.templates: NosanaTemplatesApitemplates.NosanaTemplatesApi.get: (id: string) => Promise<Template>get('template-id');
const const deployment: ApiDeploymentdeployment = await const client: NosanaClientclient.NosanaClient.api: NosanaApiClientapi.deployments: DeploymentsApi | ApiDeploymentsApideployments.create: (deploymentBody: CreateDeployment) => Promise<ApiDeployment>create({
name: stringname: 'my-deployment',
market?: string | undefinedmarket: 'CA5pMpqkYFKtme7K31pNB1s62X2SdhEv1nN9RdxKCpuQ',
job_definition: JobDefinitionjob_definition: const template: {
id: string;
name: string;
jobDefinition: unknown;
icon: (string | null) | null;
readme: (string | null) | null;
category: (string | null) | null;
vram_requirement: (number | null) | null;
cuda_requirement: (number[] | null) | null;
is_variant_template: (boolean | null) | null;
parent_template_id: (string | null) | null;
variants: unknown;
}
template.jobDefinition: unknownjobDefinition as type JobDefinition = {
version: string;
type?: string;
logistics?: Logistics;
deployment_id?: DeploymentId;
ssh?: SSH;
meta?: Meta;
global?: Global;
ops: Ops;
}
JobDefinition,
timeout: numbertimeout: 3600,
replicas: numberreplicas: 1,
strategy: "SIMPLE" | "SIMPLE-EXTEND" | "SCHEDULED" | "INFINITE"strategy: 'SIMPLE',
});See Create Deployments for the full deployment options.