xinference 1.9.1__py3-none-any.whl → 1.10.1__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 (334) hide show
  1. xinference/_version.py +3 -3
  2. xinference/api/restful_api.py +400 -3
  3. xinference/client/restful/async_restful_client.py +20 -3
  4. xinference/client/restful/restful_client.py +20 -3
  5. xinference/constants.py +2 -0
  6. xinference/core/supervisor.py +111 -49
  7. xinference/core/worker.py +10 -0
  8. xinference/deploy/cmdline.py +15 -0
  9. xinference/model/audio/core.py +26 -6
  10. xinference/model/audio/indextts2.py +166 -0
  11. xinference/model/audio/kokoro.py +1 -1
  12. xinference/model/audio/kokoro_zh.py +124 -0
  13. xinference/model/audio/model_spec.json +58 -1
  14. xinference/model/embedding/sentence_transformers/core.py +4 -4
  15. xinference/model/embedding/vllm/core.py +7 -1
  16. xinference/model/image/model_spec.json +71 -3
  17. xinference/model/image/stable_diffusion/core.py +13 -4
  18. xinference/model/llm/__init__.py +4 -0
  19. xinference/model/llm/core.py +10 -0
  20. xinference/model/llm/llama_cpp/core.py +1 -0
  21. xinference/model/llm/llm_family.json +503 -21
  22. xinference/model/llm/llm_family.py +1 -0
  23. xinference/model/llm/mlx/core.py +52 -33
  24. xinference/model/llm/sglang/core.py +32 -55
  25. xinference/model/llm/tool_parsers/__init__.py +58 -0
  26. xinference/model/llm/tool_parsers/abstract_tool_parser.py +33 -0
  27. xinference/model/llm/tool_parsers/deepseek_r1_tool_parser.py +190 -0
  28. xinference/model/llm/tool_parsers/deepseek_v3_tool_parser.py +145 -0
  29. xinference/model/llm/tool_parsers/glm4_tool_parser.py +123 -0
  30. xinference/model/llm/tool_parsers/llama3_tool_parser.py +77 -0
  31. xinference/model/llm/tool_parsers/qwen_tool_parser.py +320 -0
  32. xinference/model/llm/transformers/core.py +1 -1
  33. xinference/model/llm/transformers/multimodal/qwen2_vl.py +34 -8
  34. xinference/model/llm/utils.py +138 -53
  35. xinference/model/llm/vllm/core.py +95 -78
  36. xinference/thirdparty/audiotools/__init__.py +10 -0
  37. xinference/thirdparty/audiotools/core/__init__.py +4 -0
  38. xinference/thirdparty/audiotools/core/audio_signal.py +1682 -0
  39. xinference/thirdparty/audiotools/core/display.py +194 -0
  40. xinference/thirdparty/audiotools/core/dsp.py +390 -0
  41. xinference/thirdparty/audiotools/core/effects.py +647 -0
  42. xinference/thirdparty/audiotools/core/ffmpeg.py +211 -0
  43. xinference/thirdparty/audiotools/core/loudness.py +320 -0
  44. xinference/thirdparty/audiotools/core/playback.py +252 -0
  45. xinference/thirdparty/audiotools/core/templates/__init__.py +0 -0
  46. xinference/thirdparty/audiotools/core/templates/headers.html +322 -0
  47. xinference/thirdparty/audiotools/core/templates/pandoc.css +407 -0
  48. xinference/thirdparty/audiotools/core/templates/widget.html +52 -0
  49. xinference/thirdparty/audiotools/core/util.py +671 -0
  50. xinference/thirdparty/audiotools/core/whisper.py +97 -0
  51. xinference/thirdparty/audiotools/data/__init__.py +3 -0
  52. xinference/thirdparty/audiotools/data/datasets.py +517 -0
  53. xinference/thirdparty/audiotools/data/preprocess.py +81 -0
  54. xinference/thirdparty/audiotools/data/transforms.py +1592 -0
  55. xinference/thirdparty/audiotools/metrics/__init__.py +6 -0
  56. xinference/thirdparty/audiotools/metrics/distance.py +131 -0
  57. xinference/thirdparty/audiotools/metrics/quality.py +159 -0
  58. xinference/thirdparty/audiotools/metrics/spectral.py +247 -0
  59. xinference/thirdparty/audiotools/ml/__init__.py +5 -0
  60. xinference/thirdparty/audiotools/ml/accelerator.py +184 -0
  61. xinference/thirdparty/audiotools/ml/decorators.py +440 -0
  62. xinference/thirdparty/audiotools/ml/experiment.py +90 -0
  63. xinference/thirdparty/audiotools/ml/layers/__init__.py +2 -0
  64. xinference/thirdparty/audiotools/ml/layers/base.py +328 -0
  65. xinference/thirdparty/audiotools/ml/layers/spectral_gate.py +127 -0
  66. xinference/thirdparty/audiotools/post.py +140 -0
  67. xinference/thirdparty/audiotools/preference.py +600 -0
  68. xinference/thirdparty/indextts/BigVGAN/ECAPA_TDNN.py +656 -0
  69. xinference/thirdparty/indextts/BigVGAN/__init__.py +0 -0
  70. xinference/thirdparty/indextts/BigVGAN/activations.py +122 -0
  71. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/__init__.py +0 -0
  72. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/cuda/.gitignore +1 -0
  73. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/cuda/__init__.py +0 -0
  74. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/cuda/activation1d.py +76 -0
  75. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/cuda/anti_alias_activation.cpp +23 -0
  76. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/cuda/anti_alias_activation_cuda.cu +256 -0
  77. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/cuda/compat.h +29 -0
  78. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/cuda/load.py +121 -0
  79. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/cuda/type_shim.h +92 -0
  80. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/torch/__init__.py +6 -0
  81. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/torch/act.py +31 -0
  82. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/torch/filter.py +102 -0
  83. xinference/thirdparty/indextts/BigVGAN/alias_free_activation/torch/resample.py +58 -0
  84. xinference/thirdparty/indextts/BigVGAN/alias_free_torch/__init__.py +6 -0
  85. xinference/thirdparty/indextts/BigVGAN/alias_free_torch/act.py +29 -0
  86. xinference/thirdparty/indextts/BigVGAN/alias_free_torch/filter.py +96 -0
  87. xinference/thirdparty/indextts/BigVGAN/alias_free_torch/resample.py +49 -0
  88. xinference/thirdparty/indextts/BigVGAN/bigvgan.py +534 -0
  89. xinference/thirdparty/indextts/BigVGAN/models.py +451 -0
  90. xinference/thirdparty/indextts/BigVGAN/nnet/CNN.py +546 -0
  91. xinference/thirdparty/indextts/BigVGAN/nnet/__init__.py +0 -0
  92. xinference/thirdparty/indextts/BigVGAN/nnet/linear.py +89 -0
  93. xinference/thirdparty/indextts/BigVGAN/nnet/normalization.py +670 -0
  94. xinference/thirdparty/indextts/BigVGAN/utils.py +101 -0
  95. xinference/thirdparty/indextts/__init__.py +0 -0
  96. xinference/thirdparty/indextts/cli.py +65 -0
  97. xinference/thirdparty/indextts/gpt/__init__.py +0 -0
  98. xinference/thirdparty/indextts/gpt/conformer/__init__.py +0 -0
  99. xinference/thirdparty/indextts/gpt/conformer/attention.py +312 -0
  100. xinference/thirdparty/indextts/gpt/conformer/embedding.py +163 -0
  101. xinference/thirdparty/indextts/gpt/conformer/subsampling.py +348 -0
  102. xinference/thirdparty/indextts/gpt/conformer_encoder.py +520 -0
  103. xinference/thirdparty/indextts/gpt/model.py +713 -0
  104. xinference/thirdparty/indextts/gpt/model_v2.py +747 -0
  105. xinference/thirdparty/indextts/gpt/perceiver.py +317 -0
  106. xinference/thirdparty/indextts/gpt/transformers_beam_search.py +1013 -0
  107. xinference/thirdparty/indextts/gpt/transformers_generation_utils.py +4747 -0
  108. xinference/thirdparty/indextts/gpt/transformers_gpt2.py +1878 -0
  109. xinference/thirdparty/indextts/gpt/transformers_modeling_utils.py +5525 -0
  110. xinference/thirdparty/indextts/infer.py +690 -0
  111. xinference/thirdparty/indextts/infer_v2.py +739 -0
  112. xinference/thirdparty/indextts/s2mel/dac/__init__.py +16 -0
  113. xinference/thirdparty/indextts/s2mel/dac/__main__.py +36 -0
  114. xinference/thirdparty/indextts/s2mel/dac/model/__init__.py +4 -0
  115. xinference/thirdparty/indextts/s2mel/dac/model/base.py +294 -0
  116. xinference/thirdparty/indextts/s2mel/dac/model/dac.py +400 -0
  117. xinference/thirdparty/indextts/s2mel/dac/model/discriminator.py +228 -0
  118. xinference/thirdparty/indextts/s2mel/dac/model/encodec.py +320 -0
  119. xinference/thirdparty/indextts/s2mel/dac/nn/__init__.py +3 -0
  120. xinference/thirdparty/indextts/s2mel/dac/nn/layers.py +33 -0
  121. xinference/thirdparty/indextts/s2mel/dac/nn/loss.py +368 -0
  122. xinference/thirdparty/indextts/s2mel/dac/nn/quantize.py +339 -0
  123. xinference/thirdparty/indextts/s2mel/dac/utils/__init__.py +123 -0
  124. xinference/thirdparty/indextts/s2mel/dac/utils/decode.py +95 -0
  125. xinference/thirdparty/indextts/s2mel/dac/utils/encode.py +94 -0
  126. xinference/thirdparty/indextts/s2mel/hf_utils.py +12 -0
  127. xinference/thirdparty/indextts/s2mel/modules/alias_free_torch/__init__.py +5 -0
  128. xinference/thirdparty/indextts/s2mel/modules/alias_free_torch/act.py +29 -0
  129. xinference/thirdparty/indextts/s2mel/modules/alias_free_torch/filter.py +96 -0
  130. xinference/thirdparty/indextts/s2mel/modules/alias_free_torch/resample.py +57 -0
  131. xinference/thirdparty/indextts/s2mel/modules/audio.py +82 -0
  132. xinference/thirdparty/indextts/s2mel/modules/bigvgan/activations.py +120 -0
  133. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/cuda/__init__.py +0 -0
  134. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/cuda/activation1d.py +77 -0
  135. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/cuda/anti_alias_activation.cpp +23 -0
  136. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/cuda/anti_alias_activation_cuda.cu +246 -0
  137. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/cuda/compat.h +29 -0
  138. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/cuda/load.py +86 -0
  139. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/cuda/type_shim.h +92 -0
  140. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/torch/__init__.py +6 -0
  141. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/torch/act.py +30 -0
  142. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/torch/filter.py +101 -0
  143. xinference/thirdparty/indextts/s2mel/modules/bigvgan/alias_free_activation/torch/resample.py +58 -0
  144. xinference/thirdparty/indextts/s2mel/modules/bigvgan/bigvgan.py +492 -0
  145. xinference/thirdparty/indextts/s2mel/modules/bigvgan/config.json +63 -0
  146. xinference/thirdparty/indextts/s2mel/modules/bigvgan/env.py +18 -0
  147. xinference/thirdparty/indextts/s2mel/modules/bigvgan/meldataset.py +354 -0
  148. xinference/thirdparty/indextts/s2mel/modules/bigvgan/utils.py +99 -0
  149. xinference/thirdparty/indextts/s2mel/modules/campplus/DTDNN.py +115 -0
  150. xinference/thirdparty/indextts/s2mel/modules/campplus/classifier.py +70 -0
  151. xinference/thirdparty/indextts/s2mel/modules/campplus/layers.py +253 -0
  152. xinference/thirdparty/indextts/s2mel/modules/commons.py +632 -0
  153. xinference/thirdparty/indextts/s2mel/modules/diffusion_transformer.py +257 -0
  154. xinference/thirdparty/indextts/s2mel/modules/encodec.py +292 -0
  155. xinference/thirdparty/indextts/s2mel/modules/flow_matching.py +171 -0
  156. xinference/thirdparty/indextts/s2mel/modules/gpt_fast/generate.py +436 -0
  157. xinference/thirdparty/indextts/s2mel/modules/gpt_fast/model.py +360 -0
  158. xinference/thirdparty/indextts/s2mel/modules/gpt_fast/quantize.py +622 -0
  159. xinference/thirdparty/indextts/s2mel/modules/hifigan/f0_predictor.py +55 -0
  160. xinference/thirdparty/indextts/s2mel/modules/hifigan/generator.py +454 -0
  161. xinference/thirdparty/indextts/s2mel/modules/layers.py +354 -0
  162. xinference/thirdparty/indextts/s2mel/modules/length_regulator.py +141 -0
  163. xinference/thirdparty/indextts/s2mel/modules/openvoice/__init__.py +0 -0
  164. xinference/thirdparty/indextts/s2mel/modules/openvoice/api.py +186 -0
  165. xinference/thirdparty/indextts/s2mel/modules/openvoice/attentions.py +465 -0
  166. xinference/thirdparty/indextts/s2mel/modules/openvoice/checkpoints_v2/converter/config.json +57 -0
  167. xinference/thirdparty/indextts/s2mel/modules/openvoice/commons.py +160 -0
  168. xinference/thirdparty/indextts/s2mel/modules/openvoice/mel_processing.py +183 -0
  169. xinference/thirdparty/indextts/s2mel/modules/openvoice/models.py +499 -0
  170. xinference/thirdparty/indextts/s2mel/modules/openvoice/modules.py +598 -0
  171. xinference/thirdparty/indextts/s2mel/modules/openvoice/openvoice_app.py +275 -0
  172. xinference/thirdparty/indextts/s2mel/modules/openvoice/se_extractor.py +153 -0
  173. xinference/thirdparty/indextts/s2mel/modules/openvoice/transforms.py +209 -0
  174. xinference/thirdparty/indextts/s2mel/modules/openvoice/utils.py +194 -0
  175. xinference/thirdparty/indextts/s2mel/modules/quantize.py +229 -0
  176. xinference/thirdparty/indextts/s2mel/modules/rmvpe.py +631 -0
  177. xinference/thirdparty/indextts/s2mel/modules/vocos/__init__.py +4 -0
  178. xinference/thirdparty/indextts/s2mel/modules/vocos/heads.py +164 -0
  179. xinference/thirdparty/indextts/s2mel/modules/vocos/helpers.py +71 -0
  180. xinference/thirdparty/indextts/s2mel/modules/vocos/loss.py +114 -0
  181. xinference/thirdparty/indextts/s2mel/modules/vocos/models.py +118 -0
  182. xinference/thirdparty/indextts/s2mel/modules/vocos/modules.py +213 -0
  183. xinference/thirdparty/indextts/s2mel/modules/vocos/pretrained.py +51 -0
  184. xinference/thirdparty/indextts/s2mel/modules/vocos/spectral_ops.py +192 -0
  185. xinference/thirdparty/indextts/s2mel/modules/wavenet.py +174 -0
  186. xinference/thirdparty/indextts/s2mel/optimizers.py +96 -0
  187. xinference/thirdparty/indextts/s2mel/wav2vecbert_extract.py +148 -0
  188. xinference/thirdparty/indextts/utils/__init__.py +0 -0
  189. xinference/thirdparty/indextts/utils/arch_util.py +120 -0
  190. xinference/thirdparty/indextts/utils/checkpoint.py +34 -0
  191. xinference/thirdparty/indextts/utils/common.py +121 -0
  192. xinference/thirdparty/indextts/utils/feature_extractors.py +50 -0
  193. xinference/thirdparty/indextts/utils/front.py +536 -0
  194. xinference/thirdparty/indextts/utils/maskgct/models/codec/__init__.py +0 -0
  195. xinference/thirdparty/indextts/utils/maskgct/models/codec/amphion_codec/codec.py +427 -0
  196. xinference/thirdparty/indextts/utils/maskgct/models/codec/amphion_codec/quantize/__init__.py +11 -0
  197. xinference/thirdparty/indextts/utils/maskgct/models/codec/amphion_codec/quantize/factorized_vector_quantize.py +150 -0
  198. xinference/thirdparty/indextts/utils/maskgct/models/codec/amphion_codec/quantize/lookup_free_quantize.py +77 -0
  199. xinference/thirdparty/indextts/utils/maskgct/models/codec/amphion_codec/quantize/residual_vq.py +177 -0
  200. xinference/thirdparty/indextts/utils/maskgct/models/codec/amphion_codec/quantize/vector_quantize.py +401 -0
  201. xinference/thirdparty/indextts/utils/maskgct/models/codec/amphion_codec/vocos.py +881 -0
  202. xinference/thirdparty/indextts/utils/maskgct/models/codec/codec_dataset.py +264 -0
  203. xinference/thirdparty/indextts/utils/maskgct/models/codec/codec_inference.py +515 -0
  204. xinference/thirdparty/indextts/utils/maskgct/models/codec/codec_sampler.py +126 -0
  205. xinference/thirdparty/indextts/utils/maskgct/models/codec/codec_trainer.py +166 -0
  206. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/__init__.py +0 -0
  207. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/alias_free_torch/__init__.py +5 -0
  208. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/alias_free_torch/act.py +29 -0
  209. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/alias_free_torch/filter.py +96 -0
  210. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/alias_free_torch/resample.py +57 -0
  211. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/facodec_dataset.py +98 -0
  212. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/facodec_inference.py +137 -0
  213. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/facodec_trainer.py +776 -0
  214. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/modules/JDC/__init__.py +1 -0
  215. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/modules/JDC/bst.t7 +0 -0
  216. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/modules/JDC/model.py +219 -0
  217. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/modules/attentions.py +437 -0
  218. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/modules/commons.py +331 -0
  219. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/modules/gradient_reversal.py +35 -0
  220. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/modules/layers.py +460 -0
  221. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/modules/quantize.py +741 -0
  222. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/modules/style_encoder.py +110 -0
  223. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/modules/wavenet.py +224 -0
  224. xinference/thirdparty/indextts/utils/maskgct/models/codec/facodec/optimizer.py +104 -0
  225. xinference/thirdparty/indextts/utils/maskgct/models/codec/kmeans/repcodec_model.py +210 -0
  226. xinference/thirdparty/indextts/utils/maskgct/models/codec/kmeans/vocos.py +850 -0
  227. xinference/thirdparty/indextts/utils/maskgct/models/codec/melvqgan/melspec.py +108 -0
  228. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/README.md +216 -0
  229. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/__init__.py +6 -0
  230. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/alias_free_torch/__init__.py +5 -0
  231. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/alias_free_torch/act.py +29 -0
  232. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/alias_free_torch/filter.py +96 -0
  233. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/alias_free_torch/resample.py +57 -0
  234. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/facodec.py +1222 -0
  235. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/gradient_reversal.py +35 -0
  236. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/melspec.py +102 -0
  237. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/quantize/__init__.py +7 -0
  238. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/quantize/fvq.py +116 -0
  239. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/quantize/rvq.py +87 -0
  240. xinference/thirdparty/indextts/utils/maskgct/models/codec/ns3_codec/transformer.py +234 -0
  241. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/model.py +184 -0
  242. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/modules/__init__.py +27 -0
  243. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/modules/conv.py +346 -0
  244. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/modules/lstm.py +46 -0
  245. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/modules/norm.py +37 -0
  246. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/modules/quantization/__init__.py +14 -0
  247. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/modules/quantization/ac.py +317 -0
  248. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/modules/quantization/core_vq.py +388 -0
  249. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/modules/quantization/distrib.py +135 -0
  250. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/modules/quantization/vq.py +125 -0
  251. xinference/thirdparty/indextts/utils/maskgct/models/codec/speechtokenizer/modules/seanet.py +414 -0
  252. xinference/thirdparty/indextts/utils/maskgct/models/codec/vevo/vevo_repcodec.py +592 -0
  253. xinference/thirdparty/indextts/utils/maskgct/models/tts/maskgct/ckpt/wav2vec2bert_stats.pt +0 -0
  254. xinference/thirdparty/indextts/utils/maskgct/models/tts/maskgct/llama_nar.py +650 -0
  255. xinference/thirdparty/indextts/utils/maskgct/models/tts/maskgct/maskgct_s2a.py +503 -0
  256. xinference/thirdparty/indextts/utils/maskgct_utils.py +259 -0
  257. xinference/thirdparty/indextts/utils/text_utils.py +41 -0
  258. xinference/thirdparty/indextts/utils/typical_sampling.py +30 -0
  259. xinference/thirdparty/indextts/utils/utils.py +93 -0
  260. xinference/thirdparty/indextts/utils/webui_utils.py +42 -0
  261. xinference/thirdparty/indextts/utils/xtransformers.py +1247 -0
  262. xinference/thirdparty/indextts/vqvae/__init__.py +0 -0
  263. xinference/thirdparty/indextts/vqvae/xtts_dvae.py +395 -0
  264. xinference/types.py +105 -2
  265. xinference/ui/gradio/media_interface.py +66 -8
  266. xinference/ui/web/ui/build/asset-manifest.json +6 -6
  267. xinference/ui/web/ui/build/index.html +1 -1
  268. xinference/ui/web/ui/build/static/css/main.5ea97072.css +2 -0
  269. xinference/ui/web/ui/build/static/css/main.5ea97072.css.map +1 -0
  270. xinference/ui/web/ui/build/static/js/main.d192c4f3.js +3 -0
  271. xinference/ui/web/ui/build/static/js/{main.1086c759.js.LICENSE.txt → main.d192c4f3.js.LICENSE.txt} +0 -7
  272. xinference/ui/web/ui/build/static/js/main.d192c4f3.js.map +1 -0
  273. xinference/ui/web/ui/node_modules/.cache/babel-loader/089c38df5f52348d212ed868dda5c518a42e0c2762caed4175487c0405830c35.json +1 -0
  274. xinference/ui/web/ui/node_modules/.cache/babel-loader/2b6e3a5b6eb2c5c5f2d007e68cd46c372721cd52bf63508adcdb21ecf79241d8.json +1 -0
  275. xinference/ui/web/ui/node_modules/.cache/babel-loader/2d887825fd07a56f872eda4420da25fba0b5b62a23bdcc6c6da1a5281887f618.json +1 -0
  276. xinference/ui/web/ui/node_modules/.cache/babel-loader/4001f9c3e64e73a4f2158826650c174a59d5e3f89ddecddf17cbb6bb688cc4ca.json +1 -0
  277. xinference/ui/web/ui/node_modules/.cache/babel-loader/4a7018a69e6b7f90fc313248c2aa86f2a8f1eb1db120df586047a8023549b44b.json +1 -0
  278. xinference/ui/web/ui/node_modules/.cache/babel-loader/64b12aaa1c1d1bf53820ada8a63769067c0ccc5aab46b32348eb1917ae7f2a11.json +1 -0
  279. xinference/ui/web/ui/node_modules/.cache/babel-loader/7275b67c78ec76ce38a686bb8a576d8c9cecf54e1573614c84859d538efb9be5.json +1 -0
  280. xinference/ui/web/ui/node_modules/.cache/babel-loader/a68b6ee3b31eadc051fb95ce8f8ccb9c2e8b52c60f290dbab545a1917e065282.json +1 -0
  281. xinference/ui/web/ui/node_modules/.cache/babel-loader/ae8771cc37693feb160fa8727231312a0c54ef2d1d1ca893be568cd70016ca7e.json +1 -0
  282. xinference/ui/web/ui/node_modules/.cache/babel-loader/bb4e8722d2d41d87f1fce3661bc8937bffe9448e231fc5f0462630849e851592.json +1 -0
  283. xinference/ui/web/ui/node_modules/.cache/babel-loader/be6aada1ee4adc2bbf65dbe56d17db32bb3b5478be05d6b527805a8ba6cfb2b9.json +1 -0
  284. xinference/ui/web/ui/node_modules/.cache/babel-loader/de91c352653c233cf0cb6674e6e04049a44fd0e1156560de65d5c4620521391e.json +1 -0
  285. xinference/ui/web/ui/node_modules/.cache/babel-loader/e85f7002fc325c83b9c9cd8a1619e5b3ebc701d30e811afc284b88e6ae710cb5.json +1 -0
  286. xinference/ui/web/ui/node_modules/.cache/babel-loader/e8b603c78944bf3d213639078bfe155ff5c0dfa4048a93cbb967cad6a4eb4ff3.json +1 -0
  287. xinference/ui/web/ui/node_modules/.cache/babel-loader/f05535160a508b2a312de546a6de234776c613db276479ea4253c0b1bdeeb7d6.json +1 -0
  288. xinference/ui/web/ui/node_modules/.cache/babel-loader/f09ba9e11106bd59a0de10cc85c55084097729dcab575f43dfcf07375961ed87.json +1 -0
  289. xinference/ui/web/ui/node_modules/.cache/babel-loader/f995a2425dfb0822fd07127f66ffe9b026883bc156b402eb8bd0b83d52460a93.json +1 -0
  290. xinference/ui/web/ui/node_modules/.package-lock.json +0 -33
  291. xinference/ui/web/ui/package-lock.json +0 -34
  292. xinference/ui/web/ui/package.json +0 -1
  293. xinference/ui/web/ui/src/locales/en.json +9 -3
  294. xinference/ui/web/ui/src/locales/ja.json +9 -3
  295. xinference/ui/web/ui/src/locales/ko.json +9 -3
  296. xinference/ui/web/ui/src/locales/zh.json +9 -3
  297. {xinference-1.9.1.dist-info → xinference-1.10.1.dist-info}/METADATA +24 -4
  298. {xinference-1.9.1.dist-info → xinference-1.10.1.dist-info}/RECORD +302 -76
  299. xinference/ui/web/ui/build/static/css/main.013f296b.css +0 -2
  300. xinference/ui/web/ui/build/static/css/main.013f296b.css.map +0 -1
  301. xinference/ui/web/ui/build/static/js/main.1086c759.js +0 -3
  302. xinference/ui/web/ui/build/static/js/main.1086c759.js.map +0 -1
  303. xinference/ui/web/ui/node_modules/.cache/babel-loader/0b0f77000cc1b482ca091cfbcae511dfe02f08916971645fad21d0b1234d04a2.json +0 -1
  304. xinference/ui/web/ui/node_modules/.cache/babel-loader/1c5f8ff423a7c9202bea60b15680f04b1e9964b445b0da3f86c6ff70cf24e797.json +0 -1
  305. xinference/ui/web/ui/node_modules/.cache/babel-loader/44ce7993e344980e3ed4f13e8f69237d4a5dfc60e37ca6b54f51f8ee1357bd67.json +0 -1
  306. xinference/ui/web/ui/node_modules/.cache/babel-loader/4aec1cc414ac3ebb3481d3d915e4db597d9127de813291346eacb8554ab170d4.json +0 -1
  307. xinference/ui/web/ui/node_modules/.cache/babel-loader/644cfec52f3c57a6e222ce60f112237a1efefe9835efd9aad857a685f53d8eed.json +0 -1
  308. xinference/ui/web/ui/node_modules/.cache/babel-loader/663436f72af53fe0d72394f56d003fa4e0bba489e5bb4e483fd34b00f84637f7.json +0 -1
  309. xinference/ui/web/ui/node_modules/.cache/babel-loader/69db82ca9bfe27fe417cc6cf2b1716b09be9c6f0cd198530f12bfc60e801bbcf.json +0 -1
  310. xinference/ui/web/ui/node_modules/.cache/babel-loader/85087e27618d740c236bf159f30e0219db443ab55f0997388eed5fde6f9e90cc.json +0 -1
  311. xinference/ui/web/ui/node_modules/.cache/babel-loader/88b07838348864aa86c672be3bbca1e9f58f6f3a2881b32070ec27f4e7b449d1.json +0 -1
  312. xinference/ui/web/ui/node_modules/.cache/babel-loader/8b8cd408ccfbe115acef27ccfa5b233da8597131a2a5712add13e1e4d5d4504b.json +0 -1
  313. xinference/ui/web/ui/node_modules/.cache/babel-loader/a23824fe746b9c6ca5eee9159b5764d1ff1653c1d856288c0f75c742bbb0023b.json +0 -1
  314. xinference/ui/web/ui/node_modules/.cache/babel-loader/a3eb18af328280b139693c9092dff2a0ef8c9a967e6c8956ceee0996611f1984.json +0 -1
  315. xinference/ui/web/ui/node_modules/.cache/babel-loader/bc1aacc65a102db325ca61bcd2f681e1ae22c36a1f1d98a6ff5e4ad49dc7544f.json +0 -1
  316. xinference/ui/web/ui/node_modules/.cache/babel-loader/c682fd521747c19dae437d83ce3235a306ce6b68e24a117bc57c27ebb8d1f1ca.json +0 -1
  317. xinference/ui/web/ui/node_modules/.cache/babel-loader/d5c224be7081f18cba1678b7874a9782eba895df004874ff8f243f94ba79942a.json +0 -1
  318. xinference/ui/web/ui/node_modules/.cache/babel-loader/f7f18bfb539b036a6a342176dd98a85df5057a884a8da978d679f2a0264883d0.json +0 -1
  319. xinference/ui/web/ui/node_modules/clipboard/.babelrc.json +0 -11
  320. xinference/ui/web/ui/node_modules/clipboard/.eslintrc.json +0 -24
  321. xinference/ui/web/ui/node_modules/clipboard/.prettierrc.json +0 -9
  322. xinference/ui/web/ui/node_modules/clipboard/bower.json +0 -18
  323. xinference/ui/web/ui/node_modules/clipboard/composer.json +0 -25
  324. xinference/ui/web/ui/node_modules/clipboard/package.json +0 -63
  325. xinference/ui/web/ui/node_modules/delegate/package.json +0 -31
  326. xinference/ui/web/ui/node_modules/good-listener/bower.json +0 -11
  327. xinference/ui/web/ui/node_modules/good-listener/package.json +0 -35
  328. xinference/ui/web/ui/node_modules/select/bower.json +0 -13
  329. xinference/ui/web/ui/node_modules/select/package.json +0 -29
  330. xinference/ui/web/ui/node_modules/tiny-emitter/package.json +0 -53
  331. {xinference-1.9.1.dist-info → xinference-1.10.1.dist-info}/WHEEL +0 -0
  332. {xinference-1.9.1.dist-info → xinference-1.10.1.dist-info}/entry_points.txt +0 -0
  333. {xinference-1.9.1.dist-info → xinference-1.10.1.dist-info}/licenses/LICENSE +0 -0
  334. {xinference-1.9.1.dist-info → xinference-1.10.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,145 @@
1
+ import json
2
+ import logging
3
+ import re
4
+ from typing import Any, Dict, List, Optional, Tuple
5
+
6
+ from . import register_tool_parser
7
+ from .abstract_tool_parser import ToolParser
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ @register_tool_parser("deepseek-v3")
13
+ class DeepseekV3ToolParser(ToolParser):
14
+ """
15
+ Tool parser implementation for DeepSeek V3 model.
16
+
17
+ This parser handles the specific format used by DeepSeek V3 for tool calls,
18
+ which uses JSON code blocks wrapped in markdown format.
19
+
20
+ """
21
+
22
+ def __init__(self):
23
+ """
24
+ Initialize the DeepSeek V3 tool parser.
25
+ """
26
+ super().__init__()
27
+ # Regex pattern to match JSON code blocks
28
+ self.tool_calls_regex = r"\s*```json\s*(.*?)\s*```"
29
+
30
+ def _parse_json_function_call(
31
+ self,
32
+ function_call_str: str,
33
+ ) -> str:
34
+ """
35
+ Parse JSON function call from string.
36
+
37
+ Args:
38
+ function_call_str (str): The function call string to parse.
39
+
40
+ Returns:
41
+ str: Parsed result or original string if no match found.
42
+
43
+ """
44
+ match = self.tool_calls_regex.search(function_call_str)
45
+ if match:
46
+ result = match.group(1)
47
+ return result
48
+ return function_call_str
49
+
50
+ def extract_tool_calls(
51
+ self, model_output: str
52
+ ) -> List[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]:
53
+ """
54
+ Extract tool calls from complete model output.
55
+
56
+ Parses the model output to find JSON code blocks containing tool calls
57
+ and extracts function names and parameters. Handles JSON parsing errors
58
+ gracefully and deduplicates identical tool calls.
59
+
60
+ Args:
61
+ model_output (str): The complete output string from the model.
62
+
63
+ Returns:
64
+ List[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]:
65
+ A list of tuples where each tuple contains:
66
+ - content (str or None): Raw content if parsing failed, None if successful
67
+ - function_name (str or None): Name of the function to call
68
+ - parameters (dict or None): Function parameters
69
+
70
+ Example:
71
+ >>> parser = DeepseekV3ToolParser()
72
+ >>> output = '```json\n{"name": "get_weather", "parameters": {"location": "Beijing"}}\n```'
73
+ >>> result = parser.extract_tool_calls(output)
74
+ >>> print(result)
75
+ [(None, 'get_weather', {'location': 'Beijing'})]
76
+ """
77
+ matches = re.findall(self.tool_calls_regex, model_output, re.DOTALL)
78
+
79
+ if not matches:
80
+ # No tool calls found, return the original output as content
81
+ return [(model_output, None, None)]
82
+
83
+ # Use set for deduplication of identical tool calls
84
+ tool_calls = set()
85
+ results: List[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]] = (
86
+ []
87
+ )
88
+
89
+ for raw_json in matches:
90
+ func_and_args = None
91
+ try:
92
+ # Parse JSON to extract function call information
93
+ func_and_args = json.loads(raw_json)
94
+ # Convert dictionary to frozenset for deduplication
95
+ arguments_hashable = frozenset(func_and_args["parameters"])
96
+ tool_call_tuple = (
97
+ None, # No content error
98
+ func_and_args["name"],
99
+ func_and_args["parameters"],
100
+ )
101
+ except json.JSONDecodeError:
102
+ tool_call_tuple = (
103
+ raw_json,
104
+ None,
105
+ None,
106
+ ) # If parsing fails, treat as raw content
107
+ arguments_hashable = None # No need for hashing
108
+
109
+ # Avoid duplicate entries
110
+ dedup_key = (
111
+ (func_and_args["name"], arguments_hashable)
112
+ if func_and_args is not None
113
+ else (raw_json)
114
+ )
115
+
116
+ # Add to results if not already seen
117
+ if dedup_key not in tool_calls:
118
+ tool_calls.add(dedup_key)
119
+ results.append(tool_call_tuple)
120
+
121
+ return results
122
+
123
+ def extract_tool_calls_streaming(
124
+ self, previous_text: List[str], current_text: str, delta_text: str
125
+ ) -> Optional[Any]:
126
+ """
127
+ Extract tool calls from streaming output.
128
+
129
+ Currently not supported for DeepSeek V3 model. This method raises
130
+ a ValueError indicating that streaming tool call extraction is only
131
+ available for specific model/backend combinations.
132
+
133
+ Args:
134
+ previous_text (List[str]): Previous text chunks from the stream.
135
+ current_text (str): Current accumulated text.
136
+ delta_text (str): New text delta in this chunk.
137
+
138
+ Raises:
139
+ ValueError: Always raised as streaming is not supported.
140
+ """
141
+ raise NotImplementedError(
142
+ "Streaming support for tool calls is available only when using "
143
+ "Qwen models with vLLM backend or GLM4-chat models without vLLM backend. "
144
+ "DeepSeek V3 does not support streaming tool call extraction."
145
+ )
@@ -0,0 +1,123 @@
1
+ import json
2
+ import logging
3
+ from typing import Any, Dict, List, Optional, Tuple
4
+
5
+ from . import register_tool_parser
6
+ from .abstract_tool_parser import ToolParser
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ @register_tool_parser("glm4")
12
+ class Glm4ToolParser(ToolParser):
13
+ """
14
+ Tool parser implementation for GLM4 model.
15
+
16
+ This parser handles the specific format used by GLM4 for tool calls,
17
+ which uses JSON code blocks wrapped in markdown format.
18
+
19
+ """
20
+
21
+ def __init__(self):
22
+ """
23
+ Initialize the GLM4 tool parser.
24
+ """
25
+ super().__init__()
26
+ # Regex pattern to match JSON code blocks
27
+ self.tool_calls_regex = r"\s*```json\s*(.*?)\s*```"
28
+
29
+ def _parse_json_function_call(
30
+ self,
31
+ function_call_str: str,
32
+ ) -> str:
33
+ """
34
+ Parse JSON function call from string.
35
+
36
+ Args:
37
+ function_call_str (str): The function call string to parse.
38
+
39
+ Returns:
40
+ str: Parsed result or original string if no match found.
41
+
42
+ """
43
+ match = self.tool_calls_regex.search(function_call_str)
44
+ if match:
45
+ result = match.group(1)
46
+ return result
47
+ return function_call_str
48
+
49
+ def extract_tool_calls(
50
+ self, model_output: str
51
+ ) -> List[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]:
52
+ """
53
+ Extract tool calls from complete model output.
54
+
55
+ Parses the model output to find JSON code blocks containing tool calls
56
+ and extracts function names and parameters. Handles JSON parsing errors
57
+ gracefully and deduplicates identical tool calls.
58
+
59
+ Args:
60
+ model_output (str): The complete output string from the model.
61
+
62
+ Returns:
63
+ List[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]:
64
+ A list of tuples where each tuple contains:
65
+ - content (str or None): Raw content if parsing failed, None if successful
66
+ - function_name (str or None): Name of the function to call
67
+ - parameters (dict or None): Function parameters
68
+
69
+ Example:
70
+ >>> parser = Glm4ToolParser()
71
+ >>> output = {"name": "get_weather", "parameters": {"location": "Beijing"}}
72
+ >>> result = parser.extract_tool_calls(output)
73
+ >>> print(result)
74
+ [(None, 'get_weather', {'location': 'Beijing'})]
75
+ """
76
+ try:
77
+ if isinstance(model_output, dict):
78
+ try:
79
+ return [
80
+ (
81
+ None,
82
+ model_output["name"],
83
+ json.loads(model_output["arguments"]),
84
+ )
85
+ ]
86
+ except Exception:
87
+ return [(None, model_output["name"], model_output["arguments"])]
88
+ except KeyError:
89
+ logger.error("Can't parse glm output: %s", model_output)
90
+ return [(str(model_output), None, None)]
91
+ else:
92
+ return [(str(model_output), None, None)]
93
+
94
+ def extract_tool_calls_streaming(
95
+ self, previous_text: List[str], current_text: str, delta_text: str
96
+ ) -> Optional[Any]:
97
+ """
98
+ Extract tool calls from streaming output.
99
+
100
+ Currently has limited support for GLM4 model streaming. This method raises
101
+ a ValueError indicating that streaming tool call extraction is only
102
+ available for specific model/backend combinations.
103
+
104
+ Args:
105
+ previous_text (List[str]): Previous text chunks from the stream.
106
+ current_text (str): Current accumulated text.
107
+ delta_text (str): New text delta in this chunk.
108
+ """
109
+ try:
110
+ if isinstance(current_text, dict):
111
+ try:
112
+ return (
113
+ None,
114
+ current_text["name"],
115
+ json.loads(current_text["arguments"]),
116
+ )
117
+ except Exception:
118
+ return (None, current_text["name"], current_text["arguments"])
119
+ except KeyError:
120
+ logger.error("Can't parse glm output: %s", current_text)
121
+ return (str(current_text), None, None)
122
+ else:
123
+ return (str(current_text), None, None)
@@ -0,0 +1,77 @@
1
+ import logging
2
+ from typing import Any, Dict, List, Optional, Tuple
3
+
4
+ from . import register_tool_parser
5
+ from .abstract_tool_parser import ToolParser
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+
10
+ @register_tool_parser("llama3")
11
+ class Llama3ToolParser(ToolParser):
12
+ """
13
+ Tool parser implementation for Llama3 model.
14
+
15
+ This parser handles the specific format used by Llama3 for tool calls,
16
+ which uses Python dictionary format that needs to be evaluated safely.
17
+
18
+ """
19
+
20
+ def __init__(self):
21
+ """
22
+ Initialize the Llama3 tool parser.
23
+ """
24
+ super().__init__()
25
+
26
+ def extract_tool_calls(
27
+ self, model_output: str
28
+ ) -> List[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]:
29
+ """
30
+ Extract tool calls from complete model output.
31
+
32
+ Parses the model output using eval() to extract tool call information.
33
+ This method expects the output to be a valid Python dictionary format.
34
+
35
+ Args:
36
+ model_output (str): The complete output string from the model.
37
+
38
+ Returns:
39
+ List[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]:
40
+ A list of tuples where each tuple contains:
41
+ - content (str or None): Raw content if parsing failed, None if successful
42
+ - function_name (str or None): Name of the function to call
43
+ - parameters (dict or None): Function parameters
44
+ """
45
+ try:
46
+ data = eval(model_output, {}, {})
47
+ return [(None, data["name"], data["parameters"])]
48
+ except Exception:
49
+ return [(model_output, None, None)]
50
+
51
+ def extract_tool_calls_streaming(
52
+ self, previous_text: List[str], current_text: str, delta_text: str
53
+ ) -> Optional[Any]:
54
+ """
55
+ Extract tool calls from streaming output.
56
+
57
+ Currently not supported for Llama3 model. This method raises
58
+ a ValueError indicating that streaming tool call extraction is only
59
+ available for specific model/backend combinations.
60
+
61
+ Args:
62
+ previous_text (List[str]): Previous text chunks from the stream.
63
+ current_text (str): Current accumulated text.
64
+ delta_text (str): New text delta in this chunk.
65
+
66
+ Raises:
67
+ ValueError: Always raised as streaming is not supported.
68
+
69
+ Note:
70
+ Llama3 model does not currently support streaming tool call
71
+ extraction. Use extract_tool_calls() with complete output instead.
72
+ """
73
+ raise NotImplementedError(
74
+ "Streaming support for tool calls is available only when using "
75
+ "Qwen models with vLLM backend or GLM4-chat models without vLLM backend. "
76
+ "Llama3 does not support streaming tool call extraction."
77
+ )
@@ -0,0 +1,320 @@
1
+ import json
2
+ import logging
3
+ import re
4
+ from typing import Any, Dict, List, Optional, Tuple
5
+
6
+ from . import register_tool_parser
7
+ from .abstract_tool_parser import ToolParser
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ @register_tool_parser("qwen")
13
+ class QwenToolParser(ToolParser):
14
+ """
15
+ Tool parser implementation for Qwen model.
16
+
17
+ This parser handles the specific format used by Qwen for tool calls,
18
+ which uses XML-like tags for both thinking blocks and tool calls.
19
+
20
+ """
21
+
22
+ def __init__(self):
23
+ """
24
+ Initialize the Qwen tool parser.
25
+
26
+ Sets up the XML-like tokens and regex patterns used for parsing
27
+ Qwen model outputs containing thinking blocks and tool calls.
28
+ """
29
+ super().__init__()
30
+
31
+ # Sentinel tokens for streaming mode
32
+ self.think_start_token: str = "<think>"
33
+ self.think_end_token: str = "</think>"
34
+ self.tool_call_start_token: str = "<tool_call>"
35
+ self.tool_call_end_token: str = "</tool_call>"
36
+
37
+ # Regex patterns for parsing different content types
38
+ self.think_regex = re.compile("<think>(.*?)</think>", re.DOTALL)
39
+ self.content_regex = r"(<(think|tool_call)>.*?</\2>)"
40
+ self.tool_call_complete_regex = re.compile(
41
+ r"<tool_call>(.*?)</tool_call>", re.DOTALL
42
+ )
43
+ self.tool_call_regex = re.compile(
44
+ r"<tool_call>.*?</tool_call>|<tool_call>.*?$", re.DOTALL
45
+ )
46
+
47
+ def _parse_json_function_call(
48
+ self,
49
+ function_call_str: str,
50
+ ) -> str:
51
+ """
52
+ Parse JSON function call from string.
53
+
54
+ Extracts the JSON content from tool_call XML tags.
55
+
56
+ Args:
57
+ function_call_str (str): The function call string to parse.
58
+
59
+ Returns:
60
+ str: Extracted JSON string or original string if no match found.
61
+ """
62
+ function_calls = self.tool_call_complete_regex.findall(function_call_str)
63
+ if len(function_calls) == 0:
64
+ return function_call_str
65
+ return function_calls[-1]
66
+
67
+ def _parse_json_function_call_stream(
68
+ self,
69
+ function_call_str: str,
70
+ ) -> Optional[str]:
71
+ """
72
+ Parse JSON function call from streaming string.
73
+
74
+ Extracts the JSON content from tool_call XML tags in streaming context.
75
+
76
+ Args:
77
+ function_call_str (str): The function call string to parse.
78
+
79
+ Returns:
80
+ Optional[str]: Extracted JSON string or None if no complete match found.
81
+ """
82
+ function_calls = self.tool_call_complete_regex.findall(function_call_str)
83
+ if len(function_calls) == 0:
84
+ return None
85
+ return function_calls[-1]
86
+
87
+ def is_contain_think_end_token(self, model_output: str) -> bool:
88
+ """
89
+ Check if the model output contains the think end token.
90
+
91
+ Args:
92
+ model_output (str): The model output to check.
93
+
94
+ Returns:
95
+ bool: True if think end token is present.
96
+ """
97
+ return self.think_end_token in model_output
98
+
99
+ def is_contain_think(self, model_output: str) -> bool:
100
+ """
101
+ Check if the model output contains complete thinking blocks.
102
+
103
+ Args:
104
+ model_output (str): The model output to check.
105
+
106
+ Returns:
107
+ bool: True if complete thinking blocks are present.
108
+ """
109
+ return self.think_regex.search(model_output) is not None
110
+
111
+ def is_contain_tool_call(self, model_output: str) -> bool:
112
+ """
113
+ Check if the model output contains complete tool calls.
114
+
115
+ Args:
116
+ model_output (str): The model output to check.
117
+
118
+ Returns:
119
+ bool: True if complete tool calls are present.
120
+ """
121
+ return self.tool_call_complete_regex.search(model_output) is not None
122
+
123
+ def is_contain_tool_call_start_token(self, model_output: str) -> bool:
124
+ """
125
+ Check if the model output contains the tool call start token.
126
+
127
+ Args:
128
+ model_output (str): The model output to check.
129
+
130
+ Returns:
131
+ bool: True if tool call start token is present.
132
+ """
133
+ return self.tool_call_start_token in model_output
134
+
135
+ def is_contain_tool_call_end_token(self, model_output: str) -> bool:
136
+ """
137
+ Check if the model output contains the tool call end token.
138
+
139
+ Args:
140
+ model_output (str): The model output to check.
141
+
142
+ Returns:
143
+ bool: True if tool call end token is present.
144
+ """
145
+ return self.tool_call_end_token in model_output
146
+
147
+ def _get_function_calls(self, model_output: str) -> List[str]:
148
+ """
149
+ Extract all function calls and content blocks from model output.
150
+
151
+ Parses the model output to separate thinking blocks, tool calls,
152
+ and regular content into individual components.
153
+
154
+ Args:
155
+ model_output (str): The complete model output to parse.
156
+
157
+ Returns:
158
+ List[str]: List of content blocks (text, thinking blocks, tool calls).
159
+ """
160
+ functions_calls = []
161
+ last_end = 0
162
+ for m in re.finditer(self.content_regex, model_output, re.DOTALL):
163
+ # Add any text before the current match
164
+ if m.start() > last_end:
165
+ functions_calls.append(model_output[last_end : m.start()])
166
+ # Add the matched content (think or tool_call block)
167
+ functions_calls.append(m.group(0))
168
+ last_end = m.end()
169
+ # Add any remaining text after the last match
170
+ if last_end < len(model_output):
171
+ functions_calls.append(model_output[last_end:])
172
+ return functions_calls
173
+
174
+ def _get_function_calls_streaming(self, model_output: str) -> List[str]:
175
+ """
176
+ Extract function calls from streaming model output.
177
+
178
+ Finds both complete and incomplete tool calls in streaming context.
179
+
180
+ Args:
181
+ model_output (str): The streaming model output to parse.
182
+
183
+ Returns:
184
+ List[str]: List of tool call blocks (complete or incomplete).
185
+ """
186
+ matched_ranges = self.tool_call_regex.findall(model_output)
187
+ return matched_ranges
188
+
189
+ def extract_tool_calls(
190
+ self, model_output: str
191
+ ) -> List[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]:
192
+ """
193
+ Extract tool calls from complete model output.
194
+
195
+ Parses the model output to find tool calls and thinking blocks,
196
+ extracting function names and arguments from JSON content within
197
+ tool_call XML tags.
198
+
199
+ Args:
200
+ model_output (str): The complete output string from the model.
201
+
202
+ Returns:
203
+ List[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]:
204
+ A list of tuples where each tuple contains:
205
+ - content (str or None): Raw content if parsing failed, None if successful
206
+ - function_name (str or None): Name of the function to call
207
+ - arguments (dict or None): Function arguments
208
+
209
+ Example:
210
+ >>> parser = QwenToolParser()
211
+ >>> output = '<tool_call>\n{"name": "get_weather", "arguments": {"location": "Beijing"}}\n</tool_call>'
212
+ >>> result = parser.extract_tool_calls(output)
213
+ >>> print(result)
214
+ [(None, 'get_weather', {'location': 'Beijing'})]
215
+ """
216
+ # If no tool call tokens, return original output as content
217
+ if self.tool_call_start_token not in model_output:
218
+ return [(model_output, None, None)]
219
+
220
+ try:
221
+ function_calls = self._get_function_calls(model_output)
222
+ if len(function_calls) == 0:
223
+ return [(model_output, None, None)]
224
+
225
+ results: List[
226
+ Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]
227
+ ] = []
228
+ for function_call in function_calls:
229
+ try:
230
+ parsed_json = self._parse_json_function_call(function_call)
231
+ res = json.loads(parsed_json, strict=False)
232
+ results.append((None, res["name"], res["arguments"]))
233
+ except Exception as e:
234
+ logger.error(
235
+ "Can't parse single qwen tool call output: %s. Error: %s",
236
+ function_call,
237
+ e,
238
+ )
239
+ results.append((function_call, None, None))
240
+ return results
241
+
242
+ except Exception as e:
243
+ logger.error(
244
+ "Can't parse qwen tool call output: %s. Error: %s",
245
+ model_output,
246
+ e,
247
+ )
248
+ return [(model_output, None, None)]
249
+
250
+ def _has_unclosed_tool_call(self, text: str) -> bool:
251
+ """
252
+ Check if the text has unclosed tool_call tags.
253
+
254
+ Counts the number of opening and closing tool_call tags to determine
255
+ if there are any unclosed tool calls in the text.
256
+
257
+ Args:
258
+ text (str): The text to check for unclosed tags.
259
+
260
+ Returns:
261
+ bool: True if there are unclosed tool_call tags.
262
+ """
263
+ if not text:
264
+ return True
265
+ start_count = text.count(self.tool_call_start_token)
266
+ end_count = text.count(self.tool_call_end_token)
267
+ return start_count > end_count
268
+
269
+ def extract_tool_calls_streaming(
270
+ self, previous_text: List[str], current_text: str, delta_text: str
271
+ ) -> Optional[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]:
272
+ """
273
+ Extract tool calls from streaming output.
274
+
275
+ Processes streaming model output to detect and extract tool calls
276
+ as they are being generated. Handles incomplete tool calls and
277
+ determines when a complete tool call is available.
278
+
279
+ Args:
280
+ previous_text (List[str]): Previous text chunks from the stream.
281
+ current_text (str): Current accumulated text.
282
+ delta_text (str): New text delta in this chunk.
283
+
284
+ Returns:
285
+ Optional[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]:
286
+ A tuple containing:
287
+ - content (str or None): Text content or None for tool calls
288
+ - function_name (str or None): Name of the function to call
289
+ - arguments (dict or None): Function arguments
290
+ Returns None if no complete tool call is ready.
291
+
292
+ Note:
293
+ This method is designed to work with Qwen's streaming output format
294
+ and handles partial tool calls during generation.
295
+ """
296
+ try:
297
+ # Check if current output contains tool_call start token
298
+ if self.is_contain_tool_call_start_token(current_text):
299
+ function_calls = self._get_function_calls_streaming(current_text)
300
+ # If the last function call contains thinking, it's not a tool call
301
+ if self.is_contain_think(function_calls[-1]):
302
+ return None
303
+ # If the previous round's tool_call tags are closed, this is a new tool call
304
+ if not self._has_unclosed_tool_call(previous_text[-1]):
305
+ return None
306
+ # Parse and return
307
+ function_call = self._parse_json_function_call_stream(
308
+ function_calls[-1]
309
+ )
310
+ if function_call is None:
311
+ return None
312
+ res = json.loads(function_call, strict=False)
313
+ return None, res["name"], res["arguments"]
314
+ else:
315
+ # Return delta text as regular content
316
+ return (delta_text, None, None)
317
+
318
+ except Exception as e:
319
+ logger.error("Error in Qwen streaming tool call extraction: %s", e)
320
+ raise
@@ -332,6 +332,7 @@ class PytorchModel(LLM):
332
332
  self.prepare_parse_reasoning_content(
333
333
  reasoning_content, enable_thinking=enable_thinking
334
334
  )
335
+ self.prepare_parse_tool_calls()
335
336
 
336
337
  logger.debug("Loading Transformers model with kwargs: %s", kwargs)
337
338
 
@@ -983,7 +984,6 @@ class PytorchChatModel(PytorchModel, ChatModelMixin):
983
984
  self.model_family,
984
985
  self.model_uid,
985
986
  req.completion[0],
986
- self.reasoning_parser,
987
987
  )
988
988
  else:
989
989
  req.completion[0] = self._to_chat_completion(