Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2df915a145 | ||
|
|
aadc025849 | ||
|
|
8b4a49073d | ||
|
|
4e10641d69 | ||
|
|
6e8696c12a | ||
|
|
b49e81a75a | ||
|
|
65932f85e1 | ||
|
|
94840cfbbb | ||
|
|
677a01e8f3 | ||
|
|
5cd12ba331 |
+1
-1
@@ -12,7 +12,7 @@ RUN --mount=type=cache,target=/root/.cache/pip \
|
|||||||
python3 -m pip install --upgrade -r /requirements.txt
|
python3 -m pip install --upgrade -r /requirements.txt
|
||||||
|
|
||||||
# Install vLLM (switching back to pip installs since issues that required building fork are fixed and space optimization is not as important since caching) and FlashInfer
|
# Install vLLM (switching back to pip installs since issues that required building fork are fixed and space optimization is not as important since caching) and FlashInfer
|
||||||
RUN python3 -m pip install vllm==0.6.3 && \
|
RUN python3 -m pip install vllm==0.6.4 && \
|
||||||
python3 -m pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.3
|
python3 -m pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.3
|
||||||
|
|
||||||
# Setup for Option 2: Building the Image with the Model included
|
# Setup for Option 2: Building the Image with the Model included
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ Deploy OpenAI-Compatible Blazing-Fast LLM Endpoints powered by the [vLLM](https:
|
|||||||
### 1. UI for Deploying vLLM Worker on RunPod console:
|
### 1. UI for Deploying vLLM Worker on RunPod console:
|
||||||

|

|
||||||
|
|
||||||
### 2. Worker vLLM `v1.5.0` with vLLM `0.6.2` now available under `stable` tags
|
### 2. Worker vLLM `v1.6.0` with vLLM `0.6.3` now available under `stable` tags
|
||||||
|
|
||||||
Update v1.5.0 is now available, use the image tag `runpod/worker-v1-vllm:v1.5.0stable-cuda12.1.0`.
|
Update v1.6.0 is now available, use the image tag `runpod/worker-v1-vllm:v1.6.0stable-cuda12.1.0`.
|
||||||
|
|
||||||
### 3. OpenAI-Compatible [Embedding Worker](https://github.com/runpod-workers/worker-infinity-embedding) Released
|
### 3. OpenAI-Compatible [Embedding Worker](https://github.com/runpod-workers/worker-infinity-embedding) Released
|
||||||
Deploy your own OpenAI-compatible Serverless Endpoint on RunPod with multiple embedding models and fast inference for RAG and more!
|
Deploy your own OpenAI-compatible Serverless Endpoint on RunPod with multiple embedding models and fast inference for RAG and more!
|
||||||
@@ -82,7 +82,7 @@ Below is a summary of the available RunPod Worker images, categorized by image s
|
|||||||
|
|
||||||
| CUDA Version | Stable Image Tag | Development Image Tag | Note |
|
| CUDA Version | Stable Image Tag | Development Image Tag | Note |
|
||||||
|--------------|-----------------------------------|-----------------------------------|----------------------------------------------------------------------|
|
|--------------|-----------------------------------|-----------------------------------|----------------------------------------------------------------------|
|
||||||
| 12.1.0 | `runpod/worker-v1-vllm:v1.5.0stable-cuda12.1.0` | `runpod/worker-v1-vllm:v1.5.0dev-cuda12.1.0` | When creating an Endpoint, select CUDA Version 12.3, 12.2 and 12.1 in the filter. |
|
| 12.1.0 | `runpod/worker-v1-vllm:v1.6.0stable-cuda12.1.0` | `runpod/worker-v1-vllm:v1.6.0dev-cuda12.1.0` | When creating an Endpoint, select CUDA Version 12.3, 12.2 and 12.1 in the filter. |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+15
-6
@@ -11,7 +11,8 @@ from vllm import AsyncLLMEngine
|
|||||||
from vllm.entrypoints.openai.serving_chat import OpenAIServingChat
|
from vllm.entrypoints.openai.serving_chat import OpenAIServingChat
|
||||||
from vllm.entrypoints.openai.serving_completion import OpenAIServingCompletion
|
from vllm.entrypoints.openai.serving_completion import OpenAIServingCompletion
|
||||||
from vllm.entrypoints.openai.protocol import ChatCompletionRequest, CompletionRequest, ErrorResponse
|
from vllm.entrypoints.openai.protocol import ChatCompletionRequest, CompletionRequest, ErrorResponse
|
||||||
from vllm.entrypoints.openai.serving_engine import BaseModelPath
|
from vllm.entrypoints.openai.serving_engine import BaseModelPath, LoRAModulePath
|
||||||
|
|
||||||
|
|
||||||
from utils import DummyRequest, JobInput, BatchSize, create_error_response
|
from utils import DummyRequest, JobInput, BatchSize, create_error_response
|
||||||
from constants import DEFAULT_MAX_CONCURRENCY, DEFAULT_BATCH_SIZE, DEFAULT_BATCH_SIZE_GROWTH_FACTOR, DEFAULT_MIN_BATCH_SIZE
|
from constants import DEFAULT_MAX_CONCURRENCY, DEFAULT_BATCH_SIZE, DEFAULT_BATCH_SIZE_GROWTH_FACTOR, DEFAULT_MIN_BATCH_SIZE
|
||||||
@@ -128,13 +129,24 @@ class OpenAIvLLMEngine(vLLMEngine):
|
|||||||
self.base_model_paths = [
|
self.base_model_paths = [
|
||||||
BaseModelPath(name=self.engine_args.model, model_path=self.engine_args.model)
|
BaseModelPath(name=self.engine_args.model, model_path=self.engine_args.model)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
lora_modules = os.getenv('LORA_MODULES', None)
|
||||||
|
if lora_modules is not None:
|
||||||
|
try:
|
||||||
|
lora_modules = json.loads(lora_modules)
|
||||||
|
lora_modules = [LoRAModulePath(**lora_modules)]
|
||||||
|
except:
|
||||||
|
lora_modules = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
self.chat_engine = OpenAIServingChat(
|
self.chat_engine = OpenAIServingChat(
|
||||||
engine_client=self.llm,
|
engine_client=self.llm,
|
||||||
model_config=self.model_config,
|
model_config=self.model_config,
|
||||||
base_model_paths=self.base_model_paths,
|
base_model_paths=self.base_model_paths,
|
||||||
response_role=self.response_role,
|
response_role=self.response_role,
|
||||||
chat_template=self.tokenizer.tokenizer.chat_template,
|
chat_template=self.tokenizer.tokenizer.chat_template,
|
||||||
lora_modules=None,
|
lora_modules=lora_modules,
|
||||||
prompt_adapters=None,
|
prompt_adapters=None,
|
||||||
request_logger=None
|
request_logger=None
|
||||||
)
|
)
|
||||||
@@ -142,7 +154,7 @@ class OpenAIvLLMEngine(vLLMEngine):
|
|||||||
engine_client=self.llm,
|
engine_client=self.llm,
|
||||||
model_config=self.model_config,
|
model_config=self.model_config,
|
||||||
base_model_paths=self.base_model_paths,
|
base_model_paths=self.base_model_paths,
|
||||||
lora_modules=[],
|
lora_modules=lora_modules,
|
||||||
prompt_adapters=None,
|
prompt_adapters=None,
|
||||||
request_logger=None
|
request_logger=None
|
||||||
)
|
)
|
||||||
@@ -158,9 +170,6 @@ class OpenAIvLLMEngine(vLLMEngine):
|
|||||||
|
|
||||||
async def _handle_model_request(self):
|
async def _handle_model_request(self):
|
||||||
models = await self.chat_engine.show_available_models()
|
models = await self.chat_engine.show_available_models()
|
||||||
fixed_model = models.data[0]
|
|
||||||
fixed_model.id = self.served_model_name
|
|
||||||
models.data = [fixed_model]
|
|
||||||
return models.model_dump()
|
return models.model_dump()
|
||||||
|
|
||||||
async def _handle_chat_or_completion_request(self, openai_request: JobInput):
|
async def _handle_chat_or_completion_request(self, openai_request: JobInput):
|
||||||
|
|||||||
+121
-61
@@ -1,5 +1,125 @@
|
|||||||
{
|
{
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"0.6.4": {
|
||||||
|
"imageName": "runpod/worker-v1-vllm:v1.6.0stable-cuda12.1.0",
|
||||||
|
"minimumCudaVersion": "12.1",
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"title": "LLM Settings",
|
||||||
|
"settings": [
|
||||||
|
"TOKENIZER", "TOKENIZER_MODE", "SKIP_TOKENIZER_INIT", "TRUST_REMOTE_CODE",
|
||||||
|
"DOWNLOAD_DIR", "LOAD_FORMAT", "DTYPE", "KV_CACHE_DTYPE", "QUANTIZATION_PARAM_PATH",
|
||||||
|
"MAX_MODEL_LEN", "GUIDED_DECODING_BACKEND", "DISTRIBUTED_EXECUTOR_BACKEND",
|
||||||
|
"WORKER_USE_RAY", "RAY_WORKERS_USE_NSIGHT", "PIPELINE_PARALLEL_SIZE",
|
||||||
|
"TENSOR_PARALLEL_SIZE", "MAX_PARALLEL_LOADING_WORKERS", "ENABLE_PREFIX_CACHING",
|
||||||
|
"DISABLE_SLIDING_WINDOW", "NUM_LOOKAHEAD_SLOTS",
|
||||||
|
"SEED", "NUM_GPU_BLOCKS_OVERRIDE", "MAX_NUM_BATCHED_TOKENS", "MAX_NUM_SEQS",
|
||||||
|
"MAX_LOGPROBS", "DISABLE_LOG_STATS", "QUANTIZATION", "ROPE_SCALING", "ROPE_THETA",
|
||||||
|
"TOKENIZER_POOL_SIZE", "TOKENIZER_POOL_TYPE", "TOKENIZER_POOL_EXTRA_CONFIG",
|
||||||
|
"ENABLE_LORA", "MAX_LORAS", "MAX_LORA_RANK", "LORA_EXTRA_VOCAB_SIZE",
|
||||||
|
"LORA_DTYPE", "LONG_LORA_SCALING_FACTORS", "MAX_CPU_LORAS", "FULLY_SHARDED_LORAS",
|
||||||
|
"DEVICE", "SCHEDULER_DELAY_FACTOR", "ENABLE_CHUNKED_PREFILL", "SPECULATIVE_MODEL",
|
||||||
|
"NUM_SPECULATIVE_TOKENS", "SPECULATIVE_DRAFT_TENSOR_PARALLEL_SIZE",
|
||||||
|
"SPECULATIVE_MAX_MODEL_LEN", "SPECULATIVE_DISABLE_BY_BATCH_SIZE",
|
||||||
|
"NGRAM_PROMPT_LOOKUP_MAX", "NGRAM_PROMPT_LOOKUP_MIN", "SPEC_DECODING_ACCEPTANCE_METHOD",
|
||||||
|
"TYPICAL_ACCEPTANCE_SAMPLER_POSTERIOR_THRESHOLD", "TYPICAL_ACCEPTANCE_SAMPLER_POSTERIOR_ALPHA",
|
||||||
|
"MODEL_LOADER_EXTRA_CONFIG", "PREEMPTION_MODE", "PREEMPTION_CHECK_PERIOD",
|
||||||
|
"PREEMPTION_CPU_CAPACITY", "MAX_LOG_LEN", "DISABLE_LOGGING_REQUEST"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Tokenizer Settings",
|
||||||
|
"settings": [
|
||||||
|
"TOKENIZER_NAME", "TOKENIZER_REVISION", "CUSTOM_CHAT_TEMPLATE"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "System Settings",
|
||||||
|
"settings": [
|
||||||
|
"GPU_MEMORY_UTILIZATION", "MAX_PARALLEL_LOADING_WORKERS", "BLOCK_SIZE",
|
||||||
|
"SWAP_SPACE", "ENFORCE_EAGER", "MAX_SEQ_LEN_TO_CAPTURE", "DISABLE_CUSTOM_ALL_REDUCE"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Streaming Settings",
|
||||||
|
"settings": [
|
||||||
|
"DEFAULT_BATCH_SIZE", "DEFAULT_MIN_BATCH_SIZE", "DEFAULT_BATCH_SIZE_GROWTH_FACTOR"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "OpenAI Settings",
|
||||||
|
"settings": [
|
||||||
|
"RAW_OPENAI_OUTPUT", "OPENAI_RESPONSE_ROLE", "OPENAI_SERVED_MODEL_NAME_OVERRIDE"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Serverless Settings",
|
||||||
|
"settings": [
|
||||||
|
"MAX_CONCURRENCY", "DISABLE_LOG_STATS", "DISABLE_LOG_REQUESTS"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0.6.3": {
|
||||||
|
"imageName": "runpod/worker-v1-vllm:v1.6.0stable-cuda12.1.0",
|
||||||
|
"minimumCudaVersion": "12.1",
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"title": "LLM Settings",
|
||||||
|
"settings": [
|
||||||
|
"TOKENIZER", "TOKENIZER_MODE", "SKIP_TOKENIZER_INIT", "TRUST_REMOTE_CODE",
|
||||||
|
"DOWNLOAD_DIR", "LOAD_FORMAT", "DTYPE", "KV_CACHE_DTYPE", "QUANTIZATION_PARAM_PATH",
|
||||||
|
"MAX_MODEL_LEN", "GUIDED_DECODING_BACKEND", "DISTRIBUTED_EXECUTOR_BACKEND",
|
||||||
|
"WORKER_USE_RAY", "RAY_WORKERS_USE_NSIGHT", "PIPELINE_PARALLEL_SIZE",
|
||||||
|
"TENSOR_PARALLEL_SIZE", "MAX_PARALLEL_LOADING_WORKERS", "ENABLE_PREFIX_CACHING",
|
||||||
|
"DISABLE_SLIDING_WINDOW", "NUM_LOOKAHEAD_SLOTS",
|
||||||
|
"SEED", "NUM_GPU_BLOCKS_OVERRIDE", "MAX_NUM_BATCHED_TOKENS", "MAX_NUM_SEQS",
|
||||||
|
"MAX_LOGPROBS", "DISABLE_LOG_STATS", "QUANTIZATION", "ROPE_SCALING", "ROPE_THETA",
|
||||||
|
"TOKENIZER_POOL_SIZE", "TOKENIZER_POOL_TYPE", "TOKENIZER_POOL_EXTRA_CONFIG",
|
||||||
|
"ENABLE_LORA", "MAX_LORAS", "MAX_LORA_RANK", "LORA_EXTRA_VOCAB_SIZE",
|
||||||
|
"LORA_DTYPE", "LONG_LORA_SCALING_FACTORS", "MAX_CPU_LORAS", "FULLY_SHARDED_LORAS",
|
||||||
|
"DEVICE", "SCHEDULER_DELAY_FACTOR", "ENABLE_CHUNKED_PREFILL", "SPECULATIVE_MODEL",
|
||||||
|
"NUM_SPECULATIVE_TOKENS", "SPECULATIVE_DRAFT_TENSOR_PARALLEL_SIZE",
|
||||||
|
"SPECULATIVE_MAX_MODEL_LEN", "SPECULATIVE_DISABLE_BY_BATCH_SIZE",
|
||||||
|
"NGRAM_PROMPT_LOOKUP_MAX", "NGRAM_PROMPT_LOOKUP_MIN", "SPEC_DECODING_ACCEPTANCE_METHOD",
|
||||||
|
"TYPICAL_ACCEPTANCE_SAMPLER_POSTERIOR_THRESHOLD", "TYPICAL_ACCEPTANCE_SAMPLER_POSTERIOR_ALPHA",
|
||||||
|
"MODEL_LOADER_EXTRA_CONFIG", "PREEMPTION_MODE", "PREEMPTION_CHECK_PERIOD",
|
||||||
|
"PREEMPTION_CPU_CAPACITY", "MAX_LOG_LEN", "DISABLE_LOGGING_REQUEST"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Tokenizer Settings",
|
||||||
|
"settings": [
|
||||||
|
"TOKENIZER_NAME", "TOKENIZER_REVISION", "CUSTOM_CHAT_TEMPLATE"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "System Settings",
|
||||||
|
"settings": [
|
||||||
|
"GPU_MEMORY_UTILIZATION", "MAX_PARALLEL_LOADING_WORKERS", "BLOCK_SIZE",
|
||||||
|
"SWAP_SPACE", "ENFORCE_EAGER", "MAX_SEQ_LEN_TO_CAPTURE", "DISABLE_CUSTOM_ALL_REDUCE"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Streaming Settings",
|
||||||
|
"settings": [
|
||||||
|
"DEFAULT_BATCH_SIZE", "DEFAULT_MIN_BATCH_SIZE", "DEFAULT_BATCH_SIZE_GROWTH_FACTOR"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "OpenAI Settings",
|
||||||
|
"settings": [
|
||||||
|
"RAW_OPENAI_OUTPUT", "OPENAI_RESPONSE_ROLE", "OPENAI_SERVED_MODEL_NAME_OVERRIDE"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Serverless Settings",
|
||||||
|
"settings": [
|
||||||
|
"MAX_CONCURRENCY", "DISABLE_LOG_STATS", "DISABLE_LOG_REQUESTS"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
"0.6.2": {
|
"0.6.2": {
|
||||||
"imageName": "runpod/worker-v1-vllm:v1.5.0stable-cuda12.1.0",
|
"imageName": "runpod/worker-v1-vllm:v1.5.0stable-cuda12.1.0",
|
||||||
"minimumCudaVersion": "12.1",
|
"minimumCudaVersion": "12.1",
|
||||||
@@ -179,66 +299,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"0.5.4": {
|
|
||||||
"imageName": "runpod/worker-v1-vllm:v1.2.0stable-cuda12.1.0",
|
|
||||||
"minimumCudaVersion": "12.1",
|
|
||||||
"categories": [
|
|
||||||
{
|
|
||||||
"title": "LLM Settings",
|
|
||||||
"settings": [
|
|
||||||
"TOKENIZER", "TOKENIZER_MODE", "SKIP_TOKENIZER_INIT", "TRUST_REMOTE_CODE",
|
|
||||||
"DOWNLOAD_DIR", "LOAD_FORMAT", "DTYPE", "KV_CACHE_DTYPE", "QUANTIZATION_PARAM_PATH",
|
|
||||||
"MAX_MODEL_LEN", "GUIDED_DECODING_BACKEND", "DISTRIBUTED_EXECUTOR_BACKEND",
|
|
||||||
"WORKER_USE_RAY", "RAY_WORKERS_USE_NSIGHT", "PIPELINE_PARALLEL_SIZE",
|
|
||||||
"TENSOR_PARALLEL_SIZE", "MAX_PARALLEL_LOADING_WORKERS", "ENABLE_PREFIX_CACHING",
|
|
||||||
"DISABLE_SLIDING_WINDOW", "USE_V2_BLOCK_MANAGER", "NUM_LOOKAHEAD_SLOTS",
|
|
||||||
"SEED", "NUM_GPU_BLOCKS_OVERRIDE", "MAX_NUM_BATCHED_TOKENS", "MAX_NUM_SEQS",
|
|
||||||
"MAX_LOGPROBS", "DISABLE_LOG_STATS", "QUANTIZATION", "ROPE_SCALING", "ROPE_THETA",
|
|
||||||
"TOKENIZER_POOL_SIZE", "TOKENIZER_POOL_TYPE", "TOKENIZER_POOL_EXTRA_CONFIG",
|
|
||||||
"ENABLE_LORA", "MAX_LORAS", "MAX_LORA_RANK", "LORA_EXTRA_VOCAB_SIZE",
|
|
||||||
"LORA_DTYPE", "LONG_LORA_SCALING_FACTORS", "MAX_CPU_LORAS", "FULLY_SHARDED_LORAS",
|
|
||||||
"DEVICE", "SCHEDULER_DELAY_FACTOR", "ENABLE_CHUNKED_PREFILL", "SPECULATIVE_MODEL",
|
|
||||||
"NUM_SPECULATIVE_TOKENS", "SPECULATIVE_DRAFT_TENSOR_PARALLEL_SIZE",
|
|
||||||
"SPECULATIVE_MAX_MODEL_LEN", "SPECULATIVE_DISABLE_BY_BATCH_SIZE",
|
|
||||||
"NGRAM_PROMPT_LOOKUP_MAX", "NGRAM_PROMPT_LOOKUP_MIN", "SPEC_DECODING_ACCEPTANCE_METHOD",
|
|
||||||
"TYPICAL_ACCEPTANCE_SAMPLER_POSTERIOR_THRESHOLD", "TYPICAL_ACCEPTANCE_SAMPLER_POSTERIOR_ALPHA",
|
|
||||||
"MODEL_LOADER_EXTRA_CONFIG", "PREEMPTION_MODE", "PREEMPTION_CHECK_PERIOD",
|
|
||||||
"PREEMPTION_CPU_CAPACITY", "MAX_LOG_LEN", "DISABLE_LOGGING_REQUEST"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "Tokenizer Settings",
|
|
||||||
"settings": [
|
|
||||||
"TOKENIZER_NAME", "TOKENIZER_REVISION", "CUSTOM_CHAT_TEMPLATE"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "System Settings",
|
|
||||||
"settings": [
|
|
||||||
"GPU_MEMORY_UTILIZATION", "MAX_PARALLEL_LOADING_WORKERS", "BLOCK_SIZE",
|
|
||||||
"SWAP_SPACE", "ENFORCE_EAGER", "MAX_SEQ_LEN_TO_CAPTURE", "DISABLE_CUSTOM_ALL_REDUCE"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "Streaming Settings",
|
|
||||||
"settings": [
|
|
||||||
"DEFAULT_BATCH_SIZE", "DEFAULT_MIN_BATCH_SIZE", "DEFAULT_BATCH_SIZE_GROWTH_FACTOR"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "OpenAI Settings",
|
|
||||||
"settings": [
|
|
||||||
"RAW_OPENAI_OUTPUT", "OPENAI_RESPONSE_ROLE", "OPENAI_SERVED_MODEL_NAME_OVERRIDE"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "Serverless Settings",
|
|
||||||
"settings": [
|
|
||||||
"MAX_CONCURRENCY", "DISABLE_LOG_STATS", "DISABLE_LOG_REQUESTS"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"schema": {
|
"schema": {
|
||||||
@@ -932,5 +992,5 @@
|
|||||||
"required": false,
|
"required": false,
|
||||||
"type": "toggle"
|
"type": "toggle"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user