Skip to content

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 ​

MethodHTTPPathDescription
templates.list()GET/templates/List all templates
templates.getAllGrouped()GET/templates/groupedTemplates 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 | undefined
@descriptionMarket to post every job in. Omit to post across markets: each job goes to the cheapest PREMIUM market with a node that meets `requirements`.
market
: '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: number
@descriptionTimeout in minutes, must be at least 1 minute.@descriptionTimeout in minutes, must be at least 60 minute.
timeout
: 3600,
replicas: numberreplicas: 1, strategy: "SIMPLE" | "SIMPLE-EXTEND" | "SCHEDULED" | "INFINITE"
@enum@enum
strategy
: 'SIMPLE',
});

See Create Deployments for the full deployment options.