diff --git a/.gitbook/assets/image (1).png b/.gitbook/assets/image (1).png deleted file mode 100644 index 14285a0..0000000 Binary files a/.gitbook/assets/image (1).png and /dev/null differ diff --git a/.gitbook/assets/image (2).png b/.gitbook/assets/image (2).png deleted file mode 100644 index 2449a8e..0000000 Binary files a/.gitbook/assets/image (2).png and /dev/null differ diff --git a/.gitbook/assets/image (3).png b/.gitbook/assets/image (3).png deleted file mode 100644 index 74f9b92..0000000 Binary files a/.gitbook/assets/image (3).png and /dev/null differ diff --git a/.gitbook/assets/image (4).png b/.gitbook/assets/image (4).png deleted file mode 100644 index 4dc3e1e..0000000 Binary files a/.gitbook/assets/image (4).png and /dev/null differ diff --git a/.gitbook/assets/image (5).png b/.gitbook/assets/image (5).png deleted file mode 100644 index c261388..0000000 Binary files a/.gitbook/assets/image (5).png and /dev/null differ diff --git a/.gitbook/assets/image (6).png b/.gitbook/assets/image (6).png deleted file mode 100644 index 38f6e81..0000000 Binary files a/.gitbook/assets/image (6).png and /dev/null differ diff --git a/.gitbook/assets/image.png b/.gitbook/assets/image.png deleted file mode 100644 index 14285a0..0000000 Binary files a/.gitbook/assets/image.png and /dev/null differ diff --git a/.github/workflows/create-version.yml b/.github/workflows/create-version.yml new file mode 100644 index 0000000..28e80ba --- /dev/null +++ b/.github/workflows/create-version.yml @@ -0,0 +1,23 @@ +name: Create Version 🦉 + +on: + create: + # Triggered when a branch or tag is created + +jobs: + rdme-docs: + runs-on: ubuntu-latest + steps: + - name: Check out repo 📚 + uses: actions/checkout@v3 + + - name: Generate branch version string + run: | + BRANCH_NAME="${{ github.ref }}" + BRANCH_VERSION=$(echo $BRANCH_NAME | tr -cd '0-9.') + echo "BRANCH_VERSION=$BRANCH_VERSION" >> $GITHUB_ENV + + - name: Create version of docs for branch 🚀 + uses: readmeio/rdme@v8 + with: + rdme: versions:create v1.0-${{ env.BRANCH_VERSION }} --key=${{ secrets.README_API_KEY }} --fork=1.0 --main=false --beta=true --deprecated=false --isPublic=false diff --git a/.github/workflows/delete-version.yml b/.github/workflows/delete-version.yml new file mode 100644 index 0000000..4b6334a --- /dev/null +++ b/.github/workflows/delete-version.yml @@ -0,0 +1,24 @@ +name: Delete Version 🦉 + + +on: + pull_request: + types: [ closed ] + +jobs: + rdme-docs: + runs-on: ubuntu-latest + steps: + - name: Check out repo 📚 + uses: actions/checkout@v3 + + - name: Generate branch version string + run: | + BRANCH_NAME="${{ github.head_ref || github.ref || github.event.ref }}" + BRANCH_VERSION=$(echo $BRANCH_NAME | tr -cd '0-9.') + echo "BRANCH_VERSION=$BRANCH_VERSION" >> $GITHUB_ENV + + - name: Delete version of docs for branch (if branch is deleted) 🚀 + uses: readmeio/rdme@v8 + with: + rdme: versions:delete v1.0-${{ env.BRANCH_VERSION }}--key=${{ secrets.README_API_KEY }} diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 0000000..2b23805 --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,22 @@ +# This GitHub Actions workflow was auto-generated by the `rdme` cli on 2023-12-21T18:43:39.465Z +# You can view our full documentation here: https://docs.readme.com/docs/rdme +name: Publish 🦉 + +on: + push: + branches: + # This workflow will run every time you push code to the following branch: `main` + # https://docs.github.com/actions/using-workflows/events-that-trigger-workflows + - main + +jobs: + rdme-docs: + runs-on: ubuntu-latest + steps: + - name: Check out repo 📚 + uses: actions/checkout@v3 + + - name: Run `docs` command 🚀 + uses: readmeio/rdme@v8 + with: + rdme: docs v1.0 --key=${{ secrets.README_API_KEY }} diff --git a/.github/workflows/update-version.yml b/.github/workflows/update-version.yml new file mode 100644 index 0000000..d04f028 --- /dev/null +++ b/.github/workflows/update-version.yml @@ -0,0 +1,26 @@ +name: Update ReadMe Docs on Push + +on: [push] + +jobs: + rdme-docs: + runs-on: ubuntu-latest + steps: + - name: Check out repo 📚 + uses: actions/checkout@v3 + + - name: Generate branch version string + run: | + BRANCH_NAME="${{ github.head_ref || github.ref || github.event.ref }}" + BRANCH_VERSION=$(echo $BRANCH_NAME | tr -cd '0-9.') + echo "BRANCH_VERSION=$BRANCH_VERSION" >> $GITHUB_ENV + + - name: DryRun for debugging + uses: readmeio/rdme@v8 + with: + rdme: docs v1.0 --key=${{ secrets.README_API_KEY }} --version=${{ env.BRANCH_VERSION }} --dryRun + + - name: Update version of docs for branch 🚀 + uses: readmeio/rdme@v8 + with: + rdme: docs v1.0 --key=${{ secrets.README_API_KEY }} --version=${{ env.BRANCH_VERSION }} \ No newline at end of file diff --git a/.vale.ini b/.vale.ini new file mode 100644 index 0000000..a4632f5 --- /dev/null +++ b/.vale.ini @@ -0,0 +1,5 @@ +StylesPath = vale/styles +MinAlertLevel = suggestion +Packages = Google, proselint +[*] +BasedOnStyles = Vale, Google, proselint \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e23a8b8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,40 @@ +# Contribution Guide for RunPod Documentation + +We warmly welcome contributions to the RunPod project. +Whether you're fixing bugs, adding new features, or improving documentation, your help is greatly appreciated. This guide will help you get started with contributing to the RunPod project. + +## Getting Started + +1. **Fork the Repository**: Start by forking the RunPod repository to your GitHub account. This creates a personal copy for you to work on. + +2. **Clone Your Fork**: Clone your forked repository to your local machine using `git clone`. This will allow you to make changes to the codebase. + +## Making Contributions + +1. **Create a New Branch**: Always create a new branch for your work. This keeps your contributions organized and separated from the main branch. Use a descriptive name for your branch, such as `feature-add-xyz` or `bugfix-issue-123`. + +2. **Make Your Changes**: Implement your changes or improvements in your branch. Be sure to follow the project's coding standards and guidelines. + +3. **Commit Your Changes**: Commit your changes with clear and concise commit messages. This helps others understand what changes you've made and why. + +4. **Sync with Main Branch**: Regularly sync your branch with the main branch of the original repository to stay updated with any changes and avoid conflicts. + +## Submitting Your Contributions + +1. **Test Your Changes**: Before submitting, ensure your changes do not introduce any bugs or issues. Run any tests if available. + +2. **Create a Pull Request (PR)**: Once your changes are ready and tested, push your branch to your fork and create a pull request to the main RunPod repository. Provide a clear description of your changes and the purpose of the PR. + +3. **Code Review**: Wait for the project maintainers to review your PR. Be open to feedback and make any required revisions. + +4. **Merge**: Once your PR is approved, it will be merged into the main codebase. + +## Additional Guidelines + +- **Follow Project Conventions**: Adhere to the coding, commenting, and formatting conventions used in the project. +- **Respectful Communication**: Always communicate respectfully with other contributors and maintainers. +- **Report Issues**: If you find bugs or have feature requests, open an issue in the repository. + +## Questions or Help + +If you need help or have questions, feel free to reach out to the project maintainers or use the project's communication channels. diff --git a/Changelog Posts/welcome-to-runpod.md b/Changelog Posts/welcome-to-runpod.md new file mode 100644 index 0000000..7f90e91 --- /dev/null +++ b/Changelog Posts/welcome-to-runpod.md @@ -0,0 +1,9 @@ +--- +title: "Welcome to RunPod" +slug: "welcome-to-runpod" +type: "" +createdAt: {} +hidden: false +--- + +Welcome to the developer hub and documentation for RunPod! diff --git a/LICENSE copy b/LICENSE copy new file mode 100644 index 0000000..f49a4e1 --- /dev/null +++ b/LICENSE copy @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md index 2efa839..7d88f60 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,64 @@ -# About +# RunPod Documentation Guide -Please use the search or browse through our docs before contacting us directly with any general questions. Feel free to reach us on discord, our support chat, or by email. You can find more info on our [**contact**](https://www.runpod.io/contact) page. +Welcome to the RunPod Documentation Guide. This repository contains all the necessary information and tools to help you effectively use and contribute to the RunPod project. -### **Our Mission** +## Table of Contents -RunPod is on a mission to democratize AI from the ground up. Our first goal is to bring cloud compute to all with very competitive prices without sacrificing usability, experience, or features. +- [Dryrun Documentation](#dryrun-documentation) +- [Format Documentation](#format-documentation) +- [Lint Documentation](#lint-documentation) +- [Creating a New Version](#creating-a-new-version) +- [Contributing](#contributing) +- [License](#license) -RunPod currently provides two cloud compute services: **Secure Cloud** and **Community Cloud**. +## Dryrun Documentation -**Secure Cloud** runs in T3/T4 data centers by our trusted partners. Our close partnership comes with high reliability, redundancy, security, and fast response times to mitigate any downtimes. For any sensitive and enterprise workloads, we highly recommend Secure Cloud. +To perform a dry run of the project, use the following command: -**Community Cloud** brings power in numbers and diversity spanning the whole world. Through our decentralized platform, we can offer peer-to-peer GPU compute that connects individual compute providers to consumers. Community Cloud providers are invite-only and vetted by us to offer compute with good security and uptime. +```bash +yarn dryrun +``` -Both solutions offer far more competitive prices than large cloud providers such as AWS or GCP. +This will simulate the project execution without making any real changes, allowing you to verify the setup and functionality. +## Format Documentation +For formatting your codebase to ensure consistency and readability, use the following command: -{% content-ref url="faq.md" %} -[faq.md](faq.md) -{% endcontent-ref %} +```bash +yarn format +``` -{% content-ref url="graphql-api/" %} -[graphql-api](graphql-api/) -{% endcontent-ref %} +This command will automatically format your code following the predefined coding standards of the project. -{% embed url="https://graphql-spec.runpod.io" %} +## Lint Documentation -{% embed url="https://github.com/runpod/runpodctl" %} +Vale helps in keeping your documentation style clean and consistent. +First, ensure that you have [Vale](https://vale.sh/docs/vale-cli/installation/) installed. + +Once Vale is installed, you can lint your documentation with: + +```bash +yarn lint +``` + +This will check the documentation for any issues or inconsistencies based on the defined linting rules. + +## Creating a New Version + +Versioning is crucial for tracking changes and releases. +For RunPod, we use an automated GitHub workflow for version updates. +This ensures a standardized and error-free process. + +You should rely on the GitHub workflow to update versions. + +## Contributing + +We welcome contributions to the RunPod project. +Whether you're fixing bugs, adding new features, or improving documentation, your help is greatly appreciated. +See [CONTRIBUTING.md](CONTRIBUTING.md) for more information. + +## License + +This project is protected under the [Apache 2.0 License](LICENSE). +For more details, refer to the [LICENSE](LICENSE) file. diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index f0ddd1d..0000000 --- a/SUMMARY.md +++ /dev/null @@ -1,59 +0,0 @@ -# Table of contents - -## Welcome - -* [About](README.md) -* [FAQ](faq.md) -* [How Do I?](welcome/how-do-i/README.md) - * [Expose Ports](welcome/how-do-i/expose-ports.md) - * [Transfer Data](welcome/how-do-i/transfer-data.md) - * [Automatically Stop My Pod](welcome/how-do-i/automatically-stop-my-pod.md) - * [Customize a Template](welcome/how-do-i/customize-a-template.md) - * [Use Real SSH](welcome/how-do-i/use-real-ssh.md) - * [Bulk Start/Stop Pods](welcome/how-do-i/bulk-start-stop-pods.md) - * [Override My Public Key](welcome/how-do-i/override-my-public-key.md) - -## GPU Instances - -* [Pod Env Variables](pods/env-variables.md) -* [GraphQL API](graphql-api/README.md) - * [Create Pod](graphql-api/create-pod.md) - * [Get GPU Types](graphql-api/get-gpu-types.md) - * [Get Pod](graphql-api/get-pod.md) - * [Start Pod](graphql-api/start-pod.md) - * [Stop Pod](graphql-api/stop-pod.md) -* [GraphQL API Spec](https://graphql-spec.runpod.io) -* [runpodctl](https://github.com/runpod/runpodctl) - -## Serverless GPUs - -* [Custom APIs](serverless-ai/custom-apis/README.md) - * [Worker Image Creation](serverless-ai-api/bring-your-own-code.md) - * [Template Creation](serverless-ai/custom-apis/template-creation.md) - * [Autoscaling](serverless-ai/custom-apis/autoscaling.md) - * [Using Your API](serverless-ai/custom-apis/using-your-api.md) -* [Worker Functions](serverless-gpus/worker-functions.md) - -## AI Endpoints - -* [RunPod APIs](serverless-ai-api/getting-started.md) -* [Image Based](ai-endpoints/image-based/README.md) - * [Stable Diffusion v1](serverless-ai-api/stable-diffusion-v1.md) - * [Stable Diffusion v2](serverless-ai/runpod-apis/stable-diffusion-v2.md) - * [Anything v3 (SD-v1.5)](serverless-ai/runpod-apis/anything-v3-sd-v1.5.md) - * [Anything v4 (SD-v1.5)](ai-endpoints/image-based/anything-v4-sd-v1.5.md) - * [Openjourney (SD-v1.5)](serverless-ai/runpod-apis/openjourney-sd-v1.5.md) - * [DreamBooth (SD-v1.5)](serverless-ai/runpod-apis/dreambooth-sd-v1.5.md) - * [EveryDream (SD-v1.5)](serverless-ai/runpod-apis/everydream-sd-v1.5.md) -* [Audio Based](ai-endpoints/audio-based/README.md) - * [Whisper](serverless-ai/runpod-apis/whisper.md) -* [Text Based](ai-endpoints/text-based/README.md) - * [GPT Neo 1.3B](ai-endpoints/text-based/gpt-neo-1.3b.md) - * [GPT Neo 2.7B](ai-endpoints/text-based/gpt-neo-2.7b.md) - * [Pygmalion 6B](ai-endpoints/text-based/pygmalion-6b.md) - -## Hosts - -* [How to become a Host?](how-to-become-a-host.md) -* [Maintenance and Reliability](hosts/maintenance-and-reliability.md) -* [Burn Testing](hosts/burn-testing.md) diff --git a/ai-endpoints/audio-based/README.md b/ai-endpoints/audio-based/README.md deleted file mode 100644 index 1beb2f3..0000000 --- a/ai-endpoints/audio-based/README.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -description: >- - Endpoints with a primary focus on audio as either the input or output of a - request. ---- - -# Audio Based - diff --git a/ai-endpoints/image-based/README.md b/ai-endpoints/image-based/README.md deleted file mode 100644 index 8c370ca..0000000 --- a/ai-endpoints/image-based/README.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -description: >- - Endpoints with a primary focus on images as either the input or output of a - request. ---- - -# Image Based - diff --git a/ai-endpoints/image-based/anything-v4-sd-v1.5.md b/ai-endpoints/image-based/anything-v4-sd-v1.5.md deleted file mode 100644 index 2b1b497..0000000 --- a/ai-endpoints/image-based/anything-v4-sd-v1.5.md +++ /dev/null @@ -1,349 +0,0 @@ ---- -description: >- - Anything V4 - a latent diffusion model for weebs. This model is intended to - produce high-quality, highly detailed anime style with just a few prompts. ---- - -# Anything v4 (SD-v1.5) - -Model: [https://huggingface.co/andite/anything-v4.0](https://huggingface.co/andite/anything-v4.0) - -### Examples - -{% tabs %} -{% tab title="cURL" %} -### Create a job request - -```bash -curl -X POST https://api.runpod.ai/v1/sd-anything-v4/run \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ --d '{"input": {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"}}' -``` - -#### Response - -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` - -### - -### Retrieve Status/Output - -```bash -curl https://api.runpod.ai/v1/sd-anything-v4/status/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -``` - -#### Response - -```json -{ - "delayTime": 123456, // (milliseconds) time in queue - "executionTime": 1234, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "input": { - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" - }, - "output": [ - { - "image": "https://job.results1", - "seed": 1 - }, - { - "image": "https://job.results2", - "seed": 2 - } - ], - "status": "COMPLETED" -} -``` -{% endtab %} - -{% tab title="Python" %} -
import requests
-
-# Set the API endpoint URL
-endpoint = "https://api.runpod.ai/v1/sd-anything-v4/run"
-
-# Set the headers for the request
-headers = {
-  "Content-Type": "application/json",
-  "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- }
-
-# Define your inputs
-input_data = {
-  "input": {
-    "prompt": "My creative vision."
-  }
- }
-
-# Make the request
-response = requests.post(endpoint, json=input_data, headers=headers)
-
-# Print the response 
-print(response.text)             
-
-{% endtab %} - -{% tab title="NodeJS" %} -```javascript -const request = require('request'); - -// Set the API endpoint and model name -const endpoint = 'https://api.runpod.ai/v1/sd-anything-v4/run'; - -// Set the API key and input data -const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; -const inputData = { - input: { - prompt: 'My creative vision.', - }, -}; - -// Set the headers for the request -const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, -}; - -// Make the request -request.post( - { - url: endpoint, - json: inputData, - headers, - }, - (err, response) => { - if (err) { - console.error(err); - return; - } - - // Print the response - console.log(response.body); - }, -); -``` -{% endtab %} - -{% tab title="Go" %} -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "net/http" -) - -func main() { - // Set the API endpoint and model name - endpoint := "https://api.runpod.ai/v1/sd-anything-v4/run" - - // Set the API key and input data - apiKey := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - inputData := map[string]interface{}{ - "input": map[string]string{ - "prompt": "My creative vision.", - }, - } - - // Convert the input data to JSON - inputJSON, err := json.Marshal(inputData) - if err != nil { - log.Fatal(err) - } - - // Set the headers for the request - headers := map[string][]string{ - "Content-Type": {"application/json"}, - "Authorization": {fmt.Sprintf("Bearer %s", apiKey)}, - } - - // Make the request - resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(inputJSON)) - if err != nil { - log.Fatal(err) - } - defer resp.Body.Close() - - // Print the response - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - fmt.Println(string(body)) -} -``` -{% endtab %} -{% endtabs %} - -{% swagger method="post" path="/v1/sd-anything-v4/run" baseUrl="https://api.runpod.ai" summary="Run an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="header" name="Authorization" required="true" %} -RunPod API Key -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input" type="Object" required="true" %} -Input Object contains prompt, and more -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="webhook" type="String" %} -URL endpoint to receive a webhook call on job complete, fail, or timeout. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt" required="true" %} -Your input prompt. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.negative_prompt" type="String" %} -Specify things to not see in the output. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.width" type="Integer" %} -With of output image.\ -128, 256, 384, 448, 512, 576, 640, 704, 768 - -**Default: 512**\ - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.height" type="Integer" %} -Height of output image.\ -128, 256, 384, 448, 512, 576, 640, 704, 768 - -**Default: 512** -{% endswagger-parameter %} - -{% swagger-parameter in="body" type="String" name="input.init_image" %} -URL for an initial image to generate variations of. Will be resized to the specific width and height. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.mask" type="String" %} -URL of a black and white image to use as a mask for inpainting over init\_image. Black pixels are inpainted and white pixels are preserved. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.guidance_scale" type="Float" %} -Scale for classifier-free guidance.\ -Rage 1 -> 20 - -**Default: 7.5** -{% endswagger-parameter %} - -{% swagger-parameter in="body" type="Integer" name="input.num_inference_steps" %} -The number of denoising steps.\ -Range 1 -> 500 - -**Default: 50** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.num_outputs" type="Integer" %} -The number of images to output.\ -Range 1 -> 10 - -**Default: 1** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt_strength" type="Float" %} -How much importance is given to the prompt.\ -Range: 0.0 -> 1.0 - -**Default: 0.8** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.scheduler" type="String" %} -Choose a scheduler.\ -Options: DDIM, K-LMS, PNDM - -**Default: K-LMS** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.seed" type="Integer" %} -Random seed. - -\ - - - - -**Default: None** -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` -{% endswagger-response %} - -{% swagger-response status="400: Bad Request" description="Invalid input" %} - -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} - -{% endswagger-response %} - -{% swagger-response status="429: Too Many Requests" description="Rate limited due to many requests" %} - -{% endswagger-response %} -{% endswagger %} - -{% swagger method="get" path="/v1/sd-anything-v4/status/{ REQUEST_ID }" baseUrl="https://api.runpod.ai" summary="Status and output of an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="path" name="REQUEST_ID" type="UUID" required="true" %} -inference request id -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "delayTime": 71, // (milliseconds) time in queue - "executionTime": 3423, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "39a6a9eb-3f39-40ee-892f-d3c2b2545a2f", - "input": { - "height": 640, - "num_inference_steps": 50, - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists", - "width": 512 - }, - "output": [ - "https://r2..." // securely signed URLs - ], - "status": "COMPLETED" // COMPLETED, IN_QUEUE, IN_PROGRESS, FAILED -} -``` -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} -{% endswagger %} diff --git a/ai-endpoints/text-based/README.md b/ai-endpoints/text-based/README.md deleted file mode 100644 index 6dcb04d..0000000 --- a/ai-endpoints/text-based/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Text Based - diff --git a/ai-endpoints/text-based/gpt-neo-1.3b.md b/ai-endpoints/text-based/gpt-neo-1.3b.md deleted file mode 100644 index 1ebc7b4..0000000 --- a/ai-endpoints/text-based/gpt-neo-1.3b.md +++ /dev/null @@ -1,49 +0,0 @@ -# GPT Neo 1.3B - -{% swagger method="post" path="gpt-neo-1_3b/runsync" baseUrl="https://api.runpod.ai/v2/" summary="" %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="header" name="Authorization" required="true" %} -RunPod API Key -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input" type="Object" required="true" %} -Input components for the GPT model -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt" required="true" %} -The start of the prompt text that the model will infer from. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.do_sample" type="Boolean" %} -Enables decoding strategies such as multinomial sampling, beam-search multinomial sampling, Top-K sampling and Top-p sampling. All these strategies select the next token from the probability distribution over the entire vocabulary with various strategy-specific adjustments. - -\ - - - - -**Default: True** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.max_length" type="Integer" %} -The number of tokens (words) that should be generated. - -\ - - - - -**Default: 100** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.temperature" type="Boolean" %} -How closely the output should follow the prompt. -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="Requested Output" %} - -{% endswagger-response %} -{% endswagger %} diff --git a/ai-endpoints/text-based/gpt-neo-2.7b.md b/ai-endpoints/text-based/gpt-neo-2.7b.md deleted file mode 100644 index 3698bb3..0000000 --- a/ai-endpoints/text-based/gpt-neo-2.7b.md +++ /dev/null @@ -1,49 +0,0 @@ -# GPT Neo 2.7B - -{% swagger method="post" path="gpt-neo-2_7b/runsync" baseUrl="https://api.runpod.ai/v2/" summary="" %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="header" name="Authorization" required="true" %} -RunPod API Key -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input" type="Object" required="true" %} -Input components for the GPT model -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt" required="true" %} -The start of the prompt text that the model will infer from. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.do_sample" type="Boolean" %} -Enables decoding strategies such as multinomial sampling, beam-search multinomial sampling, Top-K sampling and Top-p sampling. All these strategies select the next token from the probability distribution over the entire vocabulary with various strategy-specific adjustments. - -\ - - - - -**Default: True** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.max_length" type="Integer" %} -The number of tokens (words) that should be generated. - -\ - - - - -**Default: 100** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.temperature" type="Boolean" %} -How closely the output should follow the prompt. -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="Requested Output" %} - -{% endswagger-response %} -{% endswagger %} diff --git a/ai-endpoints/text-based/pygmalion-6b.md b/ai-endpoints/text-based/pygmalion-6b.md deleted file mode 100644 index 64002b3..0000000 --- a/ai-endpoints/text-based/pygmalion-6b.md +++ /dev/null @@ -1,51 +0,0 @@ -# Pygmalion 6B - -Endpoint for [PygmalionAI/pygmalion-6b](https://huggingface.co/PygmalionAI/pygmalion-6b) - -{% swagger method="post" path="pygmalion-6b/runsync" baseUrl="https://api.runpod.ai/v2/" summary="" %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="header" name="Authorization" required="true" %} -RunPod API Key -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input" type="Object" required="true" %} -Input components for the GPT model -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt" required="true" %} -The start of the prompt text that the model will infer from. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.do_sample" type="Boolean" %} -Enables decoding strategies such as multinomial sampling, beam-search multinomial sampling, Top-K sampling and Top-p sampling. All these strategies select the next token from the probability distribution over the entire vocabulary with various strategy-specific adjustments. - -\ - - - - -**Default: True** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.max_length" type="Integer" %} -The number of tokens (words) that should be generated. - -\ - - - - -**Default: 100** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.temperature" type="Boolean" %} -How closely the output should follow the prompt. -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="Requested Output" %} - -{% endswagger-response %} -{% endswagger %} diff --git a/dprint.json b/dprint.json new file mode 100644 index 0000000..a40b291 --- /dev/null +++ b/dprint.json @@ -0,0 +1,26 @@ +{ + "typescript": { + }, + "json": { + }, + "markdown": { + }, + "toml": { + }, + "ruff": { + }, + "jupyter": { + }, + "excludes": [ + "**/node_modules", + "**/*-lock.json" + ], + "plugins": [ + "https://plugins.dprint.dev/typescript-0.88.7.wasm", + "https://plugins.dprint.dev/json-0.19.1.wasm", + "https://plugins.dprint.dev/markdown-0.16.3.wasm", + "https://plugins.dprint.dev/toml-0.5.4.wasm", + "https://plugins.dprint.dev/ruff-0.0.4.wasm", + "https://plugins.dprint.dev/jupyter-0.1.2.wasm" + ] +} diff --git a/faq.md b/faq.md deleted file mode 100644 index bd9e194..0000000 --- a/faq.md +++ /dev/null @@ -1,198 +0,0 @@ ---- -description: General questions about RunPod and its services. ---- - -# FAQ - -### **Secure Cloud vs Community Cloud** - -RunPod provides two cloud computing services: **Secure Cloud** and **Community Cloud**. - -**Secure Cloud** runs in T4 data centers by our trusted partners. Our close partnership comes with high-reliability w/ redundancy, security, and fast response times to mitigate any downtimes. For any sensitive and enterprise workloads, we highly recommend Secure Cloud. - -**Community Cloud** brings power in numbers and diversity spanning the whole world. Through our decentralized platform, we can offer peer-to-peer GPU computing that connects individual compute providers to compute consumers. Our Community Cloud hosts are invite-only and vetted by us. - -Both solutions offer far more competitive prices than large cloud providers such as AWS or GCP. - -### On-Demand vs. Spot Pod - -**OnDemand** pods can run forever without interruptions with resources dedicated to your pod. They do incur higher costs than **Spot** pods. - -**Spot** pods use spare compute capacity and allow you to bid for those compute resources. Resources are dedicated to your pod, but someone else can bid higher or start an **OnDemand** pod that will stop your pod. When this happens, your pod is given 5 seconds to stop with _SIGTERM_ and eventually _SIGKILL_ after 5 seconds. You can use volumes to save any data to the disk in that 5s period or push data to the cloud periodically. - -
- -How does RunPod work? - -RunPod leverages technologies like docker to containerize and isolate guest workloads on a host machine. We have built a decentralized platform where 1000s of servers can be connected to offer a seamless experience for all users. - -
- -
- -Where can I go for help? - -We'd be happy to help! Join our community on [discord](https://discord.gg/pJ3P2DbUUq), message us in our support chat, or email us at support@runpod.io - -
- -### Refunds and Credits - -If you aren't sure if RunPod is for you, feel free to hang out in our [Discord](https://discord.gg/cUpRmau42V) to ask questions or shoot an email to [support@runpod.io](mailto:support@runpod.io). You can load as little as $10 into your account to start trying things out. We don't currently offer refunds or trial credits due to the overhead of processing these types of requests. Please plan accordingly! - -## Pods - -
- -What is an on-demand instance? - -A - On-demand instances are for non-interruptible workloads. You pay the on-demand price and cannot be displaced by other users as long as you have funds to keep your pod running. - -
- -
- -What is a spot instance? - -A spot instance is an interruptible instance that can generally be rented for much cheaper than an on-demand instance**.** Spot instances are great for stateless workloads like an API, or for workloads that you can periodically save to a volume disk. Your volume disk is retained even if your spot instance is interrupted. - -
- -## Billing - -All billing, including per-hour compute and storage billing, is charged per minute. - -
- -How does Pod billing work? - -Every pod has an hourly cost based on GPU type. You are charged for the pod every minute as long as the pod is running. The charge is against your RunPod credits. If you ever run out of credits, your pods will be automatically stopped, and you will get an email notification. Eventually, pods will be terminated if you don't refill your credit. - -
- -
- -How does storage billing work? - -We currently charge $0.1/GB/month for all storage on running pods and $0.2/GB/month for volume storage on stopped pods. Storage is tied to compute servers, and we want to ensure active users have enough space to run their workloads. Storage is charged per minute, and we never charge users if the host machine is down or unavailable from the public internet. - -
- -## Security - -
- -Is my data protected from other clients? - -Yes. Your data is run in a multi-tenant environment where other clients do not have the ability to access your pod. For sensitive workloads requiring the best security, please use **Secure Cloud**. - -
- -
- -Is my data protected from the host of the machine that my pod is running on? - -Data privacy is important to us at RunPod. Our terms of service prohibit hosts from trying to inspect your pod data or usage patterns in any way. If you want the highest level of security, use Secure Cloud. - -
- -## Usability - -
- -What can I do in a RunPod pod? - -You can run any docker container available on any publicly reachable container registry. If you are not well versed in containers, we recommend sticking with the default run templates like our RunPod PyTorch template. However, if you know what you are doing, you can do a lot more! - -
- -
- -Can I run my own Docker daemon on RunPod? - -You can't currently spin up your own instance of docker, as we run Docker for you! This unfortunately does mean that you cannot currently build docker containers on runpod or use things like docker compose. Many use cases can be solved by creating a custom template with the docker image that you want to run. - -
- -
- -My pod is stuck on initializing? What gives? - -Usually, this happens for one of several reasons. If you can't figure it out, contact us, and we'll be happy to help you. - -1. You are trying to run a pod to SSH into, but you did not give the pod an idle job to run like "sleep infinity." -2. You have given your pod a command that it doesn't know how to run. Check the logs to make sure that you don't have any syntax errors, etc. - -
- -
- -Can I run Windows? - -We don't currently support windows. We want to do this in the future, but we do not have a solid timeframe for windows support. - -
- -
- -How do I find a reliable server in Community Cloud? - -It is important for RunPod to provide you with reliable servers. All of our listed servers must meet minimum reliability, and most are running in a data center! However, if you want the highest level of reliability and security, use Secure Cloud. RunPod calculates server reliability by maintaining a heartbeat with each server in real-time. - -
- -
- -Why do I have 0 GPU assigned to my pod? - -Most of our machines have between 4 and 8 GPUs per physical machine. When you start a pod, it is locked to a specific physical machine. If you keep it running (on-demand), then that GPU cannot be taken from you. However, if you stop your pod, it becomes available for a different user to rent. When you want to start your pod again, your specific machine may be wholly occupied! In this case, we give you the option to spin up your pod with 0 GPUs so you can retain access to your data. - -Remember that this does not mean there are no more GPUs of that type available, just none on the physical machine that specific pod is locked to. We know this isn't ideal, but please bear with us until we develop some better solutions. Note that transfer pods have limited computing capabilities, so transferring files using a UI may be difficult, and you may need to resort to terminal access or cloud sync options. - -
- -## What if? - -
- -What if I run out of funds? - -All your pods are stopped automatically when you don't have enough funds to keep your pods running for at least ten more minutes. When your pods are stopped, your container disk data will be lost, but your volume data will be preserved. You will have two days to add more funds. If you fail to do so, your pods will be terminated, and pod volumes will be removed. - -After you add more funds to your account, you can start your pod if you wish (assuming enough GPUs are available on the host machine). - -
- -
- -What if the machine that my pod is running on loses power? - -If the host machine loses power, it will attempt to start your pod again when it returns online. Your volume data will be preserved, and your container will run the same command as it ran the first time you started renting it. Your container disk and anything in memory will be lost! - -
- -
- -What if my pod loses internet connectivity? - -The host machine will continue to run your pod to the best of its ability, even if it is not connected to the internet. If your job requires internet connectivity, then it will not function. You will **not** be charged if the host loses internet connectivity, even if it continues to run your job. You may, of course, request that your pod exit while the host is offline, and it will exit your pod when it regains network connectivity. - -
- -
- -What if it says that my spending limit has been exceeded? - -We implement a spending limit for newer accounts that will grow over time. This is because we have found that sometimes scammers try to interfere with the natural workings of the platform. We believe that this limit should not impact normal usage. We would be delighted to up your spending limit if you contact us and share your use case. - -
- -## Legal - -
- -Do you have some legal stuff I can look at? - -Sure do! Take a look at our [legal page](https://www.runpod.io/legal). - -
diff --git a/graphql-api/README.md b/graphql-api/README.md deleted file mode 100644 index 706a0ee..0000000 --- a/graphql-api/README.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -description: RunPod GraphQL API examples to manage your pods. ---- - -# GraphQL API - -#### Authentication - -RunPod uses API Keys for all API requests. Go to [settings](https://www.runpod.io/console/user/settings) to manage your API keys. - -#### GraphQL API Spec - -If you need detailed queries, mutations, fields, and inputs, take a look at our [**GraphQL Spec**](https://graphql-spec.runpod.io). - - - -{% content-ref url="create-pod.md" %} -[create-pod.md](create-pod.md) -{% endcontent-ref %} - -{% content-ref url="get-gpu-types.md" %} -[get-gpu-types.md](get-gpu-types.md) -{% endcontent-ref %} - -{% content-ref url="get-pod.md" %} -[get-pod.md](get-pod.md) -{% endcontent-ref %} - -{% content-ref url="start-pod.md" %} -[start-pod.md](start-pod.md) -{% endcontent-ref %} - -{% content-ref url="stop-pod.md" %} -[stop-pod.md](stop-pod.md) -{% endcontent-ref %} diff --git a/hosts/burn-testing.md b/hosts/burn-testing.md deleted file mode 100644 index ac7db64..0000000 --- a/hosts/burn-testing.md +++ /dev/null @@ -1,21 +0,0 @@ -# Burn Testing - -Machines should be thoroughly tested before being listed on the RunPod platform. - -Here is a simple guide to running a burn test for a few days. - -Stop the RunPod agent by running - -`sudo systemctl stop runpod` - -Then you can kick off a gpu-burn run by typing - -``` -docker run --rm --gpus all gshaibi/gpu-burn -d 36000 -``` - -You should also verify that your memory, cpu, and disk are up to the task. You can use the stress-ng library to accomplish this: [https://wiki.ubuntu.com/Kernel/Reference/stress-ng](https://wiki.ubuntu.com/Kernel/Reference/stress-ng) - -When everything is verified okay, you can start the RunPod agent again by running - -`sudo systemctl start runpod` diff --git a/hosts/maintenance-and-reliability.md b/hosts/maintenance-and-reliability.md deleted file mode 100644 index 80ac1c4..0000000 --- a/hosts/maintenance-and-reliability.md +++ /dev/null @@ -1,27 +0,0 @@ -# Maintenance and Reliability - -#### Maintenance - -Hosts can currently schedule maintenance at least one week in advance. Users will get email reminders of upcoming maintenance that will occur on their active pods. Please contact support@runpod.io if you are scheduling maintenance on more than a few machines so that we are aware of any major impacts to our customers. - - - -Here are some things to keep in mind. - -* Uptime/Reliability will not be affected during scheduled maintenance -* ALL other events that may impact customer workloads will result in a reliability score decrease. **This includes for unlisted machines.** -* All Machines that have maintenance scheduled will be automatically unlisted 4 days prior to the scheduled maintenance start time. -* Excessive maintenance will result in further penalties. -* You are allowed to bring down machines that have active users on them provided that you are in a maintenance window. - -#### Reliability calculations - -Reliability is currently calculated as follows: - -( total minutes + small buffer ) / total minutes in interval - -This means that if you have 30 minutes of network downtime on the first of the month, your reliability will be calculated as - -( 43200 - 30 + 10 ) / 43200 = 99.95% - -based on approximately 43200 minutes per month and a 10 minute buffer. We include the buffer because we do incur small single-minute uptime dings once in a while due to agent upgrades and such. It will take an entire month to regenerate back to 100% uptime given no further downtimes in the month. This is because uptime works on a sliding window, and does not automatically grow over time. diff --git a/how-to-become-a-host.md b/how-to-become-a-host.md deleted file mode 100644 index c91b2e1..0000000 --- a/how-to-become-a-host.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -description: Offer your NVIDIA GPU compute on our platform! ---- - -# How to become a Host? - -Our community cloud empowers hosts to offer their compute on our platform. Currently we only support NVIDIA GPU servers. - - - -**Server Requirements** - -* Ubuntu 20.04 LTS -* at least 2 Physical Core Per GPU + 1 extra for System - * 2x 3090s should have at least 5 Cores - * 4x A6000 should have at least 9 Cores -* Latest GPUs, at least 30xx or RTX A4000 or higher - * PCIE 3 x16 per GPU or PCIE 4 x8 -* RAM 4 GB + Total VRAM of all GPUs - * 2x 3090s should have (24+24+4) 52 GB RAM - * 4x A6000 should have (48+48+48+48+4) 196 GB RAM -* 1 TB disk space at minimum, 2 TB for 4 GPUs, 3 TB for 8 GPUs - * at least 150 MB/s read speed required - * disk speed test: `hdparm -tv {device}` -* 100 Mb/s Down / 50 Mb/s Up at minimum per server -* Public IP support (20 ports per GPU) - * single IP can be shared between multiple servers - -**** - -**Other Requirements** - -* RunPod service fee is 24% - * we cover \~4% Stripe payment fees - * also 2% referral and 1% template program is included as well ([learn more](https://www.runpod.io/refer-a-friend)) -* GPU OnDemand prices are standard, you can set min bid price for Spot -* We only accept Hosts with at least **12 GPUs** with at least 24 GB VRAM GPU or **4 GPUs** with at least 48 GB VRAM GPU -* We require **KYC** for all hosts to protect our users and deter any fraud - - - -If you meet the above requirements, please email us at support@runpod.io with your server specs, # of GPUs, internet speeds, and location. - -**** diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..88fe9d2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3006 @@ +{ + "name": "runpod-docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "rdme": "^8.6.6" + } + }, + "node_modules/@75lb/deep-merge": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", + "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", + "dev": true, + "dependencies": { + "lodash.assignwith": "^4.2.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/@75lb/deep-merge/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/@actions/core": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz", + "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==", + "dev": true, + "dependencies": { + "@actions/http-client": "^2.0.1", + "uuid": "^8.3.2" + } + }, + "node_modules/@actions/http-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", + "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", + "dev": true, + "dependencies": { + "tunnel": "^0.0.6", + "undici": "^5.25.4" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", + "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", + "dev": true + }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@humanwhocodes/momoa": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", + "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", + "dev": true, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@readme/better-ajv-errors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@readme/better-ajv-errors/-/better-ajv-errors-1.6.0.tgz", + "integrity": "sha512-9gO9rld84Jgu13kcbKRU+WHseNhaVt76wYMeRDGsUGYxwJtI3RmEJ9LY9dZCYQGI8eUZLuxb5qDja0nqklpFjQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/runtime": "^7.21.0", + "@humanwhocodes/momoa": "^2.0.3", + "chalk": "^4.1.2", + "json-to-ast": "^2.0.3", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "ajv": "4.11.8 - 8" + } + }, + "node_modules/@readme/http-status-codes": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@readme/http-status-codes/-/http-status-codes-7.2.0.tgz", + "integrity": "sha512-/dBh9qw3QhJYqlGwt2I+KUP/lQ6nytdCx3aq+GpMUhibLHF3O7fwoowNcTwlbnwtyJ+TJYTIIrp3oVUlRNx3fA==", + "dev": true + }, + "node_modules/@readme/json-schema-ref-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@readme/json-schema-ref-parser/-/json-schema-ref-parser-1.2.0.tgz", + "integrity": "sha512-Bt3QVovFSua4QmHa65EHUmh2xS0XJ3rgTEUPH998f4OW4VVJke3BuS16f+kM0ZLOGdvIrzrPRqwihuv5BAjtrA==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@readme/json-schema-ref-parser/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@readme/json-schema-ref-parser/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@readme/openapi-parser": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@readme/openapi-parser/-/openapi-parser-2.5.0.tgz", + "integrity": "sha512-IbymbOqRuUzoIgxfAAR7XJt2FWl6n2yqN09fF5adacGm7W03siA3bj1Emql0X9D2T+RpBYz3x9zDsMhuoMP62A==", + "dev": true, + "dependencies": { + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "@readme/better-ajv-errors": "^1.6.0", + "@readme/json-schema-ref-parser": "^1.2.0", + "ajv": "^8.12.0", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@readme/postman-to-openapi": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@readme/postman-to-openapi/-/postman-to-openapi-4.1.0.tgz", + "integrity": "sha512-VvV2Hzjskz01m8doSn7Ypt6cSZzgjnypVqXy1ipThbyYD6SGiM74VSePXykOODj/43Y2m6zeYedPk/ZLts/HvQ==", + "dev": true, + "dependencies": { + "@readme/http-status-codes": "^7.2.0", + "js-yaml": "^4.1.0", + "jsonc-parser": "3.2.0", + "lodash.camelcase": "^4.3.0", + "marked": "^4.3.0", + "mustache": "^4.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@readme/postman-to-openapi/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@readme/postman-to-openapi/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/code-error-fragment": { + "version": "0.0.230", + "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", + "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", + "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", + "dev": true, + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^3.0.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/compute-gcd": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "dev": true, + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/compute-lcm": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", + "dev": true, + "dependencies": { + "compute-gcd": "^1.2.1", + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/config": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/config/-/config-3.3.9.tgz", + "integrity": "sha512-G17nfe+cY7kR0wVpc49NCYvNtelm/pPy8czHoFkAgtV1lkmcp7DHtWCdDu+C9Z7gb2WVqa9Tm3uF9aKaPbCfhg==", + "dev": true, + "dependencies": { + "json5": "^2.2.3" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/editor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", + "integrity": "sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", + "dev": true + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-compare": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", + "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", + "dev": true, + "dependencies": { + "lodash": "^4.17.4" + } + }, + "node_modules/json-schema-merge-allof": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", + "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", + "dev": true, + "dependencies": { + "compute-lcm": "^1.1.2", + "json-schema-compare": "^0.2.2", + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-to-ast": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", + "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", + "dev": true, + "dependencies": { + "code-error-fragment": "0.0.230", + "grapheme-splitter": "^1.0.4" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.assignwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", + "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dev": true, + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.2.1" + } + }, + "node_modules/oas": { + "version": "20.10.3", + "resolved": "https://registry.npmjs.org/oas/-/oas-20.10.3.tgz", + "integrity": "sha512-dBxDuwn2ssggPMOqEKEzT4sjCqbkol8JozuWrpwD7chcmbKbverj5vpk2kmsczeyguFkLcKUOMcqUUimf9h+IQ==", + "dev": true, + "dependencies": { + "@readme/json-schema-ref-parser": "^1.2.0", + "@types/json-schema": "^7.0.11", + "json-schema-merge-allof": "^0.8.1", + "jsonpath-plus": "^7.2.0", + "jsonpointer": "^5.0.0", + "memoizee": "^0.4.14", + "oas-normalize": "^8.4.0", + "openapi-types": "^12.1.1", + "path-to-regexp": "^6.2.0", + "remove-undefined-objects": "^3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dev": true, + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dev": true, + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-normalize": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/oas-normalize/-/oas-normalize-8.4.1.tgz", + "integrity": "sha512-cGODg+AntZteJRHBiYDWKtcO2svWGMXuFWYu2I8b4hOrNiwB3hgDs/ScX3O9mYm6RpLsUIftt6rDHGc8eYG8aA==", + "dev": true, + "dependencies": { + "@readme/openapi-parser": "^2.5.0", + "@readme/postman-to-openapi": "^4.1.0", + "js-yaml": "^4.1.0", + "node-fetch": "^2.6.1", + "openapi-types": "^12.1.0", + "swagger2openapi": "^7.0.8" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/oas-normalize/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/oas-normalize/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "dev": true, + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "dev": true, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "dev": true + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-link-header": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-2.0.0.tgz", + "integrity": "sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==", + "dev": true, + "dependencies": { + "xtend": "~4.0.1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/rdme": { + "version": "8.6.6", + "resolved": "https://registry.npmjs.org/rdme/-/rdme-8.6.6.tgz", + "integrity": "sha512-+H7v3t8yoM89Xe1PYTDitMptosemi/l6thNz5CyBEhipZW11iq3bbvndRDvRSBB0ncOnFQp5heY1HspERc/oPA==", + "dev": true, + "dependencies": { + "@actions/core": "^1.6.0", + "chalk": "^4.1.2", + "ci-info": "^3.6.1", + "command-line-args": "^5.2.0", + "command-line-usage": "^7.0.1", + "config": "^3.1.0", + "configstore": "^5.0.0", + "debug": "^4.3.3", + "editor": "^1.0.0", + "form-data": "^4.0.0", + "gray-matter": "^4.0.1", + "ignore": "^5.2.0", + "mime-types": "^2.1.35", + "node-fetch": "^2.6.1", + "oas": "^20.10.2", + "oas-normalize": "^8.4.1", + "open": "^8.2.1", + "ora": "^5.4.1", + "parse-link-header": "^2.0.0", + "pluralize": "^8.0.0", + "prompts": "^2.4.2", + "semver": "^7.5.3", + "simple-git": "^3.19.1", + "string-argv": "^0.3.1", + "table": "^6.8.1", + "tmp-promise": "^3.0.2", + "update-notifier-cjs": "^5.1.5", + "validator": "^13.7.0" + }, + "bin": { + "rdme": "bin/rdme" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "dev": true, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/remove-undefined-objects": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-undefined-objects/-/remove-undefined-objects-3.0.0.tgz", + "integrity": "sha512-nxG1yYfc/Jxi+bNCBiqKhxVJPE+QvziIOKbD+Dxc93Uisz92v/ZYpo4WR0TJuf+dk2xE8lW2WPJsA3mDFzXy8w==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dev": true, + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "dev": true + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-git": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.21.0.tgz", + "integrity": "sha512-oTzw9248AF5bDTMk9MrxsRzEzivMlY+DWH0yWS4VYpMhNLhDWnN06pCtaUyPnqv/FpsdeNmRqmZugMABHRPdDA==", + "dev": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stream-read-all": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", + "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table-layout": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", + "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", + "dev": true, + "dependencies": { + "@75lb/deep-merge": "^1.1.1", + "array-back": "^6.2.2", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.0", + "stream-read-all": "^3.0.1", + "typical": "^7.1.1", + "wordwrapjs": "^5.1.0" + }, + "bin": { + "table-layout": "bin/cli.js" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/undici": { + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier-cjs": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/update-notifier-cjs/-/update-notifier-cjs-5.1.6.tgz", + "integrity": "sha512-wgxdSBWv3x/YpMzsWz5G4p4ec7JWD0HCl8W6bmNB6E5Gwo+1ym5oN4hiXpLf0mPySVEJEIsYlkshnplkg2OP9A==", + "dev": true, + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "isomorphic-fetch": "^3.0.0", + "pupa": "^2.1.1", + "registry-auth-token": "^5.0.1", + "registry-url": "^5.1.0", + "semver": "^7.3.7", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", + "dev": true + }, + "node_modules/validate.io-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==", + "dev": true + }, + "node_modules/validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", + "dev": true, + "dependencies": { + "validate.io-number": "^1.0.3" + } + }, + "node_modules/validate.io-integer-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", + "dev": true, + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-integer": "^1.0.4" + } + }, + "node_modules/validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==", + "dev": true + }, + "node_modules/validator": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wordwrapjs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d686946 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "runpod-documentation", + "version": "0.0.0", + "private": true, + "scripts": { + "format": "dprint fmt", + "dryrun": "rdme docs . --version=v1.0 --dryRun", + "lint": "vale v1.0/**/*" + }, + "devDependencies": { + "rdme": "^8.6.6", + "dprint": "0.44.0" + } +} diff --git a/pods/env-variables.md b/pods/env-variables.md deleted file mode 100644 index 389b4bf..0000000 --- a/pods/env-variables.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -description: >- - Environment variables are accessible within in a pod. These are the variables - that are set by default. ---- - -# Env Variables - -| Variable | Description | -| --------------------- | ----------------------------------------------------------------------------------------- | -| RUNPOD\_POD\_ID | The unique identifier for your pod. | -| RUNPOD\_API\_KEY | Used to make RunPod API calls to the specific pod. It's limited in scope to only the pod. | -| RUNPOD\_POD\_HOSTNAME | Name of the host server the pod is running on. | -| RUNPOD\_GPU\_COUNT | Number of GPUs available to the pod. | -| PWD | current working directory | -| PYTORCH\_VERSION | Installed PyTorch Version | -| PUBLIC\_KEY | The SSH public key to access the pod over SSH. | - diff --git a/serverless-ai-api/bring-your-own-code.md b/serverless-ai-api/bring-your-own-code.md deleted file mode 100644 index 5615587..0000000 --- a/serverless-ai-api/bring-your-own-code.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -description: Workers are docker containers that can be easily configured to run your jobs ---- - -# Worker Image Creation - -It's easy to create a container image using our [python sdk](https://github.com/runpod/runpod-python). For a simple hello world example, you can check out [this repository](https://github.com/runpod/serverless-workers/tree/main/Tutorials/helloworld). - -This is the Dockerfile for hello world: - -```docker -from python:3.11.1-buster - -WORKDIR / - -RUN pip install runpod - -ADD handler.py . - -CMD [ "python", "-u", "/handler.py" ] -``` - -Your Dockerfile should package all dependencies required to run your code. You should also bake in any models that you wish to have cached between jobs. You should aim to build a docker container that is less than 15-20GB maximum. - -Our simple example only packages the handler.py file, which is called as the default docker command, so that it runs when the container starts. - -```python -import runpod -import os -import time - -sleep_time = int(os.environ.get('SLEEP_TIME', 3)) - -## load your model(s) into vram here - -def handler(event): - print(event) - time_slept = 0 - while time_slept < sleep_time: - print("working, I promise") - time_slept += 1 - time.sleep(1) - # do the things - - return "Hello World" - - -runpod.serverless.start({ - "handler": handler -}) -``` - -Important things to note for handler.py: - -* Import `runpod` as a dependency -* Write the code that loads your model into VRAM outside of the handler function. This will cause it to be warm between job runs. Otherwise, you will have to load and unload from VRAM every time a new job starts. -* Your handler function gets an "event" as the only function parameter. This includes metadata as well as whatever is passed to your API under the "input" property. -* You must invoke the `runpod.serverless.start` function and pass your handler function under the "handler" property. -* You must return something as output when your worker is done processing the job. This can directly be the output, or it can be links to cloud storage where the artifacts are saved. Keep in mind that the input and output payloads are limited to 2MB each. If your inputs or outputs are larger than that, you can upload them to S3 or other cloud storage and have your worker download/upload from there. - -
// example event payload
-{
-    'delayTime': 2534,
-    'id': '2a16b881-830f-4d14-af5b-f7db7c0a96fc',
-    'input': {
-        'prompt': 'A beautiful painting of a singular lighthouse, shining its light across a tumultuous sea of blood by greg rutkowski and thomas kinkade, Trending on artstation.'
-        },
-    'status': 'IN_PROGRESS'
-}
-
- -This hello world example simply takes whatever is passed to it, pretends its doing work for 3 (or whatever is configured in the env variable) seconds, then returns "hello world" as an output. - -Build and push your image to your favorite container image repository when you're done. - -While you can't currently use RunPod for this step, we are looking for ways to make this part of the development experience more smooth. Let us know if you have ideas or feature requests to make this part of the workflow more streamlined! diff --git a/serverless-ai-api/getting-started.md b/serverless-ai-api/getting-started.md deleted file mode 100644 index 026d497..0000000 --- a/serverless-ai-api/getting-started.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -description: Interact with your favorite models without managing the pods yourself. ---- - -# RunPod APIs - -### Prerequisites - -* You will need a RunPod API key which can be generated under your [user settings](https://www.runpod.io/console/user/settings). This API key will identify you for billing purposes, so guard it well! - -#### Note\*: You must retrieve your results via the status endpoint within 1 hour. We do not keep your inputs or outputs longer than that to protect your privacy! - -### Overview - -Our initial API implementation works asynchronously. This means you fire an API request to our endpoint with your input parameters, and you immediately get a response with a unique job ID. What do I do with this useless response, you say? You can then query the status endpoint and pass it your job ID. The status endpoint will give you the job results when completed. - -Let's take the Stable Diffusion v1 inference endpoint, for example. - -#### Start your job - -You would first make a request like the following (remember to replace the "xxxxxx"s with your real API key: - -```bash -curl -X POST https://api.runpod.ai/v1/stable-diffusion-v1/run \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ --d '{"input": {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"}}' -``` - -You would get an immediate response that looks like this: - -```json -{ - "id": "c80ffee4-f315-4e25-a146-0f3d98cf024b", - "status": "IN_QUEUE" -} -``` - -In this example, your job ID would be "c80ffee4-f315-4e25-a146-0f3d98cf024b". You get a new one for each job and it is a unique identifier for your job. - -#### Check the status of your job - -You haven't gotten any output at this point, so you must make an additional call to the status endpoint after some time. Your status endpoint uses the job ID to route to the correct job status. In this case, the status endpoint is - -``` -https://api.runpod.ai/v1/stable-diffusion-v1/status/c80ffee4-f315-4e25-a146-0f3d98cf024b -``` - -Note how the last part of the URL is your job ID. You could request that endpoint like so. Remember to use your API key for this request too! - -```bash -curl https://api.runpod.ai/v1/stable-diffusion-v1/status/c80ffee4-f315-4e25-a146-0f3d98cf024b \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -``` - -If your job hasn't been completed, you may get something that looks like this back: - -``` -{ - "delayTime": 2624, - "id": "c80ffee4-f315-4e25-a146-0f3d98cf024b", - "input": { - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" - }, - "status": "IN_PROGRESS" -} -``` - -This just means to wait a bit longer before you query the status endpoint again. - -#### Get completed job status - -Eventually, you will get the final results of your job. They would look something like this: - -``` -{ - "delayTime": 123456, // (milliseconds) time in queue - "executionTime": 1234, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "c80ffee4-f315-4e25-a146-0f3d98cf024b", - "input": { - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" - }, - "output": [ - { - "image": "https://job.results1", - "seed": 1 - }, - { - "image": "https://job.results2", - "seed": 2 - } - ], - "status": "COMPLETED" -} -``` - -#### Note\*: You must retrieve your results via the status endpoint within 1 hour. We do not keep your inputs or outputs longer than that to protect your privacy! - -#### Get your stuff - -Note how you don't get the images directly in the output. The output simply contains the URLs to the cloud storage that will let you download each image. - -You've successfully generated your first images with our stable diffusion API! :tada::tada: - -If you're interested in descriptions for all parameters and code examples past curl, read on! diff --git a/serverless-ai-api/stable-diffusion-v1.md b/serverless-ai-api/stable-diffusion-v1.md deleted file mode 100644 index 75f0610..0000000 --- a/serverless-ai-api/stable-diffusion-v1.md +++ /dev/null @@ -1,347 +0,0 @@ ---- -description: >- - Stable Diffusion v1.5 is a latent text-to-image diffusion model capable of - generating photo-realistic images given any text input. ---- - -# Stable Diffusion v1 - -### Examples - -{% tabs %} -{% tab title="cURL" %} -### Create a job request - -```bash -curl -X POST https://api.runpod.ai/v1/stable-diffusion-v1/run \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ --d '{"input": {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"}}' -``` - -#### Response - -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` - -### - -### Retrieve Status/Output - -```bash -curl https://api.runpod.ai/v1/stable-diffusion-v1/status/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -``` - -#### Response - -```json -{ - "delayTime": 123456, // (milliseconds) time in queue - "executionTime": 1234, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "input": { - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" - }, - "output": [ - { - "image": "https://job.results1", - "seed": 1 - }, - { - "image": "https://job.results2", - "seed": 2 - } - ], - "status": "COMPLETED" -} -``` -{% endtab %} - -{% tab title="Python" %} -
import requests
-
-# Set the API endpoint URL
-endpoint = "https://api.runpod.ai/v1/stable-diffusion-v1/run"
-
-# Set the headers for the request
-headers = {
-  "Content-Type": "application/json",
-  "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- }
-
-# Define your inputs
-input_data = {
-  "input": {
-    "prompt": "My creative vision."
-  }
- }
-
-# Make the request
-response = requests.post(endpoint, json=input_data, headers=headers)
-
-# Print the response 
-print(response.text)             
-
-{% endtab %} - -{% tab title="NodeJS" %} -```javascript -const request = require('request'); - -// Set the API endpoint and model name -const endpoint = 'https://api.runpod.ai/v1/stable-diffusion-v1/run'; - -// Set the API key and input data -const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; -const inputData = { - input: { - prompt: 'My creative vision.', - }, -}; - -// Set the headers for the request -const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, -}; - -// Make the request -request.post( - { - url: endpoint, - json: inputData, - headers, - }, - (err, response) => { - if (err) { - console.error(err); - return; - } - - // Print the response - console.log(response.body); - }, -); -``` -{% endtab %} - -{% tab title="Go" %} -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "net/http" -) - -func main() { - // Set the API endpoint and model name - endpoint := "https://api.runpod.ai/v1/stable-diffusion-v1/run" - - // Set the API key and input data - apiKey := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - inputData := map[string]interface{}{ - "input": map[string]string{ - "prompt": "My creative vision.", - }, - } - - // Convert the input data to JSON - inputJSON, err := json.Marshal(inputData) - if err != nil { - log.Fatal(err) - } - - // Set the headers for the request - headers := map[string][]string{ - "Content-Type": {"application/json"}, - "Authorization": {fmt.Sprintf("Bearer %s", apiKey)}, - } - - // Make the request - resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(inputJSON)) - if err != nil { - log.Fatal(err) - } - defer resp.Body.Close() - - // Print the response - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - fmt.Println(string(body)) -} -``` -{% endtab %} -{% endtabs %} - -{% swagger method="post" path="/v1/stable-diffusion-v1/run" baseUrl="https://api.runpod.ai" summary="Run an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="header" name="Authorization" required="true" %} -RunPod API Key -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input" type="Object" required="true" %} -Input Object contains prompt, and more -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="webhook" type="String" %} -URL endpoint to receive a webhook call on job complete, fail, or timeout. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt" required="true" type="String" %} -Your input prompt. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.negative_prompt" type="String" required="false" %} -Specify things to not see in the output. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.width" type="Integer" %} -With of output image.\ -128, 256, 384, 448, 512, 576, 640, 704, 768 - -**Default: 512**\ - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.height" type="Integer" %} -Height of output image.\ -128, 256, 384, 448, 512, 576, 640, 704, 768 - -**Default: 512** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.init_image" type="String" %} -URL for an initial image to generate variations of. Will be resized to the specific width and height. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.mask" type="String" %} -URL of a black and white image to use as a mask for inpainting over init\_image. Black pixels are inpainted and white pixels are preserved. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.guidance_scale" type="Float" %} -Scale for classifier-free guidance.\ -Rage 1 -> 20 - -**Default: 7.5** -{% endswagger-parameter %} - -{% swagger-parameter in="body" type="Integer" name="input.num_inference_steps" %} -The number of denoising steps.\ -Range 1 -> 500 - -**Default: 50** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.num_outputs" type="Integer" %} -The number of images to output.\ -Range 1 -> 10 - -**Default: 1** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt_strength" type="Float" %} -How much importance is given to the prompt.\ -Range: 0.0 -> 1.0 - -**Default: 0.8** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.scheduler" type="String" %} -Choose a scheduler.\ -Options: DDIM, DDPM, DPM-M, DPM-S, EULER-A, EULER-D, HEUN, IPNDM, KDPM2-A, KDPM2-D, PNDM, K-LMS - -**Default: K-LMS** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.seed" type="Integer" %} -Random seed. - -\ - - - - -**Default: None** -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` -{% endswagger-response %} - -{% swagger-response status="400: Bad Request" description="Invalid input" %} - -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} - -{% endswagger-response %} - -{% swagger-response status="429: Too Many Requests" description="Rate limited due to many requests" %} - -{% endswagger-response %} -{% endswagger %} - -{% swagger method="get" path="/v1/stable-diffusion-v1/status/{ REQUEST_ID }" baseUrl="https://api.runpod.ai" summary="Status and output of an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="path" name="REQUEST_ID" type="UUID" required="true" %} -inference request id -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "delayTime": 71, // (milliseconds) time in queue - "executionTime": 3423, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "39a6a9eb-3f39-40ee-892f-d3c2b2545a2f", - "input": { - "height": 640, - "num_inference_steps": 50, - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists", - "width": 512 - }, - "output": [ - "https://r2..." // securely signed URLs - ], - "status": "COMPLETED" // COMPLETED, IN_QUEUE, IN_PROGRESS, FAILED -} -``` -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} -{% endswagger %} diff --git a/serverless-ai/custom-apis/README.md b/serverless-ai/custom-apis/README.md deleted file mode 100644 index a7fc8c5..0000000 --- a/serverless-ai/custom-apis/README.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -description: Bring your own container image, we scale and handle the rest. ---- - -# Custom APIs - -### Overview - -While we try to add APIs where we can, we can only maintain and create so many APIs. If you have a custom use case, you can use our custom API support to stand up your own serverless API! - diff --git a/serverless-ai/custom-apis/autoscaling.md b/serverless-ai/custom-apis/autoscaling.md deleted file mode 100644 index 13ae7ac..0000000 --- a/serverless-ai/custom-apis/autoscaling.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -description: >- - The Serverless AI platform enables seamless scale for your models. The - following properties can be defined for your service. ---- - -# Autoscaling - -New APIs can be created from the [API management page](https://www.runpod.io/console/serverless/user/apis). - -**API Name**\ -****Anything you prefer. - -**Template**\ -Select from your templates. The template controls what worker is used to run your API jobs. - -**Min Workers** - -This is the minimum amount of workers that we will try to keep running for you. A minimum worker count of 0 means that if your API doesn't receive requests for a while, then you will have no active workers running. This will help you save on your costs, but may mean that the first cold start will take a bit longer than average. Use your discretion to pick something that suits your scale and budget. - -**Max Workers** - -You can also configure a max worker count. This is the top limit of what RunPod will attempt to autoscale for you. Use this to cap your concurrent request count and also limit your cost ceiling. - -**Idle Timeout** (seconds)\ -Idle timeout to wait before a worker is scaled down. If you specify 5 seconds, workers will sit idle for at least 5 seconds before it's stopped to help reduce cost. - -**GPU Type**\ -****You can currently choose between three varieties of configurations: 16 GB, 24 GB, or 80 GB VRAM.\ -For the 16 GB variety, we deploy NVIDIA RTX A4000.\ -For the 24 GB variety, we deploy NVIDIA RTX A5000 or 3090. \ -For the 80 GB variety, we deploy NVIDIA A100 80 GB. - -A100s are about 2-3x faster than A5000s and also allow double the VRAM with very high bandwidth throughout. 3090s and A5000s are 1.5-2x faster than A4000s. Sometimes it may make more sense to use 24 GB even if you don't need it compared to 16 GB due to faster response times. Do your own calculations to figure out what's more cost effective for your workload. - -Want access to different flavors? Let us know and we can look at expanding our offerings! diff --git a/serverless-ai/custom-apis/template-creation.md b/serverless-ai/custom-apis/template-creation.md deleted file mode 100644 index 5b37a3d..0000000 --- a/serverless-ai/custom-apis/template-creation.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -description: Templates define additional configuration for deploying workers ---- - -# Template Creation - -You can access [template creation here](https://www.runpod.io/console/serverless/user/templates). - -The following properties can be defined per template. - -**Template Name**\ -****Name your template anything you want to help your organize your templates. - -**Container Image**\ -****Location to the container image, could be from docker-hub or any other repository. You can use - -`runpod/serverless-hello-world` - -here if you didn't build your own worker. - -**Container Registry Credentials**\ -****Link container credentials for private repositories. These can be configured in your [user settings menu](https://www.runpod.io/console/serverless/user/settings). - -**Docker Command**\ -****Command to run on container startup; by default command defined in the Dockerfile will be used. - -**Container Disk**\ -****Amount of disk required to run your worker. This will depend on how big your model and other files are in the container. - -**Environment Variables**\ -****Use these to pass config and secrets to your container. diff --git a/serverless-ai/custom-apis/using-your-api.md b/serverless-ai/custom-apis/using-your-api.md deleted file mode 100644 index 9a8e07f..0000000 --- a/serverless-ai/custom-apis/using-your-api.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -description: Okay so now you have everything set up, but how do you use it? ---- - -# Using Your API - -Once everything above is configured, you will be able to invoke your API using the "run" endpoint on your API dashboard. Our services are currently asynchronous, so you must use the "status" endpoint to get the status/results of each run using the id present in the run response payload. You can also pass in webhook URL when invoking "run" within the JSON body. - -Our own APIs are built using the same tools, so you can take a look at the [RunPod API overview](../../serverless-ai-api/getting-started.md). The only difference is that your custom API endpoint only accepts requests using your own account's API key, not any RunPod API key. diff --git a/serverless-ai/runpod-apis/anything-v3-sd-v1.5.md b/serverless-ai/runpod-apis/anything-v3-sd-v1.5.md deleted file mode 100644 index 7e066bc..0000000 --- a/serverless-ai/runpod-apis/anything-v3-sd-v1.5.md +++ /dev/null @@ -1,349 +0,0 @@ ---- -description: >- - Anything V3 - a latent diffusion model for weebs. This model is intended to - produce high-quality, highly detailed anime style with just a few prompts. ---- - -# Anything v3 (SD-v1.5) - -Model: [https://huggingface.co/Linaqruf/anything-v3.0](https://huggingface.co/Linaqruf/anything-v3.0) - -### Examples - -{% tabs %} -{% tab title="cURL" %} -### Create a job request - -```bash -curl -X POST https://api.runpod.ai/v1/sd-anything-v3/run \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ --d '{"input": {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"}}' -``` - -#### Response - -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` - -### - -### Retrieve Status/Output - -```bash -curl https://api.runpod.ai/v1/sd-anything-v3/status/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -``` - -#### Response - -```json -{ - "delayTime": 123456, // (milliseconds) time in queue - "executionTime": 1234, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "input": { - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" - }, - "output": [ - { - "image": "https://job.results1", - "seed": 1 - }, - { - "image": "https://job.results2", - "seed": 2 - } - ], - "status": "COMPLETED" -} -``` -{% endtab %} - -{% tab title="Python" %} -
import requests
-
-# Set the API endpoint URL
-endpoint = "https://api.runpod.ai/v1/sd-anything-v3/run"
-
-# Set the headers for the request
-headers = {
-  "Content-Type": "application/json",
-  "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- }
-
-# Define your inputs
-input_data = {
-  "input": {
-    "prompt": "My creative vision."
-  }
- }
-
-# Make the request
-response = requests.post(endpoint, json=input_data, headers=headers)
-
-# Print the response 
-print(response.text)             
-
-{% endtab %} - -{% tab title="NodeJS" %} -```javascript -const request = require('request'); - -// Set the API endpoint and model name -const endpoint = 'https://api.runpod.ai/v1/sd-anything-v3/run'; - -// Set the API key and input data -const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; -const inputData = { - input: { - prompt: 'My creative vision.', - }, -}; - -// Set the headers for the request -const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, -}; - -// Make the request -request.post( - { - url: endpoint, - json: inputData, - headers, - }, - (err, response) => { - if (err) { - console.error(err); - return; - } - - // Print the response - console.log(response.body); - }, -); -``` -{% endtab %} - -{% tab title="Go" %} -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "net/http" -) - -func main() { - // Set the API endpoint and model name - endpoint := "https://api.runpod.ai/v1/sd-anything-v3/run" - - // Set the API key and input data - apiKey := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - inputData := map[string]interface{}{ - "input": map[string]string{ - "prompt": "My creative vision.", - }, - } - - // Convert the input data to JSON - inputJSON, err := json.Marshal(inputData) - if err != nil { - log.Fatal(err) - } - - // Set the headers for the request - headers := map[string][]string{ - "Content-Type": {"application/json"}, - "Authorization": {fmt.Sprintf("Bearer %s", apiKey)}, - } - - // Make the request - resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(inputJSON)) - if err != nil { - log.Fatal(err) - } - defer resp.Body.Close() - - // Print the response - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - fmt.Println(string(body)) -} -``` -{% endtab %} -{% endtabs %} - -{% swagger method="post" path="/v1/sd-anything-v3/run" baseUrl="https://api.runpod.ai" summary="Run an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="header" name="Authorization" required="true" %} -RunPod API Key -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input" type="Object" required="true" %} -Input Object contains prompt, and more -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="webhook" type="String" %} -URL endpoint to receive a webhook call on job complete, fail, or timeout. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt" required="true" %} -Your input prompt. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.negative_prompt" type="String" %} -Specify things to not see in the output. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.width" type="Integer" %} -With of output image.\ -128, 256, 384, 448, 512, 576, 640, 704, 768 - -**Default: 512**\ - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.height" type="Integer" %} -Height of output image.\ -128, 256, 384, 448, 512, 576, 640, 704, 768 - -**Default: 512** -{% endswagger-parameter %} - -{% swagger-parameter in="body" type="String" name="input.init_image" %} -URL for an initial image to generate variations of. Will be resized to the specific width and height. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.mask" type="String" %} -URL of a black and white image to use as a mask for inpainting over init\_image. Black pixels are inpainted and white pixels are preserved. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.guidance_scale" type="Float" %} -Scale for classifier-free guidance.\ -Rage 1 -> 20 - -**Default: 7.5** -{% endswagger-parameter %} - -{% swagger-parameter in="body" type="Integer" name="input.num_inference_steps" %} -The number of denoising steps.\ -Range 1 -> 500 - -**Default: 50** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.num_outputs" type="Integer" %} -The number of images to output.\ -Range 1 -> 10 - -**Default: 1** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt_strength" type="Float" %} -How much importance is given to the prompt.\ -Range: 0.0 -> 1.0 - -**Default: 0.8** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.scheduler" type="String" %} -Choose a scheduler.\ -Options: DDIM, K-LMS, PNDM - -**Default: K-LMS** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.seed" type="Integer" %} -Random seed. - -\ - - - - -**Default: None** -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` -{% endswagger-response %} - -{% swagger-response status="400: Bad Request" description="Invalid input" %} - -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} - -{% endswagger-response %} - -{% swagger-response status="429: Too Many Requests" description="Rate limited due to many requests" %} - -{% endswagger-response %} -{% endswagger %} - -{% swagger method="get" path="/v1/sd-anything-v3/status/{ REQUEST_ID }" baseUrl="https://api.runpod.ai" summary="Status and output of an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="path" name="REQUEST_ID" type="UUID" required="true" %} -inference request id -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "delayTime": 71, // (milliseconds) time in queue - "executionTime": 3423, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "39a6a9eb-3f39-40ee-892f-d3c2b2545a2f", - "input": { - "height": 640, - "num_inference_steps": 50, - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists", - "width": 512 - }, - "output": [ - "https://r2..." // securely signed URLs - ], - "status": "COMPLETED" // COMPLETED, IN_QUEUE, IN_PROGRESS, FAILED -} -``` -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} -{% endswagger %} diff --git a/serverless-ai/runpod-apis/dreambooth-sd-v1.5.md b/serverless-ai/runpod-apis/dreambooth-sd-v1.5.md deleted file mode 100644 index 68f1ed0..0000000 --- a/serverless-ai/runpod-apis/dreambooth-sd-v1.5.md +++ /dev/null @@ -1,650 +0,0 @@ ---- -description: >- - DreamBooth is a deep learning generation model that fine-tunes existing - text-to-image models such as Stable Diffusion. ---- - -# DreamBooth (SD-v1.5) - -This is an adaptation of [DreamBooth](https://github.com/TheLastBen/fast-stable-diffusion) by [TheLastBen](https://github.com/TheLastBen) to a [RunPod Endpoint](https://www.runpod.io/endpoints). This endpoint requires the URL to a publicly accessible .zip file containing a folder of images of a concept to fine-tune the model. If you want to dive deep into DreamBooth, look at the [original paper](https://arxiv.org/pdf/2208.12242.pdf). - -{% tabs %} -{% tab title="cURL" %} -### Create a job request - -```bash -curl -X POST https://api.runpod.ai/v1/dream-booth-v1/run \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ --d '{"input": {"train": {"data_url": "https://your_public.zip"}, "inference":[ {"prompt": "A yellow submarine."} ] }}' -``` - -#### Response - -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` - -### - -### Retrieve Status/Output - -```bash -curl https://api.runpod.ai/v1/dream-booth-v1/status/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -``` - -#### Response - -```json -{ - "delayTime": 123456, // (milliseconds) time in queue - "executionTime": 1234, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "input": { - "train": { - "data_url": "https://your_public.zip" - }, - "inference":[ - {"prompt": "A yellow submarine."} - ] - }, - "status": "COMPLETED" -} -``` -{% endtab %} - -{% tab title="Python" %} -```python -import requests - -# Set the API endpoint URL -endpoint = "https://api.runpod.ai/v1/dream-booth-v1/run" - -# Set the headers for the request -headers = { - "Content-Type": "application/json", - "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - } - -# Define your inputs -input_data = { - "input": { - "train": { - "data_url": "https://your_public.zip" - }, - "inference":[ - {"prompt": "A yellow submarine."} - ] - } -} - -# Make the request -response = requests.post(endpoint, json=input_data, headers=headers) - -# Print the response -print(response.text) -``` -{% endtab %} - -{% tab title="NodeJS" %} -```javascript -const request = require('request'); - -// Set the API endpoint and model name -const endpoint = 'https://api.runpod.ai/v1/dream-booth-v1/run'; - -// Set the API key and input data -const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; -const inputData = { - "input": { - "train": { - "data_url": "https://your_public.zip" - }, - "inference":[ - {"prompt": "A yellow submarine."} - ] - } -}; - -// Set the headers for the request -const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, -}; - -// Make the request -request.post( - { - url: endpoint, - json: inputData, - headers, - }, - (err, response) => { - if (err) { - console.error(err); - return; - } - - // Print the response - console.log(response.body); - }, -); -``` -{% endtab %} - -{% tab title="GO" %} -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "net/http" -) - -func main() { - // Set the API endpoint and model name - endpoint := "https://api.runpod.ai/v1/dream-booth-v1/run" - - // Set the API key and input data - apiKey := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - inputData := map[string]interface{}{ - "input": { - "train": { - "data_url": "https://your_public.zip" - }, - "inference":[ - {"prompt": "A yellow submarine."} - ] - } -} - - // Convert the input data to JSON - inputJSON, err := json.Marshal(inputData) - if err != nil { - log.Fatal(err) - } - - // Set the headers for the request - headers := map[string][]string{ - "Content-Type": {"application/json"}, - "Authorization": {fmt.Sprintf("Bearer %s", apiKey)}, - } - - // Make the request - resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(inputJSON)) - if err != nil { - log.Fatal(err) - } - defer resp.Body.Close() - - // Print the response - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - fmt.Println(string(body)) -} -``` -{% endtab %} -{% endtabs %} - -### Supported Inputs - -```json -{ - "input": { - "train": { - "data_url": str, - "concept_name": str, - "offset_noise": bool, - "hf_model": str, - "hf_token": str, - "ckpt_link": str, - "text_steps": int, - "text_seed": int, - "text_batch_size": int, - "text_resolution": int, - "text_learning_rate": float, - "text_lr_scheduler": str, - "text_8_bit_adam": bool, - "unet_seed": int, - "unet_batch_size": int, - "unet_resolution": int, - "unet_epochs": int, - "unet_learning_rate": float, - "unet_lr_scheduler": str, - "unet_8_bit_adam": bool, - }, - "inference": [ - { - "enable_hr": bool, - "denoising_strength": int, - "firstphase_width": int, - "firstphase_height": int, - "hr_scale": int, - "hr_upscaler": str, - "hr_second_pass_steps": int, - "hr_resize_x": int, - "hr_resize_y": int, - "prompt": str, - "styles": list, - "seed": int, - "subseed": int, - "subseed_strength": int, - "seed_resize_from_h": int, - "seed_resize_from_w": int, - "sampler_name": str, - "batch_size": int, - "n_iter": int, - "steps": int, - "cfg_scale": int, - "width": int, - "height": int, - "restore_faces": bool, - "tiling": bool, - "negative_prompt": str, - "eta": int, - "s_churn": int, - "s_tmax": int, - "s_tmin": int, - "s_noise": int, - "sampler_index": str, - "script_name": str, - "passback": str - } - ] - }, - "s3Config": { - "accessId": str, - "accessSecret": str, - "bucketName": str, - "endpointUrl": str - }, - "webhook": str -} -``` - -{% swagger method="post" path="/v1/dream-booth-v1/run" baseUrl="https://api.runpod.ai" summary="Run an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="body" name="input" type="Object" required="true" %} -Input object containing your training paramaters, optional infrerence paramaters, optional S3 bucket, and optional webhook. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train" type="Object" required="true" %} -Contains the list of configurations to train a new model. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.data_url" type="String" required="true" %} -A bublicly accessible URL to your zip file containing your data set images. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.concept_name" type="String" %} -A uniqe name to train your concept with, this will over-ride your file names using the following scheme: - -_"concept (#).jpg"_ -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.offset_noise" type="Boolean" %} -Enables [offset noise](https://blog.runpod.io/get-awesomer-outputs-from-dreambooth-with-offset-noise/) for style training. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.hf_model" type="String" %} -URL to a HuggingFace model(repository/model). The model MUST contain a diffuser style model. If it is a standard CKPT, use ckpt\_url - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.trian.hf_token" type="String" %} -If the huggingface repo is private, your user access token. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.ckpt_link" type="String" %} -Publicly accessable link toa ckpt file. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.text_steps" type="Integer" %} -The number of steps used to train the text encoder. - -**Default: 350** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.text_seed" type="Integer" %} -The seed used to train the text encoder. - -**Default: 555** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.text_batch_size" type="Integer" %} -The number of images passed each step of the text encoder process. - -Default: 1 -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.text_resolution" type="Integer" %} -The training resolution used for the text training. - -**Default: 512** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.text_learning_rate" type="Float" %} -The learning rate for the text encoder. - -**Default: 1e-6** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.text_lr_scheduler" type="String" %} -The scheduler used when training the text encoder. - -_Options: linear, cosine, cosine\_with\_restarts, polynomial, constant, constant\_with\_warmup_ - -**Default: linear** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.text_8_bit_adam" type="Boolean" %} -Enable 8-bit-adam. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.unet_seed" type="Integer" %} -The seed used for training the UNet. - -**Default: 555** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.unet_batch_size" type="Integer" %} -The number of images that are passed through in a single training step. - -**Default: 1** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.unet_resolution" type="Integer" %} -The resolution at which the UNet is trained. - -**Default: 256** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.unet_epochs" type="Integer" %} -The number of epochs used when training the UNet, the number of steps are extrapalated by multiplying the number of input images by the epochs. - -**Default: 150** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.unet_learning_rate" type="Float" %} -The learning rate when training the UNet. - -**Default: 2e-6** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.unet_lr_scheduler" type="Integer" %} -The scheduler used when training the UNet ext encoder. - -_Options: linear, cosine, cosine\_with\_restarts, polynomial, constant, constant\_with\_warmup_ - -**Default: linear** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.train.unet_8_bit_adam" type="Boolean" %} -Enable 8-bit-adam. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference" type="List" %} -A list of infrence prompts to generate images from. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.enable_hr" type="Boolean" %} -Toggle for hires fix. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.denoising_strength" type="Integer" %} -The amount of denoising applied to the image. - -**Default: 0** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.firstphase_width" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.firstphase_height" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.hr_scale" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.hr_upscaler" type="String" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.hr_second_pass_steps" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.hr_resize_x" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.hr_resize_y" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.prompt" type="String" required="true" %} -The prompt that is used for the generation of the image. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.styles" type="List" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.seed" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.subseed" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.subseed_strength" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.seed_resize_from_h" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.seed_resize_from_w" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.sampler_name" type="String" %} -Sampler used to generate images. No underscore required.\ -_Options: Euler a, Euler, LMS, Heun, DPM2, DPM2 a, DPM++ 2S a, DPM++ 2M, DPM++ SDE, DPM fast, DPM adaptive, LMS Karras, DPM2 Karras, DPM2 a Karras, DPM++ 2S a Karras, DPM++ 2M Karras, DPM++ SDE Karras_ - -**Default: Euler a** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.batch_size" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.n_iter" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.steps" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.cfg_scale" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.width" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.height" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.restore_faces" type="Boolean" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.tiling" type="Boolean" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.negative_prompt" type="String" %} -Prompt for things that should not appear in the final resulting image. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.eta" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.s_churn" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.s_tmax" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.s_tmin" type="Integer" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.s_noise" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.sampler_index" type="String" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.script_name" type="String" %} - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.inference.passback" type="String" %} -An otpional string that you can provide, this string is simply returned with the corrisponding image in your request. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="webhook" type="String" %} -URL endpoint to receive a webhook call on job complete, fail, or timeout. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="s3Config" type="Object" %} -Credentials for a user-defined S3 compatible bucket where the trained model can be uploaded to. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="s3Config.accessId" type="String" %} -The ID required for your S3 bucket. - -\ - - - - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="s3Config.accessSecret" type="String" %} -The secret required for your S3 bucket. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="s3Config.bucketName" type="String" %} -The name of the bucket where you want to upload your model to. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="s3Config.endpointUrl" type="String" %} -The URL for your S3 bucket. -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON Response" %} -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` -{% endswagger-response %} - -{% swagger-response status="400: Bad Request" description="Invalid input" %} - -{% endswagger-response %} - -{% swagger-response status="401" description="Invalid API Key" %} - -{% endswagger-response %} - -{% swagger-response status="429: Too Many Requests" description="Rate limited due to many requests" %} - -{% endswagger-response %} -{% endswagger %} - -{% swagger method="get" path="/v1/dream-booth-v1/status/{REQUEST_ID}" baseUrl="https://api.runpod.ai" summary="Status and output of an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="path" name="REQUEST_ID" required="true" type="UUID" %} -Inference Request id -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="" %} -```json -{ - "delayTime": 123456, // (milliseconds) time in queue - "executionTime": 1234, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "input": { - "train": { - "data_url": "https://your_public.zip" - }, - "inference":[ - {"prompt": "A yellow submarine."} - ] - }, - "status": "COMPLETED" -} -``` -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} -{% endswagger %} - -_Please reach out in discord or email us at support@runpod.io for feature requests regarding DreamBooth fine-tuning._ diff --git a/serverless-ai/runpod-apis/everydream-sd-v1.5.md b/serverless-ai/runpod-apis/everydream-sd-v1.5.md deleted file mode 100644 index 62a691a..0000000 --- a/serverless-ai/runpod-apis/everydream-sd-v1.5.md +++ /dev/null @@ -1,639 +0,0 @@ ---- -description: >- - EveryDream provides general fine-tuning for Stable Diffusion. This endpoint - also provides inference so that models can be trained and images can be - generated in one shot. ---- - -# EveryDream (SD-v1.5) - -This is an adaptation of [EveryDream2trainer by victorchall](https://github.com/victorchall/EveryDream2trainer) to a [RunPod Endpoint](https://www.runpod.io/endpoints). To run this endpoint, you will need a publicly accessible .zip file that contains images of a concept you wish to fine-tune the model with. The key to successfully using EveryDream is to have well-captioned images. Here is the [official guide on data preparation](https://github.com/victorchall/EveryDream2trainer/blob/main/doc/DATA.md). - -### Examples - -{% tabs %} -{% tab title="cURL" %} -### Create a job request - -```bash -curl -X POST https://api.runpod.ai/v1/everydream-v1/run \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ --d '{"input": {"train": {"data_url": "https://LINK_TO_ZIP.FILE"}, "inference": [{"prompt": "a unique 123xyz concept name as a superhero"}]}}' -``` - -#### Response - -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` - -### Retrieve Status/Output - -```bash -curl https://api.runpod.ai/v1/everydream-v1/status/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -``` - -#### Response - -```json -{ - "delayTime": int, - "executionTime": int, - "gpu": str, - "id": str, - "input": {}, - "output": {}, - "status": str -} -``` -{% endtab %} - -{% tab title="Python" %} -```python -import requests - -# Set the API endpoint URL -endpoint = "https://api.runpod.ai/v1/everydream-v1/run" - -# Set the headers for the request -headers = { - "Content-Type": "application/json", - "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - } - -# Define your inputs -input_data = { - "input": { - "train": { - "data_url": "https://LINK_TO_ZIP.FILE" - }, - "inference": { - "prompt": "a unique 123xyz concept name as a superhero" - } - } -} - -# Make the request -response = requests.post(endpoint, json=input_data, headers=headers) - -# Print the response -print(response.text) -``` -{% endtab %} - -{% tab title="NodeJS" %} -```javascript -const request = require('request'); - -// Set the API endpoint and model name -const endpoint = 'https://api.runpod.ai/v1/everydream-v1/run'; - -// Set the API key and input data -const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; -const inputData = { - "input": { - "train": { - "data_url": "https://LINK_TO_ZIP.FILE" - }, - "inference": { - "prompt": "a unique 123xyz concept name as a superhero" - } - } -}; - -// Set the headers for the request -const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, -}; - -// Make the request -request.post( - { - url: endpoint, - json: inputData, - headers, - }, - (err, response) => { - if (err) { - console.error(err); - return; - } - - // Print the response - console.log(response.body); - }, -); -``` -{% endtab %} - -{% tab title="GO" %} -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "net/http" -) - -func main() { - // Set the API endpoint and model name - endpoint := "https://api.runpod.ai/v1/everydream-v1/run" - - // Set the API key and input data - apiKey := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - inputData := map[string]interface{}{ - "input": { - "train": { - "data_url": "https://LINK_TO_ZIP.FILE" - }, - "inference": { - "prompt": "a unique 123xyz concept name as a superhero" - } - } -} - - // Convert the input data to JSON - inputJSON, err := json.Marshal(inputData) - if err != nil { - log.Fatal(err) - } - - // Set the headers for the request - headers := map[string][]string{ - "Content-Type": {"application/json"}, - "Authorization": {fmt.Sprintf("Bearer %s", apiKey)}, - } - - // Make the request - resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(inputJSON)) - if err != nil { - log.Fatal(err) - } - defer resp.Body.Close() - - // Print the response - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - fmt.Println(string(body)) -} -``` -{% endtab %} -{% endtabs %} - -### Supported Inputs - -```json -{ - "input": { - "train": { - "amp": bool, - "batch_size": int, - "ckpt_every_n_minutes": int, - "clip_grad_norm": float, - "clip_skip": int, - "cond_dropout": float, - "data_url": str, - "disable_textenc_training": bool, - "disable_unet_training": bool, - "disable_xformers": bool, - "flip_p": float, - "gradient_checkpointing": bool, - "grad_accum": int, - "hf_repo_subfolder": str, - "lr": float, - "lr_decay_steps": int, - "lr_scheduler": str, - "lr_warmup_steps": int, - "max_epochs": int, - "resolution": int, - "resume_ckpt_url": str, - "sample_prompts": list, - "sample_steps": int, - "save_full_precision": bool, - "save_optimizer": bool, - "scale_lr": bool, - "seed": int, - "shuffle_tags": bool, - "useadam8bit": bool, - "rated_dataset": bool, - "rated_dataset_target_dropout_percent": int - }, - "inference": [ - { - "prompt": str, - "negative_prompt": str, - "width": int, - "height": int, - "num_outputs": int, - "num_inference_steps": int, - "guidance_scale": float, - "scheduler": str, - "seed": int, - "passback": str - } - ] - }, - "s3Config": { - "accessId": str, - "accessSecret": str, - "bucketName": str, - "endpointUrl": str - }, - "webhook": str -} -``` - -{% swagger method="post" path="/v1/everydream-v1/run" baseUrl="https://api.runpod.ai" summary="" %} -{% swagger-description %} -Run a training & inference request. -{% endswagger-description %} - -{% swagger-parameter in="body" name="train" type="Object" %} -Contains the list of configuration options to train a new model. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.amp" type="Boolean" %} -Enables automatic mixed precision compute. - -**Default: True** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.batch_size" type="Integer" %} -Batch size - -**Default: 2** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.ckpt_every_n_minutes" type="Integer" %} -Save checkpoint every n minutes. - -**Default: 20** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.clip_grad_norm" type="Float" %} -Clip gradient norm, useful if loss=nan? - -\ - - - - -**Default: None (Disabled)** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.clip_skip" type="Integer" %} -Train using penultimate layer. - -_Options: 0, 1, 2, 3,4_ - -**Default: 0** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.cond_dropout" type="Float" %} -Conditional drop out as decimal, see [docs](https://github.com/victorchall/EveryDream2trainer/blob/main/doc/ATWEAKING.md#conditional-dropout) for more info - -_Options: 0.0 -> 1.0_\ -**Default: 0.04** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.data_url" type="String" required="true" %} -URL to a publicly accessible zip file that contains the training images. - -\ - - - - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.disable_textenc_training" type="Boolean" %} -Disables training of text encoder. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.disable_unet_training" type="Boolean" %} -Disables training of unet. (NOT RECOMMENDED) - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.disable_xformers" type="Boolean" %} -Disable xformers, may reduce performance. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.flip_p" type="Float" %} -Probability of flipping image horizontally, not good for specific faces! - -_Options: 0.0 -> 1.0_ - -**Default: 0.0** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.gradient_checkpointing" type="Boolean" %} -Enable gradient checkpointing to reduce VRAM use, may reduce performance. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.grad_accum" type="Integer" %} -Gradient accumulation factor. - -**Default: 1** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.hf_repo_subfolder" type="String" %} -Subfolder inside the huggingface repo to download, if the model is not in the root of the repo. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.lr" type="Float" %} -Learning rate, if using scheduler is maximum LR at top of curve. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.lr_decay_steps" type="Integer" %} -Steps to reach minimum LR. - -**Default: None, automatically set** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.lr_scheduler" type="String" %} -LR scheduler - -_Options: constant, linear, cosine, polynomial_ - -**Default: constant** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.lr_warmup_steps" type="Integer" %} -Steps to reach max LR during warmup , non-functional for constant. - -**Default: 0.02 of lr\_decay\_steps** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.max_epochs" type="Integer" %} -Maximum number of epochs to train for. - -**Default: 300** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.resolution" type="Integer" %} -Resolution to train. - -_Options: 256, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024, 1088, 1152_ - -**Default: 512** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.resume_ckpt_url" type="String" %} -The url to a publicly available checkpoint to resume from, either a local .ckpt file, a converted Diffusers format (ziped) folder, or a Huggingface.co repo such as [https://huggingface.co/stabilityai/stable-diffusion-2-1](https://huggingface.co/stabilityai/stable-diffusion-2-1) - -**Default: sd\_v1-5\_vae.ckpt** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.sample_prompts" type="List" %} -A list of prompt strings to generate samples from your trained model. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.sample_steps" type="Integer" %} -Number of steps between samples. - -**Default: 250** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.save_full_precision" type="Boolean" %} -Save ckpts at full FP32 - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.save_optimizer" type="Boolean" %} -Saves optimizer state with ckpt, useful for resuming training later. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.scale_lr" type="Boolean" %} -Automatically scale up learning rate based on batch size and grad accumulation. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.seed" type="Integer" %} -Seed used for samples and shuffling, use -1 for random. - -**Default: 555** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.shuffle_tags" type="Boolean" %} -Randomly shuffles CSV tags in captions, for booru datasets. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.useadam8bit" type="Boolean" %} -Use AdamW 8-Bit optimizer, recommended! - -**Default: True** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.rated_dataset" type="Boolean" %} -Enable rated image set training, to less often train on lower rated images through the epochs. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="train.rated_dataset_target_dropout_percent" type="Integer" %} -How many images (in percent) should be included in the last epoch. - -_Options: 1 -> 100_ - -**Default: 50** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference" type="List" %} -A list of images to create once the model has been trained. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference.prompt" type="String" required="true" %} -Input prompt. - -Default: None -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference.negative_prompt" type="String" %} -Specify things to not see in the output. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference.width" type="Integer" %} -Width of the output image. - -_Options: 128, 256, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024_ - -**Default: 512** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference.height" type="Integer" %} -Height of the output image. - -_Options: 128, 256, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024_ - -**Default: 512** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference.num_outputs" type="Integer" %} -Number of batched images to generate for the given prompt. - -\ - - - - -_Options: 1 -> 10_ - -\ - - - - -**Default: 1** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference:num_inference_steps" type="Integer" %} -Number of denoising steps.\ -_Options: 1 -> 500_ - -**Default: 50** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference:guidance_scale" type="Float" %} -Scale for classifier-free guidance. - -_Options: 1 -> 20_ - -**Default: 7.5** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference:scheduler" type="String" %} -Choose a scheduler. - -_Options: DDIM, DDPM, DPM-M, DPM-S, EULER-A, EULER-D, HEUN, IPNDM, KDPM2-A, KDPM2-D, PNDM, K-LMS_ - -**Default: K-LMS** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference.seed" type="Integer" %} -Random seed. - -\ - - - - -**Default: Random** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="inference.passback" type="String" %} -User provide note/identifier, passed back with the corresponding image. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="s3Config" type="Object" %} -Credentials for a user-defined S3 compatibe bucket where the trained model can be uploaded to. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="s3Config.accessId" type="String" %} -The ID required for your S3 bucket. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="s3Config.accessSecret" type="String" %} -The secret required for your S3 bucket. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="s3Config.bucketName" type="String" %} -The name of the bucket where you want to upload your model to. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="s3Config.endpointUrl" type="String" %} -The URL for your S3 bucket. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="webhook" type="String" %} -URL endpoint to receive a webhook call on job complete, fail, or timeout. -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="Request successfully received. " %} -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` -{% endswagger-response %} - -{% swagger-response status="400: Bad Request" description="Invalid input" %} - -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} - -{% endswagger-response %} - -{% swagger-response status="429: Too Many Requests" description="Rate limited due to too many requests. " %} - -{% endswagger-response %} -{% endswagger %} - -{% swagger method="get" path="/v1/everydream-v1/status/{ REQUEST_ID }" baseUrl="https://api.runpod.ai" summary="" %} -{% swagger-description %} -Status and output of an inference request. -{% endswagger-description %} - -{% swagger-parameter in="path" name="REQUEST_ID" type="UUID" %} -Inference request ID -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="Contains the job status along with the output." %} -```json -{ - "delayTime": int, - "executionTime": int, - "gpu": str, - "id": str, - "input": {}, - "output": {}, - "status": str -} -``` -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} -{% endswagger %} diff --git a/serverless-ai/runpod-apis/openjourney-sd-v1.5.md b/serverless-ai/runpod-apis/openjourney-sd-v1.5.md deleted file mode 100644 index a781d18..0000000 --- a/serverless-ai/runpod-apis/openjourney-sd-v1.5.md +++ /dev/null @@ -1,351 +0,0 @@ ---- -description: >- - Openjourney is an open-source Stable Diffusion fine-tuned model on Midjourney - images by PromptHero. ---- - -# Openjourney (SD-v1.5) - -Model: [https://huggingface.co/prompthero/openjourney](https://huggingface.co/prompthero/openjourney) - -{% tabs %} -{% tab title="cURL" %} -### Create a job request - -```bash -curl -X POST https://api.runpod.ai/v1/sd-openjourney/run \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ --d '{"input": {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"}}' -``` - -#### Response - -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` - -### - -### Retrieve Status/Output - -```bash -curl https://api.runpod.ai/v1/sd-openjourney/status/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -``` - -#### Response - -```json -{ - "delayTime": 123456, // (milliseconds) time in queue - "executionTime": 1234, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "input": { - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" - }, - "output": [ - { - "image": "https://job.results1", - "seed": 1 - }, - { - "image": "https://job.results2", - "seed": 2 - } - ], - "status": "COMPLETED" -} -``` -{% endtab %} - -{% tab title="Python" %} -```python -import requests - -# Set the API endpoint URL -endpoint = "https://api.runpod.ai/v1/sd-openjourney/run" - -# Set the headers for the request -headers = { - "Content-Type": "application/json", - "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - } - -# Define your inputs -input_data = { - "input": { - "prompt": "My creative vision." - } - } - -# Make the request -response = requests.post(endpoint, json=input_data, headers=headers) - -# Print the response -print(response.text) -``` -{% endtab %} - -{% tab title="NodeJS" %} -```javascript -const request = require('request'); - -// Set the API endpoint and model name -const endpoint = 'https://api.runpod.ai/v1/sd-openjourney/run'; - -// Set the API key and input data -const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; -const inputData = { - input: { - prompt: 'My creative vision.', - }, -}; - -// Set the headers for the request -const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, -}; - -// Make the request -request.post( - { - url: endpoint, - json: inputData, - headers, - }, - (err, response) => { - if (err) { - console.error(err); - return; - } - - // Print the response - console.log(response.body); - }, -); -``` -{% endtab %} - -{% tab title="Go" %} -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "net/http" -) - -func main() { - // Set the API endpoint and model name - endpoint := "https://api.runpod.ai/v1/sd-openjourney/run" - - // Set the API key and input data - apiKey := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - inputData := map[string]interface{}{ - "input": map[string]string{ - "prompt": "My creative vision.", - }, - } - - // Convert the input data to JSON - inputJSON, err := json.Marshal(inputData) - if err != nil { - log.Fatal(err) - } - - // Set the headers for the request - headers := map[string][]string{ - "Content-Type": {"application/json"}, - "Authorization": {fmt.Sprintf("Bearer %s", apiKey)}, - } - - // Make the request - resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(inputJSON)) - if err != nil { - log.Fatal(err) - } - defer resp.Body.Close() - - // Print the response - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - fmt.Println(string(body)) -} -``` -{% endtab %} -{% endtabs %} - -{% swagger method="post" path="/v1/sd-openjourney/run" baseUrl="https://api.runpod.ai" summary="Run an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="header" name="Authorization" required="true" %} -RunPod API Key -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input" type="Object" required="true" %} -Input Object contains prompt, and more -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="webhook" type="String" %} -URL endpoint to receive a webhook call on job complete, fail, or timeout. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt" type="String" required="true" %} -Your input prompt. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.negative_prompt" type="String" %} -Specify things to not see in the output. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.width" type="Integer" %} -With of output image.\ -128, 256, 384, 448, 512, 576, 640, 704, 768 - -**Default: 512** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.height" type="Integer" %} -Height of output image.\ -128, 256, 384, 448, 512, 576, 640, 704, 768 - -**Default: 512** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.init_image" type="String" %} -URL for an initial image to generate variations of. Will be resized to the specific width and height. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.mask" type="String" %} -URL of a black and white image to use as a mask for inpainting over init\_image. Black pixels are inpainted and white pixels are preserved. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.guidance_scale" type="Float" %} -Scale for classifier-free guidance.\ -Rage 1 -> 20 - -**Default: 7.5** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.num_inference_steps" type="Integer" %} -The number of denoising steps.\ -Range 1 -> 500 - -**Default: 50** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.num_outputs" type="Integer" %} -The number of images to output.\ -Range 1 -> 10 - -**Default: 1** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt_strength" type="Float" %} -How much importance is given to the prompt.\ -Range: 0.0 -> 1.0 - -**Default: 0.8** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.scheduler" type="Integer" %} -Choose a scheduler.\ -Options: DDIM, K-LMS, PNDM - -**Default: K-LMS** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.seed" type="Integer" %} -Random seed. - -\ - - - - -**Default: None** -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` -{% endswagger-response %} - -{% swagger-response status="400: Bad Request" description="Invalid input" %} - -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} - -{% swagger-response status="429: Too Many Requests" description="Rate limited due to many requests" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} -{% endswagger %} - -{% swagger method="get" path="/v1/sd-openjourney/status/{ REQUEST_ID }" baseUrl="https://api.runpod.ai" summary="Status and output of an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="path" name="REQUEST_ID" type="UUID" %} -Inference Request id -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "delayTime": 71, // (milliseconds) time in queue - "executionTime": 3423, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "39a6a9eb-3f39-40ee-892f-d3c2b2545a2f", - "input": { - "height": 640, - "num_inference_steps": 50, - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists", - "width": 512 - }, - "output": [ - "https://r2..." // securely signed URLs - ], - "status": "COMPLETED" // COMPLETED, IN_QUEUE, IN_PROGRESS, FAILED -} -``` -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} - -{% endswagger-response %} -{% endswagger %} diff --git a/serverless-ai/runpod-apis/stable-diffusion-v2.md b/serverless-ai/runpod-apis/stable-diffusion-v2.md deleted file mode 100644 index 0ada2fe..0000000 --- a/serverless-ai/runpod-apis/stable-diffusion-v2.md +++ /dev/null @@ -1,342 +0,0 @@ ---- -description: >- - Stable Diffusion v2 is a latent text-to-image diffusion model capable of - generating photo-realistic images given any text input. ---- - -# Stable Diffusion v2 - -{% tabs %} -{% tab title="cURL" %} -### Create a job request - -```bash -curl -X POST https://api.runpod.ai/v1/stable-diffusion-v2/run \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ --d '{"input": {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"}}' -``` - -#### Response - -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` - -### - -### Retrieve Status/Output - -```bash -curl https://api.runpod.ai/v1/stable-diffusion-v2/status/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -``` - -#### Response - -```json -{ - "delayTime": 123456, // (milliseconds) time in queue - "executionTime": 1234, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "input": { - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" - }, - "output": [ - { - "image": "https://job.results1", - "seed": 1 - }, - { - "image": "https://job.results2", - "seed": 2 - } - ], - "status": "COMPLETED" -} -``` -{% endtab %} - -{% tab title="Python" %} -```python -import requests - -# Set the API endpoint URL -endpoint = "https://api.runpod.ai/v1/stable-diffusion-v2/run" - -# Set the headers for the request -headers = { - "Content-Type": "application/json", - "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - } - -# Define your inputs -input_data = { - "input": { - "prompt": "My creative vision." - } - } - -# Make the request -response = requests.post(endpoint, json=input_data, headers=headers) - -# Print the response -print(response.text) -``` -{% endtab %} - -{% tab title="NodeJS" %} -```javascript -const request = require('request'); - -// Set the API endpoint and model name -const endpoint = 'https://api.runpod.ai/v1/stable-diffusion-v2/run'; - -// Set the API key and input data -const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; -const inputData = { - input: { - prompt: 'My creative vision.', - }, -}; - -// Set the headers for the request -const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, -}; - -// Make the request -request.post( - { - url: endpoint, - json: inputData, - headers, - }, - (err, response) => { - if (err) { - console.error(err); - return; - } - - // Print the response - console.log(response.body); - }, -); -``` -{% endtab %} - -{% tab title="Go" %} -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "net/http" -) - -func main() { - // Set the API endpoint and model name - endpoint := "https://api.runpod.ai/v1/stable-diffusion-v2/run" - - // Set the API key and input data - apiKey := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - inputData := map[string]interface{}{ - "input": map[string]string{ - "prompt": "My creative vision.", - }, - } - - // Convert the input data to JSON - inputJSON, err := json.Marshal(inputData) - if err != nil { - log.Fatal(err) - } - - // Set the headers for the request - headers := map[string][]string{ - "Content-Type": {"application/json"}, - "Authorization": {fmt.Sprintf("Bearer %s", apiKey)}, - } - - // Make the request - resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(inputJSON)) - if err != nil { - log.Fatal(err) - } - defer resp.Body.Close() - - // Print the response - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - fmt.Println(string(body)) -} -``` -{% endtab %} -{% endtabs %} - -{% swagger method="post" path="/v1/stable-diffusion-v2/run" baseUrl="https://api.runpod.ai" summary="Run an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="header" name="Authorization" type="String" required="true" %} -RunPod API Key -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input" type="Object" required="true" %} -Input Object contains prompt, and more -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="webhook" type="String" %} -URL endpoint to receive a webhook call on job complete, fail, or timeout. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt" type="String" required="true" %} -Your input prompt. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.negative_prompt" type="String" %} -Specify things to not see in the output. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.height" type="Integer" %} -Height of output image.\ -128, 256, 384, 448, 512, 576, 640, 704, 768 - -**Default: 512** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.width" type="Integer" %} -With of output image.\ -128, 256, 384, 448, 512, 576, 640, 704, 768 - -**Default: 512**\ - -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.prompt_strength" type="Float" %} -How much importance is given to the prompt.\ -Range: 0.0 -> 1.0 - -**Default: 0.8** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.num_outputs" type="Integer" %} -The number of images to output.\ -Range 1 -> 10 - -**Default: 1** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.num_inference_steps" type="Integer" %} -The number of denoising steps.\ -Range 1 -> 500 - -**Default: 50** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.guidance_scale" type="Float" %} -Scale for classifier-free guidance.\ -Rage 1 -> 20 - -**Default: 7.5** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.scheduler" type="String" %} -Choose a scheduler.\ -Options: DDIM, K\_EULER, DPMSolverMultistep, K\_EULER\_ANCESTRAL, PNDM, KLMS - -**Default: KLMS** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.seed" type="Integer" %} -Random seed. - -\ - - - - -**Default: None** -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` -{% endswagger-response %} - -{% swagger-response status="400: Bad Request" description="Invalid Input" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} - -{% swagger-response status="429: Too Many Requests" description="Rate limited due to too many requests" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} -{% endswagger %} - -{% swagger method="get" path="/v1/stable-diffusion-v2/status/{ REQUEST_ID }" baseUrl="https://api.runpod.ai" summary="Status and output of an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="path" name="REQUEST_ID" type="UUID" required="true" %} -Inference Request ID -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "delayTime": 71, // (milliseconds) time in queue - "executionTime": 3423, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "39a6a9eb-3f39-40ee-892f-d3c2b2545a2f", - "input": { - "height": 640, - "num_inference_steps": 50, - "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists", - "width": 512 - }, - "output": [ - "https://r2..." // securely signed URLs - ], - "status": "COMPLETED" // COMPLETED, IN_QUEUE, IN_PROGRESS, FAILED -} -``` -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} - -{% endswagger-response %} -{% endswagger %} diff --git a/serverless-ai/runpod-apis/whisper.md b/serverless-ai/runpod-apis/whisper.md deleted file mode 100644 index 2183e7a..0000000 --- a/serverless-ai/runpod-apis/whisper.md +++ /dev/null @@ -1,400 +0,0 @@ ---- -description: Whisper is an automatic speech recognition (ASR) system. ---- - -# Whisper - -### Required Input - -```json -{ - "input":{ - "audio": "https://LINK_TO_AUDIO.FILE" - } -} -``` - -### Examples - -{% tabs %} -{% tab title="cURL" %} -### Create a job request - -```bash -curl -X POST https://api.runpod.ai/v1/whisper/run \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ --d '{"input": {"audio": "https://LINK_TO_AUDIO.FILE"}}' -``` - -#### Response - -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` - -### - -### Retrieve Status/Output - -```bash -curl https://api.runpod.ai/v1/whisper/status/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \ --H 'Content-Type: application/json' \ --H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -``` - -#### Response - -```json -{ - "delayTime": 123456, // (milliseconds) time in queue - "executionTime": 1234, // (milliseconds) time it took to complete the job - "gpu": "24", // gpu type used to run the job - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "input": { - "audio": "https://LINK_TO_AUDIO.FILE" - }, - "output": { - "detected_language": "language", - "segments": [{ - "avg_logprob": 0.1, - "compression_ratio": 1, - "end": 2, - "id": 0, - "no_speech_prob": 0, - "seek": 0, - "start": 0, - "temperature": 1, - "text": "Couple starting words", - "tokens": [1,2,3] - }], - "transcription": "Full transcription", - "translation": null - }, - "status": "COMPLETED" -} -``` -{% endtab %} - -{% tab title="Python" %} -
import requests
-
-# Set the API endpoint URL
-endpoint = "https://api.runpod.ai/v1/whisper/run"
-
-# Set the headers for the request
-headers = {
-  "Content-Type": "application/json",
-  "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- }
-
-# Define your inputs
-input_data = {
-  "input": {
-    "audio": "https://LINK_TO_AUDIO.FILE"
-  }
- }
-
-# Make the request
-response = requests.post(endpoint, json=input_data, headers=headers)
-
-# Print the response 
-print(response.text)             
-
-{% endtab %} - -{% tab title="NodeJS" %} -```javascript -const request = require('request'); - -// Set the API endpoint and model name -const endpoint = 'https://api.runpod.ai/v1/whisper/run'; - -// Set the API key and input data -const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; -const inputData = { - input: { - audio: 'https://LINK_TO_AUDIO.FILE', - }, -}; - -// Set the headers for the request -const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, -}; - -// Make the request -request.post( - { - url: endpoint, - json: inputData, - headers, - }, - (err, response) => { - if (err) { - console.error(err); - return; - } - - // Print the response - console.log(response.body); - }, -); -``` -{% endtab %} - -{% tab title="Go" %} -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "net/http" -) - -func main() { - // Set the API endpoint and model name - endpoint := "https://api.runpod.ai/v1/whisper/run" - - // Set the API key and input data - apiKey := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - inputData := map[string]interface{}{ - "input": map[string]string{ - "audio": "https://LINK_TO_AUDIO.FILE", - }, - } - - // Convert the input data to JSON - inputJSON, err := json.Marshal(inputData) - if err != nil { - log.Fatal(err) - } - - // Set the headers for the request - headers := map[string][]string{ - "Content-Type": {"application/json"}, - "Authorization": {fmt.Sprintf("Bearer %s", apiKey)}, - } - - // Make the request - resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(inputJSON)) - if err != nil { - log.Fatal(err) - } - defer resp.Body.Close() - - // Print the response - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - fmt.Println(string(body)) -} -``` -{% endtab %} -{% endtabs %} - -{% swagger method="post" path="/v1/whisper/run" baseUrl="https://api.runpod.ai" summary="Run an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="header" name="Authorization" required="true" %} -RunPod API Key -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input" type="Object" required="true" %} -Input Object contains prompt, and more -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="webhook" type="String" %} -URL endpoint to receive a webhook call on job complete, fail, or timeout. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.audio" required="false" type="String" %} -Your input audio file. -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.model" type="String" required="false" %} -Choose a Whisper model. - -Options: tiny, base, small, medium, large-v1, large-v2 - -**Default: base** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.transcription" type="String" %} -Choose the format for the transcription. - -Options: plain text, srt, vtt - -**Default: plain text** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.translate" type="Boolean" %} -Translate the text to English when set to True. - -**Default: False** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.language" type="String" %} -Language spoken in the audio, specify None to perform language detection. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" type="Float" name="input.temperature" %} -Temperature to use for sampling. - -**Default: 0** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.best_of" type="Integer" %} -The number of candidates when sampling with non-zero temperature. - -**Default: 5** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.beam_size" type="Integer" %} -Number of beams in beam search, only applicable when temperature is zero. - -**Default: 5** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.patience" type="Float" %} -Optional patience value to use in beam decoding. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.length_penalty" type="Float" %} -Optional token length penalty coefficient (alpha) as in https://arxiv.org/abs/1609.08144, uses simple length normalization by default. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.suppress_tokens" type="String" %} -Comma-separated list of token ids to suppress during sampling; '-1' will suppress most special characters except common punctuations. - -**Default: -1** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.initial_prompt" type="String" %} -Optional text to provide as a prompt for the first window. - -**Default: None** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.condition_on_previous_text" type="Boolean" %} -If True, provide the previous output of the model as a prompt for the next window; disabling may make the text inconsistent across windows, but the model becomes less prone to getting stuck in a failure loop. - -\ - - - - -**Default: True** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.temperature_increment_on_fallback" type="Float" %} -Temperature to increase when falling back when the decoding fails to meet either of the thresholds below. - -**Default: 0.2** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.compression_ratio_threshold" type="Float" %} -If the gzip compression ration is higher than this value, treat the decoding as failed. - -**Default: 2.4** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.logprob_threshold" type="Float" %} -If the average log probability is lower than this value, treat the decoding as failed. - -**Default: -1.0** -{% endswagger-parameter %} - -{% swagger-parameter in="body" name="input.no_speech_threshold" type="Float" %} -If the probability of the <|nospeech|> token is higher than this value AND the decoding has failed due to 'logprob\_threshold', consider the segment as silence. - -**Default: 0.6** -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - "status": "IN_QUEUE" -} -``` -{% endswagger-response %} - -{% swagger-response status="400: Bad Request" description="Invalid input" %} - -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} - -{% endswagger-response %} - -{% swagger-response status="429: Too Many Requests" description="Rate limited due to many requests" %} - -{% endswagger-response %} -{% endswagger %} - -{% swagger method="get" path="/v1/whisper/status/{ REQUEST_ID }" baseUrl="https://api.runpod.ai" summary="Status and output of an inference request." %} -{% swagger-description %} - -{% endswagger-description %} - -{% swagger-parameter in="path" name="REQUEST_ID" type="UUID" required="true" %} -inference request id -{% endswagger-parameter %} - -{% swagger-response status="200: OK" description="JSON response" %} -```json -{ - "delayTime": 157664, - "executionTime": 3289, - "id": "4b82e3fb-ce2b-49dc-bd35-965041cd161b", - "input": { - "audio": "https://github.com/runpod/serverless-workers/raw/main/Input-Samples/gettysburg.wav" - }, - "output": { - "detected_language": "english", - "segments": [{ - "avg_logprob": -0.18336993294793205, - "compression_ratio": 1.3858267716535433, - "end": 10, - "id": 0, - "no_speech_prob": 0.06009136512875557, - "seek": 0, - "start": 0, - "temperature": 0, - "text": " Four score and seven years ago, our fathers brought forth on this continent a new nation, conceived in liberty, and dedicated to the proposition that all men are created equal.", - "tokens": [50364, 7451, 6175, 293, 3407, 924, 2057, 11, 527, 23450, 3038, 5220, 322, 341, 18932, 257, 777, 4790, 11, 34898, 294, 22849, 11, 293, 8374, 281, 264, 24830, 300, 439, 1706, 366, 2942, 2681, 13, 50864] - }], - "transcription": "00:00.000 --> 00:10.000\nFour score and seven years ago, our fathers brought forth on this continent a new nation, conceived in liberty, and dedicated to the proposition that all men are created equal.\n\n", - "translation": null - }, - "status": "COMPLETED" -} -``` -{% endswagger-response %} - -{% swagger-response status="401: Unauthorized" description="Invalid API Key" %} -```javascript -{ - // Response -} -``` -{% endswagger-response %} -{% endswagger %} diff --git a/serverless-gpus/worker-functions.md b/serverless-gpus/worker-functions.md deleted file mode 100644 index 41394f7..0000000 --- a/serverless-gpus/worker-functions.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -description: There are shared functions that are accessible by all serverless APIs. ---- - -# Worker Functions - -## Webhook - -To be notified of completed jobs, a URL can be passed within the top level of the request like so: - -```json -{ - "input": "Data needed to complete the job.", - "webhook": "https://URL.TO.YOUR.WEBHOOK" -} -``` - -A POST request will be sent to your URL when the job is complete. This request will contain the same information you would receive if you fetched the results from the /status/{id} endpoint. - -_Note: Webhook functionality is identical regardless of the worker._ - -## S3 Compatible Storage - -The credentials for S3-compatible object storage can be passed in with the request as follows: - -```json -{ - "input": "Data needed to complete the job.", - "s3Config": { - "accessId": "key_id_or_username", - "accessSecret": "key_secret_or_password", - "bucketName": "storage_location_name", - "endpointUrl": "storage_location_address" - }, -} -``` - -The configuration is only passed onto the worked, it will not be returned as part of the job request output. - -_Note: The serverless worker will need to contain the logic/functionality that allows it to make sure of this input. If you build a custom endpoint and request s3Config in the input, your worker is ultimately responsible for using the information passed in to upload the output._ - -## Worker Controls - -When completing long-running job requests or complicated requests that involve a lot of reading and writing files, starting with a fresh worker can be beneficial each time. A flag can be returned with the resulting job output to stop and refresh the used worker. This behavior is achieved by doing the following within your worker: - -```python -# Requires runpod python version 0.9.0+ - -def your_handler(job): - . - . - ... - Your handlers functionality here. - ... - . - . - return {"refresh_worker": True, "job_results": "can be anything"} -``` - -Your handler must return a dictionary that contains `refresh_worker,` this flag will be removed before the remaining job output is returned. - -_Note: Refreshing a worker does not impact billing or count for/against your min, max, and warmed workers. It simply "resets" that worker at the end of a job._ diff --git a/v1.0/AI ENDPOINTS/health-check.md b/v1.0/AI ENDPOINTS/health-check.md new file mode 100644 index 0000000..10db75a --- /dev/null +++ b/v1.0/AI ENDPOINTS/health-check.md @@ -0,0 +1,13 @@ +--- +title: "Health Check" +slug: "health-check" +excerpt: "Retrieve endpoint statistics." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Apr 24 2023 19:44:34 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sun Apr 30 2023 06:42:37 GMT+0000 (Coordinated Universal Time)" +--- + +The health check is a utility function that can be called on any endpoint to provide worker and queue metrics. diff --git a/v1.0/AI ENDPOINTS/runpod-apis.md b/v1.0/AI ENDPOINTS/runpod-apis.md new file mode 100644 index 0000000..bb0456e --- /dev/null +++ b/v1.0/AI ENDPOINTS/runpod-apis.md @@ -0,0 +1,119 @@ +--- +title: "RunPod APIs" +slug: "runpod-apis" +excerpt: "Interact with your favorite models without managing the pods yourself." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Mar 27 2023 17:54:52 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jul 28 2023 19:36:04 GMT+0000 (Coordinated Universal Time)" +--- + +## Prerequisites + +- You will need a RunPod API key which can be generated under your user settings. This API key will identify you for billing purposes, so guard it well! + +_**Note: You must retrieve your results via the status endpoint within 30 minutes. We do not keep your inputs or outputs longer than that to protect your privacy!**_ + +## Overview + +Our initial API implementation works asynchronously. This means you fire an API request to our endpoint with your input parameters and immediately get a response with a unique job ID. What do I do with this useless response, you say? You can then query the status endpoint and pass it your job ID. The status endpoint will give you the job results when completed. + +Let's take the Stable Diffusion v1 inference endpoint, for example. + +### Start your job + +You would first make a request like the following (remember to replace the "xxxxxx"s with your real API key: + +```curl +curl -X POST https://api.runpod.ai/v2/stable-diffusion-v1/run \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ +-d '{"input": {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"}}' +``` + +You would get an immediate response that looks like this: + +```json +{ + "id": "c80ffee4-f315-4e25-a146-0f3d98cf024b", + "status": "IN_QUEUE" +} +``` + +In this example, your job ID would be "c80ffee4-f315-4e25-a146-0f3d98cf024b". You get a new one for each job, and it is a unique identifier for your job. + +### Check the status of your job + +You haven't gotten any output, so you must make an additional call to the status endpoint after some time. Your status endpoint uses the job ID to route to the correct job status. In this case, the status endpoint is + +``` +https://api.runpod.ai/v1/stable-diffusion-v1/status/c80ffee4-f315-4e25-a146-0f3d98cf024b +``` + +Note how the last part of the URL is your job ID. You could request that endpoint like so. Remember to use your API key for this request too! + +```curl +curl https://api.runpod.ai/v2/stable-diffusion-v1/status/c80ffee4-f315-4e25-a146-0f3d98cf024b \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' +``` + +If your job hasn't been completed, you may get something that looks like this back: + +```json +{ + "delayTime": 2624, + "id": "c80ffee4-f315-4e25-a146-0f3d98cf024b", + "input": { + "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" + }, + "status": "IN_PROGRESS" +} +``` + +This means to wait a bit longer before you query the status endpoint again. + +## Get completed job status + +Eventually, you will get the final results of your job. They would look something like this: + +```json +{ + "delayTime": 123456, // (milliseconds) time in queue + "executionTime": 1234, // (milliseconds) time it took to complete the job + "gpu": "24", // gpu type used to run the job + "id": "c80ffee4-f315-4e25-a146-0f3d98cf024b", + "input": { + "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" + }, + "output": [ + { + "image": "https://job.results1", + "seed": 1 + }, + { + "image": "https://job.results2", + "seed": 2 + } + ], + "status": "COMPLETED" +} +``` + +_**Note: You must retrieve your results via the status endpoint within 1 hour. We do not keep your inputs or outputs longer than that to protect your privacy!**_ + +### Get your stuff + +Note how you don't get the images directly in the output. The output contains the URLs to the cloud storage that will let you download each image. + +You've successfully generated your first images with our Stable Diffusion API! + +If you want descriptions for all parameters and code examples past curl, read on! + +### Rate Limit + +`/run` - 1000 requests every 10s + +`/runsync` - 2000 requests every 10s diff --git a/v1.0/Audio MODELS/faster-whisper-copy.md b/v1.0/Audio MODELS/faster-whisper-copy.md new file mode 100644 index 0000000..b4c0ad1 --- /dev/null +++ b/v1.0/Audio MODELS/faster-whisper-copy.md @@ -0,0 +1,19 @@ +--- +title: "Faster-Whisper (COPY)" +slug: "faster-whisper-copy" +excerpt: "Whisper is an automatic speech recognition (ASR) system." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Tue Aug 29 2023 18:37:54 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Aug 29 2023 18:38:38 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Worker Repository + +The worker repository for this endpoint is available on GitHub at [runpod-works/worker-faster_whisper](https://github.com/runpod-workers/worker-faster_whisper) diff --git a/v1.0/Audio MODELS/faster-whisper.md b/v1.0/Audio MODELS/faster-whisper.md new file mode 100644 index 0000000..790fef8 --- /dev/null +++ b/v1.0/Audio MODELS/faster-whisper.md @@ -0,0 +1,19 @@ +--- +title: "Faster-Whisper" +slug: "faster-whisper" +excerpt: "Whisper is an automatic speech recognition (ASR) system." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue May 30 2023 16:21:42 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Oct 19 2023 00:23:51 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Worker Repository + +The worker repository for this endpoint is available on GitHub at [runpod-works/worker-faster_whisper](https://github.com/runpod-workers/worker-faster_whisper) diff --git a/v1.0/Audio MODELS/retrieve-results-status-copy.md b/v1.0/Audio MODELS/retrieve-results-status-copy.md new file mode 100644 index 0000000..7f06e97 --- /dev/null +++ b/v1.0/Audio MODELS/retrieve-results-status-copy.md @@ -0,0 +1,24 @@ +--- +title: "Retrieve Results & Status" +slug: "retrieve-results-status-copy" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Apr 25 2023 00:52:16 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Aug 31 2023 16:43:54 GMT+0000 (Coordinated Universal Time)" +--- + +When a request is made using the `/run` endpoint, or if a job takes longer than 90 seconds to complete when using the `/runsync` endpoint, a job ID will be returned. This job ID is essential for tracking the progress of a job and obtaining its results upon completion. To do so, use the `/status/{job_id}` endpoint described below. + +### Check Job Status and Retrieve Results + +To check the status of a job or retrieve its results once completed, make a request to the `/status/{job_id}` endpoint, replacing `{job_id}` with the specific job ID received earlier. + +1. **Checking job status:** If the job is still in progress, the endpoint will return the current status of the job (e.g., "IN_QUEUE", "IN_PROGRESS", "FAILED", "COMPLETED", ). +2. **Retrieving job results:** If the job has been completed successfully, the endpoint will return the results of the job. + +Please note that you should periodically poll the `/status/{job_id}` endpoint to monitor the progress of your job and retrieve the results once it has finished. + +**Note: Job results are kept for up to 30 minutes after a job is completed. ** diff --git a/v1.0/Audio MODELS/whisper.md b/v1.0/Audio MODELS/whisper.md new file mode 100644 index 0000000..bb39048 --- /dev/null +++ b/v1.0/Audio MODELS/whisper.md @@ -0,0 +1,19 @@ +--- +title: "Whisper" +slug: "whisper" +excerpt: "Whisper is an automatic speech recognition (ASR) system." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Mar 27 2023 17:38:50 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jul 28 2023 14:48:34 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Worker Repository + +The worker repository for this endpoint is available on GitHub at [runpod-workers/worker-whisper](https://github.com/runpod-workers/worker-whisper) diff --git a/v1.0/GPU INSTANCES/persistent-storage.md b/v1.0/GPU INSTANCES/persistent-storage.md new file mode 100644 index 0000000..3358033 --- /dev/null +++ b/v1.0/GPU INSTANCES/persistent-storage.md @@ -0,0 +1,16 @@ +--- +title: "🗄️ | Persistent Storage" +slug: "persistent-storage" +excerpt: "Dedicated space to save and retain data." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Nov 06 2023 15:50:05 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 19:44:26 GMT+0000 (Coordinated Universal Time)" +--- + +Any data saved to container disk space will be lost when a pod is restarted, in order to maintain data between restarts you must use a form of persistent storage. Currently, RunPod offers the following two solutions: + +1. Attached volume, this form of storage is provided at a server level and connects to your pod. You cannot share this storage between pods or move it. +2. Network storage, this is a network-based storage solution that significantly increases the flexibility of what you can do on RunPod. With network storage, you can share data between different pods. diff --git a/v1.0/GPU INSTANCES/persistent-storage/attached-volume.md b/v1.0/GPU INSTANCES/persistent-storage/attached-volume.md new file mode 100644 index 0000000..4dc1023 --- /dev/null +++ b/v1.0/GPU INSTANCES/persistent-storage/attached-volume.md @@ -0,0 +1,11 @@ +--- +title: "Attached Volume" +slug: "attached-volume" +excerpt: "" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Nov 06 2023 19:34:44 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 19:34:44 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/GPU INSTANCES/persistent-storage/network-storage.md b/v1.0/GPU INSTANCES/persistent-storage/network-storage.md new file mode 100644 index 0000000..bcb1303 --- /dev/null +++ b/v1.0/GPU INSTANCES/persistent-storage/network-storage.md @@ -0,0 +1,15 @@ +--- +title: "Network Storage" +slug: "network-storage" +excerpt: "Exclusive to secure cloud, this datacenter level storage option that can be shared between pods." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Nov 06 2023 19:32:55 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 19:51:06 GMT+0000 (Coordinated Universal Time)" +--- + +When using network storage you are no longer restricted by the resources of an individual system like you were with a basic attached volume. Since this form of storage is at a datacenter level you can easily switch pods/GPU types that are available at that datacenter or even allow multiple Pods to share a single network storage volume. + +> 👍 By using `/runpod-volume` as the default mounting location, you will be ready to deploy on serverless if you choose to do so. diff --git a/v1.0/GPU INSTANCES/pods.md b/v1.0/GPU INSTANCES/pods.md new file mode 100644 index 0000000..f991379 --- /dev/null +++ b/v1.0/GPU INSTANCES/pods.md @@ -0,0 +1,31 @@ +--- +title: "🖥️ | Pods" +slug: "pods" +excerpt: "Containers for your compute needs." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Wed May 31 2023 20:54:11 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 20:20:34 GMT+0000 (Coordinated Universal Time)" +--- + +Pods are running container instances pulled from a container registry such as Docker Hub, GitHub Container Registry, Amazon Elastic Container Registry, or another compatible registry. Pods can be created from a template or deployed directly via the API and CLI tools. + +On RunPod you can configure the following: + +- GPU Type and Quantity +- System Disk Size +- Start Command +- Environment Variables +- Open/Expose HTTP/TCP ports +- Persistent Storage Options + +> 🚧 When building a docker image for RunPod be sure to use the flag `--platform linux/amd64,linux/arm64` to ensure it is compatible with the platform. + +## Terminating a Pod + +1. Click the dropdown arrow to expand the pod page.\ + ![](https://files.readme.io/b56d880-image.png) +2. Click the stop/terminate button. A pod that is connected to network storage can not be paused and will have a terminate button in place of a stop button.\ + ![](https://files.readme.io/6d9fe46-image.png) diff --git a/v1.0/GPU INSTANCES/pods/logs.md b/v1.0/GPU INSTANCES/pods/logs.md new file mode 100644 index 0000000..34cdabc --- /dev/null +++ b/v1.0/GPU INSTANCES/pods/logs.md @@ -0,0 +1,27 @@ +--- +title: "Logs" +slug: "logs" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Wed May 31 2023 21:01:32 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Jun 01 2023 17:00:47 GMT+0000 (Coordinated Universal Time)" +--- + +## Accessing Logs + +![](https://files.readme.io/6bbe0ac-image.png) + +![](https://files.readme.io/2f0330e-image.png) + +You are provided with two types of logs, `Container Logs` and `System Logs` + +### Container Logs + +These logs relay anything typically sent to your console standard out. + +### System Logs + +The system logs provide information on your container's formation and current status, including download, extraction, start, and stop. diff --git a/v1.0/GPU INSTANCES/pods/pod-dashboard.md b/v1.0/GPU INSTANCES/pods/pod-dashboard.md new file mode 100644 index 0000000..a281e83 --- /dev/null +++ b/v1.0/GPU INSTANCES/pods/pod-dashboard.md @@ -0,0 +1,20 @@ +--- +title: "Dashboard Interface" +slug: "pod-dashboard" +excerpt: "" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Nov 06 2023 15:45:03 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 16:00:48 GMT+0000 (Coordinated Universal Time)" +--- + +![](https://files.readme.io/780d697-Untitled_drawing.png) + +1. The name and ID of your pod. +2. Your pods' total container size and size of any attached storage. +3. The type and quantity of GPUs attached to your pod. +4. The template name/image name that your pod is currently running and if your pod is running on our secure or community cloud. +5. Your pod activity and general utilization statistics. +6. Pod controls and resource links. diff --git a/v1.0/GPU INSTANCES/pods/pod-env-variables.md b/v1.0/GPU INSTANCES/pods/pod-env-variables.md new file mode 100644 index 0000000..7dffd41 --- /dev/null +++ b/v1.0/GPU INSTANCES/pods/pod-env-variables.md @@ -0,0 +1,27 @@ +--- +title: "Pod Environment Variables" +slug: "pod-env-variables" +excerpt: "Environment variables are accessible within in a pod. You can access this page by clicking on the menu icon and Edit Pod." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Mar 28 2023 22:52:14 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Oct 23 2023 18:21:14 GMT+0000 (Coordinated Universal Time)" +--- + +| Variable | Description | +| :------------------ | :---------------------------------------------------------------------------------------- | +| RUNPOD_POD_ID | The unique identifier for your pod. | +| RUNPOD_API_KEY | Used to make RunPod API calls to the specific pod. It's limited in scope to only the pod. | +| RUNPOD_POD_HOSTNAME | Name of the host server the pod is running on. | +| RUNPOD_GPU_COUNT | Number of GPUs available to the pod. | +| RUNPOD_CPU_COUNT | Number of CPUs available to the pod. | +| RUNPOD_PUBLIC_IP | If available, the publicly accessible IP for the pod. | +| RUNPOD_TCP_PORT_22 | The public port SSH port 22. | +| RUNPOD_DC_ID | The data center where the pod is located. | +| RUNPOD_VOLUME_ID | The ID of the volume connected to the pod. | +| CUDA_VERSION | The installed CUDA version. | +| PWD | Current working directory. | +| PYTORCH_VERSION | Installed PyTorch Version. | +| PUBLIC_KEY | The SSH public keys to access the pod over SSH. | diff --git a/v1.0/GPU INSTANCES/pods/templates.md b/v1.0/GPU INSTANCES/pods/templates.md new file mode 100644 index 0000000..ace7915 --- /dev/null +++ b/v1.0/GPU INSTANCES/pods/templates.md @@ -0,0 +1,23 @@ +--- +title: "Templates" +slug: "templates" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Wed May 31 2023 21:02:58 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Jun 01 2023 17:11:03 GMT+0000 (Coordinated Universal Time)" +--- + +## Creating a Template + +![](https://files.readme.io/8418b2b-image.png) + +Templates are used to launch images as a pod; within a template, you define the required container disk size, volume, volume path, and ports needed. + +### Environment Variables + +![](https://files.readme.io/b7670dd-image.png) + +Environment variables are accessible within your pod; define a variable by setting a name with the `key` and then what it should contain with `value`. diff --git a/v1.0/GPU INSTANCES/savings-plans.md b/v1.0/GPU INSTANCES/savings-plans.md new file mode 100644 index 0000000..ddf70b4 --- /dev/null +++ b/v1.0/GPU INSTANCES/savings-plans.md @@ -0,0 +1,67 @@ +--- +title: "📑 | Savings Plans" +slug: "savings-plans" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Jun 16 2023 15:35:29 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 15:55:02 GMT+0000 (Coordinated Universal Time)" +--- + +Savings Plans: Cost Savings for Your RunPod Deployments + +Introducing Savings Plans, a powerful cost-saving feature designed to optimize your RunPod experience. With Savings Plans, you can take advantage of upfront payments to unlock discounts on uninterrupted instances, enabling you to maximize cost efficiency and get the most out of specific card types. + +**Getting Started:** + +To start saving with RunPod's Savings Plans, ensure you have sufficient RunPod credits in your account. + +There are two ways to create a savings plan. From the pod dashboard, you can effortlessly add a Savings Plan to your existing running pod. Alternatively, you have the option to initiate a Savings Plan during the pod deployment process. Regularly check the "My Savings Plan" section to track your Savings Plans and associated pods. + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/f58bad9-image.png", +null, +"Add a savings plan to a new deployment" +], +"align": "center", +"caption": "Add a savings plan to a new deployment" +} +] +} +[/block] + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/0eb087a-image.png", +null, +"Add a savings plan to an existing deployment" +], +"align": "center", +"caption": "Add a savings plan to an existing deployment" +} +] +} +[/block] + +**Benefits for You:** + +Reduced Costs: By paying upfront for a Savings Plan, you can enjoy discounted rates on uninterrupted instances. This translates into significant cost savings for your RunPod deployments. + +Flexible Savings: When you stop a pod, the Savings Plan associated with it can be applied to your next deployment of the same card. This means you continue to benefit from your savings commitment even after temporary pauses in your pod usage. **Please note that pausing/stopping your pod(s) does not extend your savings plan. The savings plan expiration date is set at purchase time.** + +Instant Activation: Savings Plans kick in immediately upon activation and remain active for the duration of your committed period. You can start saving from the moment you initiate a Savings Plan. + +Easy Management: Adding a Savings Plan to your existing running pod is a breeze through the pod dashboard. Alternatively, Savings Plans are automatically started when you deploy a new pod, simplifying the process and ensuring you don't miss out on potential savings. + +Clear Visibility: Stay on top of your savings commitments and associated pods by navigating to the "My Savings Plan" menu option. This provides you with a comprehensive overview of your Savings Plans, enabling effective monitoring and management. + +Empower your RunPod deployments with Savings Plans and unlock the potential for cost optimization and enhanced savings. Begin maximizing your RunPod experience today! diff --git a/v1.0/GPU INSTANCES/troubleshooting.md b/v1.0/GPU INSTANCES/troubleshooting.md new file mode 100644 index 0000000..78f945a --- /dev/null +++ b/v1.0/GPU INSTANCES/troubleshooting.md @@ -0,0 +1,11 @@ +--- +title: "🔧 | Troubleshooting" +slug: "troubleshooting" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Nov 06 2023 19:54:04 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 19:54:36 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/GPU INSTANCES/troubleshooting/ssh-connections.md b/v1.0/GPU INSTANCES/troubleshooting/ssh-connections.md new file mode 100644 index 0000000..28f9491 --- /dev/null +++ b/v1.0/GPU INSTANCES/troubleshooting/ssh-connections.md @@ -0,0 +1,11 @@ +--- +title: "SSH Connections" +slug: "ssh-connections" +excerpt: "" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Nov 06 2023 19:55:07 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 19:55:07 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/GPU INSTANCES/troubleshooting/troubleshooting-502-errors.md b/v1.0/GPU INSTANCES/troubleshooting/troubleshooting-502-errors.md new file mode 100644 index 0000000..b1694f3 --- /dev/null +++ b/v1.0/GPU INSTANCES/troubleshooting/troubleshooting-502-errors.md @@ -0,0 +1,46 @@ +--- +title: "502 Errors" +slug: "troubleshooting-502-errors" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Wed May 31 2023 16:22:25 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 19:54:36 GMT+0000 (Coordinated Universal Time)" +--- + +502 errors can occur when users attempt to access a program running on a specific port of a deployed pod and the program isn't running or has encountered an error. This document provides guidance to help you troubleshoot this error. + +### Check Your Pod's GPU + +The first step to troubleshooting a 502 error is to check whether your pod has a GPU attached. + +1. **Access your pod's settings**: Click on your pod's settings in the user interface to access detailed information about your pod. + +2. **Verify GPU attachment**: Here, you should be able to see if your pod has a GPU attached. If it does not, you will need to attach a GPU. + +If a GPU is attached, you will see it under the Pods screen (e.g. 1 x A6000). If a GPU is not attached, this number will be 0. RunPod does allow you to spin up a pod with 0 GPUs so that you can connect to it via a Terminal or CloudSync to access data. However, the options to connect to RunPod via the web interface will be nonfunctional, even if they are lit up. + +![](https://files.readme.io/fb4c0dd-image.png) + +### Check Your Pod's Logs + +After confirming that your pod has a GPU attached, the next step is to check your pod's logs for any errors. + +1. **Access your pod's logs**: You can view the logs from the pod's settings in the user interface. + +2. ![](https://files.readme.io/3500eba-image.png)\ + **Look for errors**: Browse through the logs to find any error messages that may provide clues about why you're experiencing a 502 error. + +### Verify Additional Steps for Official Templates + +In some cases, for our official templates, the user interface does not work right away and may require additional steps to be performed by the user. + +1. **Access the template's ReadMe**: Navigate to the template's page and open the ReadMe file. + +2. **Follow additional steps**: The ReadMe file should provide instructions on any additional steps you need to perform to get the UI functioning properly. Make sure to follow these instructions closely. + +Remember, each template may have unique requirements or steps for setup. It is always recommended to thoroughly review the documentation associated with each template. + +If you continue to experience 502 errors after following these steps, please contact our support team. We're here to help ensure that your experience on our platform is as seamless as possible. diff --git a/v1.0/Image MODELS/anything-v3.md b/v1.0/Image MODELS/anything-v3.md new file mode 100644 index 0000000..fad7efd --- /dev/null +++ b/v1.0/Image MODELS/anything-v3.md @@ -0,0 +1,19 @@ +--- +title: "Anything v3 (SD-v1.5)" +slug: "anything-v3" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Mar 24 2023 19:24:50 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sun May 14 2023 17:19:53 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Worker Repository + +The worker repository for this endpoint is available on GitHub at [runpod-workers/worker-stable_diffusion_v1](https://github.com/runpod-workers/worker-stable_diffusion_v1) diff --git a/v1.0/Image MODELS/anything-v4.md b/v1.0/Image MODELS/anything-v4.md new file mode 100644 index 0000000..03583eb --- /dev/null +++ b/v1.0/Image MODELS/anything-v4.md @@ -0,0 +1,19 @@ +--- +title: "Anything v4 (SD-v1.5)" +slug: "anything-v4" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Mar 24 2023 19:27:09 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sun May 14 2023 17:20:08 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Worker Repository + +The worker repository for this endpoint is available on GitHub at [runpod-workers/worker-stable_diffusion_v1](https://github.com/runpod-workers/worker-stable_diffusion_v1) diff --git a/v1.0/Image MODELS/blip-captioning.md b/v1.0/Image MODELS/blip-captioning.md new file mode 100644 index 0000000..fe7dece --- /dev/null +++ b/v1.0/Image MODELS/blip-captioning.md @@ -0,0 +1,15 @@ +--- +title: "BLIP Captioning" +slug: "blip-captioning" +excerpt: "This API allows you to caption zipped images that can be later used for Stable Diffusion finetuning (compatible with EveryDream)" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Apr 24 2023 20:24:05 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:28:24 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** diff --git a/v1.0/Image MODELS/controlnet.md b/v1.0/Image MODELS/controlnet.md new file mode 100644 index 0000000..200851f --- /dev/null +++ b/v1.0/Image MODELS/controlnet.md @@ -0,0 +1,11 @@ +--- +title: "ControlNet (SD-v1.5)" +slug: "controlnet" +excerpt: "" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Fri Mar 17 2023 03:57:48 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:13:29 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Image MODELS/controlnet/controlnet-canny.md b/v1.0/Image MODELS/controlnet/controlnet-canny.md new file mode 100644 index 0000000..d0070a0 --- /dev/null +++ b/v1.0/Image MODELS/controlnet/controlnet-canny.md @@ -0,0 +1,11 @@ +--- +title: "Canny" +slug: "controlnet-canny" +excerpt: "This page will help you get started with ControlNet - Canny." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Fri Mar 17 2023 02:23:20 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:13:29 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Image MODELS/controlnet/depth.md b/v1.0/Image MODELS/controlnet/depth.md new file mode 100644 index 0000000..239f3ca --- /dev/null +++ b/v1.0/Image MODELS/controlnet/depth.md @@ -0,0 +1,11 @@ +--- +title: "Depth" +slug: "depth" +excerpt: "This page will help you get started with ControlNet - Depth." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Mar 27 2023 17:48:44 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:13:29 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Image MODELS/controlnet/hed.md b/v1.0/Image MODELS/controlnet/hed.md new file mode 100644 index 0000000..7352a07 --- /dev/null +++ b/v1.0/Image MODELS/controlnet/hed.md @@ -0,0 +1,11 @@ +--- +title: "Hed" +slug: "hed" +excerpt: "This page will help you get started with ControlNet - Hed." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Mar 27 2023 17:49:08 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:13:29 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Image MODELS/controlnet/mlsd.md b/v1.0/Image MODELS/controlnet/mlsd.md new file mode 100644 index 0000000..a148f4d --- /dev/null +++ b/v1.0/Image MODELS/controlnet/mlsd.md @@ -0,0 +1,11 @@ +--- +title: "MLSD" +slug: "mlsd" +excerpt: "This page will help you get started with ControlNet - MLSD." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Mar 27 2023 17:49:47 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:13:29 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Image MODELS/controlnet/normal.md b/v1.0/Image MODELS/controlnet/normal.md new file mode 100644 index 0000000..8e002ed --- /dev/null +++ b/v1.0/Image MODELS/controlnet/normal.md @@ -0,0 +1,11 @@ +--- +title: "Normal" +slug: "normal" +excerpt: "This page will help you get started with ControlNet - Normal." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Mar 27 2023 17:49:30 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:13:29 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Image MODELS/controlnet/openpose.md b/v1.0/Image MODELS/controlnet/openpose.md new file mode 100644 index 0000000..6a60b70 --- /dev/null +++ b/v1.0/Image MODELS/controlnet/openpose.md @@ -0,0 +1,11 @@ +--- +title: "Openpose" +slug: "openpose" +excerpt: "This page will help you get started with ControlNet - Openpose." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Mar 27 2023 17:51:15 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:13:29 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Image MODELS/controlnet/scribble.md b/v1.0/Image MODELS/controlnet/scribble.md new file mode 100644 index 0000000..3dca911 --- /dev/null +++ b/v1.0/Image MODELS/controlnet/scribble.md @@ -0,0 +1,11 @@ +--- +title: "Scribble" +slug: "scribble" +excerpt: "This page will help you get started with ControlNet - Scribble." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Mar 27 2023 17:50:47 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:13:29 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Image MODELS/controlnet/seg.md b/v1.0/Image MODELS/controlnet/seg.md new file mode 100644 index 0000000..1e72f08 --- /dev/null +++ b/v1.0/Image MODELS/controlnet/seg.md @@ -0,0 +1,11 @@ +--- +title: "Seg" +slug: "seg" +excerpt: "This page will help you get started with ControlNet - Seg." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Mar 27 2023 17:51:01 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:13:29 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Image MODELS/deforum.md b/v1.0/Image MODELS/deforum.md new file mode 100644 index 0000000..eab2824 --- /dev/null +++ b/v1.0/Image MODELS/deforum.md @@ -0,0 +1,21 @@ +--- +title: "Deforum" +slug: "deforum" +excerpt: "" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Wed Jun 21 2023 18:24:21 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Jul 13 2023 17:00:43 GMT+0000 (Coordinated Universal Time)" +--- + +This endpoint is run on a 24GB GPU (A5000 or 3090). + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Worker Repository + +The worker repository for this endpoint is available on GitHub at [runpod-workers/worker-deforum](https://github.com/runpod-workers/worker-deforum) diff --git a/v1.0/Image MODELS/dreambooth-sd-v15.md b/v1.0/Image MODELS/dreambooth-sd-v15.md new file mode 100644 index 0000000..05d9b13 --- /dev/null +++ b/v1.0/Image MODELS/dreambooth-sd-v15.md @@ -0,0 +1,21 @@ +--- +title: "DreamBooth (SD-v1.5)" +slug: "dreambooth-sd-v15" +excerpt: "DreamBooth is a deep learning generation model that fine-tunes existing text-to-image models such as Stable Diffusion." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Mar 24 2023 19:29:26 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Jun 24 2023 10:39:05 GMT+0000 (Coordinated Universal Time)" +--- + +This is an adaptation of [DreamBooth](https://github.com/TheLastBen/fast-stable-diffusion) by [TheLastBen](https://github.com/TheLastBen) to a [RunPod Endpoint](https://www.runpod.io/endpoints). This endpoint requires the URL to a publicly accessible .zip file containing a folder of images of a concept to fine-tune the model. To dive deep into DreamBooth, look at the [original paper](https://arxiv.org/pdf/2208.12242.pdf). + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Model Upload (s3Config) + +The DreamBooth endpoint can be used to return custom images, return a trained model, or both. To receive back the trained model, you must provide your credentials to an S3-compatible bucket. diff --git a/v1.0/Image MODELS/everydream-sd-v15.md b/v1.0/Image MODELS/everydream-sd-v15.md new file mode 100644 index 0000000..f4b045f --- /dev/null +++ b/v1.0/Image MODELS/everydream-sd-v15.md @@ -0,0 +1,15 @@ +--- +title: "EveryDream (SD-v1.5)" +slug: "everydream-sd-v15" +excerpt: "EveryDream provides general fine-tuning for Stable Diffusion. This endpoint also provides inference so that models can be trained and images can be generated in one shot." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Mon Mar 27 2023 16:25:33 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Apr 20 2023 22:14:34 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** diff --git a/v1.0/Image MODELS/kandinsky-21.md b/v1.0/Image MODELS/kandinsky-21.md new file mode 100644 index 0000000..4370e23 --- /dev/null +++ b/v1.0/Image MODELS/kandinsky-21.md @@ -0,0 +1,15 @@ +--- +title: "Kandinsky 2.1" +slug: "kandinsky-21" +excerpt: "Combining the best practices from Dall-E 2 and Latent diffusion." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Apr 17 2023 07:19:23 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Jul 22 2023 16:19:52 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** diff --git a/v1.0/Image MODELS/lora-trainer.md b/v1.0/Image MODELS/lora-trainer.md new file mode 100644 index 0000000..745abb3 --- /dev/null +++ b/v1.0/Image MODELS/lora-trainer.md @@ -0,0 +1,11 @@ +--- +title: "LoRA Trainer" +slug: "lora-trainer" +excerpt: "Fine tune a Low-Rank Adaptation model." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Fri Jun 30 2023 20:09:19 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Jul 11 2023 16:46:20 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Image MODELS/openjourney-sd-v15.md b/v1.0/Image MODELS/openjourney-sd-v15.md new file mode 100644 index 0000000..37dc50e --- /dev/null +++ b/v1.0/Image MODELS/openjourney-sd-v15.md @@ -0,0 +1,19 @@ +--- +title: "Openjourney (SD-v1.5)" +slug: "openjourney-sd-v15" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Mar 24 2023 19:28:05 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sun May 14 2023 17:20:14 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Worker Repository + +The worker repository for this endpoint is available on GitHub at [runpod-workers/worker-stable_diffusion_v1](https://github.com/runpod-workers/worker-stable_diffusion_v1) diff --git a/v1.0/Image MODELS/real-esrgan.md b/v1.0/Image MODELS/real-esrgan.md new file mode 100644 index 0000000..a64f3c6 --- /dev/null +++ b/v1.0/Image MODELS/real-esrgan.md @@ -0,0 +1,15 @@ +--- +title: "Real-ESRGAN" +slug: "real-esrgan" +excerpt: "A model that can upscale images using various pre-trained models. You can provide a set of parameters to control the upscaling process and choose the output format." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Thu Apr 20 2023 14:53:55 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:28:29 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** diff --git a/v1.0/Image MODELS/stable-diffusion-v1.md b/v1.0/Image MODELS/stable-diffusion-v1.md new file mode 100644 index 0000000..1eefd17 --- /dev/null +++ b/v1.0/Image MODELS/stable-diffusion-v1.md @@ -0,0 +1,21 @@ +--- +title: "Stable Diffusion v1" +slug: "stable-diffusion-v1" +excerpt: "A text-to-image model from StabilityAI" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Mar 24 2023 18:42:49 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Jun 01 2023 13:31:09 GMT+0000 (Coordinated Universal Time)" +--- + +This endpoint is run on a 24GB GPU (A5000 or 3090). + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Worker Repository + +The worker repository for this endpoint is available on GitHub at [runpod-workers/worker-stable_diffusion_v1](https://github.com/runpod-workers/worker-stable_diffusion_v1) diff --git a/v1.0/Image MODELS/stable-diffusion-v2.md b/v1.0/Image MODELS/stable-diffusion-v2.md new file mode 100644 index 0000000..c853cea --- /dev/null +++ b/v1.0/Image MODELS/stable-diffusion-v2.md @@ -0,0 +1,15 @@ +--- +title: "Stable Diffusion v2" +slug: "stable-diffusion-v2" +excerpt: "A text-to-image model from StabilityAI" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Mar 24 2023 19:07:02 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Apr 27 2023 17:09:36 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** diff --git a/v1.0/Image MODELS/stable-diffusion-xl.md b/v1.0/Image MODELS/stable-diffusion-xl.md new file mode 100644 index 0000000..4cd8b7d --- /dev/null +++ b/v1.0/Image MODELS/stable-diffusion-xl.md @@ -0,0 +1,21 @@ +--- +title: "Stable Diffusion XL" +slug: "stable-diffusion-xl" +excerpt: "A text-to-image model from StabilityAI" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Aug 08 2023 16:10:52 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Oct 02 2023 15:23:10 GMT+0000 (Coordinated Universal Time)" +--- + +This endpoint is run on a 24GB GPU (A5000 or 3090). + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Worker Repository + +The worker repository for this endpoint is available on GitHub at [runpod-workers/worker-stable_diffusion_v1](https://github.com/runpod-workers/worker-stable_diffusion_v1) diff --git a/v1.0/Image MODELS/status.md b/v1.0/Image MODELS/status.md new file mode 100644 index 0000000..074df1f --- /dev/null +++ b/v1.0/Image MODELS/status.md @@ -0,0 +1,24 @@ +--- +title: "Retrieve Results & Status" +slug: "status" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Mar 17 2023 03:58:53 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Jul 11 2023 18:41:42 GMT+0000 (Coordinated Universal Time)" +--- + +When a request is made using the `/run` endpoint, or if a job takes longer than 30 seconds to complete when using the `/runsync` endpoint, a job ID will be returned. This job ID is essential for tracking the progress of a job and obtaining its results upon completion. To do so, use the `/status/{job_id}` endpoint described below. + +### Check Job Status and Retrieve Results + +To check the status of a job or retrieve its results once completed, make a request to the `/status/{job_id}` endpoint, replacing `{job_id}` with the specific job ID received earlier. + +1. **Checking job status:** If the job is still in progress, the endpoint will return the current status of the job (e.g., "IN_QUEUE", "IN_PROGRESS", "FAILED", "COMPLETED", ). +2. **Retrieving job results:** If the job has been completed successfully, the endpoint will return the results of the job. + +Please note that you should periodically poll the `/status/{job_id}` endpoint to monitor the progress of your job and retrieve the results once it has finished. + +**Note: Job results are kept for up to 30 minutes after a job is completed. ** diff --git a/v1.0/LARGE LANGUAGE MODELS/gpt-j-6b.md b/v1.0/LARGE LANGUAGE MODELS/gpt-j-6b.md new file mode 100644 index 0000000..d5940c4 --- /dev/null +++ b/v1.0/LARGE LANGUAGE MODELS/gpt-j-6b.md @@ -0,0 +1,11 @@ +--- +title: "GPT-J 6B" +slug: "gpt-j-6b" +excerpt: "" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Sat Mar 25 2023 17:24:08 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Mar 25 2023 17:24:08 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/LARGE LANGUAGE MODELS/llama2-13b-chat.md b/v1.0/LARGE LANGUAGE MODELS/llama2-13b-chat.md new file mode 100644 index 0000000..5159bbe --- /dev/null +++ b/v1.0/LARGE LANGUAGE MODELS/llama2-13b-chat.md @@ -0,0 +1,73 @@ +--- +title: "Llama2 13B Chat" +slug: "llama2-13b-chat" +excerpt: "" +hidden: false +metadata: + title: "Llama2 13B Chat" + image: [] + robots: "index" +createdAt: "Wed Aug 09 2023 01:12:19 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Sep 29 2023 19:55:26 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Streaming Token Outputs + +1. Make a POST request to the /llama2-13b-chat/run API endpoint. +2. Retrieve the job ID. +3. Make a GET request to /llama2-13b-chat/stream/{job-id} to retrieve the real-time token output. + +Here's a code sample in Python: + + +```python Python +import requests +import json +import time + +url = f"https://api.runpod.ai/v2/llama2-13b-chat/run" + +headers = { + "Authorization":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "Content-Type": "application/json" +} + +prompt = """ +Write me an essay about how the french revolution impacted the rest of europe over the 18th century. +""" + +payload = { + "input": { + "prompt": prompt, + "sampling_params": { + "max_tokens": 1000, + "n": 1, + "presence_penalty": 0.2, + "frequency_penalty": 0.7, + "temperature": 0.3, + } + } +} + +response = requests.post(url, headers=headers, json=payload) +response_json = json.loads(response.text) +status_url = f"https://api.runpod.ai/v2/llama2-13b-chat/stream/{response_json['id']}" + + +for i in range(10): + time.sleep(1) + get_status = requests.get(status_url, headers=headers) + print(get_status.text) + + # example output from print(get_status.text) + """{"status":"IN_PROGRESS","stream":[{"output":{"text":["\nWrite me an essay about how the french revolution impacted the rest of europe over the 18th century. \n\nThe French Revolution, which began in 1789 and lasted for over a decade, had a profound impact on Europe in the late 18th century. The revolution, which was sparked by economic hardship, political corruption, and social inequality, led to the overthrow of the French monarchy and the establishment of a new political order. This essay will examine how the French Revolution impacted the rest of Europe during this period.\nOne of the most significant ways in which the French Revolution impacted"]}},{"output":{"text":["\nWrite me an essay about how the french revolution impacted the rest of europe over the 18th century. \n\nThe French Revolution, which began in 1789 and lasted for over a decade, had a profound impact on Europe in the late 18th century. The revolution, which was sparked by economic hardship, political corruption, and social inequality, led to the overthrow of the French monarchy and the establishment of a new political order. This essay will examine how the French Revolution impacted the rest of Europe during this period.\nOne of the most significant ways in which the French Revolution impacted Europe was"]}},{"output":{"text":["\nWrite me an essay about how the french revolution impacted the rest of europe over the 18th century. \n\nThe French Revolution, which began in 1789 and lasted for over a decade, had a profound impact on Europe in the late 18th century. The revolution, which was sparked by economic hardship, political corruption, and social inequality, led to the overthrow of the French monarchy and the establishment of a new political order. This essay will examine how the French Revolution impacted the rest of Europe during this period.\nOne of the most significant ways in which the French Revolution impacted Europe was through its"]}},{"output":{"text":["\nWrite me an essay about how the french revolution impacted the rest of europe over the 18th century. \n\nThe French Revolution, which began in 1789 and lasted for over a decade, had a profound impact on Europe in the late 18th century. The revolution, which was sparked by economic hardship, political corruption, and social inequality, led to the overthrow of the French monarchy and the establishment of a new political order. This essay will examine how the French Revolution impacted the rest of Europe during this period.\nOne of the most significant ways in which the French Revolution impacted Europe was through its influence on"]}}]}""" +``` + + +### Worker Resources + +- [Source Code Repository](https://github.com/runpod-workers/worker-vllm) diff --git a/v1.0/LARGE LANGUAGE MODELS/llama2-7b-chat.md b/v1.0/LARGE LANGUAGE MODELS/llama2-7b-chat.md new file mode 100644 index 0000000..82214d5 --- /dev/null +++ b/v1.0/LARGE LANGUAGE MODELS/llama2-7b-chat.md @@ -0,0 +1,72 @@ +--- +title: "Llama2 7B Chat" +slug: "llama2-7b-chat" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Aug 11 2023 05:51:57 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Sep 29 2023 19:55:44 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +## Streaming Token Outputs + +1. Make a POST request to the /llama2-7b-chat/run API endpoint. +2. Retrieve the job ID. +3. Make a GET request to /llama2-7b-chat/stream/{job-id} to retrieve the real-time token output. + +Here's a code sample in Python: + + +```python python +import requests +import json +import time + +url = f"https://api.runpod.ai/v2/llama2-7b-chat/run" + +headers = { + "Authorization":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "Content-Type": "application/json" +} + +prompt = """ +Write me an essay about how the french revolution impacted the rest of europe over the 18th century. +""" + +payload = { + "input": { + "prompt": prompt, + "sampling_params": { + "max_tokens": 1000, + "n": 1, + "presence_penalty": 0.2, + "frequency_penalty": 0.7, + "temperature": 0.3, + } + } +} + +response = requests.post(url, headers=headers, json=payload) +response_json = json.loads(response.text) +status_url = f"https://api.runpod.ai/v2/llama2-7b-chat/stream/{response_json['id']}" + + +for i in range(10): + time.sleep(1) + get_status = requests.get(status_url, headers=headers) + print(get_status.text) + + # example output from print(get_status.text) + """{"status":"IN_PROGRESS","stream":[{"output":{"text":["\nWrite me an essay about how the french revolution impacted the rest of europe over the 18th century. \n\nThe French Revolution, which began in 1789 and lasted for over a decade, had a profound impact on Europe in the late 18th century. The revolution, which was sparked by economic hardship, political corruption, and social inequality, led to the overthrow of the French monarchy and the establishment of a new political order. This essay will examine how the French Revolution impacted the rest of Europe during this period.\nOne of the most significant ways in which the French Revolution impacted"]}},{"output":{"text":["\nWrite me an essay about how the french revolution impacted the rest of europe over the 18th century. \n\nThe French Revolution, which began in 1789 and lasted for over a decade, had a profound impact on Europe in the late 18th century. The revolution, which was sparked by economic hardship, political corruption, and social inequality, led to the overthrow of the French monarchy and the establishment of a new political order. This essay will examine how the French Revolution impacted the rest of Europe during this period.\nOne of the most significant ways in which the French Revolution impacted Europe was"]}},{"output":{"text":["\nWrite me an essay about how the french revolution impacted the rest of europe over the 18th century. \n\nThe French Revolution, which began in 1789 and lasted for over a decade, had a profound impact on Europe in the late 18th century. The revolution, which was sparked by economic hardship, political corruption, and social inequality, led to the overthrow of the French monarchy and the establishment of a new political order. This essay will examine how the French Revolution impacted the rest of Europe during this period.\nOne of the most significant ways in which the French Revolution impacted Europe was through its"]}},{"output":{"text":["\nWrite me an essay about how the french revolution impacted the rest of europe over the 18th century. \n\nThe French Revolution, which began in 1789 and lasted for over a decade, had a profound impact on Europe in the late 18th century. The revolution, which was sparked by economic hardship, political corruption, and social inequality, led to the overthrow of the French monarchy and the establishment of a new political order. This essay will examine how the French Revolution impacted the rest of Europe during this period.\nOne of the most significant ways in which the French Revolution impacted Europe was through its influence on"]}}]}""" +``` + + +### Worker Resources + +- [Source Code Repository](https://github.com/runpod-workers/worker-vllm) diff --git a/v1.0/LARGE LANGUAGE MODELS/neo-13b.md b/v1.0/LARGE LANGUAGE MODELS/neo-13b.md new file mode 100644 index 0000000..7d70a3c --- /dev/null +++ b/v1.0/LARGE LANGUAGE MODELS/neo-13b.md @@ -0,0 +1,15 @@ +--- +title: "GPT Neo 1.3B" +slug: "neo-13b" +excerpt: "GPT-Neo 1.3B is a transformer model designed using EleutherAI's replication of the GPT-3 architecture." +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Sat Mar 25 2023 02:02:54 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:28:54 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** diff --git a/v1.0/LARGE LANGUAGE MODELS/neo-27b.md b/v1.0/LARGE LANGUAGE MODELS/neo-27b.md new file mode 100644 index 0000000..fdfd5bb --- /dev/null +++ b/v1.0/LARGE LANGUAGE MODELS/neo-27b.md @@ -0,0 +1,15 @@ +--- +title: "GPT Neo 2.7B" +slug: "neo-27b" +excerpt: "" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Sat Mar 25 2023 02:35:46 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Jun 02 2023 13:28:59 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** diff --git a/v1.0/LARGE LANGUAGE MODELS/neox-20b.md b/v1.0/LARGE LANGUAGE MODELS/neox-20b.md new file mode 100644 index 0000000..321c07d --- /dev/null +++ b/v1.0/LARGE LANGUAGE MODELS/neox-20b.md @@ -0,0 +1,11 @@ +--- +title: "GPT NeoX 20B" +slug: "neox-20b" +excerpt: "" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Sat Mar 25 2023 02:32:31 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Mar 25 2023 17:17:16 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/LARGE LANGUAGE MODELS/pygmalion-6b.md b/v1.0/LARGE LANGUAGE MODELS/pygmalion-6b.md new file mode 100644 index 0000000..afa22d4 --- /dev/null +++ b/v1.0/LARGE LANGUAGE MODELS/pygmalion-6b.md @@ -0,0 +1,17 @@ +--- +title: "Pygmalion 6B" +slug: "pygmalion-6b" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sat Mar 25 2023 02:33:01 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Jun 03 2023 18:28:08 GMT+0000 (Coordinated Universal Time)" +--- + +## Retrieve Results & Status + +**Note: For information on how to check job status and retrieve results, please refer to our [Status Endpoint Documentation](https://docs.runpod.io/reference/status).** + +This is a POC endpoint and we do not recommend trying to use it for serious applications (yet). We are still in the process of optimizing our workflow for serving language model endpoints. Stay tuned! diff --git a/v1.0/LARGE LANGUAGE MODELS/receive-outputstatus.md b/v1.0/LARGE LANGUAGE MODELS/receive-outputstatus.md new file mode 100644 index 0000000..298227b --- /dev/null +++ b/v1.0/LARGE LANGUAGE MODELS/receive-outputstatus.md @@ -0,0 +1,13 @@ +--- +title: "Receive Output/Status" +slug: "receive-outputstatus" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sat Mar 25 2023 16:36:11 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Wed May 10 2023 17:11:10 GMT+0000 (Coordinated Universal Time)" +--- + +**Note: Job results are kept for up to 30 minutes after a job is completed. ** diff --git a/v1.0/Resources - Tools/graphql-api.md b/v1.0/Resources - Tools/graphql-api.md new file mode 100644 index 0000000..6b4ff60 --- /dev/null +++ b/v1.0/Resources - Tools/graphql-api.md @@ -0,0 +1,19 @@ +--- +title: "GraphQL API" +slug: "graphql-api" +excerpt: "RunPod GraphQL API examples to manage your pods." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Mar 28 2023 22:54:35 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Apr 07 2023 19:52:10 GMT+0000 (Coordinated Universal Time)" +--- + +## Authentication + +RunPod uses API Keys for all API requests. Go to [Settings](https://www.runpod.io/console/user/settings) to manage your API keys. + +## GraphQL API Spec + +If you need detailed queries, mutations, fields, and inputs, look at our [GraphQL Spec](https://graphql-spec.runpod.io/). diff --git a/v1.0/Resources - Tools/graphql-api/create-pod-template.md b/v1.0/Resources - Tools/graphql-api/create-pod-template.md new file mode 100644 index 0000000..ec77dfc --- /dev/null +++ b/v1.0/Resources - Tools/graphql-api/create-pod-template.md @@ -0,0 +1,348 @@ +--- +title: "Manage Templates" +slug: "create-pod-template" +excerpt: "Create a new Pod/Serverless template, or modify/delete existing ones." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Jul 10 2023 16:51:21 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Aug 12 2023 01:05:57 GMT+0000 (Coordinated Universal Time)" +--- + +# Creating/Modifying Templates + +`containerDiskInGb`, `dockerArgs`, `env`, `imageName`, `name`, and `volumeInGb` are required arguments; all other arguments are optional. + +If your container image is private, you can also specify Docker login credentials with a `containerRegistryAuthId` argument, which takes the ID (_not_ the name) of the container registry credentials you saved in your RunPod user settings as a string. + +Note that template names must be unique as well; if you try to create a new template with the same name as an existing one, your call will fail. + +## Create a New Pod Template + + + +```curl +curl --request POST \ + --header 'content-type: application/json' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ + --data '{"query": "mutation { saveTemplate(input: { containerDiskInGb: 5, dockerArgs: \"sleep infinity\", env: [ { key: \"key1\", value: \"value1\" }, { key: \"key2\", value: \"value2\" } ], imageName: \"ubuntu:latest\", name: \"Generated Template\", ports: \"8888/http,22/tcp\", readme: \"## Hello, World!\", volumeInGb: 15, volumeMountPath: \"/workspace\" }) { containerDiskInGb dockerArgs env { key value } id imageName name ports readme volumeInGb volumeMountPath } }"}' +``` +```graphql +mutation { + saveTemplate(input: { + containerDiskInGb: 5, + dockerArgs: "sleep infinity", + env: [ + { + key: "key1", + value: "value1" + }, + { + key: "key2", + value: "value2" + } + ], + imageName: "ubuntu:latest", + name: "Generated Template", + ports: "8888/http,22/tcp", + readme: "## Hello, World!", + volumeInGb: 15, + volumeMountPath: "/workspace" + }) { + containerDiskInGb + dockerArgs + env { + key + value + } + id + imageName + name + ports + readme + volumeInGb + volumeMountPath + } +} +``` +```json Output | JSON +{ + "data": { + "saveTemplate": { + "containerDiskInGb": 5, + "dockerArgs": "sleep infinity", + "env": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key2", + "value": "value2" + } + ], + "id": "wphkv67a0p", + "imageName": "ubuntu:latest", + "name": "Generated Template", + "ports": "8888/http,22/tcp", + "readme": "## Hello, World!", + "volumeInGb": 15, + "volumeMountPath": "/workspace" + } + } +} +``` + + + +## Create a New Serverless Template + +For Serverless templates, always pass `0` for `volumeInGb`, since Serverless workers don't have persistent storage (other than those with network volumes). + + + +```curl +curl --request POST \ + --header 'content-type: application/json' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ + --data '{"query": "mutation { saveTemplate(input: { containerDiskInGb: 5, dockerArgs: \"python handler.py\", env: [ { key: \"key1\", value: \"value1\" }, { key: \"key2\", value: \"value2\" } ], imageName: \"runpod/serverless-hello-world:latest\", isServerless: true, name: \"Generated Serverless Template\", readme: \"## Hello, World!\", volumeInGb: 0 }) { containerDiskInGb dockerArgs env { key value } id imageName isServerless name readme } }"}' +``` +```graphql +mutation { + saveTemplate(input: { + containerDiskInGb: 5, + dockerArgs: "python handler.py", + env: [ + { + key: "key1", + value: "value1" + }, + { + key: "key2", + value: "value2" + } + ], + imageName: "runpod/serverless-hello-world:latest", + isServerless: true, + name: "Generated Serverless Template", + readme: "## Hello, World!", + volumeInGb: 0 + }) { + containerDiskInGb + dockerArgs + env { + key + value + } + id + imageName + isServerless + name + readme + } +} +``` +```json Output | JSON +{ + "data": { + "saveTemplate": { + "containerDiskInGb": 5, + "dockerArgs": "python handler.py", + "env": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key2", + "value": "value2" + } + ], + "id": "xkhgg72fuo", + "imageName": "runpod/serverless-hello-world:latest", + "isServerless": true, + "name": "Generated Serverless Template", + "readme": "## Hello, World!" + } + } +} +``` + + +## Modify an Existing Pod Template + + +```curl +curl --request POST \ + --header 'content-type: application/json' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ + --data '{"query": "mutation { saveTemplate(input: { id: \"wphkv67a0p\", containerDiskInGb: 5, dockerArgs: \"sleep infinity\", env: [ { key: \"key1\", value: \"value1\" }, { key: \"key2\", value: \"value2\" } ], imageName: \"ubuntu:latest\", name: \"Generated Template\", volumeInGb: 15, readme: \"## Goodbye, World!\" }) { id containerDiskInGb dockerArgs env { key value } imageName name volumeInGb readme } }"}' +``` +```graphql +mutation { + saveTemplate(input: { + id: "wphkv67a0p", + containerDiskInGb: 5, + dockerArgs: "sleep infinity", + env: [ + { + key: "key1", + value: "value1" + }, + { + key: "key2", + value: "value2" + } + ], + imageName: "ubuntu:latest", + name: "Generated Template", + volumeInGb: 15, + # Modify your template options here (or above, if applicable). + # For this example, we've modified the template's README. + readme: "## Goodbye, World!" + }) { + id + containerDiskInGb + dockerArgs + env { + key + value + } + imageName + name + volumeInGb + # You can include what you've changed here, too. + readme + } +} +``` +```json Output | JSON +{ + "data": { + "saveTemplate": { + "id": "wphkv67a0p", + "containerDiskInGb": 5, + "dockerArgs": "sleep infinity", + "env": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key2", + "value": "value2" + } + ], + "imageName": "ubuntu:latest", + "name": "Generated Template", + "volumeInGb": 15, + "readme": "## Goodbye, World!" + } + } +} +``` + + + +## Modify an Existing Serverless Template + + + +```curl +curl --request POST \ + --header 'content-type: application/json' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ + --data '{"query": "mutation { saveTemplate(input: { id: \"xkhgg72fuo\", containerDiskInGb: 5, dockerArgs: \"python handler.py\", env: [ { key: \"key1\", value: \"value1\" }, { key: \"key2\", value: \"value2\" } ], imageName: \"runpod/serverless-hello-world:latest\", name: \"Generated Serverless Template\", volumeInGb: 0, readme: \"## Goodbye, World!\" }) { id containerDiskInGb dockerArgs env { key value } imageName name readme } }"}' +``` +```graphql +mutation { + saveTemplate(input: { + id: "xkhgg72fuo", + containerDiskInGb: 5, + dockerArgs: "python handler.py", + env: [ + { + key: "key1", + value: "value1" + }, + { + key: "key2", + value: "value2" + } + ], + imageName: "runpod/serverless-hello-world:latest", + name: "Generated Serverless Template", + volumeInGb: 0, + # Modify your template options here (or above, if applicable). + # For this example, we've modified the template's README. + readme: "## Goodbye, World!" + }) { + id + containerDiskInGb + dockerArgs + env { + key + value + } + imageName + name + # You can include what you've changed here, too. + readme + } +} +``` +```json Output | JSON +{ + "data": { + "saveTemplate": { + "id": "xkhgg72fuo", + "containerDiskInGb": 5, + "dockerArgs": "python handler.py", + "env": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key2", + "value": "value2" + } + ], + "imageName": "runpod/serverless-hello-world:latest", + "name": "Generated Serverless Template", + "readme": "## Goodbye, World!" + } + } +} +``` + + + +# Deleting Templates + +Note that the template you'd like to delete must not be in use by any Pods or assigned to any Serverless endpoints. It can take up to 2 minutes to be able to delete a template after its most recent use by a Pod or Serverless endpoint, too. + +The same mutation is used for deleting both Pod and Serverless templates. + + + +```curl cURL +curl --request POST \ + --header 'content-type: application/json' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ + --data '{"query": "mutation { deleteTemplate(templateName: \"Generated Template\") }"}' +``` +```graphql +mutation { + deleteTemplate(templateName: "Generated Template") +} +``` +```json Output | JSON +{ + "data": { + "deleteTemplate": null + } +} +``` + diff --git a/graphql-api/create-pod.md b/v1.0/Resources - Tools/graphql-api/create-pod.md similarity index 70% rename from graphql-api/create-pod.md rename to v1.0/Resources - Tools/graphql-api/create-pod.md index 1b6c810..2de00b8 100644 --- a/graphql-api/create-pod.md +++ b/v1.0/Resources - Tools/graphql-api/create-pod.md @@ -1,37 +1,36 @@ --- -description: Create a Pod which starts with a container image. +title: "Create Pod" +slug: "create-pod" +excerpt: "Create a Pod which starts with a container image." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Mar 28 2023 22:55:55 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Aug 19 2023 04:38:03 GMT+0000 (Coordinated Universal Time)" --- -# Create Pod +A Pod consists of the following resources: -A pod consists of the following resources: +- 0 or more GPUs - A pod can be started with 0 GPUs for the purposes of accessing data, though GPU-accelerated functions and web services will fail to work. +- vCPU +- System RAM +- Container Disk + - It's temporary and removed when the pod is stopped or terminated. + - You only pay for the container disk when the pod is running. +- Instance Volume + - Data persists even when you reset or stop a Pod. Volume is removed when the Pod is terminated. + - You pay for volume storage even when the Pod is stopped. -* 0 or more GPUs -* vCPU -* System RAM -* Container Disk - * It's temporary and removed when the pod is stopped or terminated. - * _You only pay for the container disk when the pod is running._ -* Instance Volume - * Data persists even when you reset or stop a pod. Volume is removed when the pod is terminated. - * _You pay for volume storage even when the pod is stopped._ +## Create On-Demand Pod -### Create OnDemand Pod - -{% tabs %} -{% tab title="Curl" %} -{% code overflow="wrap" %} -```shell + +```curl curl --request POST \ --header 'content-type: application/json' \ - --url 'https://api.runpod.io/graphql?api_key=pewpew' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ --data '{"query": "mutation { podFindAndDeployOnDemand( input: { cloudType: ALL, gpuCount: 1, volumeInGb: 40, containerDiskInGb: 40, minVcpuCount: 2, minMemoryInGb: 15, gpuTypeId: \"NVIDIA RTX A6000\", name: \"RunPod Tensorflow\", imageName: \"runpod/tensorflow\", dockerArgs: \"\", ports: \"8888/http\", volumeMountPath: \"/workspace\", env: [{ key: \"JUPYTER_PASSWORD\", value: \"rn51hunbpgtltcpac3ol\" }] } ) { id imageName env machineId machine { podHostId } } }"}' ``` -{% endcode %} -{% endtab %} - -{% tab title="GraphQL" %} -{% code overflow="wrap" %} ```graphql mutation { podFindAndDeployOnDemand( @@ -61,12 +60,7 @@ mutation { } } ``` -{% endcode %} -{% endtab %} -{% endtabs %} - -{% code title="Output" overflow="wrap" %} -```json +```json Output | JSON { "data": { "podFindAndDeployOnDemand": { @@ -83,24 +77,17 @@ mutation { } } ``` -{% endcode %} + -### Create Spot Pod +## Create Spot Pod -{% tabs %} -{% tab title="Curl" %} -{% code overflow="wrap" %} -```shell + +```curl curl --request POST \ --header 'content-type: application/json' \ - --url 'https://api.runpod.io/graphql?api_key=pewpew' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ --data '{"query": "mutation { podRentInterruptable( input: { bidPerGpu: 0.2, cloudType: SECURE, gpuCount: 1, volumeInGb: 40, containerDiskInGb: 40, minVcpuCount: 2, minMemoryInGb: 15, gpuTypeId: \"NVIDIA RTX A6000\", name: \"RunPod Pytorch\", imageName: \"runpod/pytorch\", dockerArgs: \"\", ports: \"8888/http\", volumeMountPath: \"/workspace\", env: [{ key: \"JUPYTER_PASSWORD\", value: \"vunw9ybnzqwpia2795p2\" }] } ) { id imageName env machineId machine { podHostId } } }"}' ``` -{% endcode %} -{% endtab %} - -{% tab title="GraphQL" %} -{% code overflow="wrap" %} ```graphql mutation { podRentInterruptable( @@ -131,12 +118,7 @@ mutation { } } ``` -{% endcode %} -{% endtab %} -{% endtabs %} - -{% code title="Output" overflow="wrap" %} -```json +```json Output | JSON { "data": { "podRentInterruptable": { @@ -153,4 +135,4 @@ mutation { } } ``` -{% endcode %} + diff --git a/v1.0/Resources - Tools/graphql-api/create-serverless-endpoint.md b/v1.0/Resources - Tools/graphql-api/create-serverless-endpoint.md new file mode 100644 index 0000000..6a26734 --- /dev/null +++ b/v1.0/Resources - Tools/graphql-api/create-serverless-endpoint.md @@ -0,0 +1,209 @@ +--- +title: "Manage Serverless Endpoints" +slug: "create-serverless-endpoint" +excerpt: "Create a new Serverless endpoint, or modify/delete existing ones." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Jul 10 2023 16:44:22 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Aug 12 2023 01:06:20 GMT+0000 (Coordinated Universal Time)" +--- + +# Creating/Modifying Serverless Endpoints + +`gpuIds`, `name`, and `templateId` are required arguments; all other arguments are optional, and default values will be used if unspecified. + +## Create a New Serverless Endpoint + + +```curl +curl --request POST \ + --header 'content-type: application/json' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ + --data '{"query": "mutation { saveEndpoint(input: { gpuIds: \"AMPERE_16\", idleTimeout: 5, locations: \"US\", name: \"Generated Endpoint -fb\", networkVolumeId: \"\", scalerType: \"QUEUE_DELAY\", scalerValue: 4, templateId: \"xkhgg72fuo\", workersMax: 3, workersMin: 0 }) { gpuIds id idleTimeout locations name scalerType scalerValue templateId workersMax workersMin } }"}' +``` +```graphql +mutation { + saveEndpoint(input: { + # options for gpuIds are "AMPERE_16,AMPERE_24,AMPERE_48,AMPERE_80,ADA_24" + gpuIds: "AMPERE_16", + idleTimeout: 5, + # leave locations as an empty string or null for any region + # options for locations are "CZ,FR,GB,NO,RO,US" + locations: "US", + # append -fb to your endpoint's name to enable FlashBoot + name: "Generated Endpoint -fb", + # uncomment below and provide an ID to mount a network volume to your workers + # networkVolumeId: "", + scalerType: "QUEUE_DELAY", + scalerValue: 4, + templateId: "xkhgg72fuo", + workersMax: 3, + workersMin: 0 + }) { + gpuIds + id + idleTimeout + locations + name + # networkVolumeId + scalerType + scalerValue + templateId + workersMax + workersMin + } +} +``` +```json Output | JSON +{ + "data": { + "saveEndpoint": { + "gpuIds": "AMPERE_16", + "id": "i02xupws21hp6i", + "idleTimeout": 5, + "locations": "US", + "name": "Generated Endpoint -fb", + "scalerType": "QUEUE_DELAY", + "scalerValue": 4, + "templateId": "xkhgg72fuo", + "workersMax": 3, + "workersMin": 0 + } + } +} +``` + + +## Modify an Existing Serverless Endpoint + + +```curl +curl --request POST \ + --header 'content-type: application/json' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ + --data '{"query": "mutation { saveEndpoint(input: { id: \"i02xupws21hp6i\", gpuIds: \"AMPERE_16\", name: \"Generated Endpoint -fb\", templateId: \"xkhgg72fuo\", workersMax: 0 }) { id gpuIds name templateId workersMax } }"}' +``` +```graphql +mutation { + saveEndpoint(input: { + id: "i02xupws21hp6i", + gpuIds: "AMPERE_16", + name: "Generated Endpoint -fb", + templateId: "xkhgg72fuo", + # Modify your template options here (or above, if applicable). + # For this example, we've modified the endpoint's max workers. + workersMax: 0 + }) { + id + gpuIds + name + templateId + # You can include what you've changed here, too. + workersMax + } +} +``` +```json Output | JSON +{ + "data": { + "saveEndpoint": { + "id": "i02xupws21hp6i", + "gpuIds": "AMPERE_16", + "name": "Generated Endpoint -fb", + "templateId": "xkhgg72fuo", + "workersMax": 0 + } + } +} +``` + + +# View Your Endpoints + + +```curl +curl --request POST \ + --header 'content-type: application/json' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ + --data '{"query": "query Endpoints { myself { endpoints { gpuIds id idleTimeout locations name networkVolumeId pods { desiredStatus } scalerType scalerValue templateId workersMax workersMin } serverlessDiscount { discountFactor type expirationDate } } }"}' +``` +```graphql +query Endpoints { + myself { + endpoints { + gpuIds + id + idleTimeout + locations + name + networkVolumeId + pods { + desiredStatus + } + scalerType + scalerValue + templateId + workersMax + workersMin + } + serverlessDiscount { + discountFactor + type + expirationDate + } + } +} +``` +```json Output | JSON +{ + "data": { + "myself": { + "endpoints": [ + { + "gpuIds": "AMPERE_16", + "id": "i02xupws21hp6i", + "idleTimeout": 5, + "locations": "US", + "name": "Generated Endpoint -fb", + "networkVolumeId": null, + "pods": [], + "scalerType": "QUEUE_DELAY", + "scalerValue": 4, + "templateId": "xkhgg72fuo", + "workersMax": 0, + "workersMin": 0 + } + ], + "serverlessDiscount": null + } + } +} +``` + + +# Deleting Serverless Endpoints + +Note that your endpoint's min and max workers must both be set to zero for your call to work. + + +```curl +curl --request POST \ + --header 'content-type: application/json' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ + --data '{"query": "mutation { deleteEndpoint(id: \"i02xupws21hp6i\") }"}' +``` +```graphql +mutation { + deleteEndpoint(id: "i02xupws21hp6i") +} +``` +```json Output | JSON +{ + "data": { + "deleteEndpoint": null + } +} +``` + diff --git a/graphql-api/get-gpu-types.md b/v1.0/Resources - Tools/graphql-api/get-gpu-types.md similarity index 66% rename from graphql-api/get-gpu-types.md rename to v1.0/Resources - Tools/graphql-api/get-gpu-types.md index c6bf97e..eb272a1 100644 --- a/graphql-api/get-gpu-types.md +++ b/v1.0/Resources - Tools/graphql-api/get-gpu-types.md @@ -1,23 +1,26 @@ -# Get GPU Types +--- +title: "Get GPU Types" +slug: "get-gpu-types" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Apr 18 2023 12:56:16 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Jul 13 2023 18:12:45 GMT+0000 (Coordinated Universal Time)" +--- -When creating a pod, you will need to pass GPU type ids. These queries can help find all GPU types and their ids along with other attributes like VRAM. +When creating a Pod, you will need to pass GPU type IDs. These queries can help find all GPU types, their IDs, and other attributes like VRAM. -### Get GPU Types +## Get GPU Types -{% tabs %} -{% tab title="Curl" %} -{% code overflow="wrap" %} -```bash + +```curl curl --request POST \ --header 'content-type: application/json' \ - --url 'https://api.runpod.io/graphql?api_key=pewpew' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ --data '{"query": "query GpuTypes { gpuTypes { id displayName memoryInGb } }"}' ``` -{% endcode %} -{% endtab %} - -{% tab title="GraphQL" %} -{% code overflow="wrap" %} ```graphql query GpuTypes { gpuTypes { @@ -27,12 +30,7 @@ query GpuTypes { } } ``` -{% endcode %} -{% endtab %} -{% endtabs %} - -{% code title="Output" overflow="wrap" %} -```json +```json Output | JSON { "data": { "gpuTypes": [ @@ -55,24 +53,17 @@ query GpuTypes { } } ``` -{% endcode %} + -### Get GPU Type by ID +## Get GPU Type by ID -{% tabs %} -{% tab title="Curl" %} -{% code overflow="wrap" %} -```bash + +```curl curl --request POST \ --header 'content-type: application/json' \ - --url 'https://api.runpod.io/graphql?api_key=pewpew' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ --data '{"query": "query GpuTypes { gpuTypes(input: {id: \"NVIDIA GeForce RTX 3090\"}) { id displayName memoryInGb secureCloud communityCloud lowestPrice(input: {gpuCount: 1}) { minimumBidPrice uninterruptablePrice } } }"}' ``` -{% endcode %} -{% endtab %} - -{% tab title="GraphQL" %} -{% code overflow="wrap" %} ```graphql query GpuTypes { gpuTypes(input: {id: "NVIDIA GeForce RTX 3090"}) { @@ -88,11 +79,7 @@ query GpuTypes { } } ``` -{% endcode %} -{% endtab %} -{% endtabs %} - -```json +```json Output | JSON { "data": { "gpuTypes": [ @@ -111,3 +98,4 @@ query GpuTypes { } } ``` + diff --git a/graphql-api/get-pod.md b/v1.0/Resources - Tools/graphql-api/get-pod.md similarity index 83% rename from graphql-api/get-pod.md rename to v1.0/Resources - Tools/graphql-api/get-pod.md index aedd191..c64f6df 100644 --- a/graphql-api/get-pod.md +++ b/v1.0/Resources - Tools/graphql-api/get-pod.md @@ -1,24 +1,24 @@ --- -description: Get pod attributes like podId, name, runtime metrics, and more. +title: "Get Pod" +slug: "get-pod" +excerpt: "Get Pod attributes like Pod ID, name, runtime metrics, and more." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Apr 18 2023 12:57:34 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Jul 10 2023 17:34:57 GMT+0000 (Coordinated Universal Time)" --- -# Get Pod +## Get All Pods -### Get All Pods - -{% tabs %} -{% tab title="Curl" %} -{% code overflow="wrap" %} -```bash + +```curl curl --request POST \ --header 'content-type: application/json' \ - --url 'https://api.runpod.io/graphql?api_key=pewpew' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ --data '{"query": "query Pods { myself { pods { id name runtime { uptimeInSeconds ports { ip isIpPublic privatePort publicPort type } gpus { id gpuUtilPercent memoryUtilPercent } container { cpuPercent memoryPercent } } } } }"}' ``` -{% endcode %} -{% endtab %} - -{% tab title="GraphQL" %} ```graphql query Pods { myself { @@ -48,11 +48,7 @@ query Pods { } } ``` -{% endtab %} -{% endtabs %} - -{% code title="Output" overflow="wrap" %} -```json +```json Output | JSON { "data": { "myself": { @@ -108,23 +104,17 @@ query Pods { } } ``` -{% endcode %} + -### Get Pod by ID +## Get Pod by ID -{% tabs %} -{% tab title="Curl" %} -{% code overflow="wrap" %} -```bash + +```curl curl --request POST \ --header 'content-type: application/json' \ - --url 'https://api.runpod.io/graphql?api_key=pewpew' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ --data '{"query": "query Pod { pod(input: {podId: \"ldl1dxirsim64n\"}) { id name runtime { uptimeInSeconds ports { ip isIpPublic privatePort publicPort type } gpus { id gpuUtilPercent memoryUtilPercent } container { cpuPercent memoryPercent } } } }"}' ``` -{% endcode %} -{% endtab %} - -{% tab title="GraphQL" %} ```graphql query Pod { pod(input: {podId: "ldl1dxirsim64n"}) { @@ -152,11 +142,7 @@ query Pod { } } ``` -{% endtab %} -{% endtabs %} - -{% code title="Output" overflow="wrap" %} -```json +```json Output | JSON { "data": { "pod": { @@ -189,4 +175,4 @@ query Pod { } } ``` -{% endcode %} + diff --git a/graphql-api/start-pod.md b/v1.0/Resources - Tools/graphql-api/start-pod.md similarity index 71% rename from graphql-api/start-pod.md rename to v1.0/Resources - Tools/graphql-api/start-pod.md index 73434c9..38104b2 100644 --- a/graphql-api/start-pod.md +++ b/v1.0/Resources - Tools/graphql-api/start-pod.md @@ -1,24 +1,24 @@ --- -description: Start an OnDemand or Spot pod. +title: "Start Pod" +slug: "start-pod" +excerpt: "Start an On-Demand or Spot Pod." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Apr 18 2023 13:00:16 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Jul 10 2023 17:34:37 GMT+0000 (Coordinated Universal Time)" --- -# Start Pod +## Start On-Demand Pod -### Start OnDemand Pod - -{% tabs %} -{% tab title="Curl" %} -{% code overflow="wrap" %} -```bash + +```curl curl --request POST \ --header 'content-type: application/json' \ - --url 'https://api.runpod.io/graphql?api_key=pewpew' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ --data '{"query": "mutation { podResume( input: { podId: \"inzk6tzuz833h5\", gpuCount: 1 } ) { id desiredStatus imageName env machineId machine { podHostId } } }"}' ``` -{% endcode %} -{% endtab %} - -{% tab title="GraphQL" %} ```graphql mutation { podResume(input: {podId: "inzk6tzuz833h5", gpuCount: 1}) { @@ -33,11 +33,7 @@ mutation { } } ``` -{% endtab %} -{% endtabs %} - -{% code title="Output" overflow="wrap" %} -```json +```json Output | JSON { "data": { "podResume": { @@ -55,23 +51,17 @@ mutation { } } ``` -{% endcode %} + -### Start Spot Pod +## Start Spot Pod -{% tabs %} -{% tab title="Curl" %} -{% code overflow="wrap" %} -```bash + +```curl curl --request POST \ --header 'content-type: application/json' \ - --url 'https://api.runpod.io/graphql?api_key=pewpew' \ + --url 'https://api.runpod.io/graphql?api_key=${YOUR_API_KEY}' \ --data '{"query": "mutation { podBidResume( input: { podId: \"d62t7qg9n5vtan\", bidPerGpu: 0.2, gpuCount: 1 } ) { id desiredStatus imageName env machineId machine { podHostId } } }"}' ``` -{% endcode %} -{% endtab %} - -{% tab title="GraphQL" %} ```graphql mutation { podBidResume(input: {podId: "d62t7qg9n5vtan", bidPerGpu: 0.2, gpuCount: 1}) { @@ -86,11 +76,7 @@ mutation { } } ``` -{% endtab %} -{% endtabs %} - -{% code title="Output" overflow="wrap" %} -```json +```json Output | JSON { "data": { "podBidResume": { @@ -108,4 +94,4 @@ mutation { } } ``` -{% endcode %} + diff --git a/graphql-api/stop-pod.md b/v1.0/Resources - Tools/graphql-api/stop-pod.md similarity index 54% rename from graphql-api/stop-pod.md rename to v1.0/Resources - Tools/graphql-api/stop-pod.md index 537ae4e..d33c7a9 100644 --- a/graphql-api/stop-pod.md +++ b/v1.0/Resources - Tools/graphql-api/stop-pod.md @@ -1,23 +1,22 @@ --- -description: Stop an OnDemand or Spot Pod. +title: "Stop Pod" +slug: "stop-pod" +excerpt: "Stop an On-Demand or Spot Pod." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Apr 18 2023 13:01:34 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Jul 10 2023 17:34:15 GMT+0000 (Coordinated Universal Time)" --- -# Stop Pod - -{% tabs %} -{% tab title="Curl" %} -{% code overflow="wrap" %} -```bash + +```curl curl --request POST \ --header 'content-type: application/json' \ --url 'https://api.runpod.io/graphql?api_key=pewpew' \ --data '{"query": "mutation { podStop(input: {podId: \"riixlu8oclhp\"}) { id desiredStatus } }"}' ``` -{% endcode %} -{% endtab %} - -{% tab title="GraphQL" %} -{% code overflow="wrap" %} ```graphql mutation { podStop(input: {podId: "riixlu8oclhp"}) { @@ -26,12 +25,7 @@ mutation { } } ``` -{% endcode %} -{% endtab %} -{% endtabs %} - -{% code title="Output" overflow="wrap" %} -```json +```json Output | JSON { "data": { "podStop": { @@ -42,4 +36,4 @@ mutation { } ``` -{% endcode %} + diff --git a/v1.0/Resources - Tools/graphql-spec.md b/v1.0/Resources - Tools/graphql-spec.md new file mode 100644 index 0000000..7ef8c66 --- /dev/null +++ b/v1.0/Resources - Tools/graphql-spec.md @@ -0,0 +1,14 @@ +--- +title: "🧬 | GraphQL Spec" +slug: "graphql-spec" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sun Sep 03 2023 16:19:51 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sun Sep 03 2023 16:20:27 GMT+0000 (Coordinated Universal Time)" +type: "link" +link_url: "https://graphql-spec.runpod.io/" +link_external: true +--- diff --git a/v1.0/Resources - Tools/runpod-python.md b/v1.0/Resources - Tools/runpod-python.md new file mode 100644 index 0000000..85ed822 --- /dev/null +++ b/v1.0/Resources - Tools/runpod-python.md @@ -0,0 +1,14 @@ +--- +title: "🐍 | runpod-python" +slug: "runpod-python" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Wed May 31 2023 20:23:58 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Aug 07 2023 14:35:23 GMT+0000 (Coordinated Universal Time)" +type: "link" +link_url: "https://github.com/runpod/runpod-python" +link_external: true +--- diff --git a/v1.0/Resources - Tools/runpodctl.md b/v1.0/Resources - Tools/runpodctl.md new file mode 100644 index 0000000..57c28f2 --- /dev/null +++ b/v1.0/Resources - Tools/runpodctl.md @@ -0,0 +1,14 @@ +--- +title: "🧰 | runpodctl" +slug: "runpodctl" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Mar 28 2023 23:31:24 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Aug 07 2023 14:35:37 GMT+0000 (Coordinated Universal Time)" +type: "link" +link_url: "https://github.com/runpod/runpodctl" +link_external: true +--- diff --git a/v1.0/Resources - Tools/skypilot.md b/v1.0/Resources - Tools/skypilot.md new file mode 100644 index 0000000..3f29c50 --- /dev/null +++ b/v1.0/Resources - Tools/skypilot.md @@ -0,0 +1,11 @@ +--- +title: "SkyPilot" +slug: "skypilot" +excerpt: "" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Sat Aug 26 2023 17:26:17 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Aug 26 2023 17:26:17 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/Resources - Tools/video-resources.md b/v1.0/Resources - Tools/video-resources.md new file mode 100644 index 0000000..c233ead --- /dev/null +++ b/v1.0/Resources - Tools/video-resources.md @@ -0,0 +1,37 @@ +--- +title: "🎞️ | Video Resources" +slug: "video-resources" +excerpt: "A collection of commonly referenced videos on RunPod topics." +hidden: false +createdAt: "Mon Jul 03 2023 13:52:20 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sun Dec 10 2023 02:28:59 GMT+0000 (Coordinated Universal Time)" +--- + +## RunPod Usage + +| Video Link | Topics Covered | +| :------------------------------------------------------------------------------------------------------- | :------------- | +| [How to redeem your RunPod Coupon](https://www.youtube.com/watch?v=IYqEKwpuyWk&ab_channel=OpenCVCourses) | RunPod | +| [RunPod Introduction and Tour](https://www.youtube.com/watch?v=6O1oM_N6pcw&ab_channel=OpenCVCourses) | General | + +--- + +## Tutorials + +| Video Link | Topics Covered | +| :---------------------------------------------------------------------------------------------------------------------------- | :---------------------------- | +| [Generate Stable Diffusion Images FAST with RunPod](https://www.youtube.com/watch?v=susnjHSWFq0&t=32s&ab_channel=BillMeeks) | StableDiffusion, Automatic111 | +| [Generate Text On Images with DeepFloyd IF](https://www.youtube.com/watch?v=Px7Vv9WYl88&t=2s&ab_channel=BillMeeks) | DeepFloyd | +| [Remix Your Pics With Stable Diffusion and ControlNet](https://www.youtube.com/watch?v=BqdIdk9LU4w&t=1s&ab_channel=BillMeeks) | StableDiffusion, ControlNet | +| [Using Automatic1111 WebUI on RunPod](https://www.youtube.com/watch?v=R6HUQOtsVic&ab_channel=OpenCVCourses) | WebUI, Automatic1111 | +| [RUN TextGen AI WebUI LLM On Runpod & Colab!](https://www.youtube.com/watch?v=TP2yID7Ubr4&ab_channel=Aitrepreneur) | GoogleColab, TextGeneration | +| [Make Your Renders 10x Faster With Runpod](https://www.youtube.com/watch?v=sJ-Diy93TAg&ab_channel=RahulAhire) | Rendering, Blender | + +--- + +## General/Generic Linux + +| Video Link | Topics Covered | +| :---------------------------------------------------------------------------------------------------------------------------------- | :----------------- | +| [How to Use the rsync Command \| Linux Essentials Tutorial](https://www.youtube.com/watch?v=2PnAohLS-Q4&ab_channel=AkamaiDeveloper) | File Transfer | +| [SSH Key Authentication \| How to Create SSH Key Pairs](https://www.youtube.com/watch?v=33dEcCKGBO4&ab_channel=AkamaiDeveloper) | SSH Authentication | diff --git a/v1.0/SERVERLESS/custom-apis.md b/v1.0/SERVERLESS/custom-apis.md new file mode 100644 index 0000000..45aa4d7 --- /dev/null +++ b/v1.0/SERVERLESS/custom-apis.md @@ -0,0 +1,15 @@ +--- +title: "Custom APIs" +slug: "custom-apis" +excerpt: "Bring your own container image, we scale and handle the rest." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Mar 28 2023 23:36:27 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Aug 04 2023 10:07:34 GMT+0000 (Coordinated Universal Time)" +--- + +## Overview + +While we try to add APIs where we can, we can only maintain and create so many APIs. If you have a custom use case, you can use our custom API support to stand up your serverless API! diff --git a/v1.0/SERVERLESS/custom-apis/autoscaling.md b/v1.0/SERVERLESS/custom-apis/autoscaling.md new file mode 100644 index 0000000..c74732f --- /dev/null +++ b/v1.0/SERVERLESS/custom-apis/autoscaling.md @@ -0,0 +1,50 @@ +--- +title: "Autoscaling and Worker Lifecycle" +slug: "autoscaling" +excerpt: "The Serverless AI platform enables seamless scale for your models. The following properties can be defined for your service." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Mar 28 2023 23:44:01 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Jun 27 2023 01:42:19 GMT+0000 (Coordinated Universal Time)" +--- + +New APIs can be created from the [API management page](https://www.runpod.io/console/serverless/user/apis). + +![](https://files.readme.io/6b32f2b-sls-new-config.png) + +### API Name + +Anything you prefer. + +### Network Volume + +You can attach a network volume to your serverless endpoint. It will get automatically mounted at the "/runpod-volume" path. This can allow you to persist state between worker invocations and also share state between your workers. While this is a high performance network drive, do keep in mind that it will have higher latency than a local drive. **Please note that this will limit the availability of cards, as your endpoint workers will be locked to the datacenter that houses your network volume!** + +### Template + +Select from your templates. The template controls what worker is used to run your API jobs. Please note that you should be updating the container image name in your template with a different name:tag combination if you want your workers to update the version of the container image you are using. **If you use the same name:tag combination, workers will not automatically pull updates for you as we currently do not do hash based comparisons.** + +### Min Workers + +This is the minimum amount of workers that we will try to keep running for you. A minimum worker count of 0 means that if your API doesn't receive requests for a while, then you will have no active workers running. This will help you save on your costs, but may mean that the first cold start will take a bit longer than average. Use your discretion to pick something that suits your scale and budget. + +### Max Workers + +You can also configure a max worker count. This is the top limit of what RunPod will attempt to auto-scale for you. Use this to cap your concurrent request count and also limit your cost ceiling. Note that we currently base your caching coefficient by this number, so an endpoint with higher max worker count will also receive a higher priority when caching workers. This is partially why we limit new accounts to a relatively low max concurrency at the account level. If you want to get this number raised, you generally will need to have a higher history of spending, or commit to a relatively high spend per month. You should generally aim to set your max worker count to be 20% higher than you expect your max concurrency to be. + +### Idle Timeout (seconds) + +Idle timeout to wait before a worker is scaled down. If you specify 5 seconds, workers will sit idle for at least 5 seconds before it's stopped to help reduce cost. + +### GPU Type + +You can currently choose between three varieties of configurations: 16 GB, 24 GB, or 80 GB VRAM.\ +For the 16 GB variety, we deploy NVIDIA RTX A4000.\ +For the 24 GB variety, we deploy NVIDIA RTX A5000 or 3090.\ +For the 80 GB variety, we deploy NVIDIA A100 80 GB. + +A100s are about 2-3x faster than A5000s and also allow double the VRAM with very high bandwidth throughout. 3090s and A5000s are 1.5-2x faster than A4000s. Sometimes, it may make more sense to use 24 GB even if you don't need it compared to 16 GB due to faster response times. Depending on the nature of the task, it's also possible that execution speeds may be bottlenecked and not significantly improved simply by using a higher-end card. Do your own calculations and experimentation to determine out what's most cost-effective for your workload and task type. + +Want access to different flavors? [Let us know](https://www.runpod.io/contact) and we can look at expanding our offerings! diff --git a/v1.0/SERVERLESS/custom-apis/template-creation.md b/v1.0/SERVERLESS/custom-apis/template-creation.md new file mode 100644 index 0000000..6e22aaa --- /dev/null +++ b/v1.0/SERVERLESS/custom-apis/template-creation.md @@ -0,0 +1,57 @@ +--- +title: "Template Creation" +slug: "template-creation" +excerpt: "Templates define additional configuration for deploying workers." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Mar 28 2023 23:42:35 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Apr 29 2023 14:17:05 GMT+0000 (Coordinated Universal Time)" +--- + +You can access [template creation here](https://www.runpod.io/console/serverless/user/templates). + +The following properties can be defined per template. + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/8cd505f-image.png", +null, +"" +], +"align": "center", +"sizing": "% " +} +] +} +[/block] + +### Template Name + +Name your template anything you want to help you organize your templates. + +### Container Image + +Location to the container image. This could be from docker-hub or any other repository. You can use the following here if you didn't build your own worker: + +runpod/serverless-hello-world + +### Container Registry Credentials + +Link container credentials for private repositories. These can be configured in your [user settings menu](https://www.runpod.io/console/serverless/user/settings). + +### Docker Command + +Command to run on container startup; by default, command defined in the Dockerfile will be used. + +### Container Disk + +Amount of disk required to run your worker. This will depend on how your model and accompanying files are in the container. + +### Environment Variables + +Use these to pass config and secrets to your container. diff --git a/v1.0/SERVERLESS/custom-apis/testing-your-apis-response-time.md b/v1.0/SERVERLESS/custom-apis/testing-your-apis-response-time.md new file mode 100644 index 0000000..bfb959a --- /dev/null +++ b/v1.0/SERVERLESS/custom-apis/testing-your-apis-response-time.md @@ -0,0 +1,41 @@ +--- +title: "Testing Your API's Response Time" +slug: "testing-your-apis-response-time" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Thu Apr 13 2023 08:18:19 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Apr 29 2023 14:27:50 GMT+0000 (Coordinated Universal Time)" +--- + +When setting up an API, you have several options available at different price points and resource allocations. You can select a single option if you would prefer to only use one price point, or select a preference order between the pools that will allocate your requests accordingly. + +![](https://files.readme.io/742bf51-image.png) + +The option that will be most cost effective for you will be based on your use case and your tolerance for task run time. Each situation will be different, so when deciding which API to use, it's worth it to do some testing to not only find out how long your tasks will take to run, but how much you might expect to pay for each task. + +To find out how long a task will take to run, select a single pool type as shown in the image above. Then, you can send a request to the API through your preferred method. If you're unfamiliar with how to do so or don't have your own method, then you can use a free option like [reqbin.com](https://reqbin.com/) to send an API request to the RunPod severs. + +The URLs to use in the API will be shown in the My APIs screen: + +![](https://files.readme.io/0d8dd86-image.png) + +On reqbin.com, enter the Run URL of your API, select POST under the dropdown, and enter your API key that was given when you created the key under [Settings](https://www.runpod.io/console/serverless/user/settings)(if you do not have it saved, you will need to return to Settings and create a new key). Under Content, you will also need to give it a basic command (in this example, we've used a Stable Diffusion prompt). + +![](https://files.readme.io/a9b9cf3-image.png) + +![](https://files.readme.io/7744b62-image.png) + +Send the request, and it will give you an ID for the request and notify you that it is processing. You can then swap the URL in the request field with the Status address and add the ID to the end of it, and click Send. + +![](https://files.readme.io/325f2bc-image.png) + +It will return a Delay Time and an Execution Time, denoted in milliseconds. The Delay Time should be extremely minimal, unless the API process was spun up from a cold start, then a sizable delay is expected for the first request sent. The Execution Time is how long the GPU took to actually process the request once it was received. It may be a good idea to send a number of tests so you can get a min, max, and average run time -- five tests should be an adequate sample size. + +![](https://files.readme.io/1608d44-image.png) + +You can then switch the GPU pool above to a different pool and repeat the process. + +What will ultimately be right for your use case will be determined by how long you can afford to let the process run. For heavier jobs, a task on a slower GPU will be likely be more cost-effective with a tradeoff of speed. For simpler tasks, there may also be diminishing returns on how fast the task that can be run that may not be significantly improved by selecting higher-end GPUs. Experiment to find the best balance for your scenario. diff --git a/v1.0/SERVERLESS/custom-apis/updating-your-endpoint.md b/v1.0/SERVERLESS/custom-apis/updating-your-endpoint.md new file mode 100644 index 0000000..5cfad0a --- /dev/null +++ b/v1.0/SERVERLESS/custom-apis/updating-your-endpoint.md @@ -0,0 +1,61 @@ +--- +title: "Updating Your Endpoint" +slug: "updating-your-endpoint" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Jun 27 2023 01:34:48 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Jul 13 2023 18:09:42 GMT+0000 (Coordinated Universal Time)" +--- + +There are two methods of updating your endpoint from the UI. + +1. Replace the image used within the template. +2. Re-assign your endpoint to a new template. + +You can programmatically update your endpoint via CICD or other scripts using the following queries. + +To update the number of min and max workers, you can use the following two mutations. + +Minimum Workers control the amount of workers that will be provisioned no matter your queue status. **Please keep in mind that these workers will be long lived and billed for every second that they are active.** They are great for if you know that your request volume is stable and you want to keep workers around to make sure users have the best experience. Alternatively, it's sometimes good to set a minimum worker count when debugging your workers. + +``` +mutation UpdateEndpointWorkersMin { + updateEndpointWorkersMin( + input: { endpointId: "myEndpointId", workerCount: 1 } + ) { + id + workersMin + workersMax + } +} +``` + +Maximum workers control two things. The first (**and probably the less intuitive**) thing it controls is your endpoint's caching coefficient. **This means that the higher your max worker count, the more we prioritize your workers to be cached and ready.** This is partially why we limit new accounts to a relatively low max concurrency at the account level. If you want to get this number raised, you generally will need to have a higher history of spending, or commit to a relatively high spend per month. The second, and more obvious, thing it controls is the maximum concurrency for your endpoint. You should generally aim to set your max worker count to be 20% higher than you expect your max concurrency to be. + +``` +mutation UpdateEndpointWorkersMax { + updateEndpointWorkersMax( + input: { endpointId: "myEndpointId", workerCount: 3 } + ) { + id + workersMin + workersMax + } +} +``` + +Lastly, you can update your template by using the template ID. We currently recommend that you have two templates for your production deployment. This way, you can swap between them when deploying new changes. Currently, we swap container images based on the name:tag combination, so make sure that the two templates you are swapping between have different name:tag combinations. Once you swap the template, the serverless autobalancer will slowly start to cycle out the older containers for newer containers to prevent downtime. If you want to expedite this process and do not mind downtime, you can set your minimum/maximum workers to 0 before doing this. Setting your counts to 0 will force flush the existing container cache. + +``` +mutation UpdateEndpointTemplate { + updateEndpointTemplate( + input: { endpointId: "myEndpointId", templateId: "myTemplateId" } + ) { + id + templateId + } +} +``` diff --git a/v1.0/SERVERLESS/custom-apis/using-s3-to-upload-files-with-serverless.md b/v1.0/SERVERLESS/custom-apis/using-s3-to-upload-files-with-serverless.md new file mode 100644 index 0000000..86668c8 --- /dev/null +++ b/v1.0/SERVERLESS/custom-apis/using-s3-to-upload-files-with-serverless.md @@ -0,0 +1,108 @@ +--- +title: "Using S3 to upload images with serverless" +slug: "using-s3-to-upload-files-with-serverless" +excerpt: "Here's how you can use S3 to upload files with serverless, and get urls to the outputs as files" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Apr 18 2023 16:07:56 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Jun 22 2023 08:47:46 GMT+0000 (Coordinated Universal Time)" +--- + +## Uploading to an S3 bucket has 2 major steps + +1. Writing python code to upload files to S3 +2. Setting the environment variables for your S3 bucket + +## Uploading to an S3 bucket with python + +1. For the example code, we presume 2 things + + - you've installed the runpod python library with `pip install runpod` + - you've an image file at `./image.png` in the docker container + +2. Now in your handler function, here's some example code that can upload to an s3 bucket, the code uploads the image `image.png` to an s3 bucket, and returns a url to the image + + + ```python + from runpod.serverless.utils import rp_upload + import runpod + + def handler(job): + image_url = rp_upload.upload_image(job['id'], "./image.png") + return [image_url] + + runpod.serverless.start({"handler": handler}) + ``` + + +3. now package your code in a similar manner as described by the [Worker Image Creation](https://docs.runpod.io/docs/worker-image-creation) and [Template Creation](https://docs.runpod.io/docs/template-creation) steps + +## Setting the environment variables + +1. You can set environment variables for a pod via the template creation/editing interface, the Environment Variables section is in the very bottom\ + ![](https://files.readme.io/2d93548-image.png) +2. Set the following environment variables\ + ![](https://files.readme.io/0693616-image.png) +3. You've to set the variables + + - `BUCKET_ENDPOINT_URL` + - `BUCKET_ACCESS_KEY_ID` + - and `BUCKET_SECRET_ACCESS_KEY` + + ensure your `BUCKET_ENDPOINT_URL` has the bucket name at the start (for example, `https://your-bucket-name.nyc3.digitaloceanspaces.com` or `https://your-bucket.s3.us-west-004.backblazeb2.com`) + +## Testing your api out + +1. Now when you access your api you should see the image as an output uploaded to s3, here's a sample input\ + Editors note : your request **must** contain an input key, and it must be a json item, so ensure you put that, a sample request has been provided below + + + ```python Python + import requests + + endpoint = "https://api.runpod.ai/v2/xxxxxxxxx/run" + + headers = { + "Content-Type": "application/json", + "Authorization": "Bearer XXXXXXXXXXXXX" + } + + # Define your inputs + # an input value must be present, even if it is unused, + # and it must be a json value + input_data = { + "input": {"inp":"this is an example input"} + } + + response = requests.post(endpoint, json=input_data, headers=headers) + json = response.json() + + # the json will be similar to + # {'id': 'e3d2e250-ea81-4074-9838-1c52d006ddcf', 'status': 'IN_QUEUE'} + ``` + + +2. Here's an example output request, with the image in output + + + ```python + response = requests.get("https://api.runpod.ai/v2/xxxxxxxxx/status/" + json['id'], headers=headers) + response.json() + ``` + + +Here's an example response, after the request completes + + + ```python JSON + { + 'delayTime': 86588, + 'executionTime': 1563, + 'id': 'e3d2e250-ea81-4074-9838-1c52d006ddcf', + 'output': ['https://your-bucket.s3.us-west-004.backblazeb2.com/your-image.png'], + 'status': 'COMPLETED' + } + ``` + diff --git a/v1.0/SERVERLESS/custom-apis/using-your-api-copy.md b/v1.0/SERVERLESS/custom-apis/using-your-api-copy.md new file mode 100644 index 0000000..3a06996 --- /dev/null +++ b/v1.0/SERVERLESS/custom-apis/using-your-api-copy.md @@ -0,0 +1,227 @@ +--- +title: "Using Your API" +slug: "using-your-api-copy" +excerpt: "Okay! Now you have everything set up, but how do you use it?" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Thu Jul 27 2023 10:39:12 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Oct 27 2023 13:53:56 GMT+0000 (Coordinated Universal Time)" +--- + +Once everything above is configured, you will be able to invoke your API using the "run" endpoint on your API dashboard. Our services are currently asynchronous, so you must use the "status" endpoint to get the status/results of each run using the ID present in the run response payload. You can also pass in a webhook URL when invoking "run" within the JSON body. + +Our own APIs are built using the same tools, so you can take a look at the RunPod API overview. The only difference is that your custom API endpoint only accepts requests using your own account's API key, not any RunPod API key. + +We offer two different kinds of run mechanisms: synchronous responses and asynchronous responses. + +## Running your API + +### /runsync + + +```curl cURL +curl -X POST https://api.runpod.ai/v2//runsync \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ +-d '{"input": { + +here's a possible example request (taken from our stable diffusion image) + + +```curl cURL +curl -X POST https://api.runpod.ai/v2//runsync \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ +-d '{"input": {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"}}' +``` +```python +# this requires the installation of runpod-python +# with `pip install runpod-python` beforehand + +import runpod + +runpod.api_key = "xxxxxxxxxxxxxxxxxxxxxx" # you can find this in settings + +endpoint = runpod.Endpoint("ENDPOINT_ID") + +run_request = endpoint.run_sync( + {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"} +) + +print(run_request) +``` + + +this should give a direct response if the code runs for \< 90 seconds, or else it'll give a status response (which you can see below) + +**Sample response** + +```json +{ + "delayTime": 123456, // (milliseconds) time in queue + "executionTime": 1234, // (milliseconds) time it took to complete the job + "gpu": "24", // gpu type used to run the job + "id": "c80ffee4-f315-4e25-a146-0f3d98cf024b", + "input": { + "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" + }, + "output": [ + { + "image": "https://job.results1", + "seed": 1 + }, + { + "image": "https://job.results2", + "seed": 2 + } + ], + "status": "COMPLETED" +} +``` + +### /run + + +```curl cURL +curl -X POST https://api.runpod.ai/v2//run \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ +-d '{"input": { + +here's a possible example request + + +```curl cURL +curl -X POST https://api.runpod.ai/v2//run \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ +-d '{"input": {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"}}' +``` +```python +# this requires the installation of runpod-python +# with `pip install runpod-python` beforehand + +import runpod + +runpod.api_key = "xxxxxxxxxxxxxxxxxxxxxx" # you can find this in settings + +endpoint = runpod.Endpoint("ENDPOINT_ID") + +run_request = endpoint.run( + {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"} +) + +print(run_request.status()) +``` + + +running your api via **/run** runs the code asynchronously, here's a sample response + +**sample response (for curl)** + +```json +{ + "id": "c80ffee4-f315-4e25-a146-0f3d98cf024b", + "status": "IN_QUEUE" +} +``` + +### /status + +**Sample request** + + +```Text cURL +curl https://api.runpod.ai/v2//status/ +``` +```python +# this requires the installation of runpod-python +# with `pip install runpod-python` beforehand + +import runpod + +runpod.api_key = "xxxxxxxxxxxxxxxxxxxxxx" # you can find this in settings + +endpoint = runpod.Endpoint("ENDPOINT_ID") + +run_request = endpoint.run( + {"prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists"} +) + +print(run_request.status()) +``` + + +**sample response (for job in progress)** + +```json JSON +{ + "delayTime": 2624, + "id": "c80ffee4-f315-4e25-a146-0f3d98cf024b", + "input": { + "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" + }, + "status": "IN_PROGRESS" +} +``` + +**sample response (for completed job)** + +```json JSON +{ + "delayTime": 123456, // (milliseconds) time in queue + "executionTime": 1234, // (milliseconds) time it took to complete the job + "gpu": "24", // gpu type used to run the job + "id": "c80ffee4-f315-4e25-a146-0f3d98cf024b", + "input": { + "prompt": "a cute magical flying dog, fantasy art drawn by disney concept artists" + }, + "output": [ + { + "image": "https://job.results1", + "seed": 1 + }, + { + "image": "https://job.results2", + "seed": 2 + } + ], + "status": "COMPLETED" +} +``` diff --git a/v1.0/SERVERLESS/custom-apis/worker-image-creation.md b/v1.0/SERVERLESS/custom-apis/worker-image-creation.md new file mode 100644 index 0000000..ee97985 --- /dev/null +++ b/v1.0/SERVERLESS/custom-apis/worker-image-creation.md @@ -0,0 +1,89 @@ +--- +title: "Worker Image Creation" +slug: "worker-image-creation" +excerpt: "Workers are Docker containers that can be easily configured to run your jobs." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Mar 28 2023 23:39:48 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Nov 04 2023 00:55:46 GMT+0000 (Coordinated Universal Time)" +--- + +It's easy to create a container image using our [Python SDK](https://github.com/runpod/runpod-python). For a simple "Hello, world!" example, you can check out this [repository](https://github.com/runpod/serverless-workers/tree/main/Tutorials/helloworld). + +This is the Dockerfile for Hello, World: + + +```python +from python:3.11.1-buster + +WORKDIR / + +RUN pip install runpod + +ADD handler.py . + +CMD [ "python", "-u", "/handler.py" ] +``` + + +Your Dockerfile should package all dependencies required to run your code. You should also bake in any models that you wish to have cached between jobs. You should aim to build a Docker container that is under 15-20GB maximum. **Be advised that we do not give the elevated privileges that enable Docker-in-Docker, so the container will need to be built off of Runpod.** + +Our simple example only packages the handler.py file, which is called as the default Docker command, so that it runs when the container starts. + + +```python +import runpod +import os +import time + +sleep_time = int(os.environ.get('SLEEP_TIME', 3)) + +## load your model(s) into vram here + +def handler(event): + print(event) + time_slept = 0 + while time_slept < sleep_time: + print("working, I promise") + time_slept += 1 + time.sleep(1) + # do the things + + return "Hello World" + + +runpod.serverless.start({ + "handler": handler +}) +``` + + +Important things to note for handler.py: + +- Import runpod as a dependency. +- Write the code that loads your model into VRAM outside of the handler function. This will cause it to be warm between job runs. Otherwise, you will have to load and unload from VRAM every time a new job starts.\ + Your handler function gets an "event" as the only function parameter. This includes metadata as well as whatever is passed to your API under the "input" property. +- You must invoke the runpod.serverless.start function and pass your handler function under the "handler" property. +- You must return something as output when your worker is done processing the job. This can directly be the output, or it can be links to cloud storage where the artifacts are saved. Keep in mind that the input and output payloads are limited to 2MB each. If your inputs or outputs are larger than that, you can upload them to S3 or other cloud storage and have your worker download/upload from there. + + +```json +// example event payload +{ + "delayTime": 2534, + "id": "2a16b881-830f-4d14-af5b-f7db7c0a96fc", + "input": { + "prompt": "A beautiful painting of a singular lighthouse, shining its light across a tumultuous sea of blood by greg rutkowski and thomas kinkade, Trending on artstation." + }, + "status": "IN_PROGRESS" +} +``` + + +This Hello, World example simply takes whatever is passed to it, pretends it's doing work for 3 seconds (or whatever is configured in the env variable), then returns "Hello, World" as an output. + +Build and push your image to your favorite container image repository when you're done. + +While you can't currently use RunPod for this step, we are looking for ways to make this part of the development experience more smooth. [Let us know](https://www.runpod.io/contact) if you have ideas or feature requests to make this part of the workflow more streamlined! diff --git a/v1.0/SERVERLESS/handler.md b/v1.0/SERVERLESS/handler.md new file mode 100644 index 0000000..b61a2b3 --- /dev/null +++ b/v1.0/SERVERLESS/handler.md @@ -0,0 +1,62 @@ +--- +title: "⚙️ | The Handler" +slug: "handler" +excerpt: "The function responsible for processing requests." +hidden: false +createdAt: "Sat Aug 19 2023 16:14:48 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Nov 23 2023 00:36:47 GMT+0000 (Coordinated Universal Time)" +--- + +Written in Python, the handler function is responsible for processing submitted inputs and generating the resulting output. When developing your handler, you can do so locally on your PC or remotely on a RunPod GPU instance. Example handler functions can be found within the [repos of our runpod-workers](https://github.com/orgs/runpod-workers/repositories). + +## Job Input + +Before we look at the handler, it is essential first to understand what a job request input will look like; later, we will cover all of the input options in detail; for now, what is essential is that your handler should be expecting a JSON dictionary to be passed in. At a minimum, the input will be formatted as such: + +```json +{ + "id": "A_RANDOM_JOB_IDENTIFIER", + "input": { "key": "value" } +} +``` + +## Requirements + +You will need to have the RunPod Python SDK installed; this can be done by running `pip install runpod`. + +## Basic Handler Function + +```python +# your_handler.py + +import runpod # Required. + +def handler(job): + job_input = job["input"] # Access the input from the request. + + # Add your custom code here. + + return "Your job results" + +runpod.serverless.start({ "handler": handler}) # Required. +``` + +> 🚧 Keep setup processes and functions outside of your handler function. For example, if you are running models make sure they are loaded into VRAM prior to calling `serverless.start` with your handler function. + +## Testing Locally + +As you develop your handler, you will, of course, want to test it with inputs formatted similarly to what you will be sending in once deployed as a worker. The quickest way to run a test is to pass in your input as an argument when calling your handler file. Assuming your handler function is inside of a file called `your_handler.py` and your input is `{"input": {"prompt": "The quick brown fox jumps"}}` you would call your file like so: + +```curl Bash +python your_handler.py --test_input '{"input": {"prompt": "The quick brown fox jumps"}}' +``` + +Additionally, you can launch a local test server that will provide you with an endpoint to send requests to by calling your file with the `--rp_serve_api` argument. See our [blog post](https://blog.runpod.io/workers-local-api-server-introduced-with-runpod-python-0-9-13/) for additional examples. + +```python Bash +python your_handler.py --rp_serve_api +``` + +### CI/CD Pipeline + +If any errors are returned by the worker while running a test_input job, the worker will exit with a non-zero exit code. Otherwise, the worker will exit with a zero exit code. This can be used to check if the worker ran successfully, for example, in a CI/CD pipeline. diff --git a/v1.0/SERVERLESS/handler/handler-additional-controls.md b/v1.0/SERVERLESS/handler/handler-additional-controls.md new file mode 100644 index 0000000..855f763 --- /dev/null +++ b/v1.0/SERVERLESS/handler/handler-additional-controls.md @@ -0,0 +1,49 @@ +--- +title: "Additional Controls" +slug: "handler-additional-controls" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Oct 31 2023 14:08:18 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 15:43:36 GMT+0000 (Coordinated Universal Time)" +--- + +## Progress Updates + +Progress updates can be sent out from your worker while a job is in progress. Progress updates will be available when the status is polled. To send an update, call the `runpod.serverless.progress_update` function with your job and context of your update. + +```python +import runpod + +def handler(job): + for update_number in range(0,3): + runpod.serverless.progress_update(job, f"Update {update_number}/3") + + return "done" + +runpod.serverless.start({"handler": handler}) +``` + +## Refresh Worker + +When completing long-running job requests or complicated requests that involve a lot of reading and writing files, starting with a fresh worker can be beneficial each time. A flag can be returned with the resulting job output to stop and refresh the used worker. This behavior is achieved by doing the following within your worker: + +```python +# Requires runpod python version 0.9.0+ + +def your_handler(job): + . + . + ... + Your handler functionality here. + ... + . + . + return {"refresh_worker": True, "job_results": "can be anything"} +``` + +Your handler must return a dictionary that contains the refresh_worker; this flag will be removed before the remaining job output is returned. + +Note: Refreshing a worker does not impact billing or count for/against your min, max, and warmed workers. It simply "resets" that worker at the end of a job. diff --git a/v1.0/SERVERLESS/handler/handler-async.md b/v1.0/SERVERLESS/handler/handler-async.md new file mode 100644 index 0000000..9c9dd44 --- /dev/null +++ b/v1.0/SERVERLESS/handler/handler-async.md @@ -0,0 +1,26 @@ +--- +title: "Async Handler" +slug: "handler-async" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Oct 30 2023 17:23:15 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Oct 30 2023 17:35:38 GMT+0000 (Coordinated Universal Time)" +--- + +```python +import runpod + +async def async_generator_handler(job): + for i in range(5): + output = f"Generated async token output {i}" + yield output + await asyncio.sleep(1) # Simulate an asynchronous task (e.g., LLM processing time). + +runpod.serverless.start({ + "handler": async_generator_handler, # Required + "return_aggregate_stream": True # Optional, results available via /run +}) +``` diff --git a/v1.0/SERVERLESS/handler/handler-error-handling.md b/v1.0/SERVERLESS/handler/handler-error-handling.md new file mode 100644 index 0000000..0d383fa --- /dev/null +++ b/v1.0/SERVERLESS/handler/handler-error-handling.md @@ -0,0 +1,33 @@ +--- +title: "Error Handling" +slug: "handler-error-handling" +excerpt: "Managing errors while processing a job." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Oct 31 2023 14:05:56 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 15:28:39 GMT+0000 (Coordinated Universal Time)" +--- + +By default, if an exception is raised within your handler function, the runpod SDK will catch it and return it as part of the job results. Jobs that produce an error will have their final status "FAILED." + +## Custom Errors + +There are times when you may want to flag a job as failed and return an error. For example, if your job requires a _seed_ key to be included as part of the input, you might first validate the job input and then return an error indicating that this field was missing. This might look like the following: + +```python +import runpod + +def handler(job): + job_input = job["input"] + + if not job_input.get("seed", False): + return {"error": "Input is missing the 'seed' key, please include a seed and try your request again"} + + return "Everything looks good!" + +runpod.serverless.start({"handler": handler}) +``` + +> ❗️ Careful not to swallow errors when using a `try/except` within your handler function. Either return the error or raise it if the job should result should be "FAILED". diff --git a/v1.0/SERVERLESS/handler/handler-generator.md b/v1.0/SERVERLESS/handler/handler-generator.md new file mode 100644 index 0000000..dd21765 --- /dev/null +++ b/v1.0/SERVERLESS/handler/handler-generator.md @@ -0,0 +1,31 @@ +--- +title: "Generator Handler" +slug: "handler-generator" +excerpt: "A handler that can stream fractional results." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Oct 30 2023 17:20:24 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 15:40:18 GMT+0000 (Coordinated Universal Time)" +--- + +RunPod provides a robust streaming feature that enables users to receive real-time updates on job outputs, mainly when dealing with Language Model tasks. We support two types of streaming generator functions: regular generator and async generator. + +```python +import runpod + +def generator_handler(job): + for count in range(3): + result = f"This is the {count} generated output." + yield result + +runpod.serverless.start({ + "handler": generator_handler, # Required + "return_aggregate_stream": True # Optional, results available via /run +}) +``` + +### Return Aggregate Stream + +By default, when a generator handler is running, the fractional outputs will only be available at the `/stream` endpoint, if you would also like the outputs to be available from the `/run` and `/runsync` endpoints you will need to set `return_aggregate_stream` to True when starting your handler. diff --git a/v1.0/SERVERLESS/handler/handler-utilities.md b/v1.0/SERVERLESS/handler/handler-utilities.md new file mode 100644 index 0000000..058a265 --- /dev/null +++ b/v1.0/SERVERLESS/handler/handler-utilities.md @@ -0,0 +1,10 @@ +--- +title: "Utilities" +slug: "handler-utilities" +excerpt: "Commonly used functions wrapped into easy to use utilities." +hidden: true +metadata: + robots: "index" +createdAt: "Tue Oct 31 2023 15:54:58 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 15:55:25 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/SERVERLESS/overview.md b/v1.0/SERVERLESS/overview.md new file mode 100644 index 0000000..63e8c15 --- /dev/null +++ b/v1.0/SERVERLESS/overview.md @@ -0,0 +1,31 @@ +--- +title: "🛰️ | Overview" +slug: "overview" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Jun 09 2023 15:57:18 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 23:09:49 GMT+0000 (Coordinated Universal Time)" +--- + +RunPod offers Serverless GPU computing for AI Inference and Training, allowing users to pay by the second for their compute usage. This flexible platform is designed to scale dynamically, meeting the computational needs of AI workloads from the smallest to the largest scales. + +Key features of RunPod Serverless GPU include: + +- **AI Inference:** Handle millions of inference requests daily and can be scaled to handle billions, making it an ideal solution for machine learning inference tasks. This allows users to scale their machine learning inference while keeping costs low. + +- **AI Training:** Machine learning training tasks that can take up to 12 hours. GPUs can be spun up per request and scaled down once the task is done, providing a flexible solution for AI training needs. + +- **Autoscale:** Dynamically scale workers from 0 to 100 on the Secure Cloud platform, which is highly available and distributed globally. This provides users with the computational resources exactly when needed. + +- **Container Support:** Bring any Docker container to RunPod. Both public and private image repositories are supported, allowing users to configure their environment exactly how they want. + +- **3s Cold-Start:** To help reduce cold-start times, RunPod proactively pre-warms workers. The total start time will vary based on the runtime, but for stable diffusion, the total start time is 3 seconds cold-start plus 5 seconds runtime. + +- **Metrics and Debugging:** Transparency is vital in debugging. RunPod provides access to GPU, CPU, Memory, and other metrics to help users understand their computational workloads. Full debugging capabilities for workers through logs and SSH are also available, with a web terminal for even easier access. + +- **Webhooks:** Users can leverage webhooks to get data output as soon as a request is done. Data is pushed directly to the user's Webhook API, providing instant access to results. + +RunPod Serverless GPUs are not just for AI Inference and Training. They're also great for a variety of other use cases. Feel free to use them for tasks like rendering, molecular dynamics, or any other computational task that suits your fancy. diff --git a/v1.0/SERVERLESS/overview/serverless-quick-start.md b/v1.0/SERVERLESS/overview/serverless-quick-start.md new file mode 100644 index 0000000..717828e --- /dev/null +++ b/v1.0/SERVERLESS/overview/serverless-quick-start.md @@ -0,0 +1,27 @@ +--- +title: "Quick Start" +slug: "serverless-quick-start" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Oct 31 2023 16:28:07 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 23:02:04 GMT+0000 (Coordinated Universal Time)" +--- + +Let's dive right in! This quick start guide assumes the following: + +- You have some experience using a terminal +- Have git installed and can clone GitHub repos +- Have Docker installed and can build Docker images +- Have a RunPod account and Docker Hub (or other container registry) account + +To deploy our template work: + +1. Clone the [worker-template](https://github.com/runpod-workers/worker-template) locally to your PC. +2. Navigate into the root of the cloned repo and run `docker build --tag /: .` once it has completed building, push it to your container registry. +3. Deploy a serverless endpoint on RunPod by following The Endpoint guide. +4. Send a test request by following the Job Requests guide. + +Now that you have successfully launched an endpoint using our template, you can start customizing the handler for your use case. diff --git a/v1.0/SERVERLESS/serverless-endpoint.md b/v1.0/SERVERLESS/serverless-endpoint.md new file mode 100644 index 0000000..e6874b5 --- /dev/null +++ b/v1.0/SERVERLESS/serverless-endpoint.md @@ -0,0 +1,13 @@ +--- +title: "🏁 | The Endpoint" +slug: "serverless-endpoint" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Oct 30 2023 17:29:04 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 23:18:15 GMT+0000 (Coordinated Universal Time)" +--- + +With a working handler now baked into a docker image with all the dependencies required to run, you are ready to deploy it on RunPod and start sending API requests. diff --git a/v1.0/SERVERLESS/serverless-endpoint/serverless-endpoint-creation.md b/v1.0/SERVERLESS/serverless-endpoint/serverless-endpoint-creation.md new file mode 100644 index 0000000..d70194a --- /dev/null +++ b/v1.0/SERVERLESS/serverless-endpoint/serverless-endpoint-creation.md @@ -0,0 +1,92 @@ +--- +title: "Endpoint Creation" +slug: "serverless-endpoint-creation" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Oct 31 2023 17:24:58 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 20:57:39 GMT+0000 (Coordinated Universal Time)" +--- + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/0186a32-image.png", +null, +"The Endpoint Creation Dialog" +], +"align": "center", +"sizing": "80% ", +"caption": "The Endpoint Creation Dialog" +} +] +} +[/block] + +To convert a serverless template into an endpoint, navigate to [Serverless > Endpoints](https://www.runpod.io/console/serverless/user/endpoints) and press `New Endpoint` to open up the endpoint creation dialog. After you are done configuring your endpoint, press `deploy`. + +### Endpoint Name + +Any name you would like to use for this endpoint configuration, the resulting endpoint will be assigned a random ID to be used when making calls. This name is only visible to you. + +### Select Template + +Select a serverless template that you would like to use for this particular endpoint. + +### GPU Selection + +Select one or more GPUs you want your endpoint to run on. + +> #### Priority +> +> When multiple GPU sizes are selected, they will be prioritized based on the chosen order. When an endpoint is created, RunPod will allocate as many works to the first available GPU size selected based on priority. Roughly every 60 minutes, the number of allocated workers is reviewed, and a rebalance will occur to either move more to your first priority or spill over to different sizes until your active and max workers are met. + +### Active (Min) Workers + +Setting this amount to >1 will result in "always on" workers. This will allow you to have a worker ready to respond to job requests without incurring any cold start delay. + +> ❗️ You will incour the cost of any active workers you have set regardless if they are working on a job. + +### Max Workers + +This will establish a ceiling or upper limit to the number of active workers your endpoint will have running at any given point. + +### GPUs / Worker + +The number of GPUs you would like assigned to your worker.\ +_Note: Currently only available for 48GB GPUs_ + +### Idle Timeout + +The amount of time in seconds a worker not currently processing a job will remain active until it is put back into standby. During the idle period, your worker is considered running and will incur a charge. + +### ⚡ FlashBoot + +RunPod magic to further reduce the average cold-start time of your endpoint. FlashBoot works best when an endpoint receives consistent utilization. There is no additional cost associated with FlashBoot. + +### Advanced + +Additional controls to help you control where your endpoint is deployed and how it responds to incoming requests. + +> #### Data Centers +> +> Control which datacenters you would like your workers deployed and cached. By default all datacenters are selected. +> +> #### Select Network Volume +> +> Attatch a network storage volume to your deployed workers. +> +> 📘 Network volumes will be mounted to `/runpod-volume/` +> +> #### Scale Type +> +> - **Queue Delay** scaling strategy adjusts worker numbers based on request wait times. With zero workers initially, the first request adds one worker. Subsequent requests add workers only after waiting in the queue for the defined number of delay seconds. +> - **Request Count **scaling strategy adjusts worker numbers according to total requests in the queue and in progress. It automatically adds workers as the number of requests increases, ensuring tasks are handled efficiently. _Total Workers Formula: Math.ceil((requestsInQueue + requestsInProgress) / )_ +> +> #### GPU Types +> +> Within the select GPU size category you can further select which GPU models you would like your endpoint workers to run on. diff --git a/v1.0/SERVERLESS/serverless-endpoint/serverless-endpoint-update.md b/v1.0/SERVERLESS/serverless-endpoint/serverless-endpoint-update.md new file mode 100644 index 0000000..2cab16c --- /dev/null +++ b/v1.0/SERVERLESS/serverless-endpoint/serverless-endpoint-update.md @@ -0,0 +1,11 @@ +--- +title: "Releasing Updates" +slug: "serverless-endpoint-update" +excerpt: "" +hidden: true +metadata: + image: [] + robots: "index" +createdAt: "Tue Oct 31 2023 23:06:52 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 23:06:52 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/SERVERLESS/serverless-endpoint/serverless-template-creation.md b/v1.0/SERVERLESS/serverless-endpoint/serverless-template-creation.md new file mode 100644 index 0000000..4a62cc1 --- /dev/null +++ b/v1.0/SERVERLESS/serverless-endpoint/serverless-template-creation.md @@ -0,0 +1,56 @@ +--- +title: "Template Creation" +slug: "serverless-template-creation" +excerpt: "Templates define basic configurations for deploying workers." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Oct 31 2023 17:02:51 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 20:58:01 GMT+0000 (Coordinated Universal Time)" +--- + +After logging into RunPod navigate to [Serverless > Custom Template](https://www.runpod.io/console/serverless/user/templates) then press `New Template` to open up the template dialog. + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/99cd8c7-image.png", +null, +"The Template Creation Dialog" +], +"align": "center", +"sizing": "80% ", +"caption": "The Template Creation Dialog" +} +] +} +[/block] + +### Template Name + +Provide a name for your template; this can be anything you would like and is used to organize and locate your template as you add more. + +### Container Image + +Location to the container image. This could be from docker-hub or any other repository. You can use the following here if you didn't build your own worker: + +runpod/serverless-hello-world + +### Container Registry Credentials + +Link container credentials for private repositories. These can be configured in your user settings menu. + +### Docker Command + +Command to run on container startup; by default, the command _(CMD)_ defined in the Dockerfile will be used. + +### Container Disk + +Amount of disk required to run your worker. This will depend on how your model and accompanying files are in the container. + +### Environment Variables + +Use these to pass config and secrets to your container. diff --git a/v1.0/SERVERLESS/serverless-usage.md b/v1.0/SERVERLESS/serverless-usage.md new file mode 100644 index 0000000..acd18c5 --- /dev/null +++ b/v1.0/SERVERLESS/serverless-usage.md @@ -0,0 +1,86 @@ +--- +title: "🖇️ | Using Your Endpoint" +slug: "serverless-usage" +excerpt: "The method in which jobs are submitted and returned." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Aug 01 2023 13:42:10 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 23:16:24 GMT+0000 (Coordinated Universal Time)" +--- + +With a successful custom endpoint deployed, you are nearly ready to make a job request. Let's start by constructing our request body that will be submitted. + +## JSON Request Body + +Requests to your endpoint must be made via a JSON formatted request; at a minimum, it will need to have an `input` key containing a dictionary of inputs required to complete your job request. For example, if your handler required an input prompt, you might send in something like this: + +```json +{ + "input": { + "prompt": "The lazy brown fox jumps over the" + } +} +``` + +--- + +## Optional Inputs + +Along with an input key, other top-level inputs can also be included and offer different functions. If a key is passed in at the top level and not included here, it will be discarded and unavailable to your handler. + +> 👍 These optional inputs are available to all endpoints regardless of the worker. + +### ⚓ | Webhook + +To be notified of completed jobs, a URL can be passed within the top level of the request like so: + +```json +{ + "input": {}, + "webhook": "https://URL.TO.YOUR.WEBHOOK" +} +``` + +Your webhook endpoint should respond with a 200 status to acknowledge the successful call. If not received, the webhook will be attempted up to 2 times after a 10-second timeout. + +A POST request will be sent to your URL when the job is complete. This request will contain the same information you would receive if you fetched the results from the /status/{job_id} endpoint. + +### 📜 | Execution Policy + +By default, if a job remains `IN_PROGRESS` for longer than 24 hours, the worker that has that job will be terminated. If you know the upper limit (with some margin) on how long a job should take, you can prevent stale or dead workers from running excessively by setting the execution timeout policy. + +Setting this policy will limit how long a worker remains `IN_PROGRESS` before the worker is killed. + +```json +{ + "input": {}, + "policy":{ + "executionTimeout": int # time in milliseconds + } +} +``` + +_Minimum: 5000ms\ +Default: 86400000ms (24 hours)_ + +### 💾 | S3-Compatible Storage + +The credentials for S3-compatible object storage can be passed in with the request as follows: + +```json +{ + "input": {}, + "s3Config": { + "accessId": "key_id_or_username", + "accessSecret": "key_secret_or_password", + "bucketName": "storage_location_name", + "endpointUrl": "storage_location_address" + } +} +``` + +The configuration is only passed onto the worker; it will not be returned as part of the job request output. + +_Note: The serverless worker will need to contain the logic/functionality that allows it to make sure of this input. If you build a custom endpoint and request s3Config in the input, your worker is ultimately responsible for using the information passed in to upload the output._ diff --git a/v1.0/SERVERLESS/serverless-usage/serverless-endpoint-urls.md b/v1.0/SERVERLESS/serverless-usage/serverless-endpoint-urls.md new file mode 100644 index 0000000..2b59745 --- /dev/null +++ b/v1.0/SERVERLESS/serverless-usage/serverless-endpoint-urls.md @@ -0,0 +1,132 @@ +--- +title: "Endpoint URLs" +slug: "serverless-endpoint-urls" +excerpt: "" +hidden: false +createdAt: "Tue Oct 31 2023 21:12:57 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Nov 30 2023 17:24:42 GMT+0000 (Coordinated Universal Time)" +--- + +These endpoints provide standard functionality for submitting jobs and retrieving the output from job requests. To use these endpoints, you will need to have your endpoint ID. The constructed URL will start with `https://api.runpod.ai/v2/{endpoint_id}` followed by one of the following: + +# /run + +> Used to submit job requests. A unique Job ID is returned upon submitting a job to this endpoint. The Job ID can be used to check the status of a job and retrieve the output upon completion, or cancel the job before it completes. +> +> _Payload Capacity: 10MB\ +> Rate limit: 1000/s\ +> Job Availability: Successful job results are accessible for 30 minutes after completion_ +> +> ### Response Example +> +> ```json +> { "id": "eaebd6e7-6a92-4bb8-a911-f996ac5ea99d", "status": "IN_QUEUE" } +> ``` + +# /runsync + +> Used for shorter running jobs. When a job is submitted to this endpoint, if the job completes within 90 seconds, the job output is returned in the same request. If the job does not complete within this time frame, a Job ID is returned instead, which can be used to check the job status and retrieve the output upon completion. +> +> _Payload Capacity: 20MB\ +> Rate limit: 2000 per second.\ +> Job Availability: Successful job results only maintained for 60 seconds after completion._ +> +> ### Response Example +> +> ```json +> { +> "delayTime": 824, +> "executionTime": 3391, +> "id": "sync-79164ff4-d212-44bc-9fe3-389e199a5c15", +> "output": [ +> { +> "image": "https://14068d66ba387efac9ce5e4b1741bcf2.r2.cloudflarestorage.com/ai-api/06-23/sync-79164ff4-d212-44bc-9fe3-389e199a5c15_0.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=16b502c87564788383d52ec498a61a24%2F20230613%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230613T101718Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=8e810e9593c56523a77107875f2aa14a997ba64115fbc04856e68bf67da296a1", +> "seed": 46578 +> } +> ], +> "status": "COMPLETED" +> } +> ``` + +# /stream/{job_id} + +> Used in conjunction with generator-type handlers. As generator-type handlers yield results, these results will become available at the streaming endpoint. +> +> ### Response Example +> +> ```json +> { +> "id": "00000000-0000-0000-0000-000000000000", +> "delayTime": 1234, +> "status": "IN_PROGRESS", +> "stream": [{ "output": "A partial" }] +> } +> ``` + +# /status/{job_id} + +> Used to check the status of a job. Replace {job_id} with the unique Job ID returned when the job was submitted. The output is returned at this endpoint if the job is completed; otherwise, you will receive the current status of the job. If your handler returns progress updates, those updates can be retrieved by calling status on the job_id. +> +> ### Response Example +> +> ```json +> # Status of a job currently in the queue, waiting for a worker to grab it. +> {'id': '5a65c668-e99e-4e4c-81fd-0d106a843ee8', 'status': 'IN_QUEUE'} +> +> # Status of a job that has finished. +> { +> 'delayTime': 609, +> 'executionTime': 3050, +> 'id': '525b1754-4cf4-4983-a0c0-7ba9799f3e74', +> 'output': [{'image': 'https://example.com/image.png', +> 'seed': 46578}], +> 'status': 'COMPLETED' +> } +> ``` + +# /cancel/{job_id} + +> Used to cancel a job early. Replace {job_id} with the unique Job ID of the job you wish to cancel. +> +> ### Response Example +> +> ```json +> { "id": "e8d30bc5-9e9c-4bed-a3a2-0daaddda77ea", "status": "CANCELLED" } +> ``` + +# /health + +> Used to receive worker numbers and additional statistics on a particular endpoint. +> +> _Only accepts GET method. _ +> +> ### Response Example +> +> ```json +> { +> "jobs": { +> "completed": 1, +> "failed": 5, +> "inProgress": 0, +> "inQueue": 2, +> "retried": 0 +> }, +> "workers": { +> "idle": 0, +> "running": 0 +> } +> } +> ``` + +# /purge-queue + +> Clears all jobs in the queue; it will not cancel jobs in progress +> +> ### Response Example +> +> ```json +> { +> "removed": 0, +> "status": "completed" +> } +> ``` diff --git a/v1.0/SERVERLESS/serverless-usage/serverless-job-states.md b/v1.0/SERVERLESS/serverless-usage/serverless-job-states.md new file mode 100644 index 0000000..db180b7 --- /dev/null +++ b/v1.0/SERVERLESS/serverless-usage/serverless-job-states.md @@ -0,0 +1,35 @@ +--- +title: "Job States/Lifecycle" +slug: "serverless-job-states" +excerpt: "The states a job can be in." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Oct 31 2023 21:33:22 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Wed Nov 08 2023 17:40:58 GMT+0000 (Coordinated Universal Time)" +--- + +## IN_QUEUE + +> Indicates the job is in the endpoint queue and is waiting for a worker to pick it up. + +## IN_PROGRESS + +> A job is considered to be in progress after it is picked up by a worker and no longer in the queue. + +## COMPLETED + +> Upon returning a successful result the job is now considered complete. + +## FAILED + +> A job that returned with an error will be considered failed. + +## CANCELLED + +> If the `/cancel/{job_id}` endpoint is used to end a job before it as completed/failed it will report as have being cancelled. + +## TIMED_OUT + +> Jobs that expire before they are picked up by a worker or if the worker never reports back a result for the job before timing out. diff --git a/v1.0/SERVERLESS/serverless-worker.md b/v1.0/SERVERLESS/serverless-worker.md new file mode 100644 index 0000000..240446f --- /dev/null +++ b/v1.0/SERVERLESS/serverless-worker.md @@ -0,0 +1,51 @@ +--- +title: "📦 | The Worker" +slug: "serverless-worker" +excerpt: "Packaged code that will be receive and execute API submitted requests." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Aug 01 2023 13:27:10 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 31 2023 23:28:51 GMT+0000 (Coordinated Universal Time)" +--- + +Once you have a functional handler, the next step will be to package it into a Docker image that can be deployed as a scalable serverless worker. This is accomplished by defining a docker file to import everything required to run your handler. Example docker files are in the [repos of our runpod-workers](https://github.com/orgs/runpod-workers/repositories). + +_Unfamiliar with Docker? Check out their [overview page](https://docs.docker.com/get-started/overview/)._ + +## Docker File + +Let's say we have a directory that looks like the following: + +``` +project_directory +├── dockerfile +├── src +│ └── handler.py +└── builder + └── requirements.txt +``` + +Your dockerfile would look something like this: + +```Text Docker +from python:3.11.1-buster + +WORKDIR / + +COPY builder/requirements.txt . +RUN pip install -r requirements.txt + +ADD handler.py . + +CMD [ "python", "-u", "/handler.py" ] +``` + +> 🚧 If your handler requires external files such as model weights, be sure to cache them into your docker image. You are striving for a completly self contained worker that does not need to download or fetch external files to run. + +## Other Considerations + +While we do not impose a limit on the docker image size your container registry might have, be sure to review any limitations they may have. Ideally, you want to keep your final docker image as small as possible and only container the absolute minimum to run your handler. + +We also highly recommend the use of tags for docker images and not relying on the default `:latest` tag label, this will make version tracking and releasing updates significantly easier. diff --git a/v1.0/Team Account/convert-to-a-team-account.md b/v1.0/Team Account/convert-to-a-team-account.md new file mode 100644 index 0000000..cfa5b2f --- /dev/null +++ b/v1.0/Team Account/convert-to-a-team-account.md @@ -0,0 +1,49 @@ +--- +title: "💼 | Get Started" +slug: "convert-to-a-team-account" +excerpt: "Convert your account to a team account to start collaborating with other users." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Jul 25 2023 18:33:56 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 19:57:18 GMT+0000 (Coordinated Universal Time)" +--- + +## Converting Your Account + +Starting a team begins with converting your account to a team account. When you create a team, you gain the ability to invite other users to manage and use your account. While this is reversible, be cautious. Whoever you invite will have direct access to the team account and will operate on its behalf. To convert your account to a Team account, navigate to the [Team Link](https://www.runpod.io/console/team) in the sidebar and click Convert to Team Account. + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/1826424-Screenshot_2023-07-25_at_3.07.07_PM.png", +null, +"" +], +"align": "center" +} +] +} +[/block] + +When you click Convert to Team Account, you have the option to set your team's Display Name, confirm, and convert your account. + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/e4a9269-Screenshot_2023-07-25_at_3.08.56_PM.png", +null, +"" +], +"align": "center" +} +] +} +[/block] + +After you confirm, you will have access to your Team's dashboard, allowing you to invite other users, change the team's name, change members' roles, or delete the team and revert your account to a personal account. diff --git a/v1.0/Team Account/invites.md b/v1.0/Team Account/invites.md new file mode 100644 index 0000000..274c27a --- /dev/null +++ b/v1.0/Team Account/invites.md @@ -0,0 +1,47 @@ +--- +title: "📬 | Invites" +slug: "invites" +excerpt: "Invites allow you to invite other users to your team" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Jul 25 2023 19:30:06 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 19:58:50 GMT+0000 (Coordinated Universal Time)" +--- + +After you convert your account to a team account, you will be the only member of your team. In order to invite users to join you, navigate to your Team page, and click the "Invite New Member" button at the top of the "Members" section. + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/dc86838-Screenshot_2023-07-25_at_3.19.41_PM.png", +null, +"" +], +"align": "center" +} +] +} +[/block] + +Be sure to select the role you want to provide the user, and be careful of the admin role since it gives expansive access to the account. After you create the invite, you can copy the invite link from the pending invites section. + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/e50e5fc-Screenshot_2023-07-25_at_3.24.00_PM.png", +null, +"" +], +"align": "center" +} +] +} +[/block] + +Send a user your invite link and they will be able to go to it to join your team! diff --git a/v1.0/Team Account/roles.md b/v1.0/Team Account/roles.md new file mode 100644 index 0000000..bf3c47c --- /dev/null +++ b/v1.0/Team Account/roles.md @@ -0,0 +1,41 @@ +--- +title: "📛 | Roles" +slug: "roles" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Tue Jul 25 2023 18:35:08 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 20:01:45 GMT+0000 (Coordinated Universal Time)" +--- + +1. **Basic Role:** + - Users with the "Basic" role have limited permissions in the account. They can use the account and connect to existing pods, but they are restricted from accessing certain functionalities. + - Permissions: + - Can use the account. + - Can connect to and use Pods. + - Cannot see billing information. + - Cannot start/stop/create Pods. + +2. **Billing Role:** + - Users with the "Billing" role are specifically responsible for managing billing-related tasks and have access only to the billing page. + - Permissions: + - Can view and manage billing-related information and settings. + - Cannot access other account features or Pod management. + +3. **Dev Role:** + - Users with the "Dev" role have more privileges than "Basic" users and are suitable for developers or team members working on development tasks. + - Permissions: + - Inherits all permissions from the "Basic" role (can use the account and connect to Pods). + - Can start/stop/create Pods in the account. + - Cannot see billing information. + +4. **Admin Role:** + - Users with the "Admin" role have full control and access to all features and settings within the account. They are typically account administrators or owners. + - Permissions: + - Has access to all functionalities and settings in the account. + - Can manage billing and view billing information. + - Can start/stop/create Pods. + - Can modify account settings and permissions. + - Has complete control over all account resources and users. diff --git a/v1.0/WELCOME/about.md b/v1.0/WELCOME/about.md new file mode 100644 index 0000000..8bd7aee --- /dev/null +++ b/v1.0/WELCOME/about.md @@ -0,0 +1,37 @@ +--- +title: "📖 | About" +slug: "about" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sat Apr 01 2023 18:50:10 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sun Sep 03 2023 16:21:28 GMT+0000 (Coordinated Universal Time)" +--- + +## RunPod + +> RunPod is a cloud computing platform, primarily designed for AI and machine learning applications. Our key offerings include GPU Instances, Serverless GPUs, and AI Endpoints. + +### GPU Instances + +> Our GPU Instances allow you to deploy container-based GPU instances that spin up in seconds using both public and private repositories. They are available in two different types: Secure Cloud and Community Cloud. The Secure Cloud runs in T3/T4 data centers providing high reliability and security, while the Community Cloud connects individual compute providers to consumers through a vetted, secure peer-to-peer system. + +### Serverless GPUs + +> The Serverless GPU service offers pay-per-second serverless GPU computing, bringing autoscaling to your production environment. This service, part of our Secure Cloud offering, guarantees low cold-start times and stringent security measures. + +### AI Endpoints + +> Our AI Endpoints are fully managed and scaled to handle any workload. They are designed for a variety of applications including Dreambooth, Stable Diffusion, Whisper, and more. + +### Additional Features + +> RunPod also provides a CLI / GraphQL API to automate workflows and manage compute jobs effectively. Users can access multiple points for coding, optimizing, and running AI/ML jobs, including SSH, TCP Ports, and HTTP Ports. We also offer OnDemand and Spot GPUs to suit different compute needs, and Persistent Volumes to ensure the safety of your data even when your pods are stopped. Our Cloud Sync feature allows seamless data transfer to any cloud storage. + +### Our Mission + +> RunPod is committed to making cloud computing accessible and affordable to all without compromising on features, usability, or experience. We strive to empower individuals and enterprises with cutting-edge technology, enabling them to unlock the potential of AI and cloud computing. + +For any general inquiries, we recommend browsing through our documentation. Our team is also available on [Discord](https://discord.gg/cUpRmau42V), our support chat, and by [email](support@runpod.io). More information can be found on our [contact page](https://www.runpod.io/contact). diff --git a/v1.0/WELCOME/faq.md b/v1.0/WELCOME/faq.md new file mode 100644 index 0000000..eb2f0f7 --- /dev/null +++ b/v1.0/WELCOME/faq.md @@ -0,0 +1,166 @@ +--- +title: "❓ | FAQ" +slug: "faq" +excerpt: "General questions about RunPod and its services." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Thu Mar 30 2023 16:48:44 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Nov 11 2023 09:13:02 GMT+0000 (Coordinated Universal Time)" +--- + +## Secure Cloud vs Community Cloud + +> RunPod provides two cloud computing services: [Secure Cloud](https://www.runpod.io/console/gpu-secure-cloud) and [Community Cloud.](https://www.runpod.io/console/gpu-cloud) +> +> Secure Cloud runs in T3/T4 data centers by our trusted partners. Our close partnership comes with high-reliability with redundancy, security, and fast response times to mitigate any downtimes. For any sensitive and enterprise workloads, we highly recommend Secure Cloud. +> +> Community Cloud brings power in numbers and diversity spanning the whole world. Through our decentralized platform, we can offer peer-to-peer GPU computing that connects individual compute providers to compute consumers. Our Community Cloud hosts are invite-only and vetted by us, and still have to abide by our standards. Even though their associated infrastructure might not offer as much redundancy for power and networking, they still offer good servers that combine quality and affordability. +> +> Both solutions offer far more competitive prices than large cloud providers such as AWS or GCP. + +## On-Demand vs. Spot Pod + +> On-Demand Pods can run forever without interruptions with resources dedicated to your Pod. They do incur higher costs than Spot Pods. +> +> Spot Pods use spare compute capacity, allowing you to bid for those compute resources. Resources are dedicated to your Pod, but someone else can bid higher or start an On-Demand Pod that will stop your Pod. When this happens, your Pod is given a signal to stop 5 seconds prior with SIGTERM, and eventually, the kill signal SIGKILL after 5 seconds. You can use volumes to save any data to the disk in that 5s period or push data to the cloud periodically. + +### How does RunPod work? + +> RunPod leverages technologies like [Docker](https://www.docker.com/) to containerize and isolate guest workloads on a host machine. We have built a decentralized platform where thousands of servers can be connected to offer a seamless experience for all users. + +### Where can I go for help? + +> We'd be happy to help! Join our community on [Discord](https://discord.gg/pJ3P2DbUUq), message us in our support chat, or email us at [help@runpod.io](mailto:help@runpod.io). + +### What is RunPod's policy on refunds and credits? + +> If you aren't sure if RunPod is for you, feel free to hang out in our [Discord](https://discord.gg/cUpRmau42V) to ask questions or email [help@runpod.io](mailto:help@runpod.io) You can load as little as $10 into your account to try things out. We don't currently offer refunds or trial credits due to the overhead of processing these requests. Please plan accordingly! + +## What are Pods? + +--- + +### What is an On-Demand instance? + +> On-Demand instances are for non-interruptible workloads. You pay the On-Demand price and cannot be displaced by other users if you have funds to keep your Pod running. + +### What is a Spot instance? + +> A Spot instance is an interruptible instance that can generally be rented much cheaper than an On-Demand one. Spot instances are great for stateless workloads like an API or for workloads you can periodically save to a volume disk. Your volume disk is retained even if your Spot instance is interrupted. + +### What is a Savings Plan? + +> Savings Plans are a way for you to pay up-front and get a discount for it. This is great for when you know you will need prolonged access to compute. You can learn more on the about [Savings Plans here](https://docs.runpod.io/docs/savings-plans). + +## Billing + +> All billing, including per-hour compute and storage billing, is charged per minute. + +### How does Pod billing work? + +> Every Pod has an hourly cost based on GPU type. Your RunPod credits are charged for the Pod every minute as long as the Pod is running. If you ever run out of credits, your Pods will be automatically stopped, and you will get an email notification. Eventually, Pods will be terminated if you don't refill your credit. **We pre-emptively stop all of your Pods if you get down to 10 minutes of remaining run time. This gives your account enough balance to keep your data volumes around in the case you need access to your data. Please plan accordingly.** +> +> **Once a balance has been completely drained, all pods are subject to deletion at the discretion of the service. An attempt will be made to hold the pods for as long as possible, but this should not be relied upon! We highly recommend setting up [automatic payments](https://www.runpod.io/console/user/billing) to ensure balances are automatically topped up as needed.** +> +> Note that you must have at least one hour's worth of time in your balance to rent a Pod at your given spec. If your balance is insufficient to rent a Pod, then consider renting the Pod on Spot, depositing additional funds, or lowering your GPU spec requirements. + +### How does storage billing work? + +> We currently charge $0.10/GB/month for all storage on running Pods and $0.20/GB/month for volume storage on stopped Pods. Storage is tied to compute servers, and we want to ensure active users have enough space to run their workloads. Storage is charged per minute, and we never charge users if the host machine is down or unavailable from the public internet. + +### How does Network Volume billing work? + +> For storage requirements below 1TB, we charge a competitive rate of $0.07/GB/Month. If your storage requirements exceed 1TB, we provide a cost-effective pricing of $0.05/GB/Month. This ensures that you receive significant savings as your data storage scales. +> +> When you choose to create a Network Volume, you gain access to our robust infrastructure, which includes state-of-the-art storage servers located in the same datacenters where you rent GPU servers from us. These servers are connected via a high-speed 25Gbps local network, up to 200Gbps in some locations, guaranteeing efficient data transfer and minimal latency. Everything is stored on high-speed NVME SSDs to ensure best performance. +> +> **Network volumes are billed on a per-hour basis. Please note that if your machine-based storage or network volume is terminated due to lack of funds, that disk space is immediately freed up for use by other clients, and RunPod is unable to assist in recovering lost storage. RunPod is also not designed to be a cloud storage system; storage is provided in the pursuit of running tasks using its GPUs, and not meant to be a long-term backup solution. It is highly advisable to continually back up anything you want to save offsite locally or to a cloud provider.** + +## Security + +--- + +### Is my data protected from other clients? + +> Yes. Your data is run in a multi-tenant environment where other clients cannot access your pod. For sensitive workloads requiring the best security, please use Secure Cloud. + +### Is my data protected from the host of the machine my Pod is running on? + +> Data privacy is important to us at RunPod. Our Terms of Service prohibit hosts from trying to inspect your Pod data or usage patterns in any way. If you want the highest level of security, use Secure Cloud. + +## Usability + +--- + +### What can I do in a RunPod Pod? + +> You can run any Docker container available on any publicly reachable container registry. If you are not well versed in containers, we recommend sticking with the default run templates like our RunPod PyTorch template. However, if you know what you are doing, you can do a lot more! + +### Can I run my own Docker daemon on RunPod? + +> You can't currently spin up your own instance of Docker, as we run Docker for you! Unfortunately, this means that you cannot currently build Docker containers on RunPod or use things like Docker Compose. Many use cases can be solved by creating a custom template with the Docker image that you want to run. + +### My Pod is stuck on initializing. What gives? + +> Usually, this happens for one of several reasons. If you can't figure it out, [contact us](https://www.runpod.io/contact), and we'll gladly help you. + +1. You are trying to run a Pod to SSH into, but you did not give the Pod an idle job to run like "sleep infinity." +2. You have given your Pod a command that it doesn't know how to run. Check the logs to make sure that you don't have any syntax errors, etc. + +### Can I run Windows? + +> We don't currently support Windows. We want to do this in the future, but we do not have a solid timeframe for Windows support. + +### How do I find a reliable server in Community Cloud? + +> RunPod needs to provide you with reliable servers. All of our listed servers must meet minimum reliability, and most are running in a data center! However, if you want the highest level of reliability and security, use Secure Cloud. RunPod calculates server reliability by maintaining a heartbeat with each server in real-time. + +### Why do I have zero GPUs assigned to my Pod? + +> If you want to avoid this, using network volumes is the best choice. [Read about it here.](https://blog.runpod.io/four-reasons-to-set-up-a/) +> +> [Learn how to use them here.](https://docs.runpod.io/docs/create-a-network-volume) +> +> Most of our machines have between 4 and 8 GPUs per physical machine. When you start a Pod, it is locked to a specific physical machine. If you keep it running (On-Demand), then that GPU cannot be taken from you. However, if you stop your Pod, it becomes available for a different user to rent. When you want to start your Pod again, your specific machine may be wholly occupied! In this case, we give you the option to spin up your Pod with zero GPUs so you can retain access to your data. +> +> Remember that this does not mean there are no more GPUs of that type available, just none on the physical machine that specific Pod is locked to. Note that transfer Pods have limited computing capabilities, so transferring files using a UI may be difficult, and you may need to resort to terminal access or cloud sync options. + +#### What are Network Volumes? + +> Network volumes allow you to share data between Pods and generally be more mobile with your important data. This feature is only available in specific secure cloud data centers, but we are actively rolling it out to more and more of our secure cloud footprint. If you use network volumes, you should rarely run into situations where you cannot use your data with a GPU without a file transfer! +> +> [Read about it here.](https://blog.runpod.io/four-reasons-to-set-up-a/) +> +> [Learn how to use them here.](https://docs.runpod.io/docs/create-a-network-volume) + +## What if? + +--- + +### What if I run out of funds? + +> All your Pods are stopped automatically when you don't have enough funds to keep your Pods running for at least ten more minutes. When your Pods are stopped, your container disk data will be lost, but your volume data will be preserved. Pods are scheduled for removal if adequate credit balance is not maintained. If you fail to do so, your Pods will be terminated, and Pod volumes will be removed. +> +> After you add more funds to your account, you can start your Pod if you wish (assuming enough GPUs are available on the host machine). + +### What if the machine that my Pod is running loses power? + +> If the host machine loses power, it will attempt to start your Pod again when it returns online. Your volume data will be preserved, and your container will run the same command as it ran the first time you started renting it. Your container disk and anything in memory will be lost! + +### What if my Pod loses internet connectivity? + +> The host machine will continue to run your Pod to the best of its ability, even if it is not connected to the internet. If your job requires internet connectivity, then it will not function. You will not be charged if the host loses internet connectivity, even if it continues to run your job. You may, of course, request that your Pod exit while the host is offline, and it will exit your Pod when it regains network connectivity. + +### What if it says that my spending limit has been exceeded? + +> We implement a spending limit for newer accounts that will grow over time. This is because we have found that sometimes scammers try to interfere with the natural workings of the platform. We believe that this limit should not impact normal usage. We would be delighted to up your spending limit if you [contact us](https://www.runpod.io/contact) and share your use case. + +## Legal + +--- + +### Do you have some legal stuff I can look at? + +> Sure, do! Take a look at our [legal page](https://www.runpod.io/legal). diff --git a/v1.0/WELCOME/how-do-i-1.md b/v1.0/WELCOME/how-do-i-1.md new file mode 100644 index 0000000..49c4b34 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1.md @@ -0,0 +1,11 @@ +--- +title: "🤔 | How Do I?" +slug: "how-do-i-1" +excerpt: "Mini Guides" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sun Apr 02 2023 16:57:21 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sun Sep 03 2023 16:22:17 GMT+0000 (Coordinated Universal Time)" +--- diff --git a/v1.0/WELCOME/how-do-i-1/amazon-s3.md b/v1.0/WELCOME/how-do-i-1/amazon-s3.md new file mode 100644 index 0000000..2e834c5 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/amazon-s3.md @@ -0,0 +1,56 @@ +--- +title: "Amazon S3" +slug: "amazon-s3" +excerpt: "Create a bucket within Amazon S3." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Thu Apr 20 2023 01:33:08 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 10 2023 22:46:45 GMT+0000 (Coordinated Universal Time)" +--- + +You can review a video guide on the process [here](https://www.youtube.com/watch?v=2ZuOKwFR9pc&t=1s). + +### Creating a Bucket within Amazon S3 + +1. **Access the Bucket Creation Form:** + - Navigate to the Amazon S3 bucket creation form by visiting [this link](https://s3.console.aws.amazon.com/s3/bucket/create?region=us-east-1). + +2. **Name Your Bucket:** + - Provide a descriptive name for your bucket. Choose a name that is easy to remember and reflects the contents or purpose of the bucket. + +3. **Select AWS Region:** + - Ensure you select your preferred AWS Region. This is important for data storage locations and can affect access speeds. + +4. **Adjust Public Access Settings:** + - Uncheck the **Block All Public Access** option at the bottom of the form if you need your bucket to be publicly accessible. + +5. **Access Key and Secret Access Key:** + - Go to Security Credentials in your AWS account. + - Create an Access Key on the Security Credentials page. + - Note that your Secret Access Key will be displayed during this process. Keep it secure. + +![](https://files.readme.io/7fa9781-image.png) + +### Sending Data from RunPod to AWS S3 + +1. **Access CloudSync in RunPod:** + - In RunPod, navigate to the CloudSync section. + +2. **Enter Key IDs and Bucket Information:** + - Enter your Access Key and Secret Access Key. + - Specify the AWS Region where your bucket is located. + - Provide the path of your bucket as shown in the interface. + +3. **Initiate Data Transfer:** + - Select the **Copy to AWS S3** option. + - This action will start copying your pod contents to the specified Amazon S3 bucket. + +4. **Monitor Transfer:** + - Once you select Copy, your pod contents should begin copying over to Amazon S3. + - You can monitor the transfer process through RunPod’s interface to ensure that the data transfer completes successfully. + +![](https://files.readme.io/8fec5c5-image.png) + +Remember to keep your Access Key and Secret Access Key confidential to maintain the security of your AWS resources. diff --git a/v1.0/WELCOME/how-do-i-1/automatically-stop-my-pod.md b/v1.0/WELCOME/how-do-i-1/automatically-stop-my-pod.md new file mode 100644 index 0000000..c2df843 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/automatically-stop-my-pod.md @@ -0,0 +1,40 @@ +--- +title: "Automatically Stop My Pod" +slug: "automatically-stop-my-pod" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sun Apr 02 2023 16:59:20 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Jul 27 2023 12:56:53 GMT+0000 (Coordinated Universal Time)" +--- + +If you want to automatically stop your Pod when your workload is done, simply run the following command at the operating system level after your script is completed: + +```Text Bash +runpodctl stop pod $RUNPOD_POD_ID +``` + +runpodctl is our command line tool that is automatically installed in every Pod. RUNPOD_POD_ID is an environment variable that we pass to uniquely identify each Pod. Each runpodctl Pod instance is configured with an API key that is scoped to that Pod, so it cannot affect other Pods. + +If you simply want to stop your Pod after a specific amount of time, you can run the following command: + + +```Text Bash | Web Terminal +nohup bash -c "sleep 2h; runpodctl stop pod $RUNPOD_POD_ID" & +``` +```Text Bash | SSH +sleep 2h; runpodctl stop pod $RUNPOD_POD_ID & +``` + + +This simple command sleeps for 2 hours (change 2h to whatever you want), and then stops the Pod. `nohup` ensures the process won't terminate if you close the web terminal window. Keep in mind that you will still incur disk fees on a stopped Pod. + +If you want to terminate the Pod completely, you can configure your Pod with a zero-volume disk. In this case, stopping the Pod is equivalent to terminating it. + +You can also request to terminate the Pod directly using a similar cli command: + +```Text Bash +runpodctl remove pod $RUNPOD_POD_ID +``` diff --git a/v1.0/WELCOME/how-do-i-1/backblaze-b2-cloud-storage.md b/v1.0/WELCOME/how-do-i-1/backblaze-b2-cloud-storage.md new file mode 100644 index 0000000..051ae37 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/backblaze-b2-cloud-storage.md @@ -0,0 +1,35 @@ +--- +title: "Backblaze B2 Cloud Storage" +slug: "backblaze-b2-cloud-storage" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Apr 21 2023 07:12:22 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 10 2023 22:45:53 GMT+0000 (Coordinated Universal Time)" +--- + +If you prefer, you can see a video guide on the process [here](https://www.youtube.com/watch?v=zjqQBIY9Tdk&t=1s). + +**Setting up a bucket in Backblaze** + +Under [B2 Cloud Storage Buckets](https://secure.backblaze.com/b2_buckets.htm), click Create a Bucket. Ensure that the bucket is set to Public. + +![](https://files.readme.io/8aff108-image.png) + +Under [App Keys](https://secure.backblaze.com/app_keys.htm), create a new application key. + +![](https://files.readme.io/e40b729-image.png) + +**Transfering Data from Runpod** + +Under your My Pods screen, click Cloud Sync, and then Backblaze B2. + +![](https://files.readme.io/5c12c2f-image.png) + +Enter your KeyID in the first field, and the applicationKey in the second field, along with your bucket name as shown below. + +![](https://files.readme.io/7cc8d89-image.png) + +Click Copy to Backblaze B2, and your pod should begin transferring. diff --git a/welcome/how-do-i/bulk-start-stop-pods.md b/v1.0/WELCOME/how-do-i-1/bulk-startstop-pods.md similarity index 53% rename from welcome/how-do-i/bulk-start-stop-pods.md rename to v1.0/WELCOME/how-do-i-1/bulk-startstop-pods.md index 004eb69..43cb319 100644 --- a/welcome/how-do-i/bulk-start-stop-pods.md +++ b/v1.0/WELCOME/how-do-i-1/bulk-startstop-pods.md @@ -1,14 +1,22 @@ -# Bulk Start/Stop Pods +--- +title: "Bulk Start/Stop Pods" +slug: "bulk-startstop-pods" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sun Apr 02 2023 17:04:23 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Apr 29 2023 13:45:54 GMT+0000 (Coordinated Universal Time)" +--- -Sometimes you want to run a bunch of pods that all do the same thing, but it's a pain to have to click 100 times to start 30 pods. If you want to just spin up a bunch of pods to do some kind of automated task, you can use our [runpodctl command line tool](https://github.com/runpod/runpodctl) to accomplish this in an easy fashion. +Sometimes, you want to run a bunch of pods that all do the same thing, but it's a pain to have to click a hundred times to start 30 pods. If you want to just spin up a bunch of pods to do some kind of automated task, you can use our [runpodctl command line tool](https://github.com/runpod/runpodctl) to easily accomplish this. To start 10 pods with name "my-bulk-task": -{% code overflow="wrap" %} ``` runpodctl create pods --name my-bulk-task --gpuType "NVIDIA GeForce RTX 3070,NVIDIA GeForce RTX 3080" --imageName "runpod/cool-stuff" --containerDiskSize 10 --volumeSize 0 --mem 1 --args "bash -c 'bash command I want to run; runpodctl remove pod \$RUNPOD_POD_ID;'" --env "KEY1=VAL1" --env "KEY2=VAL2" --podCount 10 ``` -{% endcode %} This will create up to 10 pods on 3070 and 3080 GPUs that will run a bash command and then terminate themselves automatically when the bash command is done running. @@ -18,4 +26,4 @@ If you want to clean your pods up manually, you can run: runpodctl remove pods my-bulk-task --podCount 40 ``` -This command will terminate up to 40 pods with the name "my-bulk-task" +This command will terminate up to 40 pods with the name "my-bulk-task". diff --git a/v1.0/WELCOME/how-do-i-1/create-a-network-volume.md b/v1.0/WELCOME/how-do-i-1/create-a-network-volume.md new file mode 100644 index 0000000..9270df3 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/create-a-network-volume.md @@ -0,0 +1,39 @@ +--- +title: "Create a Network Volume" +slug: "create-a-network-volume" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Apr 24 2023 17:28:28 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Nov 06 2023 04:52:33 GMT+0000 (Coordinated Universal Time)" +--- + +Network Volumes are a feature specific to Secure Cloud that allows you to create a volume that multiple pods can interact with. This gives you an extra amount of flexibility to keep working--especially if you are working with a high demand GPU pool that may not always be available--as you can simply create a pod in a different pool while you wait for an option to free up. This can also save you time by downloading frequently used models or other large files to a volume and holding them for later use, rather than having to re-download them every time you spin up a new pod. + +**How to Create a Volume** + +Under the Secure Cloud page, click the option to create a volume. + +![](https://files.readme.io/797cfdc-image.png) + +The pricing for the volume will be shown, and you can select a data center and provide a name and the requested size. + +![](https://files.readme.io/596a4f5-image.png) + +Once you create the volume, it will appear in your list. + +![](https://files.readme.io/c4eea31-image.png) + +Once you click the Deploy option, your container size will be locked to the size of your network volume. Note that there will be a nominal cost for network volume storage, in lieu of the disk cost normally quoted. Also note that you can link many pods to one singular network volume, and you will enjoy an overall cost saving even with just two pods sharing one volume (as opposed to setting up two pods with separate volumes), despite the presence of this additional cost. + +![](https://files.readme.io/8f69d41-image.png) + +**What's the infrastructure behind Network Volume** + +When you choose to create a Network Volume, you gain access to our robust infrastructure, which includes state-of-the-art storage servers located in the same datacenters where you rent GPU servers from us. These servers are connected via a high-speed 25Gbps local network, up to 200Gbps in some locations, guaranteeing efficient data transfer and minimal latency. Everything is stored on high-speed NVME SSDs to ensure best performance. + +If you're interested in harnessing the advantages of Network Volume and its cost-effective storage solutions, we invite you to read our detailed [blog article](https://blog.runpod.io/four-reasons-to-set-up-a/). It explores the benefits and features of Network Volume, helping you make an informed decision about your storage needs. + +**Please note that if your machine-based storage or network volume is terminated due to lack of funds, that disk space is immediately freed up for use by other clients, and RunPod is unable to assist in recovering lost storage.** diff --git a/v1.0/WELCOME/how-do-i-1/customize-a-template.md b/v1.0/WELCOME/how-do-i-1/customize-a-template.md new file mode 100644 index 0000000..03ef53d --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/customize-a-template.md @@ -0,0 +1,29 @@ +--- +title: "Customize a Template" +slug: "customize-a-template" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sun Apr 02 2023 17:01:15 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Sep 28 2023 18:41:15 GMT+0000 (Coordinated Universal Time)" +--- + +A RunPod [template](https://www.runpod.io/console/templates) is just a Docker container image paired with a configuration. You can choose how deep you want to get into template customization, depending on your skill level. + +The easiest is to simply start with a RunPod official template or community template and use it as-is. + +If you want better control over what gets done at pod start, you can modify the "Docker Command" field. The default docker command for all RunPod templates is: + +``` +bash -c '/start.sh' +``` + +This means that if you want to run something prior to start.sh, you can put extra commands in there. For example, if I wanted to install vim: + +``` +bash -c 'apt update && apt install vim -y && /start.sh' +``` + +The only downside to this approach is that you will run these commands every time your pod starts. If you wish to customize the runtime container further, you can create your own Docker image. There is nothing special about creating a Docker image for RunPod, but if you want a simple primer, you can refer to [this blog post](https://www.runpod.io/blog/diy-deep-learning-docker-container). diff --git a/v1.0/WELCOME/how-do-i-1/download-a-folder-from-a-pod.md b/v1.0/WELCOME/how-do-i-1/download-a-folder-from-a-pod.md new file mode 100644 index 0000000..92f4001 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/download-a-folder-from-a-pod.md @@ -0,0 +1,57 @@ +--- +title: "Download a Folder from a Pod" +slug: "download-a-folder-from-a-pod" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Thu Jun 22 2023 16:24:27 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Jun 22 2023 17:39:24 GMT+0000 (Coordinated Universal Time)" +--- + +## Method 1. - Install Jupyter Archive + +Note: we've temporarily removed this package from our templates due to bugs associated with it; some users report that this package interferes with the ability to right-click and download single files. Use at your own discretion! + +1. In JupyterLab, if your Pod comes with a Python virtual environment (`venv`) in `/workspace`, activate it with `. /workspace/venv/bin/activate`. This way, even if you reset your Pod, you'll still keep the download as archive tool. + +![](https://files.readme.io/e297415-image.png) + +# + +2. Run `pip install jupyter-archive`. + +![](https://files.readme.io/1e9c735-image.png) + +# + +3. Restart your Pod. + +![](https://files.readme.io/9e8d41b-image.png) + +# + +4. You should now be able to right-click folders to download them as archives! + +![](https://files.readme.io/f77d850-image.png) + +# + +## Method 2. - Manually Zip and Download + +1. Run `apt install zip --yes`. + +![](https://files.readme.io/1245fad-image.png) + +# + +2. Run `zip -r archiveName.zip /path/to/folder/to/zip`, replacing `archiveName.zip` with the name you'd like to give your zip file and `/path/to/folder/to/zip` with, well, the path to the folder to zip. + +![](https://files.readme.io/aecf8ec-image.png) + +# + +3. You can now right click your zip file to download your folder! + +![](https://files.readme.io/f7a1e39-image.png) diff --git a/v1.0/WELCOME/how-do-i-1/dropbox.md b/v1.0/WELCOME/how-do-i-1/dropbox.md new file mode 100644 index 0000000..1f36a47 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/dropbox.md @@ -0,0 +1,45 @@ +--- +title: "Dropbox" +slug: "dropbox" +excerpt: "Send files to Dropbox through RunPod Cloud Sync." +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Thu Apr 20 2023 01:11:15 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Oct 10 2023 22:44:58 GMT+0000 (Coordinated Universal Time)" +--- + +This guide will walk you through creating a folder in Dropbox and using the Cloud Sync option in RunPod. You can also see a video guide on this process [here](https://www.youtube.com/watch?v=28lUYlh6uMQ&t=2s). + +**Setting up Dropbox** + +If you haven't already, you'll need to start by creating an app on the [DBX Platform](https://www.dropbox.com/developers/apps/create). Select Scoped Access under the API options, Full Dropbox under the type of access, and give it a name. + +Under the Permissions tab in the Dropbox App Console, also ensure the following checkboxes for reading and writing are ticked. + +![](https://files.readme.io/e73bced-image.png) + +After checking these boxes, return to the Settings tab, scroll down to the OAuth2 section under your app and click Generate under Generated Access Token. + +![](https://files.readme.io/e9d2698-image.png) + +It will create an access key for you. **Save this in a safe place -- just like the RunPod API key, it will disappear after you navigate away from the page.** + +![](https://files.readme.io/02b6bdd-image.png) + +Although not strictly necessary, it's also a good idea to create a folder that your workspace will be deposited to in your Dropbox. + +![](https://files.readme.io/261fba6-image.png) + +**Sending the data from RunPod** + +Next, go to RunPod and click the Cloud Sync option, and then click Dropbox. + +![](https://files.readme.io/2281560-image.png) + +Enter your Access Token and the remote path to send the data to. + +![](https://files.readme.io/c646811-image.png) + +Once you hit Copy to DropBox, your data should start syncing over. diff --git a/welcome/how-do-i/expose-ports.md b/v1.0/WELCOME/how-do-i-1/expose-ports.md similarity index 54% rename from welcome/how-do-i/expose-ports.md rename to v1.0/WELCOME/how-do-i-1/expose-ports.md index e7c534b..c796002 100644 --- a/welcome/how-do-i/expose-ports.md +++ b/v1.0/WELCOME/how-do-i-1/expose-ports.md @@ -1,4 +1,13 @@ -# Expose Ports +--- +title: "Expose Ports" +slug: "expose-ports" +excerpt: "" +hidden: false +metadata: + robots: "index" +createdAt: "Sun Apr 02 2023 16:51:49 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sun May 28 2023 13:48:26 GMT+0000 (Coordinated Universal Time)" +--- There are a few ways to expose ports on your pod to the outside world. The first thing that you should understand is that the publicly exposed port is most likely NOT going to be the same as the port that you expose on your container. Let's look at an example to illustrate this. @@ -8,33 +17,32 @@ Let's say that I want to run a public API on my pod using uvicorn with the follo uvicorn main:app --host 0.0.0.0 --port 4000 ``` -This means that uvicorn would be listening on all interfaces on port 4000. Let's now expose this port to public internet using two different methods. +This means that uvicorn would be listening on all interfaces on port 4000. Let's now expose this port to the public internet using two different methods. -#### Through RunPod's Proxy +### Through RunPod's Proxy -In this case, you would want to make sure that the port you want to expose (4000 in this case) is set on the template or pod configuration page. You can see here that I have added 4000 to the HTTP port list in my pod config. You can also do this on your template definition. +In this case, you would want to make sure that the port you want to expose (4000 in this case) is set on the [Template](https://www.runpod.io/console/user/templates) or [Pod](https://www.runpod.io/console/pods) configuration page. You can see here that I have added 4000 to the HTTP port list in my pod config. You can also do this on your template definition. -![](<../../.gitbook/assets/image (3).png>) +![](https://files.readme.io/1386a3c-image.png) -Once you have done this, and your server is running, you should be able to hit your server using the pod's proxy address, which is formed in this programmatic way: +Once you have done this, and your server is running, you should be able to hit your server using the pod's proxy address, which is formed in this programmatic way, where the pod ID is the unique ID of your pod, and the internal port in this case is 4000: ``` https://{POD_ID}-{INTERNAL_PORT}.proxy.runpod.net ``` -Where the pod id is the unique ID of your pod, and the internal port in this case is 4000. Keep in mind that this exposed to the public internet. While your pod id can act as a password of sorts, it's not a replacement for real authentication, which should be implemented at your API level. +Keep in mind that this exposed to the public internet. While your pod ID can act as a password of sorts, it's not a replacement for real authentication, which should be implemented at your API level. -#### Through TCP Public IP +### Through TCP Public IP If your pod supports a public IP address, you can also expose your API over public TCP. In this case, you would add the port to the TCP side of the configuration. -![](<../../.gitbook/assets/image (2).png>) - -The only difference here is that you will receive an external port mapping and a public IP address to access your service. +![](https://files.readme.io/49ebb9a-image.png) +The only difference here is that you will receive an external port mapping and a public IP address to access your service.\ For example, your connect menu may look something like this: -![](<../../.gitbook/assets/image (6).png>) +![](https://files.readme.io/5e76c21-image.png) In this case, you would be hitting your service running on 4000 with the following ip:port combination @@ -42,17 +50,17 @@ In this case, you would be hitting your service running on 4000 with the followi 73.10.226.56:10027 ``` -Be aware that the public IP should not change (for secure cloud - it may change sometimes for community cloud), but the port will change if your pod gets reset. +Be aware that the public IP could potentially change when using Community Cloud, but should not change when using Secure Cloud. The port will change if your pod gets reset. -#### Requesting a Symmetrical Port Mapping +### Requesting a Symmetrical Port Mapping For some applications, asymmetrical port mappings are not ideal. In the above case, we have external port 10027 mapping to internal port 4000. If you need to have a symmetrical port mapping, you can request them by putting in ports above 70000 in your TCP port field. -![](<../../.gitbook/assets/image (4).png>) +![](https://files.readme.io/23c4178-image.png) -Of course, 70000 isn't a valid port number, but what this does is it tells RunPod that you don't care what the actual port number is on launch, but to please give you a symmetrical mapping. You can inspect the actual mapping via your connect menu: +Of course, 70000 isn't a valid port number, but what this does is it tells RunPod that you don't care what the actual port number is on launch, but to rather give you a symmetrical mapping. You can inspect the actual mapping via your connect menu: -![](<../../.gitbook/assets/image (1).png>) +![](https://files.readme.io/92e4f90-image.png) In this case, I have requested two symmetrical ports and they ended up being 10030:10030 and 10031:10031. If you need programmatic access to these in your pod, you can access them via environment variable: @@ -60,4 +68,3 @@ In this case, I have requested two symmetrical ports and they ended up being 100 RUNPOD_TCP_PORT_70001=10031 RUNPOD_TCP_PORT_70000=10030 ``` - diff --git a/v1.0/WELCOME/how-do-i-1/manage-payment-card-declines.md b/v1.0/WELCOME/how-do-i-1/manage-payment-card-declines.md new file mode 100644 index 0000000..d071026 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/manage-payment-card-declines.md @@ -0,0 +1,35 @@ +--- +title: "Manage Payment Card Declines" +slug: "manage-payment-card-declines" +excerpt: "What to do if your payment card is declined?" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sun Jul 30 2023 00:29:28 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Tue Aug 01 2023 12:03:16 GMT+0000 (Coordinated Universal Time)" +--- + +RunPod is a US-based organization that serves clients all across the world. However, credit card processors have in general keyed into international transactions as a potential vector for fraud and tend to apply more stringent standards for blocking transactions. If your card is declined, don't panic! To minimize potential interruptions to your service, you'll want to follow these steps. + +**Keep your balance topped up** + +To avoid any potential issues with your balance being overrun, it's best to refresh your balance at least a few days before you're due to run out so you have a chance to address any last minute delays. Also be aware that there is an option to automatically refresh your balance when you run low under the Billing [page](https://www.runpod.io/console/user/billing): + +![](https://files.readme.io/739337f-image.png) + +**Call the bank that issued your card** + +Once you do experience a card decline, the first step you'll want to do is to contact your issuing bank to see why a card is declined. Due to consumer/merchant privacy standards in the US, we are not provided with a reason that the card is declined, only that the transaction was not processed. Only your issuing bank can specifically tell you why a payment was declined. Many times, declines are for completely innocent reasons, such as your bank's anti-fraud protection tripping; just the same, RunPod is unable to assist with blocks put in place by your bank. + +It's important that you call your bank for the initial decline before trying a different card, because the processor may block _all_ funding attempts from an account if it seems declines from multiple cards for the same account, even if these attempts would have otherwise not had any problems. These account blocks generally clear after 24 hours, but it may be difficult to load the account until then. + +**Other potential reasons for card blocks** + +Our payment processor may block cards for specific users based on their risk profile, so certain use patterns may trigger a block. If you use several different cards within a short period time, or have had disputed transactions in the past, this may also cause cards to decline. + +To see a list of supported cards on Stripe, [click here](https://stripe.com/docs/payments/cards/supported-card-brands>). + +**Contact us for support** + +If all else fails, then feel free to contact [RunPod support](https://www.runpod.io/contact) if you are still having trouble loading your account. We ask that you check with your bank first, but if everything checks out on your end, we will be glad to help! diff --git a/v1.0/WELCOME/how-do-i-1/microsoft-azure-blob-storage.md b/v1.0/WELCOME/how-do-i-1/microsoft-azure-blob-storage.md new file mode 100644 index 0000000..0b66475 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/microsoft-azure-blob-storage.md @@ -0,0 +1,47 @@ +--- +title: "Microsoft Azure Blob Storage" +slug: "microsoft-azure-blob-storage" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Apr 21 2023 06:17:03 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Sat Apr 29 2023 13:54:53 GMT+0000 (Coordinated Universal Time)" +--- + +**Creating a Storage Account in Azure** + +First, you'll need to create a [Resource Group](https://portal.azure.com/#view/HubsExtension/BrowseResourceGroups) in Azure by hitting the Create button. Once you give it a name, you'll be ready to proceed to the next step. + +![](https://files.readme.io/dcc8c23-image.png) + +Under [Storage Accounts](https://portal.azure.com/#view/HubsExtension/BrowseResource/resourceType/Microsoft.Storage%2FStorageAccounts) in Azure, hit the Create button to create a new account. + +![](https://files.readme.io/1bbc566-image.png) + +You'll need to give it a name as well, and assign it to the resource group you just created. + +![](https://files.readme.io/294103f-image.png) + +Go to Access Keys under Security + Networking to retrieve the key for your account. + +![](https://files.readme.io/f2193e4-image.png) + +Under Storage Browser, click Blob Containers, and then Add Container to create a container. You can also create folders within that container, if desired. + +![](https://files.readme.io/256e4ef-image.png) + +**Transferring the data from Runpod** + +Go to the your pod under My Pods, and click Cloud Sync and select Azure Blob Storage, and Copy to Azure Blob Storage. + +![](https://files.readme.io/55e94f0-image.png) + +Enter your account name, account key, and desired path, and click Copy to Azure Blob Storage. + +![](https://files.readme.io/855625c-image.png) + +Once you hit Copy, your pod contents should begin copying over. + +![](https://files.readme.io/62134fd-image.png) diff --git a/v1.0/WELCOME/how-do-i-1/override-my-public-key.md b/v1.0/WELCOME/how-do-i-1/override-my-public-key.md new file mode 100644 index 0000000..9f4fdc5 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/override-my-public-key.md @@ -0,0 +1,15 @@ +--- +title: "Override My Public Key" +slug: "override-my-public-key" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sun Apr 02 2023 17:04:37 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Apr 07 2023 19:46:32 GMT+0000 (Coordinated Universal Time)" +--- + +We attempt to inject the public key that you configure in your account's settings page for authentication using basic terminal. If you want to override this at a pod level, you can manually supply a public key as the `RUNPOD_SSH_PUBLIC_KEY` environment variable. + +![](https://files.readme.io/f39d149-image.png) diff --git a/v1.0/WELCOME/how-do-i-1/sync-my-volume-to-a-cloud-provider.md b/v1.0/WELCOME/how-do-i-1/sync-my-volume-to-a-cloud-provider.md new file mode 100644 index 0000000..8cc09c2 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/sync-my-volume-to-a-cloud-provider.md @@ -0,0 +1,17 @@ +--- +title: "Sync My Volume To A Cloud Provider" +slug: "sync-my-volume-to-a-cloud-provider" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Mon Apr 24 2023 18:05:43 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Apr 24 2023 18:05:43 GMT+0000 (Coordinated Universal Time)" +--- + +You can sync your volume to a cloud provider by clicking the Cloud Sync option under your My Pods page. Click the dropdown on the left to get specific instructions for your specific provider. + +![](https://files.readme.io/63efccb-image.png) + +![](https://files.readme.io/b87ceae-image.png) diff --git a/v1.0/WELCOME/how-do-i-1/transfer-data.md b/v1.0/WELCOME/how-do-i-1/transfer-data.md new file mode 100644 index 0000000..93e1a84 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/transfer-data.md @@ -0,0 +1,47 @@ +--- +title: "Google Cloud Storage" +slug: "transfer-data" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sun Apr 02 2023 16:58:19 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Wed Apr 19 2023 12:05:31 GMT+0000 (Coordinated Universal Time)" +--- + +**Setting Up Google Cloud Storage** + +Under your Google Cloud Storage dashboard, click on Buckets -> Create. + +![](https://files.readme.io/4450288-image.png) + +Give it a name, and leave all the other options as the default. You'll also need to uncheck "Enforce Public Access Prevention On This Bucket" + +![](https://files.readme.io/052b6b3-image.png) + +![](https://files.readme.io/5041653-image.png) + +Once the bucket is created, it's a good idea to create a folder within the bucket to keep things better organized, especially if you have multiple pods. + +![](https://files.readme.io/f3ac923-image.png) + +**Transferring Data from RunPod** + +Under your pod screen in RunPod, click on Cloud Sync -> Google Cloud Storage -> Copy to Google Cloud Storage. + +![](https://files.readme.io/a4fcf38-image.png) + +![](https://files.readme.io/1934fdf-image.png) + +On this screen, you'll need to provide your Service Account JSON key. If you're not familiar with how to create a Service Account Key, refer to [this article for assistance.](https://cloud.google.com/iam/docs/keys-create-delete) In the first field, you will need to copy and paste the entire contents of your Service Account JSON key (even though it looks like a small field, you really do need to paste the entire file's contents in it. It will work!) + +Then, specify the destination path in your bucket, along with the folder from your pod that you wish to copy. + +![](https://files.readme.io/af87bb5-image.png) + +If everything is set up, you'll see CloudSync push your workspace over to the bucket. Success! + +![](https://files.readme.io/4eb7dee-image.png) + +Note: If your bucket is not publicly viewable, you'll get the following error: "2023-04-18 20:22:00 ERROR : GCS bucket myrunpodbucket path myrunpodfolder: error reading destination root directory: googleapi: Error 403: [myrunpodkey@impactful-facet-384119.iam.gserviceaccount.com](mailto:myrunpodkey@impactful-facet-384119.iam.gserviceaccount.com) does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist)., forbidden." In that case, make the bucket publicly viewable [as described here.](https://cloud.google.com/storage/docs/access-control/making-data-public) diff --git a/v1.0/WELCOME/how-do-i-1/transfer-files-with-rsync.md b/v1.0/WELCOME/how-do-i-1/transfer-files-with-rsync.md new file mode 100644 index 0000000..5bec729 --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/transfer-files-with-rsync.md @@ -0,0 +1,171 @@ +--- +title: "Transfer Files with SCP/rsync" +slug: "transfer-files-with-rsync" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Fri Aug 11 2023 20:01:04 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Thu Aug 17 2023 18:55:16 GMT+0000 (Coordinated Universal Time)" +--- + +## Prerequisites/Setup + +Note: your local machine must be running Linux or a [WSL instance](https://learn.microsoft.com/en-us/windows/wsl/about) in order to use rsync. + +1. Make sure your Pod is configured to use real SSH. Refer to [this guide](https://docs.runpod.io/docs/use-real-ssh) for assistance. +2. If you intend to use rsync, make sure it's installed on both your local machine and your Pod with `apt install rsync`. + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/ae0ee09-image.png", +null, +"You can also use the basic SSH terminal or SSH over exposed TCP commands to connect to your Pod and run the rsync install command." +], +"align": "center", +"caption": "You can also use the basic SSH terminal or SSH over exposed TCP commands to connect to your Pod and run the rsync install command." +} +] +} +[/block] + +![](https://files.readme.io/d00988d-image.png) + +3. Note the public IP address and external port from the SSH over exposed TCP command (you'll need these for the SCP/rsync commands). + +![](https://files.readme.io/c099425-image.png) + +## Transferring with SCP + +The general syntax for sending files to a Pod with SCP is as follows (execute this on your local machine, and replace the x's with your Pod's external TCP port and IP; for this example, they are 43201 and 194.26.196.6, respectively): + + +```shell Bash +scp -P xxxxx -i ~/.ssh/id_ed25519 /local/file/path root@xxx.xxx.xxx.xxx:/destination/file/path +``` + + +Note: if your private key file is in a location other than `~/.ssh/id_ed25519` or you're using the Windows Command Prompt, make sure you update this path accordingly in your command. + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/1e471f2-3.png", +null, +"" +], +"align": "center" +} +] +} +[/block] + +If you want to receive a file from your Pod, switch the source and destination arguments: + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/51e282a-4.png", +null, +"" +], +"align": "center" +} +] +} +[/block] + +If you need to transfer a directory, use the `-r` flag to recursively copy files and subdirectories (this will follow any symbolic links encountered as well): + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/47d5c1c-5.png", +null, +"" +], +"align": "center" +} +] +} +[/block] + +## Transferring with rsync + +The general syntax for sending files to a Pod with rsync is as follows (execute this on your local machine, and replace the x's with your Pod's external TCP port and IP): + + +```shell Bash +rsync -e "ssh -p xxxxx" /source/file/path root@xxx.xxx.xxx.xxx:/destination/file/path +``` + + +Some helpful flags include: + +`-a`/`--archive` - archive mode (ensures that permissions, timestamps, and other attributes are preserved during the transfer; use this when transferring directories or their contents) + +`-d`/`--delete` - deletes files in the destination directory that are not present in the source + +`-p`/`--progress` - displays file transfer progress + +`-v`/`--verbose` - verbose output + +`-z`/`--compress` - compresses data as it's being sent and uncompresses as it's received (heavier on your CPU, but easier on your network connection) + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/b7e7dd5-6.png", +null, +"" +], +"align": "center" +} +] +} +[/block] + +If you want to receive a file from your Pod, switch the source and destination arguments: + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/4867182-7.png", +null, +"" +], +"align": "center" +} +] +} +[/block] + +To transfer the contents of a directory (without transferring the directory itself), use a trailing slash in the file path: + +![](https://files.readme.io/ec221c3-image.png) + +![](https://files.readme.io/28a2134-image.png) + +Without a trailing slash, the directory itself is transferred: + +![](https://files.readme.io/ec31ef2-image.png) + +![](https://files.readme.io/effbe45-image.png) + +An advantage of rsync is that files that already exist at the destination aren't transferred again if you attempt to copy them twice (note the minimal data transfer after the second execution): + +![](https://files.readme.io/a032c86-image.png) diff --git a/v1.0/WELCOME/how-do-i-1/use-real-ssh.md b/v1.0/WELCOME/how-do-i-1/use-real-ssh.md new file mode 100644 index 0000000..a47accb --- /dev/null +++ b/v1.0/WELCOME/how-do-i-1/use-real-ssh.md @@ -0,0 +1,120 @@ +--- +title: "Use Real SSH" +slug: "use-real-ssh" +excerpt: "" +hidden: false +metadata: + image: [] + robots: "index" +createdAt: "Sun Apr 02 2023 17:03:14 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Wed Oct 11 2023 14:17:13 GMT+0000 (Coordinated Universal Time)" +--- + +The basic terminal SSH access that RunPod exposes is not a full SSH connection and, therefore, does not support commands like SCP. If you want to have full SSH capabilities, then you will need to rent an instance that has public IP support and run a full SSH daemon in your Pod. + +## Setup + +1. Generate your public/private SSH key pair on your local machine with `ssh-keygen -t ed25519 -C "your_email@example.com"`. This will save your public/private key pair to `~/.ssh/id_ed25519.pub` and `~/.ssh/id_ed25519`, respectively.\ + Note: if you're using command prompt in Windows rather than the Linux terminal or WSL, your public/private key pair will be saved to `C:\users\{yourUserAccount}\.ssh\id_ed25519.pub` and `C:\users\{yourUserAccount}\.ssh\id_ed25519`, respectively. + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/4655a01-1.png", +null, +"You can specify a different file in which to save your public/private key pair if you desire, but simply press enter when prompted to save to the default location. If you specify a different file, you'll need to modify the file path specified in our default command (circled in red later down the page) to reflect this change." +], +"align": "center", +"caption": "You can specify a different file in which to save your public/private key pair if you desire, but simply press enter when prompted to save to the default location. If you specify a different file, you'll need to modify the file path specified in our default command (circled in red later down the page) to reflect this change." +} +] +} +[/block] + +2. Add your public key to your [RunPod user settings](https://www.runpod.io/console/user/settings). + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/4972691-2.png", +null, +"" +], +"align": "center" +} +] +} +[/block] + +![](https://files.readme.io/c340553-image.png) + +3. Start your Pod. Make sure of the following things: + +- Your Pod supports a public IP, if you're deploying in Community Cloud. +- An SSH daemon is started. If you're using a RunPod official template such as RunPod Stable Diffusion, you don't need to take any additional steps. If you're using a custom template, make sure your template has TCP port 22 exposed and use the following Docker command. If you have an existing start command, replace `sleep infinity` at the end with your existing command: + + +```shell Bash +bash -c 'apt update;DEBIAN_FRONTEND=noninteractive apt-get install openssh-server -y;mkdir -p ~/.ssh;cd $_;chmod 700 ~/.ssh;echo "$PUBLIC_KEY" >> authorized_keys;chmod 700 authorized_keys;service ssh start;sleep infinity' +``` + + +![](https://files.readme.io/97823c6-image.png) + +Once your Pod is done initializing, you'll be able to SSH into it by running the SSH over exposed TCP command in the Pod's Connection Options menu on your local machine. + +Note: + +- if you're using the Windows Command Prompt rather than the Linux terminal or WSL, and you've used the default key location when generating your public/private key pair (i.e., you didn't specify a different file path when prompted), you'll need to modify the file path in the provided SSH command after the `-i` flag to `C:\users\{yourUserAccount}\.ssh\id_ed25519`. +- If you've saved your key to a location other than the default, specify that path you chose when generating your key pair after the `-i` flag instead. + +![](https://files.readme.io/3d51ed8-image.png) + +![](https://files.readme.io/ff71847-image.png) + +## What's the SSH password? + +If you're being prompted for a password when you attempt to connect, something is amiss. We don't require a password for SSH connections. Some common mistakes that cause your SSH client to prompt for a password include: + +- Copying and pasting the key _fingerprint_ (beginning with `SHA256:`) into your RunPod user settings instead of the public key itself (the contents of the `id_ed25519.pub` file when viewed from a text editor) +- Omitting the encryption type from the beginning of the key when copying and pasting into your RunPod user settings (i.e., copying the random text, but not the `ssh-ed25519` which precedes it) +- Not separating different public keys in your RunPod user settings with a newline between each one (this would result in the first public/private key pair functioning as expected, but each subsequent key pair would not work) +- Specifying an incorrect file path to your private key file: + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/10cbfa6-image.png", +null, +"In this instance, a Linux-style file path (`~./ssh/id_ed25519`) is being specified on a Windows machine, so the file path to the key is invalid." +], +"align": "center", +"caption": "In this instance, a Linux-style file path (`~./ssh/id_ed25519`) is being specified on a Windows machine, so the file path to the key is invalid." +} +] +} +[/block] + +- Attempting to use a private key that other users on the machine have permissions for: + +[block:image] +{ +"images": [ +{ +"image": [ +"https://files.readme.io/7a5cf85-image.png", +null, +"`ls -la` shows that all users have read access to the private key (`id_ed25519`) file, so it isn't used when attempting to create a new SSH connection; it's functionally identical to not specifying a private key file at all. Run `sudo chmod 700 ~/.ssh/id_ed25519` to give your private key the proper permissions." +], +"align": "center", +"caption": "`ls -la` shows that all users have read access to the private key (`id_ed25519`) file, so it isn't used when attempting to create a new SSH connection; it's functionally identical to not specifying a private key file at all. Run `sudo chmod 600 ~/.ssh/id_ed25519` on your local machine to give your private key the proper permissions." +} +] +} +[/block] diff --git a/v1.0/hosts/how-to-become-a-host.md b/v1.0/hosts/how-to-become-a-host.md new file mode 100644 index 0000000..0362464 --- /dev/null +++ b/v1.0/hosts/how-to-become-a-host.md @@ -0,0 +1,31 @@ +--- +title: "🤝 | GPU Partners" +slug: "how-to-become-a-host" +excerpt: "Offer your NVIDIA GPU compute on our platform!" +hidden: false +createdAt: "Sun Apr 02 2023 17:12:02 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Dec 15 2023 20:32:15 GMT+0000 (Coordinated Universal Time)" +--- + +**RunPod GPU Hosting Opportunity** + +RunPod offers our clients a diverse range of GPUs, made possible through our proprietary servers and collaboration with trusted community members. If you're interested in integrating your hardware into the RunPod ecosystem, follow the steps below. + +**How to Join as a Host:** + +1. **Check Eligibility:** Make sure you adhere to our [minimum requirements](https://docs.runpod.io/docs/partner-requirements). +2. **Connect with Us:** Currently, we onboard hosts through a manual vetting process. If you have high-quality machines that satisfy our hosting requirements, and at least 20 GPUs in total, please fill out [this form](https://share.hsforms.com/1GYpMeNlSQc6n11toAlgNngecykq). Then, contact us on discord [here](https://discord.gg/7nr9Jy9FYU). + +**Additional Hosting Information:** + +- **Service Fee:** RunPod charges a 24% service fee. This encompasses: + - Approximately 4% for Stripe payment fees. + - 2% for our referral program and 1% for our template program. ([Learn more](https://www.runpod.io/refer-a-friend)) + +- **Pricing:** While GPU on-demand prices are consistent, hosts can define a minimum bid price for spot rental. Even though we try as much as possible to maintain stable prices over time, we need to adjust to market trends. + +- **Safety & Trust:** We mandate KYC (Know Your Customer) verification for all hosts to safeguard our users and combat fraud. For larger providers, we require a Provider Agreement and a Service Level Agreement to be completed. + +- **Hosting Experience: **As one of our trusted providers, you have access to a fully customized dashboard to manage your resources that you can leverage to deploy hardware and plan your expansion. + +- **Rental Rates:** We do not make utilization data publicly available. However, we are more than happy to provide statistics and information about popular GPU models when directly discussing with you. Furthermore, lots of different variables can impact occupancy. We are more than happy to provide you with in-dept data about how different hardware quality levels can impact your revenue. diff --git a/v1.0/hosts/how-to-become-a-host/burn-testing.md b/v1.0/hosts/how-to-become-a-host/burn-testing.md new file mode 100644 index 0000000..a087f96 --- /dev/null +++ b/v1.0/hosts/how-to-become-a-host/burn-testing.md @@ -0,0 +1,26 @@ +--- +title: "🔥 | Burn Testing" +slug: "burn-testing" +excerpt: "" +hidden: false +createdAt: "Sun Apr 02 2023 17:16:22 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Mon Dec 18 2023 15:57:42 GMT+0000 (Coordinated Universal Time)" +--- + +Machines should be thoroughly tested before being listed on the RunPod platform. Here is a simple guide to running a burn test for a few days. + +Stop the RunPod agent by running + +`sudo systemctl stop runpod` + +Then you can kick off a gpu-burn run by typing + +`docker run --gpus all --rm jorghi21/gpu-burn-test 172800` + +You should also verify that your memory, CPU, and disk are up to the task. You can use the [ngstress library](https://wiki.ubuntu.com/Kernel/Reference/stress-ngstress) to accomplish this. + +When everything is verified okay, you can start the RunPod agent again by running + +`sudo systemctl start runpod` + +Then, on your [machine dashboard](https://www.runpod.io/console/host/machines), self rent your machine to ensure it is working well with most popular templates. diff --git a/v1.0/hosts/how-to-become-a-host/maintenance-and-reliability.md b/v1.0/hosts/how-to-become-a-host/maintenance-and-reliability.md new file mode 100644 index 0000000..b60f8ab --- /dev/null +++ b/v1.0/hosts/how-to-become-a-host/maintenance-and-reliability.md @@ -0,0 +1,34 @@ +--- +title: "🛠️ | Maintenance & Reliability" +slug: "maintenance-and-reliability" +excerpt: "" +hidden: false +createdAt: "Sun Apr 02 2023 17:13:25 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Dec 15 2023 21:54:54 GMT+0000 (Coordinated Universal Time)" +--- + +## Maintenance + +Hosts must currently schedule maintenance at least one week in advance and are able to program flash maintenance in the case their server is unrented. Users will get email reminders of upcoming maintenance that will occur on their active pods. Please contact RunPod on Discord or Slack if you are scheduling maintenance on more than a few machines so that we are aware of any major impacts to our customers. + +Here are some things to keep in mind. + +- Uptime/reliability will not be affected during scheduled maintenance. +- ALL other events that may impact customer workloads will result in a reliability score decrease. This includes unlisted machines. +- All machines that have maintenance scheduled will be automatically unlisted 4 days prior to the scheduled maintenance start time to minimize disruption for clients. +- Excessive maintenance will result in further penalties. +- You are allowed to bring down machines that have active users on them provided that you are in a maintenance window. + +## Reliability Calculations + +RunPod aims to partner with datacenters that offer **99.99%** uptime. Reliability is currently calculated as follows: + +( total minutes + small buffer ) / total minutes in interval + +This means that if you have 30 minutes of network downtime on the first of the month, your reliability will be calculated as: + +( 43200 - 30 + 10 ) / 43200 = 99.95% + +Based on approximately 43200 minutes per month and a 10 minute buffer. We include the buffer because we do incur small single-minute uptime dings once in a while due to agent upgrades and such. It will take an entire month to regenerate back to 100% uptime given no further downtimes in the month, considering it it calculated based on a 30 days rolling window. + +Machines with less than **98%** reliability are **automatically removed** from the available GPU pool and can only be accessed by clients that already had their data on it. diff --git a/v1.0/hosts/how-to-become-a-host/partner-requirements.md b/v1.0/hosts/how-to-become-a-host/partner-requirements.md new file mode 100644 index 0000000..890b982 --- /dev/null +++ b/v1.0/hosts/how-to-become-a-host/partner-requirements.md @@ -0,0 +1,47 @@ +--- +title: "✔️ | Requirements" +slug: "partner-requirements" +excerpt: "Minimal Eligibility Requirements" +hidden: false +createdAt: "Tue Aug 22 2023 00:17:24 GMT+0000 (Coordinated Universal Time)" +updatedAt: "Fri Dec 15 2023 20:43:22 GMT+0000 (Coordinated Universal Time)" +--- + +## Software Specifications + +- Ubuntu Server 22.04 LTS: + - Basic Linuix proficiency. + - Ability to remotely connect via SSH. + +## Minimal Secure Cloud Specifications + +- Latest NVIDIA GPUs, at least 30xx or RTX A4000 or higher. + - Option 1: At least 20 GPUs in total, each with a minimum of 12 GB VRAM. + - Option 2: At least 8 GPUs in total, each with a minimum of 80 GB of VRAM. + - PCIE 3.0 x16/PCIE 4.0 x8 per GPU or faster. PCIe 4.0 x16 recommended. + - Demand is highest for SXM 80GB, PCI 80GB, 4090 24GB and L40 or Ada A6000 48GB models. We also require 2 GPU per server at minimum for best rental rates. 8x configurations are the most popular. +- Minimum of 4 Physical CPU Cores Per GPU + 2 for system operations. Prioritize as fast as possible CPU core clock over more cores. For example, a 24 cores CPU clocking at 5.0 GHz is preferred to a 128 cores CPU clocking at 3.0 GHz for a 4 GPU configuration. +- Your RAM should at minimum equals your total vRAM of all GPUs + 12GB for system operations. + - 1 TB+ of RAM recommended for 8x 80GB vRAM GPU configurations. +- We want an absolute minimum of 1TB+ of NVME space per GPU for each server, ideally 2TB+ (excluding the OS drives). For larger GPU like 80GB, 4TB per GPU is recommended. + - At least 3,000 MB/s read/write speed is required. + - We recommend 2 smaller NVME disk in RAID 1 for the operating system (2x 500GB is fine). + - For data drives, it can be any number of those, but make sure the total is at least 1-2TB+ per GPU. If several data drives are provided, you need to create a LVM volume for those. +- 10gbps Bidirectional Internet Speed as backbone, and minimum of 1gbps symetrical per server. +- Static Public IP. + - A single IP can be shared between multiple servers. + - Access and ability to port forwarding. At least 30 ports forwarded per GPU per server. +- Abide by Tier III+ Datacenter Standards. + - Robust Uninterruptible Power Supply and backup generator. + - Internet Service Provider redundancy. + - 24/7 on-site security and technical staff. +- 400+ GPU Capacity. +- 40GB/s Interconnect between servers. +- Ability to deploy network storage cluster. +- Most **importantly**: the ability to **scale** GPU supply over time. + +--- + +### PCIe Risers + +If your system uses PCIe risers, they **must** have redriver functionality. diff --git a/vale/styles/Google/AMPM.yml b/vale/styles/Google/AMPM.yml new file mode 100644 index 0000000..fbdc6e4 --- /dev/null +++ b/vale/styles/Google/AMPM.yml @@ -0,0 +1,9 @@ +extends: existence +message: "Use 'AM' or 'PM' (preceded by a space)." +link: 'https://developers.google.com/style/word-list' +level: error +nonword: true +tokens: + - '\d{1,2}[AP]M' + - '\d{1,2} ?[ap]m' + - '\d{1,2} ?[aApP]\.[mM]\.' diff --git a/vale/styles/Google/Acronyms.yml b/vale/styles/Google/Acronyms.yml new file mode 100644 index 0000000..f41af01 --- /dev/null +++ b/vale/styles/Google/Acronyms.yml @@ -0,0 +1,64 @@ +extends: conditional +message: "Spell out '%s', if it's unfamiliar to the audience." +link: 'https://developers.google.com/style/abbreviations' +level: suggestion +ignorecase: false +# Ensures that the existence of 'first' implies the existence of 'second'. +first: '\b([A-Z]{3,5})\b' +second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)' +# ... with the exception of these: +exceptions: + - API + - ASP + - CLI + - CPU + - CSS + - CSV + - DEBUG + - DOM + - DPI + - FAQ + - GCC + - GDB + - GET + - GPU + - GTK + - GUI + - HTML + - HTTP + - HTTPS + - IDE + - JAR + - JSON + - JSX + - LESS + - LLDB + - NET + - NOTE + - NVDA + - OSS + - PATH + - PDF + - PHP + - POST + - RAM + - REPL + - RSA + - SCM + - SCSS + - SDK + - SQL + - SSH + - SSL + - SVG + - TBD + - TCP + - TODO + - URI + - URL + - USB + - UTF + - XML + - XSS + - YAML + - ZIP diff --git a/vale/styles/Google/Colons.yml b/vale/styles/Google/Colons.yml new file mode 100644 index 0000000..99363fb --- /dev/null +++ b/vale/styles/Google/Colons.yml @@ -0,0 +1,8 @@ +extends: existence +message: "'%s' should be in lowercase." +link: 'https://developers.google.com/style/colons' +nonword: true +level: warning +scope: sentence +tokens: + - ':\s[A-Z]' diff --git a/vale/styles/Google/Contractions.yml b/vale/styles/Google/Contractions.yml new file mode 100644 index 0000000..4f6fd5d --- /dev/null +++ b/vale/styles/Google/Contractions.yml @@ -0,0 +1,30 @@ +extends: substitution +message: "Use '%s' instead of '%s'." +link: 'https://developers.google.com/style/contractions' +level: suggestion +ignorecase: true +action: + name: replace +swap: + are not: aren't + cannot: can't + could not: couldn't + did not: didn't + do not: don't + does not: doesn't + has not: hasn't + have not: haven't + how is: how's + is not: isn't + it is: it's + should not: shouldn't + that is: that's + they are: they're + was not: wasn't + we are: we're + we have: we've + were not: weren't + what is: what's + when is: when's + where is: where's + will not: won't diff --git a/vale/styles/Google/DateFormat.yml b/vale/styles/Google/DateFormat.yml new file mode 100644 index 0000000..e9d227f --- /dev/null +++ b/vale/styles/Google/DateFormat.yml @@ -0,0 +1,9 @@ +extends: existence +message: "Use 'July 31, 2016' format, not '%s'." +link: 'https://developers.google.com/style/dates-times' +ignorecase: true +level: error +nonword: true +tokens: + - '\d{1,2}(?:\.|/)\d{1,2}(?:\.|/)\d{4}' + - '\d{1,2} (?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?) \d{4}' diff --git a/vale/styles/Google/Ellipses.yml b/vale/styles/Google/Ellipses.yml new file mode 100644 index 0000000..1e07051 --- /dev/null +++ b/vale/styles/Google/Ellipses.yml @@ -0,0 +1,9 @@ +extends: existence +message: "In general, don't use an ellipsis." +link: 'https://developers.google.com/style/ellipses' +nonword: true +level: warning +action: + name: remove +tokens: + - '\.\.\.' diff --git a/vale/styles/Google/EmDash.yml b/vale/styles/Google/EmDash.yml new file mode 100644 index 0000000..1befe72 --- /dev/null +++ b/vale/styles/Google/EmDash.yml @@ -0,0 +1,12 @@ +extends: existence +message: "Don't put a space before or after a dash." +link: 'https://developers.google.com/style/dashes' +nonword: true +level: error +action: + name: edit + params: + - remove + - ' ' +tokens: + - '\s[—–]\s' diff --git a/vale/styles/Google/EnDash.yml b/vale/styles/Google/EnDash.yml new file mode 100644 index 0000000..b314dc4 --- /dev/null +++ b/vale/styles/Google/EnDash.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Use an em dash ('—') instead of '–'." +link: 'https://developers.google.com/style/dashes' +nonword: true +level: error +action: + name: edit + params: + - replace + - '-' + - '—' +tokens: + - '–' diff --git a/vale/styles/Google/Exclamation.yml b/vale/styles/Google/Exclamation.yml new file mode 100644 index 0000000..eea5fd2 --- /dev/null +++ b/vale/styles/Google/Exclamation.yml @@ -0,0 +1,9 @@ +extends: existence +message: "Don't use exclamation points in text." +link: 'https://developers.google.com/style/exclamation-points' +nonword: true +level: error +action: + name: remove +tokens: + - '\w+!(?:\s|$)' diff --git a/vale/styles/Google/FirstPerson.yml b/vale/styles/Google/FirstPerson.yml new file mode 100644 index 0000000..0b7b882 --- /dev/null +++ b/vale/styles/Google/FirstPerson.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Avoid first-person pronouns such as '%s'." +link: 'https://developers.google.com/style/pronouns#personal-pronouns' +ignorecase: true +level: warning +nonword: true +tokens: + - (?:^|\s)I\s + - (?:^|\s)I,\s + - \bI'm\b + - \bme\b + - \bmy\b + - \bmine\b diff --git a/vale/styles/Google/Gender.yml b/vale/styles/Google/Gender.yml new file mode 100644 index 0000000..c848618 --- /dev/null +++ b/vale/styles/Google/Gender.yml @@ -0,0 +1,9 @@ +extends: existence +message: "Don't use '%s' as a gender-neutral pronoun." +link: 'https://developers.google.com/style/pronouns#gender-neutral-pronouns' +level: error +ignorecase: true +tokens: + - he/she + - s/he + - \(s\)he diff --git a/vale/styles/Google/GenderBias.yml b/vale/styles/Google/GenderBias.yml new file mode 100644 index 0000000..9e70190 --- /dev/null +++ b/vale/styles/Google/GenderBias.yml @@ -0,0 +1,47 @@ +extends: substitution +message: "Consider using '%s' instead of '%s'." +link: 'https://developers.google.com/style/inclusive-documentation' +ignorecase: true +level: error +action: + name: replace +swap: + (?:alumna|alumnus): graduate + (?:alumnae|alumni): graduates + air(?:m[ae]n|wom[ae]n): pilot(s) + anchor(?:m[ae]n|wom[ae]n): anchor(s) + authoress: author + camera(?:m[ae]n|wom[ae]n): camera operator(s) + chair(?:m[ae]n|wom[ae]n): chair(s) + congress(?:m[ae]n|wom[ae]n): member(s) of congress + door(?:m[ae]|wom[ae]n): concierge(s) + draft(?:m[ae]n|wom[ae]n): drafter(s) + fire(?:m[ae]n|wom[ae]n): firefighter(s) + fisher(?:m[ae]n|wom[ae]n): fisher(s) + fresh(?:m[ae]n|wom[ae]n): first-year student(s) + garbage(?:m[ae]n|wom[ae]n): waste collector(s) + lady lawyer: lawyer + ladylike: courteous + landlord: building manager + mail(?:m[ae]n|wom[ae]n): mail carriers + man and wife: husband and wife + man enough: strong enough + mankind: human kind + manmade: manufactured + manpower: personnel + men and girls: men and women + middle(?:m[ae]n|wom[ae]n): intermediary + news(?:m[ae]n|wom[ae]n): journalist(s) + ombuds(?:man|woman): ombuds + oneupmanship: upstaging + poetess: poet + police(?:m[ae]n|wom[ae]n): police officer(s) + repair(?:m[ae]n|wom[ae]n): technician(s) + sales(?:m[ae]n|wom[ae]n): salesperson or sales people + service(?:m[ae]n|wom[ae]n): soldier(s) + steward(?:ess)?: flight attendant + tribes(?:m[ae]n|wom[ae]n): tribe member(s) + waitress: waiter + woman doctor: doctor + woman scientist[s]?: scientist(s) + work(?:m[ae]n|wom[ae]n): worker(s) diff --git a/vale/styles/Google/HeadingPunctuation.yml b/vale/styles/Google/HeadingPunctuation.yml new file mode 100644 index 0000000..b538be5 --- /dev/null +++ b/vale/styles/Google/HeadingPunctuation.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Don't put a period at the end of a heading." +link: 'https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings' +nonword: true +level: warning +scope: heading +action: + name: edit + params: + - remove + - '.' +tokens: + - '[a-z0-9][.]\s*$' diff --git a/vale/styles/Google/Headings.yml b/vale/styles/Google/Headings.yml new file mode 100644 index 0000000..e34d001 --- /dev/null +++ b/vale/styles/Google/Headings.yml @@ -0,0 +1,28 @@ +extends: capitalization +message: "'%s' should use sentence-style capitalization." +link: "https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings" +level: warning +scope: heading +match: $sentence +indicators: + - ":" +exceptions: + - Azure + - CLI + - Cosmos + - Docker + - Emmet + - gRPC + - I + - Kubernetes + - Linux + - macOS + - Marketplace + - MongoDB + - REPL + - Studio + - TypeScript + - URLs + - Visual + - VS + - Windows diff --git a/vale/styles/Google/Latin.yml b/vale/styles/Google/Latin.yml new file mode 100644 index 0000000..ca03b91 --- /dev/null +++ b/vale/styles/Google/Latin.yml @@ -0,0 +1,11 @@ +extends: substitution +message: "Use '%s' instead of '%s'." +link: 'https://developers.google.com/style/abbreviations' +ignorecase: true +level: error +nonword: true +action: + name: replace +swap: + '\b(?:eg|e\.g\.)(?=[\s,;])': for example + '\b(?:ie|i\.e\.)(?=[\s,;])': that is diff --git a/vale/styles/Google/LyHyphens.yml b/vale/styles/Google/LyHyphens.yml new file mode 100644 index 0000000..ac8f557 --- /dev/null +++ b/vale/styles/Google/LyHyphens.yml @@ -0,0 +1,14 @@ +extends: existence +message: "'%s' doesn't need a hyphen." +link: 'https://developers.google.com/style/hyphens' +level: error +ignorecase: false +nonword: true +action: + name: edit + params: + - replace + - '-' + - ' ' +tokens: + - '\s[^\s-]+ly-' diff --git a/vale/styles/Google/OptionalPlurals.yml b/vale/styles/Google/OptionalPlurals.yml new file mode 100644 index 0000000..f858ea6 --- /dev/null +++ b/vale/styles/Google/OptionalPlurals.yml @@ -0,0 +1,12 @@ +extends: existence +message: "Don't use plurals in parentheses such as in '%s'." +link: 'https://developers.google.com/style/plurals-parentheses' +level: error +nonword: true +action: + name: edit + params: + - remove + - '(s)' +tokens: + - '\b\w+\(s\)' diff --git a/vale/styles/Google/Ordinal.yml b/vale/styles/Google/Ordinal.yml new file mode 100644 index 0000000..d1ac7d2 --- /dev/null +++ b/vale/styles/Google/Ordinal.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Spell out all ordinal numbers ('%s') in text." +link: 'https://developers.google.com/style/numbers' +level: error +nonword: true +tokens: + - \d+(?:st|nd|rd|th) diff --git a/vale/styles/Google/OxfordComma.yml b/vale/styles/Google/OxfordComma.yml new file mode 100644 index 0000000..b9ba21e --- /dev/null +++ b/vale/styles/Google/OxfordComma.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Use the Oxford comma in '%s'." +link: 'https://developers.google.com/style/commas' +scope: sentence +level: warning +tokens: + - '(?:[^,]+,){1,}\s\w+\s(?:and|or)' diff --git a/vale/styles/Google/Parens.yml b/vale/styles/Google/Parens.yml new file mode 100644 index 0000000..3b8711d --- /dev/null +++ b/vale/styles/Google/Parens.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Use parentheses judiciously." +link: 'https://developers.google.com/style/parentheses' +nonword: true +level: suggestion +tokens: + - '\(.+\)' diff --git a/vale/styles/Google/Passive.yml b/vale/styles/Google/Passive.yml new file mode 100644 index 0000000..3265890 --- /dev/null +++ b/vale/styles/Google/Passive.yml @@ -0,0 +1,184 @@ +extends: existence +link: 'https://developers.google.com/style/voice' +message: "In general, use active voice instead of passive voice ('%s')." +ignorecase: true +level: suggestion +raw: + - \b(am|are|were|being|is|been|was|be)\b\s* +tokens: + - '[\w]+ed' + - awoken + - beat + - become + - been + - begun + - bent + - beset + - bet + - bid + - bidden + - bitten + - bled + - blown + - born + - bought + - bound + - bred + - broadcast + - broken + - brought + - built + - burnt + - burst + - cast + - caught + - chosen + - clung + - come + - cost + - crept + - cut + - dealt + - dived + - done + - drawn + - dreamt + - driven + - drunk + - dug + - eaten + - fallen + - fed + - felt + - fit + - fled + - flown + - flung + - forbidden + - foregone + - forgiven + - forgotten + - forsaken + - fought + - found + - frozen + - given + - gone + - gotten + - ground + - grown + - heard + - held + - hidden + - hit + - hung + - hurt + - kept + - knelt + - knit + - known + - laid + - lain + - leapt + - learnt + - led + - left + - lent + - let + - lighted + - lost + - made + - meant + - met + - misspelt + - mistaken + - mown + - overcome + - overdone + - overtaken + - overthrown + - paid + - pled + - proven + - put + - quit + - read + - rid + - ridden + - risen + - run + - rung + - said + - sat + - sawn + - seen + - sent + - set + - sewn + - shaken + - shaven + - shed + - shod + - shone + - shorn + - shot + - shown + - shrunk + - shut + - slain + - slept + - slid + - slit + - slung + - smitten + - sold + - sought + - sown + - sped + - spent + - spilt + - spit + - split + - spoken + - spread + - sprung + - spun + - stolen + - stood + - stridden + - striven + - struck + - strung + - stuck + - stung + - stunk + - sung + - sunk + - swept + - swollen + - sworn + - swum + - swung + - taken + - taught + - thought + - thrived + - thrown + - thrust + - told + - torn + - trodden + - understood + - upheld + - upset + - wed + - wept + - withheld + - withstood + - woken + - won + - worn + - wound + - woven + - written + - wrung diff --git a/vale/styles/Google/Periods.yml b/vale/styles/Google/Periods.yml new file mode 100644 index 0000000..d24a6a6 --- /dev/null +++ b/vale/styles/Google/Periods.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Don't use periods with acronyms or initialisms such as '%s'." +link: 'https://developers.google.com/style/abbreviations' +level: error +nonword: true +tokens: + - '\b(?:[A-Z]\.){3,}' diff --git a/vale/styles/Google/Quotes.yml b/vale/styles/Google/Quotes.yml new file mode 100644 index 0000000..3cb6f1a --- /dev/null +++ b/vale/styles/Google/Quotes.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Commas and periods go inside quotation marks." +link: 'https://developers.google.com/style/quotation-marks' +level: error +nonword: true +tokens: + - '"[^"]+"[.,?]' diff --git a/vale/styles/Google/Ranges.yml b/vale/styles/Google/Ranges.yml new file mode 100644 index 0000000..3ec045e --- /dev/null +++ b/vale/styles/Google/Ranges.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Don't add words such as 'from' or 'between' to describe a range of numbers." +link: 'https://developers.google.com/style/hyphens' +nonword: true +level: warning +tokens: + - '(?:from|between)\s\d+\s?-\s?\d+' diff --git a/vale/styles/Google/Semicolons.yml b/vale/styles/Google/Semicolons.yml new file mode 100644 index 0000000..bb8b85b --- /dev/null +++ b/vale/styles/Google/Semicolons.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Use semicolons judiciously." +link: 'https://developers.google.com/style/semicolons' +nonword: true +scope: sentence +level: suggestion +tokens: + - ';' diff --git a/vale/styles/Google/Slang.yml b/vale/styles/Google/Slang.yml new file mode 100644 index 0000000..63f4c24 --- /dev/null +++ b/vale/styles/Google/Slang.yml @@ -0,0 +1,11 @@ +extends: existence +message: "Don't use internet slang abbreviations such as '%s'." +link: 'https://developers.google.com/style/abbreviations' +ignorecase: true +level: error +tokens: + - 'tl;dr' + - ymmv + - rtfm + - imo + - fwiw diff --git a/vale/styles/Google/Spacing.yml b/vale/styles/Google/Spacing.yml new file mode 100644 index 0000000..66e45a6 --- /dev/null +++ b/vale/styles/Google/Spacing.yml @@ -0,0 +1,10 @@ +extends: existence +message: "'%s' should have one space." +link: 'https://developers.google.com/style/sentence-spacing' +level: error +nonword: true +action: + name: remove +tokens: + - '[a-z][.?!] {2,}[A-Z]' + - '[a-z][.?!][A-Z]' diff --git a/vale/styles/Google/Spelling.yml b/vale/styles/Google/Spelling.yml new file mode 100644 index 0000000..527ac07 --- /dev/null +++ b/vale/styles/Google/Spelling.yml @@ -0,0 +1,10 @@ +extends: existence +message: "In general, use American spelling instead of '%s'." +link: 'https://developers.google.com/style/spelling' +ignorecase: true +level: warning +tokens: + - '(?:\w+)nised?' + - 'colour' + - 'labour' + - 'centre' diff --git a/vale/styles/Google/Units.yml b/vale/styles/Google/Units.yml new file mode 100644 index 0000000..53522ab --- /dev/null +++ b/vale/styles/Google/Units.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Put a nonbreaking space between the number and the unit in '%s'." +link: "https://developers.google.com/style/units-of-measure" +nonword: true +level: error +tokens: + - \b\d+(?:B|kB|MB|GB|TB) + - \b\d+(?:ns|ms|s|min|h|d) diff --git a/vale/styles/Google/We.yml b/vale/styles/Google/We.yml new file mode 100644 index 0000000..c7ac7d3 --- /dev/null +++ b/vale/styles/Google/We.yml @@ -0,0 +1,11 @@ +extends: existence +message: "Try to avoid using first-person plural like '%s'." +link: 'https://developers.google.com/style/pronouns#personal-pronouns' +level: warning +ignorecase: true +tokens: + - we + - we'(?:ve|re) + - ours? + - us + - let's diff --git a/vale/styles/Google/Will.yml b/vale/styles/Google/Will.yml new file mode 100644 index 0000000..128a918 --- /dev/null +++ b/vale/styles/Google/Will.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Avoid using '%s'." +link: 'https://developers.google.com/style/tense' +ignorecase: true +level: warning +tokens: + - will diff --git a/vale/styles/Google/WordList.yml b/vale/styles/Google/WordList.yml new file mode 100644 index 0000000..0d675f2 --- /dev/null +++ b/vale/styles/Google/WordList.yml @@ -0,0 +1,81 @@ +extends: substitution +message: "Use '%s' instead of '%s'." +link: "https://developers.google.com/style/word-list" +level: warning +ignorecase: false +action: + name: replace +swap: + "(?:API Console|dev|developer) key": API key + "(?:cell ?phone|smart ?phone)": phone|mobile phone + "(?:dev|developer|APIs) console": API console + "(?:e-mail|Email|E-mail)": email + "(?:file ?path|path ?name)": path + "(?:kill|terminate|abort)": stop|exit|cancel|end + "(?:OAuth ?2|Oauth)": OAuth 2.0 + "(?:ok|Okay)": OK|okay + "(?:WiFi|wifi)": Wi-Fi + '[\.]+apk': APK + '3\-D': 3D + 'Google (?:I\-O|IO)': Google I/O + "tap (?:&|and) hold": touch & hold + "un(?:check|select)": clear + above: preceding + account name: username + action bar: app bar + admin: administrator + Ajax: AJAX + a\.k\.a|aka: or|also known as + Android device: Android-powered device + android: Android + API explorer: APIs Explorer + application: app + approx\.: approximately + authN: authentication + authZ: authorization + autoupdate: automatically update + cellular data: mobile data + cellular network: mobile network + chapter: documents|pages|sections + check box: checkbox + check: select + CLI: command-line tool + click on: click|click in + Cloud: Google Cloud Platform|GCP + Container Engine: Kubernetes Engine + content type: media type + curated roles: predefined roles + data are: data is + Developers Console: Google API Console|API Console + disabled?: turn off|off + ephemeral IP address: ephemeral external IP address + fewer data: less data + file name: filename + firewalls: firewall rules + functionality: capability|feature + Google account: Google Account + Google accounts: Google Accounts + Googling: search with Google + grayed-out: unavailable + HTTPs: HTTPS + in order to: to + ingest: import|load + k8s: Kubernetes + long press: touch & hold + network IP address: internal IP address + omnibox: address bar + open-source: open source + overview screen: recents screen + regex: regular expression + SHA1: SHA-1|HAS-SHA1 + sign into: sign in to + sign-?on: single sign-on + static IP address: static external IP address + stylesheet: style sheet + synch: sync + tablename: table name + tablet: device + touch: tap + url: URL + vs\.: versus + World Wide Web: web diff --git a/vale/styles/Google/meta.json b/vale/styles/Google/meta.json new file mode 100644 index 0000000..a5da2a8 --- /dev/null +++ b/vale/styles/Google/meta.json @@ -0,0 +1,4 @@ +{ + "feed": "https://github.com/errata-ai/Google/releases.atom", + "vale_version": ">=1.0.0" +} diff --git a/vale/styles/Google/vocab.txt b/vale/styles/Google/vocab.txt new file mode 100644 index 0000000..e69de29 diff --git a/vale/styles/proselint/Airlinese.yml b/vale/styles/proselint/Airlinese.yml new file mode 100644 index 0000000..a6ae9c1 --- /dev/null +++ b/vale/styles/proselint/Airlinese.yml @@ -0,0 +1,8 @@ +extends: existence +message: "'%s' is airlinese." +ignorecase: true +level: error +tokens: + - enplan(?:e|ed|ing|ement) + - deplan(?:e|ed|ing|ement) + - taking off momentarily diff --git a/vale/styles/proselint/AnimalLabels.yml b/vale/styles/proselint/AnimalLabels.yml new file mode 100644 index 0000000..b92e06f --- /dev/null +++ b/vale/styles/proselint/AnimalLabels.yml @@ -0,0 +1,48 @@ +extends: substitution +message: "Consider using '%s' instead of '%s'." +level: error +action: + name: replace +swap: + (?:bull|ox)-like: taurine + (?:calf|veal)-like: vituline + (?:crow|raven)-like: corvine + (?:leopard|panther)-like: pardine + bird-like: avine + centipede-like: scolopendrine + crab-like: cancrine + crocodile-like: crocodiline + deer-like: damine + eagle-like: aquiline + earthworm-like: lumbricine + falcon-like: falconine + ferine: wild animal-like + fish-like: piscine + fox-like: vulpine + frog-like: ranine + goat-like: hircine + goose-like: anserine + gull-like: laridine + hare-like: leporine + hawk-like: accipitrine + hippopotamus-like: hippopotamine + lizard-like: lacertine + mongoose-like: viverrine + mouse-like: murine + ostrich-like: struthionine + peacock-like: pavonine + porcupine-like: hystricine + rattlesnake-like: crotaline + sable-like: zibeline + sheep-like: ovine + shrew-like: soricine + sparrow-like: passerine + swallow-like: hirundine + swine-like: suilline + tiger-like: tigrine + viper-like: viperine + vulture-like: vulturine + wasp-like: vespine + wolf-like: lupine + woodpecker-like: picine + zebra-like: zebrine diff --git a/vale/styles/proselint/Annotations.yml b/vale/styles/proselint/Annotations.yml new file mode 100644 index 0000000..dcb24f4 --- /dev/null +++ b/vale/styles/proselint/Annotations.yml @@ -0,0 +1,9 @@ +extends: existence +message: "'%s' left in text." +ignorecase: false +level: error +tokens: + - XXX + - FIXME + - TODO + - NOTE diff --git a/vale/styles/proselint/Apologizing.yml b/vale/styles/proselint/Apologizing.yml new file mode 100644 index 0000000..11088aa --- /dev/null +++ b/vale/styles/proselint/Apologizing.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Excessive apologizing: '%s'" +ignorecase: true +level: error +action: + name: remove +tokens: + - More research is needed diff --git a/vale/styles/proselint/Archaisms.yml b/vale/styles/proselint/Archaisms.yml new file mode 100644 index 0000000..c8df9ab --- /dev/null +++ b/vale/styles/proselint/Archaisms.yml @@ -0,0 +1,52 @@ +extends: existence +message: "'%s' is archaic." +ignorecase: true +level: error +tokens: + - alack + - anent + - begat + - belike + - betimes + - boughten + - brocage + - brokage + - camarade + - chiefer + - chiefest + - Christiana + - completely obsolescent + - cozen + - divers + - deflexion + - fain + - forsooth + - foreclose from + - haply + - howbeit + - illumine + - in sooth + - maugre + - meseems + - methinks + - nigh + - peradventure + - perchance + - saith + - shew + - sistren + - spake + - to wit + - verily + - whilom + - withal + - wot + - enclosed please find + - please find enclosed + - enclosed herewith + - enclosed herein + - inforce + - ex postfacto + - foreclose from + - forewent + - for ever diff --git a/vale/styles/proselint/But.yml b/vale/styles/proselint/But.yml new file mode 100644 index 0000000..0e2c32b --- /dev/null +++ b/vale/styles/proselint/But.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Do not start a paragraph with a 'but'." +level: error +scope: paragraph +action: + name: remove +tokens: + - ^But diff --git a/vale/styles/proselint/Cliches.yml b/vale/styles/proselint/Cliches.yml new file mode 100644 index 0000000..c56183c --- /dev/null +++ b/vale/styles/proselint/Cliches.yml @@ -0,0 +1,782 @@ +extends: existence +message: "'%s' is a cliche." +level: error +ignorecase: true +tokens: + - a chip off the old block + - a clean slate + - a dark and stormy night + - a far cry + - a fate worse than death + - a fine kettle of fish + - a loose cannon + - a penny saved is a penny earned + - a tough row to hoe + - a word to the wise + - ace in the hole + - acid test + - add insult to injury + - against all odds + - air your dirty laundry + - alas and alack + - all fun and games + - all hell broke loose + - all in a day's work + - all talk, no action + - all thumbs + - all your eggs in one basket + - all's fair in love and war + - all's well that ends well + - almighty dollar + - American as apple pie + - an axe to grind + - another day, another dollar + - armed to the teeth + - as luck would have it + - as old as time + - as the crow flies + - at loose ends + - at my wits end + - at the end of the day + - avoid like the plague + - babe in the woods + - back against the wall + - back in the saddle + - back to square one + - back to the drawing board + - bad to the bone + - badge of honor + - bald faced liar + - bald-faced lie + - ballpark figure + - banging your head against a brick wall + - baptism by fire + - barking up the wrong tree + - bat out of hell + - be all and end all + - beat a dead horse + - beat around the bush + - been there, done that + - beggars can't be choosers + - behind the eight ball + - bend over backwards + - benefit of the doubt + - bent out of shape + - best thing since sliced bread + - bet your bottom dollar + - better half + - better late than never + - better mousetrap + - better safe than sorry + - between a rock and a hard place + - between a rock and a hard place + - between Scylla and Charybdis + - between the devil and the deep blue see + - betwixt and between + - beyond the pale + - bide your time + - big as life + - big cheese + - big fish in a small pond + - big man on campus + - bigger they are the harder they fall + - bird in the hand + - bird's eye view + - birds and the bees + - birds of a feather flock together + - bit the hand that feeds you + - bite the bullet + - bite the dust + - bitten off more than he can chew + - black as coal + - black as pitch + - black as the ace of spades + - blast from the past + - bleeding heart + - blessing in disguise + - blind ambition + - blind as a bat + - blind leading the blind + - blissful ignorance + - blood is thicker than water + - blood sweat and tears + - blow a fuse + - blow off steam + - blow your own horn + - blushing bride + - boils down to + - bolt from the blue + - bone to pick + - bored stiff + - bored to tears + - bottomless pit + - boys will be boys + - bright and early + - brings home the bacon + - broad across the beam + - broken record + - brought back to reality + - bulk large + - bull by the horns + - bull in a china shop + - burn the midnight oil + - burning question + - burning the candle at both ends + - burst your bubble + - bury the hatchet + - busy as a bee + - but that's another story + - by hook or by crook + - call a spade a spade + - called onto the carpet + - calm before the storm + - can of worms + - can't cut the mustard + - can't hold a candle to + - case of mistaken identity + - cast aspersions + - cat got your tongue + - cat's meow + - caught in the crossfire + - caught red-handed + - chase a red herring + - checkered past + - chomping at the bit + - cleanliness is next to godliness + - clear as a bell + - clear as mud + - close to the vest + - cock and bull story + - cold shoulder + - come hell or high water + - comparing apples and oranges + - compleat + - conspicuous by its absence + - cool as a cucumber + - cool, calm, and collected + - cost a king's ransom + - count your blessings + - crack of dawn + - crash course + - creature comforts + - cross that bridge when you come to it + - crushing blow + - cry like a baby + - cry me a river + - cry over spilt milk + - crystal clear + - crystal clear + - curiosity killed the cat + - cut and dried + - cut through the red tape + - cut to the chase + - cute as a bugs ear + - cute as a button + - cute as a puppy + - cuts to the quick + - cutting edge + - dark before the dawn + - day in, day out + - dead as a doornail + - decision-making process + - devil is in the details + - dime a dozen + - divide and conquer + - dog and pony show + - dog days + - dog eat dog + - dog tired + - don't burn your bridges + - don't count your chickens + - don't look a gift horse in the mouth + - don't rock the boat + - don't step on anyone's toes + - don't take any wooden nickels + - down and out + - down at the heels + - down in the dumps + - down the hatch + - down to earth + - draw the line + - dressed to kill + - dressed to the nines + - drives me up the wall + - dubious distinction + - dull as dishwater + - duly authorized + - dyed in the wool + - eagle eye + - ear to the ground + - early bird catches the worm + - easier said than done + - easy as pie + - eat your heart out + - eat your words + - eleventh hour + - even the playing field + - every dog has its day + - every fiber of my being + - everything but the kitchen sink + - eye for an eye + - eyes peeled + - face the music + - facts of life + - fair weather friend + - fall by the wayside + - fan the flames + - far be it from me + - fast and loose + - feast or famine + - feather your nest + - feathered friends + - few and far between + - fifteen minutes of fame + - fills the bill + - filthy vermin + - fine kettle of fish + - first and foremost + - fish out of water + - fishing for a compliment + - fit as a fiddle + - fit the bill + - fit to be tied + - flash in the pan + - flat as a pancake + - flip your lid + - flog a dead horse + - fly by night + - fly the coop + - follow your heart + - for all intents and purposes + - for free + - for the birds + - for what it's worth + - force of nature + - force to be reckoned with + - forgive and forget + - fox in the henhouse + - free and easy + - free as a bird + - fresh as a daisy + - full steam ahead + - fun in the sun + - garbage in, garbage out + - gentle as a lamb + - get a kick out of + - get a leg up + - get down and dirty + - get the lead out + - get to the bottom of + - get with the program + - get your feet wet + - gets my goat + - gilding the lily + - gilding the lily + - give and take + - go against the grain + - go at it tooth and nail + - go for broke + - go him one better + - go the extra mile + - go with the flow + - goes without saying + - good as gold + - good deed for the day + - good things come to those who wait + - good time was had by all + - good times were had by all + - greased lightning + - greek to me + - green thumb + - green-eyed monster + - grist for the mill + - growing like a weed + - hair of the dog + - hand to mouth + - happy as a clam + - happy as a lark + - hasn't a clue + - have a nice day + - have a short fuse + - have high hopes + - have the last laugh + - haven't got a row to hoe + - he's got his hands full + - head honcho + - head over heels + - hear a pin drop + - heard it through the grapevine + - heart's content + - heavy as lead + - hem and haw + - high and dry + - high and mighty + - high as a kite + - his own worst enemy + - his work cut out for him + - hit paydirt + - hither and yon + - Hobson's choice + - hold your head up high + - hold your horses + - hold your own + - hold your tongue + - honest as the day is long + - horns of a dilemma + - horns of a dilemma + - horse of a different color + - hot under the collar + - hour of need + - I beg to differ + - icing on the cake + - if the shoe fits + - if the shoe were on the other foot + - if you catch my drift + - in a jam + - in a jiffy + - in a nutshell + - in a pig's eye + - in a pinch + - in a word + - in hot water + - in light of + - in the final analysis + - in the gutter + - in the last analysis + - in the nick of time + - in the thick of it + - in your dreams + - innocent bystander + - it ain't over till the fat lady sings + - it goes without saying + - it takes all kinds + - it takes one to know one + - it's a small world + - it's not what you know, it's who you know + - it's only a matter of time + - ivory tower + - Jack of all trades + - jockey for position + - jog your memory + - joined at the hip + - judge a book by its cover + - jump down your throat + - jump in with both feet + - jump on the bandwagon + - jump the gun + - jump to conclusions + - just a hop, skip, and a jump + - just the ticket + - justice is blind + - keep a stiff upper lip + - keep an eye on + - keep it simple, stupid + - keep the home fires burning + - keep up with the Joneses + - keep your chin up + - keep your fingers crossed + - kick the bucket + - kick up your heels + - kick your feet up + - kid in a candy store + - kill two birds with one stone + - kiss of death + - knock it out of the park + - knock on wood + - knock your socks off + - know him from Adam + - know the ropes + - know the score + - knuckle down + - knuckle sandwich + - knuckle under + - labor of love + - ladder of success + - land on your feet + - lap of luxury + - last but not least + - last but not least + - last hurrah + - last-ditch effort + - law of the jungle + - law of the land + - lay down the law + - leaps and bounds + - let sleeping dogs lie + - let the cat out of the bag + - let the good times roll + - let your hair down + - let's talk turkey + - letter perfect + - lick your wounds + - lies like a rug + - life's a bitch + - life's a grind + - light at the end of the tunnel + - lighter than a feather + - lighter than air + - like clockwork + - like father like son + - like taking candy from a baby + - like there's no tomorrow + - lion's share + - live and learn + - live and let live + - long and short of it + - long lost love + - look before you leap + - look down your nose + - look what the cat dragged in + - looking a gift horse in the mouth + - looks like death warmed over + - loose cannon + - lose your head + - lose your temper + - loud as a horn + - lounge lizard + - loved and lost + - low man on the totem pole + - luck of the draw + - luck of the Irish + - make a mockery of + - make hay while the sun shines + - make money hand over fist + - make my day + - make the best of a bad situation + - make the best of it + - make your blood boil + - male chauvinism + - man of few words + - man's best friend + - mark my words + - meaningful dialogue + - missed the boat on that one + - moment in the sun + - moment of glory + - moment of truth + - moment of truth + - money to burn + - more in sorrow than in anger + - more power to you + - more sinned against than sinning + - more than one way to skin a cat + - movers and shakers + - moving experience + - my better half + - naked as a jaybird + - naked truth + - neat as a pin + - needle in a haystack + - needless to say + - neither here nor there + - never look back + - never say never + - nip and tuck + - nip in the bud + - nip it in the bud + - no guts, no glory + - no love lost + - no pain, no gain + - no skin off my back + - no stone unturned + - no time like the present + - no use crying over spilled milk + - nose to the grindstone + - not a hope in hell + - not a minute's peace + - not in my backyard + - not playing with a full deck + - not the end of the world + - not written in stone + - nothing to sneeze at + - nothing ventured nothing gained + - now we're cooking + - off the top of my head + - off the wagon + - off the wall + - old hat + - olden days + - older and wiser + - older than dirt + - older than Methuselah + - on a roll + - on cloud nine + - on pins and needles + - on the bandwagon + - on the money + - on the nose + - on the rocks + - on the same page + - on the spot + - on the tip of my tongue + - on the wagon + - on thin ice + - once bitten, twice shy + - one bad apple doesn't spoil the bushel + - one born every minute + - one brick short + - one foot in the grave + - one in a million + - one red cent + - only game in town + - open a can of worms + - open and shut case + - open the flood gates + - opportunity doesn't knock twice + - out of pocket + - out of sight, out of mind + - out of the frying pan into the fire + - out of the woods + - out on a limb + - over a barrel + - over the hump + - pain and suffering + - pain in the + - panic button + - par for the course + - part and parcel + - party pooper + - pass the buck + - patience is a virtue + - pay through the nose + - penny pincher + - perfect storm + - pig in a poke + - pile it on + - pillar of the community + - pin your hopes on + - pitter patter of little feet + - plain as day + - plain as the nose on your face + - play by the rules + - play your cards right + - playing the field + - playing with fire + - pleased as punch + - plenty of fish in the sea + - point with pride + - poor as a church mouse + - pot calling the kettle black + - presidential timber + - pretty as a picture + - pull a fast one + - pull your punches + - pulled no punches + - pulling your leg + - pure as the driven snow + - put it in a nutshell + - put one over on you + - put the cart before the horse + - put the pedal to the metal + - put your best foot forward + - put your foot down + - quantum jump + - quantum leap + - quick as a bunny + - quick as a lick + - quick as a wink + - quick as lightning + - quiet as a dormouse + - rags to riches + - raining buckets + - raining cats and dogs + - rank and file + - rat race + - reap what you sow + - red as a beet + - red herring + - redound to one's credit + - redound to the benefit of + - reinvent the wheel + - rich and famous + - rings a bell + - ripe old age + - ripped me off + - rise and shine + - road to hell is paved with good intentions + - rob Peter to pay Paul + - roll over in the grave + - rub the wrong way + - ruled the roost + - running in circles + - sad but true + - sadder but wiser + - salt of the earth + - scared stiff + - scared to death + - sea change + - sealed with a kiss + - second to none + - see eye to eye + - seen the light + - seize the day + - set the record straight + - set the world on fire + - set your teeth on edge + - sharp as a tack + - shirked his duties + - shoot for the moon + - shoot the breeze + - shot in the dark + - shoulder to the wheel + - sick as a dog + - sigh of relief + - signed, sealed, and delivered + - sink or swim + - six of one, half a dozen of another + - six of one, half a dozen of the other + - skating on thin ice + - slept like a log + - slinging mud + - slippery as an eel + - slow as molasses + - smart as a whip + - smooth as a baby's bottom + - sneaking suspicion + - snug as a bug in a rug + - sow wild oats + - spare the rod, spoil the child + - speak of the devil + - spilled the beans + - spinning your wheels + - spitting image of + - spoke with relish + - spread like wildfire + - spring to life + - squeaky wheel gets the grease + - stands out like a sore thumb + - start from scratch + - stick in the mud + - still waters run deep + - stitch in time + - stop and smell the roses + - straight as an arrow + - straw that broke the camel's back + - stretched to the breaking point + - strong as an ox + - stubborn as a mule + - stuff that dreams are made of + - stuffed shirt + - sweating blood + - sweating bullets + - take a load off + - take one for the team + - take the bait + - take the bull by the horns + - take the plunge + - takes one to know one + - takes two to tango + - than you can shake a stick at + - the cream of the crop + - the cream rises to the top + - the more the merrier + - the real deal + - the real McCoy + - the red carpet treatment + - the same old story + - the straw that broke the camel's back + - there is no accounting for taste + - thick as a brick + - thick as thieves + - thick as thieves + - thin as a rail + - think outside of the box + - thinking outside the box + - third time's the charm + - this day and age + - this hurts me worse than it hurts you + - this point in time + - thought leaders? + - three sheets to the wind + - through thick and thin + - throw in the towel + - throw the baby out with the bathwater + - tie one on + - tighter than a drum + - time and time again + - time is of the essence + - tip of the iceberg + - tired but happy + - to coin a phrase + - to each his own + - to make a long story short + - to the best of my knowledge + - toe the line + - tongue in cheek + - too good to be true + - too hot to handle + - too numerous to mention + - touch with a ten foot pole + - tough as nails + - trial and error + - trials and tribulations + - tried and true + - trip down memory lane + - twist of fate + - two cents worth + - two peas in a pod + - ugly as sin + - under the counter + - under the gun + - under the same roof + - under the weather + - until the cows come home + - unvarnished truth + - up the creek + - uphill battle + - upper crust + - upset the applecart + - vain attempt + - vain effort + - vanquish the enemy + - various and sundry + - vested interest + - viable alternative + - waiting for the other shoe to drop + - wakeup call + - warm welcome + - watch your p's and q's + - watch your tongue + - watching the clock + - water under the bridge + - wax eloquent + - wax poetic + - we've got a situation here + - weather the storm + - weed them out + - week of Sundays + - went belly up + - wet behind the ears + - what goes around comes around + - what you see is what you get + - when it rains, it pours + - when push comes to shove + - when the cat's away + - when the going gets tough, the tough get going + - whet (?:the|your) appetite + - white as a sheet + - whole ball of wax + - whole hog + - whole nine yards + - wild goose chase + - will wonders never cease? + - wisdom of the ages + - wise as an owl + - wolf at the door + - wool pulled over our eyes + - words fail me + - work like a dog + - world weary + - worst nightmare + - worth its weight in gold + - writ large + - wrong side of the bed + - yanking your chain + - yappy as a dog + - years young + - you are what you eat + - you can run but you can't hide + - you only live once + - you're the boss + - young and foolish + - young and vibrant diff --git a/vale/styles/proselint/CorporateSpeak.yml b/vale/styles/proselint/CorporateSpeak.yml new file mode 100644 index 0000000..4de8ee3 --- /dev/null +++ b/vale/styles/proselint/CorporateSpeak.yml @@ -0,0 +1,30 @@ +extends: existence +message: "'%s' is corporate speak." +ignorecase: true +level: error +tokens: + - at the end of the day + - back to the drawing board + - hit the ground running + - get the ball rolling + - low-hanging fruit + - thrown under the bus + - think outside the box + - let's touch base + - get my manager's blessing + - it's on my radar + - ping me + - i don't have the bandwidth + - no brainer + - par for the course + - bang for your buck + - synergy + - move the goal post + - apples to apples + - win-win + - circle back around + - all hands on deck + - take this offline + - drill-down + - elephant in the room + - on my plate diff --git a/vale/styles/proselint/Currency.yml b/vale/styles/proselint/Currency.yml new file mode 100644 index 0000000..ebd4b7d --- /dev/null +++ b/vale/styles/proselint/Currency.yml @@ -0,0 +1,5 @@ +extends: existence +message: "Incorrect use of symbols in '%s'." +ignorecase: true +raw: + - \$[\d]* ?(?:dollars|usd|us dollars) diff --git a/vale/styles/proselint/Cursing.yml b/vale/styles/proselint/Cursing.yml new file mode 100644 index 0000000..e65070a --- /dev/null +++ b/vale/styles/proselint/Cursing.yml @@ -0,0 +1,15 @@ +extends: existence +message: "Consider replacing '%s'." +level: error +ignorecase: true +tokens: + - shit + - piss + - fuck + - cunt + - cocksucker + - motherfucker + - tits + - fart + - turd + - twat diff --git a/vale/styles/proselint/DateCase.yml b/vale/styles/proselint/DateCase.yml new file mode 100644 index 0000000..9aa1bd9 --- /dev/null +++ b/vale/styles/proselint/DateCase.yml @@ -0,0 +1,7 @@ +extends: existence +message: With lowercase letters, the periods are standard. +ignorecase: false +level: error +nonword: true +tokens: + - '\d{1,2} ?[ap]m\b' diff --git a/vale/styles/proselint/DateMidnight.yml b/vale/styles/proselint/DateMidnight.yml new file mode 100644 index 0000000..0130e1a --- /dev/null +++ b/vale/styles/proselint/DateMidnight.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Use 'midnight' or 'noon'." +ignorecase: true +level: error +nonword: true +tokens: + - '12 ?[ap]\.?m\.?' diff --git a/vale/styles/proselint/DateRedundancy.yml b/vale/styles/proselint/DateRedundancy.yml new file mode 100644 index 0000000..b1f653e --- /dev/null +++ b/vale/styles/proselint/DateRedundancy.yml @@ -0,0 +1,10 @@ +extends: existence +message: "'a.m.' is always morning; 'p.m.' is always night." +ignorecase: true +level: error +nonword: true +tokens: + - '\d{1,2} ?a\.?m\.? in the morning' + - '\d{1,2} ?p\.?m\.? in the evening' + - '\d{1,2} ?p\.?m\.? at night' + - '\d{1,2} ?p\.?m\.? in the afternoon' diff --git a/vale/styles/proselint/DateSpacing.yml b/vale/styles/proselint/DateSpacing.yml new file mode 100644 index 0000000..b7a2fd3 --- /dev/null +++ b/vale/styles/proselint/DateSpacing.yml @@ -0,0 +1,7 @@ +extends: existence +message: "It's standard to put a space before '%s'" +ignorecase: true +level: error +nonword: true +tokens: + - '\d{1,2}[ap]\.?m\.?' diff --git a/vale/styles/proselint/DenizenLabels.yml b/vale/styles/proselint/DenizenLabels.yml new file mode 100644 index 0000000..bc3dd8a --- /dev/null +++ b/vale/styles/proselint/DenizenLabels.yml @@ -0,0 +1,52 @@ +extends: substitution +message: Did you mean '%s'? +ignorecase: false +action: + name: replace +swap: + (?:Afrikaaner|Afrikander): Afrikaner + (?:Hong Kongite|Hong Kongian): Hong Konger + (?:Indianan|Indianian): Hoosier + (?:Michiganite|Michiganian): Michigander + (?:New Hampshireite|New Hampshireman): New Hampshirite + (?:Newcastlite|Newcastleite): Novocastrian + (?:Providencian|Providencer): Providentian + (?:Trentian|Trentonian): Tridentine + (?:Warsawer|Warsawian): Varsovian + (?:Wolverhamptonite|Wolverhamptonian): Wulfrunian + Alabaman: Alabamian + Albuquerquian: Albuquerquean + Anchoragite: Anchorageite + Arizonian: Arizonan + Arkansawyer: Arkansan + Belarusan: Belarusian + Cayman Islander: Caymanian + Coloradoan: Coloradan + Connecticuter: Nutmegger + Fairbanksian: Fairbanksan + Fort Worther: Fort Worthian + Grenadian: Grenadan + Halifaxer: Haligonian + Hartlepoolian: Hartlepudlian + Illinoisian: Illinoisan + Iowegian: Iowan + Leedsian: Leodenisian + Liverpoolian: Liverpudlian + Los Angelean: Angeleno + Manchesterian: Mancunian + Minneapolisian: Minneapolitan + Missouran: Missourian + Monacan: Monegasque + Neopolitan: Neapolitan + New Jerseyite: New Jerseyan + New Orleansian: New Orleanian + Oklahoma Citian: Oklahoma Cityan + Oklahomian: Oklahoman + Saudi Arabian: Saudi + Seattlite: Seattleite + Surinamer: Surinamese + Tallahassean: Tallahasseean + Tennesseean: Tennessean + Trois-Rivièrester: Trifluvian + Utahan: Utahn + Valladolidian: Vallisoletano diff --git a/vale/styles/proselint/Diacritical.yml b/vale/styles/proselint/Diacritical.yml new file mode 100644 index 0000000..2416cf2 --- /dev/null +++ b/vale/styles/proselint/Diacritical.yml @@ -0,0 +1,95 @@ +extends: substitution +message: Consider using '%s' instead of '%s'. +ignorecase: true +level: error +action: + name: replace +swap: + beau ideal: beau idéal + boutonniere: boutonnière + bric-a-brac: bric-à-brac + cafe: café + cause celebre: cause célèbre + chevre: chèvre + cliche: cliché + consomme: consommé + coup de grace: coup de grâce + crudites: crudités + creme brulee: crème brûlée + creme de menthe: crème de menthe + creme fraice: crème fraîche + creme fresh: crème fraîche + crepe: crêpe + debutante: débutante + decor: décor + deja vu: déjà vu + denouement: dénouement + facade: façade + fiance: fiancé + fiancee: fiancée + flambe: flambé + garcon: garçon + lycee: lycée + maitre d: maître d + menage a trois: ménage à trois + negligee: négligée + protege: protégé + protegee: protégée + puree: purée + my resume: my résumé + your resume: your résumé + his resume: his résumé + her resume: her résumé + a resume: a résumé + the resume: the résumé + risque: risqué + roue: roué + soiree: soirée + souffle: soufflé + soupcon: soupçon + touche: touché + tete-a-tete: tête-à-tête + voila: voilà + a la carte: à la carte + a la mode: à la mode + emigre: émigré + + # Spanish loanwords + El Nino: El Niño + jalapeno: jalapeño + La Nina: La Niña + pina colada: piña colada + senor: señor + senora: señora + senorita: señorita + + # Portuguese loanwords + acai: açaí + + # German loanwords + doppelganger: doppelgänger + Fuhrer: Führer + Gewurztraminer: Gewürztraminer + vis-a-vis: vis-à-vis + Ubermensch: Übermensch + + # Swedish loanwords + filmjolk: filmjölk + smorgasbord: smörgåsbord + + # Names, places, and companies + Beyonce: Beyoncé + Bronte: Brontë + Champs-Elysees: Champs-Élysées + Citroen: Citroën + Curacao: Curaçao + Lowenbrau: Löwenbräu + Monegasque: Monégasque + Motley Crue: Mötley Crüe + Nescafe: Nescafé + Queensryche: Queensrÿche + Quebec: Québec + Quebecois: Québécois + Angstrom: Ångström + angstrom: ångström + Skoda: Škoda diff --git a/vale/styles/proselint/GenderBias.yml b/vale/styles/proselint/GenderBias.yml new file mode 100644 index 0000000..d98d3cf --- /dev/null +++ b/vale/styles/proselint/GenderBias.yml @@ -0,0 +1,45 @@ +extends: substitution +message: Consider using '%s' instead of '%s'. +ignorecase: true +level: error +action: + name: replace +swap: + (?:alumnae|alumni): graduates + (?:alumna|alumnus): graduate + air(?:m[ae]n|wom[ae]n): pilot(s) + anchor(?:m[ae]n|wom[ae]n): anchor(s) + authoress: author + camera(?:m[ae]n|wom[ae]n): camera operator(s) + chair(?:m[ae]n|wom[ae]n): chair(s) + congress(?:m[ae]n|wom[ae]n): member(s) of congress + door(?:m[ae]|wom[ae]n): concierge(s) + draft(?:m[ae]n|wom[ae]n): drafter(s) + fire(?:m[ae]n|wom[ae]n): firefighter(s) + fisher(?:m[ae]n|wom[ae]n): fisher(s) + fresh(?:m[ae]n|wom[ae]n): first-year student(s) + garbage(?:m[ae]n|wom[ae]n): waste collector(s) + lady lawyer: lawyer + ladylike: courteous + landlord: building manager + mail(?:m[ae]n|wom[ae]n): mail carriers + man and wife: husband and wife + man enough: strong enough + mankind: human kind + manmade: manufactured + men and girls: men and women + middle(?:m[ae]n|wom[ae]n): intermediary + news(?:m[ae]n|wom[ae]n): journalist(s) + ombuds(?:man|woman): ombuds + oneupmanship: upstaging + poetess: poet + police(?:m[ae]n|wom[ae]n): police officer(s) + repair(?:m[ae]n|wom[ae]n): technician(s) + sales(?:m[ae]n|wom[ae]n): salesperson or sales people + service(?:m[ae]n|wom[ae]n): soldier(s) + steward(?:ess)?: flight attendant + tribes(?:m[ae]n|wom[ae]n): tribe member(s) + waitress: waiter + woman doctor: doctor + woman scientist[s]?: scientist(s) + work(?:m[ae]n|wom[ae]n): worker(s) diff --git a/vale/styles/proselint/GroupTerms.yml b/vale/styles/proselint/GroupTerms.yml new file mode 100644 index 0000000..7a59fa4 --- /dev/null +++ b/vale/styles/proselint/GroupTerms.yml @@ -0,0 +1,39 @@ +extends: substitution +message: Consider using '%s' instead of '%s'. +ignorecase: true +action: + name: replace +swap: + (?:bunch|group|pack|flock) of chickens: brood of chickens + (?:bunch|group|pack|flock) of crows: murder of crows + (?:bunch|group|pack|flock) of hawks: cast of hawks + (?:bunch|group|pack|flock) of parrots: pandemonium of parrots + (?:bunch|group|pack|flock) of peacocks: muster of peacocks + (?:bunch|group|pack|flock) of penguins: muster of penguins + (?:bunch|group|pack|flock) of sparrows: host of sparrows + (?:bunch|group|pack|flock) of turkeys: rafter of turkeys + (?:bunch|group|pack|flock) of woodpeckers: descent of woodpeckers + (?:bunch|group|pack|herd) of apes: shrewdness of apes + (?:bunch|group|pack|herd) of baboons: troop of baboons + (?:bunch|group|pack|herd) of badgers: cete of badgers + (?:bunch|group|pack|herd) of bears: sloth of bears + (?:bunch|group|pack|herd) of bullfinches: bellowing of bullfinches + (?:bunch|group|pack|herd) of bullocks: drove of bullocks + (?:bunch|group|pack|herd) of caterpillars: army of caterpillars + (?:bunch|group|pack|herd) of cats: clowder of cats + (?:bunch|group|pack|herd) of colts: rag of colts + (?:bunch|group|pack|herd) of crocodiles: bask of crocodiles + (?:bunch|group|pack|herd) of dolphins: school of dolphins + (?:bunch|group|pack|herd) of foxes: skulk of foxes + (?:bunch|group|pack|herd) of gorillas: band of gorillas + (?:bunch|group|pack|herd) of hippopotami: bloat of hippopotami + (?:bunch|group|pack|herd) of horses: drove of horses + (?:bunch|group|pack|herd) of jellyfish: fluther of jellyfish + (?:bunch|group|pack|herd) of kangeroos: mob of kangeroos + (?:bunch|group|pack|herd) of monkeys: troop of monkeys + (?:bunch|group|pack|herd) of oxen: yoke of oxen + (?:bunch|group|pack|herd) of rhinoceros: crash of rhinoceros + (?:bunch|group|pack|herd) of wild boar: sounder of wild boar + (?:bunch|group|pack|herd) of wild pigs: drift of wild pigs + (?:bunch|group|pack|herd) of zebras: zeal of wild pigs + (?:bunch|group|pack|school) of trout: hover of trout diff --git a/vale/styles/proselint/Hedging.yml b/vale/styles/proselint/Hedging.yml new file mode 100644 index 0000000..a8615f8 --- /dev/null +++ b/vale/styles/proselint/Hedging.yml @@ -0,0 +1,8 @@ +extends: existence +message: "'%s' is hedging." +ignorecase: true +level: error +tokens: + - I would argue that + - ', so to speak' + - to a certain degree diff --git a/vale/styles/proselint/Hyperbole.yml b/vale/styles/proselint/Hyperbole.yml new file mode 100644 index 0000000..0361772 --- /dev/null +++ b/vale/styles/proselint/Hyperbole.yml @@ -0,0 +1,6 @@ +extends: existence +message: "'%s' is hyperbolic." +level: error +nonword: true +tokens: + - '[a-z]+[!?]{2,}' diff --git a/vale/styles/proselint/Jargon.yml b/vale/styles/proselint/Jargon.yml new file mode 100644 index 0000000..2454a9c --- /dev/null +++ b/vale/styles/proselint/Jargon.yml @@ -0,0 +1,11 @@ +extends: existence +message: "'%s' is jargon." +ignorecase: true +level: error +tokens: + - in the affirmative + - in the negative + - agendize + - per your order + - per your request + - disincentivize diff --git a/vale/styles/proselint/LGBTOffensive.yml b/vale/styles/proselint/LGBTOffensive.yml new file mode 100644 index 0000000..eaf5a84 --- /dev/null +++ b/vale/styles/proselint/LGBTOffensive.yml @@ -0,0 +1,13 @@ +extends: existence +message: "'%s' is offensive. Remove it or consider the context." +ignorecase: true +tokens: + - fag + - faggot + - dyke + - sodomite + - homosexual agenda + - gay agenda + - transvestite + - homosexual lifestyle + - gay lifestyle diff --git a/vale/styles/proselint/LGBTTerms.yml b/vale/styles/proselint/LGBTTerms.yml new file mode 100644 index 0000000..efdf268 --- /dev/null +++ b/vale/styles/proselint/LGBTTerms.yml @@ -0,0 +1,15 @@ +extends: substitution +message: "Consider using '%s' instead of '%s'." +ignorecase: true +action: + name: replace +swap: + homosexual man: gay man + homosexual men: gay men + homosexual woman: lesbian + homosexual women: lesbians + homosexual people: gay people + homosexual couple: gay couple + sexual preference: sexual orientation + (?:admitted homosexual|avowed homosexual): openly gay + special rights: equal rights diff --git a/vale/styles/proselint/Malapropisms.yml b/vale/styles/proselint/Malapropisms.yml new file mode 100644 index 0000000..9699778 --- /dev/null +++ b/vale/styles/proselint/Malapropisms.yml @@ -0,0 +1,8 @@ +extends: existence +message: "'%s' is a malapropism." +ignorecase: true +level: error +tokens: + - the infinitesimal universe + - a serial experience + - attack my voracity diff --git a/vale/styles/proselint/Needless.yml b/vale/styles/proselint/Needless.yml new file mode 100644 index 0000000..1f2732e --- /dev/null +++ b/vale/styles/proselint/Needless.yml @@ -0,0 +1,358 @@ +extends: substitution +message: Prefer '%s' over '%s' +ignorecase: true +action: + name: replace +swap: + '(?:cell phone|cell-phone)': cellphone + '(?:cliquey|cliquy)': cliquish + '(?:pygmean|pygmaen)': pygmy + '(?:retributional|retributionary)': retributive + '(?:revokable|revokeable)': revocable + abolishment: abolition + accessary: accessory + accreditate: accredit + accruement: accrual + accusee: accused + acquaintanceship: acquaintance + acquitment: acquittal + administrate: administer + administrated: administered + administrating: administering + adulterate: adulterous + advisatory: advisory + advocator: advocate + aggrievance: grievance + allegator: alleger + allusory: allusive + amative: amorous + amortizement: amortization + amphiboly: amphibology + anecdotalist: anecdotist + anilinctus: anilingus + anticipative: anticipatory + antithetic: antithetical + applicative: applicable + applicatory: applicable + applier: applicator + approbative: approbatory + arbitrager: arbitrageur + arsenous: arsenious + ascendance: ascendancy + ascendence: ascendancy + ascendency: ascendancy + auctorial: authorial + averral: averment + barbwire: barbed wire + benefic: beneficent + benignant: benign + bestowment: bestowal + betrothment: betrothal + blamableness: blameworthiness + butt naked: buck naked + camarade: comrade + carta blanca: carte blanche + casualities: casualties + casuality: casualty + catch on fire: catch fire + catholicly: catholically + cease fire: ceasefire + channelize: channel + chaplainship: chaplaincy + chrysalid: chrysalis + chrysalids: chrysalises + cigaret: cigarette + coemployee: coworker + cognitional: cognitive + cohabitate: cohabit + cohabitor: cohabitant + collodium: collodion + collusory: collusive + commemoratory: commemorative + commonty: commonage + communicatory: communicative + compensative: compensatory + complacence: complacency + complicitous: complicit + computate: compute + conciliative: conciliatory + concomitancy: concomitance + condonance: condonation + confirmative: confirmatory + congruency: congruence + connotate: connote + consanguineal: consanguine + conspicuity: conspicuousness + conspiratorialist: conspirator + constitutionist: constitutionalist + contingence: contigency + contributary: contributory + contumacity: contumacy + conversible: convertible + conveyal: conveyance + copartner: partner + copartnership: partnership + corroboratory: corroborative + cotemporaneous: contemporaneous + cotemporary: contemporary + criminate: incriminate + culpatory: inculpatory + cumbrance: encumbrance + cumulate: accumulate + curatory: curative + daredeviltry: daredevilry + deceptious: deceptive + defamative: defamatory + defraudulent: fraudulent + degeneratory: degenerative + delimitate: delimit + delusory: delusive + denouncement: denunciation + depositee: depositary + depreciative: depreciatory + deprival: deprivation + derogative: derogatory + destroyable: destructible + detoxicate: detoxify + detractory: detractive + deviancy: deviance + deviationist: deviant + digamy: deuterogamy + digitalize: digitize + diminishment: diminution + diplomatist: diplomat + disassociate: dissociate + disciplinatory: disciplinary + discriminant: discriminating + disenthrone: dethrone + disintegratory: disintegrative + dismission: dismissal + disorientate: disorient + disorientated: disoriented + disquieten: disquiet + distraite: distrait + divergency: divergence + dividable: divisible + doctrinary: doctrinaire + documental: documentary + domesticize: domesticate + duplicatory: duplicative + duteous: dutiful + educationalist: educationist + educatory: educative + enigmatas: enigmas + enlargen: enlarge + enswathe: swathe + epical: epic + erotism: eroticism + ethician: ethicist + ex officiis: ex officio + exculpative: exculpatory + exigeant: exigent + exigence: exigency + exotism: exoticism + expedience: expediency + expediential: expedient + extensible: extendable + eying: eyeing + fiefdom: fief + flagrance: flagrancy + flatulency: flatulence + fraudful: fraudulent + funebrial: funereal + geographical: geographic + geometrical: geometric + gerry-rigged: jury-rigged + goatherder: goatherd + gustatorial: gustatory + habitude: habit + henceforward: henceforth + hesitance: hesitancy + heterogenous: heterogeneous + hierarchic: hierarchical + hindermost: hindmost + honorand: honoree + hypostasize: hypostatize + hysteric: hysterical + idolatrize: idolize + impanel: empanel + imperviable: impervious + importunacy: importunity + impotency: impotence + imprimatura: imprimatur + improprietous: improper + inalterable: unalterable + incitation: incitement + incommunicative: uncommunicative + inconsistence: inconsistency + incontrollable: uncontrollable + incurment: incurrence + indow: endow + indue: endue + inhibitive: inhibitory + innavigable: unnavigable + innovational: innovative + inquisitional: inquisitorial + insistment: insistence + insolvable: unsolvable + instillment: instillation + instinctual: instinctive + insuror: insurer + insurrectional: insurrectionary + interpretate: interpret + intervenience: intervention + ironical: ironic + jerry-rigged: jury-rigged + judgmatic: judgmental + labyrinthian: labyrinthine + laudative: laudatory + legitimatization: legitimation + legitimatize: legitimize + legitimization: legitimation + lengthways: lengthwise + life-sized: life-size + liquorice: licorice + lithesome: lithe + lollipop: lollypop + loth: loath + lubricous: lubricious + maihem: mayhem + medicinal marijuana: medical marijuana + meliorate: ameliorate + minimalize: minimize + mirk: murk + mirky: murky + misdoubt: doubt + monetarize: monetize + moveable: movable + narcism: narcissism + neglective: neglectful + negligency: negligence + neologizer: neologist + neurologic: neurological + nicknack: knickknack + nictate: nictitate + nonenforceable: unenforceable + normalcy: normality + numbedness: numbness + omittable: omissible + onomatopoetic: onomatopoeic + opinioned: opined + optimum advantage: optimal advantage + orientate: orient + outsized: outsize + oversized: oversize + overthrowal: overthrow + pacificist: pacifist + paederast: pederast + parachronism: anachronism + parti-color: parti-colored + participative: participatory + party-colored: parti-colored + pediatrist: pediatrician + penumbrous: penumbral + perjorative: pejorative + permissory: permissive + permutate: permute + personation: impersonation + pharmaceutic: pharmaceutical + pleuritis: pleurisy + policy holder: policyholder + policyowner: policyholder + politicalize: politicize + precedency: precedence + preceptoral: preceptorial + precipitance: precipitancy + precipitant: precipitate + preclusory: preclusive + precolumbian: pre-Columbian + prefectoral: prefectorial + preponderately: preponderantly + preserval: preservation + preventative: preventive + proconsulship: proconsulate + procreational: procreative + procurance: procurement + propelment: propulsion + propulsory: propulsive + prosecutive: prosecutory + protectory: protective + provocatory: provocative + pruriency: prurience + psychal: psychical + punitory: punitive + quantitate: quantify + questionary: questionnaire + quiescency: quiescence + rabbin: rabbi + reasonability: reasonableness + recidivistic: recidivous + recriminative: recriminatory + recruital: recruitment + recurrency: recurrence + recusance: recusancy + recusation: recusal + recusement: recusal + redemptory: redemptive + referrable: referable + referrible: referable + refutatory: refutative + remitment: remittance + remittal: remission + renouncement: renunciation + renunciable: renounceable + reparatory: reparative + repudiative: repudiatory + requitement: requital + rescindment: rescission + restoral: restoration + reticency: reticence + reviewal: review + revisal: revision + revisional: revisionary + revolute: revolt + saliency: salience + salutiferous: salutary + sensatory: sensory + sessionary: sessional + shareowner: shareholder + sicklily: sickly + signator: signatory + slanderize: slander + societary: societal + sodomist: sodomite + solicitate: solicit + speculatory: speculative + spiritous: spirituous + statutorial: statutory + submergeable: submersible + submittal: submission + subtile: subtle + succuba: succubus + sufficience: sufficiency + suppliant: supplicant + surmisal: surmise + suspendible: suspendable + synthetize: synthesize + systemize: systematize + tactual: tactile + tangental: tangential + tautologous: tautological + tee-shirt: T-shirt + thenceforward: thenceforth + transiency: transience + transposal: transposition + unfrequent: infrequent + unreasonability: unreasonableness + unrevokable: irrevocable + unsubstantial: insubstantial + usurpature: usurpation + variative: variational + vegetive: vegetative + vindicative: vindictive + vituperous: vituperative + vociferant: vociferous + volitive: volitional + wolverene: wolverine + wolvish: wolfish + Zoroastrism: Zoroastrianism diff --git a/vale/styles/proselint/Nonwords.yml b/vale/styles/proselint/Nonwords.yml new file mode 100644 index 0000000..57e7b9e --- /dev/null +++ b/vale/styles/proselint/Nonwords.yml @@ -0,0 +1,38 @@ +extends: substitution +message: "Consider using '%s' instead of '%s'." +ignorecase: true +level: error +action: + name: replace +swap: + affrontery: effrontery + analyzation: analysis + annoyment: annoyance + confirmant: confirmand + confirmants: confirmands + conversate: converse + crained: cranded + discomforture: discomfort|discomfiture + dispersement: disbursement|dispersal + doubtlessly: doubtless|undoubtedly + forebearance: forbearance + improprietous: improper + inclimate: inclement + inimicable: inimical + irregardless: regardless + minimalize: minimize + minimalized: minimized + minimalizes: minimizes + minimalizing: minimizing + optimalize: optimize + paralyzation: paralysis + pettifogger: pettifog + proprietous: proper + relative inexpense: relatively low price|affordability + seldomly: seldom + thusly: thus + uncategorically: categorically + undoubtably: undoubtedly|indubitably + unequivocable: unequivocal + unmercilessly: mercilessly + unrelentlessly: unrelentingly|relentlessly diff --git a/vale/styles/proselint/Oxymorons.yml b/vale/styles/proselint/Oxymorons.yml new file mode 100644 index 0000000..25fd2aa --- /dev/null +++ b/vale/styles/proselint/Oxymorons.yml @@ -0,0 +1,22 @@ +extends: existence +message: "'%s' is an oxymoron." +ignorecase: true +level: error +tokens: + - amateur expert + - increasingly less + - advancing backwards + - alludes explicitly to + - explicitly alludes to + - totally obsolescent + - completely obsolescent + - generally always + - usually always + - increasingly less + - build down + - conspicuous absence + - exact estimate + - found missing + - intense apathy + - mandatory choice + - organized mess diff --git a/vale/styles/proselint/P-Value.yml b/vale/styles/proselint/P-Value.yml new file mode 100644 index 0000000..8230938 --- /dev/null +++ b/vale/styles/proselint/P-Value.yml @@ -0,0 +1,6 @@ +extends: existence +message: "You should use more decimal places, unless '%s' is really true." +ignorecase: true +level: suggestion +tokens: + - 'p = 0\.0{2,4}' diff --git a/vale/styles/proselint/RASSyndrome.yml b/vale/styles/proselint/RASSyndrome.yml new file mode 100644 index 0000000..deae9c7 --- /dev/null +++ b/vale/styles/proselint/RASSyndrome.yml @@ -0,0 +1,30 @@ +extends: existence +message: "'%s' is redundant." +level: error +action: + name: edit + params: + - split + - ' ' + - '0' +tokens: + - ABM missile + - ACT test + - ABM missiles + - ABS braking system + - ATM machine + - CD disc + - CPI Index + - GPS system + - GUI interface + - HIV virus + - ISBN number + - LCD display + - PDF format + - PIN number + - RAS syndrome + - RIP in peace + - please RSVP + - SALT talks + - SAT test + - UPC codes diff --git a/vale/styles/proselint/README.md b/vale/styles/proselint/README.md new file mode 100644 index 0000000..4020768 --- /dev/null +++ b/vale/styles/proselint/README.md @@ -0,0 +1,12 @@ +Copyright © 2014–2015, Jordan Suchow, Michael Pacer, and Lara A. Ross +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vale/styles/proselint/Skunked.yml b/vale/styles/proselint/Skunked.yml new file mode 100644 index 0000000..96a1f69 --- /dev/null +++ b/vale/styles/proselint/Skunked.yml @@ -0,0 +1,13 @@ +extends: existence +message: "'%s' is a bit of a skunked term — impossible to use without issue." +ignorecase: true +level: error +tokens: + - bona fides + - deceptively + - decimate + - effete + - fulsome + - hopefully + - impassionate + - Thankfully diff --git a/vale/styles/proselint/Spelling.yml b/vale/styles/proselint/Spelling.yml new file mode 100644 index 0000000..d3c9be7 --- /dev/null +++ b/vale/styles/proselint/Spelling.yml @@ -0,0 +1,17 @@ +extends: consistency +message: "Inconsistent spelling of '%s'." +level: error +ignorecase: true +either: + advisor: adviser + centre: center + colour: color + emphasise: emphasize + finalise: finalize + focussed: focused + labour: labor + learnt: learned + organise: organize + organised: organized + organising: organizing + recognise: recognize diff --git a/vale/styles/proselint/Typography.yml b/vale/styles/proselint/Typography.yml new file mode 100644 index 0000000..60283eb --- /dev/null +++ b/vale/styles/proselint/Typography.yml @@ -0,0 +1,11 @@ +extends: substitution +message: Consider using the '%s' symbol instead of '%s'. +level: error +nonword: true +swap: + '\.\.\.': … + '\([cC]\)': © + '\(TM\)': ™ + '\(tm\)': ™ + '\([rR]\)': ® + '[0-9]+ ?x ?[0-9]+': × diff --git a/vale/styles/proselint/Uncomparables.yml b/vale/styles/proselint/Uncomparables.yml new file mode 100644 index 0000000..9b96f42 --- /dev/null +++ b/vale/styles/proselint/Uncomparables.yml @@ -0,0 +1,50 @@ +extends: existence +message: "'%s' is not comparable" +ignorecase: true +level: error +action: + name: edit + params: + - split + - ' ' + - '1' +raw: + - \b(?:absolutely|most|more|less|least|very|quite|largely|extremely|increasingly|kind of|mildy|hardly|greatly|sort of)\b\s* +tokens: + - absolute + - adequate + - complete + - correct + - certain + - devoid + - entire + - 'false' + - fatal + - favorite + - final + - ideal + - impossible + - inevitable + - infinite + - irrevocable + - main + - manifest + - only + - paramount + - perfect + - perpetual + - possible + - preferable + - principal + - singular + - stationary + - sufficient + - 'true' + - unanimous + - unavoidable + - unbroken + - uniform + - unique + - universal + - void + - whole diff --git a/vale/styles/proselint/Very.yml b/vale/styles/proselint/Very.yml new file mode 100644 index 0000000..e4077f7 --- /dev/null +++ b/vale/styles/proselint/Very.yml @@ -0,0 +1,6 @@ +extends: existence +message: "Remove '%s'." +ignorecase: true +level: error +tokens: + - very diff --git a/vale/styles/proselint/meta.json b/vale/styles/proselint/meta.json new file mode 100644 index 0000000..e3c6580 --- /dev/null +++ b/vale/styles/proselint/meta.json @@ -0,0 +1,17 @@ +{ + "author": "jdkato", + "description": "A Vale-compatible implementation of the proselint linter.", + "email": "support@errata.ai", + "lang": "en", + "url": "https://github.com/errata-ai/proselint/releases/latest/download/proselint.zip", + "feed": "https://github.com/errata-ai/proselint/releases.atom", + "issues": "https://github.com/errata-ai/proselint/issues/new", + "license": "BSD-3-Clause", + "name": "proselint", + "sources": [ + "https://github.com/amperser/proselint" + ], + "vale_version": ">=1.0.0", + "coverage": 0.0, + "version": "0.1.0" +} diff --git a/welcome/how-do-i/README.md b/welcome/how-do-i/README.md deleted file mode 100644 index 2b371ec..0000000 --- a/welcome/how-do-i/README.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -description: Recipes for useful tasks on RunPod ---- - -# How Do I? - diff --git a/welcome/how-do-i/automatically-stop-my-pod.md b/welcome/how-do-i/automatically-stop-my-pod.md deleted file mode 100644 index 6a83b47..0000000 --- a/welcome/how-do-i/automatically-stop-my-pod.md +++ /dev/null @@ -1,24 +0,0 @@ -# Automatically Stop My Pod - -If you want to automatically stop your pod when your workload is done, simply run the following command at the os level after your script is completed: - -``` -runpodctl stop pod $RUNPOD_POD_ID -``` - -runpodctl is our command line tool that is automatically installed in every pod. RUNPOD\_POD\_ID is an environment variable that we pass to uniquely identify each pod. Each runpodctl pod instance is configured with an API key that is scoped to that pod, so it cannot affect other pods. - -If you simply want to stop your pod after a specific amount of time, you can run the following command in your web terminal: - -
(sleep 2h; runpodctl stop pod $RUNPOD_POD_ID) &
-
- -This simple command sleeps for 2 hours (change 2h to whatever you want), and then stops the pod. Keep in mind that you will still incur disk fees on a stopped pod. - -If you want to terminate the pod completely, you can configure your pod with 0 volume disk. In this case, stopping the pod is equivalent to terminating it. - -You can also request to terminate the pod directly using a similar cli command: - -``` -runpodctl remove pod $RUNPOD_POD_ID -``` diff --git a/welcome/how-do-i/customize-a-template.md b/welcome/how-do-i/customize-a-template.md deleted file mode 100644 index 969d49e..0000000 --- a/welcome/how-do-i/customize-a-template.md +++ /dev/null @@ -1,19 +0,0 @@ -# Customize a Template - -A RunPod template is just a docker container image paired with some configuration. You can choose how deep you want to get into template customization depending on your skill level. - -The easiest is to simply start with a RunPod official template or community template and use it as-is. - -If you want better control over what gets done at pod start, you can modify the "Docker Command" field. The default docker command for all RunPod teamplates is: - -``` -bash -c './start.sh' -``` - -This means that if you want to run something prior to start.sh, you can put extra commands in there. For example, if I wanted to install vim: - -``` -bash -c 'apt update && apt install vim -y && ./start.sh' -``` - -The only downside to this approach is that you will run these commands every time your pod starts. If you wish to further customize the runtime container, you can create your own docker image. There is nothing special about creating a docker image for RunPod, but if you want a simple primer, [you can read this blog post.](https://www.runpod.io/blog/diy-deep-learning-docker-container) diff --git a/welcome/how-do-i/override-my-public-key.md b/welcome/how-do-i/override-my-public-key.md deleted file mode 100644 index 315a873..0000000 --- a/welcome/how-do-i/override-my-public-key.md +++ /dev/null @@ -1,3 +0,0 @@ -# Override My Public Key - -We attempt to inject the public key that you configure in your account's settings page for authentication using basic terminal. If you want to override this at a pod level, you can manually supply a public key as the RUNPOD\_SSH\_PUBLIC\_KEY environment variable. diff --git a/welcome/how-do-i/transfer-data.md b/welcome/how-do-i/transfer-data.md deleted file mode 100644 index 73c06d7..0000000 --- a/welcome/how-do-i/transfer-data.md +++ /dev/null @@ -1,5 +0,0 @@ -# Transfer Data - -The easiest way to transfer data is by using our [runpodctl command line tool](https://github.com/runpod/runpodctl/blob/main/README.md). - -You can also use our cloud sync integrations. (Guides for each coming soon) diff --git a/welcome/how-do-i/use-real-ssh.md b/welcome/how-do-i/use-real-ssh.md deleted file mode 100644 index bdd7705..0000000 --- a/welcome/how-do-i/use-real-ssh.md +++ /dev/null @@ -1,5 +0,0 @@ -# Use Real SSH - -The basic terminal SSH access that RunPod exposes is not a full SSH connection and therefore does not support commands like scp. If you want to have full SSH capabilities, then you will need to run an instance that has public IP support and run a full SSH daemon in your pod. - -Most of our official templates will do this for you if you are on a compatible instance. If you want to add SSH to a custom template, then you can [read this article for guidance.](https://www.runpod.io/blog/how-to-achieve-true-ssh-on-runpod/) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..bcc96d5 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1851 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@75lb/deep-merge@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@75lb/deep-merge/-/deep-merge-1.1.1.tgz#3b06155b90d34f5f8cc2107d796f1853ba02fd6d" + integrity sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw== + dependencies: + lodash.assignwith "^4.2.0" + typical "^7.1.1" + +"@actions/core@^1.6.0": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.1.tgz#61108e7ac40acae95ee36da074fa5850ca4ced8a" + integrity sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g== + dependencies: + "@actions/http-client" "^2.0.1" + uuid "^8.3.2" + +"@actions/http-client@^2.0.1": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.2.0.tgz#f8239f375be6185fcd07765efdcf0031ad5df1a0" + integrity sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg== + dependencies: + tunnel "^0.0.6" + undici "^5.25.4" + +"@apidevtools/openapi-schemas@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17" + integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ== + +"@apidevtools/swagger-methods@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267" + integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg== + +"@babel/code-frame@^7.16.0": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/runtime@^7.21.0": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" + integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@dprint/darwin-arm64@0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@dprint/darwin-arm64/-/darwin-arm64-0.44.0.tgz#6716ee44e99a97c26508dfeb4baf8538d55face7" + integrity sha512-6MlycQuH1rojgssK6D8CzaEC+rTZCfoHh/QHyZJcjJqIoj1KXGTL+UUTvJ+iGuMMJ1gchsyl0UCVDJ5UE/BBdA== + +"@dprint/darwin-x64@0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@dprint/darwin-x64/-/darwin-x64-0.44.0.tgz#aa330077399c6a5ac6940e41cbd77539519a0214" + integrity sha512-TKt/qCCVlf2imq1HDSrdpyWFfzySPlSBmaWAg5qADftQWMp2/egQWzqhw92U2x62aoZ0CRcP5BZE8aVIigPELg== + +"@dprint/linux-arm64-glibc@0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@dprint/linux-arm64-glibc/-/linux-arm64-glibc-0.44.0.tgz#b37621ab821f787f9cfa784d251478b10fd124b6" + integrity sha512-CgGuIFlytPzGMg7trFUtAJm0U7i3dBsp2OZbH2jHNBNC6vODHv1GgZFq4tQpMNPBiJRK+9eVlwHifWoEaVIRXg== + +"@dprint/linux-arm64-musl@0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@dprint/linux-arm64-musl/-/linux-arm64-musl-0.44.0.tgz#575b3d26d2def411fc3777373b54723cfdae98d6" + integrity sha512-rvs8jDYRqszjoabbycEd32Iob0R6jLjLpnN35e/jOGrguvJj0/TAumWp85O3viB7DVC7qxahgZft0XlhPEHrUQ== + +"@dprint/linux-x64-glibc@0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@dprint/linux-x64-glibc/-/linux-x64-glibc-0.44.0.tgz#bb7eb424082d7ca9063e26df15c5653eb1072b95" + integrity sha512-/3y4FsYcS+W25/o5yYjO0A9800woZ93b+Htlp7aIHdM53G0canw2306SoyvIZ+tNSaVegbSU9i21i4FLhNMN6g== + +"@dprint/linux-x64-musl@0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@dprint/linux-x64-musl/-/linux-x64-musl-0.44.0.tgz#30ee76ae0a08f9d18881a41d0afec9bf551053bb" + integrity sha512-XWclrKFozgNoeFZ4ULuwgUh+6tN7zn2tH8SmY8VwwaBsCX3FjCwk2Qx11rRqMmD9oJmu8KqWexSW6kY3Fxjh/g== + +"@dprint/win32-x64@0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@dprint/win32-x64/-/win32-x64-0.44.0.tgz#fada157042f172792271c2e0bf08753dfd859a90" + integrity sha512-od8W35aAwC1Ah3Zqw5q4w8aNHfABIiKssURF03IlFljAS5xZ4yt7JDkUwaFeLB/Xsh6Jka4YmbOWDrtEUoXY9Q== + +"@exodus/schemasafe@^1.0.0-rc.2": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" + integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== + +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + +"@humanwhocodes/momoa@^2.0.3": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/momoa/-/momoa-2.0.4.tgz#8b9e7a629651d15009c3587d07a222deeb829385" + integrity sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA== + +"@jsdevtools/ono@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" + integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== + +"@kwsites/file-exists@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99" + integrity sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw== + dependencies: + debug "^4.1.1" + +"@kwsites/promise-deferred@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" + integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@readme/better-ajv-errors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@readme/better-ajv-errors/-/better-ajv-errors-1.6.0.tgz#cf96740bd71d256ed628f3a7466ecae0846edd62" + integrity sha512-9gO9rld84Jgu13kcbKRU+WHseNhaVt76wYMeRDGsUGYxwJtI3RmEJ9LY9dZCYQGI8eUZLuxb5qDja0nqklpFjQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/runtime" "^7.21.0" + "@humanwhocodes/momoa" "^2.0.3" + chalk "^4.1.2" + json-to-ast "^2.0.3" + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@readme/http-status-codes@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@readme/http-status-codes/-/http-status-codes-7.2.0.tgz#805d281346eb4c25d987d8b86e23b4dba116a96f" + integrity sha512-/dBh9qw3QhJYqlGwt2I+KUP/lQ6nytdCx3aq+GpMUhibLHF3O7fwoowNcTwlbnwtyJ+TJYTIIrp3oVUlRNx3fA== + +"@readme/json-schema-ref-parser@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@readme/json-schema-ref-parser/-/json-schema-ref-parser-1.2.0.tgz#8552cde8f8ecf455398c59aa6e2cf5ed2d0f3d31" + integrity sha512-Bt3QVovFSua4QmHa65EHUmh2xS0XJ3rgTEUPH998f4OW4VVJke3BuS16f+kM0ZLOGdvIrzrPRqwihuv5BAjtrA== + dependencies: + "@jsdevtools/ono" "^7.1.3" + "@types/json-schema" "^7.0.6" + call-me-maybe "^1.0.1" + js-yaml "^4.1.0" + +"@readme/openapi-parser@^2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@readme/openapi-parser/-/openapi-parser-2.5.0.tgz#9e6f0d246ae45d0aea0efb873201359001d0f11e" + integrity sha512-IbymbOqRuUzoIgxfAAR7XJt2FWl6n2yqN09fF5adacGm7W03siA3bj1Emql0X9D2T+RpBYz3x9zDsMhuoMP62A== + dependencies: + "@apidevtools/openapi-schemas" "^2.1.0" + "@apidevtools/swagger-methods" "^3.0.2" + "@jsdevtools/ono" "^7.1.3" + "@readme/better-ajv-errors" "^1.6.0" + "@readme/json-schema-ref-parser" "^1.2.0" + ajv "^8.12.0" + ajv-draft-04 "^1.0.0" + call-me-maybe "^1.0.1" + +"@readme/postman-to-openapi@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@readme/postman-to-openapi/-/postman-to-openapi-4.1.0.tgz#ba40dd4374f74cf2112e23e031320ba2c3e0da44" + integrity sha512-VvV2Hzjskz01m8doSn7Ypt6cSZzgjnypVqXy1ipThbyYD6SGiM74VSePXykOODj/43Y2m6zeYedPk/ZLts/HvQ== + dependencies: + "@readme/http-status-codes" "^7.2.0" + js-yaml "^4.1.0" + jsonc-parser "3.2.0" + lodash.camelcase "^4.3.0" + marked "^4.3.0" + mustache "^4.2.0" + +"@types/json-schema@^7.0.11", "@types/json-schema@^7.0.6": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +ajv-draft-04@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== + +ajv@^8.0.1, ajv@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-6.2.2.tgz#f567d99e9af88a6d3d2f9dfcc21db6f9ba9fd157" + integrity sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +call-me-maybe@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chalk-template@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b" + integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg== + dependencies: + chalk "^4.1.2" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.6.1: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +code-error-fragment@0.0.230: + version "0.0.230" + resolved "https://registry.yarnpkg.com/code-error-fragment/-/code-error-fragment-0.0.230.tgz#d736d75c832445342eca1d1fedbf17d9618b14d7" + integrity sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-line-args@^5.2.0, command-line-args@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^7.0.0, command-line-usage@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-7.0.1.tgz#e540afef4a4f3bc501b124ffde33956309100655" + integrity sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ== + dependencies: + array-back "^6.2.2" + chalk-template "^0.4.0" + table-layout "^3.0.0" + typical "^7.1.1" + +compute-gcd@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/compute-gcd/-/compute-gcd-1.2.1.tgz#34d639f3825625e1357ce81f0e456a6249d8c77f" + integrity sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg== + dependencies: + validate.io-array "^1.0.3" + validate.io-function "^1.0.2" + validate.io-integer-array "^1.0.0" + +compute-lcm@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/compute-lcm/-/compute-lcm-1.1.2.tgz#9107c66b9dca28cefb22b4ab4545caac4034af23" + integrity sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ== + dependencies: + compute-gcd "^1.2.1" + validate.io-array "^1.0.3" + validate.io-function "^1.0.2" + validate.io-integer-array "^1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +config@^3.1.0: + version "3.3.9" + resolved "https://registry.yarnpkg.com/config/-/config-3.3.9.tgz#27fae95b43e0e1d5723e54143c090954d8e49572" + integrity sha512-G17nfe+cY7kR0wVpc49NCYvNtelm/pPy8czHoFkAgtV1lkmcp7DHtWCdDu+C9Z7gb2WVqa9Tm3uF9aKaPbCfhg== + dependencies: + json5 "^2.2.3" + +configstore@^5.0.0, configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +debug@^4.1.1, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dprint@0.44.0: + version "0.44.0" + resolved "https://registry.yarnpkg.com/dprint/-/dprint-0.44.0.tgz#8e25e826169e6e7c0291f172c4143414008f9b92" + integrity sha512-35gviJKVxK6x48EMBZq3/oBLDRoBF9nDXTxYbl+T/lgCUaW3dccccZfuvIJ1rvq1pFlHt8wVyw8ZDZA9ALMfhA== + optionalDependencies: + "@dprint/darwin-arm64" "0.44.0" + "@dprint/darwin-x64" "0.44.0" + "@dprint/linux-arm64-glibc" "0.44.0" + "@dprint/linux-arm64-musl" "0.44.0" + "@dprint/linux-x64-glibc" "0.44.0" + "@dprint/linux-x64-musl" "0.44.0" + "@dprint/win32-x64" "0.44.0" + +editor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" + integrity sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graceful-fs@^4.1.2: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +gray-matter@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +http2-client@^1.2.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" + integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-promise@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-schema-compare@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/json-schema-compare/-/json-schema-compare-0.2.2.tgz#dd601508335a90c7f4cfadb6b2e397225c908e56" + integrity sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ== + dependencies: + lodash "^4.17.4" + +json-schema-merge-allof@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz#ed2828cdd958616ff74f932830a26291789eaaf2" + integrity sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w== + dependencies: + compute-lcm "^1.1.2" + json-schema-compare "^0.2.2" + lodash "^4.17.20" + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-to-ast@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json-to-ast/-/json-to-ast-2.1.0.tgz#041a9fcd03c0845036acb670d29f425cea4faaf9" + integrity sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ== + dependencies: + code-error-fragment "0.0.230" + grapheme-splitter "^1.0.4" + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonpath-plus@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz#7ad94e147b3ed42f7939c315d2b9ce490c5a3899" + integrity sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA== + +jsonpointer@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lodash.assignwith@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" + integrity sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g== + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@^4.17.20, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ== + dependencies: + es5-ext "~0.10.2" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +marked@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + +memoizee@^0.4.14: + version "0.4.15" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" + integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== + dependencies: + d "^1.0.1" + es5-ext "^0.10.53" + es6-weak-map "^2.0.3" + event-emitter "^0.3.5" + is-promise "^2.2.2" + lru-queue "^0.1.0" + next-tick "^1.1.0" + timers-ext "^0.1.7" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.35: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +next-tick@1, next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== + dependencies: + es6-promise "^3.2.1" + +oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" + integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== + dependencies: + "@exodus/schemasafe" "^1.0.0-rc.2" + should "^13.2.1" + yaml "^1.10.0" + +oas-normalize@^8.4.0, oas-normalize@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/oas-normalize/-/oas-normalize-8.4.1.tgz#b647addbf4cfc1a28db6405649f6e9ec414f94ae" + integrity sha512-cGODg+AntZteJRHBiYDWKtcO2svWGMXuFWYu2I8b4hOrNiwB3hgDs/ScX3O9mYm6RpLsUIftt6rDHGc8eYG8aA== + dependencies: + "@readme/openapi-parser" "^2.5.0" + "@readme/postman-to-openapi" "^4.1.0" + js-yaml "^4.1.0" + node-fetch "^2.6.1" + openapi-types "^12.1.0" + swagger2openapi "^7.0.8" + +oas-resolver@^2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" + integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +oas-schema-walker@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" + integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== + +oas-validator@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" + integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== + dependencies: + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.8" + oas-linter "^3.2.2" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + reftools "^1.1.9" + should "^13.2.1" + yaml "^1.10.0" + +oas@^20.10.2: + version "20.10.3" + resolved "https://registry.yarnpkg.com/oas/-/oas-20.10.3.tgz#197a9b4096ff1b50e8ec38b97825ce8ddf8114e4" + integrity sha512-dBxDuwn2ssggPMOqEKEzT4sjCqbkol8JozuWrpwD7chcmbKbverj5vpk2kmsczeyguFkLcKUOMcqUUimf9h+IQ== + dependencies: + "@readme/json-schema-ref-parser" "^1.2.0" + "@types/json-schema" "^7.0.11" + json-schema-merge-allof "^0.8.1" + jsonpath-plus "^7.2.0" + jsonpointer "^5.0.0" + memoizee "^0.4.14" + oas-normalize "^8.4.0" + openapi-types "^12.1.1" + path-to-regexp "^6.2.0" + remove-undefined-objects "^3.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.2.1: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +openapi-types@^12.1.0, openapi-types@^12.1.1: + version "12.1.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +parse-link-header@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-link-header/-/parse-link-header-2.0.0.tgz#949353e284f8aa01f2ac857a98f692b57733f6b7" + integrity sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw== + dependencies: + xtend "~4.0.1" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-to-regexp@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +rdme@^8.6.6: + version "8.6.6" + resolved "https://registry.yarnpkg.com/rdme/-/rdme-8.6.6.tgz#00fd173433dbb8086fb56456aa15c2979a66c135" + integrity sha512-+H7v3t8yoM89Xe1PYTDitMptosemi/l6thNz5CyBEhipZW11iq3bbvndRDvRSBB0ncOnFQp5heY1HspERc/oPA== + dependencies: + "@actions/core" "^1.6.0" + chalk "^4.1.2" + ci-info "^3.6.1" + command-line-args "^5.2.0" + command-line-usage "^7.0.1" + config "^3.1.0" + configstore "^5.0.0" + debug "^4.3.3" + editor "^1.0.0" + form-data "^4.0.0" + gray-matter "^4.0.1" + ignore "^5.2.0" + mime-types "^2.1.35" + node-fetch "^2.6.1" + oas "^20.10.2" + oas-normalize "^8.4.1" + open "^8.2.1" + ora "^5.4.1" + parse-link-header "^2.0.0" + pluralize "^8.0.0" + prompts "^2.4.2" + semver "^7.5.3" + simple-git "^3.19.1" + string-argv "^0.3.1" + table "^6.8.1" + tmp-promise "^3.0.2" + update-notifier-cjs "^5.1.5" + validator "^13.7.0" + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +reftools@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" + integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + +registry-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +remove-undefined-objects@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-undefined-objects/-/remove-undefined-objects-3.0.0.tgz#34d710fd2953253ad882f42a60c5a81e618cf12b" + integrity sha512-nxG1yYfc/Jxi+bNCBiqKhxVJPE+QvziIOKbD+Dxc93Uisz92v/ZYpo4WR0TJuf+dk2xE8lW2WPJsA3mDFzXy8w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@^6.0.0, semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.7, semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-git@^3.19.1: + version "3.21.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.21.0.tgz#fb7b42749f53e7a53dfd213540d78b74e0aabe13" + integrity sha512-oTzw9248AF5bDTMk9MrxsRzEzivMlY+DWH0yWS4VYpMhNLhDWnN06pCtaUyPnqv/FpsdeNmRqmZugMABHRPdDA== + dependencies: + "@kwsites/file-exists" "^1.1.1" + "@kwsites/promise-deferred" "^1.1.1" + debug "^4.3.4" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stream-read-all@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/stream-read-all/-/stream-read-all-3.0.1.tgz#60762ae45e61d93ba0978cda7f3913790052ad96" + integrity sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A== + +string-argv@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +swagger2openapi@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" + integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== + dependencies: + call-me-maybe "^1.0.1" + node-fetch "^2.6.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.8" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + oas-validator "^5.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +table-layout@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-3.0.2.tgz#69c2be44388a5139b48c59cf21e73b488021769a" + integrity sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw== + dependencies: + "@75lb/deep-merge" "^1.1.1" + array-back "^6.2.2" + command-line-args "^5.2.1" + command-line-usage "^7.0.0" + stream-read-all "^3.0.1" + typical "^7.1.1" + wordwrapjs "^5.1.0" + +table@^6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +timers-ext@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== + dependencies: + es5-ext "~0.10.46" + next-tick "1" + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/typical/-/typical-7.1.1.tgz#ba177ab7ab103b78534463ffa4c0c9754523ac1f" + integrity sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA== + +undici@^5.25.4: + version "5.28.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91" + integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w== + dependencies: + "@fastify/busboy" "^2.0.0" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +update-notifier-cjs@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.6.tgz#6e3aff745d1551b55bb0a0a5939b7e636d95877d" + integrity sha512-wgxdSBWv3x/YpMzsWz5G4p4ec7JWD0HCl8W6bmNB6E5Gwo+1ym5oN4hiXpLf0mPySVEJEIsYlkshnplkg2OP9A== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + isomorphic-fetch "^3.0.0" + pupa "^2.1.1" + registry-auth-token "^5.0.1" + registry-url "^5.1.0" + semver "^7.3.7" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +validate.io-array@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== + +validate.io-function@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" + integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== + +validate.io-integer-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz#2cabde033293a6bcbe063feafe91eaf46b13a089" + integrity sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA== + dependencies: + validate.io-array "^1.0.3" + validate.io-integer "^1.0.4" + +validate.io-integer@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" + integrity sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ== + dependencies: + validate.io-number "^1.0.3" + +validate.io-number@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" + integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== + +validator@^13.7.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" + integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-fetch@^3.4.1: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wordwrapjs@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-5.1.0.tgz#4c4d20446dcc670b14fa115ef4f8fd9947af2b3a" + integrity sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.0.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1"