maxframe 2.0.0b2__cp37-cp37m-win32.whl → 2.3.0rc1__cp37-cp37m-win32.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 maxframe might be problematic. Click here for more details.

Files changed (443) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cp37-win32.pyd +0 -0
  3. maxframe/_utils.pyx +14 -1
  4. maxframe/codegen/core.py +9 -8
  5. maxframe/codegen/spe/core.py +1 -1
  6. maxframe/codegen/spe/dataframe/__init__.py +1 -0
  7. maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
  8. maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
  9. maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
  10. maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
  11. maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
  12. maxframe/codegen/spe/dataframe/groupby.py +88 -0
  13. maxframe/codegen/spe/dataframe/indexing.py +99 -4
  14. maxframe/codegen/spe/dataframe/merge.py +38 -1
  15. maxframe/codegen/spe/dataframe/misc.py +11 -33
  16. maxframe/codegen/spe/dataframe/reduction.py +32 -9
  17. maxframe/codegen/spe/dataframe/reshape.py +46 -0
  18. maxframe/codegen/spe/dataframe/sort.py +39 -18
  19. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
  20. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
  21. maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
  22. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
  23. maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
  24. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
  25. maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
  26. maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
  27. maxframe/codegen/spe/dataframe/tests/test_reduction.py +13 -0
  28. maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
  29. maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
  30. maxframe/codegen/spe/dataframe/tseries.py +9 -0
  31. maxframe/codegen/spe/learn/contrib/lightgbm.py +4 -3
  32. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
  33. maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
  34. maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
  35. maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
  36. maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
  37. maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
  38. maxframe/codegen/spe/tensor/__init__.py +3 -0
  39. maxframe/codegen/spe/tensor/datasource.py +1 -0
  40. maxframe/codegen/spe/tensor/fft.py +74 -0
  41. maxframe/codegen/spe/tensor/linalg.py +29 -2
  42. maxframe/codegen/spe/tensor/misc.py +79 -25
  43. maxframe/codegen/spe/tensor/spatial.py +45 -0
  44. maxframe/codegen/spe/tensor/statistics.py +44 -0
  45. maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
  46. maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
  47. maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
  48. maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
  49. maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
  50. maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
  51. maxframe/codegen/spe/utils.py +2 -0
  52. maxframe/config/config.py +73 -9
  53. maxframe/config/tests/test_validators.py +13 -1
  54. maxframe/config/validators.py +49 -0
  55. maxframe/conftest.py +54 -17
  56. maxframe/core/accessor.py +2 -2
  57. maxframe/core/base.py +2 -1
  58. maxframe/core/entity/core.py +5 -0
  59. maxframe/core/entity/tileables.py +3 -1
  60. maxframe/core/graph/core.cp37-win32.pyd +0 -0
  61. maxframe/core/graph/entity.py +8 -3
  62. maxframe/core/mode.py +6 -1
  63. maxframe/core/operator/base.py +9 -2
  64. maxframe/core/operator/core.py +10 -2
  65. maxframe/core/operator/utils.py +13 -0
  66. maxframe/dataframe/__init__.py +12 -5
  67. maxframe/dataframe/accessors/__init__.py +1 -1
  68. maxframe/dataframe/accessors/compat.py +45 -0
  69. maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
  70. maxframe/dataframe/accessors/dict_/contains.py +7 -16
  71. maxframe/dataframe/accessors/dict_/core.py +48 -0
  72. maxframe/dataframe/accessors/dict_/getitem.py +17 -21
  73. maxframe/dataframe/accessors/dict_/length.py +7 -16
  74. maxframe/dataframe/accessors/dict_/remove.py +6 -18
  75. maxframe/dataframe/accessors/dict_/setitem.py +8 -18
  76. maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
  77. maxframe/dataframe/accessors/list_/__init__.py +2 -2
  78. maxframe/dataframe/accessors/list_/core.py +48 -0
  79. maxframe/dataframe/accessors/list_/getitem.py +12 -19
  80. maxframe/dataframe/accessors/list_/length.py +7 -16
  81. maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
  82. maxframe/dataframe/accessors/string_/__init__.py +4 -1
  83. maxframe/dataframe/accessors/struct_/__init__.py +37 -0
  84. maxframe/dataframe/accessors/struct_/accessor.py +39 -0
  85. maxframe/dataframe/accessors/struct_/core.py +43 -0
  86. maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
  87. maxframe/dataframe/accessors/struct_/field.py +123 -0
  88. maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
  89. maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
  90. maxframe/dataframe/arithmetic/__init__.py +18 -4
  91. maxframe/dataframe/arithmetic/between.py +106 -0
  92. maxframe/dataframe/arithmetic/dot.py +237 -0
  93. maxframe/dataframe/arithmetic/maximum.py +33 -0
  94. maxframe/dataframe/arithmetic/minimum.py +33 -0
  95. maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
  96. maxframe/dataframe/core.py +161 -224
  97. maxframe/dataframe/datasource/__init__.py +18 -0
  98. maxframe/dataframe/datasource/core.py +6 -0
  99. maxframe/dataframe/datasource/direct.py +57 -0
  100. maxframe/dataframe/datasource/from_dict.py +124 -0
  101. maxframe/dataframe/datasource/from_index.py +1 -1
  102. maxframe/dataframe/datasource/from_records.py +77 -0
  103. maxframe/dataframe/datasource/from_tensor.py +109 -41
  104. maxframe/dataframe/datasource/read_csv.py +21 -14
  105. maxframe/dataframe/datasource/read_odps_query.py +29 -6
  106. maxframe/dataframe/datasource/read_odps_table.py +32 -10
  107. maxframe/dataframe/datasource/read_parquet.py +38 -39
  108. maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
  109. maxframe/dataframe/datastore/__init__.py +11 -1
  110. maxframe/dataframe/datastore/direct.py +268 -0
  111. maxframe/dataframe/datastore/to_csv.py +29 -41
  112. maxframe/dataframe/datastore/to_odps.py +36 -4
  113. maxframe/dataframe/extensions/__init__.py +20 -4
  114. maxframe/dataframe/extensions/apply_chunk.py +32 -6
  115. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  116. maxframe/dataframe/extensions/collect_kv.py +126 -0
  117. maxframe/dataframe/extensions/extract_kv.py +177 -0
  118. maxframe/dataframe/extensions/flatjson.py +2 -1
  119. maxframe/dataframe/extensions/map_reduce.py +263 -0
  120. maxframe/dataframe/extensions/rebalance.py +62 -0
  121. maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
  122. maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
  123. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  124. maxframe/dataframe/groupby/__init__.py +17 -2
  125. maxframe/dataframe/groupby/aggregation.py +86 -49
  126. maxframe/dataframe/groupby/apply.py +1 -1
  127. maxframe/dataframe/groupby/apply_chunk.py +19 -5
  128. maxframe/dataframe/groupby/core.py +116 -16
  129. maxframe/dataframe/groupby/cum.py +4 -25
  130. maxframe/dataframe/groupby/expanding.py +264 -0
  131. maxframe/dataframe/groupby/fill.py +1 -1
  132. maxframe/dataframe/groupby/getitem.py +12 -5
  133. maxframe/dataframe/groupby/head.py +11 -1
  134. maxframe/dataframe/groupby/rank.py +136 -0
  135. maxframe/dataframe/groupby/rolling.py +206 -0
  136. maxframe/dataframe/groupby/shift.py +114 -0
  137. maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
  138. maxframe/dataframe/indexing/__init__.py +22 -2
  139. maxframe/dataframe/indexing/droplevel.py +195 -0
  140. maxframe/dataframe/indexing/filter.py +169 -0
  141. maxframe/dataframe/indexing/get_level_values.py +76 -0
  142. maxframe/dataframe/indexing/iat.py +45 -0
  143. maxframe/dataframe/indexing/iloc.py +152 -12
  144. maxframe/dataframe/indexing/insert.py +46 -18
  145. maxframe/dataframe/indexing/loc.py +287 -7
  146. maxframe/dataframe/indexing/reindex.py +14 -5
  147. maxframe/dataframe/indexing/rename.py +6 -0
  148. maxframe/dataframe/indexing/rename_axis.py +2 -2
  149. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  150. maxframe/dataframe/indexing/reset_index.py +33 -6
  151. maxframe/dataframe/indexing/sample.py +8 -0
  152. maxframe/dataframe/indexing/setitem.py +3 -3
  153. maxframe/dataframe/indexing/swaplevel.py +185 -0
  154. maxframe/dataframe/indexing/take.py +99 -0
  155. maxframe/dataframe/indexing/truncate.py +140 -0
  156. maxframe/dataframe/indexing/where.py +0 -11
  157. maxframe/dataframe/indexing/xs.py +148 -0
  158. maxframe/dataframe/merge/__init__.py +15 -1
  159. maxframe/dataframe/merge/append.py +97 -98
  160. maxframe/dataframe/merge/combine.py +244 -0
  161. maxframe/dataframe/merge/combine_first.py +120 -0
  162. maxframe/dataframe/merge/compare.py +387 -0
  163. maxframe/dataframe/merge/concat.py +183 -0
  164. maxframe/dataframe/merge/update.py +271 -0
  165. maxframe/dataframe/misc/__init__.py +28 -11
  166. maxframe/dataframe/misc/_duplicate.py +10 -4
  167. maxframe/dataframe/misc/apply.py +1 -1
  168. maxframe/dataframe/misc/check_unique.py +82 -0
  169. maxframe/dataframe/misc/clip.py +145 -0
  170. maxframe/dataframe/misc/describe.py +175 -9
  171. maxframe/dataframe/misc/drop.py +31 -0
  172. maxframe/dataframe/misc/drop_duplicates.py +2 -2
  173. maxframe/dataframe/misc/duplicated.py +2 -2
  174. maxframe/dataframe/misc/get_dummies.py +5 -1
  175. maxframe/dataframe/misc/infer_dtypes.py +251 -0
  176. maxframe/dataframe/misc/isin.py +2 -2
  177. maxframe/dataframe/misc/map.py +125 -18
  178. maxframe/dataframe/misc/repeat.py +159 -0
  179. maxframe/dataframe/misc/tests/test_misc.py +48 -3
  180. maxframe/dataframe/misc/to_numeric.py +3 -0
  181. maxframe/dataframe/misc/transform.py +12 -5
  182. maxframe/dataframe/misc/transpose.py +13 -1
  183. maxframe/dataframe/misc/valid_index.py +115 -0
  184. maxframe/dataframe/misc/value_counts.py +38 -4
  185. maxframe/dataframe/missing/checkna.py +14 -6
  186. maxframe/dataframe/missing/dropna.py +5 -0
  187. maxframe/dataframe/missing/fillna.py +1 -1
  188. maxframe/dataframe/missing/replace.py +7 -4
  189. maxframe/dataframe/reduction/__init__.py +35 -16
  190. maxframe/dataframe/reduction/aggregation.py +43 -14
  191. maxframe/dataframe/reduction/all.py +2 -2
  192. maxframe/dataframe/reduction/any.py +2 -2
  193. maxframe/dataframe/reduction/argmax.py +103 -0
  194. maxframe/dataframe/reduction/argmin.py +103 -0
  195. maxframe/dataframe/reduction/core.py +80 -24
  196. maxframe/dataframe/reduction/count.py +13 -9
  197. maxframe/dataframe/reduction/cov.py +166 -0
  198. maxframe/dataframe/reduction/cummax.py +2 -2
  199. maxframe/dataframe/reduction/cummin.py +2 -2
  200. maxframe/dataframe/reduction/cumprod.py +2 -2
  201. maxframe/dataframe/reduction/cumsum.py +2 -2
  202. maxframe/dataframe/reduction/custom_reduction.py +2 -2
  203. maxframe/dataframe/reduction/idxmax.py +185 -0
  204. maxframe/dataframe/reduction/idxmin.py +185 -0
  205. maxframe/dataframe/reduction/kurtosis.py +37 -30
  206. maxframe/dataframe/reduction/max.py +2 -2
  207. maxframe/dataframe/reduction/mean.py +9 -7
  208. maxframe/dataframe/reduction/median.py +2 -2
  209. maxframe/dataframe/reduction/min.py +2 -2
  210. maxframe/dataframe/reduction/mode.py +144 -0
  211. maxframe/dataframe/reduction/nunique.py +19 -11
  212. maxframe/dataframe/reduction/prod.py +18 -13
  213. maxframe/dataframe/reduction/reduction_size.py +2 -2
  214. maxframe/dataframe/reduction/sem.py +13 -9
  215. maxframe/dataframe/reduction/skew.py +31 -27
  216. maxframe/dataframe/reduction/str_concat.py +10 -7
  217. maxframe/dataframe/reduction/sum.py +18 -14
  218. maxframe/dataframe/reduction/tests/test_reduction.py +12 -0
  219. maxframe/dataframe/reduction/unique.py +20 -3
  220. maxframe/dataframe/reduction/var.py +16 -12
  221. maxframe/dataframe/reshape/__init__.py +38 -0
  222. maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
  223. maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
  224. maxframe/dataframe/reshape/unstack.py +114 -0
  225. maxframe/dataframe/sort/__init__.py +16 -1
  226. maxframe/dataframe/sort/argsort.py +68 -0
  227. maxframe/dataframe/sort/core.py +2 -1
  228. maxframe/dataframe/sort/nlargest.py +238 -0
  229. maxframe/dataframe/sort/nsmallest.py +228 -0
  230. maxframe/dataframe/sort/rank.py +147 -0
  231. maxframe/dataframe/statistics/__init__.py +3 -3
  232. maxframe/dataframe/statistics/corr.py +1 -0
  233. maxframe/dataframe/statistics/quantile.py +2 -2
  234. maxframe/dataframe/tests/test_typing.py +104 -0
  235. maxframe/dataframe/tests/test_utils.py +66 -2
  236. maxframe/dataframe/tseries/__init__.py +19 -0
  237. maxframe/dataframe/tseries/at_time.py +61 -0
  238. maxframe/dataframe/tseries/between_time.py +122 -0
  239. maxframe/dataframe/typing_.py +185 -0
  240. maxframe/dataframe/utils.py +125 -52
  241. maxframe/dataframe/window/aggregation.py +8 -4
  242. maxframe/dataframe/window/core.py +14 -1
  243. maxframe/dataframe/window/ewm.py +1 -3
  244. maxframe/dataframe/window/expanding.py +37 -35
  245. maxframe/dataframe/window/rolling.py +49 -39
  246. maxframe/dataframe/window/tests/test_expanding.py +1 -7
  247. maxframe/dataframe/window/tests/test_rolling.py +1 -1
  248. maxframe/env.py +7 -4
  249. maxframe/errors.py +2 -2
  250. maxframe/io/odpsio/schema.py +9 -3
  251. maxframe/io/odpsio/tableio.py +7 -2
  252. maxframe/io/odpsio/tests/test_schema.py +198 -83
  253. maxframe/learn/__init__.py +10 -2
  254. maxframe/learn/cluster/__init__.py +15 -0
  255. maxframe/learn/cluster/_kmeans.py +782 -0
  256. maxframe/learn/contrib/llm/core.py +18 -7
  257. maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
  258. maxframe/learn/contrib/llm/deploy/config.py +221 -0
  259. maxframe/learn/contrib/llm/deploy/core.py +247 -0
  260. maxframe/learn/contrib/llm/deploy/framework.py +35 -0
  261. maxframe/learn/contrib/llm/deploy/loader.py +360 -0
  262. maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
  263. maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
  264. maxframe/learn/contrib/llm/models/__init__.py +1 -0
  265. maxframe/learn/contrib/llm/models/dashscope.py +12 -6
  266. maxframe/learn/contrib/llm/models/managed.py +76 -11
  267. maxframe/learn/contrib/llm/models/openai.py +72 -0
  268. maxframe/learn/contrib/llm/tests/__init__.py +13 -0
  269. maxframe/learn/contrib/llm/tests/test_core.py +34 -0
  270. maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
  271. maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
  272. maxframe/learn/contrib/llm/text.py +348 -42
  273. maxframe/learn/contrib/models.py +4 -1
  274. maxframe/learn/contrib/xgboost/classifier.py +2 -0
  275. maxframe/learn/contrib/xgboost/core.py +113 -4
  276. maxframe/learn/contrib/xgboost/predict.py +4 -2
  277. maxframe/learn/contrib/xgboost/regressor.py +5 -0
  278. maxframe/learn/contrib/xgboost/train.py +7 -2
  279. maxframe/learn/core.py +66 -0
  280. maxframe/learn/linear_model/_base.py +58 -1
  281. maxframe/learn/linear_model/_lin_reg.py +1 -1
  282. maxframe/learn/metrics/__init__.py +6 -0
  283. maxframe/learn/metrics/_classification.py +145 -0
  284. maxframe/learn/metrics/_ranking.py +477 -0
  285. maxframe/learn/metrics/_scorer.py +60 -0
  286. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  287. maxframe/learn/metrics/pairwise/core.py +77 -0
  288. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  289. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  290. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  291. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  292. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  293. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  294. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  295. maxframe/learn/metrics/tests/__init__.py +13 -0
  296. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  297. maxframe/learn/preprocessing/_data/min_max_scaler.py +34 -23
  298. maxframe/learn/preprocessing/_data/standard_scaler.py +34 -25
  299. maxframe/learn/utils/__init__.py +2 -1
  300. maxframe/learn/utils/checks.py +1 -2
  301. maxframe/learn/utils/core.py +59 -0
  302. maxframe/learn/utils/extmath.py +79 -9
  303. maxframe/learn/utils/odpsio.py +262 -0
  304. maxframe/learn/utils/validation.py +2 -2
  305. maxframe/lib/compat.py +40 -0
  306. maxframe/lib/dtypes_extension/__init__.py +16 -1
  307. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  308. maxframe/lib/dtypes_extension/blob.py +304 -0
  309. maxframe/lib/dtypes_extension/dtypes.py +40 -0
  310. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  311. maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
  312. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  313. maxframe/lib/filesystem/_oss_lib/common.py +124 -50
  314. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  315. maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
  316. maxframe/lib/filesystem/base.py +1 -1
  317. maxframe/lib/filesystem/core.py +1 -1
  318. maxframe/lib/filesystem/oss.py +115 -46
  319. maxframe/lib/filesystem/tests/test_oss.py +74 -36
  320. maxframe/lib/mmh3.cp37-win32.pyd +0 -0
  321. maxframe/lib/wrapped_pickle.py +10 -0
  322. maxframe/opcodes.py +41 -15
  323. maxframe/protocol.py +12 -0
  324. maxframe/remote/core.py +4 -0
  325. maxframe/serialization/__init__.py +11 -2
  326. maxframe/serialization/arrow.py +38 -13
  327. maxframe/serialization/blob.py +32 -0
  328. maxframe/serialization/core.cp37-win32.pyd +0 -0
  329. maxframe/serialization/core.pyx +39 -1
  330. maxframe/serialization/exception.py +2 -4
  331. maxframe/serialization/numpy.py +11 -0
  332. maxframe/serialization/pandas.py +46 -9
  333. maxframe/serialization/serializables/core.py +2 -2
  334. maxframe/serialization/tests/test_serial.py +31 -4
  335. maxframe/tensor/__init__.py +38 -8
  336. maxframe/tensor/arithmetic/__init__.py +19 -10
  337. maxframe/tensor/arithmetic/core.py +2 -2
  338. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  339. maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -9
  340. maxframe/tensor/core.py +6 -2
  341. maxframe/tensor/datasource/tests/test_datasource.py +2 -1
  342. maxframe/tensor/extensions/__init__.py +2 -0
  343. maxframe/tensor/extensions/apply_chunk.py +3 -3
  344. maxframe/tensor/extensions/rebalance.py +65 -0
  345. maxframe/tensor/fft/__init__.py +32 -0
  346. maxframe/tensor/fft/core.py +168 -0
  347. maxframe/tensor/fft/fft.py +112 -0
  348. maxframe/tensor/fft/fft2.py +118 -0
  349. maxframe/tensor/fft/fftfreq.py +80 -0
  350. maxframe/tensor/fft/fftn.py +123 -0
  351. maxframe/tensor/fft/fftshift.py +79 -0
  352. maxframe/tensor/fft/hfft.py +112 -0
  353. maxframe/tensor/fft/ifft.py +114 -0
  354. maxframe/tensor/fft/ifft2.py +115 -0
  355. maxframe/tensor/fft/ifftn.py +123 -0
  356. maxframe/tensor/fft/ifftshift.py +73 -0
  357. maxframe/tensor/fft/ihfft.py +93 -0
  358. maxframe/tensor/fft/irfft.py +118 -0
  359. maxframe/tensor/fft/irfft2.py +62 -0
  360. maxframe/tensor/fft/irfftn.py +114 -0
  361. maxframe/tensor/fft/rfft.py +116 -0
  362. maxframe/tensor/fft/rfft2.py +63 -0
  363. maxframe/tensor/fft/rfftfreq.py +87 -0
  364. maxframe/tensor/fft/rfftn.py +113 -0
  365. maxframe/tensor/indexing/fill_diagonal.py +1 -7
  366. maxframe/tensor/linalg/__init__.py +7 -0
  367. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  368. maxframe/tensor/linalg/cholesky.py +117 -0
  369. maxframe/tensor/linalg/einsum.py +339 -0
  370. maxframe/tensor/linalg/lstsq.py +100 -0
  371. maxframe/tensor/linalg/matrix_norm.py +75 -0
  372. maxframe/tensor/linalg/norm.py +249 -0
  373. maxframe/tensor/linalg/solve.py +72 -0
  374. maxframe/tensor/linalg/solve_triangular.py +2 -2
  375. maxframe/tensor/linalg/vector_norm.py +113 -0
  376. maxframe/tensor/misc/__init__.py +24 -1
  377. maxframe/tensor/misc/argwhere.py +72 -0
  378. maxframe/tensor/misc/array_split.py +46 -0
  379. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  380. maxframe/tensor/misc/copyto.py +130 -0
  381. maxframe/tensor/misc/delete.py +104 -0
  382. maxframe/tensor/misc/dsplit.py +68 -0
  383. maxframe/tensor/misc/ediff1d.py +74 -0
  384. maxframe/tensor/misc/expand_dims.py +85 -0
  385. maxframe/tensor/misc/flip.py +90 -0
  386. maxframe/tensor/misc/fliplr.py +64 -0
  387. maxframe/tensor/misc/flipud.py +68 -0
  388. maxframe/tensor/misc/hsplit.py +85 -0
  389. maxframe/tensor/misc/insert.py +139 -0
  390. maxframe/tensor/misc/moveaxis.py +83 -0
  391. maxframe/tensor/misc/result_type.py +88 -0
  392. maxframe/tensor/misc/roll.py +124 -0
  393. maxframe/tensor/misc/rollaxis.py +77 -0
  394. maxframe/tensor/misc/shape.py +89 -0
  395. maxframe/tensor/misc/split.py +190 -0
  396. maxframe/tensor/misc/tile.py +109 -0
  397. maxframe/tensor/misc/vsplit.py +74 -0
  398. maxframe/tensor/reduction/array_equal.py +2 -1
  399. maxframe/tensor/sort/__init__.py +2 -0
  400. maxframe/tensor/sort/argpartition.py +98 -0
  401. maxframe/tensor/sort/partition.py +228 -0
  402. maxframe/tensor/spatial/__init__.py +15 -0
  403. maxframe/tensor/spatial/distance/__init__.py +17 -0
  404. maxframe/tensor/spatial/distance/cdist.py +421 -0
  405. maxframe/tensor/spatial/distance/pdist.py +398 -0
  406. maxframe/tensor/spatial/distance/squareform.py +153 -0
  407. maxframe/tensor/special/__init__.py +159 -21
  408. maxframe/tensor/special/airy.py +55 -0
  409. maxframe/tensor/special/bessel.py +199 -0
  410. maxframe/tensor/special/core.py +65 -4
  411. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  412. maxframe/tensor/special/ellip_harm.py +55 -0
  413. maxframe/tensor/special/err_fresnel.py +223 -0
  414. maxframe/tensor/special/gamma_funcs.py +303 -0
  415. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  416. maxframe/tensor/special/info_theory.py +189 -0
  417. maxframe/tensor/special/misc.py +21 -0
  418. maxframe/tensor/statistics/__init__.py +6 -0
  419. maxframe/tensor/statistics/corrcoef.py +77 -0
  420. maxframe/tensor/statistics/cov.py +222 -0
  421. maxframe/tensor/statistics/digitize.py +126 -0
  422. maxframe/tensor/statistics/histogram.py +520 -0
  423. maxframe/tensor/statistics/median.py +85 -0
  424. maxframe/tensor/statistics/ptp.py +89 -0
  425. maxframe/tensor/utils.py +3 -3
  426. maxframe/tests/test_udf.py +61 -0
  427. maxframe/tests/test_utils.py +51 -6
  428. maxframe/tests/utils.py +0 -2
  429. maxframe/typing_.py +2 -0
  430. maxframe/udf.py +130 -9
  431. maxframe/utils.py +254 -27
  432. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/METADATA +3 -3
  433. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/RECORD +442 -264
  434. maxframe_client/fetcher.py +35 -4
  435. maxframe_client/session/odps.py +7 -2
  436. maxframe_client/session/task.py +8 -1
  437. maxframe_client/tests/test_fetcher.py +76 -3
  438. maxframe_client/tests/test_session.py +28 -1
  439. maxframe/dataframe/arrays.py +0 -864
  440. /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
  441. /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
  442. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/WHEEL +0 -0
  443. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -20,11 +20,16 @@ import pandas as pd
20
20
  from ....core.entity.output_types import OutputType
21
21
  from ....core.operator.base import Operator
22
22
  from ....core.operator.core import TileableOperatorMixin
23
- from ....dataframe.core import SERIES_TYPE
24
23
  from ....dataframe.operators import DataFrameOperatorMixin
25
24
  from ....dataframe.utils import parse_index
25
+ from ....serialization.serializables import Int32Field
26
26
  from ....serialization.serializables.core import Serializable
27
- from ....serialization.serializables.field import AnyField, DictField, StringField
27
+ from ....serialization.serializables.field import (
28
+ AnyField,
29
+ BoolField,
30
+ DictField,
31
+ StringField,
32
+ )
28
33
 
29
34
 
30
35
  class LLM(Serializable):
@@ -39,6 +44,7 @@ class LLMTaskOperator(Operator, DataFrameOperatorMixin):
39
44
  model = AnyField("model", default=None)
40
45
  params = DictField("params", default=None)
41
46
  running_options: Dict[str, Any] = DictField("running_options", default=None)
47
+ timeout = Int32Field("timeout", default=None)
42
48
 
43
49
  def __init__(self, output_types=None, **kw):
44
50
  if output_types is None:
@@ -53,11 +59,7 @@ class LLMTaskOperator(Operator, DataFrameOperatorMixin):
53
59
  col_name = list(outputs.keys())
54
60
  columns = parse_index(pd.Index(col_name), store_data=True)
55
61
  out_dtypes = pd.Series(list(outputs.values()), index=col_name)
56
- index_value = index or (
57
- parse_index(pd.RangeIndex(-1), data)
58
- if isinstance(data, SERIES_TYPE)
59
- else data.index_value
60
- )
62
+ index_value = index or data.index_value
61
63
 
62
64
  return self.new_dataframe(
63
65
  inputs=[data],
@@ -73,3 +75,12 @@ class LLMTextGenOperator(LLMTaskOperator, TileableOperatorMixin):
73
75
 
74
76
  def get_output_dtypes(self) -> Dict[str, np.dtype]:
75
77
  return {"response": np.dtype("O"), "success": np.dtype("bool")}
78
+
79
+
80
+ class LLMTextEmbeddingOp(LLMTaskOperator, TileableOperatorMixin):
81
+ dimensions = Int32Field("dimensions", default=None)
82
+ encoding_format = StringField("encoding_format", default=None)
83
+ simple_output = BoolField("simple_output", default=False)
84
+
85
+ def get_output_dtypes(self) -> Dict[str, np.dtype]:
86
+ return {"response": np.dtype("O"), "success": np.dtype("bool")}
@@ -0,0 +1,13 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
@@ -0,0 +1,221 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from copy import deepcopy
16
+ from typing import Any, Dict, List, Optional, Union
17
+
18
+ from .....protocol import Serializable
19
+ from .....serialization.serializables import StringField
20
+ from .....serialization.serializables.field import (
21
+ DictField,
22
+ EnumField,
23
+ Int32Field,
24
+ ListField,
25
+ )
26
+ from .....serialization.serializables.field_type import FieldTypes
27
+ from .framework import InferenceFrameworkEnum
28
+
29
+
30
+ class ModelDeploymentConfig(Serializable):
31
+ """
32
+ Model deployment configuration for extending MaxFrame with custom models.
33
+
34
+ This configuration is designed for users who need to deploy models that are not
35
+ available within MaxFrame's built-in model offerings. It provides a way to specify
36
+ custom deployment solutions by informing each MaxFrame worker which framework to use,
37
+ which model path to load, and how to load it.
38
+
39
+ The configuration assumes that models are already set up in the container image or
40
+ mounted paths, and uses the current deploy_config to load them. Users are responsible
41
+ for ensuring the runtime environment state and compatibility.
42
+
43
+ Parameters
44
+ ----------
45
+ model_name: str
46
+ The name of the model.
47
+ model_file: str
48
+ The file path of the model.
49
+ inference_framework_type: InferenceFrameworkEnum
50
+ The inference framework of the model.
51
+ required_resource_files: List[Union[str, Any]]
52
+ The required resource files of the model.
53
+ load_params: Dict[str, Any]
54
+ The load params of the model.
55
+ required_cpu: int
56
+ The required cpu of the model.
57
+ required_memory: int
58
+ The required memory of the model.
59
+ required_gu: int
60
+ The required gu of the model.
61
+ required_gpu_memory: int
62
+ The required gpu memory of the model.
63
+ device: str
64
+ The device of the model. One of "cpu" or "cuda".
65
+ properties: Dict[str, Any]
66
+ The properties of the model.
67
+ tags: List[str]
68
+ The tags of the model.
69
+
70
+ Notes
71
+ -----
72
+ - Preview version for model deployments, all fields could be changed in the future.
73
+
74
+ **User Responsibility Notice**: Users must have a complete understanding of what
75
+ they are computing and ensure they fully comprehend the implications of their
76
+ configuration choices. You are responsible for:
77
+
78
+ * Ensuring model compatibility with the specified inference framework
79
+ * Verifying that model files exist and are accessible in the runtime environment
80
+ * Confirming that resource requirements (CPU, memory, GPU) are adequate
81
+ * Validating that all dependencies and libraries are properly installed
82
+ * Understanding the computational behavior and characteristics of your chosen model
83
+
84
+ Examples
85
+ --------
86
+ >>> from maxframe.learn.contrib.llm.deploy.config import ModelDeploymentConfig
87
+ >>> from maxframe.learn.contrib.llm.deploy.framework import InferenceFrameworkEnum
88
+ >>> from maxframe.learn.contrib.llm.models.managed import ManagedTextGenLLM
89
+
90
+ >>> # Configure model deployment with VLLM framework
91
+ >>> model_config = ModelDeploymentConfig(
92
+ ... # Path to the model files (assumed to be available in container/mount)
93
+ ... model_file="/models/Qwen3-4B-Instruct-2507-FP8",
94
+ ... # Use VLLM serving framework for text generation
95
+ ... inference_framework_type=InferenceFrameworkEnum.VLLM_SERVE_TEXT,
96
+ ... # Framework-specific loading parameters
97
+ ... load_params={
98
+ ... "max_context_tokens": 4096, # Maximum context length for the model
99
+ ... "max_startup_wait_seconds": 600 # Max wait time for model startup
100
+ ... },
101
+ ... # Target device for inference
102
+ ... device="cuda",
103
+ ... # Resource requirements (2 GPU units)
104
+ ... required_gu=2,
105
+ ... # Model tags for capabilities
106
+ ... tags=["text-generation"],
107
+ ... )
108
+
109
+ >>> # Create managed LLM instance with the deployment configuration
110
+ >>> llm = ManagedTextGenLLM(name="my-model", deploy_config=model_config)
111
+ >>> # Generate text using the deployed model.
112
+ >>> result_df = llm.generate(
113
+ ... df, # Input DataFrame containing prompts
114
+ ... prompt_template=messages, # Template for formatting prompts
115
+ ... running_options={
116
+ ... "max_context_tokens": 4096, # Runtime context limit
117
+ ... },
118
+ ... params={
119
+ ... "temperature": 0.7, # Sampling temperature
120
+ ... "max_tokens": 2048 # Maximum tokens to generate
121
+ ... },
122
+ ... )
123
+
124
+ To make this model config working with the ManagedTextGenLLM,
125
+ you need to provide a custom image with the required dependencies and model files.
126
+
127
+ """
128
+
129
+ model_name: str = StringField("model_name")
130
+ model_file: str = StringField("model_file")
131
+ inference_framework_type: InferenceFrameworkEnum = EnumField(
132
+ "inference_framework_type", enum_type=InferenceFrameworkEnum
133
+ )
134
+ required_resource_files: List[Union[str, Any]] = ListField(
135
+ "required_resource_files", field_type=FieldTypes.any, default_factory=list
136
+ )
137
+ load_params: Dict[str, Any] = DictField(
138
+ "load_params",
139
+ key_type=FieldTypes.string,
140
+ value_type=FieldTypes.any,
141
+ default_factory=dict,
142
+ )
143
+ required_cpu: Optional[int] = Int32Field("required_cpu", default=None)
144
+ required_memory: Optional[int] = Int32Field("required_memory", default=None)
145
+ required_gu: Optional[int] = Int32Field("required_gu", default=None)
146
+ required_gpu_memory: Optional[int] = Int32Field("required_gpu_memory", default=None)
147
+ device: str = StringField("device")
148
+ properties: Dict[str, Any] = DictField(
149
+ "properties",
150
+ key_type=FieldTypes.string,
151
+ value_type=FieldTypes.any,
152
+ default_factory=dict,
153
+ )
154
+ tags: List[str] = ListField(
155
+ "tags",
156
+ field_type=FieldTypes.string,
157
+ default_factory=list,
158
+ )
159
+
160
+ def is_reasoning_model(self):
161
+ if self.properties is None:
162
+ return False
163
+ return self.properties.get("reasoning_model", False)
164
+
165
+ def copy(self) -> "ModelDeploymentConfig":
166
+ return deepcopy(self)
167
+
168
+ def __eq__(self, other):
169
+ if not isinstance(other, ModelDeploymentConfig):
170
+ return False
171
+
172
+ return (
173
+ self.model_name == other.model_name
174
+ and self.model_file == other.model_file
175
+ and self.inference_framework_type == other.inference_framework_type
176
+ and self.required_resource_files == other.required_resource_files
177
+ and self.load_params == other.load_params
178
+ and self.required_cpu == other.required_cpu
179
+ and self.required_memory == other.required_memory
180
+ and self.required_gu == other.required_gu
181
+ and self.required_gpu_memory == other.required_gpu_memory
182
+ and self.device == other.device
183
+ and self.properties == other.properties
184
+ and self.tags == other.tags
185
+ )
186
+
187
+ def __hash__(self):
188
+ return hash(
189
+ (
190
+ self.model_name,
191
+ self.model_file,
192
+ self.inference_framework_type,
193
+ self.required_resource_files,
194
+ self.load_params,
195
+ self.required_cpu,
196
+ self.required_memory,
197
+ self.required_gu,
198
+ self.required_gpu_memory,
199
+ self.device,
200
+ self.properties,
201
+ self.tags,
202
+ )
203
+ )
204
+
205
+ def check_validity(self):
206
+ required_fields = [
207
+ "model_name",
208
+ "model_file",
209
+ "inference_framework_type",
210
+ "device",
211
+ ]
212
+ for field in required_fields:
213
+ if getattr(self, field) is None:
214
+ raise ValueError(f"{field} is required")
215
+
216
+ one_of_fields = ["required_cpu", "required_gu"]
217
+ if not any(getattr(self, field) is not None for field in one_of_fields):
218
+ raise ValueError(f"At least one of {one_of_fields} is required")
219
+
220
+ if not self.tags:
221
+ raise ValueError("tags is required")
@@ -0,0 +1,247 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import Any, Dict, List, Optional, Union
16
+
17
+ from odps.models import Resource as ODPSResource
18
+
19
+ from .....serialization.serializables import Serializable, StringField
20
+ from .config import ModelDeploymentConfig
21
+ from .framework import InferenceFrameworkEnum
22
+
23
+ _registered_llm_models = {}
24
+
25
+
26
+ class ResourceNameTemplate(Serializable):
27
+ """
28
+ A template-based resource name builder that supports variable substitution.
29
+ All values in the substitution dict will have their hyphens (-) replaced with underscores (_).
30
+
31
+ Example:
32
+ template = ResourceNameTemplate(
33
+ project="my_project",
34
+ schema="schema_{region_id}",
35
+ name="resource_{env}"
36
+ )
37
+ # Render with variables
38
+ full_name = template.build_full_resource_name({"region_id": "cn-hangzhou", "env": "prod"})
39
+ # Result: resource name with cn_hangzhou and prod substituted
40
+ """
41
+
42
+ project: str = StringField("project", default=None)
43
+ schema: str = StringField("schema", default=None)
44
+ name: str = StringField("name")
45
+
46
+ def build_full_resource_name(self, template_vars: Dict[str, Any]):
47
+ """
48
+ Build full resource name with template variable substitution.
49
+ """
50
+ normalized_vars = {
51
+ key: str(value).replace("-", "_") for key, value in template_vars.items()
52
+ }
53
+
54
+ project, schema, name = self.project, self.schema, self.name
55
+ res_name = ODPSResource.build_full_resource_name(
56
+ name=name, project_name=project, schema_name=schema
57
+ )
58
+ try:
59
+ return res_name.format(**normalized_vars)
60
+ except KeyError:
61
+ # If template variable is missing, return as-is
62
+ return res_name
63
+
64
+ def __eq__(self, other):
65
+ if not isinstance(other, ResourceNameTemplate):
66
+ return False
67
+ return (
68
+ self.project == other.project
69
+ and self.schema == other.schema
70
+ and self.name == other.name
71
+ )
72
+
73
+ def __hash__(self):
74
+ return hash((self.project, self.schema, self.name))
75
+
76
+ def to_json(self) -> dict:
77
+ ret = {"name": self.name}
78
+ if self.project:
79
+ ret["project"] = self.project
80
+ if self.schema:
81
+ ret["schema"] = self.schema
82
+ return ret
83
+
84
+ @classmethod
85
+ def from_json(cls, serialized: dict) -> "ResourceNameTemplate":
86
+ kw = serialized.copy()
87
+ return cls(
88
+ project=kw.get("project"),
89
+ schema=kw.get("schema"),
90
+ name=kw["name"],
91
+ )
92
+
93
+
94
+ def create_model_deployments(
95
+ model_name: str,
96
+ model_file: str,
97
+ inference_frameworks: Union[
98
+ str, InferenceFrameworkEnum, List[InferenceFrameworkEnum]
99
+ ],
100
+ required_resources: List[Union[str, ResourceNameTemplate]] = None,
101
+ default_load_params: Optional[Dict[str, Any]] = None,
102
+ required_cpu: Optional[float] = None,
103
+ required_memory: Optional[int] = None,
104
+ required_gu: Optional[int] = None,
105
+ required_gpu_memory: Optional[int] = None,
106
+ device: str = None,
107
+ properties: Optional[Dict[str, Any]] = None,
108
+ tags: Optional[List[str]] = None,
109
+ ):
110
+ frameworks_to_register = (
111
+ [inference_frameworks]
112
+ if isinstance(inference_frameworks, (str, InferenceFrameworkEnum))
113
+ else inference_frameworks
114
+ )
115
+
116
+ deployment_configs = []
117
+ for inference_framework in frameworks_to_register:
118
+ inference_framework = (
119
+ InferenceFrameworkEnum.from_string(inference_framework)
120
+ if isinstance(inference_framework, str)
121
+ else inference_framework
122
+ )
123
+
124
+ model_config = ModelDeploymentConfig(
125
+ model_name=model_name,
126
+ model_file=model_file,
127
+ inference_framework_type=inference_framework,
128
+ required_resource_files=required_resources,
129
+ load_params=default_load_params,
130
+ required_cpu=required_cpu,
131
+ required_memory=required_memory,
132
+ required_gu=required_gu,
133
+ required_gpu_memory=required_gpu_memory,
134
+ device=device,
135
+ properties=properties,
136
+ tags=tags,
137
+ )
138
+ deployment_configs.append(model_config)
139
+ return deployment_configs
140
+
141
+
142
+ def register_model_deployments(
143
+ model_name: str,
144
+ model_file: str,
145
+ inference_frameworks: Union[
146
+ str, InferenceFrameworkEnum, List[InferenceFrameworkEnum]
147
+ ],
148
+ required_resources: List[Union[str, ResourceNameTemplate]] = None,
149
+ default_load_params: Optional[Dict[str, Any]] = None,
150
+ required_cpu: Optional[float] = None,
151
+ required_memory: Optional[int] = None,
152
+ required_gu: Optional[int] = None,
153
+ required_gpu_memory: Optional[int] = None,
154
+ device: str = None,
155
+ properties: Optional[Dict[str, Any]] = None,
156
+ tags: Optional[List[str]] = None,
157
+ ):
158
+ """
159
+ Register model deployments
160
+
161
+ Notes
162
+ -----
163
+ - Alpha version for model deployments, all fields could be changed in the future.
164
+ """
165
+ model_name = model_name.lower()
166
+ if not isinstance(inference_frameworks, (InferenceFrameworkEnum, List, str)):
167
+ raise TypeError(
168
+ f"inference_framework_type must be type InferenceFrameworkEnum or List[InferenceFrameworkEnum] but {type(inference_frameworks)}"
169
+ )
170
+
171
+ model_deployments = create_model_deployments(
172
+ model_name=model_name,
173
+ model_file=model_file,
174
+ inference_frameworks=inference_frameworks,
175
+ required_resources=required_resources,
176
+ default_load_params=default_load_params,
177
+ required_cpu=required_cpu,
178
+ required_memory=required_memory,
179
+ required_gu=required_gu,
180
+ required_gpu_memory=required_gpu_memory,
181
+ device=device,
182
+ properties=properties,
183
+ tags=tags,
184
+ )
185
+
186
+ for deployment in model_deployments:
187
+ if model_name not in _registered_llm_models:
188
+ _registered_llm_models[model_name] = {}
189
+ if deployment.device not in _registered_llm_models[model_name]:
190
+ _registered_llm_models[model_name][deployment.device] = {}
191
+
192
+ existing = _registered_llm_models[model_name][deployment.device].get(
193
+ deployment.inference_framework_type
194
+ )
195
+
196
+ if existing:
197
+ raise ValueError(
198
+ f"Model {model_name} with {deployment.inference_framework_type} on {deployment.device} already registered"
199
+ )
200
+
201
+ _registered_llm_models[model_name][deployment.device][
202
+ deployment.inference_framework_type
203
+ ] = deployment
204
+
205
+ return model_deployments
206
+
207
+
208
+ def get_registered_model_config(
209
+ model_name: str,
210
+ expected_device: Optional[str] = None,
211
+ expected_inference_framework: Optional[InferenceFrameworkEnum] = None,
212
+ ) -> Optional[ModelDeploymentConfig]:
213
+ model_name = model_name.lower()
214
+
215
+ def _load_model_framework_config(framework_configs, expected_framework):
216
+ if expected_framework is not None:
217
+ return framework_configs[expected_framework]
218
+ else:
219
+ model_config = next(iter(framework_configs.values()))
220
+ return model_config
221
+
222
+ try:
223
+ if expected_device is not None:
224
+ model_framework_configs = _registered_llm_models[model_name][
225
+ expected_device
226
+ ]
227
+ return _load_model_framework_config(
228
+ model_framework_configs, expected_inference_framework
229
+ )
230
+ else:
231
+ model_all_configs = _registered_llm_models[model_name]
232
+ for device, model_framework_configs in model_all_configs.items():
233
+ model_config = _load_model_framework_config(
234
+ model_framework_configs, expected_inference_framework
235
+ )
236
+ if model_config:
237
+ return model_config
238
+ except KeyError:
239
+ pass
240
+ except StopIteration:
241
+ pass
242
+
243
+ return None
244
+
245
+
246
+ def clean_registered_model():
247
+ _registered_llm_models.clear()
@@ -0,0 +1,35 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from enum import Enum
16
+
17
+
18
+ class InferenceFrameworkEnum(Enum):
19
+ LLAMA_CPP_PYTHON_TEXT = "LLAMA_CPP_PYTHON:TEXT"
20
+ LLAMA_CPP_SERVE_TEXT = "LLAMA_CPP_SERVE:TEXT"
21
+ DASH_SCOPE_TEXT = "DASH_SCOPE:TEXT"
22
+ DASH_SCOPE_MULTIMODAL = "DASH_SCOPE:MULTIMODAL"
23
+ VLLM_SERVE_TEXT = "VLLM_SERVE:TEXT"
24
+ OPENAI_REMOTE_TEXT = "OPENAI_REMOTE:TEXT"
25
+ OTHER = "OTHER"
26
+
27
+ @classmethod
28
+ def from_string(cls, label):
29
+ if label is None:
30
+ return None
31
+
32
+ if isinstance(label, cls):
33
+ return label
34
+
35
+ return cls(label)