xinference 1.2.1__py3-none-any.whl → 1.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of xinference might be problematic. Click here for more details.

Files changed (80) hide show
  1. xinference/_version.py +3 -3
  2. xinference/api/restful_api.py +4 -7
  3. xinference/client/handlers.py +3 -0
  4. xinference/client/restful/restful_client.py +9 -1
  5. xinference/core/model.py +19 -0
  6. xinference/core/resource.py +7 -1
  7. xinference/core/scheduler.py +4 -7
  8. xinference/core/status_guard.py +1 -0
  9. xinference/core/supervisor.py +228 -19
  10. xinference/core/utils.py +1 -29
  11. xinference/core/worker.py +28 -2
  12. xinference/deploy/cmdline.py +33 -3
  13. xinference/deploy/local.py +2 -1
  14. xinference/deploy/test/test_cmdline.py +32 -0
  15. xinference/device_utils.py +43 -1
  16. xinference/model/audio/core.py +5 -0
  17. xinference/model/audio/kokoro.py +122 -0
  18. xinference/model/audio/model_spec.json +8 -0
  19. xinference/model/audio/model_spec_modelscope.json +9 -0
  20. xinference/model/image/stable_diffusion/core.py +15 -6
  21. xinference/model/llm/llama_cpp/core.py +21 -14
  22. xinference/model/llm/llm_family.json +866 -46
  23. xinference/model/llm/llm_family.py +7 -2
  24. xinference/model/llm/llm_family_modelscope.json +873 -16
  25. xinference/model/llm/mlx/core.py +11 -3
  26. xinference/model/llm/reasoning_parsers/__init__.py +13 -0
  27. xinference/model/llm/reasoning_parsers/abs_reasoning_parsers.py +98 -0
  28. xinference/model/llm/reasoning_parsers/deepseek_r1_reasoning_parser.py +140 -0
  29. xinference/model/llm/sglang/core.py +99 -11
  30. xinference/model/llm/transformers/core.py +9 -1
  31. xinference/model/llm/transformers/intern_vl.py +23 -14
  32. xinference/model/llm/transformers/qwen2_audio.py +3 -1
  33. xinference/model/llm/transformers/qwen2_vl.py +20 -3
  34. xinference/model/llm/transformers/utils.py +22 -11
  35. xinference/model/llm/utils.py +164 -20
  36. xinference/model/llm/vllm/core.py +36 -4
  37. xinference/model/llm/vllm/xavier/executor.py +2 -2
  38. xinference/model/llm/vllm/xavier/scheduler.py +3 -3
  39. xinference/thirdparty/internvl/conversation.py +26 -17
  40. xinference/types.py +2 -0
  41. xinference/web/ui/build/asset-manifest.json +6 -6
  42. xinference/web/ui/build/index.html +1 -1
  43. xinference/web/ui/build/static/css/main.f8177338.css +2 -0
  44. xinference/web/ui/build/static/css/main.f8177338.css.map +1 -0
  45. xinference/web/ui/build/static/js/main.ad42919c.js +3 -0
  46. xinference/web/ui/build/static/js/main.ad42919c.js.map +1 -0
  47. xinference/web/ui/node_modules/.cache/babel-loader/074a42304bbbaa79e1bfc3b28502457a390df55708de9006f4cc8e35c60aea87.json +1 -0
  48. xinference/web/ui/node_modules/.cache/babel-loader/0acb065326560592b10888234242f94f67efe28458b90f273d4d4fba9daa0cd2.json +1 -0
  49. xinference/web/ui/node_modules/.cache/babel-loader/279ace390216236a82b3d8995c78eca4d637ac9a523e9f521a2d9c76607a43d7.json +1 -0
  50. xinference/web/ui/node_modules/.cache/babel-loader/630a7bd592596cc6e291fc32238ce7c08238038a64ed8ccee0eb0c13c9902910.json +1 -0
  51. xinference/web/ui/node_modules/.cache/babel-loader/6cb9f6c62ab4042f0b11c5d75e51187188e9d6f5f08b1d63e796e051bafdb457.json +1 -0
  52. xinference/web/ui/node_modules/.cache/babel-loader/8f9af2979e45d4648f0cfae108363e58ee421c29a9d4e7329b6f06d9adfd4133.json +1 -0
  53. xinference/web/ui/node_modules/.cache/babel-loader/914c33e91c1012e3bcd3e96f3a25884cbef148290632d0266dab972b8cc1e95f.json +1 -0
  54. xinference/web/ui/node_modules/.cache/babel-loader/9c8b1a86e7c65b2b2599a205e30920652d6c2105f926508ef5bcf29a3ef4ce76.json +1 -0
  55. xinference/web/ui/node_modules/.cache/babel-loader/b7939cd3a48adf12fccfdd0803019b5cc235ff7de3a297dae70ce635e0eea13e.json +1 -0
  56. xinference/web/ui/node_modules/.cache/babel-loader/efe7cd132c27a8f9fd5352a394c491fd5fb0da0348cf9fcbd923164a32365eab.json +1 -0
  57. xinference/web/ui/node_modules/.cache/babel-loader/f04f666b77b44d7be3e16034d6b0074de2ba9c254f1fae15222b3148608fa8b3.json +1 -0
  58. xinference/web/ui/node_modules/.cache/babel-loader/fecf076bcd198a458c2a6ab0e85e40dc1c99994c353164e79c469be162cb74c9.json +1 -0
  59. xinference/web/ui/src/locales/en.json +14 -1
  60. xinference/web/ui/src/locales/zh.json +14 -1
  61. {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/METADATA +18 -17
  62. {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/RECORD +67 -60
  63. xinference/web/ui/build/static/css/main.51a587ff.css +0 -2
  64. xinference/web/ui/build/static/css/main.51a587ff.css.map +0 -1
  65. xinference/web/ui/build/static/js/main.b0936c54.js +0 -3
  66. xinference/web/ui/build/static/js/main.b0936c54.js.map +0 -1
  67. xinference/web/ui/node_modules/.cache/babel-loader/0c2fb5375667931c4a331c99e0d87dc145e8f327cea3f44d6e56f54c7c1d4020.json +0 -1
  68. xinference/web/ui/node_modules/.cache/babel-loader/185ceb8872d562e032b47e79df6a45670e06345b8ed70aad1a131e0476783c5c.json +0 -1
  69. xinference/web/ui/node_modules/.cache/babel-loader/3eefb411b24c2b3ce053570ef50daccf154022f0e168be5ed0fec21394baf9f4.json +0 -1
  70. xinference/web/ui/node_modules/.cache/babel-loader/63c8e07687ea53a4f8a910ee5e42e0eb26cd1acbfbe820f3e3248a786ee51401.json +0 -1
  71. xinference/web/ui/node_modules/.cache/babel-loader/a3ff866acddf34917a7ee399e0e571a4dfd8ba66d5057db885f243e16a6eb17d.json +0 -1
  72. xinference/web/ui/node_modules/.cache/babel-loader/a7f1a71f6580dfe810c685a9c1d68e318f71e1fa258fbe50b87a6ac37cc0a598.json +0 -1
  73. xinference/web/ui/node_modules/.cache/babel-loader/bdee44abeadc4abc17d41c52eb49c6e19a4b1a267b6e16876ce91bdeeebfc52d.json +0 -1
  74. xinference/web/ui/node_modules/.cache/babel-loader/d7664d18c4ddbad9c3a6a31b91f7c00fb0dde804608674a9860ee50f33e54708.json +0 -1
  75. xinference/web/ui/node_modules/.cache/babel-loader/ed57202cb79649bb716400436590245547df241988fc7c8e1d85d132299542d2.json +0 -1
  76. /xinference/web/ui/build/static/js/{main.b0936c54.js.LICENSE.txt → main.ad42919c.js.LICENSE.txt} +0 -0
  77. {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/LICENSE +0 -0
  78. {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/WHEEL +0 -0
  79. {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/entry_points.txt +0 -0
  80. {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/top_level.txt +0 -0
@@ -193,16 +193,14 @@ def _get_pad_param(seq_len_idx: int, pad_len: int) -> Tuple:
193
193
 
194
194
  def _merge_kv_cache(
195
195
  xinf_model_obj: "PytorchModel",
196
- past_kv: Tuple[Tuple[torch.Tensor]],
197
- new_kv: Tuple[Tuple[torch.Tensor]],
198
- ):
196
+ past_cache: DynamicCache,
197
+ new_cache: DynamicCache,
198
+ ) -> DynamicCache:
199
199
  from torch.nn.functional import pad
200
200
 
201
201
  _, seq_len_idx = xinf_model_obj.get_batch_size_and_seq_len_indexes_from_kv()
202
- past_cache = DynamicCache.from_legacy_cache(past_kv)
203
- new_cache = DynamicCache.from_legacy_cache(new_kv)
204
- past_seq_len = past_kv[0][0].shape[seq_len_idx]
205
- new_seq_len = new_kv[0][0].shape[seq_len_idx]
202
+ past_seq_len = past_cache[0][0].shape[seq_len_idx]
203
+ new_seq_len = new_cache[0][0].shape[seq_len_idx]
206
204
  if past_seq_len != new_seq_len:
207
205
  padding_target = new_cache if past_seq_len > new_seq_len else past_cache
208
206
  padding_len = abs(past_seq_len - new_seq_len)
@@ -219,8 +217,12 @@ def _merge_kv_cache(
219
217
  for idx in range(len(past_cache)):
220
218
  k1, k2 = new_cache.key_cache[idx], past_cache.key_cache[idx]
221
219
  v1, v2 = new_cache.value_cache[idx], past_cache.value_cache[idx]
222
- ret_kv.update(torch.cat((k1, k2), 0), torch.cat((v1, v2), 0), idx)
223
- return ret_kv.to_legacy_cache()
220
+ ret_kv.update(
221
+ torch.cat((k1, k2), 0).contiguous(),
222
+ torch.cat((v1, v2), 0).contiguous(),
223
+ idx,
224
+ )
225
+ return ret_kv
224
226
 
225
227
 
226
228
  def get_batch_size_and_seq_len_from_kv_cache(kv, xinf_model_obj: "PytorchModel"):
@@ -228,6 +230,15 @@ def get_batch_size_and_seq_len_from_kv_cache(kv, xinf_model_obj: "PytorchModel")
228
230
  return kv[0][0].shape[bs_idx], kv[0][0].shape[seq_len_idx] + 1
229
231
 
230
232
 
233
+ def convert_to_cache_cls(cache) -> DynamicCache:
234
+ """
235
+ Compatible with some old models
236
+ """
237
+ if isinstance(cache, tuple):
238
+ return DynamicCache.from_legacy_cache(cache)
239
+ return cache
240
+
241
+
231
242
  @torch.inference_mode()
232
243
  def _batch_inference_one_step_internal(
233
244
  xinf_model_obj: "PytorchModel",
@@ -269,7 +280,7 @@ def _batch_inference_one_step_internal(
269
280
  out = model(**prefill_kws, use_cache=True)
270
281
 
271
282
  logits = out.logits
272
- past_key_values = out.past_key_values
283
+ past_key_values = convert_to_cache_cls(out.past_key_values)
273
284
 
274
285
  for i, r in enumerate(prefill_reqs):
275
286
  (
@@ -317,7 +328,7 @@ def _batch_inference_one_step_internal(
317
328
  )
318
329
  out = model(**inf_kws, use_cache=True, past_key_values=past_key_values)
319
330
  logits = out.logits
320
- past_key_values = out.past_key_values
331
+ past_key_values = convert_to_cache_cls(out.past_key_values)
321
332
 
322
333
  for i, r in enumerate(valid_req_list):
323
334
  (
@@ -11,16 +11,28 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
14
15
  import base64
15
16
  import functools
16
17
  import json
17
18
  import logging
18
19
  import os
20
+ import re
19
21
  import time
20
22
  import typing
21
23
  import uuid
22
24
  from io import BytesIO
23
- from typing import AsyncGenerator, Dict, Iterator, List, Optional, Tuple, cast
25
+ from typing import (
26
+ Any,
27
+ AsyncGenerator,
28
+ Dict,
29
+ Iterable,
30
+ Iterator,
31
+ List,
32
+ Optional,
33
+ Tuple,
34
+ cast,
35
+ )
24
36
 
25
37
  import requests
26
38
  from PIL import Image
@@ -42,6 +54,7 @@ from .llm_family import (
42
54
  _get_cache_dir,
43
55
  get_cache_status,
44
56
  )
57
+ from .reasoning_parsers.abs_reasoning_parsers import ReasoningParser
45
58
 
46
59
  logger = logging.getLogger(__name__)
47
60
 
@@ -64,6 +77,18 @@ LLAMA3_TOOL_CALL_FAMILY = [
64
77
  "llama-3.1-instruct",
65
78
  ]
66
79
 
80
+ DEEPSEEK_TOOL_CALL_FAMILY = [
81
+ "deepseek-r1-distill-qwen",
82
+ "deepseek-r1-distill-llama",
83
+ ]
84
+
85
+ TOOL_CALL_FAMILY = (
86
+ QWEN_TOOL_CALL_FAMILY
87
+ + GLM4_TOOL_CALL_FAMILY
88
+ + LLAMA3_TOOL_CALL_FAMILY
89
+ + DEEPSEEK_TOOL_CALL_FAMILY
90
+ )
91
+
67
92
  QWEN_TOOL_CALL_SYMBOLS = ["<tool_call>", "</tool_call>"]
68
93
 
69
94
 
@@ -297,6 +322,7 @@ class ChatModelMixin:
297
322
  def _to_chat_completion_chunks(
298
323
  cls,
299
324
  chunks: Iterator[CompletionChunk],
325
+ reasoning_parse: Optional[ReasoningParser] = None,
300
326
  ) -> Iterator[ChatCompletionChunk]:
301
327
  for i, chunk in enumerate(chunks):
302
328
  if i == 0:
@@ -308,41 +334,102 @@ class ChatModelMixin:
308
334
  else:
309
335
  yield cls._to_chat_completion_chunk(chunk)
310
336
 
337
+ @classmethod
338
+ def _tools_to_messages_for_deepseek(
339
+ cls, messages: List[dict], tools: Iterable[dict]
340
+ ):
341
+ # deepseek integrates tool calls into messages
342
+ # we follow the chat template rule to integrate tools into messages
343
+ tool_call_message: Dict[str, Any] = {
344
+ "role": "assistant",
345
+ "content": None,
346
+ "tool_calls": [],
347
+ }
348
+
349
+ for tool in tools:
350
+ function_name = tool["function"]["name"]
351
+ parameters = tool["function"].get("parameters", {}).get("properties", {})
352
+ function_args_json = json.dumps(parameters)
353
+
354
+ tool_call_message["tool_calls"].append(
355
+ {
356
+ "type": "function",
357
+ "function": {
358
+ "name": function_name,
359
+ "arguments": function_args_json,
360
+ },
361
+ }
362
+ )
363
+
364
+ messages.append(tool_call_message)
365
+
311
366
  @classmethod
312
367
  async def _async_to_chat_completion_chunks(
313
368
  cls,
314
369
  chunks: AsyncGenerator[CompletionChunk, None],
370
+ reasoning_parser: Optional[ReasoningParser] = None,
315
371
  ) -> AsyncGenerator[ChatCompletionChunk, None]:
316
372
  i = 0
373
+ previous_text = ""
374
+ current_text = ""
317
375
  async for chunk in chunks:
318
376
  if i == 0:
319
- yield cls._get_first_chat_completion_chunk(chunk)
320
- # usage
321
- choices = chunk.get("choices")
322
- if not choices:
323
- yield cls._get_final_chat_completion_chunk(chunk)
377
+ chunk = cls._get_first_chat_completion_chunk(chunk)
378
+ elif not chunk.get("choices"):
379
+ # usage
380
+ chunk = cls._get_final_chat_completion_chunk(chunk)
324
381
  else:
325
- yield cls._to_chat_completion_chunk(chunk)
382
+ chunk = cls._to_chat_completion_chunk(chunk)
383
+ if reasoning_parser is not None:
384
+ choices = chunk.get("choices")
385
+ for choice in choices:
386
+ delta = choice.get("delta")
387
+ if not delta:
388
+ continue
389
+ current_text = previous_text + delta.get("content")
390
+ choice[
391
+ "delta"
392
+ ] = reasoning_parser.extract_reasoning_content_streaming(
393
+ previous_text=previous_text,
394
+ current_text=current_text,
395
+ delta=delta,
396
+ )
397
+ previous_text = current_text
398
+ yield chunk
326
399
  i += 1
327
400
 
328
401
  @staticmethod
329
- def _to_chat_completion(completion: Completion) -> ChatCompletion:
330
- return {
331
- "id": "chat" + completion["id"],
332
- "object": "chat.completion",
333
- "created": completion["created"],
334
- "model": completion["model"],
335
- "choices": [
402
+ def _to_chat_completion(
403
+ completion: Completion, reasoning_parser: Optional[ReasoningParser] = None
404
+ ) -> ChatCompletion:
405
+ choices = []
406
+ for i, choice in enumerate(completion["choices"]):
407
+ content = choice["text"]
408
+ reasoning_content = None
409
+
410
+ if reasoning_parser is not None:
411
+ reasoning_content, content = reasoning_parser.extract_reasoning_content(
412
+ choice
413
+ )
414
+
415
+ message = {"role": "assistant", "content": content}
416
+
417
+ # add only reasoning_content is None
418
+ if reasoning_content is not None:
419
+ message["reasoning_content"] = reasoning_content
420
+
421
+ choices.append(
336
422
  {
337
423
  "index": i,
338
- "message": {
339
- "role": "assistant",
340
- "content": choice["text"],
341
- },
424
+ "message": message,
342
425
  "finish_reason": choice["finish_reason"],
343
426
  }
344
- for i, choice in enumerate(completion["choices"])
345
- ],
427
+ )
428
+ return {
429
+ "id": "chat" + completion["id"],
430
+ "object": "chat.completion",
431
+ "created": completion["created"],
432
+ "model": choices,
346
433
  "usage": completion["usage"],
347
434
  }
348
435
 
@@ -401,6 +488,61 @@ class ChatModelMixin:
401
488
  except Exception:
402
489
  return [(text, None, None)]
403
490
 
491
+ @classmethod
492
+ def _eval_deepseek_chat_arguments(cls, c) -> List[Tuple]:
493
+ """
494
+ Parses tool calls from deepseek-r1 format and removes duplicates.
495
+
496
+ Returns:
497
+ List[Tuple[Optional[str], Optional[str], Optional[dict]]]
498
+ - (None, function_name, arguments) if successfully parsed.
499
+ - (content, None, None) if parsing failed (content is raw JSON text).
500
+
501
+ Example input:
502
+ <|tool▁call|>get_current_weather
503
+ ```json
504
+ {"location": "tokyo", "unit": "fahrenheit"}
505
+ ```
506
+
507
+ Output:
508
+ [
509
+ (None, "get_current_weather", {"location": "tokyo", "unit": "fahrenheit"})
510
+ ]
511
+ """
512
+
513
+ text = c["choices"][0]["text"]
514
+
515
+ pattern = r"<|tool▁call|>(\w+)\s*```json\s*(.*?)\s*```"
516
+ matches = re.findall(pattern, text, re.DOTALL)
517
+
518
+ if not matches:
519
+ return [(text, None, None)]
520
+
521
+ tool_calls = set() # Used for deduplication
522
+ results = []
523
+
524
+ for function_name, args_json in matches:
525
+ try:
526
+ arguments = json.loads(args_json)
527
+ # Convert dictionary to frozenset for deduplication
528
+ arguments_hashable = frozenset(arguments.items())
529
+ tool_call_tuple = (None, function_name, arguments)
530
+ except json.JSONDecodeError:
531
+ tool_call_tuple = (
532
+ args_json,
533
+ None,
534
+ None,
535
+ ) # If parsing fails, treat as raw content
536
+ arguments_hashable = None # No need for hashing
537
+
538
+ # Avoid duplicate entries
539
+ dedup_key = (function_name, arguments_hashable)
540
+ if dedup_key not in tool_calls:
541
+ tool_calls.add(dedup_key)
542
+ results.append(tool_call_tuple)
543
+
544
+ return results
545
+
404
546
  @classmethod
405
547
  def _eval_tool_arguments(cls, model_family, c):
406
548
  family = model_family.model_family or model_family.model_name
@@ -410,6 +552,8 @@ class ChatModelMixin:
410
552
  result = cls._eval_qwen_chat_arguments(c)
411
553
  elif family in LLAMA3_TOOL_CALL_FAMILY:
412
554
  result = cls._eval_llama3_chat_arguments(c)
555
+ elif family in DEEPSEEK_TOOL_CALL_FAMILY:
556
+ result = cls._eval_deepseek_chat_arguments(c)
413
557
  else:
414
558
  raise Exception(
415
559
  f"Model {model_family.model_name} is not support tool calls."
@@ -43,7 +43,10 @@ from ....types import (
43
43
  )
44
44
  from .. import LLM, LLMFamilyV1, LLMSpecV1
45
45
  from ..llm_family import CustomLLMFamilyV1
46
+ from ..reasoning_parsers import deepseek_r1_reasoning_parser # noqa: F401
47
+ from ..reasoning_parsers.abs_reasoning_parsers import ReasoningParserManager
46
48
  from ..utils import (
49
+ DEEPSEEK_TOOL_CALL_FAMILY,
47
50
  QWEN_TOOL_CALL_FAMILY,
48
51
  QWEN_TOOL_CALL_SYMBOLS,
49
52
  ChatModelMixin,
@@ -71,6 +74,7 @@ class VLLMModelConfig(TypedDict, total=False):
71
74
  limit_mm_per_prompt: Optional[Dict[str, int]]
72
75
  guided_decoding_backend: Optional[str]
73
76
  scheduling_policy: Optional[str]
77
+ reasoning_content: bool
74
78
 
75
79
 
76
80
  class VLLMGenerateConfig(TypedDict, total=False):
@@ -175,6 +179,8 @@ if VLLM_INSTALLED and vllm.__version__ >= "0.5.1":
175
179
  VLLM_SUPPORTED_CHAT_MODELS.append("deepseek-v2-chat")
176
180
  VLLM_SUPPORTED_CHAT_MODELS.append("deepseek-v2-chat-0628")
177
181
  VLLM_SUPPORTED_CHAT_MODELS.append("deepseek-v2.5")
182
+ VLLM_SUPPORTED_CHAT_MODELS.append("deepseek-v3")
183
+ VLLM_SUPPORTED_CHAT_MODELS.append("deepseek-r1")
178
184
 
179
185
  if VLLM_INSTALLED and vllm.__version__ >= "0.5.3":
180
186
  VLLM_SUPPORTED_CHAT_MODELS.append("gemma-2-it")
@@ -185,9 +191,11 @@ if VLLM_INSTALLED and vllm.__version__ > "0.5.3":
185
191
  VLLM_SUPPORTED_MODELS.append("llama-3.1")
186
192
  VLLM_SUPPORTED_CHAT_MODELS.append("llama-3.1-instruct")
187
193
  VLLM_SUPPORTED_CHAT_MODELS.append("llama-3.3-instruct")
194
+ VLLM_SUPPORTED_CHAT_MODELS.append("deepseek-r1-distill-llama")
188
195
 
189
196
  if VLLM_INSTALLED and vllm.__version__ >= "0.6.1":
190
197
  VLLM_SUPPORTED_VISION_MODEL_LIST.append("internvl2")
198
+ VLLM_SUPPORTED_VISION_MODEL_LIST.append("InternVL2.5")
191
199
 
192
200
  if VLLM_INSTALLED and vllm.__version__ >= "0.6.2":
193
201
  VLLM_SUPPORTED_CHAT_MODELS.append("minicpm3-4b")
@@ -198,6 +206,15 @@ if VLLM_INSTALLED and vllm.__version__ >= "0.6.3":
198
206
  VLLM_SUPPORTED_VISION_MODEL_LIST.append("qwen2-vl-instruct")
199
207
  VLLM_SUPPORTED_VISION_MODEL_LIST.append("QvQ-72B-Preview")
200
208
 
209
+ if VLLM_INSTALLED and vllm.__version__ >= "0.7.0":
210
+ VLLM_SUPPORTED_CHAT_MODELS.append("internlm3-instruct")
211
+
212
+ if VLLM_INSTALLED and vllm.__version__ >= "0.7.2":
213
+ VLLM_SUPPORTED_VISION_MODEL_LIST.append("qwen2.5-vl-instruct")
214
+
215
+ if VLLM_INSTALLED and vllm.__version__ >= "0.7.3":
216
+ VLLM_SUPPORTED_CHAT_MODELS.append("qwen-2.5-instruct-1m")
217
+
201
218
 
202
219
  class VLLMModel(LLM):
203
220
  def __init__(
@@ -226,6 +243,7 @@ class VLLMModel(LLM):
226
243
  self.lora_modules = peft_model
227
244
  self.lora_requests: List[LoRARequest] = []
228
245
  self._xavier_config = None
246
+ self.reasoning_parser = None
229
247
 
230
248
  def set_xavier_config(self, value: Optional[Dict]):
231
249
  self._xavier_config = value # type: ignore
@@ -254,6 +272,16 @@ class VLLMModel(LLM):
254
272
  multiprocessing.set_start_method("fork", force=True)
255
273
 
256
274
  self._model_config = self._sanitize_model_config(self._model_config)
275
+ reasoning_content = self._model_config.pop("reasoning_content")
276
+
277
+ # Initialize reasoning parser if model has reasoning ability
278
+ if "reasoning" in self.model_family.model_ability and reasoning_content:
279
+ module_name = self.model_family.model_family or self.model_family.model_name
280
+ self.reasoning_parser = ReasoningParserManager.get_parser(module_name)
281
+ self.reasoning_parser = self.reasoning_parser(
282
+ self.model_family.reasoning_start_tag,
283
+ self.model_family.reasoning_end_tag,
284
+ )
257
285
  if self.lora_modules is None:
258
286
  self.lora_requests = []
259
287
  else:
@@ -360,6 +388,7 @@ class VLLMModel(LLM):
360
388
  model_config.setdefault("quantization", None)
361
389
  model_config.setdefault("max_model_len", None)
362
390
  model_config.setdefault("guided_decoding_backend", "outlines")
391
+ model_config.setdefault("reasoning_content", False)
363
392
  # Add scheduling policy if vLLM version is 0.6.3 or higher
364
393
  if vllm.__version__ >= "0.6.3":
365
394
  model_config.setdefault("scheduling_policy", "fcfs")
@@ -807,8 +836,11 @@ class VLLMChatModel(VLLMModel, ChatModelMixin):
807
836
  tools = generate_config.pop("tools", []) if generate_config else None
808
837
  model_family = self.model_family.model_family or self.model_family.model_name
809
838
  full_context_kwargs = {}
810
- if tools and model_family in QWEN_TOOL_CALL_FAMILY:
811
- full_context_kwargs["tools"] = tools
839
+ if tools:
840
+ if model_family in QWEN_TOOL_CALL_FAMILY:
841
+ full_context_kwargs["tools"] = tools
842
+ elif model_family in DEEPSEEK_TOOL_CALL_FAMILY:
843
+ self._tools_to_messages_for_deepseek(messages, tools)
812
844
  assert self.model_family.chat_template is not None
813
845
  full_prompt = self.get_full_context(
814
846
  messages, self.model_family.chat_template, **full_context_kwargs
@@ -824,7 +856,7 @@ class VLLMChatModel(VLLMModel, ChatModelMixin):
824
856
  assert isinstance(agen, AsyncGenerator)
825
857
  if tools:
826
858
  return self._async_to_tool_completion_chunks(agen)
827
- return self._async_to_chat_completion_chunks(agen)
859
+ return self._async_to_chat_completion_chunks(agen, self.reasoning_parser)
828
860
  else:
829
861
  c = await self.async_generate(
830
862
  full_prompt, generate_config, request_id=request_id
@@ -832,7 +864,7 @@ class VLLMChatModel(VLLMModel, ChatModelMixin):
832
864
  assert not isinstance(c, AsyncGenerator)
833
865
  if tools:
834
866
  return self._tool_calls_completion(self.model_family, self.model_uid, c)
835
- return self._to_chat_completion(c)
867
+ return self._to_chat_completion(c, self.reasoning_parser)
836
868
 
837
869
 
838
870
  class VLLMVisionModel(VLLMModel, ChatModelMixin):
@@ -14,7 +14,7 @@
14
14
  from typing import TYPE_CHECKING, List, Optional, Set, Tuple, Union
15
15
 
16
16
  import xoscar as xo
17
- from vllm.executor.gpu_executor import GPUExecutorAsync
17
+ from vllm.executor.mp_distributed_executor import MultiprocessingDistributedExecutor
18
18
  from vllm.model_executor.layers.sampler import SamplerOutput
19
19
  from vllm.sequence import ExecuteModelRequest, PoolerOutput
20
20
  from vllm.utils import is_pin_memory_available
@@ -24,7 +24,7 @@ if TYPE_CHECKING:
24
24
  from .scheduler import XavierScheduler
25
25
 
26
26
 
27
- class XavierExecutor(GPUExecutorAsync):
27
+ class XavierExecutor(MultiprocessingDistributedExecutor):
28
28
  scheduler: Optional[List["XavierScheduler"]] = None
29
29
 
30
30
  def _init_executor(self) -> None:
@@ -21,7 +21,7 @@ import xoscar as xo
21
21
  from vllm.config import CacheConfig, LoRAConfig, SchedulerConfig
22
22
  from vllm.core.block.interfaces import Block
23
23
  from vllm.core.interfaces import BlockSpaceManager
24
- from vllm.core.scheduler import Scheduler, SchedulerOutputs
24
+ from vllm.core.scheduler import ScheduledSequenceGroup, Scheduler, SchedulerOutputs
25
25
  from vllm.sequence import (
26
26
  SequenceData,
27
27
  SequenceGroup,
@@ -216,7 +216,7 @@ class XavierScheduler(Scheduler):
216
216
  """Xinference Change!!!
217
217
  Additional data structures required by Xavier.
218
218
  """
219
- scheduled_seq_groups = []
219
+ scheduled_seq_groups: List[ScheduledSequenceGroup] = []
220
220
  has_transferring = False
221
221
 
222
222
  # Create input data structures.
@@ -288,7 +288,7 @@ class XavierScheduler(Scheduler):
288
288
  has_transferring = True
289
289
  continue
290
290
  else:
291
- scheduled_seq_groups.append(seq_group)
291
+ scheduled_seq_groups.append(scheduled_seq_group)
292
292
 
293
293
  if self.cache_config.enable_prefix_caching:
294
294
  common_computed_block_nums = (
@@ -227,7 +227,7 @@ class Conversation:
227
227
 
228
228
  return ret
229
229
  elif self.sep_style == SeparatorStyle.INTERNVL_ZH:
230
- seps = [self.sep, self.sep2]
230
+ seps = [self.sep2, self.sep]
231
231
  ret = self.system_message + seps[0]
232
232
  for i, (role, message) in enumerate(self.messages):
233
233
  if message:
@@ -330,6 +330,19 @@ def get_conv_template(name: str) -> Conversation:
330
330
  return conv_templates[name].copy()
331
331
 
332
332
 
333
+ # InternVL-Chat-V1-1 template
334
+ register_conv_template(
335
+ Conversation(
336
+ name='internvl_zh',
337
+ system_template='',
338
+ roles=('<human>', '<bot>'),
339
+ sep_style=SeparatorStyle.INTERNVL_ZH,
340
+ sep='</s>',
341
+ sep2=' ',
342
+ )
343
+ )
344
+
345
+
333
346
  # Both Hermes-2 and internlm2-chat are chatml-format conversation templates. The difference
334
347
  # is that during training, the preprocessing function for the Hermes-2 template doesn't add
335
348
  # <s> at the beginning of the tokenized sequence, while the internlm2-chat template does.
@@ -344,12 +357,6 @@ register_conv_template(
344
357
  roles=('<|im_start|>user\n', '<|im_start|>assistant\n'),
345
358
  sep_style=SeparatorStyle.MPT,
346
359
  sep='<|im_end|>',
347
- stop_token_ids=[
348
- 2,
349
- 6,
350
- 7,
351
- 8,
352
- ],
353
360
  stop_str='<|endoftext|>',
354
361
  )
355
362
  )
@@ -365,11 +372,6 @@ register_conv_template(
365
372
  roles=('<|im_start|>user\n', '<|im_start|>assistant\n'),
366
373
  sep_style=SeparatorStyle.MPT,
367
374
  sep='<|im_end|>',
368
- stop_token_ids=[
369
- 2,
370
- 92543,
371
- 92542
372
- ]
373
375
  )
374
376
  )
375
377
 
@@ -384,10 +386,17 @@ register_conv_template(
384
386
  roles=('<|user|>\n', '<|assistant|>\n'),
385
387
  sep_style=SeparatorStyle.MPT,
386
388
  sep='<|end|>',
387
- stop_token_ids=[
388
- 2,
389
- 32000,
390
- 32007
391
- ]
392
389
  )
393
390
  )
391
+
392
+
393
+ register_conv_template(
394
+ Conversation(
395
+ name='internvl2_5',
396
+ system_template='<|im_start|>system\n{system_message}',
397
+ system_message='你是书生·万象,英文名是InternVL,是由上海人工智能实验室、清华大学及多家合作单位联合开发的多模态大语言模型。',
398
+ roles=('<|im_start|>user\n', '<|im_start|>assistant\n'),
399
+ sep_style=SeparatorStyle.MPT,
400
+ sep='<|im_end|>\n',
401
+ )
402
+ )
xinference/types.py CHANGED
@@ -177,6 +177,7 @@ class Completion(TypedDict):
177
177
 
178
178
  class ChatCompletionMessage(TypedDict):
179
179
  role: str
180
+ reasoning_content: NotRequired[str]
180
181
  content: Optional[str]
181
182
  user: NotRequired[str]
182
183
  tool_calls: NotRequired[List]
@@ -199,6 +200,7 @@ class ChatCompletion(TypedDict):
199
200
 
200
201
  class ChatCompletionChunkDelta(TypedDict):
201
202
  role: NotRequired[str]
203
+ reasoning_content: NotRequired[str]
202
204
  content: NotRequired[str]
203
205
  tool_calls: NotRequired[List[ToolCalls]]
204
206
 
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "files": {
3
- "main.css": "./static/css/main.51a587ff.css",
4
- "main.js": "./static/js/main.b0936c54.js",
3
+ "main.css": "./static/css/main.f8177338.css",
4
+ "main.js": "./static/js/main.ad42919c.js",
5
5
  "static/media/icon.webp": "./static/media/icon.4603d52c63041e5dfbfd.webp",
6
6
  "index.html": "./index.html",
7
- "main.51a587ff.css.map": "./static/css/main.51a587ff.css.map",
8
- "main.b0936c54.js.map": "./static/js/main.b0936c54.js.map"
7
+ "main.f8177338.css.map": "./static/css/main.f8177338.css.map",
8
+ "main.ad42919c.js.map": "./static/js/main.ad42919c.js.map"
9
9
  },
10
10
  "entrypoints": [
11
- "static/css/main.51a587ff.css",
12
- "static/js/main.b0936c54.js"
11
+ "static/css/main.f8177338.css",
12
+ "static/js/main.ad42919c.js"
13
13
  ]
14
14
  }
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./favicon.svg"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="manifest" href="./manifest.json"/><title>Xinference</title><script defer="defer" src="./static/js/main.b0936c54.js"></script><link href="./static/css/main.51a587ff.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./favicon.svg"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="manifest" href="./manifest.json"/><title>Xinference</title><script defer="defer" src="./static/js/main.ad42919c.js"></script><link href="./static/css/main.f8177338.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
@@ -0,0 +1,2 @@
1
+ .container{cursor:pointer;display:block}.container,.descriptionCard{border-radius:20px;height:300px;position:relative;width:300px}.descriptionCard{left:-1px;padding:20px;top:-1px}.cardTitle{display:flex;justify-content:space-between}.iconButtonBox{align-items:center;display:flex}.drawerCard{min-height:100%;padding:20px 80px 0;position:relative;width:60vw}.p{-webkit-line-clamp:4;-webkit-box-orient:vertical;display:-webkit-box;font-size:14px;overflow:hidden;padding:0 10px;text-overflow:ellipsis;word-break:break-word}.pasteText{color:#1976d2;cursor:pointer;font-size:18px!important;margin-inline:10px}.pasteText:hover{color:#1976d2b3}.copyToCommandLine{color:#1976d2;cursor:pointer;font-size:16px!important}.copyToCommandLine:hover{color:#1976d2b3}.formContainer{height:80%;overflow:scroll;padding:0 10px 160px}.buttonsContainer{align-items:center;bottom:50px;display:flex;justify-content:space-between;left:100px;position:absolute;right:100px}.buttonContainer{background-color:initial;border-width:0;width:45%}.buttonItem{border:1px solid #e5e7eb;border-radius:4px;cursor:pointer;padding:5px;width:100%}.buttonItem:hover{border-color:#888}.instructionText{color:#666;font-size:12px;font-style:italic;margin:30px 0;text-align:center}.iconRow{bottom:20px;justify-content:space-between;left:20px;position:absolute;right:20px}.iconItem,.iconRow{align-items:center;display:flex}.iconItem{flex-direction:column;margin:20px}.boldIconText{font-size:1.2em;font-weight:700}.muiIcon{font-size:1.5em}.smallText{font-size:.8em}.dialogBox{background-color:#fff;height:607px;margin:32px;overflow-x:scroll;width:1241px}.dialogTitle{color:#000;display:flex;justify-content:space-between;padding:20px 20px 7px}.dialogTitle-model_name{font-size:18px;font-weight:700}.pathBox{cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:160px}.pathBox2{width:300px}.empty{color:#555;font-size:20px;left:50%;position:absolute;top:30%;-webkit-transform:translate(-50%);transform:translate(-50%)}.deleteDialog{align-items:center;display:flex}.warningIcon{color:#ed6c02;margin-right:10px}.jsonDialog{background-color:#fff;border-radius:8px;color:#000;display:flex;flex-direction:column;padding:10px 30px}.jsonDialog-title{align-items:center;display:flex;justify-content:space-between;margin:10px 0 20px}.title-name{font-size:16px;font-weight:700}.main-box{height:500px;width:700px}.textarea-box{border:1px solid #ddd;border-radius:5px;color:#444;height:100%;padding:5px 10px;resize:none;width:100%}.but-box{display:flex;justify-content:end;margin-top:20px}.drawer{bottom:0;left:0;opacity:0;position:fixed;right:0;top:0;transition:visibility .3s ease,opacity .3s ease;visibility:hidden;z-index:1000}.drawer.open{opacity:1;visibility:visible}.drawer-overlay{background-color:rgba(0,0,0,.5);left:0;z-index:999}.drawer-content,.drawer-overlay{bottom:0;position:absolute;right:0;top:0}.drawer-content{background-color:#fff;box-shadow:-2px 0 10px rgba(0,0,0,.1);overflow-y:auto;-webkit-transform:translateX(100%);transform:translateX(100%);transition:-webkit-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease,-webkit-transform .3s ease;z-index:1000}.drawer.open .drawer-content{-webkit-transform:translateX(0);transform:translateX(0)}.copyText{color:#666;cursor:pointer;font-size:14px!important}.copyText:hover{color:#1976d2}.formBox{max-height:80vh;max-width:50vw;min-width:50vw;overflow:auto;padding:40px 20px 0 0;position:relative;transition:all .4s ease-in-out}.broaden{max-width:100%;min-width:100%;padding-right:0}.show-json{align-items:center;display:flex;right:60px;top:90px}.icon,.show-json{position:absolute}.icon{cursor:pointer;margin-left:20px;right:-40px}.icon:hover{color:#1976d2}.arrow{font-size:24px!important}.jsonBox{min-height:80vh;position:relative;transition:all .4s ease-in-out;width:100%}.hide{overflow:hidden;-webkit-transform:translate(30vw);transform:translate(30vw);width:0}.checkboxWrapper{align-items:center;display:flex;flex-wrap:wrap;width:100%}.jsonBox-header{align-items:center;display:flex;justify-content:space-between}.jsonBox-title{font-weight:700;line-height:40px}.textarea{background-color:initial;border:1px solid #ddd;border-radius:5px;color:#444;height:calc(100% - 40px);padding:5px 10px;resize:none;width:100%}.addBtn{margin-left:20px!important}.item{border:1px solid #ddd;border-radius:10px;margin:10px 50px 0;overflow:hidden;padding:20px;position:relative}.item:hover .deleteBtn{-webkit-transform:translateX(-50px);transform:translateX(-50px)}.deleteBtn{background-color:#1976d2;border-radius:25px;height:50px;line-height:70px;position:absolute;right:20px;text-align:center;top:calc(50% - 25px);-webkit-transform:translateX(80px);transform:translateX(80px);transition:all .3s ease-in-out;width:50px}.deleteBtn:hover{box-shadow:0 0 10px #aaa;cursor:pointer}.deleteIcon{color:#fff;font-size:28px!important}.chat_template_box{align-items:start;display:flex;gap:10px}.chat_template_test{width:30%}.chat_template_test_mainBox{border:1px solid #ccc;border-radius:4px;height:137px;overflow:scroll;padding:10px}.chat_template_test_tip{color:rgba(0,0,0,.6);font-size:10px;margin:4px 14px 0}.test_res_box{border:1px solid #ddd;border-radius:4px;margin-top:5px;min-height:55px;padding:10px}.css-19qh8xo-MuiInputBase-input-MuiOutlinedInput-input.Mui-disabled{-webkit-text-fill-color:#000!important}
2
+ /*# sourceMappingURL=main.f8177338.css.map*/
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/css/main.f8177338.css","mappings":"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","sources":["scenes/launch_model/styles/modelCardStyle.css","components/copyComponent/style.css","scenes/register_model/styles/registerModelStyle.css"],"sourcesContent":[".container {\n display: block;\n position: relative;\n width: 300px;\n height: 300px;\n cursor: pointer;\n border-radius: 20px;\n}\n.descriptionCard {\n position: relative;\n top: -1px;\n left: -1px;\n width: 300px;\n height: 300px;\n padding: 20px;\n border-radius: 20px;\n}\n.cardTitle {\n display: flex;\n justify-content: space-between;\n}\n.iconButtonBox {\n display: flex;\n align-items: center;\n}\n.drawerCard {\n position: relative;\n padding: 20px 80px 0;\n min-height: 100%;\n width: 60vw;\n}\n.p {\n display: -webkit-box;\n -webkit-line-clamp: 4;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n font-size: 14px;\n padding: 0px 10px;\n}\n.pasteText {\n font-size: 18px !important;\n color: #1976d2;\n cursor: pointer;\n margin-inline: 10px;\n}\n.pasteText:hover {\n color: #1976d2b3;\n}\n.copyToCommandLine {\n font-size: 16px !important;\n color: #1976d2;\n cursor: pointer;\n}\n.copyToCommandLine:hover {\n color: #1976d2b3;\n}\n.formContainer {\n height: 80%;\n overflow: scroll;\n padding: 0 10px;\n padding-bottom: 160px;\n}\n.buttonsContainer {\n position: absolute;\n bottom: 50px;\n left: 100px;\n right: 100px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.buttonContainer {\n width: 45%;\n border-width: 0px;\n background-color: transparent;\n}\n.buttonItem {\n cursor: pointer;\n width: 100%;\n padding: 5px;\n border-radius: 4px;\n border: 1px solid #e5e7eb;\n border-width: 1px;\n border-color: #e5e7eb;\n}\n.buttonItem:hover {\n border-color: #888;\n}\n.instructionText {\n font-size: 12px;\n color: #666666;\n font-style: italic;\n margin: 30px 0;\n text-align: center;\n}\n.iconRow {\n position: absolute;\n bottom: 20px;\n left: 20px;\n right: 20px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.iconItem {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: 20px;\n}\n.boldIconText {\n font-weight: bold;\n font-size: 1.2em;\n}\n.muiIcon {\n font-size: 1.5em;\n}\n.smallText {\n font-size: 0.8em;\n}\n.dialogBox {\n width: 1241px;\n height: 607px;\n background-color: #fff;\n margin: 32px;\n overflow-x: scroll;\n}\n.dialogTitle {\n display: flex;\n justify-content: space-between;\n padding: 20px 20px 7px;\n color: #000;\n}\n.dialogTitle-model_name {\n font-size: 18px;\n font-weight: 700;\n}\n.pathBox {\n width: 160px;\n cursor: pointer;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.pathBox2 {\n width: 300px;\n}\n.empty {\n position: absolute;\n left: 50%;\n top: 30%;\n font-size: 20px;\n color: #555;\n transform: translate(-50%, 0);\n}\n.deleteDialog {\n display: flex;\n align-items: center;\n}\n.warningIcon {\n margin-right: 10px;\n color: rgb(237, 108, 2);\n}\n.jsonDialog {\n display: flex;\n flex-direction: column;\n padding: 10px 30px;\n background-color: #fff;\n color: #000;\n border-radius: 8px;\n}\n.jsonDialog-title {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin: 10px 0 20px 0;\n}\n.title-name {\n font-size: 16px;\n font-weight: 700;\n}\n.main-box {\n width: 700px;\n height: 500px;\n}\n.textarea-box {\n width: 100%;\n height: 100%;\n padding: 5px 10px;\n border: 1px solid #ddd;\n border-radius: 5px;\n resize: none;\n color: #444;\n}\n.but-box {\n display: flex;\n justify-content: end;\n margin-top: 20px;\n}\n.drawer {\n z-index: 1000;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n visibility: hidden;\n opacity: 0;\n transition: visibility 0.3s ease, opacity 0.3s ease;\n}\n.drawer.open {\n visibility: visible;\n opacity: 1;\n}\n.drawer-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 999;\n}\n.drawer-content {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n background-color: white;\n z-index: 1000;\n box-shadow: -2px 0 10px rgba(0, 0, 0, 0.1);\n transition: transform 0.3s ease;\n transform: translateX(100%);\n overflow-y: auto;\n}\n.drawer.open .drawer-content {\n transform: translateX(0);\n}\n",".copyText {\n font-size: 14px !important;\n color: #666;\n cursor: pointer;\n}\n\n.copyText:hover {\n color: #1976d2;\n}\n",".formBox {\n position: relative;\n max-width: 50vw;\n min-width: 50vw;\n max-height: 80vh;\n overflow: auto;\n padding: 40px 20px 0 0;\n transition: all 0.4s ease-in-out;\n}\n\n.broaden {\n max-width: 100%;\n min-width: 100%;\n padding-right: 0;\n}\n\n.show-json {\n display: flex;\n align-items: center;\n position: absolute;\n top: 90px;\n right: 60px;\n}\n\n.icon {\n position: absolute;\n right: -40px;\n cursor: pointer;\n margin-left: 20px;\n}\n\n.icon:hover {\n color: #1976d2;\n}\n\n.arrow {\n font-size: 24px !important;\n}\n\n.jsonBox {\n position: relative;\n min-height: 80vh;\n width: 100%;\n transition: all 0.4s ease-in-out;\n}\n\n.hide {\n width: 0;\n transform: translate(30vw, 0);\n overflow: hidden;\n}\n\n.checkboxWrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n width: 100%;\n}\n\n.jsonBox-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.jsonBox-title {\n line-height: 40px;\n font-weight: 700;\n}\n\n.textarea {\n width: 100%;\n height: calc(100% - 40px);\n padding: 5px 10px;\n border: 1px solid #ddd;\n border-radius: 5px;\n resize: none;\n color: #444;\n background-color: transparent;\n}\n\n.addBtn {\n margin-left: 20px !important;\n}\n\n.item {\n position: relative;\n border: 1px solid #ddd;\n margin: 10px 50px 0;\n padding: 20px;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.item:hover .deleteBtn {\n transform: translateX(-50px);\n}\n\n.deleteBtn {\n position: absolute;\n right: 20px;\n top: calc(50% - 25px);\n width: 50px;\n height: 50px;\n transform: translateX(80px);\n text-align: center;\n line-height: 70px;\n border-radius: 25px;\n background-color: #1976d2;\n transition: all 0.3s ease-in-out;\n}\n\n.deleteBtn:hover {\n cursor: pointer;\n box-shadow: 0 0 10px #aaa;\n}\n\n.deleteIcon {\n font-size: 28px !important;\n color: #fff;\n}\n\n.chat_template_box {\n display: flex;\n align-items: start;\n gap: 10px;\n}\n\n.chat_template_test {\n width: 30%;\n}\n\n.chat_template_test_mainBox {\n height: 137px;\n padding: 10px;\n border: 1px solid #ccc;\n border-radius: 4px;\n overflow: scroll;\n}\n\n.chat_template_test_tip {\n font-size: 10px;\n margin: 4px 14px 0;\n color: rgba(0, 0, 0, 0.6);\n}\n\n.test_res_box {\n border: 1px solid #ddd;\n min-height: 55px;\n padding: 10px;\n margin-top: 5px;\n border-radius: 4px;\n}\n\n.css-19qh8xo-MuiInputBase-input-MuiOutlinedInput-input.Mui-disabled {\n -webkit-text-fill-color: #000 !important;\n}\n"],"names":[],"sourceRoot":""}