npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

civitai

v0.1.15

Published

JavaScript client for Civitai's generator

Downloads

229

Readme

Civitai Generator Node.js Client

A node.js client for Civitai's generator to run Civitai models from your Node.js code.

Installation

npm install civitai

Usage

Create the client:

// ESM (where `"type": module` in package.json or using .mjs extension)
import { Civitai } from "civitai";

// CommonJS (using .cjs extension)
const Civitai = require("civitai");
const civitai = new Civitai({
  auth: "YOUR_API_TOKEN",
});

Create a txt2img job:

import { Scheduler } from "civitai";

const input = {
  model: "urn:air:sdxl:checkpoint:civitai:101055@128078",
  params: {
    prompt:
      "RAW photo, face portrait photo of 26 y.o woman, wearing black dress, happy face, hard shadows, cinematic shot, dramatic lighting",
    negativePrompt:
      "(deformed iris, deformed pupils, semi-realistic, cgi, 3d, render, sketch, cartoon, drawing, anime, mutated hands and fingers:1.4), (deformed, distorted, disfigured:1.3)",
    scheduler: Scheduler.EULER_A,
    steps: 20,
    cfgScale: 7,
    width: 512,
    height: 512,
    clipSkip: 2,
  },
};

Run a model:

const response = await civitai.image.fromText(input);

Then fetch the result later:

const output = civitai.jobs.get(response.token);

Or wait for the job to finish by running the generation in the background a.k.a long polling:

const response = await civitai.image.fromText(input, true); // Add true flag

Note: Jobs timeout after 10 minutes.

Using Additional Networks

The SDK supports additional networks: LoRA, VAE, Hypernetwork, Textual Inversion, LyCORIS, Checkpoint, and LoCon. See the full list here.

To use any of the networks availabe on Civitai, simply add the additionalNetworks field into the input:

import { Scheduler, AssetType } from "civitai";

const input = {
  model: "urn:air:sd1:checkpoint:civitai:4384@128713",
  params: {
    prompt:
      "masterpiece, best quality, 1girl, IncrsAhri, multiple tails, fox tail, korean clothes, skirt, braid, arms behind back",
    negativePrompt:
      "(worst quality:1.4), (low quality:1.4), simple background, bad anatomy",
    scheduler: Scheduler.EULER_A,
    steps: 25,
    cfgScale: 7,
    width: 512,
    height: 768,
    seed: -1,
    clipSkip: 2,
  },
  // Add this `additionalNetworks` field
  additionalNetworks: {
    // Detail enhancer LoRA: https://civitai.com/models/82098 add-more-details-detail-enhancer-tweaker-lora
    "urn:air:sd1:lora:civitai:82098@87153": {
      strength: 1.0,
    },
  },
};

In the case of Lora and LoCon networks, set the strength of the network; for TextualInversion, set the triggerWord of the network.

API

Constructor

const civitai = new Civitai(options);

| name | type | description | | ------ | --------------------- | ---------------------------------------------------------- | | auth | string | Required. API access token | | env | dev | production | Optional. The environment to use. Default is production. |

civitai.image.fromText

Run a model with inputs you provide.

const response = await civitai.image.fromText(options);
{
  "token": "W3siSm9icyI6WyJjYzJkOGViNy1mOGE0LTRkNzYtOTE3Yi01OTliODRiZmRmNmYiXX1d",
  "jobs": [
    {
      "jobId": "cc2d8eb7-f8a4-4d76-917b-599b84bfdf6f",
      "cost": 1.2000000000000002,
      "result": {
        "blobKey": "0B60A87CDFB8E7307D0F19F623EBD8240307BD9C2345CD03B7E52A489A52CC47",
        "available": false
      },
      "scheduled": true
    }
  ]
}

| name | type | description | | ----------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | model | string | null | Required. The Civitai model to use for generation. | | params.prompt | string | null | Required. The main prompt for the image generation. | | params.negativePrompt | string | null | Optional. The negative prompt for the image generation. | | params.scheduler | Scheduler | null | Optional. The scheduler algorithm to use. Possible values are: EulerA, Euler, LMS, Heun, DPM2, DPM2A, DPM2SA, DPM2M, DPMSDE, DPMFast, DPMAdaptive, LMSKarras, DPM2Karras, DPM2AKarras, DPM2SAKarras, DPM2MKarras, DPMSDEKarras, DDIM, PLMS, UniPC, Undefined, LCM, DDPM, DEIS. | | params.steps | number | null | Optional. The number of steps for the image generation process. | | params.cfgScale | number | null | Optional. The CFG scale for the image generation. | | params.width | number | Required. The width of the generated image. | | params.height | number | Required. The height of the generated image. | | params.seed | number | null | Optional. The seed for the image generation process. | | params.clipSkip | number | null | Optional. The number of CLIP skips for the image generation. | | callbackUrl | string | null | Optional. URL that will be invoked upon completion of this job | | additionalNetworks | ImageJobNetworkParams | null | Optional. An associative list of additional networks, keyed by the AIR of the network. Each network is of type AssetType. | | controlNets | Array<ImageJobControlNet> | null | Optional. An associative list of additional networks. | | batchSize | number | null | Optional. The number of images to generate in a single batch. |

civitai.jobs.getById

Fetches the status of a job by its unique jobId.

const response = await civitai.jobs.getById(jobId);
{
  "jobId": "3f071548-46c6-40d5-8e5a-210aa6b8bccc",
  "cost": 1.2000000000000002,
  "result": {
    "blobKey": "27E0CD13EC240389EFB9A9C25EB29DC3B4AB74A973F132D6A6DB076C8B210570",
    "available": true,
    "blobUrl": "https://blobs-temp.sfo3...",
    "blobUrlExpirationDate": "2024-03-04T08:04:02.4149309Z"
  },
  "scheduled": false
}

civitai.jobs.getByToken

Get jobs associated with a token.

const response = await civitai.jobs.getByToken(token);
{
  "token": "W3siSm9icyI6WyIzZjA3MTU0OC00NmM2LTQwZDUtOGU1YS0yMTBhYTZiOGJjY2MiXX1d",
  "jobs": [
    {
      "jobId": "3f071548-46c6-40d5-8e5a-210aa6b8bccc",
      "cost": 1.2000000000000002,
      "result": {
        "blobKey": "27E0CD13EC240389EFB9A9C25EB29DC3B4AB74A973F132D6A6DB076C8B210570",
        "available": true,
        "blobUrl": "https://blobs-temp.sfo3...",
        "blobUrlExpirationDate": "2024-03-04T08:00:44.8268514Z"
      },
      "scheduled": false
    }
  ]
}

civitai.jobs.getByQuery

Retrieve a collection of jobs by quering properties, e.g., userId. You can optionally include a detailed boolean flag to get detailed information about the jobs.

const query: QueryJobsRequest = {
  properties: {
    userId: 4, // Querying by userId
  },
};
const detailed = false; // Optional boolean flag to get detailed job definitions. False by default.
const response = await civitai.jobs.getByQuery(query, detailed);
{
  "jobs": [
    {
      "jobId": "AA588B7B3EC68D88A02501121A08499E4B41664820C0F8D12F4119D8C49C04C9",
      "cost": 1.54375,
      "properties": {
        "userId": 4,
        "requestId": -1,
        "RequestId": "eb6a8c28-c806-42e2-a349-5325702a1a96"
      },
      "result": {
        "blobKey": "AA588B7B3EC68D88A02501121A08499E4B41664820C0F8D12F4119D8C49C04C9",
        "available": false
      },
      "serviceProviders": {},
      "scheduled": false
    },
    {
      "jobId": "59B1C81ACFA3E55B9C60BCB6472DF271F3698CC0FFE154E76C7B27D5AD1934AF",
      "cost": 1.54375,
      "properties": {
        "userId": 4,
        "requestId": -1,
        "RequestId": "eb6a8c28-c806-42e2-a349-5325702a1a96"
      }
    }
  ]
}

civitai.jobs.cancel

Cancel a job by its jobId.

const response = await civitai.jobs.cancel(jobId);

This method cancels a job that is currently scheduled or running. It requires the jobId of the job you wish to cancel. On successful cancellation, it returns a response object indicating the cancellation status.

Example response:

{
  "status": 200,
}

civitai.models.get

To check the coverage of specific models, you can use the civitai.models.get method. This method retrieves the availability of the requested models.

const models = [
  "urn:air:sd1:checkpoint:civitai:107842@275408",
  "urn:air:sd1:lora:civitai:162141@182559",
];
const coverage = await civitai.models.get(models);
console.log("Model coverage: ", coverage);
{
  "urn:air:sd1:checkpoint:civitai:107842@275408": {
    "availability": "Unavailable",
    "workers": 0
  },
  "urn:air:sd1:lora:civitai:162141@182559": {
    "availability": "Available",
    "workers": 1
  }
}

Webhooks

Webhooks provide real-time updates about your generation. Specify an endpoint when you create a generation, and Civitai will send HTTP POST requests to that URL when the generation is completed.

Some scenarios where webhooks are useful:

  • Sending notifications when long-running generations finish. Some predictions like training jobs can take several minutes to run. You can use a webhook handler to send a notification like an email or a Slack message when a prediction completes.
  • Creating model pipelines. You can use webhooks to capture the output of one long-running prediction and pipe it into another model as input.

Note: Webhooks are handy, but they’re not strictly necessary to use Civitai SDK, and there are other ways to receive updates. You can also poll the generation API check the status of a generation over time.

Setting webhooks

To use webhooks, specify a webhook URL in the request body when creating a generation. Here’s an example using the Civitai JavaScript client:

await civitai.image.fromText({
  input: {
    model: "urn:air:sd1:checkpoint:civitai:4384@128713",
    params: {
      prompt: "a cat in a field of flowers",
      ...
    },
    webhook: "https://example.com/webhook",
  }
});

Receiving webhooks

Here’s an example of a Next.js webhook handler:

// app/api/webhook/route.ts
import { NextResponse } from "next/server";

export async function POST(req: Request) {
  try {
    const data = await req.json();

    if (data) {
      return NextResponse.json(
        {
          success: true,
          message: "Webhook received successfully",
          data,
        },
        { status: 200 }
      );
    } else {
      return new Response("Missing output", { status: 400 });
    }
  } catch (error) {
    console.error("Error handling webhook data:", error);
    return NextResponse.json(
      { error: "Internal Server Error", message: error },
      { status: 500 }
    );
  }
}

By default, Civitai sends requests to your webhook URL whenever there are new outputs or the generation has finished.

Your endpoint should respond with a 2xx status code within a few seconds, otherwise the webhook might be retried.

Testing your webhook code

When writing the code for your new webhook handler, it’s useful to be able to receive real webhooks in your development environment so you can verify your code is handling them as expected.

ngrok is a free reverse proxy tool that can create a secure tunnel to your local machine so you can receive webhooks. If you have Node.js installed, run ngrok directly from the command line using the npx command that’s included with Node.js.

npx ngrok http 3000

The command above will generate output that looks like this:

Session Status                online
Session Expires               1 hour, 59 minutes
Version                       2.3.41
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://3e48-20-171-41-18.ngrok.io -> http://localhost:3000
Forwarding                    https://3e48-20-171-41-18.ngrok.io -> http://localhost:3000

Here’s an example using the civitai JavaScript client:

await civitai.image.fromText({
  input: {
    model: "urn:air:sd1:checkpoint:civitai:4384@128713",
    params: {
      prompt: "a cat in a field of flowers",
      ...
    },
    webhook: "https://3e48-20-171-41-18.ngrok.io/api/webhooks",
  }
});

Your webhook handler should now receive webhooks from Civitai. Once you’ve deployed your app, change the value of the webhook URL to your production webhook handler endpoint when creating generations.

Examples

Build a web app with Next.js App Router

Contribution

Contributions to the Civitai Generator Node.js Client are welcome! Here's how you can contribute or build the project from source.

Prerequisites

  • Node.js (version specified in package.json under engines.node)
  • npm or yarn (version specified in package.json under engines.npm or engines.yarn)

Setting Up for Development

  1. Fork and clone the repository.
  2. Install dependencies:
npm install

Building from Source

To build the project from source:

npm run build

This will compile the TypeScript files and generate the necessary JavaScript files in the dist directory.

  1. Create a .env.test file in the root directory and add your Civitai API token, i.e., CIVITAI_API_TOKEN.

Running Tests

To ensure your changes don't break existing functionality, run the tests:

npm run test

Contributing Your Changes

After making your changes:

  1. Push your changes to your fork.
  2. Open a pull request against the main repository.
  3. Describe your changes and how they improve the project or fix issues.

Your contributions will be reviewed, and if accepted, merged into the project.

Additional Guidelines

  • Include unit tests for new features or bug fixes.
  • Update the documentation if necessary.

Thank you for contributing to the Civitai Generator Node.js Client! 🥹🤭