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.
- xinference/_version.py +3 -3
- xinference/api/restful_api.py +4 -7
- xinference/client/handlers.py +3 -0
- xinference/client/restful/restful_client.py +9 -1
- xinference/core/model.py +19 -0
- xinference/core/resource.py +7 -1
- xinference/core/scheduler.py +4 -7
- xinference/core/status_guard.py +1 -0
- xinference/core/supervisor.py +228 -19
- xinference/core/utils.py +1 -29
- xinference/core/worker.py +28 -2
- xinference/deploy/cmdline.py +33 -3
- xinference/deploy/local.py +2 -1
- xinference/deploy/test/test_cmdline.py +32 -0
- xinference/device_utils.py +43 -1
- xinference/model/audio/core.py +5 -0
- xinference/model/audio/kokoro.py +122 -0
- xinference/model/audio/model_spec.json +8 -0
- xinference/model/audio/model_spec_modelscope.json +9 -0
- xinference/model/image/stable_diffusion/core.py +15 -6
- xinference/model/llm/llama_cpp/core.py +21 -14
- xinference/model/llm/llm_family.json +866 -46
- xinference/model/llm/llm_family.py +7 -2
- xinference/model/llm/llm_family_modelscope.json +873 -16
- xinference/model/llm/mlx/core.py +11 -3
- xinference/model/llm/reasoning_parsers/__init__.py +13 -0
- xinference/model/llm/reasoning_parsers/abs_reasoning_parsers.py +98 -0
- xinference/model/llm/reasoning_parsers/deepseek_r1_reasoning_parser.py +140 -0
- xinference/model/llm/sglang/core.py +99 -11
- xinference/model/llm/transformers/core.py +9 -1
- xinference/model/llm/transformers/intern_vl.py +23 -14
- xinference/model/llm/transformers/qwen2_audio.py +3 -1
- xinference/model/llm/transformers/qwen2_vl.py +20 -3
- xinference/model/llm/transformers/utils.py +22 -11
- xinference/model/llm/utils.py +164 -20
- xinference/model/llm/vllm/core.py +36 -4
- xinference/model/llm/vllm/xavier/executor.py +2 -2
- xinference/model/llm/vllm/xavier/scheduler.py +3 -3
- xinference/thirdparty/internvl/conversation.py +26 -17
- xinference/types.py +2 -0
- xinference/web/ui/build/asset-manifest.json +6 -6
- xinference/web/ui/build/index.html +1 -1
- xinference/web/ui/build/static/css/main.f8177338.css +2 -0
- xinference/web/ui/build/static/css/main.f8177338.css.map +1 -0
- xinference/web/ui/build/static/js/main.ad42919c.js +3 -0
- xinference/web/ui/build/static/js/main.ad42919c.js.map +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/074a42304bbbaa79e1bfc3b28502457a390df55708de9006f4cc8e35c60aea87.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/0acb065326560592b10888234242f94f67efe28458b90f273d4d4fba9daa0cd2.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/279ace390216236a82b3d8995c78eca4d637ac9a523e9f521a2d9c76607a43d7.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/630a7bd592596cc6e291fc32238ce7c08238038a64ed8ccee0eb0c13c9902910.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/6cb9f6c62ab4042f0b11c5d75e51187188e9d6f5f08b1d63e796e051bafdb457.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/8f9af2979e45d4648f0cfae108363e58ee421c29a9d4e7329b6f06d9adfd4133.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/914c33e91c1012e3bcd3e96f3a25884cbef148290632d0266dab972b8cc1e95f.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/9c8b1a86e7c65b2b2599a205e30920652d6c2105f926508ef5bcf29a3ef4ce76.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/b7939cd3a48adf12fccfdd0803019b5cc235ff7de3a297dae70ce635e0eea13e.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/efe7cd132c27a8f9fd5352a394c491fd5fb0da0348cf9fcbd923164a32365eab.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/f04f666b77b44d7be3e16034d6b0074de2ba9c254f1fae15222b3148608fa8b3.json +1 -0
- xinference/web/ui/node_modules/.cache/babel-loader/fecf076bcd198a458c2a6ab0e85e40dc1c99994c353164e79c469be162cb74c9.json +1 -0
- xinference/web/ui/src/locales/en.json +14 -1
- xinference/web/ui/src/locales/zh.json +14 -1
- {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/METADATA +18 -17
- {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/RECORD +67 -60
- xinference/web/ui/build/static/css/main.51a587ff.css +0 -2
- xinference/web/ui/build/static/css/main.51a587ff.css.map +0 -1
- xinference/web/ui/build/static/js/main.b0936c54.js +0 -3
- xinference/web/ui/build/static/js/main.b0936c54.js.map +0 -1
- xinference/web/ui/node_modules/.cache/babel-loader/0c2fb5375667931c4a331c99e0d87dc145e8f327cea3f44d6e56f54c7c1d4020.json +0 -1
- xinference/web/ui/node_modules/.cache/babel-loader/185ceb8872d562e032b47e79df6a45670e06345b8ed70aad1a131e0476783c5c.json +0 -1
- xinference/web/ui/node_modules/.cache/babel-loader/3eefb411b24c2b3ce053570ef50daccf154022f0e168be5ed0fec21394baf9f4.json +0 -1
- xinference/web/ui/node_modules/.cache/babel-loader/63c8e07687ea53a4f8a910ee5e42e0eb26cd1acbfbe820f3e3248a786ee51401.json +0 -1
- xinference/web/ui/node_modules/.cache/babel-loader/a3ff866acddf34917a7ee399e0e571a4dfd8ba66d5057db885f243e16a6eb17d.json +0 -1
- xinference/web/ui/node_modules/.cache/babel-loader/a7f1a71f6580dfe810c685a9c1d68e318f71e1fa258fbe50b87a6ac37cc0a598.json +0 -1
- xinference/web/ui/node_modules/.cache/babel-loader/bdee44abeadc4abc17d41c52eb49c6e19a4b1a267b6e16876ce91bdeeebfc52d.json +0 -1
- xinference/web/ui/node_modules/.cache/babel-loader/d7664d18c4ddbad9c3a6a31b91f7c00fb0dde804608674a9860ee50f33e54708.json +0 -1
- xinference/web/ui/node_modules/.cache/babel-loader/ed57202cb79649bb716400436590245547df241988fc7c8e1d85d132299542d2.json +0 -1
- /xinference/web/ui/build/static/js/{main.b0936c54.js.LICENSE.txt → main.ad42919c.js.LICENSE.txt} +0 -0
- {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/LICENSE +0 -0
- {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/WHEEL +0 -0
- {xinference-1.2.1.dist-info → xinference-1.3.0.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
|
197
|
-
|
|
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
|
-
|
|
203
|
-
|
|
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(
|
|
223
|
-
|
|
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
|
(
|
xinference/model/llm/utils.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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
|
-
|
|
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(
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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
|
-
|
|
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
|
|
811
|
-
|
|
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.
|
|
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(
|
|
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(
|
|
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.
|
|
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.
|
|
4
|
-
"main.js": "./static/js/main.
|
|
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.
|
|
8
|
-
"main.
|
|
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.
|
|
12
|
-
"static/js/main.
|
|
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.
|
|
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":""}
|