MeUtils 2025.1.4.11.4.46__py3-none-any.whl → 2025.1.10.20.14.42__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.
Files changed (73) hide show
  1. {MeUtils-2025.1.4.11.4.46.dist-info → MeUtils-2025.1.10.20.14.42.dist-info}/METADATA +28 -28
  2. {MeUtils-2025.1.4.11.4.46.dist-info → MeUtils-2025.1.10.20.14.42.dist-info}/RECORD +71 -63
  3. examples/_openaisdk/openai_chatfire.py +11 -4
  4. examples/_openaisdk/openai_deepinfra.py +1 -1
  5. examples/_openaisdk/openai_images.py +6 -1
  6. examples/_openaisdk/openai_lingyi.py +59 -0
  7. examples/_openaisdk/openai_ppu.py +47 -0
  8. examples/_openaisdk/openai_test.py +2 -2
  9. examples/_openaisdk/openai_together.py +57 -0
  10. examples/_openaisdk/openai_zhipu.py +4 -3
  11. meutils/ai_audio/asr/openai_asr.py +2 -2
  12. meutils/apis/audio/deepinfra.py +2 -2
  13. meutils/apis/chatglm/glm_video_api.py +1 -1
  14. meutils/apis/common.py +5 -1
  15. meutils/apis/hailuoai/videos.py +14 -5
  16. meutils/apis/images/eidt.py +36 -0
  17. meutils/apis/images/gitee_kolors.py +49 -0
  18. meutils/apis/images/recraft.py +24 -6
  19. meutils/apis/niutrans.py +27 -8
  20. meutils/apis/oneapi/utils.py +24 -9
  21. meutils/apis/translator/deeplx.py +4 -3
  22. meutils/apis/vidu/vidu_video.py +6 -5
  23. meutils/caches/redis_cache.py +5 -0
  24. meutils/common.py +1 -0
  25. meutils/config_utils/lark_utils/common.py +0 -1
  26. meutils/data/VERSION +1 -1
  27. meutils/data/oneapi/NOTICE.md +5 -7
  28. meutils/io/files_utils.py +11 -5
  29. meutils/io/image.py +28 -2
  30. meutils/llm/clients.py +38 -0
  31. meutils/llm/completions/agents/file.py +124 -0
  32. meutils/llm/openai_utils/common.py +2 -2
  33. meutils/llm/utils.py +79 -0
  34. meutils/llm/x.py +75 -0
  35. meutils/notice/feishu.py +1 -0
  36. meutils/parsers/__init__.py +10 -0
  37. meutils/parsers/file_parsers.py +107 -0
  38. meutils/schemas/db/oneapi_types.py +3 -0
  39. meutils/schemas/image_types.py +28 -2
  40. meutils/schemas/kuaishou_types.py +1 -1
  41. meutils/schemas/oneapi/common.py +26 -16
  42. meutils/schemas/vidu_types.py +33 -12
  43. meutils/serving/fastapi/exceptions/http_error.py +2 -6
  44. meutils/str_utils/regular_expression.py +29 -6
  45. meutils/llm/completions/agents/files.py +0 -18
  46. meutils/llm/openai_client.py +0 -15
  47. {MeUtils-2025.1.4.11.4.46.dist-info → MeUtils-2025.1.10.20.14.42.dist-info}/LICENSE +0 -0
  48. {MeUtils-2025.1.4.11.4.46.dist-info → MeUtils-2025.1.10.20.14.42.dist-info}/WHEEL +0 -0
  49. {MeUtils-2025.1.4.11.4.46.dist-info → MeUtils-2025.1.10.20.14.42.dist-info}/entry_points.txt +0 -0
  50. {MeUtils-2025.1.4.11.4.46.dist-info → MeUtils-2025.1.10.20.14.42.dist-info}/top_level.txt +0 -0
  51. /meutils/{fileparser → parsers/fileparser}/PDF/346/212/275/345/217/226.py" +0 -0
  52. /meutils/{fileparser → parsers/fileparser}/__init__.py +0 -0
  53. /meutils/{fileparser → parsers/fileparser}/common.py +0 -0
  54. /meutils/{fileparser → parsers/fileparser}/demo.py +0 -0
  55. /meutils/{fileparser → parsers/fileparser}/filetype/__init__.py +0 -0
  56. /meutils/{fileparser → parsers/fileparser}/filetype/__main__.py +0 -0
  57. /meutils/{fileparser → parsers/fileparser}/filetype/filetype.py +0 -0
  58. /meutils/{fileparser → parsers/fileparser}/filetype/helpers.py +0 -0
  59. /meutils/{fileparser → parsers/fileparser}/filetype/match.py +0 -0
  60. /meutils/{fileparser → parsers/fileparser}/filetype/types/__init__.py +0 -0
  61. /meutils/{fileparser → parsers/fileparser}/filetype/types/application.py +0 -0
  62. /meutils/{fileparser → parsers/fileparser}/filetype/types/archive.py +0 -0
  63. /meutils/{fileparser → parsers/fileparser}/filetype/types/audio.py +0 -0
  64. /meutils/{fileparser → parsers/fileparser}/filetype/types/base.py +0 -0
  65. /meutils/{fileparser → parsers/fileparser}/filetype/types/document.py +0 -0
  66. /meutils/{fileparser → parsers/fileparser}/filetype/types/font.py +0 -0
  67. /meutils/{fileparser → parsers/fileparser}/filetype/types/image.py +0 -0
  68. /meutils/{fileparser → parsers/fileparser}/filetype/types/isobmff.py +0 -0
  69. /meutils/{fileparser → parsers/fileparser}/filetype/types/video.py +0 -0
  70. /meutils/{fileparser → parsers/fileparser}/filetype/utils.py +0 -0
  71. /meutils/{fileparser → parsers/fileparser}/filetype.py +0 -0
  72. /meutils/{fileparser → parsers/fileparser}/pdf.py +0 -0
  73. /meutils/{fileparser → parsers/fileparser}//350/241/250/346/240/274/346/212/275/345/217/226.py" +0 -0
@@ -101,7 +101,10 @@ class OneapiToken(SQLModel, table=True):
101
101
  id: Optional[int] = Field(default=None, primary_key=True)
102
102
  user_id: Optional[int] = Field(default=None)
103
103
  key: Optional[str] = Field(default=None)
104
+
104
105
  used_quota: Optional[int] = Field(default=None)
106
+ remain_quota: Optional[int] = Field(default=None)
107
+ unlimited_quota: Optional[bool] = Field(default=False)
105
108
 
106
109
  class Config:
107
110
  arbitrary_types_allowed = True
@@ -10,6 +10,7 @@
10
10
 
11
11
  from meutils.pipe import *
12
12
 
13
+ from pydantic import constr
13
14
  from openai.types import ImagesResponse as _ImagesResponse, Image
14
15
 
15
16
  ASPECT_RATIOS = {
@@ -58,7 +59,7 @@ class ImagesResponse(_ImagesResponse):
58
59
 
59
60
 
60
61
  class ImageRequest(BaseModel): # openai
61
- prompt: str = ""
62
+ prompt: constr(min_length=1, max_length=1000) = ""
62
63
  negative_prompt: Optional[str] = None
63
64
 
64
65
  model: str = ""
@@ -215,6 +216,31 @@ class KlingImageRequest(ImageRequest):
215
216
  self.size = "1:1" if self.size not in {"1:1", "2:3", "3:2", "3:4", "4:3", "9:16", "16:9"} else self.size
216
217
 
217
218
 
219
+ class KolorsRequest(ImageRequest):
220
+ model: Literal["kolors-1.0", "kolors-1.5"] = "kolors-1.0"
221
+ n: Optional[int] = 4
222
+
223
+ """
224
+ 1:1(1024*1024)
225
+ 4:3(1152*896)
226
+ 3:4(768*1024)
227
+ 16:9(1024 576)
228
+ 9:16(576 1024)
229
+ 3:2(1024*640)
230
+ 2:3(640*1024)
231
+ """
232
+ size: Literal[
233
+ "1024x1024", "1152x896", "768x1024", "1024x576", "576x1024", "1024x640", "640x1024"
234
+ ] = "1024x1024"
235
+
236
+ # 图生图
237
+ image: Optional[str] = None
238
+ image_fidelity: Optional[float] = None
239
+
240
+ def __init__(self, /, **data: Any):
241
+ super().__init__(**data)
242
+
243
+
218
244
  class CogviewImageRequest(ImageRequest):
219
245
  model: str = "cogview-3"
220
246
  size: Optional[Literal["1024x1024", "768x1344", "864x1152", "1344x768", "1152x864", "1440x720", "720x1440"]] = None
@@ -440,4 +466,4 @@ if __name__ == '__main__':
440
466
 
441
467
  # print(ImagesResponse(data=[{'url': 1}]))
442
468
 
443
- print(Recraft(prompt="一条猫").model_dump_json())
469
+ print(RecraftImageRequest(prompt="").model_dump_json())
@@ -113,7 +113,7 @@ class KlingaiImageRequest(BaseModel):
113
113
  {'name': 'imageCount', 'value': self.n},
114
114
  {"name": "fidelity", "value": self.image_fidelity or 0.5},
115
115
  {'name': 'biz', 'value': 'klingai'},
116
- {"name": "kolors_version", "value": "1.5"}
116
+ {"name": "kolors_version", "value": "1.0"} ####### 1.5
117
117
  ]
118
118
  self.payload = {
119
119
  'arguments': arguments,
@@ -17,6 +17,14 @@ FREE = 0.001
17
17
  MJ = 1.5
18
18
 
19
19
  MODEL_PRICE = {
20
+ # rix
21
+ "kling_image": 0.02,
22
+ "kling_virtual_try_on": 1,
23
+
24
+ "kling_video": 1,
25
+ "kling_extend": 1,
26
+ "kling_lip_sync": 1,
27
+
20
28
  # chatfire
21
29
  "ppu-0001": 0.0001,
22
30
  "ppu-001": 0.001,
@@ -153,6 +161,7 @@ MODEL_PRICE = {
153
161
 
154
162
  "api-kling": 0.1,
155
163
  "api-kling-vip": 0.5,
164
+
156
165
  "api-kling-v1.6-std-5s": 1 * 0.8,
157
166
  "api-kling-v1.6-std-10s": 2 * 0.8,
158
167
  "api-kling-v1.6-pro-5s": 1 * 0.8 * 1.75,
@@ -275,12 +284,9 @@ MODEL_RATIO = {
275
284
  "claude-3-5-haiku-20241022": 4,
276
285
  "anthropic/claude-3-5-haiku-20241022:beta": 4,
277
286
 
278
- "grok": 2.5,
279
- "grok-beta": 2.5,
280
- # "grok2": 1,
281
- # "grok-2": 1,
282
- "x-ai/grok-beta": 2.5,
283
- "grok-vision-beta": 2.5,
287
+ "grok-2": 1,
288
+ "grok-2-1212": 1,
289
+ "grok-2-vision-1212": 1,
284
290
 
285
291
  # 定制
286
292
  "lingxi-all": 1,
@@ -298,7 +304,7 @@ MODEL_RATIO = {
298
304
  "glm-4-0520": 2.5,
299
305
  "glm-4-airx": 10,
300
306
  "glm-4v": 2.5,
301
- "glm-4v-plus": 5,
307
+ "glm-4v-plus": 2,
302
308
  "glm-4v-flash": 0.1,
303
309
  "glm-4-plus": 25,
304
310
 
@@ -366,12 +372,14 @@ MODEL_RATIO = {
366
372
  "yi-1.5-34b-chat-16k": 0.63,
367
373
 
368
374
  "yi-lightning": 0.5,
375
+ "yi-vision-v2": 3,
376
+
377
+ "yi-vision": 3,
369
378
  "yi-large": 10,
370
379
  "yi-large-turbo": 6,
371
380
  "yi-large-rag": 12.5,
372
381
  "yi-medium": 1.25,
373
382
  "yi-medium-200k": 6,
374
- "yi-vision": 3,
375
383
 
376
384
  # minimax https://platform.minimaxi.com/document/price?id=6433f32294878d408fc8293e
377
385
  "abab6.5-chat": 15 / 7.5,
@@ -388,6 +396,7 @@ MODEL_RATIO = {
388
396
  "deepseek-v3": 0.5,
389
397
  "deepseek/deepseek-chat": 0.5,
390
398
  "deepseek-ai/DeepSeek-V3": 0.5,
399
+ "accounts/fireworks/models/deepseek-v3": 0.5,
391
400
 
392
401
  'deepseek-r1': 0.5,
393
402
  'deepseek-think': 0.5,
@@ -483,6 +492,8 @@ MODEL_RATIO = {
483
492
  "google/gemini-flash-1.5-8b-exp": 0.1, # openrouter免费
484
493
  "gemini-2.0-flash": 0.5,
485
494
  "gemini-2.0-flash-exp": 0.5,
495
+ "gemini-2.0-flash-thinking-exp": 1,
496
+ "gemini-2.0-flash-thinking-exp-1219": 1,
486
497
 
487
498
  "gemini-1.5-pro-001": 1,
488
499
  "gemini-1.5-pro-002": 1,
@@ -588,10 +599,9 @@ COMPLETION_RATIO = {
588
599
  "gpt-4-plus": 5,
589
600
  "gpt-4o-plus": 5,
590
601
 
591
- "grok": 3,
592
- "grok-beta": 3,
593
- "x-ai/grok-beta": 3,
594
- "grok-vision-beta": 3,
602
+ "grok-2": 5,
603
+ "grok-2-1212": 5,
604
+ "grok-2-vision-1212": 5,
595
605
 
596
606
  "claude-3-5-haiku-20241022": 5,
597
607
  "anthropic/claude-3-5-haiku-20241022:beta": 5,
@@ -647,6 +657,8 @@ COMPLETION_RATIO = {
647
657
 
648
658
  "gemini-2.0-flash": 5,
649
659
  "gemini-2.0-flash-exp": 5,
660
+ "gemini-2.0-flash-thinking-exp": 5,
661
+ "gemini-2.0-flash-thinking-exp-1219": 5,
650
662
 
651
663
  "hunyuan-a52b-instruct": 5,
652
664
  "qwen2.5-coder-32b-instruct": 3,
@@ -672,6 +684,7 @@ COMPLETION_RATIO = {
672
684
  "deepseek-search": 1,
673
685
  "deepseek/deepseek-chat": 1,
674
686
  "deepseek-ai/DeepSeek-V3": 1,
687
+ "accounts/fireworks/models/deepseek-v3": 1,
675
688
 
676
689
  "glm-zero": 5,
677
690
  "glm-zero-preview": 5,
@@ -853,7 +866,7 @@ GROUP_RATIO = {
853
866
  # 定制分组:不公开
854
867
  "35": 1,
855
868
 
856
- "agent": 2
869
+ "images": 0.5
857
870
 
858
871
  }
859
872
  USER_USABLE_GROUPS = {
@@ -864,9 +877,6 @@ USER_USABLE_GROUPS = {
864
877
  "国产": "0.5¥=1$直连🔥国产大模型api,可申请商用独立分组",
865
878
 
866
879
  "特价": "0.5¥=1$主打性价比🔥claude系列&gpt/o1系列&国产热门大模型",
867
-
868
- "agent": "2.0¥=1$智能体:联网&文件问答",
869
-
870
880
  }
871
881
 
872
882
  if _ := {k: f"888¥=1$🈲🈲🈲误用不退" for k, v in GROUP_RATIO.items() if k.endswith(("代理",))}:
@@ -91,7 +91,7 @@ class VideoRequest(BaseModel):
91
91
 
92
92
  class ViduRequest(BaseModel):
93
93
  """quality 倍率2"""
94
- model: Union[str, Literal['vidu-high-performance', 'vidu-high-quality']] = "vidu-high-performance" # vidu-1.5
94
+ model: Union[str, Literal['vidu-1.5', 'vidu-high-performance', 'vidu-high-quality']] = "vidu-high-performance"
95
95
 
96
96
  prompt: Optional[str] = None
97
97
  url: Optional[str] = None # ssupload:?id=
@@ -101,6 +101,10 @@ class ViduRequest(BaseModel):
101
101
 
102
102
  type: Optional[str] = None # text2video img2video character2video
103
103
 
104
+ """vidu-1.5"""
105
+ resolution: Literal['512', '720p', 'vidu-high-quality'] = "512"
106
+ movement_amplitude: Optional[str] = "auto" # small medium high
107
+
104
108
  payload: dict = {}
105
109
 
106
110
  def __init__(self, **data):
@@ -135,22 +139,39 @@ class ViduRequest(BaseModel):
135
139
  }
136
140
  )
137
141
 
138
- self.payload = {
139
- "input": input,
140
- "type": self.type or type,
141
- "settings": {
142
- "model": self.model,
143
- "model_version": "1.0",
144
- # "resolution": "512", 1.5才有的参数 先适配1.0
142
+ if self.model == "vidu-1.5":
143
+ self.payload = {
144
+ "input": input,
145
+ "type": self.type or type,
146
+ "settings": {
147
+ "model_version": "1.5",
148
+ "style": "general",
149
+ "duration": self.duration,
150
+
151
+ "resolution": self.resolution,
152
+ "aspect_ratio": self.aspect_ratio,
153
+
154
+ "movement_amplitude": self.movement_amplitude,
155
+
156
+ }
157
+ }
158
+ else:
159
+
160
+ self.payload = {
161
+ "input": input,
162
+ "type": self.type or type,
163
+ "settings": {
164
+ "model": self.model,
165
+ "model_version": "1.0",
145
166
 
146
- "style": self.style,
167
+ "style": self.style,
147
168
 
148
- # "aspect_ratio": self.aspect_ratio,
169
+ "aspect_ratio": self.aspect_ratio,
149
170
 
150
- "duration": self.duration,
171
+ "duration": self.duration,
151
172
 
173
+ }
152
174
  }
153
- }
154
175
 
155
176
  class Config:
156
177
  json_schema_extra = {
@@ -15,7 +15,7 @@ from meutils.notice.feishu import send_message as _send_message
15
15
  send_message = partial(
16
16
  _send_message,
17
17
  title=__name__,
18
- url="https://open.feishu.cn/open-apis/bot/v2/hook/79fc258f-46a9-419e-b131-1d79b3d0bcff"
18
+ url="https://open.feishu.cn/open-apis/bot/v2/hook/d1c7b67d-b0f8-4067-a2f5-109f20eeb696"
19
19
  )
20
20
 
21
21
 
@@ -54,7 +54,7 @@ async def chatfire_api_exception_handler(request: Request, exc: Exception):
54
54
 
55
55
  # 默认值
56
56
  reps = None
57
- request_json = {}
57
+ request_json = {"body": await request.body()}
58
58
  if isinstance(exc, (HTTPStatusError, APIStatusError)):
59
59
  status_code = exc.response.status_code or 500
60
60
 
@@ -65,10 +65,6 @@ async def chatfire_api_exception_handler(request: Request, exc: Exception):
65
65
  content=content,
66
66
  status_code=status_code,
67
67
  )
68
- try:
69
- request_json = await request.json()
70
- except Exception as e:
71
- request_json = {"error": f"json parse error: {e}"}
72
68
 
73
69
  # send_message
74
70
  content_detail = f"{traceback.format_exc()}"
@@ -9,6 +9,7 @@
9
9
  # @Description :
10
10
 
11
11
  from meutils.pipe import *
12
+ from urllib.parse import unquote, unquote_plus
12
13
 
13
14
  zh = re.compile('[a-zA-Z\u4e00-\u9fa5]+') # 中文 + 字母
14
15
  nozh = re.compile('[^a-zA-Z\u4e00-\u9fa5]+') # 中文 + 字母
@@ -58,11 +59,13 @@ def get_parse_and_index(text, pattern):
58
59
 
59
60
  @lru_cache()
60
61
  def parse_url(text: str, for_image=False):
62
+
61
63
  # url_pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
62
64
  url_pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+|#]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
63
65
 
64
66
  # url_pattern = 'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'
65
67
  if for_image:
68
+ text = unquote_plus(text)
66
69
  # suffix = [
67
70
  # ".jpg",
68
71
  # ".jpeg",
@@ -78,15 +81,26 @@ def parse_url(text: str, for_image=False):
78
81
  # ".raw",
79
82
  # ".dng"
80
83
  # ]
81
- url_pattern = r'https?://[\w\-\.]+/\S+\.(?:png|jpg|jpeg|gif)'
82
- url_pattern = r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[#]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+\.(?:jpg|jpeg|png|gif)"
84
+ # url_pattern = r'https?://[\w\-\.]+/\S+\.(?:png|jpg|jpeg|gif)'
85
+ url_pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[#]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+\.(?:jpg|jpeg|png|gif|svg|webp)'
86
+
83
87
 
84
- urls = re.findall(url_pattern, str(text))
88
+ urls = re.findall(url_pattern, text)
85
89
 
86
90
  return urls
87
91
 
88
92
 
89
93
  if __name__ == '__main__':
94
+ # from urllib.parse import urlparse
95
+ #
96
+ #
97
+ # def is_valid_url(url):
98
+ # try:
99
+ # result = urlparse(url)
100
+ # return all([result.scheme, result.netloc])
101
+ # except:
102
+ # return False
103
+
90
104
  text = """7个正规url
91
105
  这是一段包含URL的文本,https://www.google.com 是一个URL,另一个URL是http://www.baidu.com
92
106
  解读这个文本https://www.url1.com
@@ -100,13 +114,22 @@ if __name__ == '__main__':
100
114
  总结 https://waptianqi.2345.com/wea_history/58238.htm
101
115
  解释下这张照片 https://img-home.csdnimg.cn/images/20201124032511.png
102
116
  解释下这张https://img-home.csdnimg.cn/images/x.png
103
-
117
+
104
118
  img-home.csdnimg.cn/images/20201124032511.png
119
+
120
+
121
+ https://oss.ffire.cc/files/百炼系列手机产品介绍.docx
122
+
123
+ https://oss.ffire.cc/files/%E6%8B%9B%E6%A0%87%E6%96%87%E4%BB%B6%E5%A4%87%E6%A1%88%E8%A1%A8%EF%BC%88%E7%AC%AC%E4%BA%8C%E6%AC%A1%EF%BC%89.pdf 这个文件讲了什么?
124
+
105
125
  """
126
+ # https://oss.ffire.cc/files/%E6%8B%9B%E6%A0%87%E6%96%87%E4%BB%B6%E5%A4%87%E6%A1%88%E8%A1%A8%EF%BC%88%E7%AC%AC%E4%BA%8C%E6%AC%A1%EF%BC%89.pdf 正则匹配会卡死
106
127
  # from urllib3.util import parse_url
107
- text = "@firebot /换衣 https://oss.ffire.cc/files/try-on.png"
128
+ # text = "@firebot /换衣 https://oss.ffire.cc/files/try-on.png"
129
+ # text = "@firebot /换衣 https://oss.ffire.cc/files/try-on.pn"
108
130
 
109
- print(parse_url(text))
131
+ # print(parse_url(text))
132
+ print(parse_url(text, for_image=True))
110
133
 
111
134
  # print(parse_url("http://154.3.0.117:39666/docs#/default/get_content_preview_spider_playwright_get"))
112
135
 
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
- # @Project : AI. @by PyCharm
4
- # @File : files
5
- # @Time : 2025/1/3 15:38
6
- # @Author : betterme
7
- # @WeChat : meutils
8
- # @Software : PyCharm
9
- # @Description : 支持文档、图片、音频、视频问答
10
- """单一智能体
11
- 任意模型支持文档、图片、音频、视频问答
12
- api形式
13
- - /agents/v1
14
- - /v1 前缀区分 agents-{model}【底层调用 /agents/v1】
15
-
16
- """
17
-
18
- from meutils.pipe import *
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
- # @Project : AI. @by PyCharm
4
- # @File : chat
5
- # @Time : 2024/8/19 14:23
6
- # @Author : betterme
7
- # @WeChat : meutils
8
- # @Software : PyCharm
9
- # @Description :
10
-
11
-
12
- from openai import OpenAI, AsyncOpenAI
13
-
14
- chat = OpenAI().chat.completions.create
15
- achat = AsyncOpenAI().chat.completions.create
File without changes
File without changes
File without changes
File without changes
File without changes