Full Code of bobvinch/comfy-server for AI

master 137cfdd59a16 cached
89 files
2.1 MB
554.3k tokens
222 symbols
1 requests
Download .txt
Showing preview only (2,228K chars total). Download the full file or copy to clipboard to get everything.
Repository: bobvinch/comfy-server
Branch: master
Commit: 137cfdd59a16
Files: 89
Total size: 2.1 MB

Directory structure:
gitextract_m15fhcc9/

├── .eslintrc.js
├── .gitignore
├── .prettierrc
├── .run/
│   └── Comfy-server.run.xml
├── Dockerfile
├── README.md
├── docker-compose.yml.example
├── init.sql
├── nest-cli.json
├── package.json
├── pm2.config.js
├── src/
│   ├── app.controller.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   ├── auth/
│   │   ├── auth.controller.ts
│   │   ├── auth.guard.ts
│   │   ├── auth.module.ts
│   │   ├── auth.service.ts
│   │   └── constants.ts
│   ├── cache/
│   │   ├── cache.controller.ts
│   │   ├── cache.module.ts
│   │   └── cache.service.ts
│   ├── draw/
│   │   ├── DrawCosumer.ts
│   │   ├── data/
│   │   │   ├── AImodel_api.json
│   │   │   ├── DrawConfig.ts
│   │   │   ├── aistudio_api.json
│   │   │   ├── api_matting.json
│   │   │   ├── api_removebg.json
│   │   │   ├── api_upscale.json
│   │   │   ├── api_upscale_detailfix.json
│   │   │   ├── api_wechat_img2imgi.json
│   │   │   ├── impaiting_api.json
│   │   │   ├── objectInfo.json
│   │   │   ├── test.json
│   │   │   ├── text2imgapi.json
│   │   │   ├── workflow_api_faceswap.ts
│   │   │   ├── workflow_api_hdfix_4.ts
│   │   │   ├── workflow_api_image2img.json
│   │   │   ├── workflow_api_image2img.ts
│   │   │   ├── workflow_api_img2video.json
│   │   │   ├── workflow_api_img2video.ts
│   │   │   ├── workflow_api_inpainting.json
│   │   │   ├── workflow_api_inpainting.ts
│   │   │   ├── workflow_api_matting.json
│   │   │   ├── workflow_api_matting.ts
│   │   │   ├── workflow_api_model.ts
│   │   │   ├── workflow_api_removebg.json
│   │   │   ├── workflow_api_removebg.ts
│   │   │   ├── workflow_api_tagger.ts
│   │   │   ├── workflow_api_text2img.json
│   │   │   └── workflow_api_text2img.ts
│   │   ├── draw.controller.ts
│   │   ├── draw.module.ts
│   │   └── draw.service.ts
│   ├── file/
│   │   ├── file.controller.ts
│   │   ├── file.module.ts
│   │   └── file.service.ts
│   ├── main.ts
│   ├── middleware/
│   │   └── XML.middleware.ts
│   ├── oneapi/
│   │   ├── tokens/
│   │   │   ├── dto/
│   │   │   │   ├── create-token.dto.ts
│   │   │   │   └── update-token.dto.ts
│   │   │   ├── entities/
│   │   │   │   └── token.entity.ts
│   │   │   ├── tokens.controller.ts
│   │   │   ├── tokens.module.ts
│   │   │   └── tokens.service.ts
│   │   └── users/
│   │       ├── dto/
│   │       │   ├── create-user.dto.ts
│   │       │   └── update-user.dto.ts
│   │       ├── entities/
│   │       │   └── user.entity.ts
│   │       ├── users.controller.ts
│   │       ├── users.module.ts
│   │       └── users.service.ts
│   ├── tweet/
│   │   ├── dto/
│   │   │   ├── create-tweet.dto.ts
│   │   │   └── update-tweet.dto.ts
│   │   ├── entities/
│   │   │   └── tweet.schema.ts
│   │   ├── tweet.controller.ts
│   │   ├── tweet.module.ts
│   │   └── tweet.service.ts
│   ├── users/
│   │   ├── dto/
│   │   │   ├── create-user.dto.ts
│   │   │   └── update-user.dto.ts
│   │   ├── schema/
│   │   │   └── user.schema.ts
│   │   ├── users.controller.ts
│   │   ├── users.module.ts
│   │   └── users.service.ts
│   ├── wechat-auth/
│   │   ├── wechat-auth.controller.ts
│   │   ├── wechat-auth.module.ts
│   │   └── wechat-auth.service.ts
│   └── ws/
│       └── ws.gateway.ts
├── tsconfig.build.json
└── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .eslintrc.js
================================================
module.exports = {
  parser: '@typescript-eslint/parser',
  parserOptions: {
    project: 'tsconfig.json',
    tsconfigRootDir: __dirname,
    sourceType: 'module',
  },
  plugins: ['@typescript-eslint/eslint-plugin'],
  extends: [
    'plugin:@typescript-eslint/recommended',
    'plugin:prettier/recommended',
  ],
  root: true,
  env: {
    node: true,
    jest: true,
  },
  ignorePatterns: ['.eslintrc.js'],
  rules: {
    '@typescript-eslint/interface-name-prefix': 'off',
    '@typescript-eslint/explicit-function-return-type': 'off',
    '@typescript-eslint/explicit-module-boundary-types': 'off',
    '@typescript-eslint/no-explicit-any': 'off',
    "prettier/prettier": ["error", { "endOfLine": "auto" }]
  },
};


================================================
FILE: .gitignore
================================================
# compiled output
/dist
/node_modules

# Logs
logs
*.log
npm-debug.log*
pnpm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*

# OS
.DS_Store

# Tests
/coverage
/.nyc_output

# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
#配置文件
docker-compose.yml
.env.development
.env.production

temp.png

================================================
FILE: .prettierrc
================================================
{
  "singleQuote": true,
  "trailingComma": "all",
  "endOfline":"auto"
}

================================================
FILE: .run/Comfy-server.run.xml
================================================
<component name="ProjectRunConfigurationManager">
  <configuration default="false" name="Comfy-server" type="docker-deploy" factoryName="docker-image" server-name="Docker">
    <deployment type="docker-image">
      <settings>
        <option name="imageTag" value="node20.12.1_runtime-stage:latest" />
        <option name="containerName" value="comfy-server" />
        <option name="envVars">
          <list>
            <DockerEnvVarImpl>
              <option name="name" value="CONFIG_COMFYUI_QUENE_REDIS_HOST" />
              <option name="value" value="172.17.0.4" />
            </DockerEnvVarImpl>
            <DockerEnvVarImpl>
              <option name="name" value="CONFIG_COMFYUI_QUENE_REDIS_PASSWORD" />
              <option name="value" value="" />
            </DockerEnvVarImpl>
            <DockerEnvVarImpl>
              <option name="name" value="CONFIG_COMFYUI_QUENE_REDIS_PORT" />
              <option name="value" value="6379" />
            </DockerEnvVarImpl>
            <DockerEnvVarImpl>
              <option name="name" value="CONFIG_COMFYUI_SERVER_URL" />
              <option name="value" value="http://172.17.0.0:8188" />
            </DockerEnvVarImpl>
            <DockerEnvVarImpl>
              <option name="name" value="CONFIG_DB_MONGO_PASSWORD" />
              <option name="value" value="password" />
            </DockerEnvVarImpl>
            <DockerEnvVarImpl>
              <option name="name" value="CONFIG_DB_MONGO_URI" />
              <option name="value" value="mongodb://172.17.0.3:27017" />
            </DockerEnvVarImpl>
            <DockerEnvVarImpl>
              <option name="name" value="CONFIG_DB_MONGO_USERNAME" />
              <option name="value" value="username" />
            </DockerEnvVarImpl>
            <DockerEnvVarImpl>
              <option name="name" value="ONEAPI_MYSQL_DATABASE" />
              <option name="value" value="oneapi" />
            </DockerEnvVarImpl>
            <DockerEnvVarImpl>
              <option name="name" value="ONEAPI_MYSQL_HOST" />
              <option name="value" value="172.17.0.2" />
            </DockerEnvVarImpl>
            <DockerEnvVarImpl>
              <option name="name" value="ONEAPI_MYSQL_PASSWORD" />
              <option name="value" value="wangbo123" />
            </DockerEnvVarImpl>
            <DockerEnvVarImpl>
              <option name="name" value="ONEAPI_MYSQL_USERNAME" />
              <option name="value" value="root" />
            </DockerEnvVarImpl>
          </list>
        </option>
      </settings>
    </deployment>
    <method v="2" />
  </configuration>
</component>

================================================
FILE: Dockerfile
================================================

# 第二阶段
FROM node:20.12.1 AS runtime-stage
#2、作者
MAINTAINER bobovinch
# 创建工作目录
RUN mkdir -p /app
WORKDIR /app

# 复制构建阶段生成的输出到运行时阶段
COPY  ./dist /app/dist
COPY  ./dist /app/dist
#COPY  ./node_modules /app/node_modules
COPY ./package.json /app/
COPY ./.env.* /app/
RUN npm install --force

# 设置环境变量
ENV NODE_ENV=production
ENV CONFIG_COMFYUI_QUENE_REDIS_HOST=172.17.0.4
ENV CONFIG_COMFYUI_QUENE_REDIS_PORT=6379
ENV CONFIG_COMFYUI_SERVER_URL=http://127.0.0.1:8188


# 暴露端口
EXPOSE 3001
EXPOSE 3002

# 设置入口点为启动脚本
ENTRYPOINT ["npm", "run", "start:prod"]



================================================
FILE: README.md
================================================
<p align="center">
  <a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="200" alt="Nest Logo" /></a>
</p>

[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
[circleci-url]: https://circleci.com/gh/nestjs/nest

  <p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
    <p align="center">
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a>
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a>
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
  <a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg"/></a>
    <a href="https://opencollective.com/nest#sponsor"  target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
  <a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow"></a>
</p>
  <!--[![Backers on Open Collective](https://opencollective.com/nest/backers/badge.svg)](https://opencollective.com/nest#backer)
  [![Sponsors on Open Collective](https://opencollective.com/nest/sponsors/badge.svg)](https://opencollective.com/nest#sponsor)-->

## Description
<p align="center">
  <img src="https://wangbo0808.oss-cn-shanghai.aliyuncs.com/assets/hear.png" width="100%" alt="function description" />
</p>
<p align="center">
  <img src="https://wangbo0808.oss-cn-shanghai.aliyuncs.com/assets/api%20descrption.png" width="100%" alt="function description" />
</p>
<p align="center">
  <img src="https://wangbo0808.oss-cn-shanghai.aliyuncs.com/assets/response.png" width="100%" alt="function description" />
</p>

## 开始使用前必读!!!!
开始使用前请先安装redis,并配置.env .end.development .env.production环境变量中密码,如果有的话,没有密码则将密码配置删除
然后检查环境变量中ComfyUI的http路径和websocket路径
## 功能介绍
<p>0502更新,修复Redis相关问题,增加容器一键部署方式</p>
<p>最新0411更新,重大更新,增加大量商业化能力,运营AI绘画商业网站必备后台服务器</p>
<p>核心功能1:ComfyUI的绘画API服务和websocket转发,客户端必须使用socketIO链接,WS无法连接,注意版本</p>
<p>核心功能2:方便将任意comfyui工作转换为在线API,向外提供AI能力</p>
<p>ComfyUI server之间可以共享AI绘画能力</p>
<p>天然支持利用nginx直接实现负载均衡</p>
<p>增加注册,登录,微信登录,鉴权,黑名单等常用运营功能</p>
<p>支持任务队列,支持API提交任务的时候指定队列</p>
<p>支持黑名单管理</p>
<p>一键接入微信公众号,并且支持利用别人的API接入微信绘画,支持多轮指令记忆,能够区分绘画指令和提示词</p>

## 如何使用
<p>☆推荐使用docker-compose一键部署</p>
<p>1.下载docker-compose.yml.example和init.sql两个文件到一个文件夹中</p>
<p>2.取消.example后缀,修改docker-compose.yml中环境变量,主要修改ComfyUI的服务器地址和端口</p>
<p>3.运行:docker-compose pull拉取镜像</p>
<p>4.拉取完成后,运行docker-compose up -d启动容器</p>
<p>5.打开127.0.0.3001/api-docs可以访问API地址和进行在线API调试</p>

开发部署方式
<p>1.先按照如下如下方式启动服务器</p>
<p>2.客户端通过socketIO链接服务器,默认为3002端口,如果冲突在src/ws/ws.gateway.ts中修改</p>
<p>3.以websocket消息形式提交,提交绘画任务,事件名称为draw,消息格式:{client_id:"userid", prompt:"comfyui API", api:"define a API name" }</p>
<p>4、使用微信公众号绘画功能需要配置APPID和Secret</p>
教程地址:https://www.bilibili.com/video/BV1AE42137Gn?t=40.6
## Installation

```bash
$ npm install
```

## Running the app

```bash
# development
$ npm run start

# watch mode
$ npm run start:dev

# production mode
$ npm run start:prod
```

## Test

```bash
# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov
```

## Support

Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).

## Stay in touch

- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com)
- Website - [https://nestjs.com](https://nestjs.com/)
- Twitter - [@nestframework](https://twitter.com/nestframework)

## License

Nest is [MIT licensed](LICENSE).


================================================
FILE: docker-compose.yml.example
================================================
# 非 host 版本, 不使用本机代理
# (不懂 Docker 的,只需要关心 OPENAI_BASE_URL 和 CHAT_API_KEY 即可!)
version: '3'
services:
  comfy-server:
    container_name: comfy-server
    #image: ghcr.io/labring/fastgpt:latest # git
    image: registry.cn-shanghai.aliyuncs.com/comfy-ai/comfy-server:latest # 阿里云
    ports:
      - "3001:3001"    #http端口
      - "3002:3002"    #websocket端口
    networks:
      comfyai:
        ipv4_address: 172.20.0.6
    depends_on:
      - mysql
      - mongo
      - redis
    restart: always
    environment:
      # 必须!!重要配置!!!- Comfy UI服务器地址,注意不能是127.0.0.1,容器内无法访问,查看网络获取
      - CONFIG_COMFYUI_SERVER_URL=http://192.168.0.107:8188
      #  必须配置,MongoDB配置,用户管理
      - CONFIG_DB_MONGO_URI=mongodb://172.20.0.3:27017
      - CONFIG_DB_MONGO_USERNAME=username
      - CONFIG_DB_MONGO_PASSWORD=password
      #  必须配置,Redis配置,队列缓存
      - CONFIG_COMFYUI_QUENE_REDIS_HOST=172.20.0.4
      - CONFIG_COMFYUI_QUENE_REDIS_PORT=6379
      - CONFIG_COMFYUI_QUENE_REDIS_PASSWORD=
      #必须配置,大模型ONEAPI数据库配置
      - ONEAPI_MYSQL_HOST=172.20.0.2
      - ONEAPI_MYSQL_USERNAME=root
      - ONEAPI_MYSQL_PASSWORD=test123
      - ONEAPI_MYSQL_DATABASE=oneapi
      #可选配置,微信开放平台,微信登录功能
      - CONFIG_AUTH_WECHAT_APPID=
      - CONFIG_AUTH_WECHAT_SECRET=
      #可选配置,公众号配置,实现公众号绘图配置这里
      - CONFIG_OFFICIAL_WECHAT_APPID=
      - CONFIG_OFFICIAL_WECHAT_SECRET=
      #可选配置,使用阿里云OSS存储绘画结果,OSS配置,如果需要将绘画的图片上传到阿里云oss,则配置这里
      - OSS_REGION=
      - OSS_ACCESSKEYID=
      - OSS_ACCESSKEYSECRET=
      - OSS_BUCKET=
      #SD3 key,使用SD3 需要配置
      - CONFIG_SD3_APIKEY=
      #可选配置,接别人的Comfy-server API
      - CONFIG_COMFYUI_SERVER_REMOTE_URL=
      - CONFIG_COMFUI_SERVER_REMOTE_AUTH_USERNAME=
      - CONFIG_COMFUI_SERVER_REMOTE_AUTH_PASSWORD=
  #  使用大预言模型的后端接口
  oneapi:
    image: justsong/one-api
    container_name: oneapi-mysql
    restart: always
    ports:
      - "3000:3000"
    networks:
      comfyai:
        ipv4_address: 172.20.0.5
    depends_on:
      - mysql
    environment:
      - SQL_DSN=root:test123@tcp(172.20.0.2:3306)/oneapi
      - TZ=Asia/Shanghai
  mongo:
    image: registry.cn-shanghai.aliyuncs.com/comfy-ai/mongo-aliyun:latest
    container_name: mongo
    restart: always
    # 生产环境建议不要暴露
    ports:
      - "27017:27017"
    networks:
      comfyai:
        ipv4_address: 172.20.0.3
    environment:
      # 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
      - MONGO_INITDB_ROOT_USERNAME=username
      - MONGO_INITDB_ROOT_PASSWORD=password
    volumes:
      - /usr/mongo/data:/data/db
  #  大预言模型数据库
  mysql:
    image: registry.cn-shanghai.aliyuncs.com/comfy-ai/mysql-aliyun:latest
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    networks:
      comfyai:
        ipv4_address: 172.20.0.2
    environment:
      - MYSQL_ROOT_PASSWORD=test123
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      - /usr/mysql/log:/var/log/mysql
      - /usr/mysql/data:/var/lib/mysql
      - /usr/mysql/conf:/etc/mysql/conf.d
  #    command: bash -c "mysqld --init-file=/docker-entrypoint-initdb.d/init.sql"
  redis:
    image: redis:latest
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    networks:
      comfyai:
        ipv4_address: 172.20.0.4
networks:
  comfyai:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16
          gateway: 172.20.0.1




================================================
FILE: init.sql
================================================
CREATE DATABASE oneapi;

================================================
FILE: nest-cli.json
================================================
{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "deleteOutDir": true
  }
}


================================================
FILE: package.json
================================================
{
  "name": "myserver",
  "version": "0.0.1",
  "description": "<p align=\"center\">\r   <a href=\"http://nestjs.com/\" target=\"blank\"><img src=\"https://nestjs.com/img/logo-small.svg\" width=\"200\" alt=\"Nest Logo\" /></a>\r </p>",
  "author": "",
  "private": true,
  "license": "UNLICENSED",
  "scripts": {
    "build": "cross-env NODE_ENV=production nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "cross-env NODE_ENV=production nest start",
    "start:dev": "cross-env NODE_ENV=development nest start --watch",
    "start:debug": "cross-env NODE_ENV=development nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json"
  },
  "dependencies": {
    "@nestjs-modules/ioredis": "^2.0.2",
    "@nestjs/bull": "^10.0.1",
    "@nestjs/common": "^10.3.6",
    "@nestjs/config": "^3.2.0",
    "@nestjs/core": "^10.3.6",
    "@nestjs/jwt": "^10.2.0",
    "@nestjs/mapped-types": "*",
    "@nestjs/mongoose": "^10.0.4",
    "@nestjs/platform-express": "^10.0.0",
    "@nestjs/platform-socket.io": "^10.3.1",
    "@nestjs/schedule": "^4.0.1",
    "@nestjs/swagger": "^7.3.0",
    "@nestjs/typeorm": "^10.0.2",
    "@nestjs/websockets": "^10.3.1",
    "@types/ali-oss": "^6.16.11",
    "@types/socket.io": "^3.0.2",
    "@types/socket.io-client": "^3.0.0",
    "ali-oss": "^6.20.0",
    "axios": "^1.6.7",
    "bcrypt": "^5.1.1",
    "bull": "^4.12.2",
    "cross-env": "^7.0.3",
    "fast-xml-parser": "^4.3.6",
    "ioredis": "^5.4.1",
    "mongoose": "^8.1.3",
    "mysql2": "^3.9.1",
    "nanoid": "^3.0.0",
    "reflect-metadata": "^0.1.13",
    "rxjs": "^7.8.1",
    "socket.io": "^4.7.4",
    "socket.io-client": "^4.7.4",
    "typeorm": "^0.3.20",
    "ws": "^8.16.0",
    "xml2js": "^0.6.2",
    "xmlbuilder2": "^3.1.1"
  },
  "devDependencies": {
    "@nestjs/cli": "^10.0.0",
    "@nestjs/schematics": "^10.0.0",
    "@nestjs/testing": "^10.0.0",
    "@types/bcrypt": "^5.0.2",
    "@types/bull": "^4.10.0",
    "@types/express": "^4.17.21",
    "@types/jest": "^29.5.2",
    "@types/node": "^20.3.1",
    "@types/supertest": "^6.0.0",
    "@types/ws": "^8.5.10",
    "@typescript-eslint/eslint-plugin": "^6.0.0",
    "@typescript-eslint/parser": "^6.0.0",
    "eslint": "^8.42.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-plugin-prettier": "^5.0.0",
    "jest": "^29.5.0",
    "prettier": "^3.0.0",
    "source-map-support": "^0.5.21",
    "supertest": "^6.3.3",
    "ts-jest": "^29.1.0",
    "ts-loader": "^9.4.3",
    "ts-node": "^10.9.1",
    "tsconfig-paths": "^4.2.0",
    "typescript": "^5.1.3"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  },
  "main": ".eslintrc.js"
}


================================================
FILE: pm2.config.js
================================================
/**
 * this is a pm2 starter config file
 * @type {{apps: [{watch: boolean, name: string, env: {NODE_ENV: string}, script: string}]}}
 */
module.exports = {
  apps: [
    {
      name: 'comfy-server',
      script: './dist/main.js',
      watch: true,
      env: {
        NODE_ENV: 'production',
      },
    },
  ],
};


================================================
FILE: src/app.controller.ts
================================================
import { Controller, Get, Inject } from '@nestjs/common';
import { AppService } from './app.service';
import { DrawService } from './draw/draw.service';

@Controller()
export class AppController {
  constructor(
    private readonly appService: AppService,
    private readonly drawService: DrawService,
  ) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
  @Get('test')
  test(): string {
    return process.env.REDIS_HOST;
  }
}


================================================
FILE: src/app.module.ts
================================================
import {
  MiddlewareConsumer,
  Module,
  NestModule,
  RequestMethod,
} from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { WsGateway } from './ws/ws.gateway';
import { DrawConsumer } from './draw/DrawCosumer';
import { ConfigModule } from '@nestjs/config';

//链接mongodb
import { MongooseModule } from '@nestjs/mongoose';

//链接mysql
import { TypeOrmModule } from '@nestjs/typeorm';
import { OneAPIUsersModule } from 'src/oneapi/users/users.module';
import { TokensModule } from './oneapi/tokens/tokens.module';
import { ConfigService } from '@nestjs/config/dist';

//定时任务

import { WechatAuthModule } from './wechat-auth/wechat-auth.module';
import { XMLMiddleware } from './middleware/XML.middleware';
import { DrawModule } from './draw/draw.module';
import { UsersModule } from './users/users.module';
import { AuthModule } from './auth/auth.module';
import { CacheModule } from './cache/cache.module';
import { FileModule } from './file/file.module';
import { TweetModule } from './tweet/tweet.module';

//'mongodb://username:password@localhost:27017/nest'
@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: [`.env.${process.env.NODE_ENV}`],
    }),
    //OneAPI数据库,如果不启动ONEAPI的大模型,删除此处的模块引入和oneapi模块
    TypeOrmModule.forRootAsync({
      useFactory: (config: ConfigService) => ({
        type: 'mysql',
        host: config.get('ONEAPI_MYSQL_HOST'),
        port: config.get('ONEAPI_MYSQL_PORT'),
        username: config.get('ONEAPI_MYSQL_USERNAME'),
        password: config.get('ONEAPI_MYSQL_PASSWORD'),
        database: config.get('ONEAPI_MYSQL_DATABASE'),
        // entities: [User],
        autoLoadEntities: true,
        synchronize: false, //是否同步,正式环境设置为false
      }),
      inject: [ConfigService],
    }),
    MongooseModule.forRootAsync({
      useFactory: (config: ConfigService) => ({
        uri: config.get('CONFIG_DB_MONGO_URI'),
        user: config.get('CONFIG_DB_MONGO_USERNAME'),
        pass: config.get('CONFIG_DB_MONGO_PASSWORD'),
        dbName: 'aidraw',
      }),
      inject: [ConfigService],
    }),
    WechatAuthModule,
    OneAPIUsersModule,
    TokensModule,
    DrawModule,
    ConfigModule,
    UsersModule,
    AuthModule,
    CacheModule,
    FileModule,
    TweetModule,
  ],
  controllers: [AppController],
  providers: [AppService, WsGateway, DrawConsumer],
})
/**
 * 注册中间件,微信消息处理中间件
 */
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(XMLMiddleware).forRoutes({
      path: 'wechatauth/handleMessage',
      method: RequestMethod.POST,
    });
  }
}


================================================
FILE: src/app.service.ts
================================================
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  // 是否启用保存绘画历史记录
  public Draw_SaveHistory = false;
  getHello(): string {
    return 'Welcome to my comfyui server'.toUpperCase();
  }
}


================================================
FILE: src/auth/auth.controller.ts
================================================
import { AuthService } from './auth.service';
import {
  Get,
  Query,
  Body,
  Controller,
  Post,
  HttpCode,
  HttpStatus,
} from '@nestjs/common';
import { ApiOperation } from '@nestjs/swagger';

@Controller('auth')
export class AuthController {
  constructor(private authService: AuthService) {}
  @ApiOperation({
    summary: '鉴权',
    description: 'Sign in with username and password,returning a token',
    parameters: [
      {
        name: 'username',
        in: 'query',
        required: true,
        description: 'username',
        schema: {
          type: 'string',
        },
      },
      {
        name: 'password',
        in: 'query',
        required: true,
        description: 'password',
        schema: {
          type: 'string',
        },
      },
    ],
  })
  @HttpCode(HttpStatus.OK)
  @Get('signin')
  signIn(
    @Query('username') username: string,
    @Query('password') password: string,
  ) {
    return this.authService.authToken(username, password);
  }
}


================================================
FILE: src/auth/auth.guard.ts
================================================
import {
  CanActivate,
  ExecutionContext,
  Injectable,
  UnauthorizedException,
} from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { jwtConstants } from './constants';
import { Request } from 'express';

/**
 * 🔒 This guard is used to protect routes that require authentication.
 * It will check if the user is authenticated and if so, it will attach the user's payload to the request object.
 * If the user is not authenticated, it will throw an UnauthorizedException.
 *
 */
@Injectable()
export class AuthGuard implements CanActivate {
  constructor(private jwtService: JwtService) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();
    const token = this.extractTokenFromHeader(request);
    if (!token) {
      throw new UnauthorizedException();
    }
    try {
      // 💡 We're assigning the payload to the request object here
      // so that we can access it in our route handlers
      request['user'] = await this.jwtService.verifyAsync(token, {
        secret: jwtConstants.secret,
      });
    } catch {
      throw new UnauthorizedException();
    }
    return true;
  }

  private extractTokenFromHeader(request: Request): string | undefined {
    const [type, token] = request.headers.authorization?.split(' ') ?? [];
    return type === 'Bearer' ? token : undefined;
  }
}


================================================
FILE: src/auth/auth.module.ts
================================================
import { Module } from '@nestjs/common';
import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';
import { UsersModule } from '../users/users.module';
import { JwtModule } from '@nestjs/jwt';
import { jwtConstants } from './constants';

@Module({
  imports: [
    UsersModule,
    JwtModule.register({
      global: true,
      secret: jwtConstants.secret,
      signOptions: { expiresIn: '300s' },
    }),
  ],
  controllers: [AuthController],
  providers: [AuthService],
  exports: [AuthService],
})
export class AuthModule {}


================================================
FILE: src/auth/auth.service.ts
================================================
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { UsersService } from '../users/users.service';
import { JwtService } from '@nestjs/jwt';

@Injectable()
export class AuthService {
  constructor(
    private usersService: UsersService,
    private jwtService: JwtService,
  ) {}

  async authToken(username: string, pass: string): Promise<any> {
    const user = await this.usersService.findByUsername(username);
    if (
      !user ||
      !(await this.usersService.comparePassword(pass, user?.password))
    ) {
      throw new UnauthorizedException();
    }
    return {
      access_token: await this.usersService.createToken(
        user._id + '',
        user.username,
      ),
    };
  }
}


================================================
FILE: src/auth/constants.ts
================================================
export const jwtConstants = {
  secret: 'this is a very secret secret',
};


================================================
FILE: src/cache/cache.controller.ts
================================================
import { Controller } from '@nestjs/common';
import { CacheService } from './cache.service';

@Controller('cache')
export class CacheController {
  constructor(private readonly cacheService: CacheService) {}
}


================================================
FILE: src/cache/cache.module.ts
================================================
import { Module, Global } from '@nestjs/common';
import { CacheService } from './cache.service';
import { CacheController } from './cache.controller';
import { ConfigService } from '@nestjs/config';
import { RedisModule } from '@nestjs-modules/ioredis';
@Global()
@Module({
  imports: [
    RedisModule.forRootAsync({
      useFactory: (config: ConfigService) => ({
        type: 'single',
        url: `redis://${config.get('CONFIG_COMFYUI_QUENE_REDIS_HOST')}:${config.get('CONFIG_COMFYUI_QUENE_REDIS_PORT')}`,
        options: {
          password: config.get('CONFIG_COMFYUI_QUENE_REDIS_PASSWORD'),
        },
      }),
      inject: [ConfigService],
    }),
  ],
  providers: [CacheService],
  exports: [CacheService],
})
export class CacheModule {}


================================================
FILE: src/cache/cache.service.ts
================================================
import { Injectable } from '@nestjs/common';
import Redis from 'ioredis';
import { ConfigService } from '@nestjs/config';
import { InjectRedis } from '@nestjs-modules/ioredis';
@Injectable()
export class CacheService {
  // private redisClient: Redis;
  constructor(
    private readonly configService: ConfigService,
    @InjectRedis() private readonly redis: Redis,
    // private readonly redisService: RedisService,
  ) {
    console.log('环境变量', this.configService);
    // this.redisClient = this.redisService.getClient();
  }
  async root(): Promise<boolean> {
    // this.redisClient = await this.redisService.getClient();
    return true;
  }
  //获取值
  async get(key: string): Promise<any> {
    let value = await this.redis.get(key);
    try {
      value = JSON.parse(value);
    } catch (error) {}
    return value;
  }
  /**
   * 设置值
   * @param key {string} key
   * @param value 值
   * @param second 过期时间 秒
   * @returns Promise<any>
   */
  async set(key: string, value: any, second?: number) {
    value = JSON.stringify(value);
    return this.redis.set(key, value);
  }
  //删除值
  async del(key: string) {
    return this.redis.del(key);
  }
  //清除缓存
  async flushall() {
    return this.redis.flushall();
  }
}


================================================
FILE: src/draw/DrawCosumer.ts
================================================
import {
  Process,
  Processor,
  OnQueueActive,
  OnQueueCompleted,
} from '@nestjs/bull';
import { Job } from 'bull';
import { WsGateway } from 'src/ws/ws.gateway';
import { Logger } from '@nestjs/common';
import { DrawService } from './draw.service';
import { WechatAuthService } from '../wechat-auth/wechat-auth.service';
import { AppService } from '../app.service';
import Websocket = require('ws');

@Processor('draw')
export class DrawConsumer {
  constructor(
    private readonly drawService: DrawService,
    private readonly wechatauthService: WechatAuthService,
    private readonly appSevice: AppService,
  ) {}

  private readonly logger = new Logger(DrawConsumer.name);
  private readonly clientId = 'admin9527'; //id可以随意
  public ws_client: Websocket;

  @Process('drawtask')
  async drawtask(job: Job): Promise<string> {
    // const output = await this.testTask(); //测试
    // 绘画任务
    const output = await this.drawTaskExcu(job, this.drawService.local_comfyui);
    // this.logger.debug(`任务完成,${job.id}`);
    //广播给所有人排队情况
    const message = {
      type: 'receive',
      queue_remaining: await this.drawService.getQueueLength(),
    };
    WsGateway.server.emit('message', JSON.stringify(message));
    return output + '';
  }

  /**
   *
   * @param job
   * @param server_url
   */
  async drawTaskExcu(job: Job, server_url: string) {
    return new Promise(async (resolve, reject) => {
      //client_id为用户id
      // this.logger.debug(
      //   `初始化websocket链接的结构${await this.websocketInit()}`,
      // );
      if (!(await this.websocketInit(server_url))) {
        reject({ status: 'error', data: job.data });
        return;
      }
      const {
        data: { source, client_id, prompt, socket_id, api },
      } = job;
      const params = {
        client_id: this.clientId, //固定值
        prompt: prompt,
      };
      const response = await this.drawService.sendTackprompt(
        server_url,
        params,
      );
      this.logger.debug(`发送绘画任务后的响应${response}`);
      if (response) {
        //将获取到的任务id保存到data中 方便后续在websocket失效的情况下也能取回绘画结果
        job.data.prompt_id = response;
        //将数据重新存给job
        await job.update(job.data);
        //监听服务器消息
        this.logger.debug(`发送绘画任务成功`);
        this.ws_client.onmessage = async (event: any) => {
          //转发
          this.logger.debug(event.data);
          //如果存在并且socket处于连接状态
          const target_socket =
            WsGateway.server.sockets?.sockets?.get(socket_id);
          if (target_socket) {
            this.logger.debug(`发送给${socket_id},${event.data}`);
            target_socket.emit('message', event.data);
          }
          try {
            const { type, data } = JSON.parse(event.data + '');
            if (type === 'execution_error') {
              reject({ status: 'error', data: job.data });
            }
            if (type === 'executed') {
              //如果API是反推提示词输出文本结果
              if (api === '图片反推提示词') {
                const {
                  output: { tags },
                } = data;
                resolve(tags[0]);
              }
              // 解析视频
              const {
                data: {
                  output: { gifs },
                },
              } = JSON.parse(event.data + '');
              if (gifs && gifs[0]?.filename.includes('final')) {
                let videoUrl = '';
                //如果是微信消息
                const { filename, subfolder, type } = gifs[0];
                if (subfolder) {
                  videoUrl = `${server_url}/view?subfolder=${subfolder}&filename=${filename}&type=${type}`;
                } else {
                  videoUrl = `${server_url}/view?filename=${filename}&type=${type}`;
                }
                // 微信公众号回复
                if (source === 'wechat') {
                  const mediaId =
                    await this.wechatauthService.getMediaId(videoUrl);
                  await this.wechatauthService.sendServiceImageMessge(
                    mediaId,
                    client_id,
                  );
                }
                resolve(videoUrl);
              }

              // 解析图片
              const {
                data: {
                  output: { images },
                },
              } = JSON.parse(event.data + '');
              if (images && images[0]?.filename.includes('final')) {
                let imageUrl = '';
                //如果是微信消息
                const { filename, subfolder, type } = images[0];

                if (subfolder) {
                  imageUrl = `${server_url}/view?subfolder=${subfolder}&filename=${filename}&type=${type}`;
                } else {
                  imageUrl = `${server_url}/view?filename=${filename}&type=${type}`;
                }
                // 微信公众号回复
                // if (source === 'wechat') {
                //   const mediaId =
                //     await this.wechatauthService.getMediaId(imageUrl);
                //   await this.wechatauthService.sendServiceImageMessge(
                //     mediaId,
                //     client_id,
                //   );
                // }
                resolve(imageUrl);
              }
              //保存到数据库
              if (this.appSevice.Draw_SaveHistory) {
                //   todo 保存到数据库
              }
            }
          } catch (e) {
            this.logger.error(e);
          }
        };
      } else {
        reject({ status: 'error', data: job.data });
      }
    });
  }

  /**
   * 初始化与绘画服务端的链接
   */
  async websocketInit(server_url: string): Promise<boolean> {
    return new Promise(async (resolve) => {
      if (!this.validateWsconnect()) {
        const url = server_url.split('//')[1];
        this.ws_client = new Websocket(
          `${server_url.includes('https') ? 'wss' : 'ws'}://${url}/ws?clientId=${this.clientId}`,
        );
        this.ws_client.onopen = () => {
          this.logger.debug(
            '链接绘画服务器成功,链接状态:',
            this.ws_client.readyState,
          );
          resolve(true);
        };
        this.ws_client.onerror = () => {
          this.logger.error('链接绘画服务器失败');
          resolve(false);
        };
        setTimeout(() => {
          if (this.ws_client.readyState !== 1) {
            this.logger.error('链接绘画服务器超时');
            resolve(false);
          }
        }, 500);
      } else {
        resolve(true);
      }
    });
  }

  /**
   * 验证链接状态
   */
  validateWsconnect() {
    if (this.ws_client === undefined || this.ws_client.readyState !== 1) {
      this.logger.error('链接不存在,尝试重新连接');
      return false;
    } else {
      return true;
    }
  }

  @OnQueueActive()
  async onActive(job: Job) {
    const remain = await this.drawService.getQueueLength();
    //广播队列任务信息
    WsGateway.server.sockets?.emit('remain', {
      remain,
    });
    this.logger.debug(
      `onActive job ${job.id} of type ${job.name} with data ${job.data}...队列::`,
      remain,
    );
  }

  @OnQueueCompleted()
  OnQueueCompleted(job: Job) {
    console.log(
      `Processing job ${job.id} of type ${job.name} with data ${job.returnvalue}...finished`,
    );
  }

  private async testTask() {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve('ok');
      }, 10000);
    });
  }
}


================================================
FILE: src/draw/data/AImodel_api.json
================================================
{
  "42": {
    "inputs": {
      "upscale_method": "nearest-exact",
      "scale_by": 1,
      "image": [
        "170",
        0
      ]
    },
    "class_type": "ImageScaleBy"
  },
  "54": {
    "inputs": {
      "cloth_type": "None",
      "return_form": "mask",
      "image": [
        "42",
        0
      ]
    },
    "class_type": "ALY_Seg_Cloth"
  },
  "62": {
    "inputs": {
      "mask": [
        "115",
        0
      ]
    },
    "class_type": "InvertMask"
  },
  "63": {
    "inputs": {
      "samples": [
        "64",
        0
      ],
      "mask": [
        "62",
        0
      ]
    },
    "class_type": "SetLatentNoiseMask"
  },
  "64": {
    "inputs": {
      "pixels": [
        "42",
        0
      ],
      "vae": [
        "143",
        4
      ]
    },
    "class_type": "VAEEncode"
  },
  "74": {
    "inputs": {
      "channel": "red",
      "image": [
        "54",
        1
      ]
    },
    "class_type": "ImageToMask"
  },
  "87": {
    "inputs": {
      "text": "(吊带:1.5)"
    },
    "class_type": "Text Multiline"
  },
  "88": {
    "inputs": {
      "from_translate": "auto",
      "to_translate": "english",
      "add_proxies": "disable",
      "proxies": "",
      "auth_data": "",
      "service": "GoogleTranslator",
      "text": [
        "87",
        0
      ],
      "Show proxy": "proxy_hide",
      "Show authorization": "authorization_hide"
    },
    "class_type": "DeepTranslatorTextNode"
  },
  "95": {
    "inputs": {
      "delimiter": ",",
      "clean_whitespace": "true",
      "text_a": [
        "88",
        0
      ],
      "text_b": [
        "96",
        0
      ]
    },
    "class_type": "Text Concatenate"
  },
  "96": {
    "inputs": {
      "text": "NSFW,lowrs,blurry,deformed, distorted, disfigured:1.3, stacked torsos:1.2, totem pole:1.1, poorly drawn, bad anatomy, wrong anatomy, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck,extra limb, missing limb, floating limbs, mutated hands and fingers:1.4, disconnected limbs, mutation, mutated, ugly, disgusting, blurry, amputation, extra fingers:1.2, worst quality, low quality:1.3out of frame, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, mutation, deformed, blurry, dehydrated, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs"
    },
    "class_type": "Text Multiline"
  },
  "115": {
    "inputs": {
      "expand": 1,
      "tapered_corners": false,
      "mask": [
        "74",
        0
      ]
    },
    "class_type": "GrowMask"
  },
  "122": {
    "inputs": {
      "x": 0,
      "y": 0,
      "resize_source": false,
      "destination": [
        "128",
        0
      ],
      "source": [
        "42",
        0
      ],
      "mask": [
        "74",
        0
      ]
    },
    "class_type": "ImageCompositeMasked"
  },
  "127": {
    "inputs": {
      "value": [
        "42",
        0
      ]
    },
    "class_type": "ImpactImageInfo"
  },
  "128": {
    "inputs": {
      "width": [
        "127",
        2
      ],
      "height": [
        "127",
        1
      ],
      "red": 255,
      "green": 255,
      "blue": 255
    },
    "class_type": "Image Blank"
  },
  "129": {
    "inputs": {
      "filename_prefix": "aimodel_mask",
      "images": [
        "122",
        0
      ]
    },
    "class_type": "SaveImage"
  },
  "130": {
    "inputs": {
      "guide_size": 256,
      "guide_size_for": true,
      "max_size": 768,
      "seed": 255582749293796,
      "steps": 5,
      "cfg": 1.5,
      "sampler_name": "lcm",
      "scheduler": "sgm_uniform",
      "denoise": 0.5,
      "feather": 5,
      "noise_mask": true,
      "force_inpaint": true,
      "bbox_threshold": 0.5,
      "bbox_dilation": 10,
      "bbox_crop_factor": 3,
      "sam_detection_hint": "center-1",
      "sam_dilation": 0,
      "sam_threshold": 0.93,
      "sam_bbox_expansion": 0,
      "sam_mask_hint_threshold": 0.7,
      "sam_mask_hint_use_negative": "False",
      "drop_size": 10,
      "wildcard": "",
      "cycle": 1,
      "image": [
        "142",
        5
      ],
      "model": [
        "142",
        0
      ],
      "clip": [
        "143",
        5
      ],
      "vae": [
        "142",
        4
      ],
      "positive": [
        "142",
        1
      ],
      "negative": [
        "142",
        2
      ],
      "bbox_detector": [
        "138",
        0
      ]
    },
    "class_type": "FaceDetailer"
  },
  "138": {
    "inputs": {
      "model_name": "bbox/face_yolov8m.pt"
    },
    "class_type": "UltralyticsDetectorProvider"
  },
  "142": {
    "inputs": {
      "seed": 255582749293796,
      "steps": 5,
      "cfg": 1.5,
      "sampler_name": "lcm",
      "scheduler": "sgm_uniform",
      "denoise": 1,
      "preview_method": "none",
      "vae_decode": "true",
      "model": [
        "143",
        0
      ],
      "positive": [
        "143",
        1
      ],
      "negative": [
        "143",
        2
      ],
      "latent_image": [
        "63",
        0
      ],
      "optional_vae": [
        "143",
        4
      ]
    },
    "class_type": "KSampler (Efficient)"
  },
  "143": {
    "inputs": {
      "ckpt_name": "极氪写实MAX-极氪白系列模型_V6.safetensors",
      "vae_name": "Baked VAE",
      "clip_skip": -2,
      "lora_name": "None",
      "lora_model_strength": 1,
      "lora_clip_strength": 1,
      "positive": [
        "159",
        0
      ],
      "negative": [
        "95",
        0
      ],
      "token_normalization": "none",
      "weight_interpretation": "A1111",
      "empty_latent_width": 512,
      "empty_latent_height": 512,
      "batch_size": 1,
      "lora_stack": [
        "147",
        0
      ],
      "cnet_stack": [
        "153",
        0
      ]
    },
    "class_type": "Efficient Loader"
  },
  "147": {
    "inputs": {
      "input_mode": "simple",
      "lora_count": 3,
      "lora_name_1": "lcm\\lcm_sd1.5_pytorch_lora_weights.safetensors",
      "lora_wt_1": 1,
      "model_str_1": 1,
      "clip_str_1": 1,
      "lora_name_2": "None",
      "lora_wt_2": 1,
      "model_str_2": 1,
      "clip_str_2": 1,
      "lora_name_3": "None",
      "lora_wt_3": 1,
      "model_str_3": 1,
      "clip_str_3": 1,
      "lora_name_4": "None",
      "lora_wt_4": 1,
      "model_str_4": 1,
      "clip_str_4": 1,
      "lora_name_5": "None",
      "lora_wt_5": 1,
      "model_str_5": 1,
      "clip_str_5": 1,
      "lora_name_6": "None",
      "lora_wt_6": 1,
      "model_str_6": 1,
      "clip_str_6": 1,
      "lora_name_7": "None",
      "lora_wt_7": 1,
      "model_str_7": 1,
      "clip_str_7": 1,
      "lora_name_8": "None",
      "lora_wt_8": 1,
      "model_str_8": 1,
      "clip_str_8": 1,
      "lora_name_9": "None",
      "lora_wt_9": 1,
      "model_str_9": 1,
      "clip_str_9": 1,
      "lora_name_10": "None",
      "lora_wt_10": 1,
      "model_str_10": 1,
      "clip_str_10": 1,
      "lora_name_11": "None",
      "lora_wt_11": 1,
      "model_str_11": 1,
      "clip_str_11": 1,
      "lora_name_12": "None",
      "lora_wt_12": 1,
      "model_str_12": 1,
      "clip_str_12": 1,
      "lora_name_13": "None",
      "lora_wt_13": 1,
      "model_str_13": 1,
      "clip_str_13": 1,
      "lora_name_14": "None",
      "lora_wt_14": 1,
      "model_str_14": 1,
      "clip_str_14": 1,
      "lora_name_15": "None",
      "lora_wt_15": 1,
      "model_str_15": 1,
      "clip_str_15": 1,
      "lora_name_16": "None",
      "lora_wt_16": 1,
      "model_str_16": 1,
      "clip_str_16": 1,
      "lora_name_17": "None",
      "lora_wt_17": 1,
      "model_str_17": 1,
      "clip_str_17": 1,
      "lora_name_18": "None",
      "lora_wt_18": 1,
      "model_str_18": 1,
      "clip_str_18": 1,
      "lora_name_19": "None",
      "lora_wt_19": 1,
      "model_str_19": 1,
      "clip_str_19": 1,
      "lora_name_20": "None",
      "lora_wt_20": 1,
      "model_str_20": 1,
      "clip_str_20": 1,
      "lora_name_21": "None",
      "lora_wt_21": 1,
      "model_str_21": 1,
      "clip_str_21": 1,
      "lora_name_22": "None",
      "lora_wt_22": 1,
      "model_str_22": 1,
      "clip_str_22": 1,
      "lora_name_23": "None",
      "lora_wt_23": 1,
      "model_str_23": 1,
      "clip_str_23": 1,
      "lora_name_24": "None",
      "lora_wt_24": 1,
      "model_str_24": 1,
      "clip_str_24": 1,
      "lora_name_25": "None",
      "lora_wt_25": 1,
      "model_str_25": 1,
      "clip_str_25": 1,
      "lora_name_26": "None",
      "lora_wt_26": 1,
      "model_str_26": 1,
      "clip_str_26": 1,
      "lora_name_27": "None",
      "lora_wt_27": 1,
      "model_str_27": 1,
      "clip_str_27": 1,
      "lora_name_28": "None",
      "lora_wt_28": 1,
      "model_str_28": 1,
      "clip_str_28": 1,
      "lora_name_29": "None",
      "lora_wt_29": 1,
      "model_str_29": 1,
      "clip_str_29": 1,
      "lora_name_30": "None",
      "lora_wt_30": 1,
      "model_str_30": 1,
      "clip_str_30": 1,
      "lora_name_31": "None",
      "lora_wt_31": 1,
      "model_str_31": 1,
      "clip_str_31": 1,
      "lora_name_32": "None",
      "lora_wt_32": 1,
      "model_str_32": 1,
      "clip_str_32": 1,
      "lora_name_33": "None",
      "lora_wt_33": 1,
      "model_str_33": 1,
      "clip_str_33": 1,
      "lora_name_34": "None",
      "lora_wt_34": 1,
      "model_str_34": 1,
      "clip_str_34": 1,
      "lora_name_35": "None",
      "lora_wt_35": 1,
      "model_str_35": 1,
      "clip_str_35": 1,
      "lora_name_36": "None",
      "lora_wt_36": 1,
      "model_str_36": 1,
      "clip_str_36": 1,
      "lora_name_37": "None",
      "lora_wt_37": 1,
      "model_str_37": 1,
      "clip_str_37": 1,
      "lora_name_38": "None",
      "lora_wt_38": 1,
      "model_str_38": 1,
      "clip_str_38": 1,
      "lora_name_39": "None",
      "lora_wt_39": 1,
      "model_str_39": 1,
      "clip_str_39": 1,
      "lora_name_40": "None",
      "lora_wt_40": 1,
      "model_str_40": 1,
      "clip_str_40": 1,
      "lora_name_41": "None",
      "lora_wt_41": 1,
      "model_str_41": 1,
      "clip_str_41": 1,
      "lora_name_42": "None",
      "lora_wt_42": 1,
      "model_str_42": 1,
      "clip_str_42": 1,
      "lora_name_43": "None",
      "lora_wt_43": 1,
      "model_str_43": 1,
      "clip_str_43": 1,
      "lora_name_44": "None",
      "lora_wt_44": 1,
      "model_str_44": 1,
      "clip_str_44": 1,
      "lora_name_45": "None",
      "lora_wt_45": 1,
      "model_str_45": 1,
      "clip_str_45": 1,
      "lora_name_46": "None",
      "lora_wt_46": 1,
      "model_str_46": 1,
      "clip_str_46": 1,
      "lora_name_47": "None",
      "lora_wt_47": 1,
      "model_str_47": 1,
      "clip_str_47": 1,
      "lora_name_48": "None",
      "lora_wt_48": 1,
      "model_str_48": 1,
      "clip_str_48": 1,
      "lora_name_49": "None",
      "lora_wt_49": 1,
      "model_str_49": 1,
      "clip_str_49": 1
    },
    "class_type": "LoRA Stacker"
  },
  "153": {
    "inputs": {
      "switch_1": "On",
      "controlnet_1": "control_v11p_sd15_openpose.pth",
      "controlnet_strength_1": 1,
      "start_percent_1": 0,
      "end_percent_1": 1,
      "switch_2": "Off",
      "controlnet_2": "None",
      "controlnet_strength_2": 1,
      "start_percent_2": 0,
      "end_percent_2": 1,
      "switch_3": "Off",
      "controlnet_3": "None",
      "controlnet_strength_3": 1,
      "start_percent_3": 0,
      "end_percent_3": 1,
      "image_1": [
        "166",
        0
      ]
    },
    "class_type": "CR Multi-ControlNet Stack"
  },
  "159": {
    "inputs": {
      "from_translate": "auto",
      "to_translate": "english",
      "add_proxies": "disable",
      "proxies": "",
      "auth_data": "",
      "service": "GoogleTranslator",
      "text": "一个女孩,正面视角,灰色背景,光着肩膀,光着腿,坐在凳子上,室内场景,露腰",
      "Show proxy": "proxy_hide",
      "Show authorization": "authorization_hide"
    },
    "class_type": "DeepTranslatorTextNode"
  },
  "166": {
    "inputs": {
      "detect_hand": "enable",
      "detect_body": "enable",
      "detect_face": "enable",
      "resolution": 512,
      "bbox_detector": "yolox_l.onnx",
      "pose_estimator": "dw-ll_ucoco_384.onnx",
      "image": [
        "42",
        0
      ]
    },
    "class_type": "DWPreprocessor"
  },
  "169": {
    "inputs": {
      "output_path": "[time(%Y-%m-%d)]",
      "filename_prefix": "aimodel_output_final_",
      "filename_delimiter": "_",
      "filename_number_padding": 4,
      "filename_number_start": "false",
      "extension": "png",
      "quality": 100,
      "lossless_webp": "false",
      "overwrite_mode": "false",
      "show_history": "false",
      "show_history_by_prefix": "true",
      "embed_workflow": "true",
      "show_previews": "true",
      "images": [
        "130",
        0
      ]
    },
    "class_type": "Image Save"
  },
  "170": {
    "inputs": {
      "image_path": "https://wangbo0808.oss-cn-shanghai.aliyuncs.com/aidraw/img2video_static.jpg",
      "RGBA": "false",
      "filename_text_extension": "false"
    },
    "class_type": "Image Load"
  }
}


================================================
FILE: src/draw/data/DrawConfig.ts
================================================
/**
 * 绘画模块配置参数
 */

export const drawConfig={
  defaultTimeOut: 60, //默认任务超时时间
};

export const ApiTimeOut = [
  {
    type: '文生图',
    timeout: 60,
  },
  {
    type: '图生图',
    timeout: 60,
  },
  {
    type: '图生视频',
    timeout: 120,
  },
  {
    type: 'AI模特',
    timeout: 120,
  },
  {
    type: 'AI写真',
    timeout: 240,
  },
  {
    type: '放大1',
    timeout: 120,
  },
  {
    type: '放大2',
    timeout: 180,
  },
  {
    type: '图片反推提示词',
    timeout: 20,
  },
] as ComfyAPIType[];

export interface ComfyAPIType {
  type:
    | '文生图'
    | '图生图'
    | '图生视频'
    | 'AI模特'
    | 'AI写真'
    | '放大1'
    | '放大2'
    | 'AI推文'
    | '换脸'
    | '图片反推提示词';
  timeout: number;
}

export interface DrawTask {
  source: 'wechat' | 'web';
  client_id: string;
  prompt: any;
  api: string;
  socket_id?: string;
  lifo?: boolean;
  prompt_id?: string;
}


================================================
FILE: src/draw/data/aistudio_api.json
================================================
{
  "9": {
    "inputs": {
      "ipadapter_file": "ip-adapter-faceid-plusv2_sd15.bin"
    },
    "class_type": "IPAdapterModelLoader"
  },
  "31": {
    "inputs": {
      "clip_name": "model.safetensors"
    },
    "class_type": "CLIPVisionLoader"
  },
  "32": {
    "inputs": {
      "provider": "CUDA"
    },
    "class_type": "InsightFaceLoader"
  },
  "33": {
    "inputs": {
      "weight": 0.9,
      "noise": 0,
      "weight_type": "original",
      "start_at": 0,
      "end_at": 1,
      "faceid_v2": true,
      "weight_v2": 1,
      "unfold_batch": false,
      "ipadapter": [
        "9",
        0
      ],
      "clip_vision": [
        "31",
        0
      ],
      "insightface": [
        "32",
        0
      ],
      "image": [
        "92",
        0
      ],
      "model": [
        "80",
        0
      ]
    },
    "class_type": "IPAdapterApplyFaceID"
  },
  "50": {
    "inputs": {
      "model": "wd-v1-4-moat-tagger-v2",
      "threshold": 0.35,
      "character_threshold": 0.85,
      "exclude_tags": "",
      "tags": "1girl, solo, short_hair, brown_hair, shirt, brown_eyes, standing, white_shirt, short_sleeves, midriff, pants, lips, hand_on_hip, contrapposto, realistic, high-waist_pants",
      "image": [
        "63",
        0
      ]
    },
    "class_type": "WD14Tagger|pysssss"
  },
  "63": {
    "inputs": {
      "enabled": true,
      "swap_model": "inswapper_128.onnx",
      "facedetection": "retinaface_resnet50",
      "face_restore_model": "none",
      "face_restore_visibility": 1,
      "codeformer_weight": 0.5,
      "detect_gender_source": "no",
      "detect_gender_input": "no",
      "source_faces_index": "0",
      "input_faces_index": "0",
      "console_log_level": 1,
      "input_image": [
        "91",
        0
      ],
      "source_image": [
        "92",
        0
      ]
    },
    "class_type": "ReActorFaceSwap"
  },
  "66": {
    "inputs": {
      "guide_size": 256,
      "guide_size_for": true,
      "max_size": 768,
      "seed": 337795391108149,
      "steps": 20,
      "cfg": 7.5,
      "sampler_name": "dpmpp_2m",
      "scheduler": "karras",
      "denoise": 0.25,
      "feather": 5,
      "noise_mask": true,
      "force_inpaint": true,
      "bbox_threshold": 0.5,
      "bbox_dilation": 10,
      "bbox_crop_factor": 3,
      "sam_detection_hint": "center-1",
      "sam_dilation": 0,
      "sam_threshold": 0.93,
      "sam_bbox_expansion": 0,
      "sam_mask_hint_threshold": 0.7,
      "sam_mask_hint_use_negative": "False",
      "drop_size": 10,
      "wildcard": "",
      "cycle": 1,
      "image": [
        "79",
        5
      ],
      "model": [
        "79",
        0
      ],
      "clip": [
        "80",
        5
      ],
      "vae": [
        "79",
        4
      ],
      "positive": [
        "79",
        1
      ],
      "negative": [
        "79",
        2
      ],
      "bbox_detector": [
        "86",
        0
      ]
    },
    "class_type": "FaceDetailer"
  },
  "79": {
    "inputs": {
      "seed": 337795391108149,
      "steps": 20,
      "cfg": 7.5,
      "sampler_name": "dpmpp_2m",
      "scheduler": "karras",
      "denoise": 0.3,
      "preview_method": "none",
      "vae_decode": "true",
      "model": [
        "33",
        0
      ],
      "positive": [
        "80",
        1
      ],
      "negative": [
        "80",
        2
      ],
      "latent_image": [
        "87",
        0
      ],
      "optional_vae": [
        "80",
        4
      ]
    },
    "class_type": "KSampler (Efficient)"
  },
  "80": {
    "inputs": {
      "ckpt_name": "极氪写实MAX-极氪白系列模型_V6.safetensors",
      "vae_name": "Baked VAE",
      "clip_skip": -2,
      "lora_name": "None",
      "lora_model_strength": 1,
      "lora_clip_strength": 1,
      "positive": [
        "50",
        0
      ],
      "negative": [
        "82",
        0
      ],
      "token_normalization": "none",
      "weight_interpretation": "A1111",
      "empty_latent_width": 512,
      "empty_latent_height": 512,
      "batch_size": 1,
      "lora_stack": [
        "89",
        0
      ]
    },
    "class_type": "Efficient Loader"
  },
  "82": {
    "inputs": {
      "action": "append",
      "tidy_tags": "yes",
      "text_a": "blurry, malformed, distorted, naked",
      "text_b": "",
      "text_c": "",
      "result": "blurry, malformed, distorted, naked"
    },
    "class_type": "StringFunction|pysssss"
  },
  "86": {
    "inputs": {
      "model_name": "bbox/face_yolov8m.pt"
    },
    "class_type": "UltralyticsDetectorProvider"
  },
  "87": {
    "inputs": {
      "pixels": [
        "63",
        0
      ],
      "vae": [
        "80",
        4
      ]
    },
    "class_type": "VAEEncode"
  },
  "89": {
    "inputs": {
      "input_mode": "simple",
      "lora_count": 3,
      "lora_name_1": "None",
      "lora_wt_1": 1,
      "model_str_1": 1,
      "clip_str_1": 1,
      "lora_name_2": "None",
      "lora_wt_2": 1,
      "model_str_2": 1,
      "clip_str_2": 1,
      "lora_name_3": "None",
      "lora_wt_3": 1,
      "model_str_3": 1,
      "clip_str_3": 1,
      "lora_name_4": "None",
      "lora_wt_4": 1,
      "model_str_4": 1,
      "clip_str_4": 1,
      "lora_name_5": "None",
      "lora_wt_5": 1,
      "model_str_5": 1,
      "clip_str_5": 1,
      "lora_name_6": "None",
      "lora_wt_6": 1,
      "model_str_6": 1,
      "clip_str_6": 1,
      "lora_name_7": "None",
      "lora_wt_7": 1,
      "model_str_7": 1,
      "clip_str_7": 1,
      "lora_name_8": "None",
      "lora_wt_8": 1,
      "model_str_8": 1,
      "clip_str_8": 1,
      "lora_name_9": "None",
      "lora_wt_9": 1,
      "model_str_9": 1,
      "clip_str_9": 1,
      "lora_name_10": "None",
      "lora_wt_10": 1,
      "model_str_10": 1,
      "clip_str_10": 1,
      "lora_name_11": "None",
      "lora_wt_11": 1,
      "model_str_11": 1,
      "clip_str_11": 1,
      "lora_name_12": "None",
      "lora_wt_12": 1,
      "model_str_12": 1,
      "clip_str_12": 1,
      "lora_name_13": "None",
      "lora_wt_13": 1,
      "model_str_13": 1,
      "clip_str_13": 1,
      "lora_name_14": "None",
      "lora_wt_14": 1,
      "model_str_14": 1,
      "clip_str_14": 1,
      "lora_name_15": "None",
      "lora_wt_15": 1,
      "model_str_15": 1,
      "clip_str_15": 1,
      "lora_name_16": "None",
      "lora_wt_16": 1,
      "model_str_16": 1,
      "clip_str_16": 1,
      "lora_name_17": "None",
      "lora_wt_17": 1,
      "model_str_17": 1,
      "clip_str_17": 1,
      "lora_name_18": "None",
      "lora_wt_18": 1,
      "model_str_18": 1,
      "clip_str_18": 1,
      "lora_name_19": "None",
      "lora_wt_19": 1,
      "model_str_19": 1,
      "clip_str_19": 1,
      "lora_name_20": "None",
      "lora_wt_20": 1,
      "model_str_20": 1,
      "clip_str_20": 1,
      "lora_name_21": "None",
      "lora_wt_21": 1,
      "model_str_21": 1,
      "clip_str_21": 1,
      "lora_name_22": "None",
      "lora_wt_22": 1,
      "model_str_22": 1,
      "clip_str_22": 1,
      "lora_name_23": "None",
      "lora_wt_23": 1,
      "model_str_23": 1,
      "clip_str_23": 1,
      "lora_name_24": "None",
      "lora_wt_24": 1,
      "model_str_24": 1,
      "clip_str_24": 1,
      "lora_name_25": "None",
      "lora_wt_25": 1,
      "model_str_25": 1,
      "clip_str_25": 1,
      "lora_name_26": "None",
      "lora_wt_26": 1,
      "model_str_26": 1,
      "clip_str_26": 1,
      "lora_name_27": "None",
      "lora_wt_27": 1,
      "model_str_27": 1,
      "clip_str_27": 1,
      "lora_name_28": "None",
      "lora_wt_28": 1,
      "model_str_28": 1,
      "clip_str_28": 1,
      "lora_name_29": "None",
      "lora_wt_29": 1,
      "model_str_29": 1,
      "clip_str_29": 1,
      "lora_name_30": "None",
      "lora_wt_30": 1,
      "model_str_30": 1,
      "clip_str_30": 1,
      "lora_name_31": "None",
      "lora_wt_31": 1,
      "model_str_31": 1,
      "clip_str_31": 1,
      "lora_name_32": "None",
      "lora_wt_32": 1,
      "model_str_32": 1,
      "clip_str_32": 1,
      "lora_name_33": "None",
      "lora_wt_33": 1,
      "model_str_33": 1,
      "clip_str_33": 1,
      "lora_name_34": "None",
      "lora_wt_34": 1,
      "model_str_34": 1,
      "clip_str_34": 1,
      "lora_name_35": "None",
      "lora_wt_35": 1,
      "model_str_35": 1,
      "clip_str_35": 1,
      "lora_name_36": "None",
      "lora_wt_36": 1,
      "model_str_36": 1,
      "clip_str_36": 1,
      "lora_name_37": "None",
      "lora_wt_37": 1,
      "model_str_37": 1,
      "clip_str_37": 1,
      "lora_name_38": "None",
      "lora_wt_38": 1,
      "model_str_38": 1,
      "clip_str_38": 1,
      "lora_name_39": "None",
      "lora_wt_39": 1,
      "model_str_39": 1,
      "clip_str_39": 1,
      "lora_name_40": "None",
      "lora_wt_40": 1,
      "model_str_40": 1,
      "clip_str_40": 1,
      "lora_name_41": "None",
      "lora_wt_41": 1,
      "model_str_41": 1,
      "clip_str_41": 1,
      "lora_name_42": "None",
      "lora_wt_42": 1,
      "model_str_42": 1,
      "clip_str_42": 1,
      "lora_name_43": "None",
      "lora_wt_43": 1,
      "model_str_43": 1,
      "clip_str_43": 1,
      "lora_name_44": "None",
      "lora_wt_44": 1,
      "model_str_44": 1,
      "clip_str_44": 1,
      "lora_name_45": "None",
      "lora_wt_45": 1,
      "model_str_45": 1,
      "clip_str_45": 1,
      "lora_name_46": "None",
      "lora_wt_46": 1,
      "model_str_46": 1,
      "clip_str_46": 1,
      "lora_name_47": "None",
      "lora_wt_47": 1,
      "model_str_47": 1,
      "clip_str_47": 1,
      "lora_name_48": "None",
      "lora_wt_48": 1,
      "model_str_48": 1,
      "clip_str_48": 1,
      "lora_name_49": "None",
      "lora_wt_49": 1,
      "model_str_49": 1,
      "clip_str_49": 1
    },
    "class_type": "LoRA Stacker"
  },
  "91": {
    "inputs": {
      "image_path": "./ComfyUI/input/example.png",
      "RGBA": "false",
      "filename_text_extension": "true"
    },
    "class_type": "Image Load"
  },
  "92": {
    "inputs": {
      "image_path": "./ComfyUI/input/example.png",
      "RGBA": "false",
      "filename_text_extension": "true"
    },
    "class_type": "Image Load"
  },
  "93": {
    "inputs": {
      "output_path": "[time(%Y-%m-%d)]",
      "filename_prefix": "aistudio_output_final_",
      "filename_delimiter": "_",
      "filename_number_padding": 4,
      "filename_number_start": "false",
      "extension": "png",
      "quality": 100,
      "lossless_webp": "false",
      "overwrite_mode": "false",
      "show_history": "false",
      "show_history_by_prefix": "true",
      "embed_workflow": "true",
      "show_previews": "true",
      "images": [
        "66",
        0
      ]
    },
    "class_type": "Image Save"
  },
  "94": {
    "inputs": {
      "output_path": "[time(%Y-%m-%d)]",
      "filename_prefix": "aistudio_output_2_",
      "filename_delimiter": "_",
      "filename_number_padding": 4,
      "filename_number_start": "false",
      "extension": "png",
      "quality": 100,
      "lossless_webp": "false",
      "overwrite_mode": "false",
      "show_history": "false",
      "show_history_by_prefix": "true",
      "embed_workflow": "true",
      "show_previews": "true",
      "images": [
        "79",
        5
      ]
    },
    "class_type": "Image Save"
  },
  "95": {
    "inputs": {
      "output_path": "[time(%Y-%m-%d)]",
      "filename_prefix": "aistudio_output_1_",
      "filename_delimiter": "_",
      "filename_number_padding": 4,
      "filename_number_start": "false",
      "extension": "png",
      "quality": 100,
      "lossless_webp": "false",
      "overwrite_mode": "false",
      "show_history": "false",
      "show_history_by_prefix": "true",
      "embed_workflow": "true",
      "show_previews": "true",
      "images": [
        "63",
        0
      ]
    },
    "class_type": "Image Save"
  }
}


================================================
FILE: src/draw/data/api_matting.json
================================================
{
  "5": {
    "inputs": {
      "prompt": [
        "19",
        0
      ],
      "threshold": 0.31,
      "sam_model": [
        "6",
        0
      ],
      "grounding_dino_model": [
        "7",
        0
      ],
      "image": [
        "62",
        0
      ]
    },
    "class_type": "GroundingDinoSAMSegment (segment anything)"
  },
  "6": {
    "inputs": {
      "model_name": "sam_vit_h_4b8939.pth",
      "device_mode": "Prefer GPU"
    },
    "class_type": "SAMLoader"
  },
  "7": {
    "inputs": {
      "model_name": "GroundingDINO_SwinB (938MB)"
    },
    "class_type": "GroundingDinoModelLoader (segment anything)"
  },
  "19": {
    "inputs": {
      "from_translate": "auto",
      "to_translate": "english",
      "add_proxies": "disable",
      "proxies": "",
      "auth_data": "",
      "service": "GoogleTranslator",
      "text": "人",
      "Show proxy": "proxy_hide",
      "Show authorization": "authorization_hide"
    },
    "class_type": "DeepTranslatorTextNode"
  },
  "44": {
    "inputs": {
      "mask": [
        "5",
        1
      ]
    },
    "class_type": "InvertMask"
  },
  "59": {
    "inputs": {
      "image": [
        "5",
        0
      ],
      "alpha": [
        "44",
        0
      ]
    },
    "class_type": "JoinImageWithAlpha"
  },
  "62": {
    "inputs": {
      "image_path": "C:\\Users\\wangb\\Downloads\\image1 - 2024-03-19T221914.324.png",
      "RGBA": "false",
      "filename_text_extension": "true"
    },
    "class_type": "Image Load"
  },
  "63": {
    "inputs": {
      "output_path": "[time(%Y-%m-%d)]",
      "filename_prefix": [
        "66",
        0
      ],
      "filename_delimiter": "_",
      "filename_number_padding": 4,
      "filename_number_start": "false",
      "extension": "png",
      "quality": 100,
      "lossless_webp": "false",
      "overwrite_mode": "false",
      "show_history": "false",
      "show_history_by_prefix": "true",
      "embed_workflow": "true",
      "show_previews": "true",
      "images": [
        "59",
        0
      ]
    },
    "class_type": "Image Save"
  },
  "66": {
    "inputs": {
      "delimiter": "-",
      "clean_whitespace": "true",
      "text_a": [
        "19",
        0
      ],
      "text_b": "output_matting_final_"
    },
    "class_type": "Text Concatenate"
  }
}


================================================
FILE: src/draw/data/api_removebg.json
================================================
{
  "62": {
    "inputs": {
      "image_path": "E:\\ComfyUI_windows_portable\\ComfyUI\\input\\canvasimage (35).png",
      "RGBA": "false",
      "filename_text_extension": "true"
    },
    "class_type": "Image Load"
  },
  "63": {
    "inputs": {
      "output_path": "[time(%Y-%m-%d)]",
      "filename_prefix": [
        "66",
        0
      ],
      "filename_delimiter": "_",
      "filename_number_padding": 4,
      "filename_number_start": "false",
      "extension": "png",
      "quality": 100,
      "lossless_webp": "false",
      "overwrite_mode": "false",
      "show_history": "false",
      "show_history_by_prefix": "true",
      "embed_workflow": "true",
      "show_previews": "true",
      "images": [
        "72",
        0
      ]
    },
    "class_type": "Image Save"
  },
  "66": {
    "inputs": {
      "delimiter": "-",
      "clean_whitespace": "true",
      "text_a": [
        "62",
        2
      ],
      "text_b": "output_rmbg_final_"
    },
    "class_type": "Text Concatenate"
  },
  "72": {
    "inputs": {
      "transparency": true,
      "model": "u2net",
      "post_processing": false,
      "only_mask": false,
      "alpha_matting": false,
      "alpha_matting_foreground_threshold": 240,
      "alpha_matting_background_threshold": 10,
      "alpha_matting_erode_size": 10,
      "background_color": "none",
      "images": [
        "62",
        0
      ]
    },
    "class_type": "Image Rembg (Remove Background)"
  }
}

================================================
FILE: src/draw/data/api_upscale.json
================================================
{
  "5": {
    "inputs": {
      "output_path": "[time(%Y-%m-%d)]",
      "filename_prefix": [
        "16",
        0
      ],
      "filename_delimiter": "_",
      "filename_number_padding": 4,
      "filename_number_start": "false",
      "extension": "png",
      "quality": 100,
      "lossless_webp": "false",
      "overwrite_mode": "false",
      "show_history": "false",
      "show_history_by_prefix": "true",
      "embed_workflow": "true",
      "show_previews": "true",
      "images": [
        "11",
        0
      ]
    },
    "class_type": "Image Save"
  },
  "11": {
    "inputs": {
      "upscale_model": [
        "12",
        0
      ],
      "image": [
        "15",
        0
      ]
    },
    "class_type": "ImageUpscaleWithModel"
  },
  "12": {
    "inputs": {
      "model_name": "4x-UltraSharp.pth"
    },
    "class_type": "UpscaleModelLoader"
  },
  "15": {
    "inputs": {
      "image_path": "E:\\ComfyUI_windows_portable\\ComfyUI\\output\\ComfyUI_01494_.png",
      "RGBA": "false",
      "filename_text_extension": "false"
    },
    "class_type": "Image Load"
  },
  "16": {
    "inputs": {
      "delimiter": "_",
      "clean_whitespace": "true",
      "text_a": [
        "15",
        2
      ],
      "text_b": "output_upscale_final_"
    },
    "class_type": "Text Concatenate"
  }
}


================================================
FILE: src/draw/data/api_upscale_detailfix.json
================================================
{
  "5": {
    "inputs": {
      "output_path": "[time(%Y-%m-%d)]",
      "filename_prefix": [
        "16",
        0
      ],
      "filename_delimiter": "_",
      "filename_number_padding": 4,
      "filename_number_start": "false",
      "extension": "png",
      "quality": 100,
      "lossless_webp": "false",
      "overwrite_mode": "false",
      "show_history": "false",
      "show_history_by_prefix": "true",
      "embed_workflow": "true",
      "show_previews": "true",
      "images": [
        "28",
        0
      ]
    },
    "class_type": "Image Save"
  },
  "15": {
    "inputs": {
      "image_path": "E:\\ComfyUI_windows_portable\\ComfyUI\\output\\ComfyUI_01494_.png",
      "RGBA": "false",
      "filename_text_extension": "false"
    },
    "class_type": "Image Load"
  },
  "16": {
    "inputs": {
      "delimiter": "_",
      "clean_whitespace": "true",
      "text_a": [
        "15",
        2
      ],
      "text_b": "upscale_detailfix_final_"
    },
    "class_type": "Text Concatenate"
  },
  "23": {
    "inputs": {
      "ckpt_name": "极氪写实MAX-极氪白系列模型_V6.safetensors",
      "vae_name": "vae-ft-mse-840000-ema-pruned.safetensors",
      "clip_skip": -2,
      "lora_name": "None",
      "lora_model_strength": 1,
      "lora_clip_strength": 1,
      "positive": [
        "24",
        0
      ],
      "negative": "CLIP_NEGATIVE",
      "token_normalization": "none",
      "weight_interpretation": "comfy",
      "empty_latent_width": 512,
      "empty_latent_height": 512,
      "batch_size": 1
    },
    "class_type": "Efficient Loader"
  },
  "24": {
    "inputs": {
      "model": "wd-v1-4-moat-tagger-v2",
      "threshold": 0.35,
      "character_threshold": 0.85,
      "exclude_tags": "",
      "tags": "1girl, solo, long_hair, looking_at_viewer, brown_hair, black_hair, bare_shoulders, brown_eyes, jewelry, upper_body, earrings, lips, eyelashes, red_background, realistic, nose",
      "image": [
        "15",
        0
      ]
    },
    "class_type": "WD14Tagger|pysssss"
  },
  "28": {
    "inputs": {
      "upscale_by": 2,
      "seed": 54765465571794,
      "steps": 20,
      "cfg": 8,
      "sampler_name": "dpmpp_2m",
      "scheduler": "karras",
      "denoise": 0.25,
      "mode_type": "Linear",
      "tile_width": 512,
      "tile_height": 512,
      "mask_blur": 8,
      "tile_padding": 32,
      "seam_fix_mode": "None",
      "seam_fix_denoise": 1,
      "seam_fix_width": 64,
      "seam_fix_mask_blur": 8,
      "seam_fix_padding": 16,
      "force_uniform_tiles": "enable",
      "image": [
        "15",
        0
      ],
      "model": [
        "23",
        0
      ],
      "positive": [
        "23",
        1
      ],
      "negative": [
        "23",
        2
      ],
      "vae": [
        "23",
        4
      ],
      "upscale_model": [
        "29",
        0
      ]
    },
    "class_type": "UltimateSDUpscale"
  },
  "29": {
    "inputs": {
      "model_name": "4x-UltraSharp.pth"
    },
    "class_type": "UpscaleModelLoader"
  }
}


================================================
FILE: src/draw/data/api_wechat_img2imgi.json
================================================
{
  "18": {
    "inputs": {
      "text": "paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, manboobs,(ugly:1.331), (duplicate:1.331), (morbid:1.21), (mutilated:1.21), (tranny:1.331), mutated hands, (poorly drawn hands:1.331), blurry, (bad anatomy:1.21), (bad proportions:1.331), extra limbs, (disfigured:1.331), (more than 2 nipples:1.331), (missing arms:1.331), (extra legs:1.331), (fused fingers:1.61051), (too many fingers:1.61051), (unclear eyes:1.331), bad hands, missing fingers, extra digit, (futa:1.1), bad body, NG_DeepNegative_V1_75T,"
    },
    "class_type": "ttN text"
  },
  "19": {
    "inputs": {
      "text": "(8k, best quality, masterpiece:1.2)"
    },
    "class_type": "ttN text"
  },
  "23": {
    "inputs": {
      "from_translate": "auto",
      "to_translate": "english",
      "add_proxies": "disable",
      "proxies": "",
      "auth_data": "",
      "service": "GoogleTranslator",
      "text": "",
      "Show proxy": "proxy_hide",
      "Show authorization": "authorization_hide"
    },
    "class_type": "DeepTranslatorTextNode"
  },
  "25": {
    "inputs": {
      "delimiter": ",",
      "clean_whitespace": "true",
      "text_a": [
        "87",
        0
      ],
      "text_b": [
        "19",
        0
      ]
    },
    "class_type": "Text Concatenate"
  },
  "26": {
    "inputs": {
      "delimiter": "",
      "clean_whitespace": "true",
      "text_a": [
        "23",
        0
      ],
      "text_b": [
        "18",
        0
      ]
    },
    "class_type": "Text Concatenate"
  },
  "44": {
    "inputs": {
      "upscale_type": "latent",
      "hires_ckpt_name": "(use same)",
      "latent_upscaler": "nearest-exact",
      "pixel_upscaler": "4x-UltraSharp.pth",
      "upscale_by": 1.5,
      "use_same_seed": true,
      "seed": -1,
      "hires_steps": 12,
      "denoise": 0.3,
      "iterations": 1,
      "use_controlnet": false,
      "control_net_name": "control_sd15_random_color.pth",
      "strength": 1,
      "preprocessor": "CannyEdgePreprocessor",
      "preprocessor_imgs": false
    },
    "class_type": "HighRes-Fix Script"
  },
  "45": {
    "inputs": {
      "input_mode": "simple",
      "lora_count": 7,
      "lora_name_1": "lcm\\lcm_sd1.5_pytorch_lora_weights.safetensors",
      "lora_wt_1": 1,
      "model_str_1": 1,
      "clip_str_1": 1,
      "lora_name_2": "None",
      "lora_wt_2": 0.5,
      "model_str_2": 1,
      "clip_str_2": 1,
      "lora_name_3": "None",
      "lora_wt_3": 0.5,
      "model_str_3": 1,
      "clip_str_3": 1,
      "lora_name_4": "None",
      "lora_wt_4": 1,
      "model_str_4": 1,
      "clip_str_4": 1,
      "lora_name_5": "None",
      "lora_wt_5": 1,
      "model_str_5": 1,
      "clip_str_5": 1,
      "lora_name_6": "None",
      "lora_wt_6": 1,
      "model_str_6": 1,
      "clip_str_6": 1,
      "lora_name_7": "None",
      "lora_wt_7": 1,
      "model_str_7": 1,
      "clip_str_7": 1,
      "lora_name_8": "None",
      "lora_wt_8": 1,
      "model_str_8": 1,
      "clip_str_8": 1,
      "lora_name_9": "None",
      "lora_wt_9": 1,
      "model_str_9": 1,
      "clip_str_9": 1,
      "lora_name_10": "None",
      "lora_wt_10": 1,
      "model_str_10": 1,
      "clip_str_10": 1,
      "lora_name_11": "None",
      "lora_wt_11": 1,
      "model_str_11": 1,
      "clip_str_11": 1,
      "lora_name_12": "None",
      "lora_wt_12": 1,
      "model_str_12": 1,
      "clip_str_12": 1,
      "lora_name_13": "None",
      "lora_wt_13": 1,
      "model_str_13": 1,
      "clip_str_13": 1,
      "lora_name_14": "None",
      "lora_wt_14": 1,
      "model_str_14": 1,
      "clip_str_14": 1,
      "lora_name_15": "None",
      "lora_wt_15": 1,
      "model_str_15": 1,
      "clip_str_15": 1,
      "lora_name_16": "None",
      "lora_wt_16": 1,
      "model_str_16": 1,
      "clip_str_16": 1,
      "lora_name_17": "None",
      "lora_wt_17": 1,
      "model_str_17": 1,
      "clip_str_17": 1,
      "lora_name_18": "None",
      "lora_wt_18": 1,
      "model_str_18": 1,
      "clip_str_18": 1,
      "lora_name_19": "None",
      "lora_wt_19": 1,
      "model_str_19": 1,
      "clip_str_19": 1,
      "lora_name_20": "None",
      "lora_wt_20": 1,
      "model_str_20": 1,
      "clip_str_20": 1,
      "lora_name_21": "None",
      "lora_wt_21": 1,
      "model_str_21": 1,
      "clip_str_21": 1,
      "lora_name_22": "None",
      "lora_wt_22": 1,
      "model_str_22": 1,
      "clip_str_22": 1,
      "lora_name_23": "None",
      "lora_wt_23": 1,
      "model_str_23": 1,
      "clip_str_23": 1,
      "lora_name_24": "None",
      "lora_wt_24": 1,
      "model_str_24": 1,
      "clip_str_24": 1,
      "lora_name_25": "None",
      "lora_wt_25": 1,
      "model_str_25": 1,
      "clip_str_25": 1,
      "lora_name_26": "None",
      "lora_wt_26": 1,
      "model_str_26": 1,
      "clip_str_26": 1,
      "lora_name_27": "None",
      "lora_wt_27": 1,
      "model_str_27": 1,
      "clip_str_27": 1,
      "lora_name_28": "None",
      "lora_wt_28": 1,
      "model_str_28": 1,
      "clip_str_28": 1,
      "lora_name_29": "None",
      "lora_wt_29": 1,
      "model_str_29": 1,
      "clip_str_29": 1,
      "lora_name_30": "None",
      "lora_wt_30": 1,
      "model_str_30": 1,
      "clip_str_30": 1,
      "lora_name_31": "None",
      "lora_wt_31": 1,
      "model_str_31": 1,
      "clip_str_31": 1,
      "lora_name_32": "None",
      "lora_wt_32": 1,
      "model_str_32": 1,
      "clip_str_32": 1,
      "lora_name_33": "None",
      "lora_wt_33": 1,
      "model_str_33": 1,
      "clip_str_33": 1,
      "lora_name_34": "None",
      "lora_wt_34": 1,
      "model_str_34": 1,
      "clip_str_34": 1,
      "lora_name_35": "None",
      "lora_wt_35": 1,
      "model_str_35": 1,
      "clip_str_35": 1,
      "lora_name_36": "None",
      "lora_wt_36": 1,
      "model_str_36": 1,
      "clip_str_36": 1,
      "lora_name_37": "None",
      "lora_wt_37": 1,
      "model_str_37": 1,
      "clip_str_37": 1,
      "lora_name_38": "None",
      "lora_wt_38": 1,
      "model_str_38": 1,
      "clip_str_38": 1,
      "lora_name_39": "None",
      "lora_wt_39": 1,
      "model_str_39": 1,
      "clip_str_39": 1,
      "lora_name_40": "None",
      "lora_wt_40": 1,
      "model_str_40": 1,
      "clip_str_40": 1,
      "lora_name_41": "None",
      "lora_wt_41": 1,
      "model_str_41": 1,
      "clip_str_41": 1,
      "lora_name_42": "None",
      "lora_wt_42": 1,
      "model_str_42": 1,
      "clip_str_42": 1,
      "lora_name_43": "None",
      "lora_wt_43": 1,
      "model_str_43": 1,
      "clip_str_43": 1,
      "lora_name_44": "None",
      "lora_wt_44": 1,
      "model_str_44": 1,
      "clip_str_44": 1,
      "lora_name_45": "None",
      "lora_wt_45": 1,
      "model_str_45": 1,
      "clip_str_45": 1,
      "lora_name_46": "None",
      "lora_wt_46": 1,
      "model_str_46": 1,
      "clip_str_46": 1,
      "lora_name_47": "None",
      "lora_wt_47": 1,
      "model_str_47": 1,
      "clip_str_47": 1,
      "lora_name_48": "None",
      "lora_wt_48": 1,
      "model_str_48": 1,
      "clip_str_48": 1,
      "lora_name_49": "None",
      "lora_wt_49": 1,
      "model_str_49": 1,
      "clip_str_49": 1
    },
    "class_type": "LoRA Stacker"
  },
  "47": {
    "inputs": {
      "ckpt_name": "极氪写实MAX-极氪白系列模型_V6.safetensors",
      "vae_name": "Baked VAE",
      "clip_skip": -2,
      "lora_name": "None",
      "lora_model_strength": 1,
      "lora_clip_strength": 1,
      "positive": [
        "25",
        0
      ],
      "negative": [
        "26",
        0
      ],
      "token_normalization": "none",
      "weight_interpretation": "A1111",
      "empty_latent_width": 512,
      "empty_latent_height": 768,
      "batch_size": 1,
      "lora_stack": [
        "45",
        0
      ]
    },
    "class_type": "Efficient Loader"
  },
  "51": {
    "inputs": {
      "output_path": "[time(%Y-%m-%d)]",
      "filename_prefix": "img2img_output_final_",
      "filename_delimiter": "_",
      "filename_number_padding": 4,
      "filename_number_start": "false",
      "extension": "png",
      "quality": 100,
      "lossless_webp": "false",
      "overwrite_mode": "false",
      "show_history": "false",
      "show_history_by_prefix": "true",
      "embed_workflow": "true",
      "show_previews": "true",
      "images": [
        "85",
        5
      ]
    },
    "class_type": "Image Save"
  },
  "70": {
    "inputs": {
      "image_path": "C:\\Users\\wangb\\Pictures\\342585.png",
      "RGBA": "false",
      "filename_text_extension": "false"
    },
    "class_type": "Image Load"
  },
  "71": {
    "inputs": {
      "image": [
        "70",
        0
      ]
    },
    "class_type": "Image Size to Number"
  },
  "72": {
    "inputs": {
      "number_type": "integer",
      "number": 512
    },
    "class_type": "Constant Number"
  },
  "73": {
    "inputs": {
      "operation": "division",
      "number_a": [
        "72",
        0
      ],
      "number_b": [
        "71",
        0
      ]
    },
    "class_type": "Number Operation"
  },
  "74": {
    "inputs": {
      "upscale_method": "nearest-exact",
      "scale_by": [
        "73",
        1
      ],
      "image": [
        "70",
        0
      ]
    },
    "class_type": "ImageScaleBy"
  },
  "85": {
    "inputs": {
      "seed": 579488174679770,
      "steps": 5,
      "cfg": 1.5,
      "sampler_name": "lcm",
      "scheduler": "sgm_uniform",
      "denoise": 0.5,
      "preview_method": "none",
      "vae_decode": "true",
      "model": [
        "47",
        0
      ],
      "positive": [
        "47",
        1
      ],
      "negative": [
        "47",
        2
      ],
      "latent_image": [
        "86",
        0
      ],
      "optional_vae": [
        "47",
        4
      ],
      "script": [
        "44",
        0
      ]
    },
    "class_type": "KSampler (Efficient)"
  },
  "86": {
    "inputs": {
      "pixels": [
        "74",
        0
      ],
      "vae": [
        "47",
        4
      ]
    },
    "class_type": "VAEEncode"
  },
  "87": {
    "inputs": {
      "model": "wd-v1-4-moat-tagger-v2",
      "threshold": 0.35,
      "character_threshold": 0.85,
      "exclude_tags": "",
      "tags": "1girl, solo, long_hair, breasts, blue_eyes, skirt, jewelry, braid, white_hair, necklace, cape, armor, lips, snow, realistic, dragon, crown_braid",
      "image": [
        "70",
        0
      ]
    },
    "class_type": "WD14Tagger|pysssss"
  }
}

================================================
FILE: src/draw/data/impaiting_api.json
================================================
{
  "18": {
    "inputs": {
      "text": "paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, manboobs,(ugly:1.331), (duplicate:1.331), (morbid:1.21), (mutilated:1.21), (tranny:1.331), mutated hands, (poorly drawn hands:1.331), blurry, (bad anatomy:1.21), (bad proportions:1.331), extra limbs, (disfigured:1.331), (more than 2 nipples:1.331), (missing arms:1.331), (extra legs:1.331), (fused fingers:1.61051), (too many fingers:1.61051), (unclear eyes:1.331), bad hands, missing fingers, extra digit, (futa:1.1), bad body, NG_DeepNegative_V1_75T,"
    },
    "class_type": "ttN text"
  },
  "19": {
    "inputs": {
      "text": "(8k, best quality, masterpiece:1.2)"
    },
    "class_type": "ttN text"
  },
  "23": {
    "inputs": {
      "from_translate": "auto",
      "to_translate": "english",
      "add_proxies": "disable",
      "proxies": "",
      "auth_data": "",
      "service": "GoogleTranslator",
      "text": "",
      "Show proxy": "proxy_hide",
      "Show authorization": "authorization_hide"
    },
    "class_type": "DeepTranslatorTextNode"
  },
  "24": {
    "inputs": {
      "from_translate": "auto",
      "to_translate": "english",
      "add_proxies": "disable",
      "proxies": "",
      "auth_data": "",
      "service": "GoogleTranslator",
      "text": "",
      "Show proxy": "proxy_hide",
      "Show authorization": "authorization_hide"
    },
    "class_type": "DeepTranslatorTextNode"
  },
  "25": {
    "inputs": {
      "delimiter": ",",
      "clean_whitespace": "true",
      "text_a": [
        "24",
        0
      ],
      "text_b": [
        "19",
        0
      ]
    },
    "class_type": "Text Concatenate"
  },
  "26": {
    "inputs": {
      "delimiter": "",
      "clean_whitespace": "true",
      "text_a": [
        "23",
        0
      ],
      "text_b": [
        "18",
        0
      ]
    },
    "class_type": "Text Concatenate"
  },
  "44": {
    "inputs": {
      "upscale_type": "latent",
      "hires_ckpt_name": "(use same)",
      "latent_upscaler": "nearest-exact",
      "pixel_upscaler": "4x-UltraSharp.pth",
      "upscale_by": 1,
      "use_same_seed": true,
      "seed": -1,
      "hires_steps": 12,
      "denoise": 0.3,
      "iterations": 1,
      "use_controlnet": false,
      "control_net_name": "control_sd15_random_color.pth",
      "strength": 1,
      "preprocessor": "CannyEdgePreprocessor",
      "preprocessor_imgs": false
    },
    "class_type": "HighRes-Fix Script"
  },
  "45": {
    "inputs": {
      "input_mode": "simple",
      "lora_count": 7,
      "lora_name_1": "lcm\\lcm_sd1.5_pytorch_lora_weights.safetensors",
      "lora_wt_1": 1,
      "model_str_1": 1,
      "clip_str_1": 1,
      "lora_name_2": "None",
      "lora_wt_2": 0.5,
      "model_str_2": 1,
      "clip_str_2": 1,
      "lora_name_3": "None",
      "lora_wt_3": 0.5,
      "model_str_3": 1,
      "clip_str_3": 1,
      "lora_name_4": "None",
      "lora_wt_4": 1,
      "model_str_4": 1,
      "clip_str_4": 1,
      "lora_name_5": "None",
      "lora_wt_5": 1,
      "model_str_5": 1,
      "clip_str_5": 1,
      "lora_name_6": "None",
      "lora_wt_6": 1,
      "model_str_6": 1,
      "clip_str_6": 1,
      "lora_name_7": "None",
      "lora_wt_7": 1,
      "model_str_7": 1,
      "clip_str_7": 1,
      "lora_name_8": "None",
      "lora_wt_8": 1,
      "model_str_8": 1,
      "clip_str_8": 1,
      "lora_name_9": "None",
      "lora_wt_9": 1,
      "model_str_9": 1,
      "clip_str_9": 1,
      "lora_name_10": "None",
      "lora_wt_10": 1,
      "model_str_10": 1,
      "clip_str_10": 1,
      "lora_name_11": "None",
      "lora_wt_11": 1,
      "model_str_11": 1,
      "clip_str_11": 1,
      "lora_name_12": "None",
      "lora_wt_12": 1,
      "model_str_12": 1,
      "clip_str_12": 1,
      "lora_name_13": "None",
      "lora_wt_13": 1,
      "model_str_13": 1,
      "clip_str_13": 1,
      "lora_name_14": "None",
      "lora_wt_14": 1,
      "model_str_14": 1,
      "clip_str_14": 1,
      "lora_name_15": "None",
      "lora_wt_15": 1,
      "model_str_15": 1,
      "clip_str_15": 1,
      "lora_name_16": "None",
      "lora_wt_16": 1,
      "model_str_16": 1,
      "clip_str_16": 1,
      "lora_name_17": "None",
      "lora_wt_17": 1,
      "model_str_17": 1,
      "clip_str_17": 1,
      "lora_name_18": "None",
      "lora_wt_18": 1,
      "model_str_18": 1,
      "clip_str_18": 1,
      "lora_name_19": "None",
      "lora_wt_19": 1,
      "model_str_19": 1,
      "clip_str_19": 1,
      "lora_name_20": "None",
      "lora_wt_20": 1,
      "model_str_20": 1,
      "clip_str_20": 1,
      "lora_name_21": "None",
      "lora_wt_21": 1,
      "model_str_21": 1,
      "clip_str_21": 1,
      "lora_name_22": "None",
      "lora_wt_22": 1,
      "model_str_22": 1,
      "clip_str_22": 1,
      "lora_name_23": "None",
      "lora_wt_23": 1,
      "model_str_23": 1,
      "clip_str_23": 1,
      "lora_name_24": "None",
      "lora_wt_24": 1,
      "model_str_24": 1,
      "clip_str_24": 1,
      "lora_name_25": "None",
      "lora_wt_25": 1,
      "model_str_25": 1,
      "clip_str_25": 1,
      "lora_name_26": "None",
      "lora_wt_26": 1,
      "model_str_26": 1,
      "clip_str_26": 1,
      "lora_name_27": "None",
      "lora_wt_27": 1,
      "model_str_27": 1,
      "clip_str_27": 1,
      "lora_name_28": "None",
      "lora_wt_28": 1,
      "model_str_28": 1,
      "clip_str_28": 1,
      "lora_name_29": "None",
      "lora_wt_29": 1,
      "model_str_29": 1,
      "clip_str_29": 1,
      "lora_name_30": "None",
      "lora_wt_30": 1,
      "model_str_30": 1,
      "clip_str_30": 1,
      "lora_name_31": "None",
      "lora_wt_31": 1,
      "model_str_31": 1,
      "clip_str_31": 1,
      "lora_name_32": "None",
      "lora_wt_32": 1,
      "model_str_32": 1,
      "clip_str_32": 1,
      "lora_name_33": "None",
      "lora_wt_33": 1,
      "model_str_33": 1,
      "clip_str_33": 1,
      "lora_name_34": "None",
      "lora_wt_34": 1,
      "model_str_34": 1,
      "clip_str_34": 1,
      "lora_name_35": "None",
      "lora_wt_35": 1,
      "model_str_35": 1,
      "clip_str_35": 1,
      "lora_name_36": "None",
      "lora_wt_36": 1,
      "model_str_36": 1,
      "clip_str_36": 1,
      "lora_name_37": "None",
      "lora_wt_37": 1,
      "model_str_37": 1,
      "clip_str_37": 1,
      "lora_name_38": "None",
      "lora_wt_38": 1,
      "model_str_38": 1,
      "clip_str_38": 1,
      "lora_name_39": "None",
      "lora_wt_39": 1,
      "model_str_39": 1,
      "clip_str_39": 1,
      "lora_name_40": "None",
      "lora_wt_40": 1,
      "model_str_40": 1,
      "clip_str_40": 1,
      "lora_name_41": "None",
      "lora_wt_41": 1,
      "model_str_41": 1,
      "clip_str_41": 1,
      "lora_name_42": "None",
      "lora_wt_42": 1,
      "model_str_42": 1,
      "clip_str_42": 1,
      "lora_name_43": "None",
      "lora_wt_43": 1,
      "model_str_43": 1,
      "clip_str_43": 1,
      "lora_name_44": "None",
      "lora_wt_44": 1,
      "model_str_44": 1,
      "clip_str_44": 1,
      "lora_name_45": "None",
      "lora_wt_45": 1,
      "model_str_45": 1,
      "clip_str_45": 1,
      "lora_name_46": "None",
      "lora_wt_46": 1,
      "model_str_46": 1,
      "clip_str_46": 1,
      "lora_name_47": "None",
      "lora_wt_47": 1,
      "model_str_47": 1,
      "clip_str_47": 1,
      "lora_name_48": "None",
      "lora_wt_48": 1,
      "model_str_48": 1,
      "clip_str_48": 1,
      "lora_name_49": "None",
      "lora_wt_49": 1,
      "model_str_49": 1,
      "clip_str_49": 1
    },
    "class_type": "LoRA Stacker"
  },
  "47": {
    "inputs": {
      "ckpt_name": "极氪写实MAX-极氪白系列模型_V6.safetensors",
      "vae_name": "Baked VAE",
      "clip_skip": -2,
      "lora_name": "None",
      "lora_model_strength": 1,
      "lora_clip_strength": 1,
      "positive": [
        "25",
        0
      ],
      "negative": [
        "26",
        0
      ],
      "token_normalization": "none",
      "weight_interpretation": "A1111",
      "empty_latent_width": 512,
      "empty_latent_height": 768,
      "batch_size": 1,
      "lora_stack": [
        "45",
        0
      ]
    },
    "class_type": "Efficient Loader"
  },
  "51": {
    "inputs": {
      "output_path": "[time(%Y-%m-%d)]",
      "filename_prefix": [
        "93",
        0
      ],
      "filename_delimiter": "_",
      "filename_number_padding": 4,
      "filename_number_start": "false",
      "extension": "png",
      "quality": 100,
      "lossless_webp": "false",
      "overwrite_mode": "false",
      "show_history": "false",
      "show_history_by_prefix": "true",
      "embed_workflow": "true",
      "show_previews": "true",
      "images": [
        "85",
        5
      ]
    },
    "class_type": "Image Save"
  },
  "70": {
    "inputs": {
      "image_path": "C:\\Users\\wangb\\Downloads\\image1 - 2024-03-20T180727.831.png",
      "RGBA": "false",
      "filename_text_extension": "false"
    },
    "class_type": "Image Load"
  },
  "74": {
    "inputs": {
      "upscale_method": "nearest-exact",
      "scale_by": 1,
      "image": [
        "70",
        0
      ]
    },
    "class_type": "ImageScaleBy"
  },
  "85": {
    "inputs": {
      "seed": 742381179588665,
      "steps": 5,
      "cfg": 1.5,
      "sampler_name": "lcm",
      "scheduler": "sgm_uniform",
      "denoise": 0.5,
      "preview_method": "none",
      "vae_decode": "true",
      "model": [
        "47",
        0
      ],
      "positive": [
        "47",
        1
      ],
      "negative": [
        "47",
        2
      ],
      "latent_image": [
        "88",
        0
      ],
      "optional_vae": [
        "47",
        4
      ],
      "script": [
        "44",
        0
      ]
    },
    "class_type": "KSampler (Efficient)"
  },
  "86": {
    "inputs": {
      "pixels": [
        "74",
        0
      ],
      "vae": [
        "47",
        4
      ]
    },
    "class_type": "VAEEncode"
  },
  "87": {
    "inputs": {
      "image_path": "C:\\Users\\wangb\\Downloads\\mask (21).png",
      "RGBA": "false",
      "filename_text_extension": "false"
    },
    "class_type": "Image Load"
  },
  "88": {
    "inputs": {
      "samples": [
        "86",
        0
      ],
      "mask": [
        "91",
        0
      ]
    },
    "class_type": "SetLatentNoiseMask"
  },
  "91": {
    "inputs": {
      "mask": [
        "87",
        1
      ]
    },
    "class_type": "InvertMask"
  },
  "93": {
    "inputs": {
      "delimiter": ", ",
      "clean_whitespace": "true",
      "text_a": [
        "70",
        2
      ],
      "text_b": "output_impaiting_final_"
    },
    "class_type": "Text Concatenate"
  }
}

================================================
FILE: src/draw/data/objectInfo.json
================================================
{
  "KSampler": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "seed": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 18446744073709551615
          }
        ],
        "steps": [
          "INT",
          {
            "default": 20,
            "min": 1,
            "max": 10000
          }
        ],
        "cfg": [
          "FLOAT",
          {
            "default": 8.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.1,
            "round": 0.01
          }
        ],
        "sampler_name": [
          [
            "euler",
            "euler_ancestral",
            "heun",
            "heunpp2",
            "dpm_2",
            "dpm_2_ancestral",
            "lms",
            "dpm_fast",
            "dpm_adaptive",
            "dpmpp_2s_ancestral",
            "dpmpp_sde",
            "dpmpp_sde_gpu",
            "dpmpp_2m",
            "dpmpp_2m_alt",
            "dpmpp_2m_sde",
            "dpmpp_2m_sde_gpu",
            "dpmpp_3m_sde",
            "dpmpp_3m_sde_gpu",
            "ddpm",
            "lcm",
            "ddim",
            "uni_pc",
            "uni_pc_bh2"
          ]
        ],
        "scheduler": [
          [
            "normal",
            "karras",
            "exponential",
            "sgm_uniform",
            "simple",
            "ddim_uniform"
          ]
        ],
        "positive": [
          "CONDITIONING"
        ],
        "negative": [
          "CONDITIONING"
        ],
        "latent_image": [
          "LATENT"
        ],
        "denoise": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "KSampler",
    "display_name": "KSampler",
    "description": "",
    "category": "sampling",
    "output_node": false
  },
  "CheckpointLoaderSimple": {
    "input": {
      "required": {
        "ckpt_name": [
          [
            "ghostmix_v20Bakedvae.safetensors",
            "juggernautXL_v9Rundiffusionphoto2.safetensors",
            "majicmixRealistic_v7.safetensors",
            "svd-fp16.safetensors"
          ]
        ]
      }
    },
    "output": [
      "MODEL",
      "CLIP",
      "VAE"
    ],
    "output_is_list": [
      false,
      false,
      false
    ],
    "output_name": [
      "MODEL",
      "CLIP",
      "VAE"
    ],
    "name": "CheckpointLoaderSimple",
    "display_name": "Load Checkpoint",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "CLIPTextEncode": {
    "input": {
      "required": {
        "text": [
          "STRING",
          {
            "multiline": true
          }
        ],
        "clip": [
          "CLIP"
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "CLIPTextEncode",
    "display_name": "CLIP Text Encode (Prompt)",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "CLIPSetLastLayer": {
    "input": {
      "required": {
        "clip": [
          "CLIP"
        ],
        "stop_at_clip_layer": [
          "INT",
          {
            "default": -1,
            "min": -24,
            "max": -1,
            "step": 1
          }
        ]
      }
    },
    "output": [
      "CLIP"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CLIP"
    ],
    "name": "CLIPSetLastLayer",
    "display_name": "CLIP Set Last Layer",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "VAEDecode": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "vae": [
          "VAE"
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "VAEDecode",
    "display_name": "VAE Decode",
    "description": "",
    "category": "latent",
    "output_node": false
  },
  "VAEEncode": {
    "input": {
      "required": {
        "pixels": [
          "IMAGE"
        ],
        "vae": [
          "VAE"
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "VAEEncode",
    "display_name": "VAE Encode",
    "description": "",
    "category": "latent",
    "output_node": false
  },
  "VAEEncodeForInpaint": {
    "input": {
      "required": {
        "pixels": [
          "IMAGE"
        ],
        "vae": [
          "VAE"
        ],
        "mask": [
          "MASK"
        ],
        "grow_mask_by": [
          "INT",
          {
            "default": 6,
            "min": 0,
            "max": 64,
            "step": 1
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "VAEEncodeForInpaint",
    "display_name": "VAE Encode (for Inpainting)",
    "description": "",
    "category": "latent/inpaint",
    "output_node": false
  },
  "VAELoader": {
    "input": {
      "required": {
        "vae_name": [
          [
            "sdxl_vae_fp16_fix.safetensors",
            "vae-ft-mse-840000-ema-pruned.safetensors"
          ]
        ]
      }
    },
    "output": [
      "VAE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "VAE"
    ],
    "name": "VAELoader",
    "display_name": "Load VAE",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "EmptyLatentImage": {
    "input": {
      "required": {
        "width": [
          "INT",
          {
            "default": 512,
            "min": 16,
            "max": 16384,
            "step": 8
          }
        ],
        "height": [
          "INT",
          {
            "default": 512,
            "min": 16,
            "max": 16384,
            "step": 8
          }
        ],
        "batch_size": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 4096
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "EmptyLatentImage",
    "display_name": "Empty Latent Image",
    "description": "",
    "category": "latent",
    "output_node": false
  },
  "LatentUpscale": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "upscale_method": [
          [
            "nearest-exact",
            "bilinear",
            "area",
            "bicubic",
            "bislerp"
          ]
        ],
        "width": [
          "INT",
          {
            "default": 512,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "height": [
          "INT",
          {
            "default": 512,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "crop": [
          [
            "disabled",
            "center"
          ]
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentUpscale",
    "display_name": "Upscale Latent",
    "description": "",
    "category": "latent",
    "output_node": false
  },
  "LatentUpscaleBy": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "upscale_method": [
          [
            "nearest-exact",
            "bilinear",
            "area",
            "bicubic",
            "bislerp"
          ]
        ],
        "scale_by": [
          "FLOAT",
          {
            "default": 1.5,
            "min": 0.01,
            "max": 8.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentUpscaleBy",
    "display_name": "Upscale Latent By",
    "description": "",
    "category": "latent",
    "output_node": false
  },
  "LatentFromBatch": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "batch_index": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 63
          }
        ],
        "length": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 64
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentFromBatch",
    "display_name": "Latent From Batch",
    "description": "",
    "category": "latent/batch",
    "output_node": false
  },
  "RepeatLatentBatch": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "amount": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 64
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "RepeatLatentBatch",
    "display_name": "Repeat Latent Batch",
    "description": "",
    "category": "latent/batch",
    "output_node": false
  },
  "SaveImage": {
    "input": {
      "required": {
        "images": [
          "IMAGE"
        ],
        "filename_prefix": [
          "STRING",
          {
            "default": "ComfyUI"
          }
        ]
      },
      "hidden": {
        "prompt": "PROMPT",
        "extra_pnginfo": "EXTRA_PNGINFO"
      }
    },
    "output": [],
    "output_is_list": [],
    "output_name": [],
    "name": "SaveImage",
    "display_name": "Save Image",
    "description": "",
    "category": "image",
    "output_node": true
  },
  "PreviewImage": {
    "input": {
      "required": {
        "images": [
          "IMAGE"
        ]
      },
      "hidden": {
        "prompt": "PROMPT",
        "extra_pnginfo": "EXTRA_PNGINFO"
      }
    },
    "output": [],
    "output_is_list": [],
    "output_name": [],
    "name": "PreviewImage",
    "display_name": "Preview Image",
    "description": "",
    "category": "image",
    "output_node": true
  },
  "LoadImage": {
    "input": {
      "required": {
        "image": [
          [
            "2022-06-23 19-46-52-280417 (1).png",
            "2022-06-23 19-46-52-280417.png",
            "ChMkJ13cwnOIK4FoAAXGX559JJgAAvbPAImQfAABcZ3473 (1).jpg",
            "IMG_20230624_115309.jpg",
            "R-C.jpg",
            "example.png",
            "u=1090338134,2696420997&fm=253&fmt=auto&app=138&f=JPEG (1).webp",
            "u=1090338134,2696420997&fm=253&fmt=auto&app=138&f=JPEG (2).webp",
            "u=1090338134,2696420997&fm=253&fmt=auto&app=138&f=JPEG.webp"
          ],
          {
            "image_upload": true
          }
        ]
      }
    },
    "output": [
      "IMAGE",
      "MASK"
    ],
    "output_is_list": [
      false,
      false
    ],
    "output_name": [
      "IMAGE",
      "MASK"
    ],
    "name": "LoadImage",
    "display_name": "Load Image",
    "description": "",
    "category": "image",
    "output_node": false
  },
  "LoadImageMask": {
    "input": {
      "required": {
        "image": [
          [
            "2022-06-23 19-46-52-280417 (1).png",
            "2022-06-23 19-46-52-280417.png",
            "ChMkJ13cwnOIK4FoAAXGX559JJgAAvbPAImQfAABcZ3473 (1).jpg",
            "IMG_20230624_115309.jpg",
            "R-C.jpg",
            "example.png",
            "u=1090338134,2696420997&fm=253&fmt=auto&app=138&f=JPEG (1).webp",
            "u=1090338134,2696420997&fm=253&fmt=auto&app=138&f=JPEG (2).webp",
            "u=1090338134,2696420997&fm=253&fmt=auto&app=138&f=JPEG.webp"
          ],
          {
            "image_upload": true
          }
        ],
        "channel": [
          [
            "alpha",
            "red",
            "green",
            "blue"
          ]
        ]
      }
    },
    "output": [
      "MASK"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MASK"
    ],
    "name": "LoadImageMask",
    "display_name": "Load Image (as Mask)",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "ImageScale": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "upscale_method": [
          [
            "nearest-exact",
            "bilinear",
            "area",
            "bicubic",
            "lanczos"
          ]
        ],
        "width": [
          "INT",
          {
            "default": 512,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "height": [
          "INT",
          {
            "default": 512,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "crop": [
          [
            "disabled",
            "center"
          ]
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageScale",
    "display_name": "Upscale Image",
    "description": "",
    "category": "image/upscaling",
    "output_node": false
  },
  "ImageScaleBy": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "upscale_method": [
          [
            "nearest-exact",
            "bilinear",
            "area",
            "bicubic",
            "lanczos"
          ]
        ],
        "scale_by": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.01,
            "max": 8.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageScaleBy",
    "display_name": "Upscale Image By",
    "description": "",
    "category": "image/upscaling",
    "output_node": false
  },
  "ImageInvert": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageInvert",
    "display_name": "Invert Image",
    "description": "",
    "category": "image",
    "output_node": false
  },
  "ImageBatch": {
    "input": {
      "required": {
        "image1": [
          "IMAGE"
        ],
        "image2": [
          "IMAGE"
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageBatch",
    "display_name": "Batch Images",
    "description": "",
    "category": "image",
    "output_node": false
  },
  "ImagePadForOutpaint": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "left": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "top": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "right": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "bottom": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "feathering": [
          "INT",
          {
            "default": 40,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ]
      }
    },
    "output": [
      "IMAGE",
      "MASK"
    ],
    "output_is_list": [
      false,
      false
    ],
    "output_name": [
      "IMAGE",
      "MASK"
    ],
    "name": "ImagePadForOutpaint",
    "display_name": "Pad Image for Outpainting",
    "description": "",
    "category": "image",
    "output_node": false
  },
  "EmptyImage": {
    "input": {
      "required": {
        "width": [
          "INT",
          {
            "default": 512,
            "min": 1,
            "max": 16384,
            "step": 1
          }
        ],
        "height": [
          "INT",
          {
            "default": 512,
            "min": 1,
            "max": 16384,
            "step": 1
          }
        ],
        "batch_size": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 4096
          }
        ],
        "color": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16777215,
            "step": 1,
            "display": "color"
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "EmptyImage",
    "display_name": "EmptyImage",
    "description": "",
    "category": "image",
    "output_node": false
  },
  "ConditioningAverage": {
    "input": {
      "required": {
        "conditioning_to": [
          "CONDITIONING"
        ],
        "conditioning_from": [
          "CONDITIONING"
        ],
        "conditioning_to_strength": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "ConditioningAverage",
    "display_name": "ConditioningAverage",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "ConditioningCombine": {
    "input": {
      "required": {
        "conditioning_1": [
          "CONDITIONING"
        ],
        "conditioning_2": [
          "CONDITIONING"
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "ConditioningCombine",
    "display_name": "Conditioning (Combine)",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "ConditioningConcat": {
    "input": {
      "required": {
        "conditioning_to": [
          "CONDITIONING"
        ],
        "conditioning_from": [
          "CONDITIONING"
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "ConditioningConcat",
    "display_name": "Conditioning (Concat)",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "ConditioningSetArea": {
    "input": {
      "required": {
        "conditioning": [
          "CONDITIONING"
        ],
        "width": [
          "INT",
          {
            "default": 64,
            "min": 64,
            "max": 16384,
            "step": 8
          }
        ],
        "height": [
          "INT",
          {
            "default": 64,
            "min": 64,
            "max": 16384,
            "step": 8
          }
        ],
        "x": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "y": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "strength": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "ConditioningSetArea",
    "display_name": "Conditioning (Set Area)",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "ConditioningSetAreaPercentage": {
    "input": {
      "required": {
        "conditioning": [
          "CONDITIONING"
        ],
        "width": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0,
            "max": 1.0,
            "step": 0.01
          }
        ],
        "height": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0,
            "max": 1.0,
            "step": 0.01
          }
        ],
        "x": [
          "FLOAT",
          {
            "default": 0,
            "min": 0,
            "max": 1.0,
            "step": 0.01
          }
        ],
        "y": [
          "FLOAT",
          {
            "default": 0,
            "min": 0,
            "max": 1.0,
            "step": 0.01
          }
        ],
        "strength": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "ConditioningSetAreaPercentage",
    "display_name": "Conditioning (Set Area with Percentage)",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "ConditioningSetAreaStrength": {
    "input": {
      "required": {
        "conditioning": [
          "CONDITIONING"
        ],
        "strength": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "ConditioningSetAreaStrength",
    "display_name": "ConditioningSetAreaStrength",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "ConditioningSetMask": {
    "input": {
      "required": {
        "conditioning": [
          "CONDITIONING"
        ],
        "mask": [
          "MASK"
        ],
        "strength": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ],
        "set_cond_area": [
          [
            "default",
            "mask bounds"
          ]
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "ConditioningSetMask",
    "display_name": "Conditioning (Set Mask)",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "KSamplerAdvanced": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "add_noise": [
          [
            "enable",
            "disable"
          ]
        ],
        "noise_seed": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 18446744073709551615
          }
        ],
        "steps": [
          "INT",
          {
            "default": 20,
            "min": 1,
            "max": 10000
          }
        ],
        "cfg": [
          "FLOAT",
          {
            "default": 8.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.1,
            "round": 0.01
          }
        ],
        "sampler_name": [
          [
            "euler",
            "euler_ancestral",
            "heun",
            "heunpp2",
            "dpm_2",
            "dpm_2_ancestral",
            "lms",
            "dpm_fast",
            "dpm_adaptive",
            "dpmpp_2s_ancestral",
            "dpmpp_sde",
            "dpmpp_sde_gpu",
            "dpmpp_2m",
            "dpmpp_2m_alt",
            "dpmpp_2m_sde",
            "dpmpp_2m_sde_gpu",
            "dpmpp_3m_sde",
            "dpmpp_3m_sde_gpu",
            "ddpm",
            "lcm",
            "ddim",
            "uni_pc",
            "uni_pc_bh2"
          ]
        ],
        "scheduler": [
          [
            "normal",
            "karras",
            "exponential",
            "sgm_uniform",
            "simple",
            "ddim_uniform"
          ]
        ],
        "positive": [
          "CONDITIONING"
        ],
        "negative": [
          "CONDITIONING"
        ],
        "latent_image": [
          "LATENT"
        ],
        "start_at_step": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 10000
          }
        ],
        "end_at_step": [
          "INT",
          {
            "default": 10000,
            "min": 0,
            "max": 10000
          }
        ],
        "return_with_leftover_noise": [
          [
            "disable",
            "enable"
          ]
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "KSamplerAdvanced",
    "display_name": "KSampler (Advanced)",
    "description": "",
    "category": "sampling",
    "output_node": false
  },
  "SetLatentNoiseMask": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "mask": [
          "MASK"
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "SetLatentNoiseMask",
    "display_name": "Set Latent Noise Mask",
    "description": "",
    "category": "latent/inpaint",
    "output_node": false
  },
  "LatentComposite": {
    "input": {
      "required": {
        "samples_to": [
          "LATENT"
        ],
        "samples_from": [
          "LATENT"
        ],
        "x": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "y": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "feather": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentComposite",
    "display_name": "Latent Composite",
    "description": "",
    "category": "latent",
    "output_node": false
  },
  "LatentBlend": {
    "input": {
      "required": {
        "samples1": [
          "LATENT"
        ],
        "samples2": [
          "LATENT"
        ],
        "blend_factor": [
          "FLOAT",
          {
            "default": 0.5,
            "min": 0,
            "max": 1,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentBlend",
    "display_name": "Latent Blend",
    "description": "",
    "category": "_for_testing",
    "output_node": false
  },
  "LatentRotate": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "rotation": [
          [
            "none",
            "90 degrees",
            "180 degrees",
            "270 degrees"
          ]
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentRotate",
    "display_name": "Rotate Latent",
    "description": "",
    "category": "latent/transform",
    "output_node": false
  },
  "LatentFlip": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "flip_method": [
          [
            "x-axis: vertically",
            "y-axis: horizontally"
          ]
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentFlip",
    "display_name": "Flip Latent",
    "description": "",
    "category": "latent/transform",
    "output_node": false
  },
  "LatentCrop": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "width": [
          "INT",
          {
            "default": 512,
            "min": 64,
            "max": 16384,
            "step": 8
          }
        ],
        "height": [
          "INT",
          {
            "default": 512,
            "min": 64,
            "max": 16384,
            "step": 8
          }
        ],
        "x": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "y": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentCrop",
    "display_name": "Crop Latent",
    "description": "",
    "category": "latent/transform",
    "output_node": false
  },
  "LoraLoader": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "clip": [
          "CLIP"
        ],
        "lora_name": [
          [
            "ip-adapter-faceid-plus_sd15_lora.safetensors",
            "ip-adapter-faceid-plusv2_sd15_lora.safetensors",
            "ip-adapter-faceid-plusv2_sdxl_lora.safetensors",
            "ip-adapter-faceid_sd15_lora.safetensors",
            "ip-adapter-faceid_sdxl_lora.safetensors",
            "sd15_lcm_lora_rank1.safetensors",
            "sdxl_LCM_lora_rank1.safetensors"
          ]
        ],
        "strength_model": [
          "FLOAT",
          {
            "default": 1.0,
            "min": -20.0,
            "max": 20.0,
            "step": 0.01
          }
        ],
        "strength_clip": [
          "FLOAT",
          {
            "default": 1.0,
            "min": -20.0,
            "max": 20.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL",
      "CLIP"
    ],
    "output_is_list": [
      false,
      false
    ],
    "output_name": [
      "MODEL",
      "CLIP"
    ],
    "name": "LoraLoader",
    "display_name": "Load LoRA",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "CLIPLoader": {
    "input": {
      "required": {
        "clip_name": [
          []
        ],
        "type": [
          [
            "stable_diffusion",
            "stable_cascade"
          ]
        ]
      }
    },
    "output": [
      "CLIP"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CLIP"
    ],
    "name": "CLIPLoader",
    "display_name": "Load CLIP",
    "description": "",
    "category": "advanced/loaders",
    "output_node": false
  },
  "UNETLoader": {
    "input": {
      "required": {
        "unet_name": [
          []
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "UNETLoader",
    "display_name": "UNETLoader",
    "description": "",
    "category": "advanced/loaders",
    "output_node": false
  },
  "DualCLIPLoader": {
    "input": {
      "required": {
        "clip_name1": [
          []
        ],
        "clip_name2": [
          []
        ]
      }
    },
    "output": [
      "CLIP"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CLIP"
    ],
    "name": "DualCLIPLoader",
    "display_name": "DualCLIPLoader",
    "description": "",
    "category": "advanced/loaders",
    "output_node": false
  },
  "CLIPVisionEncode": {
    "input": {
      "required": {
        "clip_vision": [
          "CLIP_VISION"
        ],
        "image": [
          "IMAGE"
        ]
      }
    },
    "output": [
      "CLIP_VISION_OUTPUT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CLIP_VISION_OUTPUT"
    ],
    "name": "CLIPVisionEncode",
    "display_name": "CLIP Vision Encode",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "StyleModelApply": {
    "input": {
      "required": {
        "conditioning": [
          "CONDITIONING"
        ],
        "style_model": [
          "STYLE_MODEL"
        ],
        "clip_vision_output": [
          "CLIP_VISION_OUTPUT"
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "StyleModelApply",
    "display_name": "Apply Style Model",
    "description": "",
    "category": "conditioning/style_model",
    "output_node": false
  },
  "unCLIPConditioning": {
    "input": {
      "required": {
        "conditioning": [
          "CONDITIONING"
        ],
        "clip_vision_output": [
          "CLIP_VISION_OUTPUT"
        ],
        "strength": [
          "FLOAT",
          {
            "default": 1.0,
            "min": -10.0,
            "max": 10.0,
            "step": 0.01
          }
        ],
        "noise_augmentation": [
          "FLOAT",
          {
            "default": 0.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "unCLIPConditioning",
    "display_name": "unCLIPConditioning",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "ControlNetApply": {
    "input": {
      "required": {
        "conditioning": [
          "CONDITIONING"
        ],
        "control_net": [
          "CONTROL_NET"
        ],
        "image": [
          "IMAGE"
        ],
        "strength": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "ControlNetApply",
    "display_name": "Apply ControlNet",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "ControlNetApplyAdvanced": {
    "input": {
      "required": {
        "positive": [
          "CONDITIONING"
        ],
        "negative": [
          "CONDITIONING"
        ],
        "control_net": [
          "CONTROL_NET"
        ],
        "image": [
          "IMAGE"
        ],
        "strength": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ],
        "start_percent": [
          "FLOAT",
          {
            "default": 0.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.001
          }
        ],
        "end_percent": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.001
          }
        ]
      }
    },
    "output": [
      "CONDITIONING",
      "CONDITIONING"
    ],
    "output_is_list": [
      false,
      false
    ],
    "output_name": [
      "positive",
      "negative"
    ],
    "name": "ControlNetApplyAdvanced",
    "display_name": "Apply ControlNet (Advanced)",
    "description": "",
    "category": "conditioning",
    "output_node": false
  },
  "ControlNetLoader": {
    "input": {
      "required": {
        "control_net_name": [
          [
            "#control_v11p_sd15_seg_fp16.safetensors",
            "#control_v11p_sd15_softedge_fp16.safetensors",
            "control_v11f1e_sd15_tile_fp16.safetensors",
            "control_v11f1p_sd15_depth_fp16.safetensors",
            "control_v11p_sd15_canny_fp16.safetensors",
            "control_v11p_sd15_inpaint_fp16.safetensors",
            "control_v11p_sd15_lineart_fp16.safetensors",
            "control_v11p_sd15_openpose_fp16.safetensors"
          ]
        ]
      }
    },
    "output": [
      "CONTROL_NET"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONTROL_NET"
    ],
    "name": "ControlNetLoader",
    "display_name": "Load ControlNet Model",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "DiffControlNetLoader": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "control_net_name": [
          [
            "#control_v11p_sd15_seg_fp16.safetensors",
            "#control_v11p_sd15_softedge_fp16.safetensors",
            "control_v11f1e_sd15_tile_fp16.safetensors",
            "control_v11f1p_sd15_depth_fp16.safetensors",
            "control_v11p_sd15_canny_fp16.safetensors",
            "control_v11p_sd15_inpaint_fp16.safetensors",
            "control_v11p_sd15_lineart_fp16.safetensors",
            "control_v11p_sd15_openpose_fp16.safetensors"
          ]
        ]
      }
    },
    "output": [
      "CONTROL_NET"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONTROL_NET"
    ],
    "name": "DiffControlNetLoader",
    "display_name": "Load ControlNet Model (diff)",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "StyleModelLoader": {
    "input": {
      "required": {
        "style_model_name": [
          []
        ]
      }
    },
    "output": [
      "STYLE_MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "STYLE_MODEL"
    ],
    "name": "StyleModelLoader",
    "display_name": "Load Style Model",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "CLIPVisionLoader": {
    "input": {
      "required": {
        "clip_name": [
          [
            "clip_h.pth"
          ]
        ]
      }
    },
    "output": [
      "CLIP_VISION"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CLIP_VISION"
    ],
    "name": "CLIPVisionLoader",
    "display_name": "Load CLIP Vision",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "VAEDecodeTiled": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "vae": [
          "VAE"
        ],
        "tile_size": [
          "INT",
          {
            "default": 512,
            "min": 320,
            "max": 4096,
            "step": 64
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "VAEDecodeTiled",
    "display_name": "VAE Decode (Tiled)",
    "description": "",
    "category": "_for_testing",
    "output_node": false
  },
  "VAEEncodeTiled": {
    "input": {
      "required": {
        "pixels": [
          "IMAGE"
        ],
        "vae": [
          "VAE"
        ],
        "tile_size": [
          "INT",
          {
            "default": 512,
            "min": 320,
            "max": 4096,
            "step": 64
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "VAEEncodeTiled",
    "display_name": "VAE Encode (Tiled)",
    "description": "",
    "category": "_for_testing",
    "output_node": false
  },
  "unCLIPCheckpointLoader": {
    "input": {
      "required": {
        "ckpt_name": [
          [
            "ghostmix_v20Bakedvae.safetensors",
            "juggernautXL_v9Rundiffusionphoto2.safetensors",
            "majicmixRealistic_v7.safetensors",
            "svd-fp16.safetensors"
          ]
        ]
      }
    },
    "output": [
      "MODEL",
      "CLIP",
      "VAE",
      "CLIP_VISION"
    ],
    "output_is_list": [
      false,
      false,
      false,
      false
    ],
    "output_name": [
      "MODEL",
      "CLIP",
      "VAE",
      "CLIP_VISION"
    ],
    "name": "unCLIPCheckpointLoader",
    "display_name": "unCLIPCheckpointLoader",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "GLIGENLoader": {
    "input": {
      "required": {
        "gligen_name": [
          []
        ]
      }
    },
    "output": [
      "GLIGEN"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "GLIGEN"
    ],
    "name": "GLIGENLoader",
    "display_name": "GLIGENLoader",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "GLIGENTextBoxApply": {
    "input": {
      "required": {
        "conditioning_to": [
          "CONDITIONING"
        ],
        "clip": [
          "CLIP"
        ],
        "gligen_textbox_model": [
          "GLIGEN"
        ],
        "text": [
          "STRING",
          {
            "multiline": true
          }
        ],
        "width": [
          "INT",
          {
            "default": 64,
            "min": 8,
            "max": 16384,
            "step": 8
          }
        ],
        "height": [
          "INT",
          {
            "default": 64,
            "min": 8,
            "max": 16384,
            "step": 8
          }
        ],
        "x": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "y": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "GLIGENTextBoxApply",
    "display_name": "GLIGENTextBoxApply",
    "description": "",
    "category": "conditioning/gligen",
    "output_node": false
  },
  "InpaintModelConditioning": {
    "input": {
      "required": {
        "positive": [
          "CONDITIONING"
        ],
        "negative": [
          "CONDITIONING"
        ],
        "vae": [
          "VAE"
        ],
        "pixels": [
          "IMAGE"
        ],
        "mask": [
          "MASK"
        ]
      }
    },
    "output": [
      "CONDITIONING",
      "CONDITIONING",
      "LATENT"
    ],
    "output_is_list": [
      false,
      false,
      false
    ],
    "output_name": [
      "positive",
      "negative",
      "latent"
    ],
    "name": "InpaintModelConditioning",
    "display_name": "InpaintModelConditioning",
    "description": "",
    "category": "conditioning/inpaint",
    "output_node": false
  },
  "CheckpointLoader": {
    "input": {
      "required": {
        "config_name": [
          [
            "anything_v3.yaml",
            "v1-inference.yaml",
            "v1-inference_clip_skip_2.yaml",
            "v1-inference_clip_skip_2_fp16.yaml",
            "v1-inference_fp16.yaml",
            "v1-inpainting-inference.yaml",
            "v2-inference-v.yaml",
            "v2-inference-v_fp32.yaml",
            "v2-inference.yaml",
            "v2-inference_fp32.yaml",
            "v2-inpainting-inference.yaml"
          ]
        ],
        "ckpt_name": [
          [
            "ghostmix_v20Bakedvae.safetensors",
            "juggernautXL_v9Rundiffusionphoto2.safetensors",
            "majicmixRealistic_v7.safetensors",
            "svd-fp16.safetensors"
          ]
        ]
      }
    },
    "output": [
      "MODEL",
      "CLIP",
      "VAE"
    ],
    "output_is_list": [
      false,
      false,
      false
    ],
    "output_name": [
      "MODEL",
      "CLIP",
      "VAE"
    ],
    "name": "CheckpointLoader",
    "display_name": "Load Checkpoint With Config (DEPRECATED)",
    "description": "",
    "category": "advanced/loaders",
    "output_node": false
  },
  "DiffusersLoader": {
    "input": {
      "required": {
        "model_path": [
          []
        ]
      }
    },
    "output": [
      "MODEL",
      "CLIP",
      "VAE"
    ],
    "output_is_list": [
      false,
      false,
      false
    ],
    "output_name": [
      "MODEL",
      "CLIP",
      "VAE"
    ],
    "name": "DiffusersLoader",
    "display_name": "DiffusersLoader",
    "description": "",
    "category": "advanced/loaders/deprecated",
    "output_node": false
  },
  "LoadLatent": {
    "input": {
      "required": {
        "latent": [
          []
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LoadLatent",
    "display_name": "LoadLatent",
    "description": "",
    "category": "_for_testing",
    "output_node": false
  },
  "SaveLatent": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "filename_prefix": [
          "STRING",
          {
            "default": "latents/ComfyUI"
          }
        ]
      },
      "hidden": {
        "prompt": "PROMPT",
        "extra_pnginfo": "EXTRA_PNGINFO"
      }
    },
    "output": [],
    "output_is_list": [],
    "output_name": [],
    "name": "SaveLatent",
    "display_name": "SaveLatent",
    "description": "",
    "category": "_for_testing",
    "output_node": true
  },
  "ConditioningZeroOut": {
    "input": {
      "required": {
        "conditioning": [
          "CONDITIONING"
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "ConditioningZeroOut",
    "display_name": "ConditioningZeroOut",
    "description": "",
    "category": "advanced/conditioning",
    "output_node": false
  },
  "ConditioningSetTimestepRange": {
    "input": {
      "required": {
        "conditioning": [
          "CONDITIONING"
        ],
        "start": [
          "FLOAT",
          {
            "default": 0.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.001
          }
        ],
        "end": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.001
          }
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "ConditioningSetTimestepRange",
    "display_name": "ConditioningSetTimestepRange",
    "description": "",
    "category": "advanced/conditioning",
    "output_node": false
  },
  "LoraLoaderModelOnly": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "lora_name": [
          [
            "ip-adapter-faceid-plus_sd15_lora.safetensors",
            "ip-adapter-faceid-plusv2_sd15_lora.safetensors",
            "ip-adapter-faceid-plusv2_sdxl_lora.safetensors",
            "ip-adapter-faceid_sd15_lora.safetensors",
            "ip-adapter-faceid_sdxl_lora.safetensors",
            "sd15_lcm_lora_rank1.safetensors",
            "sdxl_LCM_lora_rank1.safetensors"
          ]
        ],
        "strength_model": [
          "FLOAT",
          {
            "default": 1.0,
            "min": -20.0,
            "max": 20.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "LoraLoaderModelOnly",
    "display_name": "LoraLoaderModelOnly",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "LatentAdd": {
    "input": {
      "required": {
        "samples1": [
          "LATENT"
        ],
        "samples2": [
          "LATENT"
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentAdd",
    "display_name": "LatentAdd",
    "description": "",
    "category": "latent/advanced",
    "output_node": false
  },
  "LatentSubtract": {
    "input": {
      "required": {
        "samples1": [
          "LATENT"
        ],
        "samples2": [
          "LATENT"
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentSubtract",
    "display_name": "LatentSubtract",
    "description": "",
    "category": "latent/advanced",
    "output_node": false
  },
  "LatentMultiply": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "multiplier": [
          "FLOAT",
          {
            "default": 1.0,
            "min": -10.0,
            "max": 10.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentMultiply",
    "display_name": "LatentMultiply",
    "description": "",
    "category": "latent/advanced",
    "output_node": false
  },
  "LatentInterpolate": {
    "input": {
      "required": {
        "samples1": [
          "LATENT"
        ],
        "samples2": [
          "LATENT"
        ],
        "ratio": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentInterpolate",
    "display_name": "LatentInterpolate",
    "description": "",
    "category": "latent/advanced",
    "output_node": false
  },
  "LatentBatch": {
    "input": {
      "required": {
        "samples1": [
          "LATENT"
        ],
        "samples2": [
          "LATENT"
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentBatch",
    "display_name": "LatentBatch",
    "description": "",
    "category": "latent/batch",
    "output_node": false
  },
  "LatentBatchSeedBehavior": {
    "input": {
      "required": {
        "samples": [
          "LATENT"
        ],
        "seed_behavior": [
          [
            "random",
            "fixed"
          ],
          {
            "default": "fixed"
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentBatchSeedBehavior",
    "display_name": "LatentBatchSeedBehavior",
    "description": "",
    "category": "latent/advanced",
    "output_node": false
  },
  "HypernetworkLoader": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "hypernetwork_name": [
          [
            "easy_negative.safetensors"
          ]
        ],
        "strength": [
          "FLOAT",
          {
            "default": 1.0,
            "min": -10.0,
            "max": 10.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "HypernetworkLoader",
    "display_name": "HypernetworkLoader",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "UpscaleModelLoader": {
    "input": {
      "required": {
        "model_name": [
          [
            "RealESRGAN_x2plus.pth",
            "RealESRGAN_x4plus.pth",
            "RealESRGAN_x4plus_anime_6B.pth"
          ]
        ]
      }
    },
    "output": [
      "UPSCALE_MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "UPSCALE_MODEL"
    ],
    "name": "UpscaleModelLoader",
    "display_name": "Load Upscale Model",
    "description": "",
    "category": "loaders",
    "output_node": false
  },
  "ImageUpscaleWithModel": {
    "input": {
      "required": {
        "upscale_model": [
          "UPSCALE_MODEL"
        ],
        "image": [
          "IMAGE"
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageUpscaleWithModel",
    "display_name": "Upscale Image (using Model)",
    "description": "",
    "category": "image/upscaling",
    "output_node": false
  },
  "ImageBlend": {
    "input": {
      "required": {
        "image1": [
          "IMAGE"
        ],
        "image2": [
          "IMAGE"
        ],
        "blend_factor": [
          "FLOAT",
          {
            "default": 0.5,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ],
        "blend_mode": [
          [
            "normal",
            "multiply",
            "screen",
            "overlay",
            "soft_light",
            "difference"
          ]
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageBlend",
    "display_name": "ImageBlend",
    "description": "",
    "category": "image/postprocessing",
    "output_node": false
  },
  "ImageBlur": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "blur_radius": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 31,
            "step": 1
          }
        ],
        "sigma": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.1,
            "max": 10.0,
            "step": 0.1
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageBlur",
    "display_name": "ImageBlur",
    "description": "",
    "category": "image/postprocessing",
    "output_node": false
  },
  "ImageQuantize": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "colors": [
          "INT",
          {
            "default": 256,
            "min": 1,
            "max": 256,
            "step": 1
          }
        ],
        "dither": [
          [
            "none",
            "floyd-steinberg",
            "bayer-2",
            "bayer-4",
            "bayer-8",
            "bayer-16"
          ]
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageQuantize",
    "display_name": "ImageQuantize",
    "description": "",
    "category": "image/postprocessing",
    "output_node": false
  },
  "ImageSharpen": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "sharpen_radius": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 31,
            "step": 1
          }
        ],
        "sigma": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.1,
            "max": 10.0,
            "step": 0.01
          }
        ],
        "alpha": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 5.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageSharpen",
    "display_name": "ImageSharpen",
    "description": "",
    "category": "image/postprocessing",
    "output_node": false
  },
  "ImageScaleToTotalPixels": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "upscale_method": [
          [
            "nearest-exact",
            "bilinear",
            "area",
            "bicubic",
            "lanczos"
          ]
        ],
        "megapixels": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.01,
            "max": 16.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageScaleToTotalPixels",
    "display_name": "ImageScaleToTotalPixels",
    "description": "",
    "category": "image/upscaling",
    "output_node": false
  },
  "LatentCompositeMasked": {
    "input": {
      "required": {
        "destination": [
          "LATENT"
        ],
        "source": [
          "LATENT"
        ],
        "x": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "y": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 8
          }
        ],
        "resize_source": [
          "BOOLEAN",
          {
            "default": false
          }
        ]
      },
      "optional": {
        "mask": [
          "MASK"
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "LatentCompositeMasked",
    "display_name": "LatentCompositeMasked",
    "description": "",
    "category": "latent",
    "output_node": false
  },
  "ImageCompositeMasked": {
    "input": {
      "required": {
        "destination": [
          "IMAGE"
        ],
        "source": [
          "IMAGE"
        ],
        "x": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "y": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "resize_source": [
          "BOOLEAN",
          {
            "default": false
          }
        ]
      },
      "optional": {
        "mask": [
          "MASK"
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageCompositeMasked",
    "display_name": "ImageCompositeMasked",
    "description": "",
    "category": "image",
    "output_node": false
  },
  "MaskToImage": {
    "input": {
      "required": {
        "mask": [
          "MASK"
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "MaskToImage",
    "display_name": "Convert Mask to Image",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "ImageToMask": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "channel": [
          [
            "red",
            "green",
            "blue",
            "alpha"
          ]
        ]
      }
    },
    "output": [
      "MASK"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MASK"
    ],
    "name": "ImageToMask",
    "display_name": "Convert Image to Mask",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "ImageColorToMask": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "color": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16777215,
            "step": 1,
            "display": "color"
          }
        ]
      }
    },
    "output": [
      "MASK"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MASK"
    ],
    "name": "ImageColorToMask",
    "display_name": "ImageColorToMask",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "SolidMask": {
    "input": {
      "required": {
        "value": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ],
        "width": [
          "INT",
          {
            "default": 512,
            "min": 1,
            "max": 16384,
            "step": 1
          }
        ],
        "height": [
          "INT",
          {
            "default": 512,
            "min": 1,
            "max": 16384,
            "step": 1
          }
        ]
      }
    },
    "output": [
      "MASK"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MASK"
    ],
    "name": "SolidMask",
    "display_name": "SolidMask",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "InvertMask": {
    "input": {
      "required": {
        "mask": [
          "MASK"
        ]
      }
    },
    "output": [
      "MASK"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MASK"
    ],
    "name": "InvertMask",
    "display_name": "InvertMask",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "CropMask": {
    "input": {
      "required": {
        "mask": [
          "MASK"
        ],
        "x": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "y": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "width": [
          "INT",
          {
            "default": 512,
            "min": 1,
            "max": 16384,
            "step": 1
          }
        ],
        "height": [
          "INT",
          {
            "default": 512,
            "min": 1,
            "max": 16384,
            "step": 1
          }
        ]
      }
    },
    "output": [
      "MASK"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MASK"
    ],
    "name": "CropMask",
    "display_name": "CropMask",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "MaskComposite": {
    "input": {
      "required": {
        "destination": [
          "MASK"
        ],
        "source": [
          "MASK"
        ],
        "x": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "y": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "operation": [
          [
            "multiply",
            "add",
            "subtract",
            "and",
            "or",
            "xor"
          ]
        ]
      }
    },
    "output": [
      "MASK"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MASK"
    ],
    "name": "MaskComposite",
    "display_name": "MaskComposite",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "FeatherMask": {
    "input": {
      "required": {
        "mask": [
          "MASK"
        ],
        "left": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "top": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "right": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "bottom": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ]
      }
    },
    "output": [
      "MASK"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MASK"
    ],
    "name": "FeatherMask",
    "display_name": "FeatherMask",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "GrowMask": {
    "input": {
      "required": {
        "mask": [
          "MASK"
        ],
        "expand": [
          "INT",
          {
            "default": 0,
            "min": -16384,
            "max": 16384,
            "step": 1
          }
        ],
        "tapered_corners": [
          "BOOLEAN",
          {
            "default": true
          }
        ]
      }
    },
    "output": [
      "MASK"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MASK"
    ],
    "name": "GrowMask",
    "display_name": "GrowMask",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "ThresholdMask": {
    "input": {
      "required": {
        "mask": [
          "MASK"
        ],
        "value": [
          "FLOAT",
          {
            "default": 0.5,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MASK"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MASK"
    ],
    "name": "ThresholdMask",
    "display_name": "ThresholdMask",
    "description": "",
    "category": "mask",
    "output_node": false
  },
  "PorterDuffImageComposite": {
    "input": {
      "required": {
        "source": [
          "IMAGE"
        ],
        "source_alpha": [
          "MASK"
        ],
        "destination": [
          "IMAGE"
        ],
        "destination_alpha": [
          "MASK"
        ],
        "mode": [
          [
            "ADD",
            "CLEAR",
            "DARKEN",
            "DST",
            "DST_ATOP",
            "DST_IN",
            "DST_OUT",
            "DST_OVER",
            "LIGHTEN",
            "MULTIPLY",
            "OVERLAY",
            "SCREEN",
            "SRC",
            "SRC_ATOP",
            "SRC_IN",
            "SRC_OUT",
            "SRC_OVER",
            "XOR"
          ],
          {
            "default": "DST"
          }
        ]
      }
    },
    "output": [
      "IMAGE",
      "MASK"
    ],
    "output_is_list": [
      false,
      false
    ],
    "output_name": [
      "IMAGE",
      "MASK"
    ],
    "name": "PorterDuffImageComposite",
    "display_name": "Porter-Duff Image Composite",
    "description": "",
    "category": "mask/compositing",
    "output_node": false
  },
  "SplitImageWithAlpha": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ]
      }
    },
    "output": [
      "IMAGE",
      "MASK"
    ],
    "output_is_list": [
      false,
      false
    ],
    "output_name": [
      "IMAGE",
      "MASK"
    ],
    "name": "SplitImageWithAlpha",
    "display_name": "Split Image with Alpha",
    "description": "",
    "category": "mask/compositing",
    "output_node": false
  },
  "JoinImageWithAlpha": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "alpha": [
          "MASK"
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "JoinImageWithAlpha",
    "display_name": "Join Image with Alpha",
    "description": "",
    "category": "mask/compositing",
    "output_node": false
  },
  "RebatchLatents": {
    "input": {
      "required": {
        "latents": [
          "LATENT"
        ],
        "batch_size": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 4096
          }
        ]
      }
    },
    "output": [
      "LATENT"
    ],
    "output_is_list": [
      true
    ],
    "output_name": [
      "LATENT"
    ],
    "name": "RebatchLatents",
    "display_name": "Rebatch Latents",
    "description": "",
    "category": "latent/batch",
    "output_node": false
  },
  "RebatchImages": {
    "input": {
      "required": {
        "images": [
          "IMAGE"
        ],
        "batch_size": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 4096
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      true
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "RebatchImages",
    "display_name": "Rebatch Images",
    "description": "",
    "category": "image/batch",
    "output_node": false
  },
  "ModelMergeSimple": {
    "input": {
      "required": {
        "model1": [
          "MODEL"
        ],
        "model2": [
          "MODEL"
        ],
        "ratio": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "ModelMergeSimple",
    "display_name": "ModelMergeSimple",
    "description": "",
    "category": "advanced/model_merging",
    "output_node": false
  },
  "ModelMergeBlocks": {
    "input": {
      "required": {
        "model1": [
          "MODEL"
        ],
        "model2": [
          "MODEL"
        ],
        "input": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ],
        "middle": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ],
        "out": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "ModelMergeBlocks",
    "display_name": "ModelMergeBlocks",
    "description": "",
    "category": "advanced/model_merging",
    "output_node": false
  },
  "ModelMergeSubtract": {
    "input": {
      "required": {
        "model1": [
          "MODEL"
        ],
        "model2": [
          "MODEL"
        ],
        "multiplier": [
          "FLOAT",
          {
            "default": 1.0,
            "min": -10.0,
            "max": 10.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "ModelMergeSubtract",
    "display_name": "ModelMergeSubtract",
    "description": "",
    "category": "advanced/model_merging",
    "output_node": false
  },
  "ModelMergeAdd": {
    "input": {
      "required": {
        "model1": [
          "MODEL"
        ],
        "model2": [
          "MODEL"
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "ModelMergeAdd",
    "display_name": "ModelMergeAdd",
    "description": "",
    "category": "advanced/model_merging",
    "output_node": false
  },
  "CheckpointSave": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "clip": [
          "CLIP"
        ],
        "vae": [
          "VAE"
        ],
        "filename_prefix": [
          "STRING",
          {
            "default": "checkpoints/ComfyUI"
          }
        ]
      },
      "hidden": {
        "prompt": "PROMPT",
        "extra_pnginfo": "EXTRA_PNGINFO"
      }
    },
    "output": [],
    "output_is_list": [],
    "output_name": [],
    "name": "CheckpointSave",
    "display_name": "CheckpointSave",
    "description": "",
    "category": "advanced/model_merging",
    "output_node": true
  },
  "CLIPMergeSimple": {
    "input": {
      "required": {
        "clip1": [
          "CLIP"
        ],
        "clip2": [
          "CLIP"
        ],
        "ratio": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "CLIP"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CLIP"
    ],
    "name": "CLIPMergeSimple",
    "display_name": "CLIPMergeSimple",
    "description": "",
    "category": "advanced/model_merging",
    "output_node": false
  },
  "CLIPMergeSubtract": {
    "input": {
      "required": {
        "clip1": [
          "CLIP"
        ],
        "clip2": [
          "CLIP"
        ],
        "multiplier": [
          "FLOAT",
          {
            "default": 1.0,
            "min": -10.0,
            "max": 10.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "CLIP"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CLIP"
    ],
    "name": "CLIPMergeSubtract",
    "display_name": "CLIPMergeSubtract",
    "description": "",
    "category": "advanced/model_merging",
    "output_node": false
  },
  "CLIPMergeAdd": {
    "input": {
      "required": {
        "clip1": [
          "CLIP"
        ],
        "clip2": [
          "CLIP"
        ]
      }
    },
    "output": [
      "CLIP"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CLIP"
    ],
    "name": "CLIPMergeAdd",
    "display_name": "CLIPMergeAdd",
    "description": "",
    "category": "advanced/model_merging",
    "output_node": false
  },
  "CLIPSave": {
    "input": {
      "required": {
        "clip": [
          "CLIP"
        ],
        "filename_prefix": [
          "STRING",
          {
            "default": "clip/ComfyUI"
          }
        ]
      },
      "hidden": {
        "prompt": "PROMPT",
        "extra_pnginfo": "EXTRA_PNGINFO"
      }
    },
    "output": [],
    "output_is_list": [],
    "output_name": [],
    "name": "CLIPSave",
    "display_name": "CLIPSave",
    "description": "",
    "category": "advanced/model_merging",
    "output_node": true
  },
  "VAESave": {
    "input": {
      "required": {
        "vae": [
          "VAE"
        ],
        "filename_prefix": [
          "STRING",
          {
            "default": "vae/ComfyUI_vae"
          }
        ]
      },
      "hidden": {
        "prompt": "PROMPT",
        "extra_pnginfo": "EXTRA_PNGINFO"
      }
    },
    "output": [],
    "output_is_list": [],
    "output_name": [],
    "name": "VAESave",
    "display_name": "VAESave",
    "description": "",
    "category": "advanced/model_merging",
    "output_node": true
  },
  "TomePatchModel": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "ratio": [
          "FLOAT",
          {
            "default": 0.3,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "TomePatchModel",
    "display_name": "TomePatchModel",
    "description": "",
    "category": "_for_testing",
    "output_node": false
  },
  "CLIPTextEncodeSDXLRefiner": {
    "input": {
      "required": {
        "ascore": [
          "FLOAT",
          {
            "default": 6.0,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.01
          }
        ],
        "width": [
          "INT",
          {
            "default": 1024.0,
            "min": 0,
            "max": 16384
          }
        ],
        "height": [
          "INT",
          {
            "default": 1024.0,
            "min": 0,
            "max": 16384
          }
        ],
        "text": [
          "STRING",
          {
            "multiline": true
          }
        ],
        "clip": [
          "CLIP"
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "CLIPTextEncodeSDXLRefiner",
    "display_name": "CLIPTextEncodeSDXLRefiner",
    "description": "",
    "category": "advanced/conditioning",
    "output_node": false
  },
  "CLIPTextEncodeSDXL": {
    "input": {
      "required": {
        "width": [
          "INT",
          {
            "default": 1024.0,
            "min": 0,
            "max": 16384
          }
        ],
        "height": [
          "INT",
          {
            "default": 1024.0,
            "min": 0,
            "max": 16384
          }
        ],
        "crop_w": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384
          }
        ],
        "crop_h": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384
          }
        ],
        "target_width": [
          "INT",
          {
            "default": 1024.0,
            "min": 0,
            "max": 16384
          }
        ],
        "target_height": [
          "INT",
          {
            "default": 1024.0,
            "min": 0,
            "max": 16384
          }
        ],
        "text_g": [
          "STRING",
          {
            "multiline": true,
            "default": "CLIP_G"
          }
        ],
        "clip": [
          "CLIP"
        ],
        "text_l": [
          "STRING",
          {
            "multiline": true,
            "default": "CLIP_L"
          }
        ]
      }
    },
    "output": [
      "CONDITIONING"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "CONDITIONING"
    ],
    "name": "CLIPTextEncodeSDXL",
    "display_name": "CLIPTextEncodeSDXL",
    "description": "",
    "category": "advanced/conditioning",
    "output_node": false
  },
  "Canny": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "low_threshold": [
          "FLOAT",
          {
            "default": 0.4,
            "min": 0.01,
            "max": 0.99,
            "step": 0.01
          }
        ],
        "high_threshold": [
          "FLOAT",
          {
            "default": 0.8,
            "min": 0.01,
            "max": 0.99,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "Canny",
    "display_name": "Canny",
    "description": "",
    "category": "image/preprocessors",
    "output_node": false
  },
  "FreeU": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "b1": [
          "FLOAT",
          {
            "default": 1.1,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ],
        "b2": [
          "FLOAT",
          {
            "default": 1.2,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ],
        "s1": [
          "FLOAT",
          {
            "default": 0.9,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ],
        "s2": [
          "FLOAT",
          {
            "default": 0.2,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "FreeU",
    "display_name": "FreeU",
    "description": "",
    "category": "model_patches",
    "output_node": false
  },
  "FreeU_V2": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "b1": [
          "FLOAT",
          {
            "default": 1.3,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ],
        "b2": [
          "FLOAT",
          {
            "default": 1.4,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ],
        "s1": [
          "FLOAT",
          {
            "default": 0.9,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ],
        "s2": [
          "FLOAT",
          {
            "default": 0.2,
            "min": 0.0,
            "max": 10.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "FreeU_V2",
    "display_name": "FreeU_V2",
    "description": "",
    "category": "model_patches",
    "output_node": false
  },
  "SamplerCustom": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "add_noise": [
          "BOOLEAN",
          {
            "default": true
          }
        ],
        "noise_seed": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 18446744073709551615
          }
        ],
        "cfg": [
          "FLOAT",
          {
            "default": 8.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.1,
            "round": 0.01
          }
        ],
        "positive": [
          "CONDITIONING"
        ],
        "negative": [
          "CONDITIONING"
        ],
        "sampler": [
          "SAMPLER"
        ],
        "sigmas": [
          "SIGMAS"
        ],
        "latent_image": [
          "LATENT"
        ]
      }
    },
    "output": [
      "LATENT",
      "LATENT"
    ],
    "output_is_list": [
      false,
      false
    ],
    "output_name": [
      "output",
      "denoised_output"
    ],
    "name": "SamplerCustom",
    "display_name": "SamplerCustom",
    "description": "",
    "category": "sampling/custom_sampling",
    "output_node": false
  },
  "BasicScheduler": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "scheduler": [
          [
            "normal",
            "karras",
            "exponential",
            "sgm_uniform",
            "simple",
            "ddim_uniform"
          ]
        ],
        "steps": [
          "INT",
          {
            "default": 20,
            "min": 1,
            "max": 10000
          }
        ],
        "denoise": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "SIGMAS"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SIGMAS"
    ],
    "name": "BasicScheduler",
    "display_name": "BasicScheduler",
    "description": "",
    "category": "sampling/custom_sampling/schedulers",
    "output_node": false
  },
  "KarrasScheduler": {
    "input": {
      "required": {
        "steps": [
          "INT",
          {
            "default": 20,
            "min": 1,
            "max": 10000
          }
        ],
        "sigma_max": [
          "FLOAT",
          {
            "default": 14.614642,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.01,
            "round": false
          }
        ],
        "sigma_min": [
          "FLOAT",
          {
            "default": 0.0291675,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.01,
            "round": false
          }
        ],
        "rho": [
          "FLOAT",
          {
            "default": 7.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ]
      }
    },
    "output": [
      "SIGMAS"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SIGMAS"
    ],
    "name": "KarrasScheduler",
    "display_name": "KarrasScheduler",
    "description": "",
    "category": "sampling/custom_sampling/schedulers",
    "output_node": false
  },
  "ExponentialScheduler": {
    "input": {
      "required": {
        "steps": [
          "INT",
          {
            "default": 20,
            "min": 1,
            "max": 10000
          }
        ],
        "sigma_max": [
          "FLOAT",
          {
            "default": 14.614642,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.01,
            "round": false
          }
        ],
        "sigma_min": [
          "FLOAT",
          {
            "default": 0.0291675,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.01,
            "round": false
          }
        ]
      }
    },
    "output": [
      "SIGMAS"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SIGMAS"
    ],
    "name": "ExponentialScheduler",
    "display_name": "ExponentialScheduler",
    "description": "",
    "category": "sampling/custom_sampling/schedulers",
    "output_node": false
  },
  "PolyexponentialScheduler": {
    "input": {
      "required": {
        "steps": [
          "INT",
          {
            "default": 20,
            "min": 1,
            "max": 10000
          }
        ],
        "sigma_max": [
          "FLOAT",
          {
            "default": 14.614642,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.01,
            "round": false
          }
        ],
        "sigma_min": [
          "FLOAT",
          {
            "default": 0.0291675,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.01,
            "round": false
          }
        ],
        "rho": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ]
      }
    },
    "output": [
      "SIGMAS"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SIGMAS"
    ],
    "name": "PolyexponentialScheduler",
    "display_name": "PolyexponentialScheduler",
    "description": "",
    "category": "sampling/custom_sampling/schedulers",
    "output_node": false
  },
  "VPScheduler": {
    "input": {
      "required": {
        "steps": [
          "INT",
          {
            "default": 20,
            "min": 1,
            "max": 10000
          }
        ],
        "beta_d": [
          "FLOAT",
          {
            "default": 19.9,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.01,
            "round": false
          }
        ],
        "beta_min": [
          "FLOAT",
          {
            "default": 0.1,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.01,
            "round": false
          }
        ],
        "eps_s": [
          "FLOAT",
          {
            "default": 0.001,
            "min": 0.0,
            "max": 1.0,
            "step": 0.0001,
            "round": false
          }
        ]
      }
    },
    "output": [
      "SIGMAS"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SIGMAS"
    ],
    "name": "VPScheduler",
    "display_name": "VPScheduler",
    "description": "",
    "category": "sampling/custom_sampling/schedulers",
    "output_node": false
  },
  "SDTurboScheduler": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "steps": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 10
          }
        ],
        "denoise": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "SIGMAS"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SIGMAS"
    ],
    "name": "SDTurboScheduler",
    "display_name": "SDTurboScheduler",
    "description": "",
    "category": "sampling/custom_sampling/schedulers",
    "output_node": false
  },
  "KSamplerSelect": {
    "input": {
      "required": {
        "sampler_name": [
          [
            "euler",
            "euler_ancestral",
            "heun",
            "heunpp2",
            "dpm_2",
            "dpm_2_ancestral",
            "lms",
            "dpm_fast",
            "dpm_adaptive",
            "dpmpp_2s_ancestral",
            "dpmpp_sde",
            "dpmpp_sde_gpu",
            "dpmpp_2m",
            "dpmpp_2m_alt",
            "dpmpp_2m_sde",
            "dpmpp_2m_sde_gpu",
            "dpmpp_3m_sde",
            "dpmpp_3m_sde_gpu",
            "ddpm",
            "lcm",
            "ddim",
            "uni_pc",
            "uni_pc_bh2"
          ]
        ]
      }
    },
    "output": [
      "SAMPLER"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SAMPLER"
    ],
    "name": "KSamplerSelect",
    "display_name": "KSamplerSelect",
    "description": "",
    "category": "sampling/custom_sampling/samplers",
    "output_node": false
  },
  "SamplerEulerAncestral": {
    "input": {
      "required": {
        "eta": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "s_noise": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ]
      }
    },
    "output": [
      "SAMPLER"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SAMPLER"
    ],
    "name": "SamplerEulerAncestral",
    "display_name": "SamplerEulerAncestral",
    "description": "",
    "category": "sampling/custom_sampling/samplers",
    "output_node": false
  },
  "SamplerLMS": {
    "input": {
      "required": {
        "order": [
          "INT",
          {
            "default": 4,
            "min": 1,
            "max": 100
          }
        ]
      }
    },
    "output": [
      "SAMPLER"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SAMPLER"
    ],
    "name": "SamplerLMS",
    "display_name": "SamplerLMS",
    "description": "",
    "category": "sampling/custom_sampling/samplers",
    "output_node": false
  },
  "SamplerDPMPP_3M_SDE": {
    "input": {
      "required": {
        "eta": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "s_noise": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "noise_device": [
          [
            "gpu",
            "cpu"
          ]
        ]
      }
    },
    "output": [
      "SAMPLER"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SAMPLER"
    ],
    "name": "SamplerDPMPP_3M_SDE",
    "display_name": "SamplerDPMPP_3M_SDE",
    "description": "",
    "category": "sampling/custom_sampling/samplers",
    "output_node": false
  },
  "SamplerDPMPP_2M_SDE": {
    "input": {
      "required": {
        "solver_type": [
          [
            "midpoint",
            "heun"
          ]
        ],
        "eta": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "s_noise": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "noise_device": [
          [
            "gpu",
            "cpu"
          ]
        ]
      }
    },
    "output": [
      "SAMPLER"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SAMPLER"
    ],
    "name": "SamplerDPMPP_2M_SDE",
    "display_name": "SamplerDPMPP_2M_SDE",
    "description": "",
    "category": "sampling/custom_sampling/samplers",
    "output_node": false
  },
  "SamplerDPMPP_SDE": {
    "input": {
      "required": {
        "eta": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "s_noise": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "r": [
          "FLOAT",
          {
            "default": 0.5,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "noise_device": [
          [
            "gpu",
            "cpu"
          ]
        ]
      }
    },
    "output": [
      "SAMPLER"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SAMPLER"
    ],
    "name": "SamplerDPMPP_SDE",
    "display_name": "SamplerDPMPP_SDE",
    "description": "",
    "category": "sampling/custom_sampling/samplers",
    "output_node": false
  },
  "SamplerDPMAdaptative": {
    "input": {
      "required": {
        "order": [
          "INT",
          {
            "default": 3,
            "min": 2,
            "max": 3
          }
        ],
        "rtol": [
          "FLOAT",
          {
            "default": 0.05,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "atol": [
          "FLOAT",
          {
            "default": 0.0078,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "h_init": [
          "FLOAT",
          {
            "default": 0.05,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "pcoeff": [
          "FLOAT",
          {
            "default": 0.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "icoeff": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "dcoeff": [
          "FLOAT",
          {
            "default": 0.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "accept_safety": [
          "FLOAT",
          {
            "default": 0.81,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "eta": [
          "FLOAT",
          {
            "default": 0.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ],
        "s_noise": [
          "FLOAT",
          {
            "default": 1.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01,
            "round": false
          }
        ]
      }
    },
    "output": [
      "SAMPLER"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SAMPLER"
    ],
    "name": "SamplerDPMAdaptative",
    "display_name": "SamplerDPMAdaptative",
    "description": "",
    "category": "sampling/custom_sampling/samplers",
    "output_node": false
  },
  "SplitSigmas": {
    "input": {
      "required": {
        "sigmas": [
          "SIGMAS"
        ],
        "step": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 10000
          }
        ]
      }
    },
    "output": [
      "SIGMAS",
      "SIGMAS"
    ],
    "output_is_list": [
      false,
      false
    ],
    "output_name": [
      "SIGMAS",
      "SIGMAS"
    ],
    "name": "SplitSigmas",
    "display_name": "SplitSigmas",
    "description": "",
    "category": "sampling/custom_sampling/sigmas",
    "output_node": false
  },
  "FlipSigmas": {
    "input": {
      "required": {
        "sigmas": [
          "SIGMAS"
        ]
      }
    },
    "output": [
      "SIGMAS"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "SIGMAS"
    ],
    "name": "FlipSigmas",
    "display_name": "FlipSigmas",
    "description": "",
    "category": "sampling/custom_sampling/sigmas",
    "output_node": false
  },
  "HyperTile": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "tile_size": [
          "INT",
          {
            "default": 256,
            "min": 1,
            "max": 2048
          }
        ],
        "swap_size": [
          "INT",
          {
            "default": 2,
            "min": 1,
            "max": 128
          }
        ],
        "max_depth": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 10
          }
        ],
        "scale_depth": [
          "BOOLEAN",
          {
            "default": false
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "HyperTile",
    "display_name": "HyperTile",
    "description": "",
    "category": "model_patches",
    "output_node": false
  },
  "ModelSamplingDiscrete": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "sampling": [
          [
            "eps",
            "v_prediction",
            "lcm",
            "x0"
          ]
        ],
        "zsnr": [
          "BOOLEAN",
          {
            "default": false
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "ModelSamplingDiscrete",
    "display_name": "ModelSamplingDiscrete",
    "description": "",
    "category": "advanced/model",
    "output_node": false
  },
  "ModelSamplingContinuousEDM": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "sampling": [
          [
            "v_prediction",
            "edm_playground_v2.5",
            "eps"
          ]
        ],
        "sigma_max": [
          "FLOAT",
          {
            "default": 120.0,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.001,
            "round": false
          }
        ],
        "sigma_min": [
          "FLOAT",
          {
            "default": 0.002,
            "min": 0.0,
            "max": 1000.0,
            "step": 0.001,
            "round": false
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "ModelSamplingContinuousEDM",
    "display_name": "ModelSamplingContinuousEDM",
    "description": "",
    "category": "advanced/model",
    "output_node": false
  },
  "ModelSamplingStableCascade": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "shift": [
          "FLOAT",
          {
            "default": 2.0,
            "min": 0.0,
            "max": 100.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "ModelSamplingStableCascade",
    "display_name": "ModelSamplingStableCascade",
    "description": "",
    "category": "advanced/model",
    "output_node": false
  },
  "RescaleCFG": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "multiplier": [
          "FLOAT",
          {
            "default": 0.7,
            "min": 0.0,
            "max": 1.0,
            "step": 0.01
          }
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "RescaleCFG",
    "display_name": "RescaleCFG",
    "description": "",
    "category": "advanced/model",
    "output_node": false
  },
  "PatchModelAddDownscale": {
    "input": {
      "required": {
        "model": [
          "MODEL"
        ],
        "block_number": [
          "INT",
          {
            "default": 3,
            "min": 1,
            "max": 32,
            "step": 1
          }
        ],
        "downscale_factor": [
          "FLOAT",
          {
            "default": 2.0,
            "min": 0.1,
            "max": 9.0,
            "step": 0.001
          }
        ],
        "start_percent": [
          "FLOAT",
          {
            "default": 0.0,
            "min": 0.0,
            "max": 1.0,
            "step": 0.001
          }
        ],
        "end_percent": [
          "FLOAT",
          {
            "default": 0.35,
            "min": 0.0,
            "max": 1.0,
            "step": 0.001
          }
        ],
        "downscale_after_skip": [
          "BOOLEAN",
          {
            "default": true
          }
        ],
        "downscale_method": [
          [
            "bicubic",
            "nearest-exact",
            "bilinear",
            "area",
            "bislerp"
          ]
        ],
        "upscale_method": [
          [
            "bicubic",
            "nearest-exact",
            "bilinear",
            "area",
            "bislerp"
          ]
        ]
      }
    },
    "output": [
      "MODEL"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "MODEL"
    ],
    "name": "PatchModelAddDownscale",
    "display_name": "PatchModelAddDownscale (Kohya Deep Shrink)",
    "description": "",
    "category": "_for_testing",
    "output_node": false
  },
  "ImageCrop": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "width": [
          "INT",
          {
            "default": 512,
            "min": 1,
            "max": 16384,
            "step": 1
          }
        ],
        "height": [
          "INT",
          {
            "default": 512,
            "min": 1,
            "max": 16384,
            "step": 1
          }
        ],
        "x": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ],
        "y": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 16384,
            "step": 1
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageCrop",
    "display_name": "ImageCrop",
    "description": "",
    "category": "image/transform",
    "output_node": false
  },
  "RepeatImageBatch": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "amount": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 4096
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "RepeatImageBatch",
    "display_name": "RepeatImageBatch",
    "description": "",
    "category": "image/batch",
    "output_node": false
  },
  "ImageFromBatch": {
    "input": {
      "required": {
        "image": [
          "IMAGE"
        ],
        "batch_index": [
          "INT",
          {
            "default": 0,
            "min": 0,
            "max": 4095
          }
        ],
        "length": [
          "INT",
          {
            "default": 1,
            "min": 1,
            "max": 4096
          }
        ]
      }
    },
    "output": [
      "IMAGE"
    ],
    "output_is_list": [
      false
    ],
    "output_name": [
      "IMAGE"
    ],
    "name": "ImageFromBatch",
    "display_name": "ImageFromBatch",
    "description": "",
    "category": "image/batch",
    "output_node": false
  },
  "SaveAnimatedWEBP": {
    "input": {
      "required": {
        "images": [
          "IMAGE"
        ],
        "filename_prefix": [
          "STRING",
          {
            "default": "ComfyUI"
          }
        ],
        "fps": [
          "FLOAT",
          {
            "default": 6.0,
            "min": 0.01,
            "max": 1000.0,
            "step": 0.01
          }
        ],
        "lossless": [
          "BOOLEAN",
          {
            "default": true
          }
        ],
        "quality": [
          "INT",
          {
            "default": 80,
            "min": 0,
            "max": 100
          }
        ],
        "method": [
          [
            "default",
            "fastest",
            "slowest"
          ]
        ]
      },
      "hidden": {
        "prompt": "PROMPT",
        "extra_pnginfo": "EXTRA_PNGINFO"
      }
    },
    "output": [],
    "output_is_list": [],
    "output_name": [],
    "name": "SaveAnimatedWEBP",
    "display_name": "SaveAnimatedWEBP",
    "description": "",
    "category": "image/animation",
    "output_node": true
  },
  "SaveAnimatedPNG": {
    "input": {
      "required": {
        "images": [
          "IMAGE"
        ],
        "filename_prefix": [
          "STRING",
          {
            "default": "ComfyUI"
          }
        ],
        "fps": [
          "FLOAT",
          {
            "default": 6.0,
            "min": 0.01,
            "max": 1000.0,
            "step": 0.01
          }
        ],
        "compress_level": [
          "INT",
          {
            "default": 4,
            "min": 0,
            "max": 9
          }
        ]
      },
      "hidden": {
        "prompt": "PROMPT",
        "extra_pnginfo": "EXTRA_PNGINFO"
      }
    },
    "output": [],
    "output_is_list": [],
    "output_name": [],
    "name": "SaveAnimatedPNG",
    "display_name": "SaveAnimatedPNG",
    "description": "",
    "category": "image/animation",
    "output_node": true
  },
  "ImageOnlyCheckpointLoader": {
    "input": {
      "required": {
        "ckpt_name": [
Download .txt
gitextract_m15fhcc9/

├── .eslintrc.js
├── .gitignore
├── .prettierrc
├── .run/
│   └── Comfy-server.run.xml
├── Dockerfile
├── README.md
├── docker-compose.yml.example
├── init.sql
├── nest-cli.json
├── package.json
├── pm2.config.js
├── src/
│   ├── app.controller.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   ├── auth/
│   │   ├── auth.controller.ts
│   │   ├── auth.guard.ts
│   │   ├── auth.module.ts
│   │   ├── auth.service.ts
│   │   └── constants.ts
│   ├── cache/
│   │   ├── cache.controller.ts
│   │   ├── cache.module.ts
│   │   └── cache.service.ts
│   ├── draw/
│   │   ├── DrawCosumer.ts
│   │   ├── data/
│   │   │   ├── AImodel_api.json
│   │   │   ├── DrawConfig.ts
│   │   │   ├── aistudio_api.json
│   │   │   ├── api_matting.json
│   │   │   ├── api_removebg.json
│   │   │   ├── api_upscale.json
│   │   │   ├── api_upscale_detailfix.json
│   │   │   ├── api_wechat_img2imgi.json
│   │   │   ├── impaiting_api.json
│   │   │   ├── objectInfo.json
│   │   │   ├── test.json
│   │   │   ├── text2imgapi.json
│   │   │   ├── workflow_api_faceswap.ts
│   │   │   ├── workflow_api_hdfix_4.ts
│   │   │   ├── workflow_api_image2img.json
│   │   │   ├── workflow_api_image2img.ts
│   │   │   ├── workflow_api_img2video.json
│   │   │   ├── workflow_api_img2video.ts
│   │   │   ├── workflow_api_inpainting.json
│   │   │   ├── workflow_api_inpainting.ts
│   │   │   ├── workflow_api_matting.json
│   │   │   ├── workflow_api_matting.ts
│   │   │   ├── workflow_api_model.ts
│   │   │   ├── workflow_api_removebg.json
│   │   │   ├── workflow_api_removebg.ts
│   │   │   ├── workflow_api_tagger.ts
│   │   │   ├── workflow_api_text2img.json
│   │   │   └── workflow_api_text2img.ts
│   │   ├── draw.controller.ts
│   │   ├── draw.module.ts
│   │   └── draw.service.ts
│   ├── file/
│   │   ├── file.controller.ts
│   │   ├── file.module.ts
│   │   └── file.service.ts
│   ├── main.ts
│   ├── middleware/
│   │   └── XML.middleware.ts
│   ├── oneapi/
│   │   ├── tokens/
│   │   │   ├── dto/
│   │   │   │   ├── create-token.dto.ts
│   │   │   │   └── update-token.dto.ts
│   │   │   ├── entities/
│   │   │   │   └── token.entity.ts
│   │   │   ├── tokens.controller.ts
│   │   │   ├── tokens.module.ts
│   │   │   └── tokens.service.ts
│   │   └── users/
│   │       ├── dto/
│   │       │   ├── create-user.dto.ts
│   │       │   └── update-user.dto.ts
│   │       ├── entities/
│   │       │   └── user.entity.ts
│   │       ├── users.controller.ts
│   │       ├── users.module.ts
│   │       └── users.service.ts
│   ├── tweet/
│   │   ├── dto/
│   │   │   ├── create-tweet.dto.ts
│   │   │   └── update-tweet.dto.ts
│   │   ├── entities/
│   │   │   └── tweet.schema.ts
│   │   ├── tweet.controller.ts
│   │   ├── tweet.module.ts
│   │   └── tweet.service.ts
│   ├── users/
│   │   ├── dto/
│   │   │   ├── create-user.dto.ts
│   │   │   └── update-user.dto.ts
│   │   ├── schema/
│   │   │   └── user.schema.ts
│   │   ├── users.controller.ts
│   │   ├── users.module.ts
│   │   └── users.service.ts
│   ├── wechat-auth/
│   │   ├── wechat-auth.controller.ts
│   │   ├── wechat-auth.module.ts
│   │   └── wechat-auth.service.ts
│   └── ws/
│       └── ws.gateway.ts
├── tsconfig.build.json
└── tsconfig.json
Download .txt
SYMBOL INDEX (222 symbols across 48 files)

FILE: src/app.controller.ts
  class AppController (line 6) | class AppController {
    method constructor (line 7) | constructor(
    method getHello (line 13) | getHello(): string {
    method test (line 17) | test(): string {

FILE: src/app.module.ts
  class AppModule (line 81) | class AppModule implements NestModule {
    method configure (line 82) | configure(consumer: MiddlewareConsumer) {

FILE: src/app.service.ts
  class AppService (line 4) | class AppService {
    method getHello (line 7) | getHello(): string {

FILE: src/auth/auth.controller.ts
  class AuthController (line 14) | class AuthController {
    method constructor (line 15) | constructor(private authService: AuthService) {}
    method signIn (line 42) | signIn(

FILE: src/auth/auth.guard.ts
  class AuthGuard (line 18) | class AuthGuard implements CanActivate {
    method constructor (line 19) | constructor(private jwtService: JwtService) {}
    method canActivate (line 21) | async canActivate(context: ExecutionContext): Promise<boolean> {
    method extractTokenFromHeader (line 39) | private extractTokenFromHeader(request: Request): string | undefined {

FILE: src/auth/auth.module.ts
  class AuthModule (line 21) | class AuthModule {}

FILE: src/auth/auth.service.ts
  class AuthService (line 6) | class AuthService {
    method constructor (line 7) | constructor(
    method authToken (line 12) | async authToken(username: string, pass: string): Promise<any> {

FILE: src/cache/cache.controller.ts
  class CacheController (line 5) | class CacheController {
    method constructor (line 6) | constructor(private readonly cacheService: CacheService) {}

FILE: src/cache/cache.module.ts
  class CacheModule (line 23) | class CacheModule {}

FILE: src/cache/cache.service.ts
  class CacheService (line 6) | class CacheService {
    method constructor (line 8) | constructor(
    method root (line 16) | async root(): Promise<boolean> {
    method get (line 21) | async get(key: string): Promise<any> {
    method set (line 35) | async set(key: string, value: any, second?: number) {
    method del (line 40) | async del(key: string) {
    method flushall (line 44) | async flushall() {

FILE: src/draw/DrawCosumer.ts
  class DrawConsumer (line 16) | class DrawConsumer {
    method constructor (line 17) | constructor(
    method drawtask (line 28) | async drawtask(job: Job): Promise<string> {
    method drawTaskExcu (line 47) | async drawTaskExcu(job: Job, server_url: string) {
    method websocketInit (line 171) | async websocketInit(server_url: string): Promise<boolean> {
    method validateWsconnect (line 204) | validateWsconnect() {
    method onActive (line 214) | async onActive(job: Job) {
    method OnQueueCompleted (line 227) | OnQueueCompleted(job: Job) {
    method testTask (line 233) | private async testTask() {

FILE: src/draw/data/DrawConfig.ts
  type ComfyAPIType (line 44) | interface ComfyAPIType {
  type DrawTask (line 59) | interface DrawTask {

FILE: src/draw/draw.controller.ts
  class DrawController (line 8) | class DrawController {
    method constructor (line 9) | constructor(private readonly drawService: DrawService) {}
    method getObjectinfo (line 16) | async getObjectinfo() {
    method submitDrawTask (line 69) | async submitDrawTask(@Body() data: DrawTask) {
    method text2img (line 126) | async text2img(
    method img2img (line 205) | async img2img(
    method img2video (line 272) | async img2video(
    method segmentAnything (line 327) | async segmentAnything(
    method inpainting (line 387) | async inpainting(
    method removebg (line 440) | async removebg(
    method hdfix (line 493) | async hdfix(
    method faceswap (line 553) | async faceswap(
    method model (line 618) | async model(
    method image2tagger (line 672) | async image2tagger(
    method addBlackList (line 705) | async addBlackList(@Query('client_id') client_id: string) {
    method getBlackList (line 715) | async getBlackList() {
    method removeBlackList (line 736) | async removeBlackList(@Query('client_id') uid: string) {

FILE: src/draw/draw.module.ts
  class DrawModule (line 33) | class DrawModule {}

FILE: src/draw/draw.service.ts
  type WeChatDrawModel (line 35) | type WeChatDrawModel = 'text2img' | 'image2img' | 'img2video';
  type SD3AspectRatio (line 36) | type SD3AspectRatio =
  type SD3StylePreset (line 45) | type SD3StylePreset =
  class DrawService (line 65) | class DrawService {
    method constructor (line 75) | constructor(
    method sendToQueue (line 114) | async sendToQueue(data: DrawTask) {
    method submitDrawTask (line 132) | async submitDrawTask(data: DrawTask): Promise<string> {
    method getQueueLength (line 188) | async getQueueLength() {
    method isInQueue (line 196) | async isInQueue(uid: string) {
    method getObject_info (line 210) | async getObject_info() {
    method sendTackprompt (line 233) | async sendTackprompt(comfyuihttpUrl: string, data: any): Promise<strin...
    method getAccessToken (line 248) | async getAccessToken() {
    method wechatDrawFromRemoteServer (line 269) | async wechatDrawFromRemoteServer(
    method text2img (line 321) | async text2img(
    method image2img (line 390) | async image2img(
    method image2video (line 466) | async image2video(
    method segmentAnything (line 524) | async segmentAnything(
    method inpainting (line 563) | async inpainting(
    method removebg (line 610) | async removebg(
    method workflowApiHdfix4 (line 648) | async workflowApiHdfix4(
    method image2tagger (line 675) | async image2tagger(
    method faceSwap (line 702) | async faceSwap(
    method model (line 736) | async model(
    method text2imgSD3 (line 786) | async text2imgSD3(params: {
    method Initalize (line 860) | async Initalize() {
    method addBlackList (line 887) | async addBlackList(uid: string) {
    method isInBlackList (line 899) | async isInBlackList(uid: string) {
    method removeBlackList (line 907) | async removeBlackList(uid: string) {
    method getBlackList (line 917) | async getBlackList() {

FILE: src/file/file.controller.ts
  class FileController (line 5) | class FileController {
    method constructor (line 6) | constructor(private readonly fileService: FileService) {}
    method upload (line 8) | async upload() {

FILE: src/file/file.module.ts
  class FileModule (line 10) | class FileModule {}

FILE: src/file/file.service.ts
  constant OSS (line 5) | const OSS = require('ali-oss');
  class FileService (line 8) | class FileService {
    method constructor (line 9) | constructor(
    method urlToFile (line 20) | async urlToFile(url, fileName, mimeType): Promise<File> {
    method urlToArrayBuffer (line 33) | async urlToArrayBuffer(url: string): Promise<ArrayBuffer> {
    method uploadFileToOSS (line 46) | async uploadFileToOSS(
    method uploadBufferToOSS (line 94) | async uploadBufferToOSS(

FILE: src/main.ts
  function bootstrap (line 6) | async function bootstrap() {

FILE: src/middleware/XML.middleware.ts
  class XMLMiddleware (line 10) | class XMLMiddleware implements NestMiddleware {
    method use (line 11) | async use(req: Request, res: Response, next: NextFunction) {

FILE: src/oneapi/tokens/dto/create-token.dto.ts
  class CreateTokenDto (line 3) | class CreateTokenDto extends Token {}

FILE: src/oneapi/tokens/dto/update-token.dto.ts
  class UpdateTokenDto (line 4) | class UpdateTokenDto extends PartialType(CreateTokenDto) {}

FILE: src/oneapi/tokens/entities/token.entity.ts
  class Token (line 4) | class Token {

FILE: src/oneapi/tokens/tokens.controller.ts
  class TokensController (line 8) | class TokensController {
    method constructor (line 9) | constructor(private readonly tokensService: TokensService) {}
    method create (line 12) | create(@Body() createTokenDto: CreateTokenDto) {
    method findAll (line 17) | findAll() {
    method findOne (line 22) | findOne(@Param('id') id: string) {
    method update (line 27) | update(@Param('id') id: string, @Body() updateTokenDto: UpdateTokenDto) {
    method remove (line 32) | remove(@Param('id') id: string) {

FILE: src/oneapi/tokens/tokens.module.ts
  class TokensModule (line 12) | class TokensModule {}

FILE: src/oneapi/tokens/tokens.service.ts
  class TokensService (line 9) | class TokensService {
    method constructor (line 10) | constructor(
    method create (line 14) | async create(createTokenDto: CreateTokenDto) {
    method findAll (line 26) | findAll() {
    method findOne (line 30) | async findOne(id: number) {
    method update (line 34) | update(id: number, updateTokenDto: UpdateTokenDto) {
    method remove (line 38) | remove(id: number) {

FILE: src/oneapi/users/dto/create-user.dto.ts
  class CreateUserDto (line 3) | class CreateUserDto extends OneAPIUser {}

FILE: src/oneapi/users/dto/update-user.dto.ts
  class UpdateUserDto (line 4) | class UpdateUserDto extends PartialType(CreateUserDto) {}

FILE: src/oneapi/users/entities/user.entity.ts
  class OneAPIUser (line 10) | class OneAPIUser extends BaseEntity {

FILE: src/oneapi/users/users.controller.ts
  class UsersController (line 16) | class UsersController {
    method constructor (line 17) | constructor(private readonly oneAPIUsersService: OneAPIUsersService) {}
    method create (line 20) | create(@Body() user: OneAPIUser) {
    method CreateByUniId (line 29) | async CreateByUniId(@Body() user: OneAPIUser) {
    method findAll (line 38) | findAll() {
    method findOne (line 47) | findOne(@Param('id') id: string) {
    method update (line 56) | update(@Param('id') id: string, @Body() user: OneAPIUser) {
    method remove (line 65) | remove(@Param('id') id: string) {

FILE: src/oneapi/users/users.module.ts
  class OneAPIUsersModule (line 13) | class OneAPIUsersModule {}

FILE: src/oneapi/users/users.service.ts
  class OneAPIUsersService (line 8) | class OneAPIUsersService {
    method constructor (line 10) | constructor(
    method create (line 14) | async create(user: OneAPIUser) {
    method findAll (line 18) | findAll() {
    method findOne (line 22) | findOne(id: number) {
    method findOneByUniId (line 25) | async findOneByUniId(github_id: string) {
    method CreateByUniId (line 34) | async CreateByUniId(user: OneAPIUser) {
    method update (line 52) | update(id: number, user: OneAPIUser) {
    method remove (line 57) | remove(id: number) {

FILE: src/tweet/dto/create-tweet.dto.ts
  class CreateTweetDto (line 3) | class CreateTweetDto extends Tweet{}

FILE: src/tweet/dto/update-tweet.dto.ts
  class UpdateTweetDto (line 4) | class UpdateTweetDto extends PartialType(CreateTweetDto) {}

FILE: src/tweet/entities/tweet.schema.ts
  type UserDocument (line 5) | type UserDocument = HydratedDocument<Tweet>;
  class Tweet (line 7) | class Tweet {
  type TweetProject (line 60) | interface TweetProject {
  type TweetData (line 71) | interface TweetData {

FILE: src/tweet/tweet.controller.ts
  class TweetController (line 9) | class TweetController {
    method constructor (line 10) | constructor(private readonly tweetService: TweetService) {}
    method savePrject (line 16) | savePrject(@Body() createTweetDto: CreateTweetDto) {
    method findAll (line 23) | findAll() {
    method findOne (line 28) | findOne(@Param('id') id: string) {
    method update (line 33) | update(@Param('id') id: string, @Body() updateTweetDto: UpdateTweetDto) {
    method remove (line 38) | remove(@Param('id') id: string) {

FILE: src/tweet/tweet.module.ts
  class TweetModule (line 14) | class TweetModule {}

FILE: src/tweet/tweet.service.ts
  class TweetService (line 9) | class TweetService {
    method constructor (line 10) | constructor(@InjectModel(Tweet.name) private tweetModel: Model<Tweet>) {}
    method create (line 11) | create(createTweetDto: CreateTweetDto) {
    method savePrject (line 21) | async savePrject(user_id: string, project: TweetProject) {
    method getData (line 58) | async getData(user_id: string) {
    method findAll (line 66) | findAll() {
    method findOne (line 70) | async findOne(id: string) {
    method update (line 74) | update(id: number, updateTweetDto: UpdateTweetDto) {
    method remove (line 78) | remove(id: number) {

FILE: src/users/dto/create-user.dto.ts
  class CreateUserDto (line 3) | class CreateUserDto extends User{}

FILE: src/users/dto/update-user.dto.ts
  class UpdateUserDto (line 4) | class UpdateUserDto extends PartialType(CreateUserDto) {}

FILE: src/users/schema/user.schema.ts
  type UserDocument (line 5) | type UserDocument = HydratedDocument<User>;
  class User (line 8) | class User {

FILE: src/users/users.controller.ts
  class UsersController (line 20) | class UsersController {
    method constructor (line 21) | constructor(
    method createUser (line 26) | createUser(@Body() createUserDto: CreateUserDto) {
    method loginBywechat (line 34) | loginBywechat(@Body() createUserDto: CreateUserDto) {
    method registerByUsername (line 43) | registerByUsername(@Body() createUserDto: CreateUserDto) {
    method loginByUsername (line 52) | loginByUsername(@Body() createUserDto: CreateUserDto) {
    method findAll (line 57) | findAll() {
    method findOne (line 62) | findOne(@Param('id') id: string) {
    method update (line 67) | update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
    method remove (line 72) | remove(@Param('id') id: string) {

FILE: src/users/users.module.ts
  class UsersModule (line 16) | class UsersModule {}

FILE: src/users/users.service.ts
  type RegistRes (line 13) | type RegistRes = {
  class UsersService (line 20) | class UsersService {
    method constructor (line 21) | constructor(
    method create (line 30) | async create(createUserDto: CreateUserDto) {
    method registerByUsername (line 63) | async registerByUsername(createUserDto: CreateUserDto) {
    method loginBywechat (line 91) | async loginBywechat(createUserDto: CreateUserDto) {
    method loginByUsername (line 99) | async loginByUsername(createUserDto: CreateUserDto) {
    method autoLogin (line 127) | async autoLogin(user: User) {
    method findAll (line 131) | findAll() {
    method findOne (line 135) | findOne(id: string) {
    method findByUsername (line 139) | async findByUsername(username: string) {
    method findByEmail (line 143) | async findByEmail(email: string) {
    method findByWxUnionid (line 147) | async findByWxUnionid(wx_unionid: string) {
    method update (line 151) | async update(id: string, updateUserDto: UpdateUserDto) {
    method remove (line 156) | async remove(id: string) {
    method hashPassword (line 163) | async hashPassword(password: string) {
    method comparePassword (line 168) | async comparePassword(password: string, hash: string) {
    method createToken (line 181) | async createToken(_id: string, username: string) {
    method updateToken (line 194) | async updateToken(_id, username) {
    method getUserInfoByToken (line 204) | private async getUserInfoByToken(token: string) {
    method validateToken (line 212) | async validateToken(token: string): Promise<User | false> {

FILE: src/wechat-auth/wechat-auth.controller.ts
  class WechatAuthController (line 21) | class WechatAuthController {
    method constructor (line 22) | constructor(
    method getUserInfo (line 41) | async getUserInfo(@Query('code') code: string) {
    method loginByOpenid (line 90) | async loginByOpenid(
    method hangleMessage (line 156) | async hangleMessage(
    method receiveMessage (line 333) | receiveMessage(

FILE: src/wechat-auth/wechat-auth.module.ts
  class WechatAuthModule (line 15) | class WechatAuthModule {}

FILE: src/wechat-auth/wechat-auth.service.ts
  class WechatAuthService (line 9) | class WechatAuthService {
    method constructor (line 10) | constructor(
    method getAccess_token (line 29) | private async getAccess_token(code) {
    method getUserinfo (line 47) | async getUserinfo(code: string) {
    method getMediaId (line 71) | async getMediaId(imageUrl: string, type?: string): Promise<string> {
    method getAccessToken (line 103) | private async getAccessToken(): Promise<string> {
    method sendServiceImageMessge (line 133) | async sendServiceImageMessge(
    method saveCommand (line 168) | async saveCommand(command: string, openid: string) {
    method getCommand (line 176) | async getCommand(openid: string) {

FILE: src/ws/ws.gateway.ts
  class WsGateway (line 18) | class WsGateway implements OnGatewayInit, OnGatewayConnection {
    method constructor (line 19) | constructor(
    method afterInit (line 25) | afterInit(server: any) {
    method handleConnection (line 33) | handleConnection(client: Socket) {
    method handleMessage (line 38) | handleMessage(client: any, payload: any): string {
    method handleDrawMessage (line 44) | async handleDrawMessage(client: any, payload: any): Promise<string> {
    method sendSystemMessage (line 88) | sendSystemMessage(socketid: string, message: string) {
Condensed preview — 89 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,458K chars).
[
  {
    "path": ".eslintrc.js",
    "chars": 723,
    "preview": "module.exports = {\n  parser: '@typescript-eslint/parser',\n  parserOptions: {\n    project: 'tsconfig.json',\n    tsconfigR"
  },
  {
    "path": ".gitignore",
    "chars": 459,
    "preview": "# compiled output\n/dist\n/node_modules\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\npnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": ".prettierrc",
    "chars": 73,
    "preview": "{\n  \"singleQuote\": true,\n  \"trailingComma\": \"all\",\n  \"endOfline\":\"auto\"\n}"
  },
  {
    "path": ".run/Comfy-server.run.xml",
    "chars": 2629,
    "preview": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Comfy-server\" type=\"docker-depl"
  },
  {
    "path": "Dockerfile",
    "chars": 549,
    "preview": "\n# 第二阶段\nFROM node:20.12.1 AS runtime-stage\n#2、作者\nMAINTAINER bobovinch\n# 创建工作目录\nRUN mkdir -p /app\nWORKDIR /app\n\n# 复制构建阶段生"
  },
  {
    "path": "README.md",
    "chars": 4854,
    "preview": "<p align=\"center\">\n  <a href=\"http://nestjs.com/\" target=\"blank\"><img src=\"https://nestjs.com/img/logo-small.svg\" width="
  },
  {
    "path": "docker-compose.yml.example",
    "chars": 3372,
    "preview": "# 非 host 版本, 不使用本机代理\n# (不懂 Docker 的,只需要关心 OPENAI_BASE_URL 和 CHAT_API_KEY 即可!)\nversion: '3'\nservices:\n  comfy-server:\n   "
  },
  {
    "path": "init.sql",
    "chars": 23,
    "preview": "CREATE DATABASE oneapi;"
  },
  {
    "path": "nest-cli.json",
    "chars": 171,
    "preview": "{\n  \"$schema\": \"https://json.schemastore.org/nest-cli\",\n  \"collection\": \"@nestjs/schematics\",\n  \"sourceRoot\": \"src\",\n  \""
  },
  {
    "path": "package.json",
    "chars": 3264,
    "preview": "{\n  \"name\": \"myserver\",\n  \"version\": \"0.0.1\",\n  \"description\": \"<p align=\\\"center\\\">\\r   <a href=\\\"http://nestjs.com/\\\" "
  },
  {
    "path": "pm2.config.js",
    "chars": 321,
    "preview": "/**\n * this is a pm2 starter config file\n * @type {{apps: [{watch: boolean, name: string, env: {NODE_ENV: string}, scrip"
  },
  {
    "path": "src/app.controller.ts",
    "chars": 462,
    "preview": "import { Controller, Get, Inject } from '@nestjs/common';\nimport { AppService } from './app.service';\nimport { DrawServi"
  },
  {
    "path": "src/app.module.ts",
    "chars": 2678,
    "preview": "import {\n  MiddlewareConsumer,\n  Module,\n  NestModule,\n  RequestMethod,\n} from '@nestjs/common';\nimport { AppController "
  },
  {
    "path": "src/app.service.ts",
    "chars": 225,
    "preview": "import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n  // 是否启用保存绘画历史记录\n  public Draw_Sa"
  },
  {
    "path": "src/auth/auth.controller.ts",
    "chars": 1001,
    "preview": "import { AuthService } from './auth.service';\nimport {\n  Get,\n  Query,\n  Body,\n  Controller,\n  Post,\n  HttpCode,\n  HttpS"
  },
  {
    "path": "src/auth/auth.guard.ts",
    "chars": 1393,
    "preview": "import {\n  CanActivate,\n  ExecutionContext,\n  Injectable,\n  UnauthorizedException,\n} from '@nestjs/common';\nimport { Jwt"
  },
  {
    "path": "src/auth/auth.module.ts",
    "chars": 570,
    "preview": "import { Module } from '@nestjs/common';\nimport { AuthController } from './auth.controller';\nimport { AuthService } from"
  },
  {
    "path": "src/auth/auth.service.ts",
    "chars": 727,
    "preview": "import { Injectable, UnauthorizedException } from '@nestjs/common';\nimport { UsersService } from '../users/users.service"
  },
  {
    "path": "src/auth/constants.ts",
    "chars": 75,
    "preview": "export const jwtConstants = {\n  secret: 'this is a very secret secret',\n};\n"
  },
  {
    "path": "src/cache/cache.controller.ts",
    "chars": 210,
    "preview": "import { Controller } from '@nestjs/common';\nimport { CacheService } from './cache.service';\n\n@Controller('cache')\nexpor"
  },
  {
    "path": "src/cache/cache.module.ts",
    "chars": 754,
    "preview": "import { Module, Global } from '@nestjs/common';\nimport { CacheService } from './cache.service';\nimport { CacheControlle"
  },
  {
    "path": "src/cache/cache.service.ts",
    "chars": 1229,
    "preview": "import { Injectable } from '@nestjs/common';\nimport Redis from 'ioredis';\nimport { ConfigService } from '@nestjs/config'"
  },
  {
    "path": "src/draw/DrawCosumer.ts",
    "chars": 7268,
    "preview": "import {\n  Process,\n  Processor,\n  OnQueueActive,\n  OnQueueCompleted,\n} from '@nestjs/bull';\nimport { Job } from 'bull';"
  },
  {
    "path": "src/draw/data/AImodel_api.json",
    "chars": 13106,
    "preview": "{\n  \"42\": {\n    \"inputs\": {\n      \"upscale_method\": \"nearest-exact\",\n      \"scale_by\": 1,\n      \"image\": [\n        \"170\""
  },
  {
    "path": "src/draw/data/DrawConfig.ts",
    "chars": 851,
    "preview": "/**\n * 绘画模块配置参数\n */\n\nexport const drawConfig={\n  defaultTimeOut: 60, //默认任务超时时间\n};\n\nexport const ApiTimeOut = [\n  {\n    "
  },
  {
    "path": "src/draw/data/aistudio_api.json",
    "chars": 11870,
    "preview": "{\n  \"9\": {\n    \"inputs\": {\n      \"ipadapter_file\": \"ip-adapter-faceid-plusv2_sd15.bin\"\n    },\n    \"class_type\": \"IPAdapt"
  },
  {
    "path": "src/draw/data/api_matting.json",
    "chars": 2312,
    "preview": "{\n  \"5\": {\n    \"inputs\": {\n      \"prompt\": [\n        \"19\",\n        0\n      ],\n      \"threshold\": 0.31,\n      \"sam_model\""
  },
  {
    "path": "src/draw/data/api_removebg.json",
    "chars": 1470,
    "preview": "{\n  \"62\": {\n    \"inputs\": {\n      \"image_path\": \"E:\\\\ComfyUI_windows_portable\\\\ComfyUI\\\\input\\\\canvasimage (35).png\",\n  "
  },
  {
    "path": "src/draw/data/api_upscale.json",
    "chars": 1328,
    "preview": "{\n  \"5\": {\n    \"inputs\": {\n      \"output_path\": \"[time(%Y-%m-%d)]\",\n      \"filename_prefix\": [\n        \"16\",\n        0\n "
  },
  {
    "path": "src/draw/data/api_upscale_detailfix.json",
    "chars": 3023,
    "preview": "{\n  \"5\": {\n    \"inputs\": {\n      \"output_path\": \"[time(%Y-%m-%d)]\",\n      \"filename_prefix\": [\n        \"16\",\n        0\n "
  },
  {
    "path": "src/draw/data/api_wechat_img2imgi.json",
    "chars": 10592,
    "preview": "{\n  \"18\": {\n    \"inputs\": {\n      \"text\": \"paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), "
  },
  {
    "path": "src/draw/data/impaiting_api.json",
    "chars": 10793,
    "preview": "{\n  \"18\": {\n    \"inputs\": {\n      \"text\": \"paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), "
  },
  {
    "path": "src/draw/data/objectInfo.json",
    "chars": 1918213,
    "preview": "{\n  \"KSampler\": {\n    \"input\": {\n      \"required\": {\n        \"model\": [\n          \"MODEL\"\n        ],\n        \"seed\": [\n "
  },
  {
    "path": "src/draw/data/test.json",
    "chars": 10319,
    "preview": "{\n  \"source\": \"web\",\n  \"prompt\": {\n    \"18\": {\n      \"inputs\": {\n        \"text\": \"paintings, sketches, (worst quality:2)"
  },
  {
    "path": "src/draw/data/text2imgapi.json",
    "chars": 10407,
    "preview": "{\n  \"18\": {\n    \"inputs\": {\n      \"text\": \"paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), "
  },
  {
    "path": "src/draw/data/workflow_api_faceswap.ts",
    "chars": 2704,
    "preview": "export const FaceSwap = {\n  '63': {\n    inputs: {\n      enabled: true,\n      swap_model: 'inswapper_128.onnx',\n      fac"
  },
  {
    "path": "src/draw/data/workflow_api_hdfix_4.ts",
    "chars": 1505,
    "preview": "export const workflowApiHdfix4 = {\n  '5': {\n    inputs: {\n      output_path: '[time(%Y-%m-%d)]',\n      filename_prefix: "
  },
  {
    "path": "src/draw/data/workflow_api_image2img.json",
    "chars": 11175,
    "preview": "{\n  \"18\": {\n    \"inputs\": {\n      \"text\": \"paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), "
  },
  {
    "path": "src/draw/data/workflow_api_image2img.ts",
    "chars": 4617,
    "preview": "export const image2img = {\n  '18': {\n    inputs: {\n      text: 'paintings, sketches, (worst quality:2), (low quality:2),"
  },
  {
    "path": "src/draw/data/workflow_api_img2video.json",
    "chars": 2934,
    "preview": "{\n  \"8\": {\n    \"inputs\": {\n      \"width\": [\n        \"36\",\n        2\n      ],\n      \"height\": [\n        \"36\",\n        1\n "
  },
  {
    "path": "src/draw/data/workflow_api_img2video.ts",
    "chars": 2458,
    "preview": "export const img2video = {\n  '8': {\n    inputs: {\n      width: ['36', 2],\n      height: ['36', 1],\n      video_frames: 1"
  },
  {
    "path": "src/draw/data/workflow_api_inpainting.json",
    "chars": 5100,
    "preview": "{\n  \"18\": {\n    \"inputs\": {\n      \"text\": \"paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), "
  },
  {
    "path": "src/draw/data/workflow_api_inpainting.ts",
    "chars": 4460,
    "preview": "export const inpainting = {\n  '18': {\n    inputs: {\n      text: 'paintings, sketches, (worst quality:2), (low quality:2)"
  },
  {
    "path": "src/draw/data/workflow_api_matting.json",
    "chars": 2734,
    "preview": "{\n  \"5\": {\n    \"inputs\": {\n      \"prompt\": [\n        \"67\",\n        0\n      ],\n      \"threshold\": 0.3,\n      \"sam_model\":"
  },
  {
    "path": "src/draw/data/workflow_api_matting.ts",
    "chars": 2380,
    "preview": "export const matting = {\n  '5': {\n    inputs: {\n      prompt: ['67', 0],\n      threshold: 0.3,\n      sam_model: ['6', 0]"
  },
  {
    "path": "src/draw/data/workflow_api_model.ts",
    "chars": 11267,
    "preview": "export const workflowApiModel = {\n  '63': {\n    inputs: {\n      samples: ['64', 0],\n      mask: ['170', 1],\n    },\n    c"
  },
  {
    "path": "src/draw/data/workflow_api_removebg.json",
    "chars": 1893,
    "preview": "{\n  \"62\": {\n    \"inputs\": {\n      \"image_path\": \"http://region-8.autodl.pro:23781/view?subfolder=2024-04-06&filename=R-C"
  },
  {
    "path": "src/draw/data/workflow_api_removebg.ts",
    "chars": 1719,
    "preview": "export const removebg = {\n  '62': {\n    inputs: {\n      image_path:\n        'http://region-8.autodl.pro:23781/view?subfo"
  },
  {
    "path": "src/draw/data/workflow_api_tagger.ts",
    "chars": 854,
    "preview": "export const workflowApiTagger = {\n  '10': {\n    inputs: {\n      image_path: './ComfyUI/input/example.png',\n      RGBA: "
  },
  {
    "path": "src/draw/data/workflow_api_text2img.json",
    "chars": 9503,
    "preview": "{\n  \"18\": {\n    \"inputs\": {\n      \"text\": \"paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), "
  },
  {
    "path": "src/draw/data/workflow_api_text2img.ts",
    "chars": 8645,
    "preview": "export const text2img = {\n  '18': {\n    inputs: {\n      text: 'paintings, sketches, (worst quality:2), (low quality:2), "
  },
  {
    "path": "src/draw/draw.controller.ts",
    "chars": 21720,
    "preview": "import { Get, Query, Body, Controller, Post } from '@nestjs/common';\nimport { DrawService } from './draw.service';\nimpor"
  },
  {
    "path": "src/draw/draw.module.ts",
    "chars": 1027,
    "preview": "import { Module } from '@nestjs/common';\nimport { DrawService } from './draw.service';\nimport { DrawController } from '."
  },
  {
    "path": "src/draw/draw.service.ts",
    "chars": 25302,
    "preview": "import { Injectable, Logger } from '@nestjs/common';\nimport { InjectQueue } from '@nestjs/bull';\nimport { Queue } from '"
  },
  {
    "path": "src/file/file.controller.ts",
    "chars": 788,
    "preview": "import { Controller, Get } from '@nestjs/common';\nimport { FileService } from './file.service';\n\n@Controller('file')\nexp"
  },
  {
    "path": "src/file/file.module.ts",
    "chars": 267,
    "preview": "import { Module } from '@nestjs/common';\nimport { FileService } from './file.service';\nimport { FileController } from '."
  },
  {
    "path": "src/file/file.service.ts",
    "chars": 3644,
    "preview": "import { Injectable } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport { nanoid } from 'nan"
  },
  {
    "path": "src/main.ts",
    "chars": 1016,
    "preview": "import { NestFactory } from '@nestjs/core';\nimport { AppModule } from './app.module';\nimport { SwaggerModule, DocumentBu"
  },
  {
    "path": "src/middleware/XML.middleware.ts",
    "chars": 1118,
    "preview": "import { Injectable, NestMiddleware } from '@nestjs/common';\nimport { NextFunction, Request, Response } from 'express';\n"
  },
  {
    "path": "src/oneapi/tokens/dto/create-token.dto.ts",
    "chars": 96,
    "preview": "import { Token } from '../entities/token.entity';\n\nexport class CreateTokenDto extends Token {}\n"
  },
  {
    "path": "src/oneapi/tokens/dto/update-token.dto.ts",
    "chars": 173,
    "preview": "import { PartialType } from '@nestjs/mapped-types';\nimport { CreateTokenDto } from './create-token.dto';\n\nexport class U"
  },
  {
    "path": "src/oneapi/tokens/entities/token.entity.ts",
    "chars": 675,
    "preview": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity({ name: 'tokens' })\nexport class Token {\n  @P"
  },
  {
    "path": "src/oneapi/tokens/tokens.controller.ts",
    "chars": 983,
    "preview": "import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';\nimport { TokensService } from './tok"
  },
  {
    "path": "src/oneapi/tokens/tokens.module.ts",
    "chars": 401,
    "preview": "import { Module } from '@nestjs/common';\nimport { TokensService } from './tokens.service';\nimport { TokensController } f"
  },
  {
    "path": "src/oneapi/tokens/tokens.service.ts",
    "chars": 1099,
    "preview": "import { Injectable } from '@nestjs/common';\nimport { CreateTokenDto } from './dto/create-token.dto';\nimport { UpdateTok"
  },
  {
    "path": "src/oneapi/users/dto/create-user.dto.ts",
    "chars": 104,
    "preview": "import { OneAPIUser } from '../entities/user.entity';\n\nexport class CreateUserDto extends OneAPIUser {}\n"
  },
  {
    "path": "src/oneapi/users/dto/update-user.dto.ts",
    "chars": 164,
    "preview": "import { PartialType } from '@nestjs/swagger';\nimport { CreateUserDto } from './create-user.dto';\n\nexport class UpdateUs"
  },
  {
    "path": "src/oneapi/users/entities/user.entity.ts",
    "chars": 1912,
    "preview": "import {\n  Entity,\n  Column,\n  PrimaryGeneratedColumn,\n  BaseEntity,\n} from 'typeorm';\nimport { ApiProperty } from '@nes"
  },
  {
    "path": "src/oneapi/users/users.controller.ts",
    "chars": 1511,
    "preview": "import {\n  Controller,\n  Get,\n  Post,\n  Body,\n  Patch,\n  Param,\n  Delete,\n} from '@nestjs/common';\nimport { OneAPIUsersS"
  },
  {
    "path": "src/oneapi/users/users.module.ts",
    "chars": 469,
    "preview": "import { Module } from '@nestjs/common';\nimport { OneAPIUsersService } from './users.service';\nimport { UsersController "
  },
  {
    "path": "src/oneapi/users/users.service.ts",
    "chars": 1559,
    "preview": "import { Injectable, Logger } from '@nestjs/common';\nimport { OneAPIUser } from './entities/user.entity';\n\nimport { Inje"
  },
  {
    "path": "src/tweet/dto/create-tweet.dto.ts",
    "chars": 95,
    "preview": "import { Tweet } from '../entities/tweet.schema';\n\nexport class CreateTweetDto extends Tweet{}\n"
  },
  {
    "path": "src/tweet/dto/update-tweet.dto.ts",
    "chars": 168,
    "preview": "import { PartialType } from '@nestjs/swagger';\nimport { CreateTweetDto } from './create-tweet.dto';\n\nexport class Update"
  },
  {
    "path": "src/tweet/entities/tweet.schema.ts",
    "chars": 1913,
    "preview": "import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';\nimport { HydratedDocument } from 'mongoose';\nimport { Ap"
  },
  {
    "path": "src/tweet/tweet.controller.ts",
    "chars": 1149,
    "preview": "import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';\nimport { TweetService } from './twee"
  },
  {
    "path": "src/tweet/tweet.module.ts",
    "chars": 455,
    "preview": "import { Module } from '@nestjs/common';\nimport { TweetService } from './tweet.service';\nimport { TweetController } from"
  },
  {
    "path": "src/tweet/tweet.service.ts",
    "chars": 2006,
    "preview": "import { Injectable } from '@nestjs/common';\nimport { CreateTweetDto } from './dto/create-tweet.dto';\nimport { UpdateTwe"
  },
  {
    "path": "src/users/dto/create-user.dto.ts",
    "chars": 89,
    "preview": "import { User } from '../schema/user.schema';\n\nexport class CreateUserDto extends User{}\n"
  },
  {
    "path": "src/users/dto/update-user.dto.ts",
    "chars": 164,
    "preview": "import { PartialType } from '@nestjs/swagger';\nimport { CreateUserDto } from './create-user.dto';\n\nexport class UpdateUs"
  },
  {
    "path": "src/users/schema/user.schema.ts",
    "chars": 1962,
    "preview": "import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';\nimport { HydratedDocument } from 'mongoose';\nimport { Ap"
  },
  {
    "path": "src/users/users.controller.ts",
    "chars": 1771,
    "preview": "import {\n  Query,\n  Controller,\n  Get,\n  Post,\n  Body,\n  Patch,\n  Param,\n  Delete,\n} from '@nestjs/common';\nimport { Use"
  },
  {
    "path": "src/users/users.module.ts",
    "chars": 544,
    "preview": "import { Module } from '@nestjs/common';\nimport { UsersService } from './users.service';\nimport { UsersController } from"
  },
  {
    "path": "src/users/users.service.ts",
    "chars": 5442,
    "preview": "import { Injectable } from '@nestjs/common';\nimport { CreateUserDto } from './dto/create-user.dto';\nimport { InjectModel"
  },
  {
    "path": "src/wechat-auth/wechat-auth.controller.ts",
    "chars": 9765,
    "preview": "import {\n  Body,\n  Controller,\n  Get,\n  HttpCode,\n  Logger,\n  Post,\n  Query,\n  Req,\n  Res,\n} from '@nestjs/common';\nimpo"
  },
  {
    "path": "src/wechat-auth/wechat-auth.module.ts",
    "chars": 574,
    "preview": "import { Module } from '@nestjs/common';\nimport { WechatAuthService } from './wechat-auth.service';\nimport { WechatAuthC"
  },
  {
    "path": "src/wechat-auth/wechat-auth.service.ts",
    "chars": 5176,
    "preview": "import { Injectable, Logger } from '@nestjs/common';\nimport axios from 'axios';\nimport { ConfigService } from '@nestjs/c"
  },
  {
    "path": "src/ws/ws.gateway.ts",
    "chars": 2547,
    "preview": "import {\n  SubscribeMessage,\n  WebSocketGateway,\n  OnGatewayInit,\n  OnGatewayConnection,\n} from '@nestjs/websockets';\nim"
  },
  {
    "path": "tsconfig.build.json",
    "chars": 97,
    "preview": "{\n  \"extends\": \"./tsconfig.json\",\n  \"exclude\": [\"node_modules\", \"test\", \"dist\", \"**/*spec.ts\"]\n}\n"
  },
  {
    "path": "tsconfig.json",
    "chars": 577,
    "preview": "{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"declaration\": true,\n    \"removeComments\": true,\n    \"emitDecorat"
  }
]

About this extraction

This page contains the full source code of the bobvinch/comfy-server GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 89 files (2.1 MB), approximately 554.3k tokens, and a symbol index with 222 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!