uapi-sdk-python 0.1.15__tar.gz → 0.1.17__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uapi-sdk-python
3
- Version: 0.1.15
3
+ Version: 0.1.17
4
4
  Summary: Idiomatic UAPI SDK for Python
5
5
  Author-email: UAPI <dev@uapis.cn>
6
6
  Requires-Python: >=3.9
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "uapi-sdk-python"
7
- version = "0.1.15"
7
+ version = "0.1.17"
8
8
  description = "Idiomatic UAPI SDK for Python"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -3,6 +3,7 @@ from dataclasses import dataclass
3
3
  from typing import Any, Dict, Optional
4
4
  import httpx
5
5
  import time
6
+ from pathlib import Path
6
7
 
7
8
  from .errors import *
8
9
  # internal models live under ./internal (generated by openapi-generator-cli)
@@ -37,6 +38,31 @@ def _coerce_optional_bool(value: Any) -> Optional[bool]:
37
38
  return bool(value)
38
39
  return bool(value)
39
40
 
41
+
42
+ def _stringify_form_value(value: Any) -> str:
43
+ if isinstance(value, bool):
44
+ return "true" if value else "false"
45
+ return str(value)
46
+
47
+
48
+ def _prepare_file_value(value: Any):
49
+ if isinstance(value, (str, Path)):
50
+ path = Path(value)
51
+ if not path.is_file():
52
+ raise FileNotFoundError(f"File not found: {path}")
53
+ return (path.name, path.read_bytes())
54
+ if isinstance(value, (bytes, bytearray)):
55
+ return ("upload.bin", bytes(value))
56
+ if isinstance(value, tuple):
57
+ return value
58
+ if hasattr(value, "read"):
59
+ content = value.read()
60
+ if isinstance(content, str):
61
+ content = content.encode("utf-8")
62
+ file_name = Path(getattr(value, "name", "upload.bin")).name
63
+ return (file_name or "upload.bin", content)
64
+ raise TypeError(f"Unsupported multipart file value: {type(value)!r}")
65
+
40
66
  class _HTTP:
41
67
  def __init__(self, cfg: _Config):
42
68
  self._cfg = cfg
@@ -62,6 +88,8 @@ class _HTTP:
62
88
  *,
63
89
  params: Dict[str, Any] | None = None,
64
90
  json: Any | None = None,
91
+ data: Dict[str, Any] | None = None,
92
+ files: Dict[str, Any] | None = None,
65
93
  headers: Dict[str, str] | None = None,
66
94
  disable_cache: bool | None = None,
67
95
  ):
@@ -70,7 +98,7 @@ class _HTTP:
70
98
  if self._cfg.token:
71
99
  headers["Authorization"] = f"Bearer {self._cfg.token}"
72
100
  query = self._apply_cache_control(method, params, disable_cache)
73
- r = self._client.request(method, url, params=query, json=json, headers=headers)
101
+ r = self._client.request(method, url, params=query, json=json, data=data, files=files, headers=headers)
74
102
  if r.status_code >= 400:
75
103
  err = map_error(r)
76
104
  self.last_response_meta = err.meta
@@ -464,7 +492,9 @@ class _GameApi:
464
492
  想在加入服务器前看看有多少人在线?或者检查一下服务器开没开?用这个接口就对了!
465
493
 
466
494
  ## 功能概述
467
- 你可以通过提供服务器地址(域名或IP),来获取一个 Minecraft Java 版服务器的实时状态。返回信息非常丰富,包括服务器是否在线、当前玩家数、最大玩家数、服务器版本、MOTD(每日消息)以及服务器图标等。
495
+ 你可以通过提供服务器地址(域名或IP),来获取一个 Minecraft Java 版服务器的实时状态。返回信息包括服务器是否在线、当前玩家数、最大玩家数、服务器版本、MOTD(每日消息)以及服务器图标等。
496
+
497
+ 如果服务器返回当前在线玩家列表,响应里还会带上 `online_players` 字段。这个字段可能省略,部分服务器返回的列表也可能不完整。
468
498
  """
469
499
  params = {}
470
500
  body = {}
@@ -533,8 +563,8 @@ class _GameApi:
533
563
  ## 使用须知
534
564
 
535
565
  > [!IMPORTANT]
536
- > **API Key 安全**
537
- > 此接口需要一个 Steam Web API Key。我们强烈建议由后端统一配置和调用,以避免在客户端泄露。当然,你也可以通过 `key` 查询参数临时提供一个Key来覆盖后端配置。
566
+ > **访问凭证说明**
567
+ > 这个接口可以传 `key` 使用您自己的访问凭证。如果您选择传入,请注意妥善保管,不要把它写进公开的前端代码中。
538
568
 
539
569
  在处理响应时,请注意以下数字代码的含义:
540
570
  - **`personastate` (用户状态)**: 0-离线, 1-在线, 2-忙碌, 3-离开, 4-打盹, 5-想交易, 6-想玩。
@@ -578,7 +608,7 @@ class _ImageApi:
578
608
 
579
609
  def get_avatar_gravatar(self, **kwargs):
580
610
  r"""获取Gravatar头像
581
- 提供一个超高速、高可用的Gravatar头像代理服务。内置了强大的ETag条件缓存,确保用户在更新Gravatar头像后能几乎立刻看到变化,同时最大化地利用缓存。
611
+ 提供稳定、易用的头像获取能力,适合在网页或应用中直接展示头像。
582
612
  """
583
613
  params = {}
584
614
  body = {}
@@ -614,18 +644,32 @@ class _ImageApi:
614
644
  )
615
645
 
616
646
  def get_image_bing_daily(self, **kwargs):
617
- r"""必应壁纸
618
- 每天都想换张新壁纸?让必应的美图点亮你的一天吧!
647
+ r"""获取必应每日壁纸
648
+ 这个接口可以获取最新或指定日期的必应壁纸。默认直接返回图片,也可以传 `format=json` 获取元数据,或者传 `format=redirect` 直接跳转到最终图片地址。
619
649
 
620
650
  ## 功能概述
621
- 这个接口会获取 Bing 搜索引擎当天全球同步的每日壁纸,并直接以图片形式返回。你可以用它来做应用的启动页、网站背景,或者任何需要每日更新精美图片的地方。
651
+ - 不传参数时,默认返回当天壁纸图片二进制
652
+ - 可以传 `date` 查询指定日期的壁纸
653
+ - 可以传 `resolution` 选择 `4k` 或 `1080`
654
+ - 可以传 `format` 控制返回图片、JSON 或 302 跳转
655
+ - 当传 `format=json` 时,返回的是扁平 JSON 对象,里面会包含标题、副标题、说明文案、版权信息、问答信息和图片地址等字段
622
656
 
623
- ## 使用须知
624
- 此接口成功时直接返回图片二进制数据,通常是 `image/jpeg`,不是 JSON 格式。接入时请按图片响应来处理。
657
+ ## 参数说明
658
+ `resolution` 默认是 `4k`。
659
+ `format` 默认是 `image`。
625
660
  """
626
661
  params = {}
627
662
  body = {}
628
663
 
664
+ if "query" == "query" and "date" in kwargs:
665
+ params["date"] = kwargs["date"]
666
+
667
+ if "query" == "query" and "resolution" in kwargs:
668
+ params["resolution"] = kwargs["resolution"]
669
+
670
+ if "query" == "query" and "format" in kwargs:
671
+ params["format"] = kwargs["format"]
672
+
629
673
  if "_t" in kwargs:
630
674
  params["_t"] = kwargs["_t"]
631
675
  disable_cache = kwargs.get("disable_cache")
@@ -641,6 +685,52 @@ class _ImageApi:
641
685
  disable_cache=_coerce_optional_bool(disable_cache),
642
686
  )
643
687
 
688
+ def get_image_bing_daily_history(self, **kwargs):
689
+ r"""查询必应壁纸历史
690
+ 这个接口用于查询必应壁纸历史列表,也可以按日期精确查询某一天。默认按时间倒序返回 JSON。
691
+
692
+ ## 功能概述
693
+ - 可以传 `date` 精确查询某一天,命中后只返回 1 条数据
694
+ - 不传 `date` 时,按时间倒序分页返回历史列表
695
+ - 可以传 `resolution` 让 `image_url` 直接对应 `4k` 或 `1080`
696
+ - 可以传 `page` 和 `page_size` 控制分页
697
+ - 每条记录都是扁平 JSON 对象,里面会包含标题、副标题、说明文案、版权信息、问答信息和图片地址等字段
698
+
699
+ ## 参数说明
700
+ `resolution` 默认是 `4k`。
701
+ `page` 默认是 `1`,`page_size` 默认是 `30`,最大是 `100`。
702
+ 当传了 `date` 以后,`page` 和 `page_size` 不生效。
703
+ """
704
+ params = {}
705
+ body = {}
706
+
707
+ if "query" == "query" and "date" in kwargs:
708
+ params["date"] = kwargs["date"]
709
+
710
+ if "query" == "query" and "resolution" in kwargs:
711
+ params["resolution"] = kwargs["resolution"]
712
+
713
+ if "query" == "query" and "page" in kwargs:
714
+ params["page"] = kwargs["page"]
715
+
716
+ if "query" == "query" and "page_size" in kwargs:
717
+ params["page_size"] = kwargs["page_size"]
718
+
719
+ if "_t" in kwargs:
720
+ params["_t"] = kwargs["_t"]
721
+ disable_cache = kwargs.get("disable_cache")
722
+ if disable_cache is None and "disableCache" in kwargs:
723
+ disable_cache = kwargs["disableCache"]
724
+ path = "/api/v1/image/bing-daily/history"
725
+
726
+ return self._http.request(
727
+ "GET",
728
+ path,
729
+ params=params,
730
+ json=body if body else None,
731
+ disable_cache=_coerce_optional_bool(disable_cache),
732
+ )
733
+
644
734
  def get_image_motou(self, **kwargs):
645
735
  r"""生成摸摸头GIF (QQ号)
646
736
  想在线rua一下好友的头像吗?这个趣味接口可以满足你。
@@ -756,11 +846,11 @@ class _ImageApi:
756
846
 
757
847
  ## 使用须知
758
848
  > [!TIP]
759
- > 为了给您最好的压缩效果,我们的算法需要进行复杂计算,处理时间可能会稍长一些,请耐心等待。
849
+ > 图片越大或压缩等级越高,处理时间可能越长,请您耐心等待。
760
850
 
761
851
  > [!WARNING]
762
- > **服务排队提醒**
763
- > 这是一个计算密集型服务。在高并发时,您的请求可能会被排队等待处理。如果您需要将其集成到对延迟敏感的生产服务中,请注意这一点。
852
+ > **处理时间提醒**
853
+ > 在访问量较高时,处理时间可能进一步延长。如果您的业务对返回时间比较敏感,建议预留充足的处理时间。
764
854
 
765
855
  ### 请求与响应格式
766
856
  - 请求必须使用 `multipart/form-data` 格式上传文件。
@@ -780,7 +870,8 @@ class _ImageApi:
780
870
  - **500 Internal Server Error**: 如果在压缩过程中服务器发生内部错误,会返回此状态码。
781
871
  """
782
872
  params = {}
783
- body = {}
873
+ data = {}
874
+ files = {}
784
875
 
785
876
  if "query" == "query" and "level" in kwargs:
786
877
  params["level"] = kwargs["level"]
@@ -792,7 +883,7 @@ class _ImageApi:
792
883
  params["_t"] = kwargs["_t"]
793
884
 
794
885
  if "file" in kwargs:
795
- body["file"] = kwargs["file"]
886
+ files["file"] = _prepare_file_value(kwargs["file"])
796
887
 
797
888
  disable_cache = kwargs.get("disable_cache")
798
889
  if disable_cache is None and "disableCache" in kwargs:
@@ -803,7 +894,73 @@ class _ImageApi:
803
894
  "POST",
804
895
  path,
805
896
  params=params,
806
- json=body if body else None,
897
+ data=data or None,
898
+ files=files or None,
899
+ disable_cache=_coerce_optional_bool(disable_cache),
900
+ )
901
+
902
+ def post_image_decode(self, **kwargs):
903
+ r"""解码并缩放图片
904
+ 在 RAM 和 Flash 极其有限的设备上解码图片是一项繁重的任务。这个接口专为 IoT 和嵌入式开发设计,将复杂的图像解码和缩放操作转移到云端,直接输出适用于单片机屏幕的二进制像素流。
905
+
906
+ ## 功能概述
907
+ 此接口提供了灵活的云端图像预处理能力,帮助硬件开发者跳过繁琐的图像处理逻辑:
908
+ - **直接推流渲染**:如果选择输出纯像素流(如 RGB565),单片机收到网络数据后无需解析文件头,可直接将其写入显存,实现极低内存占用的边下边播。
909
+ - **完美适配屏幕**:无需在设备端编写裁剪或补边代码。只需传入目标屏幕的物理分辨率,接口会自动完成等比缩放、居中补色或铺满裁剪,确保最终显示画面不变形。
910
+ - **精准内存分配**:在动态缩放图片的场景下,服务端会在 HTTP 响应头中提前注入 `X-Image-Width` 和 `X-Image-Height`,方便设备在读取真实的二进制数据前进行准确的内存分配。
911
+
912
+ ## 使用须知
913
+ - **请求格式**:无论是上传本地文件还是传递图片链接,请求体都必须使用 `multipart/form-data` 编码格式。
914
+ - **网络资源获取**:当您选择传递图片链接时,服务端会自动尝试获取该资源。请确保您提供的图片链接是公网直接可访问的,且不需要任何形式的登录鉴权。
915
+ """
916
+ params = {}
917
+ data = {}
918
+ files = {}
919
+
920
+ if "query" == "query" and "width" in kwargs:
921
+ params["width"] = kwargs["width"]
922
+
923
+ if "query" == "query" and "height" in kwargs:
924
+ params["height"] = kwargs["height"]
925
+
926
+ if "query" == "query" and "max_width" in kwargs:
927
+ params["max_width"] = kwargs["max_width"]
928
+
929
+ if "query" == "query" and "max_height" in kwargs:
930
+ params["max_height"] = kwargs["max_height"]
931
+
932
+ if "query" == "query" and "format" in kwargs:
933
+ params["format"] = kwargs["format"]
934
+
935
+ if "query" == "query" and "color_mode" in kwargs:
936
+ params["color_mode"] = kwargs["color_mode"]
937
+
938
+ if "query" == "query" and "fit" in kwargs:
939
+ params["fit"] = kwargs["fit"]
940
+
941
+ if "query" == "query" and "background" in kwargs:
942
+ params["background"] = kwargs["background"]
943
+
944
+ if "_t" in kwargs:
945
+ params["_t"] = kwargs["_t"]
946
+
947
+ if "file" in kwargs:
948
+ files["file"] = _prepare_file_value(kwargs["file"])
949
+
950
+ if "url" in kwargs:
951
+ data["url"] = _stringify_form_value(kwargs["url"])
952
+
953
+ disable_cache = kwargs.get("disable_cache")
954
+ if disable_cache is None and "disableCache" in kwargs:
955
+ disable_cache = kwargs["disableCache"]
956
+ path = "/api/v1/image/decode"
957
+
958
+ return self._http.request(
959
+ "POST",
960
+ path,
961
+ params=params,
962
+ data=data or None,
963
+ files=files or None,
807
964
  disable_cache=_coerce_optional_bool(disable_cache),
808
965
  )
809
966
 
@@ -857,19 +1014,20 @@ class _ImageApi:
857
1014
  - **背景颜色**:同样支持 `bg_color` 表单字段来控制GIF背景。
858
1015
  """
859
1016
  params = {}
860
- body = {}
1017
+ data = {}
1018
+ files = {}
861
1019
 
862
1020
  if "_t" in kwargs:
863
1021
  params["_t"] = kwargs["_t"]
864
1022
 
865
1023
  if "bg_color" in kwargs:
866
- body["bg_color"] = kwargs["bg_color"]
1024
+ data["bg_color"] = _stringify_form_value(kwargs["bg_color"])
867
1025
 
868
1026
  if "file" in kwargs:
869
- body["file"] = kwargs["file"]
1027
+ files["file"] = _prepare_file_value(kwargs["file"])
870
1028
 
871
1029
  if "image_url" in kwargs:
872
- body["image_url"] = kwargs["image_url"]
1030
+ data["image_url"] = _stringify_form_value(kwargs["image_url"])
873
1031
 
874
1032
  disable_cache = kwargs.get("disable_cache")
875
1033
  if disable_cache is None and "disableCache" in kwargs:
@@ -880,7 +1038,8 @@ class _ImageApi:
880
1038
  "POST",
881
1039
  path,
882
1040
  params=params,
883
- json=body if body else None,
1041
+ data=data or None,
1042
+ files=files or None,
884
1043
  disable_cache=_coerce_optional_bool(disable_cache),
885
1044
  )
886
1045
 
@@ -908,16 +1067,17 @@ class _ImageApi:
908
1067
  - **inference_time_ms**: 模型推理耗时,单位毫秒
909
1068
  """
910
1069
  params = {}
911
- body = {}
1070
+ data = {}
1071
+ files = {}
912
1072
 
913
1073
  if "_t" in kwargs:
914
1074
  params["_t"] = kwargs["_t"]
915
1075
 
916
1076
  if "file" in kwargs:
917
- body["file"] = kwargs["file"]
1077
+ files["file"] = _prepare_file_value(kwargs["file"])
918
1078
 
919
1079
  if "url" in kwargs:
920
- body["url"] = kwargs["url"]
1080
+ data["url"] = _stringify_form_value(kwargs["url"])
921
1081
 
922
1082
  disable_cache = kwargs.get("disable_cache")
923
1083
  if disable_cache is None and "disableCache" in kwargs:
@@ -928,7 +1088,63 @@ class _ImageApi:
928
1088
  "POST",
929
1089
  path,
930
1090
  params=params,
931
- json=body if body else None,
1091
+ data=data or None,
1092
+ files=files or None,
1093
+ disable_cache=_coerce_optional_bool(disable_cache),
1094
+ )
1095
+
1096
+ def post_image_ocr(self, **kwargs):
1097
+ r"""通用 OCR 文字识别
1098
+ 无论您是需要实现票据的自动化录入,还是在网页前端对图片上的文字进行坐标框选,这个高精度的 OCR 接口都能为您提供强大的基础能力。
1099
+
1100
+ ## 功能概述
1101
+ > [!IMPORTANT]
1102
+ > 如果您只关心图片上写了什么(例如截图取字或内容安全审核),强烈建议将 `need_location` 设置为 `false`。这会大幅精简返回的 JSON 数据体积,提升网络传输与系统解析效率。
1103
+
1104
+ 除了常规的图片转文字,这个接口还针对实际开发场景做了一些实用设计:
1105
+ - **前端文字高亮与结构化分析**:默认返回每一段文字的矩形坐标和四个顶点坐标。这非常适合使用 Canvas 在原图上画框高亮,或者在后端根据相对位置提取票据中的键值对信息。
1106
+ - **复杂拍摄环境下的抗畸变**:针对手机拍摄导致的旋转或倾斜,可以开启 `enable_cls=true`。服务端在识别前会自动进行方向预校正,显著提升识别准确率。
1107
+ - **灵活的输入与请求要求**:接口支持 `file`、`url` 或 `image_base64` 三种方式输入。请确保请求格式为 `multipart/form-data`,且图片链接在公网可直接访问。
1108
+ """
1109
+ params = {}
1110
+ data = {}
1111
+ files = {}
1112
+
1113
+ if "_t" in kwargs:
1114
+ params["_t"] = kwargs["_t"]
1115
+
1116
+ if "enable_cls" in kwargs:
1117
+ data["enable_cls"] = _stringify_form_value(kwargs["enable_cls"])
1118
+
1119
+ if "file" in kwargs:
1120
+ files["file"] = _prepare_file_value(kwargs["file"])
1121
+
1122
+ if "image_base64" in kwargs:
1123
+ data["image_base64"] = _stringify_form_value(kwargs["image_base64"])
1124
+
1125
+ if "image_name" in kwargs:
1126
+ data["image_name"] = _stringify_form_value(kwargs["image_name"])
1127
+
1128
+ if "need_location" in kwargs:
1129
+ data["need_location"] = _stringify_form_value(kwargs["need_location"])
1130
+
1131
+ if "return_markdown" in kwargs:
1132
+ data["return_markdown"] = _stringify_form_value(kwargs["return_markdown"])
1133
+
1134
+ if "url" in kwargs:
1135
+ data["url"] = _stringify_form_value(kwargs["url"])
1136
+
1137
+ disable_cache = kwargs.get("disable_cache")
1138
+ if disable_cache is None and "disableCache" in kwargs:
1139
+ disable_cache = kwargs["disableCache"]
1140
+ path = "/api/v1/image/ocr"
1141
+
1142
+ return self._http.request(
1143
+ "POST",
1144
+ path,
1145
+ params=params,
1146
+ data=data or None,
1147
+ files=files or None,
932
1148
  disable_cache=_coerce_optional_bool(disable_cache),
933
1149
  )
934
1150
 
@@ -974,7 +1190,8 @@ class _ImageApi:
974
1190
  上传一个 SVG 文件,并指定目标格式(如 PNG、JPEG 等),接口将返回转换后的图像。你还可以调整输出图像的尺寸和(对于JPEG)压缩质量,以满足不同场景的需求。
975
1191
  """
976
1192
  params = {}
977
- body = {}
1193
+ data = {}
1194
+ files = {}
978
1195
 
979
1196
  if "query" == "query" and "format" in kwargs:
980
1197
  params["format"] = kwargs["format"]
@@ -992,7 +1209,7 @@ class _ImageApi:
992
1209
  params["_t"] = kwargs["_t"]
993
1210
 
994
1211
  if "file" in kwargs:
995
- body["file"] = kwargs["file"]
1212
+ files["file"] = _prepare_file_value(kwargs["file"])
996
1213
 
997
1214
  disable_cache = kwargs.get("disable_cache")
998
1215
  if disable_cache is None and "disableCache" in kwargs:
@@ -1003,7 +1220,8 @@ class _ImageApi:
1003
1220
  "POST",
1004
1221
  path,
1005
1222
  params=params,
1006
- json=body if body else None,
1223
+ data=data or None,
1224
+ files=files or None,
1007
1225
  disable_cache=_coerce_optional_bool(disable_cache),
1008
1226
  )
1009
1227
 
@@ -1136,6 +1354,8 @@ class _MiscApi:
1136
1354
  如果你只关心某一类事件,可以通过 `holiday_type` 进行筛选,例如只看法定休假/调休、公历节日、农历节日或节气。
1137
1355
 
1138
1356
  在 `date` 模式下,传 `include_nearby=true` 可以额外返回该日期前后最近的节日;返回数量由 `nearby_limit` 控制,默认 7,最大 30。
1357
+
1358
+ 如果你只想保留今天和之后的节日,可以再传 `exclude_past=true` 过滤已经过去的节日。
1139
1359
  """
1140
1360
  params = {}
1141
1361
  body = {}
@@ -1161,6 +1381,9 @@ class _MiscApi:
1161
1381
  if "query" == "query" and "nearby_limit" in kwargs:
1162
1382
  params["nearby_limit"] = kwargs["nearby_limit"]
1163
1383
 
1384
+ if "query" == "query" and "exclude_past" in kwargs:
1385
+ params["exclude_past"] = kwargs["exclude_past"]
1386
+
1164
1387
  if "_t" in kwargs:
1165
1388
  params["_t"] = kwargs["_t"]
1166
1389
  disable_cache = kwargs.get("disable_cache")
@@ -1193,9 +1416,6 @@ class _MiscApi:
1193
1416
 
1194
1417
  ### 搜索模式
1195
1418
  传 `type` + `keyword` + `time_start` + `time_end` 参数,在指定时间范围内搜索包含关键词的热榜条目。可选传 `limit` 限制返回数量。
1196
-
1197
- ### 数据源列表
1198
- 传 `sources=true`,返回所有支持历史数据的平台列表。
1199
1419
  """
1200
1420
  params = {}
1201
1421
  body = {}
@@ -1218,9 +1438,6 @@ class _MiscApi:
1218
1438
  if "query" == "query" and "limit" in kwargs:
1219
1439
  params["limit"] = kwargs["limit"]
1220
1440
 
1221
- if "query" == "query" and "sources" in kwargs:
1222
- params["sources"] = kwargs["sources"]
1223
-
1224
1441
  if "_t" in kwargs:
1225
1442
  params["_t"] = kwargs["_t"]
1226
1443
  disable_cache = kwargs.get("disable_cache")
@@ -1464,14 +1681,12 @@ graph TD
1464
1681
  买了东西想知道快递到哪儿了?这个接口帮你实时追踪物流状态。
1465
1682
 
1466
1683
  ## 功能概述
1467
- 提供一个快递单号,系统会自动识别快递公司并返回完整的物流轨迹信息。这个接口目前可以查询中通、圆通、韵达、申通、极兔、京东、EMS、德邦等主流快递公司的物流信息。
1684
+ 提供一个快递单号,系统会自动识别快递公司并返回完整的物流轨迹信息。这个接口目前可以查询中通、圆通、韵达、申通、极兔、顺丰、京东、EMS、德邦等主流快递公司的物流信息。
1468
1685
 
1469
1686
  ## 使用须知
1470
- 目前暂不支持顺丰快递单号的物流查询。
1471
-
1472
1687
  - **自动识别**:不知道是哪家快递?系统会根据单号规则自动识别快递公司(推荐使用)
1473
1688
  - **手动指定**:如果已知快递公司,可以传递 `carrier_code` 参数,查询速度会更快
1474
- - **手机尾号验证**:部分快递公司需要验证收件人手机尾号才能查询详细物流,如果返回 `暂无物流信息`,建议尝试传入 `phone` 参数
1689
+ - **手机尾号验证**:顺丰等部分快递公司需要验证收件人手机尾号才能查询详细物流,如果返回 `暂无物流信息`,建议尝试传入 `phone` 参数
1475
1690
  - **查询时效**:物流信息实时查询,响应时间通常在1-2秒内
1476
1691
  """
1477
1692
  params = {}
@@ -1486,6 +1701,9 @@ graph TD
1486
1701
  if "query" == "query" and "phone" in kwargs:
1487
1702
  params["phone"] = kwargs["phone"]
1488
1703
 
1704
+ if "query" == "query" and "full" in kwargs:
1705
+ params["full"] = kwargs["full"]
1706
+
1489
1707
  if "_t" in kwargs:
1490
1708
  params["_t"] = kwargs["_t"]
1491
1709
  disable_cache = kwargs.get("disable_cache")
@@ -1709,12 +1927,12 @@ class _NetworkApi:
1709
1927
 
1710
1928
  def get_network_ipinfo(self, **kwargs):
1711
1929
  r"""查询 IP
1712
- 想知道一个IP地址或域名来自地球的哪个角落?这个接口可以帮你定位它。你可以使用默认数据源,也可以指定 `source=commercial` 参数来查询更详细的商业级IP归属信息。
1930
+ 想知道一个IP地址或域名来自哪里?这个接口可以帮你定位它。默认返回标准结果;如果传 `source=commercial`,可以返回更完整的位置信息。
1713
1931
 
1714
1932
  ## 功能概述
1715
1933
  提供一个公网IPv4、IPv6地址或域名,我们会查询并返回它的地理位置(国家、省份、城市)、经纬度、以及所属的运营商(ISP)和自治系统(ASN)信息。这在网络安全分析、访问来源统计等领域非常有用。
1716
1934
 
1717
- 当使用 `source=commercial` 参数时,接口将调用高性能商业API,提供更精确的市、区、运营商、时区、海拔等信息。请注意,商业查询的响应时间可能会稍长。
1935
+ 当传 `source=commercial` 时,响应中会补充更完整的市、区、运营商、时区、海拔等信息,响应时间可能会稍长。
1718
1936
  """
1719
1937
  params = {}
1720
1938
  body = {}
@@ -1742,12 +1960,12 @@ class _NetworkApi:
1742
1960
 
1743
1961
  def get_network_myip(self, **kwargs):
1744
1962
  r"""查询我的 IP
1745
- 想知道你自己的出口公网IP是多少吗?这个接口就是你的“网络身份证”。你可以使用默认数据源,也可以指定 `source=commercial` 参数来查询更详细的商业级IP归属信息。
1963
+ 想知道你自己的出口公网IP是多少吗?这个接口就是你的“网络身份证”。默认返回标准结果;如果传 `source=commercial`,可以返回更完整的位置信息。
1746
1964
 
1747
1965
  ## 功能概述
1748
1966
  调用此接口,它会返回你(即发起请求的客户端)的公网IP地址,并附带与 `/network/ipinfo` 接口相同的地理位置和网络归属信息。非常适合用于在网页上向用户展示他们自己的IP和地理位置。
1749
1967
 
1750
- 当使用 `source=commercial` 参数时,接口将调用高性能商业API,提供更精确的市、区、运营商、时区、海拔等信息。请注意,商业查询的响应时间可能会稍长。
1968
+ 当传 `source=commercial` 时,响应中会补充更完整的市、区、运营商、时区、海拔等信息,响应时间可能会稍长。
1751
1969
  """
1752
1970
  params = {}
1753
1971
  body = {}
@@ -2174,19 +2392,16 @@ class _SocialApi:
2174
2392
 
2175
2393
  def get_github_repo(self, **kwargs):
2176
2394
  r"""查询 GitHub 仓库
2177
- 需要快速获取一个GitHub仓库的核心信息?这个接口为你聚合了最有价值的数据,避免了多次调用GitHub官方API的麻烦,并且内置了缓存优化,速度更快、更稳定。
2395
+ 需要快速获取一个GitHub仓库的核心信息?这个接口一次请求就能返回仓库的关键数据,适合项目展示、统计和分析场景。
2178
2396
 
2179
- ### 聚合高价值数据
2397
+ ### 可获取的数据
2180
2398
  一次请求,即可获得以下信息:
2181
2399
  - **核心指标**: `star`, `fork`, `open_issues` 等关键统计数据。
2182
2400
  - **项目详情**: 描述、主页、分支、语言、话题标签、开源协议。
2183
- - **参与者信息**: 获取协作者(`collaborators`)和推断的维护者(`maintainers`)列表,包括他们的公开邮箱(如果可用)。
2401
+ - **参与者信息**: 获取协作者(`collaborators`)和维护者参考信息(`maintainers`)列表,包括他们的公开邮箱(如果可用)。
2184
2402
 
2185
2403
  > [!NOTE]
2186
- > `collaborators` 字段在私有仓库或权限受限时可能为空。`maintainers` 是根据最新提交记录推断的,仅供参考。
2187
-
2188
- ### 性能与稳定性
2189
- 我们内置了多级缓存,有效避免触发GitHub的API速率限制。对于需要更高请求额度的用户,可以联系我们定制接口。
2404
+ > `collaborators` 字段在私有仓库或权限受限时可能为空。`maintainers` 为整理后的参考信息,仅供参考。
2190
2405
  """
2191
2406
  params = {}
2192
2407
  body = {}
@@ -2209,6 +2424,45 @@ class _SocialApi:
2209
2424
  disable_cache=_coerce_optional_bool(disable_cache),
2210
2425
  )
2211
2426
 
2427
+ def get_github_user(self, **kwargs):
2428
+ r"""查询 GitHub 用户信息
2429
+ 需要获取开发者的 GitHub 画像?这个接口不仅能返回详尽的基础资料和所属的公开组织列表,还能一键拉取开发者的绿格子数据。
2430
+
2431
+ ## 功能概述
2432
+ - **开发者基础画像**:返回用户的仓库数、关注数、公司、地理位置和社交媒体链接等,非常适合用来自动生成技术博客的作者名片或建立开发者档案。
2433
+ - **贡献日历与时间线**:只要开启 `activity=true`,就能获取该用户最近一年的全量贡献数据。返回的 JSON 已经将数据按周(weeks)和天(days)整理好,前端通过简单的双重循环就能画出和 GitHub 主页一模一样的贡献日历。
2434
+ - **组织级贡献过滤**:如果你只想评估某个人在特定团队开源项目中的活跃度,直接传入 `org` 参数。接口会自动剥离他在其他私有项目或个人仓库的提交,只返回针对该组织的贡献数据。
2435
+ """
2436
+ params = {}
2437
+ body = {}
2438
+
2439
+ if "query" == "query" and "user" in kwargs:
2440
+ params["user"] = kwargs["user"]
2441
+
2442
+ if "query" == "query" and "activity" in kwargs:
2443
+ params["activity"] = kwargs["activity"]
2444
+
2445
+ if "query" == "query" and "activity_scope" in kwargs:
2446
+ params["activity_scope"] = kwargs["activity_scope"]
2447
+
2448
+ if "query" == "query" and "org" in kwargs:
2449
+ params["org"] = kwargs["org"]
2450
+
2451
+ if "_t" in kwargs:
2452
+ params["_t"] = kwargs["_t"]
2453
+ disable_cache = kwargs.get("disable_cache")
2454
+ if disable_cache is None and "disableCache" in kwargs:
2455
+ disable_cache = kwargs["disableCache"]
2456
+ path = "/api/v1/github/user"
2457
+
2458
+ return self._http.request(
2459
+ "GET",
2460
+ path,
2461
+ params=params,
2462
+ json=body if body else None,
2463
+ disable_cache=_coerce_optional_bool(disable_cache),
2464
+ )
2465
+
2212
2466
  def get_social_bilibili_archives(self, **kwargs):
2213
2467
  r"""查询 B站投稿
2214
2468
  想要获取UP主的所有投稿视频?或者想在你的应用里展示创作者的作品集?这个接口能帮你轻松实现。
@@ -2475,15 +2729,15 @@ class _SocialApi:
2475
2729
 
2476
2730
  def get_social_qq_userinfo(self, **kwargs):
2477
2731
  r"""查询 QQ 信息
2478
- 这是一个功能丰富的QQ用户信息查询接口,能够获取QQ用户的详细公开信息。
2732
+ 通过 QQ 号查询用户资料,返回头像、昵称、个性签名、等级和 VIP 信息。
2479
2733
 
2480
2734
  ## 功能概述
2481
- 通过QQ号查询用户的详细信息,包括基础资料、等级信息、VIP状态等。返回的信息丰富全面,适合用于用户画像分析、社交应用集成等场景。
2735
+ 这个接口适合用在用户资料展示、头像卡片、账号绑定结果展示等场景。若用户把 QQ 等级设为隐藏,`qq_level` 会返回 `null`。
2482
2736
 
2483
2737
  ## 数据字段说明
2484
2738
  - **基础信息**: 昵称、个性签名、头像、年龄、性别
2485
- - **联系信息**: QQ邮箱、个性域名(QID)
2486
- - **等级信息**: QQ等级、VIP状态和等级
2739
+ - **联系信息**: QQ 邮箱、个性域名(QID
2740
+ - **等级信息**: QQ 等级、VIP 状态和等级
2487
2741
  - **时间信息**: 注册时间、最后更新时间
2488
2742
  """
2489
2743
  params = {}
@@ -2515,10 +2769,10 @@ class _StatusApi:
2515
2769
 
2516
2770
  def get_status_ratelimit(self, **kwargs):
2517
2771
  r"""限流状态
2518
- 想了解我们API的当前负载情况吗?这个接口为你提供了服务的“心电图”。
2772
+ 想了解当前服务的运行状态吗?这个接口可以返回关键监控指标。
2519
2773
 
2520
2774
  ## 功能概述
2521
- 此接口返回我们后端自适应限流器的实时状态。你可以看到当前并发请求数、并发上限、系统负载、请求接受/拒绝数等核心指标。这对于监控API健康状况和性能表现至关重要。
2775
+ 此接口用于查看当前服务状态,包括并发请求数、当前限制值、系统负载等信息,适合管理员排查运行情况。
2522
2776
 
2523
2777
  > [!IMPORTANT]
2524
2778
  > 此接口为管理接口,需要提供有效的管理员级别API密钥才能访问。
@@ -2792,7 +3046,7 @@ class _TextApi:
2792
3046
 
2793
3047
  ### 输出格式支持
2794
3048
  - **base64**(默认):标准Base64编码输出,适合传输和存储
2795
- - **hex**:十六进制编码输出,方便与在线加密工具对比验证
3049
+ - **hex**:十六进制编码输出,方便进行结果核对
2796
3050
 
2797
3051
  通过 `output_format` 参数可以直接获取HEX格式的密文,无需额外调用转换接口。
2798
3052
 
@@ -2847,7 +3101,6 @@ class _TextApi:
2847
3101
  - **加密算法**: AES-256
2848
3102
  - **编码格式**: Base64/HEX(输入/输出)
2849
3103
  - **IV长度**: 16字节(128位)
2850
- - **版本标注**: v3.4.8+
2851
3104
 
2852
3105
  > [!NOTE]
2853
3106
  > **关于IV(初始化向量)**
@@ -2858,7 +3111,7 @@ class _TextApi:
2858
3111
 
2859
3112
  > [!TIP]
2860
3113
  > **关于输出格式**
2861
- > - 如需与在线加密工具(如 toolhelper.cn)对比结果,建议使用 `output_format: "hex"`
3114
+ > - 如需核对输出结果,建议使用 `output_format: "hex"`
2862
3115
  > - Base64格式更适合网络传输和API调用
2863
3116
  > - 两种格式可以相互转换,数据完全一致
2864
3117
  """
@@ -3032,6 +3285,84 @@ class _TextApi:
3032
3285
  disable_cache=_coerce_optional_bool(disable_cache),
3033
3286
  )
3034
3287
 
3288
+ def post_text_markdown_to_html(self, **kwargs):
3289
+ r"""Markdown 转 HTML
3290
+ 直接调用这个接口,就可以把 Markdown 文本转换成带样式的 HTML,而且它不只适合程序里动态注入,也适合在开发阶段直接预览。
3291
+
3292
+ ## 如何使用与预览
3293
+ - **默认模式:返回 JSON 里的 HTML 片段**:不传 `format` 时,接口会返回 JSON。您只需要读取响应里的 `data.html`,再赋值给前端容器,例如 `element.innerHTML = data.html`、Vue 的 `v-html`,或者 React 里配合 `dangerouslySetInnerHTML` 使用。
3294
+ - **预览模式:直接返回完整 HTML 网页**:如果您想在浏览器里直接打开结果,或者想把响应保存成一个独立的 `.html` 文件,请传 `format="html"`。这个模式下,接口会直接返回带 `<!DOCTYPE html><html>...` 的完整网页源码。
3295
+
3296
+ ## 功能概述
3297
+ - **自带精美排版,无需手写 CSS**:返回结果已经内置样式,标题、引用、表格、任务列表和代码块都可以直接显示。
3298
+ - **支持丰富的排版元素**:除了标准 Markdown,这个接口也可以正确处理 GFM 常见语法,例如表格、任务列表和带语言标记的代码块。
3299
+ - **安全处理用户内容**:默认开启安全模式,会自动过滤原始 HTML 里的风险脚本。如果内容来源绝对可信,并且您确实需要保留原始 HTML,可以把 `sanitize` 设为 `false`。
3300
+ """
3301
+ params = {}
3302
+ body = {}
3303
+
3304
+ if "_t" in kwargs:
3305
+ params["_t"] = kwargs["_t"]
3306
+
3307
+ if "format" in kwargs:
3308
+ body["format"] = kwargs["format"]
3309
+
3310
+ if "sanitize" in kwargs:
3311
+ body["sanitize"] = kwargs["sanitize"]
3312
+
3313
+ if "text" in kwargs:
3314
+ body["text"] = kwargs["text"]
3315
+
3316
+ disable_cache = kwargs.get("disable_cache")
3317
+ if disable_cache is None and "disableCache" in kwargs:
3318
+ disable_cache = kwargs["disableCache"]
3319
+ path = "/api/v1/text/markdown-to-html"
3320
+
3321
+ return self._http.request(
3322
+ "POST",
3323
+ path,
3324
+ params=params,
3325
+ json=body if body else None,
3326
+ disable_cache=_coerce_optional_bool(disable_cache),
3327
+ )
3328
+
3329
+ def post_text_markdown_to_pdf(self, **kwargs):
3330
+ r"""Markdown 转 PDF
3331
+ 当您的业务系统需要提供“导出为 PDF”的功能时,无需在后端部署复杂的排版引擎,只需将 Markdown 文本发给这个接口,即可直接获取打印级的 PDF 文件。
3332
+
3333
+ ## 功能概述
3334
+ - **服务端直接生成**:接口直接返回 PDF 文件二进制流,前端无需任何处理即可触发下载,后端也能轻松存盘归档。
3335
+ - **多种精美主题与纸张**:内置了 GitHub、暗黑等多种专业排版主题,并支持 A4、Letter 等标准纸张。只需简单配置,就能生成符合业务场景的专业文档。
3336
+ - **公网图片也可以直接带入 PDF**:除了纯文本和标准 Markdown 语法,这个接口也可以处理 `data URI` 图片,或者公网可访问的 `http`、`https` 图片链接。服务端会先通过代理抓取图片,并在渲染前内联到文档里,同时带有超时控制。
3337
+ """
3338
+ params = {}
3339
+ body = {}
3340
+
3341
+ if "_t" in kwargs:
3342
+ params["_t"] = kwargs["_t"]
3343
+
3344
+ if "paper_size" in kwargs:
3345
+ body["paper_size"] = kwargs["paper_size"]
3346
+
3347
+ if "text" in kwargs:
3348
+ body["text"] = kwargs["text"]
3349
+
3350
+ if "theme" in kwargs:
3351
+ body["theme"] = kwargs["theme"]
3352
+
3353
+ disable_cache = kwargs.get("disable_cache")
3354
+ if disable_cache is None and "disableCache" in kwargs:
3355
+ disable_cache = kwargs["disableCache"]
3356
+ path = "/api/v1/text/markdown-to-pdf"
3357
+
3358
+ return self._http.request(
3359
+ "POST",
3360
+ path,
3361
+ params=params,
3362
+ json=body if body else None,
3363
+ disable_cache=_coerce_optional_bool(disable_cache),
3364
+ )
3365
+
3035
3366
  def post_text_md_5(self, **kwargs):
3036
3367
  r"""MD5 哈希 (POST)
3037
3368
  一个用于计算文本 MD5 哈希值的标准工具,推荐使用此版本。
@@ -3123,7 +3454,7 @@ class _TranslateApi:
3123
3454
 
3124
3455
  def post_ai_translate(self, **kwargs):
3125
3456
  r"""AI智能翻译
3126
- 这是一个商业级的AI智能翻译服务,采用最新的神经网络翻译技术和大语言模型,提供远超传统机器翻译的质量。
3457
+ 这是一个高质量的智能翻译服务,支持多种翻译风格和专业场景,适合对译文质量有更高要求的业务场景。
3127
3458
 
3128
3459
  ## 功能概述
3129
3460
 
@@ -3432,8 +3763,8 @@ class _MinGanCiShiBieApi:
3432
3763
 
3433
3764
  ## 功能概述
3434
3765
 
3435
- - **模型驱动**: 使用先进的分析模型进行语义分析。
3436
- - **高性能**: 采用三级缓存策略(持久化存储 → 统一缓存 → 模型分析),确保高频请求的响应速度。
3766
+ - **风险分析**: 结合文本内容给出语义层面的风险判断。
3767
+ - **响应稳定**: 兼顾高频调用场景下的处理效率和响应速度。
3437
3768
  - **并发支持**: 支持批量并发处理,单次最多可分析100个关键词。
3438
3769
  - **输入限制**: 单条关键词最多 1,000 字符,总字符数最多 20,000。
3439
3770
  - **标准标签**: 返回 `label` 字段,明确区分 `sensitive` 与 `normal`。
@@ -3476,18 +3807,18 @@ class _MinGanCiShiBieApi:
3476
3807
 
3477
3808
  def post_sensitive_word_quick_check(self, **kwargs):
3478
3809
  r"""敏感词检测(快速)
3479
- 在你的社区或应用中,需要来过滤掉不和谐的声音吗?这个接口可以助你一臂之力。
3810
+ 在你的社区或应用中,需要过滤不适合展示的内容时,这个接口可以帮你快速完成检测。
3480
3811
 
3481
3812
  ## 功能概述
3482
3813
 
3483
- 我们对敏感词检测接口进行了大幅升级,现在采用高效的 **Aho-Corasick 算法**,实现了多模式字符串匹配。这意味着你不再需要手动编写复杂的正则表达式,系统会自动高效地检测出文本中的所有敏感词。
3814
+ 这个接口可以识别文本中的敏感词,并返回是否命中、命中词列表等结果,适合用于评论区、社区、论坛和内容发布场景。
3484
3815
 
3485
3816
  ### 主要特性
3486
3817
 
3487
- - **高性能算法**:基于 Aho-Corasick 算法,单次扫描即可检测多个敏感词模式
3488
- - **简繁体支持**:自动识别和处理简体中文、繁体中文内容
3489
- - **多模匹配**:无需编写正则表达式,系统内置智能匹配逻辑
3490
- - **快速响应**:相比传统方法,检测速度显著提升
3818
+ - **快速检测**:能够一次处理整段文本中的多个命中内容
3819
+ - **简繁体支持**:支持简体中文、繁体中文和混合文本检测
3820
+ - **结果直观**:返回清晰的检测结果,方便直接接入审核流程
3821
+ - **响应稳定**:适合日常内容审核和批量检查场景
3491
3822
 
3492
3823
  无论是论坛、社交平台还是评论系统,这个接口都能帮你快速构建内容审核功能。
3493
3824
  """
@@ -3521,14 +3852,14 @@ class _ZhiNengSouSuoApi:
3521
3852
 
3522
3853
  def get_search_engines(self, **kwargs):
3523
3854
  r"""搜索引擎配置
3524
- 获取 UAPI Pro Search 引擎的详细信息,包括支持的功能特性、参数限制和使用说明。
3855
+ 获取搜索功能的详细信息,包括支持的能力、参数限制和使用说明。
3525
3856
 
3526
3857
  ## 功能概述
3527
3858
 
3528
- 此接口返回搜索引擎的完整配置信息,你可以用它来:
3529
- - 了解搜索引擎支持哪些功能(如站内搜索、文件类型过滤等)
3859
+ 此接口返回搜索功能的完整配置信息,你可以用它来:
3860
+ - 了解当前可用的搜索能力(如站内搜索、文件类型过滤等)
3530
3861
  - 获取参数的默认值和限制范围
3531
- - 查看当前引擎版本和可用状态
3862
+ - 查看当前配置版本和可用状态
3532
3863
 
3533
3864
  适合在应用初始化时调用,或用于动态配置搜索界面。
3534
3865
 
@@ -3553,14 +3884,14 @@ class _ZhiNengSouSuoApi:
3553
3884
 
3554
3885
  def post_search_aggregate(self, **kwargs):
3555
3886
  r"""智能搜索
3556
- 想在你的应用中集成搜索功能?我们提供了一个强大的搜索引擎API,让你可以轻松实现实时网页搜索。
3887
+ 想在你的应用中集成搜索功能?这个接口可以帮你轻松实现实时网页搜索。
3557
3888
 
3558
3889
  ## 功能概述
3559
3890
 
3560
- UAPI Pro Search 是一个智能搜索引擎,采用机器学习算法对搜索结果进行智能排序,确保最相关的内容排在前面。你可以用它搜索任何关键词,也可以限定在特定网站或特定文件类型中搜索。
3891
+ UAPI Pro Search 可以根据查询内容返回更相关的搜索结果。你可以用它搜索任何关键词,也可以限定在特定网站或特定文件类型中搜索。
3561
3892
 
3562
3893
  - **实时网页搜索**: 毫秒级响应,快速返回搜索结果
3563
- - **智能排序**: 采用机器学习回归排序算法,结果更精准
3894
+ - **智能排序**: 根据查询内容返回更相关的结果
3564
3895
  - **时间排序**: 支持按发布时间排序,获取最新内容
3565
3896
  - **时间范围过滤**: 支持按天/周/月/年过滤结果
3566
3897
  - **站内搜索**: 支持 `site:` 操作符,在指定网站内搜索
@@ -3591,9 +3922,6 @@ UAPI Pro Search 是一个智能搜索引擎,采用机器学习算法对搜索
3591
3922
  if "time_range" in kwargs:
3592
3923
  body["time_range"] = kwargs["time_range"]
3593
3924
 
3594
- if "timeout_ms" in kwargs:
3595
- body["timeout_ms"] = kwargs["timeout_ms"]
3596
-
3597
3925
  disable_cache = kwargs.get("disable_cache")
3598
3926
  if disable_cache is None and "disableCache" in kwargs:
3599
3927
  disable_cache = kwargs["disableCache"]
@@ -67,7 +67,7 @@ class UapiError(Exception):
67
67
 
68
68
  class ApiErrorError(UapiError):
69
69
  """上游/内部错误 (API_ERROR)"""
70
- DEFAULT_STATUS = 502
70
+ DEFAULT_STATUS = 504
71
71
 
72
72
  class AvatarNotFoundError(UapiError):
73
73
  """头像未找到 (AVATAR_NOT_FOUND)"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uapi-sdk-python
3
- Version: 0.1.15
3
+ Version: 0.1.17
4
4
  Summary: Idiomatic UAPI SDK for Python
5
5
  Author-email: UAPI <dev@uapis.cn>
6
6
  Requires-Python: >=3.9